-
Notifications
You must be signed in to change notification settings - Fork 130
/
DiscoverJaxRsAnnotationsRuleProvider.java
121 lines (107 loc) · 5.05 KB
/
DiscoverJaxRsAnnotationsRuleProvider.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package org.jboss.windup.rules.apps.javaee.rules;
import java.util.logging.Logger;
import org.jboss.windup.ast.java.data.TypeReferenceLocation;
import org.jboss.windup.config.AbstractRuleProvider;
import org.jboss.windup.config.GraphRewrite;
import org.jboss.windup.config.metadata.MetadataBuilder;
import org.jboss.windup.config.operation.Iteration;
import org.jboss.windup.config.operation.iteration.AbstractIterationOperation;
import org.jboss.windup.config.phase.InitialAnalysisPhase;
import org.jboss.windup.graph.GraphContext;
import org.jboss.windup.rules.apps.java.condition.JavaClass;
import org.jboss.windup.rules.apps.java.model.AbstractJavaSourceModel;
import org.jboss.windup.rules.apps.java.model.JavaClassModel;
import org.jboss.windup.rules.apps.java.scan.ast.JavaTypeReferenceModel;
import org.jboss.windup.rules.apps.java.scan.ast.annotations.JavaAnnotationLiteralTypeValueModel;
import org.jboss.windup.rules.apps.java.scan.ast.annotations.JavaAnnotationTypeReferenceModel;
import org.jboss.windup.rules.apps.java.scan.ast.annotations.JavaAnnotationTypeValueModel;
import org.jboss.windup.rules.apps.java.scan.provider.AnalyzeJavaFilesRuleProvider;
import org.jboss.windup.rules.apps.javaee.service.JaxRSWebServiceModelService;
import org.jboss.windup.util.Logging;
import org.ocpsoft.rewrite.config.Configuration;
import org.ocpsoft.rewrite.config.ConfigurationBuilder;
import org.ocpsoft.rewrite.context.EvaluationContext;
/**
* Scans for classes with JAX-RS related annotations, and adds JAX-RS related metadata for these.
*
* @author <a href="mailto:bradsdavis@gmail.com">Brad Davis</a>
*/
public class DiscoverJaxRsAnnotationsRuleProvider extends AbstractRuleProvider
{
private static Logger LOG = Logging.get(DiscoverJaxRsAnnotationsRuleProvider.class);
private static final String JAXRS_ANNOTATIONS = "jaxrsAnnotations";
public DiscoverJaxRsAnnotationsRuleProvider()
{
super(MetadataBuilder.forProvider(DiscoverJaxRsAnnotationsRuleProvider.class)
.setPhase(InitialAnalysisPhase.class)
.addExecuteAfter(AnalyzeJavaFilesRuleProvider.class));
}
@Override
public Configuration getConfiguration(GraphContext context)
{
String ruleIDPrefix = getClass().getSimpleName();
return ConfigurationBuilder
.begin()
.addRule()
.when(JavaClass
.references("javax.ws.rs.Path")
.at(TypeReferenceLocation.ANNOTATION)
.as(JAXRS_ANNOTATIONS))
.perform(Iteration.over(JAXRS_ANNOTATIONS).perform(new AbstractIterationOperation<JavaTypeReferenceModel>()
{
@Override
public void perform(GraphRewrite event, EvaluationContext context, JavaTypeReferenceModel payload)
{
extractMetadata(event, payload);
}
}).endIteration())
.withId(ruleIDPrefix + "_JAXRSAnnotationRule");
}
private void extractMetadata(GraphRewrite event, JavaTypeReferenceModel typeReference)
{
typeReference.getFile().setGenerateSourceReport(true);
JavaAnnotationTypeReferenceModel jaxRSAnnotationTypeReference = (JavaAnnotationTypeReferenceModel) typeReference;
String path = getAnnotationLiteralValue(jaxRSAnnotationTypeReference, "value");
JavaClassModel implementationClass = getJavaClass(typeReference);
JaxRSWebServiceModelService service = new JaxRSWebServiceModelService(event.getGraphContext());
service.getOrCreate(path, implementationClass);
}
private String getAnnotationLiteralValue(JavaAnnotationTypeReferenceModel model, String name)
{
JavaAnnotationTypeValueModel valueModel = model.getAnnotationValues().get(name);
if (valueModel instanceof JavaAnnotationLiteralTypeValueModel)
{
JavaAnnotationLiteralTypeValueModel literalTypeValue = (JavaAnnotationLiteralTypeValueModel) valueModel;
return literalTypeValue.getLiteralValue();
}
else
{
return null;
}
}
private JavaClassModel getJavaClass(JavaTypeReferenceModel javaTypeReference)
{
JavaClassModel result = null;
AbstractJavaSourceModel javaSource = javaTypeReference.getFile();
for (JavaClassModel javaClassModel : javaSource.getJavaClasses())
{
// there can be only one public one, and the annotated class should be public
if (javaClassModel.isPublic() != null && javaClassModel.isPublic())
{
result = javaClassModel;
break;
}
}
if (result == null)
{
// no public classes found, so try to find any class (even non-public ones)
result = javaSource.getJavaClasses().iterator().next();
}
return result;
}
@Override
public String toString()
{
return "DiscoverEJBAnnotatedClasses";
}
}