Author: scabanovich
Date: 2007-07-02 12:53:26 -0400 (Mon, 02 Jul 2007)
New Revision: 2244
Added:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/ASTVisitorImpl.java
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/AnnotatedASTNode.java
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/ResolvedAnnotation.java
Modified:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/JavaScanner.java
Log:
EXIN-217
Added:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/ASTVisitorImpl.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/ASTVisitorImpl.java
(rev 0)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/ASTVisitorImpl.java 2007-07-02
16:53:26 UTC (rev 2244)
@@ -0,0 +1,192 @@
+package org.jboss.tools.seam.internal.core.scanner.java;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.dom.ASTVisitor;
+import org.eclipse.jdt.core.dom.Annotation;
+import org.eclipse.jdt.core.dom.Block;
+import org.eclipse.jdt.core.dom.Expression;
+import org.eclipse.jdt.core.dom.FieldDeclaration;
+import org.eclipse.jdt.core.dom.MarkerAnnotation;
+import org.eclipse.jdt.core.dom.MemberValuePair;
+import org.eclipse.jdt.core.dom.MethodDeclaration;
+import org.eclipse.jdt.core.dom.Name;
+import org.eclipse.jdt.core.dom.NormalAnnotation;
+import org.eclipse.jdt.core.dom.QualifiedName;
+import org.eclipse.jdt.core.dom.SimpleName;
+import org.eclipse.jdt.core.dom.SingleMemberAnnotation;
+import org.eclipse.jdt.core.dom.StringLiteral;
+import org.eclipse.jdt.core.dom.TypeDeclaration;
+import org.eclipse.jdt.core.dom.VariableDeclaration;
+
+public class ASTVisitorImpl extends ASTVisitor {
+ static String SEAM_ANNOTATION_TYPE_PREFIX = "org.jboss.seam.annotations.";
+ static String NAME_ANNOTATION_TYPE = SEAM_ANNOTATION_TYPE_PREFIX + "Name";
+ static String SCOPE_ANNOTATION_TYPE = SEAM_ANNOTATION_TYPE_PREFIX + "Scope";
+
+ static int UNDEFINED_CONTEXT = -1;
+ static int TYPE_CONTEXT = 0;
+ static int FIELD_CONTEXT = 1;
+ static int METHOD_CONTEXT = 2;
+
+ IType type;
+ String name = null;
+ String scope = null;
+
+ AnnotatedASTNode annotatedType = null;
+ Set<Object> annotatedFields = new HashSet<Object>();
+ Set<Object> annotatedMethods = new HashSet<Object>();
+
+ AnnotatedASTNode currentAnnotatedNode = null;
+ int context = UNDEFINED_CONTEXT;
+
+ public boolean visit(SingleMemberAnnotation node) {
+ String type = resolveType(node);
+ if(isSeamAnnotationType(type) && currentAnnotatedNode != null) {
+ currentAnnotatedNode.addAnnotation(new ResolvedAnnotation(type, node));
+ }
+ return false;
+ }
+
+ public boolean visit(NormalAnnotation node) {
+ String type = resolveType(node);
+ if(isSeamAnnotationType(type) && currentAnnotatedNode != null) {
+ currentAnnotatedNode.addAnnotation(new ResolvedAnnotation(type, node));
+ }
+ return false;
+ }
+
+ public boolean visit(MarkerAnnotation node) {
+ String type = resolveType(node);
+ if(isSeamAnnotationType(type) && currentAnnotatedNode != null) {
+ currentAnnotatedNode.addAnnotation(new ResolvedAnnotation(type, node));
+ }
+ return true;
+ }
+
+ boolean checkAnnotationType(Annotation node, String annotationType) {
+ String n = resolveType(node);
+ return n != null && n.equals(annotationType);
+ }
+
+ String resolveType(Annotation node) {
+ Name nm = node.getTypeName();
+ if(nm instanceof SimpleName) {
+ SimpleName sn = (SimpleName)nm;
+ String n = sn.getIdentifier();
+ if(type != null) {
+ return JavaScanner.getResolvedType(type, n);
+ }
+ } else if(nm instanceof QualifiedName) {
+ QualifiedName qn = (QualifiedName)nm;
+ return qn.getFullyQualifiedName();
+ }
+ return null;
+ }
+
+ boolean isSeamAnnotationType(String n) {
+ return n != null && n.startsWith(SEAM_ANNOTATION_TYPE_PREFIX);
+ }
+
+ String checkExpression(Expression exp) {
+ if(exp instanceof StringLiteral) {
+ return ((StringLiteral)exp).getLiteralValue();
+ } else if(exp instanceof QualifiedName) {
+ return exp.toString();
+ }
+ return null;
+ }
+
+ public boolean visit(Block node) {
+ return false;
+ }
+
+
+ public boolean visit(TypeDeclaration node) {
+ annotatedType = new AnnotatedASTNode(node);
+ currentAnnotatedNode = annotatedType;
+ return true;
+ }
+
+ public void endVisit(TypeDeclaration node) {
+ currentAnnotatedNode = null;
+ process();
+ }
+
+ public boolean visit(FieldDeclaration node) {
+ currentAnnotatedNode = new AnnotatedASTNode(node);
+ return true;
+ }
+
+ public void endVisit(FieldDeclaration node) {
+ List fragments = node.fragments();
+ for (int i = 0; i < fragments.size(); i++) {
+ VariableDeclaration vd = (VariableDeclaration)fragments.get(i);
+ String name = vd.getName().getIdentifier();
+ System.out.println("-->" + name);
+ }
+ if(currentAnnotatedNode != null && currentAnnotatedNode.getAnnotations() !=
null) {
+ annotatedFields.add(currentAnnotatedNode);
+ }
+ currentAnnotatedNode = null;
+ }
+
+ public boolean visit(MethodDeclaration node) {
+ currentAnnotatedNode = new AnnotatedASTNode(node);
+ return true;
+ }
+
+ public void endVisit(MethodDeclaration node) {
+ if(currentAnnotatedNode != null && currentAnnotatedNode.getAnnotations() !=
null) {
+ annotatedMethods.add(currentAnnotatedNode);
+ }
+ currentAnnotatedNode = null;
+ }
+
+ void process() {
+ if(annotatedType == null) return;
+ ResolvedAnnotation[] as = annotatedType.getAnnotations();
+ for (int i = 0; i < as.length; i++) {
+ String type = as[i].getType();
+ if(NAME_ANNOTATION_TYPE.equals(type)) {
+ name = getValue(as[i].getAnnotation());
+ } else if(SCOPE_ANNOTATION_TYPE.equals(type)) {
+ scope = getValue(as[i].getAnnotation());
+ if(scope != null) {
+ int q = scope.lastIndexOf('.');
+ if(q >= 0) scope = scope.substring(q + 1).toLowerCase();
+ }
+ }
+ //TODO
+ }
+ //TODO
+ }
+
+ String getValue(Annotation node) {
+ if(node instanceof SingleMemberAnnotation) {
+ return getValue((SingleMemberAnnotation)node);
+ } else if(node instanceof NormalAnnotation) {
+ return getValue((NormalAnnotation)node);
+ } else {
+ return null;
+ }
+ }
+
+ String getValue(SingleMemberAnnotation node) {
+ return checkExpression(node.getValue());
+ }
+
+ String getValue(NormalAnnotation node) {
+ List vs = node.values();
+ if(vs != null) for (int i = 0; i < vs.size(); i++) {
+ MemberValuePair p = (MemberValuePair)vs.get(i);
+ if("value".equals(p.getName().getIdentifier())) {
+ return checkExpression(p.getValue());
+ }
+ }
+ return null;
+ }
+}
Added:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/AnnotatedASTNode.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/AnnotatedASTNode.java
(rev 0)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/AnnotatedASTNode.java 2007-07-02
16:53:26 UTC (rev 2244)
@@ -0,0 +1,32 @@
+package org.jboss.tools.seam.internal.core.scanner.java;
+
+import org.eclipse.jdt.core.dom.ASTNode;
+
+public class AnnotatedASTNode {
+ ASTNode node;
+ ResolvedAnnotation[] annotations = null;
+
+ public AnnotatedASTNode(ASTNode node) {
+ this.node = node;
+ }
+
+ public void addAnnotation(ResolvedAnnotation annotation) {
+ if(annotations == null) {
+ annotations = new ResolvedAnnotation[]{annotation};
+ } else {
+ ResolvedAnnotation[] a = new ResolvedAnnotation[annotations.length + 1];
+ System.arraycopy(annotations, 0, a, 0, annotations.length);
+ a[annotations.length] = annotation;
+ annotations = a;
+ }
+ }
+
+ public ASTNode getNode() {
+ return node;
+ }
+
+ public ResolvedAnnotation[] getAnnotations() {
+ return annotations;
+ }
+
+}
Modified:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/JavaScanner.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/JavaScanner.java 2007-07-02
16:37:30 UTC (rev 2243)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/JavaScanner.java 2007-07-02
16:53:26 UTC (rev 2244)
@@ -11,7 +11,6 @@
package org.jboss.tools.seam.internal.core.scanner.java;
-import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
@@ -24,29 +23,14 @@
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.ASTRequestor;
-import org.eclipse.jdt.core.dom.ASTVisitor;
-import org.eclipse.jdt.core.dom.Annotation;
-import org.eclipse.jdt.core.dom.Block;
import org.eclipse.jdt.core.dom.CompilationUnit;
-import org.eclipse.jdt.core.dom.Expression;
-import org.eclipse.jdt.core.dom.MemberValuePair;
-import org.eclipse.jdt.core.dom.MethodDeclaration;
-import org.eclipse.jdt.core.dom.Name;
-import org.eclipse.jdt.core.dom.NormalAnnotation;
-import org.eclipse.jdt.core.dom.QualifiedName;
-import org.eclipse.jdt.core.dom.SimpleName;
-import org.eclipse.jdt.core.dom.SingleMemberAnnotation;
-import org.eclipse.jdt.core.dom.StringLiteral;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
import org.jboss.tools.common.util.FileUtil;
import org.jboss.tools.seam.internal.core.SeamComponent;
import org.jboss.tools.seam.internal.core.scanner.IFileScanner;
public class JavaScanner implements IFileScanner {
- static String NAME_ANNOTATION_TYPE = "org.jboss.seam.annotations.Name";
- static String SCOPE_ANNOTATION_TYPE = "org.jboss.seam.annotations.Scope";
-
public JavaScanner() {}
/**
@@ -144,84 +128,7 @@
}
}
- class ASTVisitorImpl extends ASTVisitor {
- IType type;
- String name = null;
- String scope = null;
- public boolean visit(SingleMemberAnnotation node) {
- if(checkAnnotationType(node, NAME_ANNOTATION_TYPE)) {
- name = checkExpression(node.getValue());
- return true;
- } else if(checkAnnotationType(node, SCOPE_ANNOTATION_TYPE)) {
- scope = checkExpression(node.getValue());
- if(scope != null) {
- int i = scope.lastIndexOf('.');
- if(i >= 0) scope = scope.substring(i + 1).toLowerCase();
- }
- return true;
- }
- return false;
- }
- public boolean visit(NormalAnnotation node) {
- if(checkAnnotationType(node, NAME_ANNOTATION_TYPE)) {
- name = getValue(node);
- return true;
- } else if(checkAnnotationType(node, SCOPE_ANNOTATION_TYPE)) {
- scope = getValue(node);
- return true;
- }
- return false;
- }
-
- String getValue(NormalAnnotation node) {
- List vs = node.values();
- if(vs != null) for (int i = 0; i < vs.size(); i++) {
- MemberValuePair p = (MemberValuePair)vs.get(i);
- if("value".equals(p.getName().getIdentifier())) {
- return checkExpression(p.getValue());
- }
- }
- return null;
- }
-
-
- boolean checkAnnotationType(Annotation node, String annotationType) {
- Name nm = node.getTypeName();
- if(nm instanceof SimpleName) {
- SimpleName sn = (SimpleName)nm;
- String n = sn.getIdentifier();
- if(type != null) {
- n = getResolvedType(type, n);
- }
- if(!annotationType.equals(n)) return false;
- } else if(nm instanceof QualifiedName) {
- QualifiedName qn = (QualifiedName)nm;
- if(!qn.getFullyQualifiedName().equals(annotationType)) return false;
- //improve
- } else {
- return false;
- }
- return true;
- }
-
- String checkExpression(Expression exp) {
- if(exp instanceof StringLiteral) {
- return ((StringLiteral)exp).getLiteralValue();
- } else if(exp instanceof QualifiedName) {
- return exp.toString();
- }
- return null;
- }
-
- public boolean visit(Block node) {
- return false;
- }
- public boolean visit(MethodDeclaration node) {
- return false;
- }
- }
-
- String getResolvedType(IType type, String n) {
+ static String getResolvedType(IType type, String n) {
try {
String[][] rs = type.resolveType(n);
if(rs != null && rs.length > 0) {
@@ -233,5 +140,4 @@
return n;
}
-
}
Added:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/ResolvedAnnotation.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/ResolvedAnnotation.java
(rev 0)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/ResolvedAnnotation.java 2007-07-02
16:53:26 UTC (rev 2244)
@@ -0,0 +1,22 @@
+package org.jboss.tools.seam.internal.core.scanner.java;
+
+import org.eclipse.jdt.core.dom.Annotation;
+
+public class ResolvedAnnotation {
+ String type;
+ Annotation annotation;
+
+ public ResolvedAnnotation(String type, Annotation annotation) {
+ this.type = type;
+ this.annotation = annotation;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public Annotation getAnnotation() {
+ return annotation;
+ }
+
+}
Show replies by date