Author: scabanovich
Date: 2011-04-27 18:16:57 -0400 (Wed, 27 Apr 2011)
New Revision: 30885
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/definition/SeamBeanDefinition.java
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamFieldDefinition.java
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamMemberDefinition.java
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/SAXAttribute.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-27
19:51:37 UTC (rev 30884)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/CDISeamConfigConstants.java 2011-04-27
22:16:57 UTC (rev 30885)
@@ -21,6 +21,8 @@
//Problem id: node name was not resolved to Java type
public String ERROR_UNRESOLVED_TYPE = "Unresolved type";
+ public String ERROR_UNRESOLVED_MEMBER = "Unresolved member";
+
//Problem id: node was expected to be resolved to annotation type
public String ERROR_ANNOTATION_EXPECTED = "Annotation expected";
@@ -44,4 +46,6 @@
public String KEYWORD_PARAMETERS = "parameters";
public String ATTR_DIMENSIONS = "dimensions";
+
+ public String INLINE_BEAN_QUALIFIER =
"org.jboss.seam.config.xml.fieldset.InlineBeanQualifier";
}
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-04-27
19:51:37 UTC (rev 30884)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamBeanDefinition.java 2011-04-27
22:16:57 UTC (rev 30885)
@@ -15,6 +15,7 @@
import org.eclipse.jdt.core.IType;
import org.jboss.tools.cdi.seam.config.core.scanner.SAXElement;
+import org.jboss.tools.cdi.seam.config.core.scanner.SAXNode;
/**
*
@@ -22,16 +23,33 @@
*
*/
public class SeamBeanDefinition extends SeamMemberDefinition {
+ boolean inline = false;
IType type = null;
List<SeamFieldDefinition> fields = new ArrayList<SeamFieldDefinition>();
List<SeamMethodDefinition> methods = new ArrayList<SeamMethodDefinition>();
public SeamBeanDefinition() {}
+ public SAXElement getElement() {
+ return (SAXElement)getNode();
+ }
+
+ public void setInline(boolean b) {
+ inline = b;
+ }
+
+ public boolean isInline() {
+ return inline;
+ }
+
public void setType(IType type) {
this.type = type;
}
+ public IType getType() {
+ return type;
+ }
+
public void addField(SeamFieldDefinition field) {
fields.add(field);
}
@@ -42,8 +60,7 @@
public SeamFieldDefinition getField(String name) {
for (SeamFieldDefinition d: fields) {
- SAXElement e = d.getElement();
- if(name.equals(e.getLocalName())) return d;
+ if(name.equals(d.getName())) return d;
}
return null;
}
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamFieldDefinition.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamFieldDefinition.java 2011-04-27
19:51:37 UTC (rev 30884)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamFieldDefinition.java 2011-04-27
22:16:57 UTC (rev 30885)
@@ -16,6 +16,8 @@
import java.util.Map;
import org.eclipse.jdt.core.IField;
+import org.jboss.tools.cdi.seam.config.core.scanner.SAXAttribute;
+import org.jboss.tools.cdi.seam.config.core.scanner.SAXElement;
import org.jboss.tools.cdi.seam.config.core.scanner.SAXText;
/**
@@ -35,6 +37,13 @@
this.field = field;
}
+ public String getName() {
+ if(field != null) return field.getElementName();
+ if(getNode() instanceof SAXElement) return ((SAXElement)getNode()).getLocalName();
+ if(getNode() instanceof SAXAttribute) return ((SAXAttribute)getNode()).getName();
+ return null;
+ }
+
public String getValue() {
return listValue == null || listValue.size() == 0 ? null :
listValue.get(0).getValue();
}
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamMemberDefinition.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamMemberDefinition.java 2011-04-27
19:51:37 UTC (rev 30884)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamMemberDefinition.java 2011-04-27
22:16:57 UTC (rev 30885)
@@ -15,6 +15,7 @@
import org.jboss.tools.cdi.core.IJavaAnnotation;
import org.jboss.tools.cdi.seam.config.core.scanner.SAXElement;
+import org.jboss.tools.cdi.seam.config.core.scanner.SAXNode;
import org.jboss.tools.common.text.ITextSourceReference;
/**
@@ -23,19 +24,19 @@
*
*/
public abstract class SeamMemberDefinition {
- protected SAXElement element;
+ protected SAXNode node;
protected SAXElement replaces = null;
protected SAXElement modifies = null;
protected Map<String, IJavaAnnotation> annotations = new HashMap<String,
IJavaAnnotation>();
public SeamMemberDefinition() {}
- public void setElement(SAXElement element) {
- this.element = element;
+ public void setNode(SAXNode node) {
+ this.node = node;
}
- public SAXElement getElement() {
- return element;
+ public SAXNode getNode() {
+ return node;
}
public void setReplaces(SAXElement replaces) {
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/SAXAttribute.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/SAXAttribute.java 2011-04-27
19:51:37 UTC (rev 30884)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/SAXAttribute.java 2011-04-27
22:16:57 UTC (rev 30885)
@@ -12,11 +12,9 @@
import org.jboss.tools.common.text.ITextSourceReference;
-public class SAXAttribute extends SAXNode {
+public class SAXAttribute extends SAXText {
private String name;
private ITextSourceReference nameLocation;
- private String value;
- private ITextSourceReference valueLocation;
private SAXElement parent;
@@ -28,28 +26,20 @@
return name;
}
- public void setValue(String value) {
- this.value = value;
- }
-
- public String getValue() {
- return value;
- }
-
public void setNameLocation(ITextSourceReference location) {
nameLocation = location;
}
- public void setValueLocation(ITextSourceReference location) {
- valueLocation = location;
- }
-
public ITextSourceReference getNameLocation() {
return nameLocation;
}
+ public void setValueLocation(ITextSourceReference location) {
+ setLocation(location);
+ }
+
public ITextSourceReference getValueLocation() {
- return valueLocation;
+ return getLocation();
}
public void setParent(SAXElement parent) {
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-27
19:51:37 UTC (rev 30884)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/SAXParser.java 2011-04-27
22:16:57 UTC (rev 30885)
@@ -127,6 +127,14 @@
SAXAttribute a = new SAXAttribute();
a.setName(n);
a.setValue(v);
+ int n_start = document.get().indexOf(n, start);
+ if(n_start >= 0) {
+ a.setNameLocation(new Location(n_start, n.length()));
+ int v_start = document.get().indexOf('"', n_start);
+ if(v_start >= 0) {
+ a.setValueLocation(new Location(v_start + 1, v.length()));
+ }
+ }
//TODO
element.addAttribute(a);
}
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-27
19:51:37 UTC (rev 30884)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/SeamDefinitionBuilder.java 2011-04-27
22:16:57 UTC (rev 30885)
@@ -12,8 +12,10 @@
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.text.IDocument;
+import org.jboss.tools.cdi.core.CDIConstants;
import org.jboss.tools.cdi.core.CDICoreNature;
import org.jboss.tools.cdi.core.IJavaAnnotation;
+import org.jboss.tools.cdi.internal.core.impl.AnnotationDeclaration;
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;
@@ -73,7 +75,7 @@
if(typeCheck.isAnnotation) {
scanAnnotation(element, type);
} else {
- scanBean(element, type);
+ scanBean(element, type, false);
}
}
@@ -95,9 +97,10 @@
}
- private void scanBean(SAXElement element, IType type) {
+ private SeamBeanDefinition scanBean(SAXElement element, IType type, boolean inline) {
SeamBeanDefinition def = new SeamBeanDefinition();
- def.setElement(element);
+ def.setInline(inline);
+ def.setNode(element);
def.setType(type);
result.addBeanDefinition(def);
List<SAXElement> es = element.getChildElements();
@@ -130,14 +133,25 @@
} else if(m instanceof IMethod) {
def.addMethod(scanMethod(element, (IMethod)m));
} else {
- result.addUnresolvedNode(c, "Cannot resolve member.");
+ result.addUnresolvedNode(c, CDISeamConfigConstants.ERROR_UNRESOLVED_MEMBER);
}
}
+ Set<String> as = element.getAttributeNames();
+ for (String name: as) {
+ SAXAttribute a = element.getAttribute(name);
+ IField f = type.getField(name);
+ if(f == null || !f.exists()) {
+ result.addUnresolvedNode(a, CDISeamConfigConstants.ERROR_UNRESOLVED_MEMBER);
+ } else {
+ def.addField(scanField(a, f));
+ }
+ }
+ return def;
}
private SeamFieldDefinition scanField(SAXElement element, IField field) {
SeamFieldDefinition def = new SeamFieldDefinition();
- def.setElement(element);
+ def.setNode(element);
def.setField(field);
if(Util.hasText(element)) {
def.addValue(element.getTextNode());
@@ -149,7 +163,7 @@
if(Util.hasText(c)) {
def.addValue(c.getTextNode());
} else {
- scanFieldValue(c);
+ scanFieldValue(def, c);
}
continue;
} else if(Util.isEntry(c)) {
@@ -167,21 +181,36 @@
return def;
}
+ private SeamFieldDefinition scanField(SAXAttribute a, IField field) {
+ SeamFieldDefinition def = new SeamFieldDefinition();
+ def.setNode(a);
+ def.setField(field);
+ def.addValue(a);
+ return def;
+ }
+
/**
* Scan field value for inline bean declarations.
* @param element
*/
- private void scanFieldValue(SAXElement element) {
+ private void scanFieldValue(SeamFieldDefinition def, SAXElement element) {
if(!Util.isConfigRelevant(element)) return;
List<SAXElement> es = element.getChildElements();
for (SAXElement c: es) {
if(!Util.isConfigRelevant(c)) continue;
- IType type = Util.resolveType(element, project);
+ IType type = Util.resolveType(c, project);
if(type == null) continue;
- TypeCheck typeCheck = new TypeCheck(type, element);
+ TypeCheck typeCheck = new TypeCheck(type, c);
if(typeCheck.isCorrupted) return;
if(!typeCheck.isAnnotation) {
- scanBean(element, type);
+ SeamBeanDefinition inline = scanBean(c, type, true);
+ IJavaAnnotation q = createInlineBeanQualifier();
+ if(q != null) {
+ inline.addAnnotation(q);
+ def.addAnnotation(q);
+ IJavaAnnotation inject = createInject();
+ if(inject != null) def.addAnnotation(inject);
+ }
}
}
}
@@ -196,14 +225,14 @@
if(Util.hasText(c)) {
key = c.getTextNode();
} else {
- scanFieldValue(c);
+ scanFieldValue(def, c);
}
}
if(Util.isValue(c)) {
if(Util.hasText(c)) {
value = c.getTextNode();
} else {
- scanFieldValue(c);
+ scanFieldValue(def, c);
}
}
}
@@ -214,7 +243,7 @@
private SeamMethodDefinition scanMethod(SAXElement element, IMethod method) {
SeamMethodDefinition def = new SeamMethodDefinition();
- def.setElement(element);
+ def.setNode(element);
def.setMethod(method);
List<SAXElement> es = element.getChildElements();
for (SAXElement c: es) {
@@ -245,7 +274,7 @@
private SeamParameterDefinition scanParameter(SAXElement element) {
if(!Util.isConfigRelevant(element)) return null;
SeamParameterDefinition def = new SeamParameterDefinition();
- def.setElement(element);
+ def.setNode(element);
if(Util.isArray(element)) {
if(element.hasAttribute(CDISeamConfigConstants.ATTR_DIMENSIONS)) {
def.setDimensions(element.getAttribute(CDISeamConfigConstants.ATTR_DIMENSIONS).getValue());
@@ -340,4 +369,23 @@
}
}
+ static long inlineBeanCount = 0;
+
+ IJavaAnnotation createInlineBeanQualifier() {
+ IType type = project.getType(CDISeamConfigConstants.INLINE_BEAN_QUALIFIER);
+ if(type == null) {
+ return null;
+ }
+ long id = inlineBeanCount++;
+ return new AnnotationLiteral(resource, 0, 0, "" + id,
IMemberValuePair.K_STRING, type);
+ }
+
+ IJavaAnnotation createInject() {
+ IType type = project.getType(CDIConstants.INJECT_ANNOTATION_TYPE_NAME);
+ if(type == null) {
+ return null;
+ }
+ return new AnnotationLiteral(resource, 0, 0, null, 0, type);
+ }
+
}