diff options
Diffstat (limited to 'jpa/tests/org.eclipse.jpt.eclipselink.core.tests/src/org/eclipse/jpt/eclipselink2_0/core/tests/internal/context/java/EclipseLink2_0JavaOneToManyMappingTests.java')
-rw-r--r-- | jpa/tests/org.eclipse.jpt.eclipselink.core.tests/src/org/eclipse/jpt/eclipselink2_0/core/tests/internal/context/java/EclipseLink2_0JavaOneToManyMappingTests.java | 342 |
1 files changed, 341 insertions, 1 deletions
diff --git a/jpa/tests/org.eclipse.jpt.eclipselink.core.tests/src/org/eclipse/jpt/eclipselink2_0/core/tests/internal/context/java/EclipseLink2_0JavaOneToManyMappingTests.java b/jpa/tests/org.eclipse.jpt.eclipselink.core.tests/src/org/eclipse/jpt/eclipselink2_0/core/tests/internal/context/java/EclipseLink2_0JavaOneToManyMappingTests.java index 16bcfaadd0..fe110775a4 100644 --- a/jpa/tests/org.eclipse.jpt.eclipselink.core.tests/src/org/eclipse/jpt/eclipselink2_0/core/tests/internal/context/java/EclipseLink2_0JavaOneToManyMappingTests.java +++ b/jpa/tests/org.eclipse.jpt.eclipselink.core.tests/src/org/eclipse/jpt/eclipselink2_0/core/tests/internal/context/java/EclipseLink2_0JavaOneToManyMappingTests.java @@ -12,14 +12,19 @@ package org.eclipse.jpt.eclipselink2_0.core.tests.internal.context.java; import java.util.Iterator; import org.eclipse.jdt.core.ICompilationUnit; +import org.eclipse.jpt.core.context.OneToManyMapping; import org.eclipse.jpt.core.context.PersistentAttribute; +import org.eclipse.jpt.core.context.java.JavaOneToManyMapping; import org.eclipse.jpt.core.jpa2.context.OneToManyMapping2_0; import org.eclipse.jpt.core.jpa2.context.java.JavaOrphanRemovable2_0; import org.eclipse.jpt.core.jpa2.context.java.JavaOrphanRemovalHolder2_0; +import org.eclipse.jpt.core.jpa2.resource.java.MapKeyClass2_0Annotation; import org.eclipse.jpt.core.jpa2.resource.java.OneToMany2_0Annotation; import org.eclipse.jpt.core.resource.java.JPA; import org.eclipse.jpt.core.resource.java.JavaResourcePersistentAttribute; import org.eclipse.jpt.core.resource.java.JavaResourcePersistentType; +import org.eclipse.jpt.core.resource.java.MapKeyAnnotation; +import org.eclipse.jpt.core.tests.internal.projects.TestJavaProject.SourceWriter; import org.eclipse.jpt.eclipselink2_0.core.tests.internal.context.EclipseLink2_0ContextModelTestCase; import org.eclipse.jpt.utility.internal.iterables.EmptyIterable; import org.eclipse.jpt.utility.internal.iterators.ArrayIterator; @@ -56,7 +61,128 @@ public class EclipseLink2_0JavaOneToManyMappingTests } }); } - + + private ICompilationUnit createTestEntityWithOneToManyMapping() throws Exception { + return this.createTestType(new DefaultAnnotationWriter() { + @Override + public Iterator<String> imports() { + return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_MANY); + } + @Override + public void appendTypeAnnotationTo(StringBuilder sb) { + sb.append("@Entity").append(CR); + } + + @Override + public void appendIdFieldAnnotationTo(StringBuilder sb) { + sb.append("@OneToMany").append(CR); + } + }); + } + + private ICompilationUnit createTestEntityWithValidGenericMapOneToManyMapping() throws Exception { + return this.createTestType(new DefaultAnnotationWriter() { + @Override + public Iterator<String> imports() { + return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_MANY, JPA.ID); + } + @Override + public void appendTypeAnnotationTo(StringBuilder sb) { + sb.append("@Entity").append(CR); + } + + @Override + public void appendIdFieldAnnotationTo(StringBuilder sb) { + sb.append(CR); + sb.append(" @OneToMany").append(CR); + sb.append(" private java.util.Map<String, Address> addresses;").append(CR); + sb.append(CR); + sb.append(" @Id").append(CR); + } + }); + } + + private ICompilationUnit createTestEntityWithValidNonGenericMapOneToManyMapping() throws Exception { + return this.createTestType(new DefaultAnnotationWriter() { + @Override + public Iterator<String> imports() { + return new ArrayIterator<String>(JPA.ENTITY, JPA.ONE_TO_MANY, JPA.ID); + } + @Override + public void appendTypeAnnotationTo(StringBuilder sb) { + sb.append("@Entity").append(CR); + } + + @Override + public void appendIdFieldAnnotationTo(StringBuilder sb) { + sb.append(CR); + sb.append(" @OneToMany").append(CR); + sb.append(" private java.util.Map addresses;").append(CR); + sb.append(CR); + sb.append(" @Id").append(CR); + } + }); + } + private void createTestTargetEntityAddress() throws Exception { + SourceWriter sourceWriter = new SourceWriter() { + public void appendSourceTo(StringBuilder sb) { + sb.append(CR); + sb.append("import "); + sb.append(JPA.ENTITY); + sb.append(";"); + sb.append(CR); + sb.append("import "); + sb.append(JPA.ID); + sb.append(";"); + sb.append(CR); + sb.append("import "); + sb.append(JPA.EMBEDDED); + sb.append(";"); + sb.append(CR); + sb.append("@Entity"); + sb.append(CR); + sb.append("public class ").append("Address").append(" "); + sb.append("{").append(CR); + sb.append(CR); + sb.append(" @Id").append(CR); + sb.append(" private int id;").append(CR); + sb.append(CR); + sb.append(" private String city;").append(CR); + sb.append(CR); + sb.append(" @Embedded").append(CR); + sb.append(" private State state;").append(CR); + sb.append(CR); + sb.append(" private int zip;").append(CR); + sb.append(CR); + sb.append("}").append(CR); + } + }; + this.javaProject.createCompilationUnit(PACKAGE_NAME, "Address.java", sourceWriter); + } + + private void createTestEmbeddableState() throws Exception { + SourceWriter sourceWriter = new SourceWriter() { + public void appendSourceTo(StringBuilder sb) { + sb.append(CR); + sb.append("import "); + sb.append(JPA.EMBEDDABLE); + sb.append(";"); + sb.append(CR); + sb.append("@Embeddable"); + sb.append(CR); + sb.append("public class ").append("State").append(" "); + sb.append("{").append(CR); + sb.append(CR); + sb.append(" private String foo;").append(CR); + sb.append(CR); + sb.append(" private Address address;").append(CR); + sb.append(CR); + sb.append("}").append(CR); + } + }; + this.javaProject.createCompilationUnit(PACKAGE_NAME, "State.java", sourceWriter); + } + private ICompilationUnit createTestEntityWithValidOneToManyMappingOrphanRemovalSpecified() throws Exception { return this.createTestType(new DefaultAnnotationWriter() { @Override @@ -223,4 +349,218 @@ public class EclipseLink2_0JavaOneToManyMappingTests assertNull(persistentAttribute.getSpecifiedMapping()); } + public void testUpdateMapKey() throws Exception { + createTestEntityWithOneToManyMapping(); + addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME); + + PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next(); + OneToManyMapping oneToManyMapping = (OneToManyMapping) persistentAttribute.getMapping(); + + JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME); + JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next(); + + assertNull(oneToManyMapping.getSpecifiedMapKey()); + assertNull(attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME)); + + //set mapKey in the resource model, verify context model does not change + attributeResource.addAnnotation(MapKeyAnnotation.ANNOTATION_NAME); + assertNull(oneToManyMapping.getSpecifiedMapKey()); + MapKeyAnnotation mapKey = (MapKeyAnnotation) attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME); + assertNotNull(mapKey); + + //set mapKey name in the resource model, verify context model updated + mapKey.setName("myMapKey"); + getJpaProject().synchronizeContextModel(); + + assertEquals("myMapKey", oneToManyMapping.getSpecifiedMapKey()); + assertEquals("myMapKey", mapKey.getName()); + + //set mapKey name to null in the resource model + mapKey.setName(null); + getJpaProject().synchronizeContextModel(); + + assertNull(oneToManyMapping.getSpecifiedMapKey()); + assertNull(mapKey.getName()); + + mapKey.setName("myMapKey"); + attributeResource.removeAnnotation(MapKeyAnnotation.ANNOTATION_NAME); + assertNull(oneToManyMapping.getSpecifiedMapKey()); + assertNull(attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME)); + } + + public void testModifyMapKey() throws Exception { + createTestEntityWithOneToManyMapping(); + addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME); + + PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next(); + OneToManyMapping oneToManyMapping = (OneToManyMapping) persistentAttribute.getMapping(); + + JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME); + JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next(); + + assertNull(oneToManyMapping.getSpecifiedMapKey()); + assertNull(attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME)); + + //set mapKey in the context model, verify resource model updated + oneToManyMapping.setSpecifiedMapKey("myMapKey"); + MapKeyAnnotation mapKey = (MapKeyAnnotation) attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME); + assertEquals("myMapKey", oneToManyMapping.getSpecifiedMapKey()); + assertEquals("myMapKey", mapKey.getName()); + + //set mapKey to null in the context model + oneToManyMapping.setSpecifiedMapKey(null); + assertNull(oneToManyMapping.getSpecifiedMapKey()); + assertNull(attributeResource.getAnnotation(MapKeyAnnotation.ANNOTATION_NAME)); + } + + public void testCandidateMapKeyNames() throws Exception { + createTestEntityWithValidGenericMapOneToManyMapping(); + createTestTargetEntityAddress(); + createTestEmbeddableState(); + + addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME); + addXmlClassRef(PACKAGE_NAME + ".Address"); + addXmlClassRef(PACKAGE_NAME + ".State"); + + JavaOneToManyMapping javaOneToManyMapping = (JavaOneToManyMapping) getJavaPersistentType().getAttributeNamed("addresses").getMapping(); + + Iterator<String> mapKeyNames = + javaOneToManyMapping.candidateMapKeyNames(); + assertEquals("id", mapKeyNames.next()); + assertEquals("city", mapKeyNames.next()); + assertEquals("state", mapKeyNames.next()); + assertEquals("state.foo", mapKeyNames.next()); + assertEquals("state.address", mapKeyNames.next()); + assertEquals("zip", mapKeyNames.next()); + assertFalse(mapKeyNames.hasNext()); + } + + public void testCandidateMapKeyNames2() throws Exception { + createTestEntityWithValidNonGenericMapOneToManyMapping(); + createTestTargetEntityAddress(); + createTestEmbeddableState(); + + addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME); + addXmlClassRef(PACKAGE_NAME + ".Address"); + addXmlClassRef(PACKAGE_NAME + ".State"); + + JavaOneToManyMapping javaOneToManyMapping = (JavaOneToManyMapping) getJavaPersistentType().getAttributeNamed("addresses").getMapping(); + + Iterator<String> mapKeyNames = javaOneToManyMapping.candidateMapKeyNames(); + assertEquals(false, mapKeyNames.hasNext()); + + javaOneToManyMapping.setSpecifiedTargetEntity("test.Address"); + mapKeyNames = javaOneToManyMapping.candidateMapKeyNames(); + assertEquals("id", mapKeyNames.next()); + assertEquals("city", mapKeyNames.next()); + assertEquals("state", mapKeyNames.next()); + assertEquals("state.foo", mapKeyNames.next()); + assertEquals("state.address", mapKeyNames.next()); + assertEquals("zip", mapKeyNames.next()); + assertFalse(mapKeyNames.hasNext()); + } + + public void testUpdateMapKeyClass() throws Exception { + createTestEntityWithValidGenericMapOneToManyMapping(); + addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME); + + PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next(); + OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping(); + + JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME); + JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next(); + + assertNull(oneToManyMapping.getSpecifiedMapKeyClass()); + assertNull(attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME)); + + //set mapKey in the resource model, verify context model does not change + attributeResource.addAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME); + assertNull(oneToManyMapping.getSpecifiedMapKeyClass()); + MapKeyClass2_0Annotation mapKeyClass = (MapKeyClass2_0Annotation) attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME); + assertNotNull(mapKeyClass); + + //set mapKey name in the resource model, verify context model updated + mapKeyClass.setValue("myMapKeyClass"); + assertEquals("myMapKeyClass", oneToManyMapping.getSpecifiedMapKeyClass()); + assertEquals("myMapKeyClass", mapKeyClass.getValue()); + + //set mapKey name to null in the resource model + mapKeyClass.setValue(null); + assertNull(oneToManyMapping.getSpecifiedMapKeyClass()); + assertNull(mapKeyClass.getValue()); + + mapKeyClass.setValue("myMapKeyClass"); + attributeResource.removeAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME); + getJpaProject().synchronizeContextModel(); + + assertNull(oneToManyMapping.getSpecifiedMapKeyClass()); + assertNull(attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME)); + } + + public void testModifyMapKeyClass() throws Exception { + createTestEntityWithValidGenericMapOneToManyMapping(); + addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME); + + PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next(); + OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping(); + + JavaResourcePersistentType typeResource = getJpaProject().getJavaResourcePersistentType(FULLY_QUALIFIED_TYPE_NAME); + JavaResourcePersistentAttribute attributeResource = typeResource.persistableAttributes().next(); + + assertNull(oneToManyMapping.getSpecifiedMapKeyClass()); + assertNull(attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME)); + + //set mapKey in the context model, verify resource model updated + oneToManyMapping.setSpecifiedMapKeyClass("String"); + MapKeyClass2_0Annotation mapKeyClass = (MapKeyClass2_0Annotation) attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME); + assertEquals("String", oneToManyMapping.getSpecifiedMapKeyClass()); + assertEquals("String", mapKeyClass.getValue()); + + //set mapKey to null in the context model + oneToManyMapping.setSpecifiedMapKeyClass(null); + assertNull(oneToManyMapping.getSpecifiedMapKeyClass()); + assertNull(attributeResource.getAnnotation(MapKeyClass2_0Annotation.ANNOTATION_NAME)); + } + + public void testDefaultMapKeyClass() throws Exception { + createTestEntityWithValidGenericMapOneToManyMapping(); + createTestTargetEntityAddress(); + createTestEmbeddableState(); + addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME); + + PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next(); + OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping(); + + assertEquals("java.lang.String", oneToManyMapping.getDefaultMapKeyClass()); + + //test default still the same when specified target entity it set + oneToManyMapping.setSpecifiedMapKeyClass("foo"); + assertEquals("java.lang.String", oneToManyMapping.getDefaultMapKeyClass()); + } + + public void testDefaultMapKeyClassCollectionType() throws Exception { + createTestEntityWithValidOneToManyMappingOrphanRemovalSpecified(); + addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME); + + PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next(); + OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping(); + + assertNull(oneToManyMapping.getDefaultMapKeyClass()); + } + + public void testMapKeyClass() throws Exception { + createTestEntityWithValidGenericMapOneToManyMapping(); + addXmlClassRef(FULLY_QUALIFIED_TYPE_NAME); + + PersistentAttribute persistentAttribute = getJavaPersistentType().attributes().next(); + OneToManyMapping2_0 oneToManyMapping = (OneToManyMapping2_0) persistentAttribute.getMapping(); + + assertEquals("java.lang.String", oneToManyMapping.getMapKeyClass()); + + oneToManyMapping.setSpecifiedMapKeyClass("foo"); + assertEquals("foo", oneToManyMapping.getMapKeyClass()); + + oneToManyMapping.setSpecifiedMapKeyClass(null); + assertEquals("java.lang.String", oneToManyMapping.getMapKeyClass()); + } } |