Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/resource/java/JavaPersistentAttributeResourceTests.java')
-rw-r--r--jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/resource/java/JavaPersistentAttributeResourceTests.java825
1 files changed, 825 insertions, 0 deletions
diff --git a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/resource/java/JavaPersistentAttributeResourceTests.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/resource/java/JavaPersistentAttributeResourceTests.java
new file mode 100644
index 0000000000..0783fbaca6
--- /dev/null
+++ b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/resource/java/JavaPersistentAttributeResourceTests.java
@@ -0,0 +1,825 @@
+/*******************************************************************************
+ * Copyright (c) 2007 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.core.tests.internal.resource.java;
+
+import java.util.Collection;
+import java.util.Iterator;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jpt.core.internal.jdtutility.JDTTools;
+import org.eclipse.jpt.core.internal.resource.java.AttributeOverride;
+import org.eclipse.jpt.core.internal.resource.java.Basic;
+import org.eclipse.jpt.core.internal.resource.java.Column;
+import org.eclipse.jpt.core.internal.resource.java.Id;
+import org.eclipse.jpt.core.internal.resource.java.IdImpl;
+import org.eclipse.jpt.core.internal.resource.java.JPA;
+import org.eclipse.jpt.core.internal.resource.java.JavaPersistentAttributeResource;
+import org.eclipse.jpt.core.internal.resource.java.JavaPersistentTypeResource;
+import org.eclipse.jpt.core.internal.resource.java.JavaResource;
+import org.eclipse.jpt.core.internal.resource.java.OneToMany;
+import org.eclipse.jpt.core.internal.resource.java.OneToOneImpl;
+import org.eclipse.jpt.utility.internal.ClassTools;
+import org.eclipse.jpt.utility.internal.CollectionTools;
+import org.eclipse.jpt.utility.internal.iterators.ArrayIterator;
+
+
+public class JavaPersistentAttributeResourceTests extends JavaResourceModelTestCase {
+
+ public JavaPersistentAttributeResourceTests(String name) {
+ super(name);
+ }
+
+ private IType createTestEntity() throws Exception {
+ this.createAnnotationAndMembers("Entity", "String name();");
+
+ return this.createTestType(new DefaultAnnotationWriter() {
+ @Override
+ public Iterator<String> imports() {
+ return new ArrayIterator<String>(JPA.ENTITY);
+ }
+ @Override
+ public void appendTypeAnnotationTo(StringBuilder sb) {
+ sb.append("@Entity");
+ }
+ });
+ }
+
+ private IType createTestEntityWithNonResolvingField() throws Exception {
+ this.createAnnotationAndMembers("Entity", "String name();");
+
+ return this.createTestType(new DefaultAnnotationWriter() {
+ @Override
+ public Iterator<String> imports() {
+ return new ArrayIterator<String>(JPA.ENTITY);
+ }
+ @Override
+ public void appendTypeAnnotationTo(StringBuilder sb) {
+ sb.append("@Entity");
+ }
+
+ @Override
+ public void appendIdFieldAnnotationTo(StringBuilder sb) {
+ sb.append("private Foo foo;").append(CR);
+ sb.append(CR);
+ }
+ });
+ }
+ private IType createTestEntityWithNonResolvingMethod() throws Exception {
+ this.createAnnotationAndMembers("Entity", "String name();");
+
+ return this.createTestType(new DefaultAnnotationWriter() {
+ @Override
+ public Iterator<String> imports() {
+ return new ArrayIterator<String>(JPA.ENTITY);
+ }
+ @Override
+ public void appendTypeAnnotationTo(StringBuilder sb) {
+ sb.append("@Entity");
+ }
+
+ @Override
+ public void appendIdFieldAnnotationTo(StringBuilder sb) {
+ sb.append("private Foo foo;").append(CR);
+ sb.append(CR);
+ sb.append(" @Id");
+ sb.append(CR);
+ sb.append(" public Foo getFoo() {").append(CR);
+ sb.append(" return this.foo;").append(CR);
+ sb.append(" }").append(CR);
+ sb.append(CR);
+ sb.append(" ");
+ sb.append(CR);
+ sb.append(" public void setFoo(Foo foo) {").append(CR);
+ sb.append(" this.foo = foo;").append(CR);
+ sb.append(" }").append(CR);
+ sb.append(CR);
+ sb.append(" ");
+ }
+ });
+ }
+
+ private IType createTestEntityMultipleVariableDeclarationsPerLine() throws Exception {
+ this.createAnnotationAndMembers("Entity", "String name();");
+ this.createAnnotationAndMembers("Column", "String name();");
+
+ return this.createTestType(new DefaultAnnotationWriter() {
+ @Override
+ public Iterator<String> imports() {
+ return new ArrayIterator<String>(JPA.ENTITY, JPA.ID, JPA.COLUMN);
+ }
+ @Override
+ public void appendTypeAnnotationTo(StringBuilder sb) {
+ sb.append("@Entity");
+ }
+
+ @Override
+ public void appendIdFieldAnnotationTo(StringBuilder sb) {
+ sb.append(CR);
+ sb.append(" ");
+ sb.append("@Id");
+ sb.append(CR);
+ sb.append(" ");
+ sb.append("@Column(name=\"baz\")");
+ sb.append(" private String foo, bar;").append(CR);
+ sb.append(CR);
+ }
+ });
+ }
+
+ private IType createTestEntityWithIdAndBasic() throws Exception {
+ this.createAnnotationAndMembers("Entity", "String name();");
+ this.createAnnotationAndMembers("Id", "");
+ this.createAnnotationAndMembers("Basic", "");
+ return this.createTestType(new DefaultAnnotationWriter() {
+ @Override
+ public Iterator<String> imports() {
+ return new ArrayIterator<String>(JPA.ENTITY, JPA.ID, JPA.BASIC);
+ }
+ @Override
+ public void appendTypeAnnotationTo(StringBuilder sb) {
+ sb.append("@Entity");
+ }
+
+ @Override
+ public void appendIdFieldAnnotationTo(StringBuilder sb) {
+ sb.append("@Id");
+ sb.append(CR);
+ sb.append("@Basic");
+ }
+ });
+ }
+
+ private IType createTestEntityAnnotatedField() throws Exception {
+ this.createAnnotationAndMembers("Entity", "String name();");
+ this.createAnnotationAndMembers("Column", "String name();");
+ this.createAnnotationAndMembers("Id", "String name();");
+
+ return this.createTestType(new DefaultAnnotationWriter() {
+ @Override
+ public Iterator<String> imports() {
+ return new ArrayIterator<String>(JPA.ENTITY, JPA.ID, JPA.COLUMN);
+ }
+ @Override
+ public void appendTypeAnnotationTo(StringBuilder sb) {
+ sb.append("@Entity");
+ }
+
+ @Override
+ public void appendIdFieldAnnotationTo(StringBuilder sb) {
+ sb.append("@Id");
+ sb.append(CR);
+ sb.append(" ");
+ sb.append("@Column");
+ }
+ });
+ }
+
+ private IType createTestEntityWithColumn() throws Exception {
+ this.createAnnotationAndMembers("Entity", "String name();");
+ this.createAnnotationAndMembers("Column", "String name(); String table();");
+ return this.createTestType(new DefaultAnnotationWriter() {
+ @Override
+ public Iterator<String> imports() {
+ return new ArrayIterator<String>(JPA.ENTITY, JPA.COLUMN);
+ }
+ @Override
+ public void appendTypeAnnotationTo(StringBuilder sb) {
+ sb.append("@Entity");
+ }
+
+ @Override
+ public void appendIdFieldAnnotationTo(StringBuilder sb) {
+ sb.append("@Column(name=\"FOO\", table=\"MY_TABLE\")");
+ }
+ });
+ }
+
+ private IType createTestEntityWithIdColumnGeneratedValue() throws Exception {
+ this.createAnnotationAndMembers("Entity", "String name();");
+ this.createAnnotationAndMembers("Column", "String name(); String table();");
+ this.createAnnotationAndMembers("GeneratedValue", "");
+ this.createAnnotationAndMembers("Id", "");
+ return this.createTestType(new DefaultAnnotationWriter() {
+ @Override
+ public Iterator<String> imports() {
+ return new ArrayIterator<String>(JPA.ENTITY, JPA.COLUMN, JPA.ID, JPA.GENERATED_VALUE);
+ }
+ @Override
+ public void appendTypeAnnotationTo(StringBuilder sb) {
+ sb.append("@Entity");
+ }
+ @Override
+ public void appendIdFieldAnnotationTo(StringBuilder sb) {
+ sb.append("@Id");
+ sb.append(CR);
+ sb.append("@Column");
+ sb.append(CR);
+ sb.append("@GeneratedValue");
+ }
+ });
+ }
+
+
+ private IType createTestEntityMultipleColumns() throws Exception {
+ this.createAnnotationAndMembers("Entity", "String name();");
+ this.createAnnotationAndMembers("Column", "String name();");
+ return this.createTestType(new DefaultAnnotationWriter() {
+ @Override
+ public Iterator<String> imports() {
+ return new ArrayIterator<String>(JPA.ENTITY, JPA.COLUMN);
+ }
+ @Override
+ public void appendTypeAnnotationTo(StringBuilder sb) {
+ sb.append("@Entity");
+ }
+
+ @Override
+ public void appendIdFieldAnnotationTo(StringBuilder sb) {
+ sb.append("@Column(name=\"FOO\")");
+ sb.append(CR);
+ sb.append("@Column(name=\"BAR\")");
+ }
+ });
+ }
+
+ private IType createTestEmbeddedWithAttributeOverride() throws Exception {
+ this.createAnnotationAndMembers("Embedded", "String name();");
+ this.createAnnotationAndMembers("AttributeOverride", "String name();");
+ return this.createTestType(new DefaultAnnotationWriter() {
+ @Override
+ public Iterator<String> imports() {
+ return new ArrayIterator<String>(JPA.EMBEDDED, JPA.ATTRIBUTE_OVERRIDE);
+ }
+ @Override
+ public void appendIdFieldAnnotationTo(StringBuilder sb) {
+ sb.append("@Embedded");
+ sb.append(CR);
+ sb.append("@AttributeOverride(name=\"FOO\")");
+ }
+ });
+ }
+ private IType createTestEmbeddedWithAttributeOverrides() throws Exception {
+ this.createAnnotationAndMembers("Embedded", "String name();");
+ this.createAnnotationAndMembers("AttributeOverride", "String name();");
+ this.createAnnotationAndMembers("AttributeOverrides", "AttributeOverride[] value();");
+ return this.createTestType(new DefaultAnnotationWriter() {
+ @Override
+ public Iterator<String> imports() {
+ return new ArrayIterator<String>(JPA.EMBEDDED, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+ }
+ @Override
+ public void appendIdFieldAnnotationTo(StringBuilder sb) {
+ sb.append("@Embedded");
+ sb.append(CR);
+ sb.append("@AttributeOverrides(@AttributeOverride(name=\"FOO\"))");
+ }
+ });
+ }
+ private IType createTestEmbeddedWithAttributeOverridesEmpty() throws Exception {
+ this.createAnnotationAndMembers("Embedded", "String name();");
+ this.createAnnotationAndMembers("AttributeOverrides", "AttributeOverride[] value();");
+ return this.createTestType(new DefaultAnnotationWriter() {
+ @Override
+ public Iterator<String> imports() {
+ return new ArrayIterator<String>(JPA.EMBEDDED, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+ }
+ @Override
+ public void appendIdFieldAnnotationTo(StringBuilder sb) {
+ sb.append("@Embedded");
+ sb.append(CR);
+ sb.append("@AttributeOverrides()");
+ }
+ });
+ }
+
+ private IType createTestEmbeddedWith2AttributeOverrides() throws Exception {
+ this.createAnnotationAndMembers("Embedded", "String name();");
+ this.createAnnotationAndMembers("AttributeOverride", "String name();");
+ this.createAnnotationAndMembers("AttributeOverrides", "AttributeOverride[] value();");
+ return this.createTestType(new DefaultAnnotationWriter() {
+ @Override
+ public Iterator<String> imports() {
+ return new ArrayIterator<String>(JPA.EMBEDDED, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+ }
+ @Override
+ public void appendIdFieldAnnotationTo(StringBuilder sb) {
+ sb.append("@Embedded");
+ sb.append(CR);
+ sb.append("@AttributeOverrides({@AttributeOverride(name=\"FOO\"), @AttributeOverride(name=\"BAR\")})");
+ }
+ });
+ }
+
+ private IType createTestEmbeddedWithAttributeOverrideAndAttributeOverrides() throws Exception {
+ this.createAnnotationAndMembers("Embedded", "String name();");
+ this.createAnnotationAndMembers("AttributeOverride", "String name();");
+ this.createAnnotationAndMembers("AttributeOverrides", "AttributeOverride[] value();");
+ return this.createTestType(new DefaultAnnotationWriter() {
+ @Override
+ public Iterator<String> imports() {
+ return new ArrayIterator<String>(JPA.EMBEDDED, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+ }
+ @Override
+ public void appendIdFieldAnnotationTo(StringBuilder sb) {
+ sb.append("@Embedded");
+ sb.append(CR);
+ sb.append("@AttributeOverride(name=\"FOO\")");
+ sb.append(CR);
+ sb.append("@AttributeOverrides({@AttributeOverride(name=\"BAR\"), @AttributeOverride(name=\"BAZ\")})");
+ }
+ });
+ }
+
+ public void testJavaAttributeAnnotations() throws Exception {
+ IType testType = this.createTestEntityWithColumn();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(testType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+ assertEquals(1, CollectionTools.size(attributeResource.annotations()));
+ }
+
+ public void testJavaAttributeAnnotation() throws Exception {
+ IType testType = this.createTestEntityWithColumn();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(testType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+ assertNotNull(attributeResource.annotation(JPA.COLUMN));
+ }
+
+ public void testJavaAttributeAnnotationNull() throws Exception {
+ IType testType = this.createTestEntity();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(testType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+ assertNull(attributeResource.annotation(JPA.TABLE));
+ }
+
+ //This will result in a compilation error, but we assume the first column found
+ public void testDuplicateAnnotations() throws Exception {
+ IType testType = this.createTestEntityMultipleColumns();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(testType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+ Column columnResource = (Column) attributeResource.annotation(JPA.COLUMN);
+ assertEquals("FOO", columnResource.getName());
+ }
+
+ public void testRemoveColumn() throws Exception {
+ IType testType = this.createTestEntityWithColumn();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(testType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+ attributeResource.removeAnnotation(JPA.COLUMN);
+
+ assertSourceDoesNotContain("@Column");
+ }
+
+ public void testRemoveColumnName() throws Exception {
+ IType testType = this.createTestEntityWithColumn();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(testType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+
+ Column columnResource = (Column) attributeResource.annotation(JPA.COLUMN);
+ columnResource.setTable(null);
+ assertSourceContains("@Column(name=\"FOO\")");
+
+ columnResource.setName(null);
+ assertSourceDoesNotContain("@Column");
+
+ //TODO should I be calling this in the test? where should the IElementChangedListener be set up?
+ typeResource.updateFromJava(JDTTools.buildASTRoot(jdtType()));
+ assertNull(typeResource.annotation(JPA.TABLE));
+ }
+
+ public void testMultipleAttributeMappings() throws Exception {
+ IType testType = this.createTestEntityWithIdAndBasic();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(testType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+
+ assertEquals(2, CollectionTools.size(attributeResource.mappingAnnotations()));
+ assertEquals(0, CollectionTools.size(attributeResource.annotations()));
+ assertNotNull(attributeResource.mappingAnnotation(JPA.BASIC));
+ assertNotNull(attributeResource.mappingAnnotation(JPA.ID));
+
+ JavaResource javaAttributeMappingAnnotation = attributeResource.mappingAnnotation();
+ assertTrue(javaAttributeMappingAnnotation instanceof Basic);
+ assertSourceContains("@Basic");
+ assertSourceContains("@Id");
+
+ attributeResource.setMappingAnnotation(JPA.ONE_TO_MANY);
+ assertEquals(1, CollectionTools.size(attributeResource.mappingAnnotations()));
+ javaAttributeMappingAnnotation = attributeResource.mappingAnnotation();
+ assertTrue(javaAttributeMappingAnnotation instanceof OneToMany);
+ assertSourceDoesNotContain("@Id");
+ assertSourceContains("@OneToMany");
+ assertSourceDoesNotContain("@Basic");
+ }
+
+ public void testSetJavaAttributeMappingAnnotation() throws Exception {
+ IType testType = createTestType();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(testType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+ assertEquals(0, CollectionTools.size(attributeResource.mappingAnnotations()));
+
+ attributeResource.setMappingAnnotation(JPA.ID);
+ assertTrue(attributeResource.mappingAnnotation() instanceof Id);
+ assertSourceContains("@Id");
+
+ attributeResource.setMappingAnnotation(JPA.ID);
+ //TODO need to test behavior here, throw an exception, remove the old @Id and replace it,
+ //thus clearing out any annotation elements??
+ }
+
+ public void testSetJavaAttributeMappingAnnotation2() throws Exception {
+ IType testType = createTestEntityWithColumn();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(testType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+ assertNull(attributeResource.mappingAnnotation());
+
+ attributeResource.setMappingAnnotation(JPA.ID);
+ assertTrue(attributeResource.mappingAnnotation() instanceof Id);
+
+ assertSourceContains("@Id");
+ assertSourceContains("@Column");
+ }
+
+ public void testSetJavaAttributeMappingAnnotation3() throws Exception {
+ IType testType = createTestEntityWithIdColumnGeneratedValue();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(testType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+ assertTrue(attributeResource.mappingAnnotation() instanceof Id);
+
+ attributeResource.setMappingAnnotation(JPA.BASIC);
+ assertTrue(attributeResource.mappingAnnotation() instanceof Basic);
+
+ assertSourceDoesNotContain("@Id");
+ assertSourceContains("@GeneratedValue"); //not supported by Basic
+ assertSourceContains("@Column"); //common between Id and Basic
+ }
+
+ public void testSetJavaAttributeMappingAnnotationNull() throws Exception {
+ IType testType = createTestEntityWithIdColumnGeneratedValue();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(testType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+ assertTrue(attributeResource.mappingAnnotation() instanceof Id);
+
+ attributeResource.setMappingAnnotation(null);
+ assertNull(attributeResource.mappingAnnotation());
+
+ assertSourceDoesNotContain("@Id");
+ assertSourceContains("@GeneratedValue"); //not supported by Basic
+ assertSourceContains("@Column"); //common between Id and Basic
+ }
+
+ public void testAddJavaAttributeAnnotation() throws Exception {
+ IType testType = createTestEntity();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(testType);
+
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+
+ assertSourceDoesNotContain("@Column");
+ attributeResource.addAnnotation(JPA.COLUMN);
+ assertSourceContains("@Column");
+ }
+
+ public void testRemoveJavaAttributeAnnotation() throws Exception {
+ IType testType = createTestEntityAnnotatedField();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(testType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+ assertSourceContains("@Column");
+ attributeResource.removeAnnotation(JPA.COLUMN);
+ assertSourceDoesNotContain("@Column");
+ }
+
+
+ //update source code to change from @Id to @OneToOne and make sure @Column is not removed
+ public void testChangeAttributeMappingInSource() throws Exception {
+ IType jdtType = createTestEntityAnnotatedField();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(jdtType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+
+ idField().removeAnnotation(((IdImpl) attributeResource.mappingAnnotation()).getDeclarationAnnotationAdapter());
+
+ this.createAnnotationAndMembers("OneToOne", "");
+ jdtType.getCompilationUnit().createImport("javax.persistence.OneToOne", null, new NullProgressMonitor());
+
+ idField().newMarkerAnnotation(OneToOneImpl.DECLARATION_ANNOTATION_ADAPTER);
+
+ typeResource.updateFromJava(JDTTools.buildASTRoot(jdtType));
+
+
+ assertNotNull(attributeResource.annotation(JPA.COLUMN));
+ assertNull(attributeResource.mappingAnnotation(JPA.ID));
+ assertNotNull(attributeResource.mappingAnnotation(JPA.ONE_TO_ONE));
+ assertSourceContains("@Column");
+ }
+
+ public void testJavaAttributeAnnotationsNestable() throws Exception {
+ IType jdtType = createTestEmbeddedWithAttributeOverride();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(jdtType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+
+ assertEquals(1, CollectionTools.size(attributeResource.annotations(JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES)));
+
+ AttributeOverride attributeOverride = (AttributeOverride) attributeResource.annotations(JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES).next();
+
+ assertEquals("FOO", attributeOverride.getName());
+ }
+
+ public void testJavaAttributeAnnotationsNoNestable() throws Exception {
+ IType jdtType = createTestEntity();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(jdtType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+
+ assertEquals(0, CollectionTools.size(attributeResource.annotations(JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES)));
+ }
+
+ public void testJavaAttributeAnnotationsContainerNoNestable() throws Exception {
+ IType jdtType = createTestEmbeddedWithAttributeOverridesEmpty();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(jdtType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+
+ assertEquals(0, CollectionTools.size(attributeResource.annotations(JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES)));
+ }
+
+ public void testJavaAttributeAnnotationsNestableAndContainer() throws Exception {
+ IType jdtType = createTestEmbeddedWithAttributeOverrideAndAttributeOverrides();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(jdtType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+ assertNotNull(attributeResource.annotation(JPA.ATTRIBUTE_OVERRIDE));
+ assertNotNull(attributeResource.annotation(JPA.ATTRIBUTE_OVERRIDES));
+ assertEquals(2, CollectionTools.size(attributeResource.annotations(JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES)));
+
+ AttributeOverride attributeOverrideResource = (AttributeOverride) attributeResource.annotations(JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES).next();
+ assertEquals("BAR", attributeOverrideResource.getName());
+ }
+
+ // -->> @AttributeOverride(name="FOO")
+ public void testAddJavaAttributeAnnotationNestableContainer() throws Exception {
+ IType jdtType = createTestEntity();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(jdtType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+ AttributeOverride attributeOverride = (AttributeOverride) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+ attributeOverride.setName("FOO");
+ assertSourceContains("@AttributeOverride(name=\"FOO\")");
+ }
+
+ // @Embedded -->> @Embedded
+ // @AttributeOverride(name="FOO") @AttributeOverrides({@AttributeOverride(name="FOO"), @AttributeOverride(name="BAR")})
+ public void testAddJavaAttributeAnnotationNestableContainer2() throws Exception {
+ IType jdtType = createTestEmbeddedWithAttributeOverride();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(jdtType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+
+ AttributeOverride attributeOverride = (AttributeOverride) attributeResource.addAnnotation(1, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+ attributeOverride.setName("BAR");
+ assertSourceContains("@AttributeOverrides({@AttributeOverride(name=\"FOO\"),@AttributeOverride(name=\"BAR\")})");
+
+ assertNull(attributeResource.annotation(JPA.ATTRIBUTE_OVERRIDE));
+ assertNotNull(attributeResource.annotation(JPA.ATTRIBUTE_OVERRIDES));
+ assertEquals(2, CollectionTools.size(attributeResource.annotations(JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES)));
+ }
+
+ // @Embedded
+ // @AttributeOverrides(@AttributeOverride(name="FOO"))
+ // ||
+ // \/
+ // @Embedded
+ // @AttributeOverrides({@AttributeOverride(name="FOO"), @AttributeOverride(name="BAR")})
+ public void testAddJavaAttributeAnnotationNestableContainer3() throws Exception {
+ IType jdtType = createTestEmbeddedWithAttributeOverrides();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(jdtType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+
+ AttributeOverride attributeOverride = (AttributeOverride) attributeResource.addAnnotation(1, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+ attributeOverride.setName("BAR");
+ assertSourceContains("@AttributeOverrides({@AttributeOverride(name=\"FOO\"),@AttributeOverride(name=\"BAR\")})");
+
+ assertNull(attributeResource.annotation(JPA.ATTRIBUTE_OVERRIDE));
+ assertNotNull(attributeResource.annotation(JPA.ATTRIBUTE_OVERRIDES));
+ assertEquals(2, CollectionTools.size(attributeResource.annotations(JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES)));
+ }
+
+ public void testAddJavaAttributeAnnotationNestableContainer5() throws Exception {
+ IType jdtType = createTestEmbeddedWithAttributeOverrides();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(jdtType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+
+ AttributeOverride attributeOverride = (AttributeOverride) attributeResource.addAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+ attributeOverride.setName("BAR");
+ assertSourceContains("@AttributeOverrides({@AttributeOverride(name=\"BAR\"),@AttributeOverride(name=\"FOO\")})");
+
+ assertNull(attributeResource.annotation(JPA.ATTRIBUTE_OVERRIDE));
+ assertNotNull(attributeResource.annotation(JPA.ATTRIBUTE_OVERRIDES));
+ assertEquals(2, CollectionTools.size(attributeResource.annotations(JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES)));
+ }
+
+ // @Embedded
+ // @SecondaryTable(name=\"FOO\")
+ // @AttributeOverrides({@AttributeOverride(name=\"BAR\"), @AttributeOverride(name=\"BAZ\")})
+ // ||
+ // \/
+ // @Embedded
+ // @AttributeOverride(name=\"FOO\")
+ // @AttributeOverrides({@AttributeOverride(name=\"BAR\"), @AttributeOverride(name=\"BAZ\"), @AttributeOverride(name=\"BOO\")})
+ public void testAddJavaAttributeAnnotationNestableContainer4() throws Exception {
+ IType jdtType = createTestEmbeddedWithAttributeOverrideAndAttributeOverrides();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(jdtType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+
+ assertNotNull(attributeResource.annotation(JPA.ATTRIBUTE_OVERRIDE));
+ assertNotNull(attributeResource.annotation(JPA.ATTRIBUTE_OVERRIDES));
+ assertEquals(2, CollectionTools.size(attributeResource.annotations(JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES)));
+
+ AttributeOverride attributeOverride = (AttributeOverride) attributeResource.addAnnotation(2, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+ assertSourceContains("@AttributeOverrides({@AttributeOverride(name=\"BAR\"), @AttributeOverride(name=\"BAZ\"),");
+ assertSourceContains("@AttributeOverride})");
+ attributeOverride.setName("BOO");
+
+ assertNotNull(attributeResource.annotation(JPA.ATTRIBUTE_OVERRIDE));
+ assertNotNull(attributeResource.annotation(JPA.ATTRIBUTE_OVERRIDES));
+ assertEquals(3, CollectionTools.size(attributeResource.annotations(JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES)));
+
+ Iterator<JavaResource> attributeOverrideAnnotations = attributeResource.annotations(JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+ attributeOverride = (AttributeOverride) attributeOverrideAnnotations.next();
+ assertEquals("BAR", attributeOverride.getName());
+ attributeOverride = (AttributeOverride) attributeOverrideAnnotations.next();
+ assertEquals("BAZ", attributeOverride.getName());
+ attributeOverride = (AttributeOverride) attributeOverrideAnnotations.next();
+ assertEquals("BOO", attributeOverride.getName());
+
+ assertSourceContains("@AttributeOverrides({@AttributeOverride(name=\"BAR\"), @AttributeOverride(name=\"BAZ\"),");
+ assertSourceContains("@AttributeOverride(name=\"BOO\")})");
+ }
+
+ //@Entity
+ //@AttributeOverride(name="FOO")
+ public void testRemoveJavaAttributeAnnotationNestableContainer() throws Exception {
+ IType jdtType = createTestEmbeddedWithAttributeOverride();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(jdtType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+
+ attributeResource.removeAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+
+ assertSourceDoesNotContain("@AttributeOverride");
+ }
+
+
+ //@Entity
+ //@SecondaryTables(@SecondaryTable(name="FOO"))
+ public void testRemoveJavaAttributeAnnotationNestableContainer2() throws Exception {
+ IType jdtType = createTestEmbeddedWithAttributeOverrides();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(jdtType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+
+ attributeResource.removeAnnotation(0, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+
+ assertSourceDoesNotContain("@AttributeOverride");
+ assertSourceDoesNotContain("@AttributeOverrides");
+ }
+
+ public void testRemoveJavaAttributeAnnotationIndex() throws Exception {
+ IType jdtType = createTestEmbeddedWith2AttributeOverrides();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(jdtType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+
+ attributeResource.removeAnnotation(0, JPA.ATTRIBUTE_OVERRIDE , JPA.ATTRIBUTE_OVERRIDES);
+
+ assertSourceDoesNotContain("@AttributeOverride(name=\"FOO\"");
+ assertSourceContains("@AttributeOverride(name=\"BAR\"");
+ assertSourceDoesNotContain("@AttributeOverrides");
+ }
+
+ public void testRemoveJavaAttributeAnnotationIndex2() throws Exception {
+ IType jdtType = createTestEmbeddedWith2AttributeOverrides();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(jdtType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+
+ AttributeOverride newAnnotation = (AttributeOverride)attributeResource.addAnnotation(2, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+ newAnnotation.setName("BAZ");
+ assertSourceContains("@AttributeOverrides({@AttributeOverride(name=\"FOO\"), @AttributeOverride(name=\"BAR\"),");
+ assertSourceContains("@AttributeOverride(name=\"BAZ\")})");
+
+ attributeResource.removeAnnotation(1, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+ assertSourceContains("@AttributeOverrides({@AttributeOverride(name=\"FOO\"), @AttributeOverride(name=\"BAZ\")})");
+ }
+
+ public void testMoveJavaTypeAnnotation() throws Exception {
+ IType jdtType = createTestEmbeddedWith2AttributeOverrides();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(jdtType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+
+ AttributeOverride newAnnotation = (AttributeOverride)attributeResource.addAnnotation(2, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+ newAnnotation.setName("BAZ");
+ assertSourceContains("@AttributeOverrides({@AttributeOverride(name=\"FOO\"), @AttributeOverride(name=\"BAR\"),");
+ assertSourceContains("@AttributeOverride(name=\"BAZ\")})");
+
+
+ attributeResource.move(0, 2, JPA.ATTRIBUTE_OVERRIDES);
+ assertSourceContains("@AttributeOverrides({@AttributeOverride(name=\"BAZ\"), @AttributeOverride(name=\"FOO\"),");
+ assertSourceContains("@AttributeOverride(name=\"BAR\")})");
+ }
+
+ public void testMoveJavaTypeAnnotation2() throws Exception {
+ IType jdtType = createTestEmbeddedWith2AttributeOverrides();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(jdtType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+
+ AttributeOverride newAnnotation = (AttributeOverride) attributeResource.addAnnotation(2, JPA.ATTRIBUTE_OVERRIDE, JPA.ATTRIBUTE_OVERRIDES);
+ newAnnotation.setName("BAZ");
+ assertSourceContains("@AttributeOverrides({@AttributeOverride(name=\"FOO\"), @AttributeOverride(name=\"BAR\"),");
+ assertSourceContains("@AttributeOverride(name=\"BAZ\")})");
+
+ attributeResource.move(1, 0, JPA.ATTRIBUTE_OVERRIDES);
+ assertSourceContains("@AttributeOverrides({@AttributeOverride(name=\"BAR\"), @AttributeOverride(name=\"FOO\"),");
+ assertSourceContains("@AttributeOverride(name=\"BAZ\")})");
+ }
+
+ //more detailed tests in JPTToolsTests
+ public void testIsPersistableField() throws Exception {
+ IType jdtType = createTestEntity();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(jdtType);
+ JavaPersistentAttributeResource attributeResource = typeResource.fields().next();
+
+ assertTrue(attributeResource.isPersistable());
+ }
+
+ public void testIsPersistableField2() throws Exception {
+ IType jdtType = createTestEntityWithNonResolvingField();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(jdtType);
+ Collection<JavaPersistentAttributeResource> attributes = (Collection<JavaPersistentAttributeResource>) ClassTools.fieldValue(typeResource, "attributes");
+ JavaPersistentAttributeResource attributeResource = attributes.iterator().next();
+
+ assertEquals("foo", attributeResource.getName());
+ assertTrue(attributeResource.isForField());
+ assertFalse(attributeResource.isPersistable());
+
+ this.javaProject.createType("test", "Foo.java", "public class Foo {}");
+ this.javaResourceModel.resolveTypes();
+
+ assertTrue(attributeResource.isPersistable());
+ }
+
+ public void testGetQualifiedTypeName() throws Exception {
+ IType jdtType = createTestEntityWithNonResolvingField();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(jdtType);
+ Collection<JavaPersistentAttributeResource> attributes = (Collection<JavaPersistentAttributeResource>) ClassTools.fieldValue(typeResource, "attributes");
+ JavaPersistentAttributeResource attributeResource = attributes.iterator().next();
+
+ assertEquals("foo", attributeResource.getName());
+ assertNull(attributeResource.getQualifiedTypeName());
+
+ this.javaProject.createType("test", "Foo.java", "public class Foo {}");
+ this.javaResourceModel.resolveTypes();
+
+ assertEquals("test.Foo", attributeResource.getQualifiedTypeName());
+ }
+
+
+ //more detailed tests in JPTToolsTests
+ public void testIsPersistableMethod() throws Exception {
+ IType jdtType = createTestEntity();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(jdtType);
+ JavaPersistentAttributeResource attributeResource = typeResource.properties().next();
+
+ assertTrue(attributeResource.isPersistable());
+ }
+
+ public void testIsPersistableMethod2() throws Exception {
+ IType jdtType = createTestEntityWithNonResolvingMethod();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(jdtType);
+ Collection<JavaPersistentAttributeResource> attributes = (Collection<JavaPersistentAttributeResource>) ClassTools.fieldValue(typeResource, "attributes");
+ JavaPersistentAttributeResource attributeResource = (JavaPersistentAttributeResource) attributes.toArray()[3];
+
+ assertEquals("foo", attributeResource.getName());
+ assertTrue(attributeResource.isForProperty());
+ assertFalse(attributeResource.isPersistable());
+
+ this.javaProject.createType("test", "Foo.java", "public class Foo {}");
+ this.javaResourceModel.resolveTypes();
+
+ assertTrue(attributeResource.isPersistable());
+ }
+
+ //this tests that we handle mutliple variable declarations in one line.
+ //The annotations should apply to all fields defined. This is not really a useful
+ //thing to do with JPA beyond the most basic things that use default column names
+ public void testMultipleVariableDeclarationsPerLine() throws Exception {
+ IType jdtType = createTestEntityMultipleVariableDeclarationsPerLine();
+ JavaPersistentTypeResource typeResource = buildJavaTypeResource(jdtType);
+
+ assertEquals(4, CollectionTools.size(typeResource.fields()));
+ Iterator<JavaPersistentAttributeResource> fields = typeResource.fields();
+ JavaPersistentAttributeResource attributeResource = fields.next();
+ Column column = (Column) attributeResource.annotation(JPA.COLUMN);
+ assertEquals("baz", column.getName());
+
+ attributeResource = fields.next();
+ column = (Column) attributeResource.annotation(JPA.COLUMN);
+ assertEquals("baz", column.getName());
+
+ }
+ //TODO add tests for JPTTools static methods
+}

Back to the top