[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