Author: scabanovich
Date: 2011-08-25 14:42:29 -0400 (Thu, 25 Aug 2011)
New Revision: 34321
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/ConfigDefinitionContext.java
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/ConfigFieldDefinition.java
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/ConfigMethodDefinition.java
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/ConfigTypeDefinition.java
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/ConfigVirtualFieldDefinition.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/SeamDefinitionBuilder.java
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/util/Util.java
Log:
JBIDE-9186
https://issues.jboss.org/browse/JBIDE-9186
When a Java type is added, seam bean xml that potentially references it in an unresolved
bean should be rebuilt.
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-08-25
18:33:07 UTC (rev 34320)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/CDISeamConfigExtension.java 2011-08-25
18:42:29 UTC (rev 34321)
@@ -18,8 +18,11 @@
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.IType;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.IDocument;
import org.eclipse.osgi.util.NLS;
@@ -38,6 +41,7 @@
import org.jboss.tools.cdi.seam.config.core.xml.SAXAttribute;
import org.jboss.tools.cdi.seam.config.core.xml.SAXElement;
import org.jboss.tools.cdi.seam.config.core.xml.SAXNode;
+import org.jboss.tools.common.EclipseUtil;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.filesystems.impl.FileAnyImpl;
import org.jboss.tools.common.model.filesystems.impl.FolderImpl;
@@ -77,6 +81,26 @@
addBeansXML(file, fileSet);
} else if(webinf != null && webinf.isPrefixOf(path) &&
webinf.segmentCount() == path.segmentCount() - 1) {
addBeansXML(file, fileSet);
+ } else if(src != null && file.getName().endsWith(".java")) {
+ //Check that Java type appeared that may resolve a node in seam beans xml.
+ try {
+ ICompilationUnit unit = EclipseUtil.getCompilationUnit(file);
+ if(unit != null) {
+ IType[] ts = unit.getTypes();
+ for (IType t: ts) {
+ String type = t.getFullyQualifiedName();
+ IPath p = context.getWorkingCopy().getPathForPossibleType(type);
+ if(p != null && fileSet.getBeanXML(p) == null) {
+ IFile f =
context.getRootContext().getProject().getProject().getWorkspace().getRoot().getFile(p);
+ if(f.exists()) {
+ addBeansXML(f, fileSet);
+ }
+ }
+ }
+ }
+ } catch (CoreException e) {
+ CDISeamConfigCorePlugin.getDefault().logError(e);
+ }
}
}
@@ -111,6 +135,7 @@
SeamDefinitionBuilder builder = new SeamDefinitionBuilder();
document.set(text);
SeamBeansDefinition def = builder.createDefinition(resource, document,
context.getRootContext().getProject(), context.getWorkingCopy());
+ def.setFileObject(o);
newDefinitions.add(def);
if(isSeamBeans) {
context.getWorkingCopy().addSeamBeanXML(p, def);
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-08-25
18:33:07 UTC (rev 34320)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/ConfigDefinitionContext.java 2011-08-25
18:42:29 UTC (rev 34321)
@@ -36,6 +36,12 @@
private Map<String, AnnotationDefinition> annotations = new HashMap<String,
AnnotationDefinition>();
+ /**
+ * Temporal map used by working copy, to detect bean xml files
+ * that should be rebuilt when new Java type is created.
+ */
+ private Map<String, IPath> possibleTypes = new HashMap<String, IPath>();
+
public ConfigDefinitionContext getWorkingCopy() {
return (ConfigDefinitionContext)super.getWorkingCopy();
}
@@ -47,6 +53,7 @@
copy.beanXMLs.putAll(beanXMLs);
copy.seambeanXMLs.putAll(seambeanXMLs);
copy.annotations.putAll(annotations);
+ copy.initPossibleTypes();
//TODO
}
@@ -125,6 +132,13 @@
return result;
}
+ public Set<IPath> getAllPaths() {
+ Set<IPath> result = new HashSet<IPath>();
+ result.addAll(beanXMLs.keySet());
+ result.addAll(seambeanXMLs.keySet());
+ return result;
+ }
+
public SeamBeansDefinition getDefinition(IPath path) {
if(beanXMLs.containsKey(path)) return beanXMLs.get(path);
if(seambeanXMLs.containsKey(path)) return seambeanXMLs.get(path);
@@ -149,4 +163,19 @@
return result;
}
+ void initPossibleTypes() {
+ Set<IPath> ps = getAllPaths();
+ for (IPath p: ps) {
+ SeamBeansDefinition d = getDefinition(p);
+ Set<String> ns = d.getPossibleTypeNames();
+ for (String type: ns) {
+ possibleTypes.put(type, p);
+ }
+ }
+ }
+
+ public IPath getPathForPossibleType(String type) {
+ return possibleTypes.get(type);
+ }
+
}
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/ConfigFieldDefinition.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/ConfigFieldDefinition.java 2011-08-25
18:33:07 UTC (rev 34320)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/ConfigFieldDefinition.java 2011-08-25
18:42:29 UTC (rev 34321)
@@ -11,6 +11,7 @@
package org.jboss.tools.cdi.seam.config.core.definition;
import org.jboss.tools.cdi.internal.core.impl.definition.FieldDefinition;
+import org.jboss.tools.common.model.XModelObject;
/**
*
@@ -19,8 +20,11 @@
*/
public class ConfigFieldDefinition extends FieldDefinition implements IConfigDefinition
{
protected SeamFieldDefinition config;
+ protected XModelObject file;
- public ConfigFieldDefinition() {}
+ public ConfigFieldDefinition(XModelObject file) {
+ this.file = file;
+ }
public void setConfig(SeamFieldDefinition config) {
this.config = config;
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/ConfigMethodDefinition.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/ConfigMethodDefinition.java 2011-08-25
18:33:07 UTC (rev 34320)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/ConfigMethodDefinition.java 2011-08-25
18:42:29 UTC (rev 34321)
@@ -11,6 +11,7 @@
package org.jboss.tools.cdi.seam.config.core.definition;
import org.jboss.tools.cdi.internal.core.impl.definition.MethodDefinition;
+import org.jboss.tools.common.model.XModelObject;
/**
*
@@ -19,8 +20,11 @@
*/
public class ConfigMethodDefinition extends MethodDefinition implements IConfigDefinition
{
protected SeamMethodDefinition config;
+ protected XModelObject file;
- public ConfigMethodDefinition() {}
+ public ConfigMethodDefinition(XModelObject file) {
+ this.file = file;
+ }
public void setConfig(SeamMethodDefinition config) {
this.config = config;
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/ConfigTypeDefinition.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/ConfigTypeDefinition.java 2011-08-25
18:33:07 UTC (rev 34320)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/ConfigTypeDefinition.java 2011-08-25
18:42:29 UTC (rev 34321)
@@ -13,6 +13,7 @@
import org.jboss.tools.cdi.internal.core.impl.definition.FieldDefinition;
import org.jboss.tools.cdi.internal.core.impl.definition.MethodDefinition;
import org.jboss.tools.cdi.internal.core.impl.definition.TypeDefinition;
+import org.jboss.tools.common.model.XModelObject;
/**
*
@@ -21,9 +22,14 @@
*/
public class ConfigTypeDefinition extends TypeDefinition implements IConfigDefinition {
protected SeamBeanDefinition config;
+ protected XModelObject file;
public ConfigTypeDefinition() {}
+ public void setFileObject(XModelObject file) {
+ this.file = file;
+ }
+
public void setConfig(SeamBeanDefinition config) {
this.config = config;
setOriginalDefinition(new TextSourceReference(config.getResource(),
config.getNode()));
@@ -34,11 +40,11 @@
}
protected FieldDefinition newFieldDefinition() {
- return new ConfigFieldDefinition();
+ return new ConfigFieldDefinition(file);
}
protected MethodDefinition newMethodDefinition() {
- return new ConfigMethodDefinition();
+ return new ConfigMethodDefinition(file);
}
}
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/ConfigVirtualFieldDefinition.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/ConfigVirtualFieldDefinition.java 2011-08-25
18:33:07 UTC (rev 34320)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/ConfigVirtualFieldDefinition.java 2011-08-25
18:42:29 UTC (rev 34321)
@@ -13,6 +13,7 @@
import org.jboss.tools.cdi.internal.core.impl.definition.FieldDefinition;
import org.jboss.tools.cdi.internal.core.impl.definition.MethodDefinition;
import org.jboss.tools.cdi.internal.core.impl.definition.TypeDefinition;
+import org.jboss.tools.common.model.XModelObject;
/**
*
@@ -21,6 +22,7 @@
*/
public class ConfigVirtualFieldDefinition extends TypeDefinition implements
IConfigDefinition {
protected SeamVirtualFieldDefinition config;
+ protected XModelObject file;
public ConfigVirtualFieldDefinition() {}
@@ -29,16 +31,20 @@
setOriginalDefinition(new TextSourceReference(config.getResource(),
config.getNode()));
}
+ public void setFileObject(XModelObject file) {
+ this.file = file;
+ }
+
public SeamVirtualFieldDefinition getConfig() {
return config;
}
protected FieldDefinition newFieldDefinition() {
- return new ConfigFieldDefinition();
+ return new ConfigFieldDefinition(file);
}
protected MethodDefinition newMethodDefinition() {
- return new ConfigMethodDefinition();
+ return new ConfigMethodDefinition(file);
}
}
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-08-25
18:33:07 UTC (rev 34320)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamBeansDefinition.java 2011-08-25
18:42:29 UTC (rev 34321)
@@ -30,6 +30,7 @@
import org.jboss.tools.cdi.seam.config.core.xml.SAXNode;
import org.jboss.tools.common.java.IAnnotationDeclaration;
import org.jboss.tools.common.java.IJavaAnnotation;
+import org.jboss.tools.common.model.XModelObject;
/**
*
@@ -38,20 +39,26 @@
*/
public class SeamBeansDefinition {
IResource resource;
+ XModelObject file;
Map<SAXNode, String> unresolvedNodes = new HashMap<SAXNode, String>();
+ Set<String> possibleTypeNames = new HashSet<String>();
Set<SeamBeanDefinition> beanDefinitions = new
HashSet<SeamBeanDefinition>();
Set<SeamVirtualFieldDefinition> virtualFieldDefinitions = new
HashSet<SeamVirtualFieldDefinition>();
List<TypeDefinition> typeDefinitions = new ArrayList<TypeDefinition>();
List<IType> replacedAndModified = new ArrayList<IType>();
-
+
public SeamBeansDefinition() {}
public void setResource(IResource resource) {
this.resource = resource;
}
+ public void setFileObject(XModelObject file) {
+ this.file = file;
+ }
+
public IResource getResource() {
return resource;
}
@@ -60,10 +67,23 @@
return unresolvedNodes;
}
+ /**
+ * Returns type names that could resolve unresolved nodes if such types existed.
+ *
+ * @return
+ */
+ public Set<String> getPossibleTypeNames() {
+ return possibleTypeNames;
+ }
+
public void addUnresolvedNode(SAXNode node, String problem) {
unresolvedNodes.put(node, problem);
}
+ public void addPossibleTypeNames(Set<String> types) {
+ possibleTypeNames.addAll(types);
+ }
+
public void addBeanDefinition(SeamBeanDefinition def) {
beanDefinitions.add(def);
}
@@ -90,6 +110,7 @@
for (SeamBeanDefinition def: beanDefinitions) {
IType type = def.getType();
ConfigTypeDefinition typeDef = new ConfigTypeDefinition();
+ typeDef.setFileObject(file);
boolean replaces = def.getReplacesLocation() != null;
boolean modifies = def.getModifiesLocation() != null;
if(replaces || modifies) {
@@ -112,6 +133,7 @@
for (SeamVirtualFieldDefinition def: virtualFieldDefinitions) {
IType type = def.getType();
ConfigVirtualFieldDefinition typeDef = new ConfigVirtualFieldDefinition();
+ typeDef.setFileObject(file);
typeDef.setConfig(def);
int flags = AbstractMemberDefinition.FLAG_NO_ANNOTATIONS;
typeDef.setType(type, context.getRootContext(), flags);
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-08-25
18:33:07 UTC (rev 34320)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/SeamDefinitionBuilder.java 2011-08-25
18:42:29 UTC (rev 34321)
@@ -89,6 +89,7 @@
IType type = Util.resolveType(element, project);
if(type == null) {
result.addUnresolvedNode(element, CDISeamConfigConstants.ERROR_UNRESOLVED_TYPE);
+ result.addPossibleTypeNames(Util.getPossibleTypeNames(element));
return;
}
TypeCheck typeCheck = new TypeCheck(type, element);
Modified:
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 2011-08-25
18:33:07 UTC (rev 34320)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/util/Util.java 2011-08-25
18:42:29 UTC (rev 34321)
@@ -11,8 +11,10 @@
package org.jboss.tools.cdi.seam.config.core.util;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import org.eclipse.jdt.core.IField;
import org.eclipse.jdt.core.IMember;
@@ -118,6 +120,30 @@
return null;
}
+ /**
+ * Computes possible type names that could resolve type for the element,
+ * if one of these types existed.
+ * Returns empty set if a) element has no prefix, b) uri is not urn:java:,
+ * c) package is 'ee'.
+ *
+ * @param element
+ * @return
+ */
+ public static Set<String> getPossibleTypeNames(SAXElement element) {
+ Set<String> result = new HashSet<String>();
+ String name = element.getLocalName();
+ String uri = element.getURI();
+ if(uri != null && uri.startsWith(CDISeamConfigConstants.URI_PREFIX)) {
+ String[] packages = getPackages(uri);
+ for (String pkg: packages) {
+ if(pkg.length() > 0 && !pkg.equals(PACKAGE_EE)) {
+ result.add(pkg + "." + name);
+ }
+ }
+ }
+ return result;
+ }
+
public static IMember resolveMember(IType type, SAXElement element) throws
JavaModelException {
String name = element.getLocalName();
IField f = type.getField(name);