| 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()); |
| } |
| } |