blob: ce0559ae6a18e6f3c7ec586bb5dc99c8fb82abe2 [file] [log] [blame]
package org.eclipse.jpt.jaxb.eclipselink.core.tests.internal.context.java;
import java.util.Iterator;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.NormalAnnotation;
import org.eclipse.jpt.common.core.resource.java.JavaResourceAttribute;
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.CollectionTools;
import org.eclipse.jpt.common.utility.internal.iterables.SubIterableWrapper;
import org.eclipse.jpt.common.utility.internal.iterators.ArrayIterator;
import org.eclipse.jpt.jaxb.core.context.JaxbClass;
import org.eclipse.jpt.jaxb.core.context.JaxbClassMapping;
import org.eclipse.jpt.jaxb.core.platform.JaxbPlatformDescription;
import org.eclipse.jpt.jaxb.core.resource.java.JAXB;
import org.eclipse.jpt.jaxb.eclipselink.core.ELJaxbPlatform;
import org.eclipse.jpt.jaxb.eclipselink.core.context.java.ELXmlJoinNode;
import org.eclipse.jpt.jaxb.eclipselink.core.context.java.ELXmlJoinNodesMapping;
import org.eclipse.jpt.jaxb.eclipselink.core.resource.java.ELJaxb;
import org.eclipse.jpt.jaxb.eclipselink.core.resource.java.XmlJoinNodeAnnotation;
import org.eclipse.jpt.jaxb.eclipselink.core.tests.internal.context.ELJaxbContextModelTestCase;
public class ELJavaXmlJoinNodesMappingTests
extends ELJaxbContextModelTestCase {
public ELJavaXmlJoinNodesMappingTests(String name) {
super(name);
}
@Override
protected JaxbPlatformDescription getPlatform() {
return ELJaxbPlatform.VERSION_2_2;
}
private ICompilationUnit createTypeWithXmlJoinNodes() throws Exception {
return this.createTestType(new DefaultAnnotationWriter() {
@Override
public Iterator<String> imports() {
return new ArrayIterator<String>(JAXB.XML_TYPE, ELJaxb.XML_JOIN_NODES);
}
@Override
public void appendTypeAnnotationTo(StringBuilder sb) {
sb.append("@XmlType");
}
@Override
public void appendIdFieldAnnotationTo(StringBuilder sb) {
sb.append("@XmlJoinNodes");
}
});
}
protected NormalAnnotation newXmlJoinNodeAnnotation(AST ast, String xmlPath, String referencedXmlPath) {
NormalAnnotation annotation = newNormalAnnotation(ast, ELJaxb.XML_JOIN_NODE);
addMemberValuePair(annotation, ELJaxb.XML_JOIN_NODE__XML_PATH, xmlPath);
addMemberValuePair(annotation, ELJaxb.XML_JOIN_NODE__REFERENCED_XML_PATH, referencedXmlPath);
return annotation;
}
protected void addXmlJoinNode(ModifiedDeclaration declaration, int index, String xmlPath, String referencedXmlPath) {
NormalAnnotation annotation = newXmlJoinNodeAnnotation(declaration.getAst(), xmlPath, referencedXmlPath);
addArrayElement(declaration, ELJaxb.XML_JOIN_NODES, index, "value", annotation);
}
protected void moveXmlJoinNode(ModifiedDeclaration declaration, int targetIndex, int sourceIndex) {
moveArrayElement((NormalAnnotation) declaration.getAnnotationNamed(ELJaxb.XML_JOIN_NODES), "value", targetIndex, sourceIndex);
}
protected void removeXmlJoinNode(ModifiedDeclaration declaration, int index) {
removeArrayElement((NormalAnnotation) declaration.getAnnotationNamed(ELJaxb.XML_JOIN_NODES), "value", index);
}
public void testUpdateXmlJoinNodes() throws Exception {
createTypeWithXmlJoinNodes();
JaxbClass jaxbClass = (JaxbClass) CollectionTools.get(getContextRoot().getTypes(), 0);
JaxbClassMapping classMapping = jaxbClass.getMapping();
ELXmlJoinNodesMapping mapping = (ELXmlJoinNodesMapping) CollectionTools.get(classMapping.getAttributes(), 0).getMapping();
JavaResourceAttribute resourceAttribute = mapping.getPersistentAttribute().getJavaResourceAttribute();
Iterable<ELXmlJoinNode> xmlJoinNodes = mapping.getXmlJoinNodes();
assertTrue(CollectionTools.isEmpty(xmlJoinNodes));
assertEquals(0, mapping.getXmlJoinNodesSize());
//add 2 XmlJoinNode annotations
AnnotatedElement annotatedElement = annotatedElement(resourceAttribute);
annotatedElement.edit(
new Member.Editor() {
public void edit(ModifiedDeclaration declaration) {
ELJavaXmlJoinNodesMappingTests.this.addXmlJoinNode(declaration, 0, "foo", "@foo");
ELJavaXmlJoinNodesMappingTests.this.addXmlJoinNode(declaration, 1, "bar", "@bar");
}
});
xmlJoinNodes = mapping.getXmlJoinNodes();
assertFalse(CollectionTools.isEmpty(xmlJoinNodes));
assertEquals(2, mapping.getXmlJoinNodesSize());
assertEquals("foo", CollectionTools.get(xmlJoinNodes, 0).getXmlPath());
assertEquals("@foo", CollectionTools.get(xmlJoinNodes, 0).getReferencedXmlPath());
assertEquals("bar", CollectionTools.get(xmlJoinNodes, 1).getXmlPath());
assertEquals("@bar", CollectionTools.get(xmlJoinNodes, 1).getReferencedXmlPath());
// switch XmlJoinNode annotations
annotatedElement.edit(
new Member.Editor() {
public void edit(ModifiedDeclaration declaration) {
ELJavaXmlJoinNodesMappingTests.this.moveXmlJoinNode(declaration, 0, 1);
}
});
xmlJoinNodes = mapping.getXmlJoinNodes();
assertFalse(CollectionTools.isEmpty(xmlJoinNodes));
assertEquals(2, mapping.getXmlJoinNodesSize());
assertEquals("bar", CollectionTools.get(xmlJoinNodes, 0).getXmlPath());
assertEquals("@bar", CollectionTools.get(xmlJoinNodes, 0).getReferencedXmlPath());
assertEquals("foo", CollectionTools.get(xmlJoinNodes, 1).getXmlPath());
assertEquals("@foo", CollectionTools.get(xmlJoinNodes, 1).getReferencedXmlPath());
// remove XmlJoinNode annotations
annotatedElement.edit(
new Member.Editor() {
public void edit(ModifiedDeclaration declaration) {
ELJavaXmlJoinNodesMappingTests.this.removeXmlJoinNode(declaration, 1);
ELJavaXmlJoinNodesMappingTests.this.removeXmlJoinNode(declaration, 0);
}
});
xmlJoinNodes = mapping.getXmlJoinNodes();
assertTrue(CollectionTools.isEmpty(xmlJoinNodes));
assertEquals(0, mapping.getXmlJoinNodesSize());
}
public void testModifyXmlJoinNodes() throws Exception {
createTypeWithXmlJoinNodes();
JaxbClass jaxbClass = (JaxbClass) CollectionTools.get(getContextRoot().getTypes(), 0);
JaxbClassMapping classMapping = jaxbClass.getMapping();
ELXmlJoinNodesMapping mapping = (ELXmlJoinNodesMapping) CollectionTools.get(classMapping.getAttributes(), 0).getMapping();
JavaResourceAttribute resourceAttribute = mapping.getPersistentAttribute().getJavaResourceAttribute();
assertEquals(0, resourceAttribute.getAnnotationsSize(ELJaxb.XML_JOIN_NODE));
assertEquals(0, mapping.getXmlJoinNodesSize());
ELXmlJoinNode joinNode = mapping.addXmlJoinNode(0);
joinNode.setXmlPath("foo");
joinNode.setReferencedXmlPath("@foo");
joinNode = mapping.addXmlJoinNode(1);
joinNode.setXmlPath("baz");
joinNode.setReferencedXmlPath("@baz");
joinNode = mapping.addXmlJoinNode(1);
joinNode.setXmlPath("bar");
joinNode.setReferencedXmlPath("@bar");
Iterable<XmlJoinNodeAnnotation> xmlJoinNodeAnnotations =
new SubIterableWrapper(resourceAttribute.getAnnotations(ELJaxb.XML_JOIN_NODE));
assertEquals(3, CollectionTools.size(xmlJoinNodeAnnotations));
assertEquals(3, mapping.getXmlJoinNodesSize());
assertEquals("foo", CollectionTools.get(xmlJoinNodeAnnotations, 0).getXmlPath());
assertEquals("@foo", CollectionTools.get(xmlJoinNodeAnnotations, 0).getReferencedXmlPath());
assertEquals("bar", CollectionTools.get(xmlJoinNodeAnnotations, 1).getXmlPath());
assertEquals("@bar", CollectionTools.get(xmlJoinNodeAnnotations, 1).getReferencedXmlPath());
assertEquals("baz", CollectionTools.get(xmlJoinNodeAnnotations, 2).getXmlPath());
assertEquals("@baz", CollectionTools.get(xmlJoinNodeAnnotations, 2).getReferencedXmlPath());
mapping.moveXmlJoinNode(1, 2);
xmlJoinNodeAnnotations =
new SubIterableWrapper(resourceAttribute.getAnnotations(ELJaxb.XML_JOIN_NODE));
assertEquals(3, CollectionTools.size(xmlJoinNodeAnnotations));
assertEquals(3, mapping.getXmlJoinNodesSize());
assertEquals("foo", CollectionTools.get(xmlJoinNodeAnnotations, 0).getXmlPath());
assertEquals("@foo", CollectionTools.get(xmlJoinNodeAnnotations, 0).getReferencedXmlPath());
assertEquals("baz", CollectionTools.get(xmlJoinNodeAnnotations, 1).getXmlPath());
assertEquals("@baz", CollectionTools.get(xmlJoinNodeAnnotations, 1).getReferencedXmlPath());
assertEquals("bar", CollectionTools.get(xmlJoinNodeAnnotations, 2).getXmlPath());
assertEquals("@bar", CollectionTools.get(xmlJoinNodeAnnotations, 2).getReferencedXmlPath());
mapping.removeXmlJoinNode(2);
mapping.removeXmlJoinNode(0);
mapping.removeXmlJoinNode(0);
xmlJoinNodeAnnotations =
new SubIterableWrapper(resourceAttribute.getAnnotations(ELJaxb.XML_JOIN_NODE));
assertEquals(0, CollectionTools.size(xmlJoinNodeAnnotations));
assertEquals(0, mapping.getXmlJoinNodesSize());
}
}