/*******************************************************************************
* 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.test.v30;
import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jdt.core.IMemberValuePair;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.jboss.tools.cdi.core.CDIConstants;
import org.jboss.tools.cdi.core.CDICorePlugin;
import org.jboss.tools.cdi.core.ICDIProject;
import org.jboss.tools.cdi.core.IInterceptorBinding;
import org.jboss.tools.cdi.core.IQualifier;
import org.jboss.tools.cdi.core.IStereotype;
import org.jboss.tools.cdi.seam.config.core.CDISeamConfigConstants;
import org.jboss.tools.cdi.seam.config.core.ConfigDefinitionContext;
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.SeamMethodDefinition;
import org.jboss.tools.cdi.seam.config.core.definition.SeamParameterDefinition;
import org.jboss.tools.cdi.seam.config.core.definition.SeamVirtualFieldDefinition;
import org.jboss.tools.cdi.seam.config.core.xml.Location;
import org.jboss.tools.cdi.seam.solder.core.CDISeamSolderConstants30;
import org.jboss.tools.common.java.IJavaAnnotation;
import org.osgi.framework.Bundle;
/**
*
* @author Viacheslav Kabanovich
*
*/
public class SeamDefinitionsTest extends SeamConfigTest {
public SeamDefinitionsTest() {}
/**
* This test just checks that SAXParser class is in class path.
*/
public void testParser() throws Exception {
Bundle bundle = Platform.getBundle("org.jboss.tools.cdi.seam.config.core");
Class cls = bundle.loadClass("org.apache.xerces.parsers.SAXParser");
assertNotNull(cls);
}
public void testLineNumber() {
ICDIProject cdi = CDICorePlugin.getCDIProject(project, true);
ConfigDefinitionContext context = (ConfigDefinitionContext)getConfigExtension(cdi).getContext();
SeamBeansDefinition d = getBeansDefinition(context, "src/META-INF/beans.xml");
Set<SeamBeanDefinition> ds = findBeanDefinitionByTagName(d, "test602:Report");
assertEquals(1, ds.size());
SeamBeanDefinition report = ds.iterator().next();
assertEquals(20, report.getElement().getLocation().getLine());
}
public void testReplacingAndModifyingBeans() throws CoreException, IOException {
ICDIProject cdi = CDICorePlugin.getCDIProject(project, true);
ConfigDefinitionContext context = (ConfigDefinitionContext)getConfigExtension(cdi).getContext();
SeamBeansDefinition d = getBeansDefinition(context, "src/META-INF/beans.xml");
Set<SeamBeanDefinition> ds = findBeanDefinitionByTagName(d, "test602:Report");
assertEquals(1, ds.size());
SeamBeanDefinition report = ds.iterator().next();
Location modifies = report.getModifiesLocation();
assertNotNull(modifies);
IJavaAnnotation annotation = report.getAnnotation("org.jboss.test602.report.NewQualifier");
assertNotNull(annotation);
ds = findBeanDefinitionByTagName(d, "test602:ReportDatasource");
assertEquals(1, ds.size());
SeamBeanDefinition reportDatasource = ds.iterator().next();
Location replaces = reportDatasource.getReplacesLocation();
assertNotNull(replaces);
}
public void testApplyingAnnotations() throws CoreException {
ICDIProject cdi = CDICorePlugin.getCDIProject(project, true);
ConfigDefinitionContext context = (ConfigDefinitionContext)getConfigExtension(cdi).getContext();
SeamBeansDefinition d = getBeansDefinition(context, "src/META-INF/beans.xml");
Set<SeamBeanDefinition> ds = findBeanDefinitionByTagName(d, "test603:QualifiedBean1");
assertEquals(1, ds.size());
SeamBeanDefinition b = ds.iterator().next();
IJavaAnnotation a = b.getAnnotation("org.jboss.test603.OtherQualifier");
Map<String, Object> ps = toMap(a.getMemberValuePairs());
assertEquals(3, ps.size());
assertEquals("AA", "" + ps.get("value1"));
assertEquals("1", "" + ps.get("value2"));
assertEquals("false", "" + ps.get("value"));
ds = findBeanDefinitionByTagName(d, "test603:QualifiedBean2");
assertEquals(1, ds.size());
b = ds.iterator().next();
a = b.getAnnotation("org.jboss.test603.OtherQualifier");
ps = toMap(a.getMemberValuePairs());
assertEquals(3, ps.size());
assertEquals("BB", "" + ps.get("value1"));
assertEquals("2", "" + ps.get("value2"));
assertEquals("true", "" + ps.get("value"));
}
Map<String, Object> toMap(IMemberValuePair[] ps) {
Map<String, Object> result = new HashMap<String, Object>();
for (IMemberValuePair p: ps) result.put(p.getMemberName(), p.getValue());
return result;
}
public void testInitialFieldValues() {
ICDIProject cdi = CDICorePlugin.getCDIProject(project, true);
ConfigDefinitionContext context = (ConfigDefinitionContext)getConfigExtension(cdi).getContext();
SeamBeansDefinition d = getBeansDefinition(context, "src/META-INF/beans.xml");
/*
<test6041:RobotFactory>
<test6041:robot>
<s:Produces/>
</test6041:robot>
</test6041:RobotFactory>
*/
Set<SeamBeanDefinition> ds = findBeanDefinitionByTagName(d, "test6041:RobotFactory");
assertEquals(1, ds.size());
SeamBeanDefinition b = ds.iterator().next();
SeamFieldDefinition f = b.getField("robot");
assertNotNull(f);
IJavaAnnotation a = f.getAnnotation("javax.enterprise.inject.Produces");
assertNotNull(a);
/*
<test6041:MyBean>
<test6041:SomeQualifier/>
<test6041:company>Red Hat Inc</test6041:company>
</test6041:MyBean>
<test6041:MyBean>
<test6041:company>
<s:value>Red Hat Inc</s:value>
<test6041:SomeQualifier/>
</test6041:company>
</test6041:MyBean>
*/
ds = findBeanDefinitionByTagName(d, "test6041:MyBean");
assertEquals(2, ds.size());
Iterator<SeamBeanDefinition> it = ds.iterator();
SeamBeanDefinition b1 = it.next();
SeamBeanDefinition b2 = it.next();
String someQualifier = "org.jboss.test6041.SomeQualifier";
boolean qb1 = b1.getAnnotation(someQualifier) != null;
boolean qb2 = b2.getAnnotation(someQualifier) != null;
assertFalse(qb1 == qb2);
if(qb2) {
//assign b1 to bean with qualifier; b2 to bean having field with qualifier.
SeamBeanDefinition bc = b1;
b1 = b2;
b2 = bc;
}
f = b1.getField("company");
assertNotNull(f);
assertNull(f.getAnnotation(someQualifier));
assertEquals("Red Hat Inc", f.getValue());
f = b2.getField("company");
assertNotNull(f);
assertNotNull(f.getAnnotation(someQualifier));
assertEquals("Red Hat Inc", f.getValue());
}
/**
<test6041:ArrayFieldValue>
<test6041:intArrayField>
<s:value>1</s:value>
<s:value>2</s:value>
</test6041:intArrayField>
<test6041:classArrayField>
<s:value>java.lang.Integer</s:value>
<s:value>java.lang.Long</s:value>
</test6041:classArrayField>
<test6041:stringArrayField>
<s:value>hello</s:value>
<s:value>world</s:value>
</test6041:stringArrayField>
</test6041:ArrayFieldValue>
*
*/
public void testInitialFieldListValues() {
ICDIProject cdi = CDICorePlugin.getCDIProject(project, true);
ConfigDefinitionContext context = (ConfigDefinitionContext)getConfigExtension(cdi).getContext();
SeamBeansDefinition d = getBeansDefinition(context, "src/META-INF/beans.xml");
Set<SeamBeanDefinition> ds = findBeanDefinitionByTagName(d, "test6041:ArrayFieldValue");
assertEquals(1, ds.size());
SeamBeanDefinition b = ds.iterator().next();
SeamFieldDefinition f = b.getField("intArrayField");
assertNotNull(f);
List<String> vs = f.getListValue();
assertEquals(2, vs.size());
assertEquals("1", vs.get(0));
assertEquals("2", vs.get(1));
f = b.getField("classArrayField");
assertNotNull(f);
vs = f.getListValue();
assertEquals(2, vs.size());
assertEquals("java.lang.Integer", vs.get(0));
assertEquals("java.lang.Long", vs.get(1));
f = b.getField("stringArrayField");
assertNotNull(f);
vs = f.getListValue();
assertEquals(2, vs.size());
assertEquals("hello", vs.get(0));
assertEquals("world", vs.get(1));
}
/**
<test6042:Knight>
<test6042:sword>
<s:value>
<test6042:Sword type="sharp"/>
</s:value>
</test6042:sword>
<test6042:horse>
<s:value>
<test6042:Horse>
<test6042:name>
<value>billy</value>
</test6042:name>
<test6042:shoe>
<Inject/>
</test6042:shoe>
</test6042:Horse>
</s:value>
</test6042:horse>
</test6042:Knight>
*/
public void testInlineBeanDeclarations() {
ICDIProject cdi = CDICorePlugin.getCDIProject(project, true);
ConfigDefinitionContext context = (ConfigDefinitionContext)getConfigExtension(cdi).getContext();
SeamBeansDefinition d = getBeansDefinition(context, "src/META-INF/beans.xml");
Set<SeamBeanDefinition> ds = findBeanDefinitionByTagName(d, "test6042:Knight");
assertEquals(1, ds.size());
SeamBeanDefinition knight = ds.iterator().next();
SeamFieldDefinition f = knight.getField("sword");
assertNotNull(f);
ds = findBeanDefinitionByTagName(d, "test6042:Sword");
assertEquals(1, ds.size());
SeamBeanDefinition sword = ds.iterator().next();
assertTrue(sword.isInline());
IJavaAnnotation a1 = sword.getAnnotation(CDISeamConfigConstants.INLINE_BEAN_QUALIFIER_30);
assertNotNull(a1);
IJavaAnnotation a2 = f.getValueDefinitions().get(0).getAnnotation(CDISeamConfigConstants.INLINE_BEAN_QUALIFIER_30);
assertTrue(a1 == a2);
IJavaAnnotation inject = f.getValueDefinitions().get(0).getAnnotation(CDIConstants.INJECT_ANNOTATION_TYPE_NAME);
assertNotNull(inject);
SeamFieldDefinition swordType = sword.getField("type");
assertNotNull(swordType);
assertEquals("sharp", swordType.getValue());
f = knight.getField("horse");
assertNotNull(f);
ds = findBeanDefinitionByTagName(d, "test6042:Horse");
assertEquals(1, ds.size());
SeamBeanDefinition horse = ds.iterator().next();
assertTrue(horse.isInline());
a1 = horse.getAnnotation(CDISeamConfigConstants.INLINE_BEAN_QUALIFIER_30);
assertNotNull(a1);
a2 = f.getValueDefinitions().get(0).getAnnotation(CDISeamConfigConstants.INLINE_BEAN_QUALIFIER_30);
assertTrue(a1 == a2);
inject = f.getValueDefinitions().get(0).getAnnotation(CDIConstants.INJECT_ANNOTATION_TYPE_NAME);
assertNotNull(inject);
SeamFieldDefinition horseName = horse.getField("name");
assertNotNull(horseName);
assertEquals("billy", horseName.getValue());
SeamFieldDefinition shoe = horse.getField("shoe");
assertNotNull(shoe);
inject = shoe.getAnnotation(CDIConstants.INJECT_ANNOTATION_TYPE_NAME);
assertNotNull(inject);
}
/**
<test605:MethodBean>
<test605:doStuff>
<s:Produces/>
</test605:doStuff>
<test605:doStuff>
<s:Produces/>
<test605:Qualifier1/>
<s:parameters>
<s:Long>
<test605:Qualifier2/>
</s:Long>
</s:parameters>
</test605:doStuff>
<test605:doStuff>
<s:Produces/>
<test605:Qualifier1/>
<s:parameters>
<s:array dimensions="2">
<test605:Qualifier2/>
<s:Long/>
</s:array>
</s:parameters>
</test605:doStuff>
</test605:MethodBean>
*/
public void testConfiguringMethods() {
ICDIProject cdi = CDICorePlugin.getCDIProject(project, true);
ConfigDefinitionContext context = (ConfigDefinitionContext)getConfigExtension(cdi).getContext();
SeamBeansDefinition d = getBeansDefinition(context, "src/META-INF/beans.xml");
Set<SeamBeanDefinition> ds = findBeanDefinitionByTagName(d, "test605:MethodBean");
assertEquals(1, ds.size());
SeamBeanDefinition b = ds.iterator().next();
List<SeamMethodDefinition> ms = b.getMethods();
assertEquals(3, ms.size());
SeamMethodDefinition noParam = ms.get(0);
assertEquals(0, noParam.getParameters().size());
assertNotNull(noParam.getAnnotation(CDIConstants.PRODUCES_ANNOTATION_TYPE_NAME));
SeamMethodDefinition oneParam = ms.get(1);
assertEquals(1, oneParam.getParameters().size());
assertNotNull(oneParam.getAnnotation(CDIConstants.PRODUCES_ANNOTATION_TYPE_NAME));
assertNotNull(oneParam.getAnnotation("org.jboss.test605.Qualifier1"));
SeamParameterDefinition param = oneParam.getParameters().get(0);
assertEquals(0, param.getDimensions());
assertEquals("java.lang.Long", param.getType().getFullyQualifiedName());
assertNotNull(param.getAnnotation("org.jboss.test605.Qualifier2"));
SeamMethodDefinition oneArrayParam = ms.get(2);
assertEquals(1, oneParam.getParameters().size());
assertNotNull(oneArrayParam.getAnnotation(CDIConstants.PRODUCES_ANNOTATION_TYPE_NAME));
assertNotNull(oneArrayParam.getAnnotation("org.jboss.test605.Qualifier1"));
param = oneArrayParam.getParameters().get(0);
assertEquals(2, param.getDimensions());
assertEquals("java.lang.Long", param.getType().getFullyQualifiedName());
assertNotNull(param.getAnnotation("org.jboss.test605.Qualifier2"));
}
/**
<test605:MethodBean2>
<test605:method>
<s:array>
<test605:String/>
</s:array>
</test605:method>
</test605:MethodBean2>
*/
public void testConfiguringMethods2() {
ICDIProject cdi = CDICorePlugin.getCDIProject(project, true);
ConfigDefinitionContext context = (ConfigDefinitionContext)getConfigExtension(cdi).getContext();
SeamBeansDefinition d = getBeansDefinition(context, "src/META-INF/beans.xml");
Set<SeamBeanDefinition> ds = findBeanDefinitionByTagName(d, "test605:MethodBean2");
assertEquals(1, ds.size());
SeamBeanDefinition b = ds.iterator().next();
List<SeamMethodDefinition> ms = b.getMethods();
assertEquals(1, ms.size());
SeamMethodDefinition m = ms.get(0);
assertEquals(1, m.getParameters().size());
SeamParameterDefinition param = m.getParameters().get(0);
assertEquals(1, param.getDimensions());
assertEquals("java.lang.String", param.getType().getFullyQualifiedName());
}
public void testResolvingBetweenFieldAndMethod() {
ICDIProject cdi = CDICorePlugin.getCDIProject(project, true);
ConfigDefinitionContext context = (ConfigDefinitionContext)getConfigExtension(cdi).getContext();
SeamBeansDefinition d = getBeansDefinition(context, "src/META-INF/beans.xml");
Set<SeamBeanDefinition> ds = findBeanDefinitionByTagName(d, "test605:MethodBean3");
assertEquals(1, ds.size());
SeamBeanDefinition b = ds.iterator().next();
SeamFieldDefinition f = b.getField("name");
assertNotNull(f);
ds = findBeanDefinitionByTagName(d, "test605:MethodBean4");
assertEquals(1, ds.size());
b = ds.iterator().next();
List<SeamMethodDefinition> ms = b.getMethods();
assertEquals(1, ms.size());
SeamMethodDefinition m = ms.get(0);
assertEquals("name", m.getMethod().getElementName());
}
/**
<test606:MyBean>
<s:parameters>
<s:Integer>
<test606:MyQualifier/>
</s:Integer>
</s:parameters>
</test606:MyBean>
*/
public void testConfiguringConstructor() throws CoreException {
ICDIProject cdi = CDICorePlugin.getCDIProject(project, true);
ConfigDefinitionContext context = (ConfigDefinitionContext)getConfigExtension(cdi).getContext();
SeamBeansDefinition d = getBeansDefinition(context, "src/META-INF/beans.xml");
Set<SeamBeanDefinition> ds = findBeanDefinitionByTagName(d, "test606:MyBean");
assertEquals(1, ds.size());
SeamBeanDefinition b = ds.iterator().next();
List<SeamMethodDefinition> ms = b.getMethods();
assertEquals(1, ms.size());
SeamMethodDefinition m = ms.get(0);
IMethod jm = m.getMethod();
assertTrue(jm.isConstructor());
assertEquals(1, m.getParameters().size());
SeamParameterDefinition param = m.getParameters().get(0);
assertEquals(0, param.getDimensions());
assertEquals("java.lang.Integer", param.getType().getFullyQualifiedName());
}
/**
<test607:SomeBean>
<test607:someField>
<s:Inject/>
<s:Exact>org.jboss.test607.MyInterface</s:Exact>
</test607:someField>
</test607:SomeBean>
*/
public void testOverridingTypeOfAnInjectionPoint() throws CoreException {
ICDIProject cdi = CDICorePlugin.getCDIProject(project, true);
ConfigDefinitionContext context = (ConfigDefinitionContext)getConfigExtension(cdi).getContext();
SeamBeansDefinition d = getBeansDefinition(context, "src/META-INF/beans.xml");
Set<SeamBeanDefinition> ds = findBeanDefinitionByTagName(d, "test607:SomeBean");
assertEquals(1, ds.size());
SeamBeanDefinition b = ds.iterator().next();
SeamFieldDefinition f = b.getField("someField");
assertNotNull(f);
IJavaAnnotation inject = f.getAnnotation(CDIConstants.INJECT_ANNOTATION_TYPE_NAME);
assertNotNull(inject);
IJavaAnnotation exact = f.getAnnotation(CDISeamSolderConstants30.EXACT_ANNOTATION_TYPE_NAME_30);
assertNotNull(exact);
IMemberValuePair[] ps = exact.getMemberValuePairs();
assertEquals(1, ps.length);
assertEquals("org.jboss.test607.MyInterface", ps[0].getValue());
}
public void testConfiguringMetaAnnotations() {
ICDIProject cdi = CDICorePlugin.getCDIProject(project, true);
ConfigDefinitionContext context = (ConfigDefinitionContext)getConfigExtension(cdi).getContext();
SeamBeansDefinition d = getBeansDefinition(context, "src/META-INF/beans.xml");
/*
<test608:SomeQualifier>
<s:Qualifier/>
</test608:SomeQualifier>
*/
context.getRootContext().getAnnotation("org.jboss.test608.SomeQualifier");
IQualifier q = cdi.getQualifier("org.jboss.test608.SomeQualifier");
assertNotNull(q);
/*
<test608:SomeInterceptorBinding>
<s:InterceptorBinding/>
</test608:SomeInterceptorBinding>
*/
IInterceptorBinding b = cdi.getInterceptorBinding("org.jboss.test608.SomeInterceptorBinding");
assertNotNull(b);
/*
<test608:SomeStereotype>
<s:Stereotype/>
<test608:MyInterceptorBinding/>
<s:Named/>
</test608:SomeStereotype>
*/
IStereotype s = cdi.getStereotype("org.jboss.test608.SomeStereotype");
assertNotNull(s);
assertNotNull(s.getAnnotation(CDIConstants.NAMED_QUALIFIER_TYPE_NAME));
Collection<IInterceptorBinding> bs = s.getInterceptorBindings();
assertEquals(1, bs.size());
}
public void testVirtualProducerField() {
ICDIProject cdi = CDICorePlugin.getCDIProject(project, true);
ConfigDefinitionContext context = (ConfigDefinitionContext)getConfigExtension(cdi).getContext();
SeamBeansDefinition d = getBeansDefinition(context, "src/META-INF/beans.xml");
Set<SeamVirtualFieldDefinition> fs = d.getVirtualFieldDefinitions();
assertFalse(fs.isEmpty());
SeamVirtualFieldDefinition f = findVirtualField(fs, "java.lang.String", "org.jboss.test606.MyQualifier");
assertNotNull(f);
assertNotNull(f.getAnnotation(CDIConstants.PRODUCES_ANNOTATION_TYPE_NAME));
assertEquals("Version 1.23", f.getValue());
}
private SeamVirtualFieldDefinition findVirtualField(Set<SeamVirtualFieldDefinition> fs, String typeName, String qualifier) {
for (SeamVirtualFieldDefinition f: fs) {
IType t = f.getType();
if(typeName.equals(t.getFullyQualifiedName()) && f.getAnnotation(qualifier) != null) return f;
}
return null;
}
}