blob: b01ba097ef5cca37d142e372ec90c8f162e924ad [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2011 Oracle. All rights reserved.
* This program and the accompanying materials are 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:
* Oracle - initial API and implementation
******************************************************************************/
package org.eclipse.jpt.jaxb.core.tests.internal.context.java;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.Block;
import org.eclipse.jdt.core.dom.BodyDeclaration;
import org.eclipse.jdt.core.dom.IExtendedModifier;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.NormalAnnotation;
import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.jpt.common.core.resource.java.JavaResourceType;
import org.eclipse.jpt.common.core.utility.jdt.AnnotatedElement;
import org.eclipse.jpt.common.core.utility.jdt.Member;
import org.eclipse.jpt.common.core.utility.jdt.ModifiedDeclaration;
import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
import org.eclipse.jpt.jaxb.core.context.JaxbClass;
import org.eclipse.jpt.jaxb.core.context.JaxbElementFactoryMethod;
import org.eclipse.jpt.jaxb.core.context.XmlRegistry;
import org.eclipse.jpt.jaxb.core.resource.java.JAXB;
import org.eclipse.jpt.jaxb.core.tests.internal.context.JaxbContextModelTestCase;
@SuppressWarnings("nls")
public class GenericJavaRegistryTests extends JaxbContextModelTestCase
{
public GenericJavaRegistryTests(String name) {
super(name);
}
protected ICompilationUnit createClassWithXmlRegistryAndCreateMethods() throws Exception {
return this.createTestType(PACKAGE_NAME, "ObjectFactory.java", "ObjectFactory", new DefaultAnnotationWriter() {
@Override
public Iterator<String> imports() {
return new ArrayIterator<String>(JAXB.XML_REGISTRY, JAXB.XML_ELEMENT_DECL, "javax.xml.bind.JAXBElement");
}
@Override
public void appendTypeAnnotationTo(StringBuilder sb) {
sb.append("@XmlRegistry");
}
@Override
public void appendGetNameMethodAnnotationTo(StringBuilder sb) {
sb.append("@XmlElementDecl(name=\"foo\")").append(CR);
sb.append(" JAXBElement<AnnotationTestType> createFoo(AnnotationTestType value) {return null}").append(CR);
sb.append(CR);
sb.append(" @XmlElementDecl(name=\"bar\")").append(CR);
sb.append(" JAXBElement createBar(Object value) {return null}").append(CR);
sb.append(CR);
}
});
}
protected void addElementFactoryMethod(TypeDeclaration typeDeclaration, String methodName) {
AST ast = typeDeclaration.getAST();
MethodDeclaration methodDeclaration = this.newMethodDeclaration(ast, methodName);
Block body = ast.newBlock();
methodDeclaration.setBody(body);
methodDeclaration.setReturnType2(ast.newSimpleType(ast.newName("JAXBElement")));
SingleVariableDeclaration parameter = ast.newSingleVariableDeclaration();
parameter.setName(ast.newSimpleName("value"));
parameter.setType(ast.newSimpleType(ast.newName("Object")));
parameters(methodDeclaration).add(parameter);
NormalAnnotation elementDeclAnnotation = this.newNormalAnnotation(ast, "XmlElementDecl");
modifiers(methodDeclaration).add(elementDeclAnnotation);
this.bodyDeclarations(typeDeclaration).add(methodDeclaration);
}
protected MethodDeclaration newMethodDeclaration(AST ast, String methodName) {
MethodDeclaration methodDeclaration = ast.newMethodDeclaration();
methodDeclaration.setName(ast.newSimpleName(methodName));
return methodDeclaration;
}
/**
* minimize the scope of the suppressed warnings
*/
@SuppressWarnings("unchecked")
protected List<BodyDeclaration> bodyDeclarations(TypeDeclaration td) {
return td.bodyDeclarations();
}
@SuppressWarnings("unchecked")
protected List<SingleVariableDeclaration> parameters(MethodDeclaration md) {
return md.parameters();
}
@SuppressWarnings("unchecked")
protected List<IExtendedModifier> modifiers(MethodDeclaration md) {
return md.modifiers();
}
protected void removeMethodDeclaration(TypeDeclaration typeDeclaration, String methodName) {
for (MethodDeclaration md : typeDeclaration.getMethods()) {
if (md.getName().getFullyQualifiedName().equals(methodName)) {
this.bodyDeclarations(typeDeclaration).remove(md);
break;
}
}
}
public void testUpdateElementFactoryMethods() throws Exception {
createClassWithXmlType();
createClassWithXmlRegistryAndCreateMethods();
JaxbClass jaxbClass = (JaxbClass) getContextRoot().getType("test.ObjectFactory");
XmlRegistry contextRegistry = jaxbClass.getXmlRegistry();
JavaResourceType resourceType = jaxbClass.getJavaResourceType();
assertEquals(2, contextRegistry.getElementFactoryMethodsSize());
Iterator<JaxbElementFactoryMethod> elementFactoryMethods = contextRegistry.getElementFactoryMethods().iterator();
JaxbElementFactoryMethod elementFactoryMethod = elementFactoryMethods.next();
assertEquals("createFoo", elementFactoryMethod.getName());
assertEquals("foo", elementFactoryMethod.getQName().getName());
elementFactoryMethod = elementFactoryMethods.next();
assertEquals("createBar", elementFactoryMethod.getName());
assertEquals("bar", elementFactoryMethod.getQName().getName());
assertFalse(elementFactoryMethods.hasNext());
AnnotatedElement annotatedElement = this.annotatedElement(resourceType);
annotatedElement.edit(new Member.Editor() {
public void edit(ModifiedDeclaration declaration) {
GenericJavaRegistryTests.this.addElementFactoryMethod((TypeDeclaration) declaration.getDeclaration(), "createFoo2");
GenericJavaRegistryTests.this.addElementFactoryMethod((TypeDeclaration) declaration.getDeclaration(), "createBar2");
}
});
assertEquals(4, contextRegistry.getElementFactoryMethodsSize());
elementFactoryMethods = contextRegistry.getElementFactoryMethods().iterator();
elementFactoryMethod = elementFactoryMethods.next();
assertEquals("createFoo", elementFactoryMethod.getName());
assertEquals("foo", elementFactoryMethod.getQName().getName());
elementFactoryMethod = elementFactoryMethods.next();
assertEquals("createBar", elementFactoryMethod.getName());
assertEquals("bar", elementFactoryMethod.getQName().getName());
elementFactoryMethod = elementFactoryMethods.next();
assertEquals("createFoo2", elementFactoryMethod.getName());
assertEquals(null, elementFactoryMethod.getQName().getName());
elementFactoryMethod = elementFactoryMethods.next();
assertEquals("createBar2", elementFactoryMethod.getName());
assertEquals(null, elementFactoryMethod.getQName().getName());
assertFalse(elementFactoryMethods.hasNext());
annotatedElement.edit(new Member.Editor() {
public void edit(ModifiedDeclaration declaration) {
GenericJavaRegistryTests.this.removeMethodDeclaration((TypeDeclaration) declaration.getDeclaration(), "createFoo");
}
});
assertEquals(3, contextRegistry.getElementFactoryMethodsSize());
elementFactoryMethods = contextRegistry.getElementFactoryMethods().iterator();
elementFactoryMethod = elementFactoryMethods.next();
assertEquals("createBar", elementFactoryMethod.getName());
assertEquals("bar", elementFactoryMethod.getQName().getName());
elementFactoryMethod = elementFactoryMethods.next();
assertEquals("createFoo2", elementFactoryMethod.getName());
assertEquals(null, elementFactoryMethod.getQName().getName());
elementFactoryMethod = elementFactoryMethods.next();
assertEquals("createBar2", elementFactoryMethod.getName());
assertEquals(null, elementFactoryMethod.getQName().getName());
assertFalse(elementFactoryMethods.hasNext());
annotatedElement.edit(new Member.Editor() {
public void edit(ModifiedDeclaration declaration) {
GenericJavaRegistryTests.this.removeMethodDeclaration((TypeDeclaration) declaration.getDeclaration(), "createFoo2");
GenericJavaRegistryTests.this.removeMethodDeclaration((TypeDeclaration) declaration.getDeclaration(), "createBar2");
}
});
assertEquals(1, contextRegistry.getElementFactoryMethodsSize());
elementFactoryMethods = contextRegistry.getElementFactoryMethods().iterator();
elementFactoryMethod = elementFactoryMethods.next();
assertEquals("createBar", elementFactoryMethod.getName());
assertEquals("bar", elementFactoryMethod.getQName().getName());
assertFalse(elementFactoryMethods.hasNext());
annotatedElement.edit(new Member.Editor() {
public void edit(ModifiedDeclaration declaration) {
GenericJavaRegistryTests.this.removeMethodDeclaration((TypeDeclaration) declaration.getDeclaration(), "createBar");
}
});
assertEquals(0, contextRegistry.getElementFactoryMethodsSize());
assertFalse(contextRegistry.getElementFactoryMethods().iterator().hasNext());
}
}