Author: scabanovich
Date: 2011-04-27 21:11:23 -0400 (Wed, 27 Apr 2011)
New Revision: 30891
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/SeamMethodDefinition.java
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamParameterDefinition.java
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/Location.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
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/util/Util.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
23:43:35 UTC (rev 30890)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/CDISeamConfigConstants.java 2011-04-28
01:11:23 UTC (rev 30891)
@@ -12,6 +12,11 @@
import org.jboss.tools.cdi.core.CDIConstants;
+/**
+ *
+ * @author Viacheslav Kabanovich
+ *
+ */
public interface CDISeamConfigConstants extends CDIConstants {
public String SEAM_BEANS_XML = "seam-beans.xml";
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
23:43:35 UTC (rev 30890)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamBeanDefinition.java 2011-04-28
01:11:23 UTC (rev 30891)
@@ -65,4 +65,8 @@
return null;
}
+ public List<SeamMethodDefinition> getMethods() {
+ return methods;
+ }
+
}
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamMethodDefinition.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamMethodDefinition.java 2011-04-27
23:43:35 UTC (rev 30890)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamMethodDefinition.java 2011-04-28
01:11:23 UTC (rev 30891)
@@ -28,10 +28,19 @@
public void setMethod(IMethod method) {
this.method = method;
+ //TODO set parameter objects to parameters
}
+ public IMethod getMethod() {
+ return method;
+ }
+
public void addParameter(SeamParameterDefinition p) {
parameters.add(p);
}
+ public List<SeamParameterDefinition> getParameters() {
+ return parameters;
+ }
+
}
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamParameterDefinition.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamParameterDefinition.java 2011-04-27
23:43:35 UTC (rev 30890)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/definition/SeamParameterDefinition.java 2011-04-28
01:11:23 UTC (rev 30891)
@@ -31,11 +31,27 @@
}
public void setDimensions(String value) {
- dimentions = value;
+ dimentions = value == null ? null : value.trim();
}
public void setParameter(ILocalVariable parameter) {
this.parameter = parameter;
}
+ public int getDimensions() {
+ if(dimentions == null || dimentions.length() == 0) {
+ return 0;
+ }
+ try {
+ return Integer.parseInt(dimentions);
+ } catch (NumberFormatException e) {
+ //reporting is done by loader; do not report here.
+ return 0;
+ }
+ }
+
+ public IType getType() {
+ return type;
+ }
+
}
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/Location.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/Location.java 2011-04-27
23:43:35 UTC (rev 30890)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/Location.java 2011-04-28
01:11:23 UTC (rev 30891)
@@ -12,6 +12,11 @@
import org.jboss.tools.common.text.ITextSourceReference;
+/**
+ *
+ * @author Viacheslav Kabanovich
+ *
+ */
public class Location implements ITextSourceReference {
int start;
int length;
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
23:43:35 UTC (rev 30890)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/SAXAttribute.java 2011-04-28
01:11:23 UTC (rev 30891)
@@ -12,6 +12,11 @@
import org.jboss.tools.common.text.ITextSourceReference;
+/**
+ *
+ * @author Viacheslav Kabanovich
+ *
+ */
public class SAXAttribute extends SAXText {
private String name;
private ITextSourceReference nameLocation;
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
23:43:35 UTC (rev 30890)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/SAXParser.java 2011-04-28
01:11:23 UTC (rev 30891)
@@ -22,6 +22,11 @@
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
+/**
+ *
+ * @author Viacheslav Kabanovich
+ *
+ */
public class SAXParser extends SAXValidator {
XMLReader createParser1(DefaultHandler handler) {
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
23:43:35 UTC (rev 30890)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/scanner/SeamDefinitionBuilder.java 2011-04-28
01:11:23 UTC (rev 30891)
@@ -115,6 +115,11 @@
def.setModifies(c);
continue;
}
+ if(Util.isParameters(c)) {
+ SeamMethodDefinition md = scanConstructor(c, type);
+ if(md != null) def.addMethod(md);
+ continue;
+ }
}
IType t = Util.resolveType(c, project);
if(t != null) {
@@ -131,7 +136,8 @@
if(m instanceof IField) {
def.addField(scanField(c, (IField)m));
} else if(m instanceof IMethod) {
- def.addMethod(scanMethod(element, (IMethod)m));
+ SeamMethodDefinition md = scanMethod(c, type);
+ if(md != null) def.addMethod(md);
} else {
result.addUnresolvedNode(c, CDISeamConfigConstants.ERROR_UNRESOLVED_MEMBER);
}
@@ -241,15 +247,14 @@
}
}
- private SeamMethodDefinition scanMethod(SAXElement element, IMethod method) {
+ private SeamMethodDefinition scanMethod(SAXElement element, IType type) {
SeamMethodDefinition def = new SeamMethodDefinition();
def.setNode(element);
- def.setMethod(method);
List<SAXElement> es = element.getChildElements();
for (SAXElement c: es) {
if(!Util.isConfigRelevant(c)) continue;
if(Util.isParameters(c)) {
- List<SAXElement> ps = element.getChildElements();
+ List<SAXElement> ps = c.getChildElements();
for (SAXElement p: ps) {
SeamParameterDefinition pd = scanParameter(p);
if(pd != null) def.addParameter(pd);
@@ -268,9 +273,46 @@
}
}
+ IMethod method = null;
+ try {
+ method = Util.findMethod(def, type, element.getLocalName(),
context.getRootContext());
+ } catch (JavaModelException e) {
+ CDISeamConfigCorePlugin.getDefault().logError(e);
+ }
+ if(method != null) {
+ def.setMethod(method);
+ }
return def;
}
+ private SeamMethodDefinition scanConstructor(SAXElement element, IType type) {
+ SeamMethodDefinition def = new SeamMethodDefinition();
+ def.setNode(element);
+ if(Util.isParameters(element)) {
+ List<SAXElement> ps = element.getChildElements();
+ for (SAXElement p: ps) {
+ SeamParameterDefinition pd = scanParameter(p);
+ if(pd != null) def.addParameter(pd);
+ }
+ } else if(Util.isArray(element)) {
+ SeamParameterDefinition pd = scanParameter(element);
+ if(pd != null) def.addParameter(pd);
+ }
+ IJavaAnnotation inject = createInject();
+ def.addAnnotation(inject);
+ IMethod method = null;
+ try {
+ method = Util.findMethod(def, type, null, context.getRootContext());
+ } catch (JavaModelException e) {
+ CDISeamConfigCorePlugin.getDefault().logError(e);
+ }
+ if(method != null) {
+ def.setMethod(method);
+ }
+
+ return def;
+ }
+
private SeamParameterDefinition scanParameter(SAXElement element) {
if(!Util.isConfigRelevant(element)) return null;
SeamParameterDefinition def = new SeamParameterDefinition();
@@ -278,13 +320,15 @@
if(Util.isArray(element)) {
if(element.hasAttribute(CDISeamConfigConstants.ATTR_DIMENSIONS)) {
def.setDimensions(element.getAttribute(CDISeamConfigConstants.ATTR_DIMENSIONS).getValue());
+ } else {
+ def.setDimensions("1");
}
List<SAXElement> es = element.getChildElements();
for (SAXElement c: es) {
if(!Util.isConfigRelevant(c)) continue;
IType type = Util.resolveType(c, project);
if(type == null) {
- result.addUnresolvedNode(element, CDISeamConfigConstants.ERROR_UNRESOLVED_TYPE);
+ result.addUnresolvedNode(c, CDISeamConfigConstants.ERROR_UNRESOLVED_TYPE);
continue;
}
TypeCheck typeCheck = new TypeCheck(type, c);
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-04-27
23:43:35 UTC (rev 30890)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.seam.config.core/src/org/jboss/tools/cdi/seam/config/core/util/Util.java 2011-04-28
01:11:23 UTC (rev 30891)
@@ -1,3 +1,13 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Red Hat, Inc.
+ * Distributed under license by Red Hat, Inc. All rights reserved.
+ * This program is made available under the terms of the
+ * Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at
http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ ******************************************************************************/
package org.jboss.tools.cdi.seam.config.core.util;
import java.util.HashMap;
@@ -8,11 +18,22 @@
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.Signature;
import org.jboss.tools.cdi.core.CDICoreNature;
+import org.jboss.tools.cdi.core.IParametedType;
+import org.jboss.tools.cdi.core.IRootDefinitionContext;
import org.jboss.tools.cdi.seam.config.core.CDISeamConfigConstants;
+import org.jboss.tools.cdi.seam.config.core.definition.SeamBeanDefinition;
+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.scanner.SAXElement;
import org.jboss.tools.cdi.seam.config.core.scanner.SAXText;
+/**
+ *
+ * @author Viacheslav Kabanovich
+ *
+ */
public class Util implements CDISeamConfigConstants {
public static Map<String, String> EE_TYPES = new HashMap<String, String>();
@@ -49,6 +70,12 @@
String[] JAVAX_INTERCEPTOR = {"AroundInvoke", "AroundTimeout",
"ExcludeClassInterceptors", "ExcludeDefaultInterceptors",
"Interceptor", "InterceptorBinding", "Interceptors",
"InvocationContext"};
for (String s: JAVAX_INTERCEPTOR) EE_TYPES.put(s, "javax.interceptor." + s);
+
+ //It is not clear.
+ // In Seam3 doc, item 6.7. Overriding the type of an injection point is devoted to
@Exact,
+ // but item 6.1 does not mentions its package in namespace urn:java:ee.
+ String[] SEAM_SOLDER = {"Exact"};
+ for (String s: SEAM_SOLDER) EE_TYPES.put(s, "org.jboss.seam.solder.core." +
s);
}
@@ -151,4 +178,38 @@
return t != null && t.getValue() != null &&
t.getValue().trim().length() > 0;
}
+ /**
+ *
+ * @param def
+ * @param type
+ * @param name method name or null for constructor
+ * @return
+ */
+ 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(sameParameterTypes(def, m, context)) return m;
+ }
+ }
+ return null;
+ }
+
+ static boolean sameParameterTypes(SeamMethodDefinition def, IMethod m,
IRootDefinitionContext context) throws JavaModelException {
+ String[] paramTypes = m.getParameterTypes();
+ if(paramTypes.length != def.getParameters().size()) return false;
+ if(paramTypes.length == 0) return true;
+ for (int i = 0; i < paramTypes.length; i++) {
+ String paramType = paramTypes[i];
+ SeamParameterDefinition p = def.getParameters().get(i);
+ if(p.getDimensions() != Signature.getArrayCount(paramType)) {
+ return false;
+ }
+ IParametedType pt = context.getProject().getTypeFactory().getParametedType(m,
paramType);
+ if(pt == null || p.getType() == null) return false;
+ if(!pt.getType().getFullyQualifiedName().equals(p.getType().getFullyQualifiedName()))
return false;
+ }
+ return true;
+ }
+
}