[jbosstools-commits] JBoss Tools SVN: r30793 - in trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core: definition and 2 other directories.

jbosstools-commits at lists.jboss.org jbosstools-commits at lists.jboss.org
Fri Apr 22 20:34:35 EDT 2011


Author: scabanovich
Date: 2011-04-22 20:34:35 -0400 (Fri, 22 Apr 2011)
New Revision: 30793

Added:
   trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/util/
   trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/util/Util.java
Modified:
   trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/CDISeamConfigConstants.java
   trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/CDISeamConfigExtension.java
   trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/ConfigDefinitionContext.java
   trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamBeansDefinition.java
   trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/SAXParser.java
   trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/SeamDefinitionBuilder.java
Log:
JBIDE-3120
https://issues.jboss.org/browse/JBIDE-3120

Modified: trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/CDISeamConfigConstants.java
===================================================================
--- trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/CDISeamConfigConstants.java	2011-04-23 00:33:40 UTC (rev 30792)
+++ trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/CDISeamConfigConstants.java	2011-04-23 00:34:35 UTC (rev 30793)
@@ -16,4 +16,12 @@
 
 	public static String SEAM_BEANS_XML = "seam-beans.xml";
 
+	public static String URI_PREFIX = "urn:java:";
+
+	//Problem id: node name was not resolved to Java type
+	public static String UNRESOLVED_TYPE = "Unresolved type";
+
+	//Problem id: node was expected to be resolved to annotation type
+	public static String ANNOTATION_EXPECTED = "Annotation expected";
+
 }

Modified: trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/CDISeamConfigExtension.java
===================================================================
--- trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/CDISeamConfigExtension.java	2011-04-23 00:33:40 UTC (rev 30792)
+++ trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/CDISeamConfigExtension.java	2011-04-23 00:34:35 UTC (rev 30793)
@@ -14,6 +14,7 @@
 import java.util.Set;
 
 import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.jdt.core.IPackageFragmentRoot;
 import org.eclipse.jface.text.Document;
@@ -41,10 +42,6 @@
 
 	ConfigFileSet fileSet = new ConfigFileSet();
 
-	public Object getAdapter(Class adapter) {
-		return null;
-	}
-
 	public void setProject(CDICoreNature n) {
 		project = n;
 	}
@@ -88,10 +85,11 @@
 			 }
 			 if(o instanceof FileAnyImpl) {
 				 String text = ((FileAnyImpl)o).getAsText();
+				 IResource resource = (IResource)o.getAdapter(IResource.class);
 				 IDocument document = new Document();
 				 SeamDefinitionBuilder builder = new SeamDefinitionBuilder();
 				 document.set(text);
-				 SeamBeansDefinition def = builder.createDefinition(document, project);
+				 SeamBeansDefinition def = builder.createDefinition(resource, document, project, context.getWorkingCopy());
 				 if(isSeamBeans) {
 					 context.getWorkingCopy().addSeamBeanXML(p, def);
 				 } else {
@@ -103,7 +101,7 @@
 	}
 
 	public void buildDefinitions(FileSet fileSet) {
-		//nothing to do
+		//nothing to do since we visited all resources.
 	}
 
 	public void buildBeans() {

Modified: trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/ConfigDefinitionContext.java
===================================================================
--- trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/ConfigDefinitionContext.java	2011-04-23 00:33:40 UTC (rev 30792)
+++ trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/ConfigDefinitionContext.java	2011-04-23 00:34:35 UTC (rev 30793)
@@ -16,7 +16,10 @@
 import java.util.Set;
 
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.IType;
 import org.jboss.tools.cdi.core.extension.AbstractDefinitionContextExtension;
+import org.jboss.tools.cdi.internal.core.impl.definition.AnnotationDefinition;
+import org.jboss.tools.cdi.internal.core.impl.definition.DefinitionContext;
 import org.jboss.tools.cdi.seam.config.core.definition.SeamBeansDefinition;
 
 /**
@@ -28,6 +31,8 @@
 	private Map<IPath, SeamBeansDefinition> beanXMLs = new HashMap<IPath, SeamBeansDefinition>();
 	private Map<IPath, SeamBeansDefinition> seambeanXMLs = new HashMap<IPath, SeamBeansDefinition>();
 
+	private Map<String, AnnotationDefinition> annotations = new HashMap<String, AnnotationDefinition>();
+
 	public ConfigDefinitionContext getWorkingCopy() {
 		return (ConfigDefinitionContext)super.getWorkingCopy();
 	}
@@ -38,6 +43,7 @@
 		if(!clean) {
 			copy.beanXMLs.putAll(beanXMLs);
 			copy.seambeanXMLs.putAll(seambeanXMLs);
+			copy.annotations.putAll(annotations);
 			//TODO
 		}
 
@@ -45,8 +51,20 @@
 	}
 
 	protected void doApplyWorkingCopy() {
-		beanXMLs = ((ConfigDefinitionContext)workingCopy).beanXMLs;
-		seambeanXMLs = ((ConfigDefinitionContext)workingCopy).seambeanXMLs;
+		ConfigDefinitionContext copy = (ConfigDefinitionContext)workingCopy;
+		beanXMLs = copy.beanXMLs;
+		seambeanXMLs = copy.seambeanXMLs;
+		
+		for (String s: annotations.keySet()) {
+			if(!copy.annotations.containsKey(s)) {
+				//Remove from root and reload it in root.
+				AnnotationDefinition d = annotations.get(s);
+				IType type = d.getType();
+				root.clean(type.getFullyQualifiedName());
+				root.getAnnotationKind(type);
+			}
+		}
+		annotations = copy.annotations;
 	}
 
 	public void clean() {
@@ -56,6 +74,9 @@
 		synchronized (seambeanXMLs) {
 			seambeanXMLs.clear();
 		}
+		synchronized (annotations) {
+			annotations.clear();
+		}
 	}
 
 	public void clean(IPath path) {
@@ -67,6 +88,12 @@
 		}
 	}
 
+	public void clean(String typeName) {
+		synchronized(annotations) {
+			annotations.remove(typeName);
+		}
+	}
+
 	public void addBeanXML(IPath path, SeamBeansDefinition def) {
 		synchronized (beanXMLs) {
 			beanXMLs.put(path, def);
@@ -92,4 +119,11 @@
 		return result;
 	}
 
+	public void addAnnotation(String typeName, AnnotationDefinition def) {
+		IPath path = def.getResource().getFullPath();
+//		root.clean(typeName);
+		annotations.put(typeName, def);
+		((DefinitionContext)root).addType(path, typeName, def);
+	}
+
 }

Modified: trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamBeansDefinition.java
===================================================================
--- trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamBeansDefinition.java	2011-04-23 00:33:40 UTC (rev 30792)
+++ trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamBeansDefinition.java	2011-04-23 00:34:35 UTC (rev 30793)
@@ -10,11 +10,30 @@
  ******************************************************************************/
 package org.jboss.tools.cdi.seam.config.core.definition;
 
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.jboss.tools.cdi.seam.config.core.scanner.SAXElement;
+import org.jboss.tools.cdi.seam.config.core.scanner.SAXNode;
+
 /**
  * 
  * @author Viacheslav Kabanovich
  *
  */
 public class SeamBeansDefinition {
+	Map<SAXNode, String> unresolvedNodes = new HashMap<SAXNode, String>();
+	
+	public SeamBeansDefinition() {}
 
+	public Map<SAXNode, String> getUnresolvedNodes() {
+		return unresolvedNodes;
+	}
+
+	public void addUnresolvedNode(SAXNode node, String problem) {
+		unresolvedNodes.put(node, problem);
+	}
+
 }

Modified: trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/SAXParser.java
===================================================================
--- trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/SAXParser.java	2011-04-23 00:33:40 UTC (rev 30792)
+++ trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/SAXParser.java	2011-04-23 00:34:35 UTC (rev 30793)
@@ -134,6 +134,7 @@
 			current = element;
 			currentText = new StringBuffer();
 			currentTextLocation = null;
+			if(root == null) root = element;
 		}
 	
 		public void characters (char ch[], int start, int length) throws SAXException {
@@ -160,13 +161,17 @@
 				current.setTextNode(text);
 				text.setLocation(currentTextLocation);
 			}
+		
+			if(current.getParent() != null) {
+				current.getParent().addChildElement(current);
+			}
 			
 			current = current.getParent();
 		}
 
 
 		public void error(SAXParseException e) throws SAXException {
-			String message = e.getException().getMessage();
+			String message = e.getMessage();
 			errors.add(message);
 		}
 

Modified: trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/SeamDefinitionBuilder.java
===================================================================
--- trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/SeamDefinitionBuilder.java	2011-04-23 00:33:40 UTC (rev 30792)
+++ trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/SeamDefinitionBuilder.java	2011-04-23 00:34:35 UTC (rev 30793)
@@ -1,21 +1,134 @@
 package org.jboss.tools.cdi.seam.config.core.scanner;
 
 import java.io.ByteArrayInputStream;
+import java.util.List;
 
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jface.text.IDocument;
 import org.jboss.tools.cdi.core.CDICoreNature;
+import org.jboss.tools.cdi.core.IJavaAnnotation;
+import org.jboss.tools.cdi.internal.core.impl.AnnotationLiteral;
+import org.jboss.tools.cdi.internal.core.impl.definition.AnnotationDefinition;
+import org.jboss.tools.cdi.seam.config.core.CDISeamConfigConstants;
+import org.jboss.tools.cdi.seam.config.core.CDISeamConfigCorePlugin;
+import org.jboss.tools.cdi.seam.config.core.ConfigDefinitionContext;
 import org.jboss.tools.cdi.seam.config.core.definition.SeamBeansDefinition;
+import org.jboss.tools.cdi.seam.config.core.util.Util;
 
 public class SeamDefinitionBuilder {
+	static int IN_ANNOTATION_TYPE = 1;
 
-	public SeamBeansDefinition createDefinition(IDocument document, CDICoreNature project) {
-		SAXParser parser = new SAXParser();
-		String text = document.get();
-		ByteArrayInputStream s = new ByteArrayInputStream(text.getBytes());
-		SAXElement element = parser.parse(s, document);
-		SeamBeansDefinition result = new SeamBeansDefinition();
-		//TODO
+	CDICoreNature project;
+	ConfigDefinitionContext context;
+	IResource resource;
+	SeamBeansDefinition result;
+	SAXElement root;
+
+	public SeamBeansDefinition createDefinition(IResource resource, IDocument document, CDICoreNature project, ConfigDefinitionContext context) {
+		this.project = project;
+		this.context = context;
+		this.resource = resource;
+		
+		result = new SeamBeansDefinition();
+		if(document.get().indexOf("<") >= 0) { // file can be empty
+			SAXParser parser = new SAXParser();
+			String text = document.get();
+			ByteArrayInputStream s = new ByteArrayInputStream(text.getBytes());
+			root = parser.parse(s, document);
+			scanRoot();
+		}
+
 		return result;
 	}
 
+	private void scanRoot() {
+		if(root == null) return;
+		List<SAXElement> es = root.getChildElements();
+		for (SAXElement element: es) {
+			scanElement(element);
+		}
+	}
+
+	private void scanElement(SAXElement element) {
+		if(!Util.isConfigRelevant(element)) return;
+
+		IType type = Util.resolveType(element, project);
+		if(type == null) {
+			result.addUnresolvedNode(element, CDISeamConfigConstants.UNRESOLVED_TYPE);
+			return;
+		}
+		boolean isAnnnotation = false;
+		try {
+			isAnnnotation = type.isAnnotation();
+		} catch (JavaModelException e) {
+			CDISeamConfigCorePlugin.getDefault().logError(e);
+			result.addUnresolvedNode(element, CDISeamConfigConstants.UNRESOLVED_TYPE);
+			return;
+		}
+		if(isAnnnotation) {
+			scanAnnotation(element, type);
+		} else {
+			scanBean(element, type);
+		}
+	}
+
+	private void scanAnnotation(SAXElement element, IType type) {
+		context.getRootContext().getAnnotationKind(type); // kick it
+		AnnotationDefinition old = context.getRootContext().getAnnotation(type.getFullyQualifiedName());
+		AnnotationDefinition def = new AnnotationDefinition();
+		def.setType(type, context.getRootContext());
+
+		List<SAXElement> es = element.getChildElements();
+		//children should be annotation declarations.
+		for (SAXElement c: es) {
+			IJavaAnnotation a = loadAnnotationDeclaration(c, IN_ANNOTATION_TYPE);
+			if(a != null) {
+				def.addAnnotation(a, context.getRootContext());
+			}
+		}
+		
+		def.revalidateKind(context.getRootContext());
+	
+		context.addAnnotation(type.getFullyQualifiedName(), def);
+
+	}
+
+	private void scanBean(SAXElement element, IType type) {
+		List<SAXElement> es = element.getChildElements();
+		//TODO
+	}
+
+	private IJavaAnnotation loadAnnotationDeclaration(SAXElement element, int contextKind) {
+		if(!Util.isConfigRelevant(element)) return null;
+		
+		IType type = Util.resolveType(element, project);
+		if(type == null) {
+			if(contextKind == IN_ANNOTATION_TYPE) {
+				result.addUnresolvedNode(element, CDISeamConfigConstants.UNRESOLVED_TYPE);
+			}
+			return null;
+		}
+		boolean isAnnnotation = false;
+		try {
+			isAnnnotation = type.isAnnotation();
+		} catch (JavaModelException e) {
+			CDISeamConfigCorePlugin.getDefault().logError(e);
+			result.addUnresolvedNode(element, CDISeamConfigConstants.UNRESOLVED_TYPE);
+			return null;
+		}
+		if(isAnnnotation) {
+			context.getRootContext().getAnnotationKind(type); // kick it
+			AnnotationLiteral literal = new AnnotationLiteral(resource,  
+					element.getLocation().getStartPosition(), element.getLocation().getLength(), 
+					null, 0, type);
+			//TODO read and add member values.
+			return literal;
+		} else if(contextKind == IN_ANNOTATION_TYPE) {
+			result.addUnresolvedNode(element, CDISeamConfigConstants.ANNOTATION_EXPECTED);
+		}		
+		return null;
+	}
+
 }

Added: trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/util/Util.java
===================================================================
--- trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/util/Util.java	                        (rev 0)
+++ trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/util/Util.java	2011-04-23 00:34:35 UTC (rev 30793)
@@ -0,0 +1,107 @@
+package org.jboss.tools.cdi.seam.config.core.util;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.jdt.core.IField;
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.jboss.tools.cdi.core.CDICoreNature;
+import org.jboss.tools.cdi.seam.config.core.CDISeamConfigConstants;
+import org.jboss.tools.cdi.seam.config.core.scanner.SAXElement;
+
+public class Util {
+	public static Map<String, String> EE_TYPES = new HashMap<String, String>();
+	
+	static {
+		String[] JAVA_LANG = {"Integer", "Short", "Long", "String", "Character", "Byte", "Boolean"};
+		for (String s: JAVA_LANG) EE_TYPES.put(s, "java.lang." + s);
+
+		String[] JAVA_UTIL = {"List", "Map", "Set"};
+		for (String s: JAVA_UTIL) EE_TYPES.put(s, "java.util." + s);
+		
+		String[] JAVAX_ANNOTATION = {"Generated", "PostConstruct", "PreDestroy", "Resource", "Resources"};
+		for (String s: JAVAX_ANNOTATION) EE_TYPES.put(s, "javax.annotation." + s);
+		
+		String[] JAVAX_INJECT = {"Inject", "Named", "Provider", "Qualifier", "Scope", "Singleton"};
+		for (String s: JAVAX_INJECT) EE_TYPES.put(s, "javax.inject." + s);
+		
+		String[] JAVAX_ENTERPRISE_INJECT = {"Alternative", "AmbiguousResolutionException", "Any", "CreationException", 
+				"Default", "Disposes", "IllegalProductException", "InjectionException", "Instance", "Model", "New", 
+				"Produces", "ResolutionException", "Specializes", "Stereotype", "Typed",
+				"UnproxyableResolutionException", "UnsatisfiedResolutionException"};
+		for (String s: JAVAX_ENTERPRISE_INJECT) EE_TYPES.put(s, "javax.enterprise.inject." + s);
+
+		String[] JAVAX_ENTERPRISE_CONTEXT = {"ApplicationScoped", "BusyConversationException", "ContextException", 
+				"ContextNotActiveException", "Conversation", "ConversationScoped", "Dependent",
+				"NonexistentConversationException", "NormalScope", "RequestScoped", "SessionScoped"};
+		for (String s: JAVAX_ENTERPRISE_CONTEXT) EE_TYPES.put(s, "javax.enterprise.context." + s);
+		
+		String[] JAVAX_ENTERPRISE_EVENT = {"Event", "ObserverException", "Observes", "Reception", "TransactionPhase"};
+		for (String s: JAVAX_ENTERPRISE_EVENT) EE_TYPES.put(s, "javax.enterprise.event." + s);
+		
+		String[] JAVAX_DECORAROR = {"Decorator", "Delegate"};
+		for (String s: JAVAX_DECORAROR) EE_TYPES.put(s, "javax.decorator." + s);
+		
+		String[] JAVAX_INTERCEPTOR = {"AroundInvoke", "AroundTimeout", "ExcludeClassInterceptors", "ExcludeDefaultInterceptors",
+				"Interceptor", "InterceptorBinding", "Interceptors", "InvocationContext"};
+		for (String s: JAVAX_INTERCEPTOR) EE_TYPES.put(s, "javax.interceptor." + s);
+		
+	}
+
+	public static boolean isConfigRelevant(SAXElement element) {
+		String uri = element.getURI();
+		return (uri != null && uri.startsWith(CDISeamConfigConstants.URI_PREFIX));
+	}
+
+	public static IType resolveType(SAXElement element, CDICoreNature project) {
+		String uri = element.getURI();
+		if(uri == null || !uri.startsWith(CDISeamConfigConstants.URI_PREFIX)) {
+			return null;
+		}
+		String name = element.getLocalName();
+		String[] packages = getPackages(uri);
+		for (String pkg: packages) {
+			if(pkg.length() == 0) continue;
+			String typeName = null;
+			if(pkg.equals("ee")) {
+				typeName = Util.EE_TYPES.get(name);
+			} else {
+				typeName = pkg + "." + name;
+			}
+			IType type = project.getType(typeName);
+			if(type != null) {
+				return type;
+			}
+		}
+		return null;
+	}
+
+	public static IMember resolveMember(IType type, SAXElement element) throws JavaModelException {
+		String name = element.getLocalName();
+		IField f = type.getField(name);
+		if(f != null && f.exists()) {
+			return f;
+		}
+		IMethod[] ms = type.getMethods();
+		for (IMethod m: ms) {
+			if(name.equals(m.getElementName())) {
+				//do more checks
+				return m;
+			}
+		}
+		
+		return null;
+	}
+
+	public static String[] getPackages(String uri) {
+		if(uri == null || !uri.startsWith(CDISeamConfigConstants.URI_PREFIX)) {
+			return new String[0];
+		}
+		uri = uri.substring(CDISeamConfigConstants.URI_PREFIX.length());
+		return uri.split(":");
+	}
+
+}


Property changes on: trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/util/Util.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain



More information about the jbosstools-commits mailing list