Author: scabanovich
Date: 2011-09-20 19:53:59 -0400 (Tue, 20 Sep 2011)
New Revision: 34908
Added:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamFieldValueDefinition.java
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/CDISeamConfigPreferences.java
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/AbstractSeamFieldDefinition.java
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamBeanDefinition.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
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/validation/SeamConfigValidationMessages.java
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/validation/messages.properties
Log:
JBIDE-9733
https://issues.jboss.org/browse/JBIDE-9733
Validation of inline beans in seam-config, including elements of collections and maps.
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-09-20
23:47:26 UTC (rev 34907)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/CDISeamConfigExtension.java 2011-09-20
23:53:59 UTC (rev 34908)
@@ -33,7 +33,11 @@
import org.jboss.tools.cdi.internal.core.impl.CDIProject;
import org.jboss.tools.cdi.internal.core.scanner.FileSet;
import org.jboss.tools.cdi.internal.core.validation.CDICoreValidator;
+import org.jboss.tools.cdi.seam.config.core.definition.ConfigTypeDefinition;
+import org.jboss.tools.cdi.seam.config.core.definition.SeamBeanDefinition;
import org.jboss.tools.cdi.seam.config.core.definition.SeamBeansDefinition;
+import org.jboss.tools.cdi.seam.config.core.definition.SeamFieldDefinition;
+import org.jboss.tools.cdi.seam.config.core.definition.SeamFieldValueDefinition;
import org.jboss.tools.cdi.seam.config.core.definition.TextSourceReference;
import org.jboss.tools.cdi.seam.config.core.scanner.ConfigFileSet;
import org.jboss.tools.cdi.seam.config.core.scanner.SeamDefinitionBuilder;
@@ -42,6 +46,8 @@
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.java.IParametedType;
+import org.jboss.tools.common.java.ParametedType;
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;
@@ -209,6 +215,28 @@
validator.addError(message, CDISeamConfigPreferences.ANNOTATION_EXPECTED, new
TextSourceReference(def.getFileObject(), file, node), file);
}
}
+ Set<SeamBeanDefinition> bs = def.getBeanDefinitions();
+ for (SeamBeanDefinition b: bs) {
+ List<SeamFieldDefinition> fs = b.getFields();
+ for (SeamFieldDefinition f: fs) {
+ List<SeamFieldValueDefinition> vs = f.getValueDefinitions();
+ if(vs.isEmpty()) continue;
+ for (SeamFieldValueDefinition v: vs) {
+ IParametedType requiredType = v.getRequiredType();
+ SeamBeanDefinition inline = v.getInlineBean();
+ ConfigTypeDefinition d = inline.getConfigType();
+ IParametedType actualType = d.getParametedType();
+ if(requiredType != null && actualType != null) {
+ if(!((ParametedType)actualType).isAssignableTo((ParametedType)requiredType, true))
{
+ String actual = actualType.getSimpleName();
+ String required = requiredType.getSimpleName();
+ String message = NLS.bind(SeamConfigValidationMessages.INLINE_BEAN_TYPE_MISMATCH,
actual, required);
+ validator.addError(message, CDISeamConfigPreferences.INLINE_BEAN_TYPE_MISMATCH,
new TextSourceReference(def.getFileObject(), file, inline.getNode()), file);
+ }
+ }
+ }
+ }
+ }
}
}
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/CDISeamConfigPreferences.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/CDISeamConfigPreferences.java 2011-09-20
23:47:26 UTC (rev 34907)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/CDISeamConfigPreferences.java 2011-09-20
23:53:59 UTC (rev 34908)
@@ -16,6 +16,8 @@
public static final String UNRESOLVED_CONSTRUCTOR =
INSTANCE.createSeverityOption("unresolvedConstructor");
public static final String ANNOTATION_EXPECTED =
INSTANCE.createSeverityOption("annotationExpected");
+ public static final String INLINE_BEAN_TYPE_MISMATCH =
INSTANCE.createSeverityOption("inlineBeanTypeMismatch");
+
public static CDISeamConfigPreferences getInstance() {
return INSTANCE;
}
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/AbstractSeamFieldDefinition.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/AbstractSeamFieldDefinition.java 2011-09-20
23:47:26 UTC (rev 34907)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/AbstractSeamFieldDefinition.java 2011-09-20
23:53:59 UTC (rev 34908)
@@ -28,6 +28,8 @@
public class AbstractSeamFieldDefinition extends SeamMemberDefinition {
protected List<SAXText> listValue = null;
protected Map<SAXText, SAXText> mapValue = null;
+
+ protected List<SeamFieldValueDefinition> valueDefinitions = new
ArrayList<SeamFieldValueDefinition>();
public AbstractSeamFieldDefinition() {}
@@ -61,4 +63,12 @@
return result;
}
+ public void addValueDefinition(SeamFieldValueDefinition def) {
+ valueDefinitions.add(def);
+ def.setParent(this);
+ }
+
+ public List<SeamFieldValueDefinition> getValueDefinitions() {
+ return valueDefinitions;
+ }
}
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamBeanDefinition.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamBeanDefinition.java 2011-09-20
23:47:26 UTC (rev 34907)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamBeanDefinition.java 2011-09-20
23:53:59 UTC (rev 34908)
@@ -28,6 +28,11 @@
protected List<SeamFieldDefinition> fields = new
ArrayList<SeamFieldDefinition>();
protected List<SeamMethodDefinition> methods = new
ArrayList<SeamMethodDefinition>();
+ /**
+ * Assigned to config type definition built on the base of this object;
+ */
+ protected ConfigTypeDefinition configType = null;
+
public SeamBeanDefinition() {}
public SAXElement getElement() {
@@ -93,4 +98,16 @@
return null;
}
+ public List<SeamFieldDefinition> getFields() {
+ return fields;
+ }
+
+ public void setConfigType(ConfigTypeDefinition configType) {
+ this.configType = configType;
+ }
+
+ public ConfigTypeDefinition getConfigType() {
+ return configType;
+ }
+
}
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-09-20
23:47:26 UTC (rev 34907)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamBeansDefinition.java 2011-09-20
23:53:59 UTC (rev 34908)
@@ -18,6 +18,7 @@
import java.util.Set;
import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.jboss.tools.cdi.internal.core.impl.definition.AbstractMemberDefinition;
@@ -26,10 +27,16 @@
import org.jboss.tools.cdi.internal.core.impl.definition.MethodDefinition;
import org.jboss.tools.cdi.internal.core.impl.definition.ParameterDefinition;
import org.jboss.tools.cdi.internal.core.impl.definition.TypeDefinition;
+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.util.Util;
+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.java.IAnnotationDeclaration;
import org.jboss.tools.common.java.IJavaAnnotation;
+import org.jboss.tools.common.java.IParametedType;
+import org.jboss.tools.common.java.ParametedType;
+import org.jboss.tools.common.java.TypeDeclaration;
import org.jboss.tools.common.model.XModelObject;
/**
@@ -128,6 +135,7 @@
flags |= AbstractMemberDefinition.FLAG_NO_ANNOTATIONS;
}
typeDef.setType(type, context.getRootContext(), flags);
+ def.setConfigType(typeDef);
mergeTypeDefinition(def, typeDef, context);
@@ -169,14 +177,72 @@
mergeAnnotations(def, typeDef, context);
List<FieldDefinition> fieldDefs = typeDef.getFields();
+ //virtual field definitions are used for injections of inline beans as values of
collections and maps.
+ List<FieldDefinition> virtualDefs = new ArrayList<FieldDefinition>();
for (FieldDefinition fieldDef:fieldDefs) {
String n = fieldDef.getField().getElementName();
SeamFieldDefinition f = def.getField(n);
if(f != null) {
+ ParametedType t = null;
+ IParametedType collection = null;
+ IParametedType map = null;
+ IParametedType object = null;
+ try {
+ String returnType = fieldDef.getField().getTypeSignature();
+ t =
context.getRootContext().getProject().getTypeFactory().getParametedType(fieldDef.getField(),
returnType);
+ object =
context.getRootContext().getProject().getTypeFactory().getParametedType(fieldDef.getField(),
"QObject;");
+ } catch (CoreException e) {
+ CDISeamConfigCorePlugin.getDefault().logError(e);
+ }
+ if(t != null && t.getType() != null) {
+ collection = getCollection(t);
+ map = getMap(t);
+ }
+ List<SeamFieldValueDefinition> vs = f.getValueDefinitions();
+ if(collection != null) {
+ List<? extends IParametedType> ps = t.getParameters();
+ IParametedType elementType = ps.isEmpty() ? object : ps.get(0);
+ for (SeamFieldValueDefinition v: vs) {
+ ConfigFieldDefinition virtual = new ConfigFieldDefinition(file);
+ virtual.setTypeDefinition(fieldDef.getTypeDefinition());
+ virtual.setField(fieldDef.getField(), context.getRootContext(),
AbstractMemberDefinition.FLAG_NO_ANNOTATIONS);
+ virtual.setOverridenType(new TypeDeclaration((ParametedType)elementType,
fieldDef.getField().getResource(), 0, 0));
+ virtual.setConfig(v);
+ virtualDefs.add(virtual);
+ v.setRequiredType(elementType);
+ mergeAnnotations(v, virtual, context);
+ }
+ } else if(map != null) {
+ List<? extends IParametedType> ps = t.getParameters();
+ IParametedType keyType = ps.isEmpty() ? object : ps.get(0);
+ IParametedType valueType = ps.size() < 2 ? object : ps.get(1);
+ for (SeamFieldValueDefinition v: vs) {
+ ConfigFieldDefinition virtual = new ConfigFieldDefinition(file);
+ virtual.setTypeDefinition(fieldDef.getTypeDefinition());
+ virtual.setField(fieldDef.getField(), context.getRootContext(),
AbstractMemberDefinition.FLAG_NO_ANNOTATIONS);
+ IParametedType vType = Util.isKey((SAXElement)v.getNode()) ? keyType : valueType;
+ v.setRequiredType(vType);
+ virtual.setOverridenType(new TypeDeclaration((ParametedType)vType,
fieldDef.getField().getResource(), 0, 0));
+ virtual.setConfig(v);
+ virtualDefs.add(virtual);
+ mergeAnnotations(v, virtual, context);
+ }
+ } else {
+ for (SeamFieldValueDefinition v: vs) {
+ v.setRequiredType(t);
+ }
+ }
+
((ConfigFieldDefinition)fieldDef).setConfig(f);
mergeAnnotations(f, fieldDef, context);
+
+ if(!vs.isEmpty() && collection == null && map == null) {
+ mergeAnnotations(vs.get(0), fieldDef, context);
+ }
+
}
}
+ fieldDefs.addAll(virtualDefs);
List<MethodDefinition> methodDefs = typeDef.getMethods();
for (MethodDefinition methodDef: methodDefs) {
@@ -212,4 +278,30 @@
}
}
+ private IParametedType getCollection(ParametedType t) {
+ if("java.util.Collection".equals(t.getType().getFullyQualifiedName())) {
+ return t;
+ }
+ Set<IParametedType> is = t.getInheritedTypes();
+ for (IParametedType i: is) {
+ if("java.util.Collection".equals(i.getType().getFullyQualifiedName())) {
+ return i;
+ }
+ }
+ return null;
+ }
+
+ private IParametedType getMap(ParametedType t) {
+ if("java.util.Map".equals(t.getType().getFullyQualifiedName())) {
+ return t;
+ }
+ Set<IParametedType> is = t.getInheritedTypes();
+ for (IParametedType i: is) {
+ if("java.util.Map".equals(i.getType().getFullyQualifiedName())) {
+ return i;
+ }
+ }
+ return null;
+ }
+
}
Added:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamFieldValueDefinition.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamFieldValueDefinition.java
(rev 0)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamFieldValueDefinition.java 2011-09-20
23:53:59 UTC (rev 34908)
@@ -0,0 +1,33 @@
+package org.jboss.tools.cdi.seam.config.core.definition;
+
+import org.jboss.tools.common.java.IParametedType;
+
+/**
+ * Additional object for field definition, when an inline bean is injected to its value.
+ * In case of collections and maps, there can be multiple value injections, for each one
a
+ * separate injection point should be provided.
+ *
+ * @author Viacheslav Kabanovich
+ *
+ */
+public class SeamFieldValueDefinition extends SeamFieldDefinition {
+ SeamBeanDefinition inline;
+ IParametedType requiredType;
+
+ public void setInlineBean(SeamBeanDefinition inline) {
+ this.inline = inline;
+ }
+
+ public SeamBeanDefinition getInlineBean() {
+ return inline;
+ }
+
+ public void setRequiredType(IParametedType requiredType) {
+ this.requiredType = requiredType;
+ }
+
+ public IParametedType getRequiredType() {
+ return requiredType;
+ }
+
+}
Property changes on:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamFieldValueDefinition.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
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-09-20
23:47:26 UTC (rev 34907)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/SeamDefinitionBuilder.java 2011-09-20
23:53:59 UTC (rev 34908)
@@ -32,6 +32,7 @@
import org.jboss.tools.cdi.seam.config.core.definition.SeamBeanDefinition;
import org.jboss.tools.cdi.seam.config.core.definition.SeamBeansDefinition;
import org.jboss.tools.cdi.seam.config.core.definition.SeamFieldDefinition;
+import org.jboss.tools.cdi.seam.config.core.definition.SeamFieldValueDefinition;
import org.jboss.tools.cdi.seam.config.core.definition.SeamMethodDefinition;
import org.jboss.tools.cdi.seam.config.core.definition.SeamParameterDefinition;
import org.jboss.tools.cdi.seam.config.core.definition.SeamVirtualFieldDefinition;
@@ -264,10 +265,17 @@
SeamBeanDefinition inline = scanBean(c, type, true);
IJavaAnnotation q = createInlineBeanQualifier();
if(q != null) {
+ SeamFieldValueDefinition vdef = new SeamFieldValueDefinition();
+ vdef.setResource(resource);
+ vdef.setNode(element);
inline.addAnnotation(q);
- def.addAnnotation(q);
+ vdef.addAnnotation(q);
+ vdef.setInlineBean(inline);
IJavaAnnotation inject = createInject(element);
- if(inject != null) def.addAnnotation(inject);
+ if(inject != null) {
+ vdef.addAnnotation(inject);
+ }
+ def.addValueDefinition(vdef);
}
}
}
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-09-20
23:47:26 UTC (rev 34907)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/util/Util.java 2011-09-20
23:53:59 UTC (rev 34908)
@@ -243,7 +243,7 @@
public static IMethod findMethod(SeamMethodDefinition def, IType type, String name,
IRootDefinitionContext context) throws JavaModelException {
IMethod[] ms = type.getMethods();
for (IMethod m: ms) {
- if((name == null && m.isConstructor()) || name.equals(m.getElementName())) {
+ if((name == null && m.isConstructor()) || (name != null &&
name.equals(m.getElementName()))) {
if(sameParameterTypes(def, m, context)) return m;
}
}
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/validation/SeamConfigValidationMessages.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/validation/SeamConfigValidationMessages.java 2011-09-20
23:47:26 UTC (rev 34907)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/validation/SeamConfigValidationMessages.java 2011-09-20
23:53:59 UTC (rev 34908)
@@ -11,6 +11,7 @@
public static String UNRESOLVED_METHOD;
public static String UNRESOLVED_CONSTRUCTOR;
public static String ANNOTATION_EXPECTED;
+ public static String INLINE_BEAN_TYPE_MISMATCH;
static {
NLS.initializeMessages(BUNDLE_NAME, SeamConfigValidationMessages.class);
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/validation/messages.properties
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/validation/messages.properties 2011-09-20
23:47:26 UTC (rev 34907)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/validation/messages.properties 2011-09-20
23:53:59 UTC (rev 34908)
@@ -2,4 +2,5 @@
UNRESOLVED_MEMBER=Cannot resolve member in node {0}.
UNRESOLVED_METHOD=Cannot resolve method in node {0}.
UNRESOLVED_CONSTRUCTOR=Cannot resolve constructor in type node {0}.
-ANNOTATION_EXPECTED=Annotation types are only allowed here.
\ No newline at end of file
+ANNOTATION_EXPECTED=Annotation types are only allowed here.
+INLINE_BEAN_TYPE_MISMATCH=Type mismatch: cannot convert from {0} to {1}
\ No newline at end of file