Author: scabanovich
Date: 2011-06-07 20:49:28 -0400 (Tue, 07 Jun 2011)
New Revision: 31899
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/CDISeamSolderPreferences.java
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/generic/CDISeamSolderGenericBeanExtension.java
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/generic/GenericBeanDefinitionContext.java
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/generic/GenericBeanValidator.java
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/generic/GenericConfiguration.java
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/validation/SeamSolderValidationMessages.java
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/validation/messages.properties
Log:
JBIDE-8695
https://issues.jboss.org/browse/JBIDE-8695
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/CDISeamSolderPreferences.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/CDISeamSolderPreferences.java 2011-06-08
00:04:35 UTC (rev 31898)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/CDISeamSolderPreferences.java 2011-06-08
00:49:28 UTC (rev 31899)
@@ -25,7 +25,8 @@
private static CDISeamSolderPreferences INSTANCE = new CDISeamSolderPreferences();
- public static final String AMBIGUOUS_GENERIC_BEAN =
INSTANCE.createSeverityOption("ambiguousGenericBean");
+ public static final String AMBIGUOUS_GENERIC_CONFIGURATION_POINT =
INSTANCE.createSeverityOption("ambiguousGenericConfigurationPoint");
+ public static final String WRONG_TYPE_OF_GENERIC_CONFIGURATION_POINT =
INSTANCE.createSeverityOption("wrongTypeOfGenericConfigurationPoint");
public static CDISeamSolderPreferences getInstance() {
return INSTANCE;
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/generic/CDISeamSolderGenericBeanExtension.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/generic/CDISeamSolderGenericBeanExtension.java 2011-06-08
00:04:35 UTC (rev 31898)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/generic/CDISeamSolderGenericBeanExtension.java 2011-06-08
00:49:28 UTC (rev 31899)
@@ -96,9 +96,9 @@
p.addBean(b);
}
- Map<AbstractMemberDefinition, List<IQualifierDeclaration>> ms =
c.getGenericProducerBeans();
+ Map<AbstractMemberDefinition, List<IQualifierDeclaration>> ms =
c.getGenericConfigurationPoints();
- Set<TypeDefinition> ts = c.getGenericConfigurationBeans();
+ Set<TypeDefinition> ts = c.getGenericBeans();
for (AbstractMemberDefinition gp: ms.keySet()) {
//check veto
if(gp.getTypeDefinition().isVetoed()) {
@@ -198,7 +198,7 @@
ParametedType p =
context.getProject().getTypeFactory().getParametedType(typeDefinition.getType(),
"Q" + s + ";");
if(p != null && p.getType() != null) {
GenericConfiguration c =
((GenericBeanDefinitionContext)this.context.getWorkingCopy()).getGenericConfiguration(p.getType().getFullyQualifiedName());
- c.getGenericConfigurationBeans().add(typeDefinition);
+ c.getGenericBeans().add(typeDefinition);
addToDependencies(c, typeDefinition, context);
}
} catch (JavaModelException e) {
@@ -238,7 +238,7 @@
list.add((IQualifierDeclaration)d);
}
}
- c.getGenericProducerBeans().put(def, list);
+ c.getGenericConfigurationPoints().put(def, list);
addToDependencies(c, def, context);
}
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/generic/GenericBeanDefinitionContext.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/generic/GenericBeanDefinitionContext.java 2011-06-08
00:04:35 UTC (rev 31898)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/generic/GenericBeanDefinitionContext.java 2011-06-08
00:49:28 UTC (rev 31899)
@@ -70,7 +70,7 @@
if(annotation.isAnnotationPresent(CDISeamSolderConstants.GENERIC_TYPE_ANNOTATION_TYPE_NAME))
{
annotation.setExtendedKind(CDISeamSolderConstants.GENERIC_ANNOTATION_KIND);
String qn = annotation.getType().getFullyQualifiedName();
- getGenericConfiguration(qn).setGenericTypeDefinition(annotation);
+ getGenericConfiguration(qn).setGenericTypeDefinition(annotation, this);
}
}
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/generic/GenericBeanValidator.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/generic/GenericBeanValidator.java 2011-06-08
00:04:35 UTC (rev 31898)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/generic/GenericBeanValidator.java 2011-06-08
00:49:28 UTC (rev 31899)
@@ -12,20 +12,29 @@
import java.util.List;
import java.util.Map;
+import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IMember;
import org.jboss.tools.cdi.core.CDICoreNature;
import org.jboss.tools.cdi.core.CDIUtil;
+import org.jboss.tools.cdi.core.IAnnotationDeclaration;
+import org.jboss.tools.cdi.core.IBean;
+import org.jboss.tools.cdi.core.IClassBean;
+import org.jboss.tools.cdi.core.IParametedType;
+import org.jboss.tools.cdi.core.IProducer;
import org.jboss.tools.cdi.core.IQualifierDeclaration;
import org.jboss.tools.cdi.internal.core.impl.CDIProject;
import org.jboss.tools.cdi.internal.core.impl.definition.AbstractMemberDefinition;
+import org.jboss.tools.cdi.internal.core.impl.definition.AnnotationDefinition;
import org.jboss.tools.cdi.internal.core.validation.CDICoreValidator;
+import org.jboss.tools.cdi.seam.solder.core.CDISeamSolderConstants;
import org.jboss.tools.cdi.seam.solder.core.CDISeamSolderCorePlugin;
import org.jboss.tools.cdi.seam.solder.core.CDISeamSolderPreferences;
import org.jboss.tools.cdi.seam.solder.core.validation.SeamSolderValidationMessages;
import org.jboss.tools.common.text.ITextSourceReference;
+import org.jboss.tools.common.util.EclipseJavaUtil;
/**
*
@@ -48,22 +57,52 @@
}
public void validateConfiguration(IFile file, GenericConfiguration c, CDICoreValidator
validator, CDICoreNature project, GenericBeanDefinitionContext context) throws
CoreException {
- Map<AbstractMemberDefinition, List<IQualifierDeclaration>> bs =
c.getGenericProducerBeans();
+ Map<AbstractMemberDefinition, List<IQualifierDeclaration>> bs =
c.getGenericConfigurationPoints();
for (AbstractMemberDefinition d: bs.keySet()) {
if(d.getResource() != null && d.getResource().equals(file) &&
!d.getTypeDefinition().isVetoed()) {
+ ITextSourceReference reference =
CDIUtil.convertToSourceReference(((IMember)d.getMember()).getNameRange(), file);
+
+ /*
+ * If several generic configuration points have the same set of qualifiers,
+ * than respective generic beans will result in ambiguous beans for injections
+ * with that set of qualifiers.
+ */
List<IQualifierDeclaration> ds = bs.get(d);
for (AbstractMemberDefinition d1: bs.keySet()) {
List<IQualifierDeclaration> ds2 = bs.get(d1);
if(ds2 != ds && !d1.getTypeDefinition().isVetoed() &&
CDIProject.areMatchingQualifiers(ds, ds2)) {
- ITextSourceReference reference =
CDIUtil.convertToSourceReference(((IMember)d.getMember()).getNameRange(), file);
- validator.addError(SeamSolderValidationMessages.AMBIGUOUS_GENERIC_BEAN,
CDISeamSolderPreferences.AMBIGUOUS_GENERIC_BEAN, new String[0], reference, file);
+ validator.addError(SeamSolderValidationMessages.AMBIGUOUS_GENERIC_CONFIGURATION_POINT,
+ CDISeamSolderPreferences.AMBIGUOUS_GENERIC_CONFIGURATION_POINT, new String[0],
reference, file);
}
}
+
+ /*
+ * Type of generic configuration point must be assignable to the configuration type.
+ */
+ IParametedType t = c.getConfigType();
+ IBean b = findGenericBean(file, (IMember)d.getMember(), project);
+ if(t == null || b == null || !CDIProject.containsType(b.getAllTypes(), t)) {
+ validator.addError(SeamSolderValidationMessages.WRONG_TYPE_OF_GENERIC_CONFIGURATION_POINT,
+ CDISeamSolderPreferences.WRONG_TYPE_OF_GENERIC_CONFIGURATION_POINT, new String[0],
reference, file);
+ }
+
}
}
//TODO check`
}
+
+ private IBean findGenericBean(IFile file, IMember member, CDICoreNature project) {
+ Set<IBean> bs = project.getDelegate().getBeans(file.getFullPath());
+ for (IBean b: bs) {
+ if(b instanceof IClassBean) {
+ if(member.equals(((IClassBean)b).getBeanClass())) return b;
+ } else if(b instanceof IProducer) {
+ if(member.equals(((IProducer)b).getSourceMember())) return b;
+ }
+ }
+ return null;
+ }
}
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/generic/GenericConfiguration.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/generic/GenericConfiguration.java 2011-06-08
00:04:35 UTC (rev 31898)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/generic/GenericConfiguration.java 2011-06-08
00:49:28 UTC (rev 31899)
@@ -18,32 +18,72 @@
import java.util.Set;
import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.JavaModelException;
import org.jboss.tools.cdi.core.IAnnotationDeclaration;
+import org.jboss.tools.cdi.core.IParametedType;
import org.jboss.tools.cdi.core.IQualifierDeclaration;
import org.jboss.tools.cdi.internal.core.impl.definition.AbstractMemberDefinition;
import org.jboss.tools.cdi.internal.core.impl.definition.AnnotationDefinition;
import org.jboss.tools.cdi.internal.core.impl.definition.TypeDefinition;
+import org.jboss.tools.cdi.seam.solder.core.CDISeamSolderConstants;
+import org.jboss.tools.cdi.seam.solder.core.CDISeamSolderCorePlugin;
+import org.jboss.tools.common.util.EclipseJavaUtil;
/**
+ * This class collects objects bound by one generic configuration:
+ * 1) Generic configuration annotation - annotation type annotatid with GenericType
annotation;
+ * 2) Generic configuration type - type as declared by value of GenericType annotation;
+ * 3) Generic configuration points - beans annotated with generic configuration
annotation;
+ * 4) Generic beans - beans annotated with GenericConfiguration annotation;
*
* @author Viacheslav Kabanovich
*
*/
public class GenericConfiguration {
+ /**
+ * Generic configuration annotation type name.
+ */
String genericTypeName;
+
+ /**
+ * Generic configuration annotation type definition.
+ */
AnnotationDefinition genericType;
- Map<AbstractMemberDefinition, List<IQualifierDeclaration>>
genericProducerBeans = new HashMap<AbstractMemberDefinition,
List<IQualifierDeclaration>>();
- Set<TypeDefinition> genericConfigurationBeans = new
HashSet<TypeDefinition>();
+ /**
+ * Generic configuration type declared by generic configuration annotation.
+ */
+ IParametedType configType;
+ /**
+ * Generic Configuration point is a bean annotated with 'generic configuration
annotation'.
+ * This field maps definitions of such beans to their qualifiers for quick reference.
+ */
+ Map<AbstractMemberDefinition, List<IQualifierDeclaration>>
genericConfigurationPoints = new HashMap<AbstractMemberDefinition,
List<IQualifierDeclaration>>();
+
+ /**
+ * Generic Bean is bean class annotated with GenericConfiguration annotation.
+ */
+ Set<TypeDefinition> genericBeans = new HashSet<TypeDefinition>();
+
Set<IPath> involvedResources = new HashSet<IPath>();
public GenericConfiguration(String genericTypeName) {
this.genericTypeName = genericTypeName;
}
- public void setGenericTypeDefinition(AnnotationDefinition genericType) {
+ public void setGenericTypeDefinition(AnnotationDefinition genericType,
GenericBeanDefinitionContext context) {
this.genericType = genericType;
+ IAnnotationDeclaration g =
genericType.getAnnotation(CDISeamSolderConstants.GENERIC_TYPE_ANNOTATION_TYPE_NAME);
+ Object o = g.getMemberValue(null);
+ if(o != null) {
+ String configTypeName = EclipseJavaUtil.resolveType(genericType.getType(),
o.toString());
+ try {
+ configType =
context.getRootContext().getProject().getTypeFactory().getParametedType(genericType.getType(),
"Q" + o.toString() + ";");
+ } catch (JavaModelException e) {
+ CDISeamSolderCorePlugin.getDefault().logError(e);
+ }
+ }
}
public void clear(IPath path) {
@@ -51,13 +91,13 @@
}
public void clear(String typeName) {
- Iterator<AbstractMemberDefinition> it =
genericProducerBeans.keySet().iterator();
+ Iterator<AbstractMemberDefinition> it =
genericConfigurationPoints.keySet().iterator();
while(it.hasNext()) {
if(typeName.equals(it.next().getTypeDefinition().getQualifiedName())) {
it.remove();
}
}
- Iterator<TypeDefinition> it2 = genericConfigurationBeans.iterator();
+ Iterator<TypeDefinition> it2 = genericBeans.iterator();
while(it2.hasNext()) {
if(typeName.equals(it2.next().getTypeDefinition().getQualifiedName())) {
it2.remove();
@@ -65,8 +105,13 @@
}
}
- public Map<AbstractMemberDefinition, List<IQualifierDeclaration>>
getGenericProducerBeans() {
- return genericProducerBeans;
+ /**
+ * Returns map of definition to qualifiers for generic configuration points.
+ *
+ * @return map of definition to qualifiers for generic configuration points
+ */
+ public Map<AbstractMemberDefinition, List<IQualifierDeclaration>>
getGenericConfigurationPoints() {
+ return genericConfigurationPoints;
}
public String getGenericTypeName() {
@@ -77,10 +122,19 @@
return genericType;
}
- public Set<TypeDefinition> getGenericConfigurationBeans() {
- return genericConfigurationBeans;
+ public IParametedType getConfigType() {
+ return configType;
}
+ /**
+ * Returns set of generic beans.
+ *
+ * @return set of generic beans
+ */
+ public Set<TypeDefinition> getGenericBeans() {
+ return genericBeans;
+ }
+
public Set<IPath> getInvolvedTypes() {
return involvedResources;
}
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/validation/SeamSolderValidationMessages.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/validation/SeamSolderValidationMessages.java 2011-06-08
00:04:35 UTC (rev 31898)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/validation/SeamSolderValidationMessages.java 2011-06-08
00:49:28 UTC (rev 31899)
@@ -21,7 +21,8 @@
private static final String BUNDLE_NAME =
SeamSolderValidationMessages.class.getPackage().getName() + ".messages";
//$NON-NLS-1$
- public static String AMBIGUOUS_GENERIC_BEAN;
+ public static String AMBIGUOUS_GENERIC_CONFIGURATION_POINT;
+ public static String WRONG_TYPE_OF_GENERIC_CONFIGURATION_POINT;
static {
NLS.initializeMessages(BUNDLE_NAME, SeamSolderValidationMessages.class);
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/validation/messages.properties
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/validation/messages.properties 2011-06-08
00:04:35 UTC (rev 31898)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.solder.core/src/org/jboss/tools/cdi/seam/solder/core/validation/messages.properties 2011-06-08
00:49:28 UTC (rev 31899)
@@ -1 +1,2 @@
-AMBIGUOUS_GENERIC_BEAN=Several generic beans for the same generic type have the same set
of qualifiers.
+AMBIGUOUS_GENERIC_CONFIGURATION_POINT=Several generic configuration points for the same
generic configuration have the same set of qualifiers.
+WRONG_TYPE_OF_GENERIC_CONFIGURATION_POINT=Type of generic configuration point must be
assignable to the generic configuration type.