Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java342
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());
+ }
}

Back to the top