diff options
author | kmoore | 2008-05-22 13:59:23 +0000 |
---|---|---|
committer | kmoore | 2008-05-22 13:59:23 +0000 |
commit | dc4f0483bc8ab135a38ce8233496fe33c237e720 (patch) | |
tree | 3cfb9d6779908b32e84cb94d32f11c17e3fb5f7b /jpa | |
parent | 461e842e15406378b6844af9c0ce07d86cc84a23 (diff) | |
download | webtools.dali-dc4f0483bc8ab135a38ce8233496fe33c237e720.tar.gz webtools.dali-dc4f0483bc8ab135a38ce8233496fe33c237e720.tar.xz webtools.dali-dc4f0483bc8ab135a38ce8233496fe33c237e720.zip |
228718 - orm entity and embedded mapping attribute override defaults
Diffstat (limited to 'jpa')
20 files changed, 1052 insertions, 205 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/BaseEmbeddedMapping.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/BaseEmbeddedMapping.java index a922cf5bfd..ced177aef7 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/BaseEmbeddedMapping.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/BaseEmbeddedMapping.java @@ -62,5 +62,11 @@ public interface BaseEmbeddedMapping extends AttributeMapping, AttributeOverride * Move the specified attribute override from the source index to the target index. */ void moveSpecifiedAttributeOverride(int targetIndex, int sourceIndex); + + /** + * Return the attribute overrides, whether specified or default, + * with the given name. + */ + AttributeOverride getAttributeOverrideNamed(String name); } diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/Entity.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/Entity.java index 6b304e6b4a..f77db82793 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/Entity.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/Entity.java @@ -207,6 +207,12 @@ public interface Entity extends TypeMapping, GeneratorHolder, QueryHolder, IdCla String SPECIFIED_ATTRIBUTE_OVERRIDES_LIST = "specifiedAttributeOverridesList"; String VIRTUAL_ATTRIBUTE_OVERRIDES_LIST = "virtualAttributeOverridesList"; + /** + * Return the attribute overrides, whether specified or default, + * with the given name. + */ + AttributeOverride getAttributeOverrideNamed(String name); + // **************** association overrides ************************************** /** diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/PersistentType.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/PersistentType.java index 0f94e196ab..5d71d21075 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/PersistentType.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/PersistentType.java @@ -60,6 +60,7 @@ public interface PersistentType extends JpaContextNode, JpaStructureNode * The parentPersistentType could be found in java or xml. */ PersistentType getParentPersistentType(); + String PARENT_PERSISTENT_TYPE_PROPERTY = "parentPersistentTypeProperty"; /** * Return a read-only iterator of the contained {@link PersistentAttribute} diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/java/JavaBaseEmbeddedMapping.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/java/JavaBaseEmbeddedMapping.java index 4ad19d0d5e..58356ff62a 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/java/JavaBaseEmbeddedMapping.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/java/JavaBaseEmbeddedMapping.java @@ -29,5 +29,7 @@ public interface JavaBaseEmbeddedMapping extends JavaAttributeMapping, BaseEmbed ListIterator<JavaAttributeOverride> virtualAttributeOverrides(); @SuppressWarnings("unchecked") ListIterator<JavaAttributeOverride> specifiedAttributeOverrides(); + + JavaAttributeOverride getAttributeOverrideNamed(String name); } diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/java/JavaEntity.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/java/JavaEntity.java index d3cb9c69b1..4f4818e770 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/java/JavaEntity.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/java/JavaEntity.java @@ -47,6 +47,7 @@ public interface JavaEntity extends JavaTypeMapping, Entity, JavaGeneratorHolder ListIterator<JavaAttributeOverride> specifiedAttributeOverrides(); @SuppressWarnings("unchecked") ListIterator<JavaAttributeOverride> virtualAttributeOverrides(); + JavaAttributeOverride getAttributeOverrideNamed(String name); @SuppressWarnings("unchecked") ListIterator<JavaAssociationOverride> associationOverrides(); diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/orm/OrmBaseEmbeddedMapping.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/orm/OrmBaseEmbeddedMapping.java index 9e4bffaeb0..584b69c1d1 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/orm/OrmBaseEmbeddedMapping.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/orm/OrmBaseEmbeddedMapping.java @@ -30,4 +30,5 @@ public interface OrmBaseEmbeddedMapping extends BaseEmbeddedMapping, OrmAttribut @SuppressWarnings("unchecked") ListIterator<OrmAttributeOverride> specifiedAttributeOverrides(); + OrmAttributeOverride getAttributeOverrideNamed(String name); }
\ No newline at end of file diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/orm/OrmEntity.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/orm/OrmEntity.java index 6d9b7f0a84..1d848475ea 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/orm/OrmEntity.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/context/orm/OrmEntity.java @@ -99,6 +99,7 @@ public interface OrmEntity extends OrmTypeMapping, Entity, OrmGeneratorHolder ListIterator<OrmAttributeOverride> specifiedAttributeOverrides(); @SuppressWarnings("unchecked") ListIterator<OrmAttributeOverride> virtualAttributeOverrides(); + OrmAttributeOverride getAttributeOverrideNamed(String name); @SuppressWarnings("unchecked") ListIterator<OrmAssociationOverride> associationOverrides(); diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/java/AbstractJavaBaseEmbeddedMapping.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/java/AbstractJavaBaseEmbeddedMapping.java index ca7fec4d75..64dc6cf3fc 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/java/AbstractJavaBaseEmbeddedMapping.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/java/AbstractJavaBaseEmbeddedMapping.java @@ -182,8 +182,8 @@ public abstract class AbstractJavaBaseEmbeddedMapping<T extends JavaResourceNode removeItemFromList(attributeOverride, this.virtualAttributeOverrides, BaseEmbeddedMapping.VIRTUAL_ATTRIBUTE_OVERRIDES_LIST); } - public JavaAttributeOverride attributeOverrideNamed(String name) { - return (JavaAttributeOverride) overrideNamed(name, attributeOverrides()); + public JavaAttributeOverride getAttributeOverrideNamed(String name) { + return (JavaAttributeOverride) getOverrideNamed(name, attributeOverrides()); } public boolean containsAttributeOverride(String name) { @@ -198,7 +198,7 @@ public abstract class AbstractJavaBaseEmbeddedMapping<T extends JavaResourceNode return containsOverride(name, specifiedAttributeOverrides()); } - private BaseOverride overrideNamed(String name, ListIterator<? extends BaseOverride> overrides) { + protected BaseOverride getOverrideNamed(String name, ListIterator<? extends BaseOverride> overrides) { for (BaseOverride override : CollectionTools.iterable(overrides)) { String overrideName = override.getName(); if (overrideName == null && name == null) { @@ -211,8 +211,8 @@ public abstract class AbstractJavaBaseEmbeddedMapping<T extends JavaResourceNode return null; } - private boolean containsOverride(String name, ListIterator<? extends BaseOverride> overrides) { - return overrideNamed(name, overrides) != null; + protected boolean containsOverride(String name, ListIterator<? extends BaseOverride> overrides) { + return getOverrideNamed(name, overrides) != null; } public Embeddable embeddable() { @@ -242,7 +242,7 @@ public abstract class AbstractJavaBaseEmbeddedMapping<T extends JavaResourceNode protected void initializeDefaultAttributeOverrides(JavaResourcePersistentAttribute resourcePersistentAttribute) { for (Iterator<String> i = allOverridableAttributeNames(); i.hasNext(); ) { String attributeName = i.next(); - JavaAttributeOverride attributeOverride = attributeOverrideNamed(attributeName); + JavaAttributeOverride attributeOverride = getAttributeOverrideNamed(attributeName); if (attributeOverride == null) { this.virtualAttributeOverrides.add(buildVirtualAttributeOverride(resourcePersistentAttribute, attributeName)); } @@ -292,7 +292,7 @@ public abstract class AbstractJavaBaseEmbeddedMapping<T extends JavaResourceNode protected void updateVirtualAttributeOverrides(JavaResourcePersistentAttribute resourcePersistentAttribute) { for (Iterator<String> i = allOverridableAttributeNames(); i.hasNext(); ) { String attributeName = i.next(); - JavaAttributeOverride attributeOverride = attributeOverrideNamed(attributeName); + JavaAttributeOverride attributeOverride = getAttributeOverrideNamed(attributeName); if (attributeOverride == null) { addVirtualAttributeOverride(buildVirtualAttributeOverride(resourcePersistentAttribute, attributeName)); } diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/java/GenericJavaPersistentType.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/java/GenericJavaPersistentType.java index 94c1b84132..feb54cc1fc 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/java/GenericJavaPersistentType.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/java/GenericJavaPersistentType.java @@ -282,6 +282,15 @@ public class GenericJavaPersistentType extends AbstractJavaJpaContextNode implem return this.parentPersistentType; } + public void setParentPersistentType(PersistentType newParentPersistentType) { + if (attributeValueHasNotChanged(this.parentPersistentType, newParentPersistentType)) { + return; + } + PersistentType oldParentPersistentType = this.parentPersistentType; + this.parentPersistentType = newParentPersistentType; + firePropertyChanged(PersistentType.PARENT_PERSISTENT_TYPE_PROPERTY, oldParentPersistentType, newParentPersistentType); + } + public boolean hasAnyAttributeMappingAnnotations() { if (this.resourcePersistentType.hasAnyAttributeAnnotations()) { return true; @@ -436,8 +445,7 @@ public class GenericJavaPersistentType extends AbstractJavaJpaContextNode implem } public void updateParentPersistentType(JavaResourcePersistentType persistentTypeResource) { - //TODO do we need any change notification for this? - this.parentPersistentType = parentPersistentType(persistentTypeResource); + setParentPersistentType(parentPersistentType(persistentTypeResource)); } protected PersistentType parentPersistentType(JavaResourcePersistentType persistentTypeResource) { diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/AbstractOrmBaseEmbeddedMapping.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/AbstractOrmBaseEmbeddedMapping.java index d28332e445..aa9c1baa60 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/AbstractOrmBaseEmbeddedMapping.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/AbstractOrmBaseEmbeddedMapping.java @@ -18,20 +18,24 @@ import org.eclipse.jpt.core.context.BaseOverride; import org.eclipse.jpt.core.context.ColumnMapping; import org.eclipse.jpt.core.context.Embeddable; import org.eclipse.jpt.core.context.PersistentAttribute; +import org.eclipse.jpt.core.context.java.JavaAttributeOverride; import org.eclipse.jpt.core.context.java.JavaPersistentAttribute; import org.eclipse.jpt.core.context.orm.OrmAttributeOverride; import org.eclipse.jpt.core.context.orm.OrmBaseEmbeddedMapping; import org.eclipse.jpt.core.context.orm.OrmPersistentAttribute; import org.eclipse.jpt.core.internal.context.MappingTools; +import org.eclipse.jpt.core.internal.context.java.AbstractJavaBaseEmbeddedMapping; import org.eclipse.jpt.core.resource.orm.BaseXmlEmbedded; import org.eclipse.jpt.core.resource.orm.OrmFactory; import org.eclipse.jpt.core.resource.orm.XmlAttributeOverride; +import org.eclipse.jpt.core.resource.orm.XmlColumn; import org.eclipse.jpt.utility.internal.CollectionTools; import org.eclipse.jpt.utility.internal.iterators.CloneListIterator; import org.eclipse.jpt.utility.internal.iterators.CompositeListIterator; import org.eclipse.jpt.utility.internal.iterators.EmptyIterator; import org.eclipse.jpt.utility.internal.iterators.FilteringIterator; import org.eclipse.jpt.utility.internal.iterators.TransformationIterator; +import org.eclipse.wst.validation.internal.provisional.core.IMessage; public abstract class AbstractOrmBaseEmbeddedMapping<T extends BaseXmlEmbedded> extends AbstractOrmAttributeMapping<T> implements OrmBaseEmbeddedMapping @@ -65,14 +69,20 @@ public abstract class AbstractOrmBaseEmbeddedMapping<T extends BaseXmlEmbedded> } public int attributeOverridesSize() { - // TODO Auto-generated method stub - return 0; + return this.specifiedAttributeOverridesSize() + this.virtualAttributeOverridesSize(); } public ListIterator<OrmAttributeOverride> virtualAttributeOverrides() { return new CloneListIterator<OrmAttributeOverride>(this.virtualAttributeOverrides); } + protected void addVirtualAttributeOverride(OrmAttributeOverride attributeOverride) { + addItemToList(attributeOverride, this.virtualAttributeOverrides, BaseEmbeddedMapping.VIRTUAL_ATTRIBUTE_OVERRIDES_LIST); + } + protected void removeVirtualAttributeOverride(OrmAttributeOverride attributeOverride) { + removeItemFromList(attributeOverride, this.virtualAttributeOverrides, BaseEmbeddedMapping.VIRTUAL_ATTRIBUTE_OVERRIDES_LIST); + } + public int virtualAttributeOverridesSize() { return this.virtualAttributeOverrides.size(); } @@ -108,7 +118,23 @@ public abstract class AbstractOrmBaseEmbeddedMapping<T extends BaseXmlEmbedded> fireItemMoved(BaseEmbeddedMapping.SPECIFIED_ATTRIBUTE_OVERRIDES_LIST, targetIndex, sourceIndex); } - + public OrmAttributeOverride getAttributeOverrideNamed(String name) { + return (OrmAttributeOverride) getOverrideNamed(name, attributeOverrides()); + } + + protected BaseOverride getOverrideNamed(String name, ListIterator<? extends BaseOverride> overrides) { + for (BaseOverride override : CollectionTools.iterable(overrides)) { + String overrideName = override.getName(); + if (overrideName == null && name == null) { + return override; + } + if (overrideName != null && overrideName.equals(name)) { + return override; + } + } + return null; + } + //****************** AttributeOverride.Owner implemenation ******************* public boolean isVirtual(BaseOverride override) { @@ -116,8 +142,62 @@ public abstract class AbstractOrmBaseEmbeddedMapping<T extends BaseXmlEmbedded> } public BaseOverride setVirtual(boolean virtual, BaseOverride override) { - // TODO Auto-generated method stub - return null; + // Add a new attribute override + if (virtual) { + return setVirtual((OrmAttributeOverride) override); + } + return setSpecified((OrmAttributeOverride) override); + } + + protected OrmAttributeOverride setVirtual(OrmAttributeOverride attributeOverride) { + int index = this.specifiedAttributeOverrides.indexOf(attributeOverride); + this.specifiedAttributeOverrides.remove(index); + String attributeOverrideName = attributeOverride.getName(); + //add the virtual attribute override so that I can control the order that change notification is sent. + //otherwise when we remove the annotation from java we will get an update and add the attribute override + //during the udpate. This causes the UI to be flaky, since change notification might not occur in the correct order + OrmAttributeOverride virtualAttributeOverride = null; + if (attributeOverrideName != null) { + for (PersistentAttribute persistentAttribute : CollectionTools.iterable(allOverridableAttributes())) { + if (persistentAttribute.getName().equals(attributeOverrideName)) { + JavaAttributeOverride javaAttributeOverride = null; + if (getJavaEmbeddedMapping() != null) { + javaAttributeOverride = getJavaEmbeddedMapping().getAttributeOverrideNamed(attributeOverrideName); + } + //store the virtualAttributeOverride so we can fire change notification later + virtualAttributeOverride = buildVirtualAttributeOverride(persistentAttribute, javaAttributeOverride); + this.virtualAttributeOverrides.add(virtualAttributeOverride); + } + } + } + + getAttributeMapping().getAttributeOverrides().remove(index); + fireItemRemoved(BaseEmbeddedMapping.SPECIFIED_ATTRIBUTE_OVERRIDES_LIST, index, attributeOverride); + + if (virtualAttributeOverride != null) { + fireItemAdded(BaseEmbeddedMapping.VIRTUAL_ATTRIBUTE_OVERRIDES_LIST, virtualAttributeOverridesSize() - 1, virtualAttributeOverride); + } + return virtualAttributeOverride; + } + + protected OrmAttributeOverride setSpecified(OrmAttributeOverride oldAttributeOverride) { + int index = specifiedAttributeOverridesSize(); + XmlAttributeOverride xmlAttributeOverride = OrmFactory.eINSTANCE.createXmlAttributeOverrideImpl(); + OrmAttributeOverride newAttributeOverride = getJpaFactory().buildOrmAttributeOverride(this, this, xmlAttributeOverride); + this.specifiedAttributeOverrides.add(index, newAttributeOverride); + + getAttributeMapping().getAttributeOverrides().add(xmlAttributeOverride); + + int defaultIndex = this.virtualAttributeOverrides.indexOf(oldAttributeOverride); + this.virtualAttributeOverrides.remove(defaultIndex); + + newAttributeOverride.setName(oldAttributeOverride.getName()); + newAttributeOverride.getColumn().setSpecifiedName(oldAttributeOverride.getColumn().getName()); + + this.fireItemRemoved(BaseEmbeddedMapping.VIRTUAL_ATTRIBUTE_OVERRIDES_LIST, defaultIndex, oldAttributeOverride); + this.fireItemAdded(BaseEmbeddedMapping.SPECIFIED_ATTRIBUTE_OVERRIDES_LIST, index, newAttributeOverride); + + return newAttributeOverride; } public ColumnMapping getColumnMapping(String attributeName) { @@ -149,11 +229,20 @@ public abstract class AbstractOrmBaseEmbeddedMapping<T extends BaseXmlEmbedded> }; } + public AbstractJavaBaseEmbeddedMapping<?> getJavaEmbeddedMapping() { + JavaPersistentAttribute javaPersistentAttribute = getJavaPersistentAttribute(); + if (javaPersistentAttribute != null && javaPersistentAttribute.getMappingKey() == getKey()) { + return (AbstractJavaBaseEmbeddedMapping<?>) javaPersistentAttribute.getMapping(); + } + return null; + } + @Override public void initialize(T embedded) { super.initialize(embedded); this.embeddable = embeddableFor(findJavaPersistentAttribute()); this.initializeSpecifiedAttributeOverrides(embedded); + this.initializeVirtualAttributeOverrides(); } protected void initializeSpecifiedAttributeOverrides(T embedded) { @@ -161,19 +250,40 @@ public abstract class AbstractOrmBaseEmbeddedMapping<T extends BaseXmlEmbedded> this.specifiedAttributeOverrides.add(buildAttributeOverride(attributeOverride)); } } -// -// protected void initializeDefaultAttributeOverrides(JavaPersistentAttributeResource persistentAttributeResource) { -// for (Iterator<String> i = allOverridableAttributeNames(); i.hasNext(); ) { -// String attributeName = i.next(); -// XmlAttributeOverride attributeOverride = attributeOverrideNamed(attributeName); -// if (attributeOverride == null) { -// attributeOverride = createAttributeOverride(new NullAttributeOverride(persistentAttributeResource)); -// attributeOverride.setName(attributeName); -// this.defaultAttributeOverrides.add(attributeOverride); -// } -// } -// } + + protected void initializeVirtualAttributeOverrides() { + if (getPersistentAttribute().isVirtual()) { + //specifiedAttributeOverrides are used if the persistentAttribute is virtual + return; + } + for (PersistentAttribute persistentAttribute : CollectionTools.iterable(allOverridableAttributes())) { + OrmAttributeOverride attributeOverride = getAttributeOverrideNamed(persistentAttribute.getName()); + if (attributeOverride == null) { + JavaAttributeOverride javaAttributeOverride = null; + if (getJavaEmbeddedMapping() != null) { + javaAttributeOverride = getJavaEmbeddedMapping().getAttributeOverrideNamed(persistentAttribute.getName()); + } + this.virtualAttributeOverrides.add(buildVirtualAttributeOverride(persistentAttribute, javaAttributeOverride)); + } + } + } + protected OrmAttributeOverride buildVirtualAttributeOverride(PersistentAttribute persistentAttribute, JavaAttributeOverride javaAttributeOverride) { + return buildAttributeOverride(buildVirtualXmlAttributeOverride(persistentAttribute, javaAttributeOverride)); + } + + protected XmlAttributeOverride buildVirtualXmlAttributeOverride(PersistentAttribute persistentAttribute, JavaAttributeOverride javaAttributeOverride) { + XmlColumn xmlColumn; + if (javaAttributeOverride == null) { + ColumnMapping columnMapping = (ColumnMapping) persistentAttribute.getMapping(); + xmlColumn = new VirtualXmlColumn(getTypeMapping(), columnMapping.getColumn(), false); + } + else { + xmlColumn = new VirtualXmlColumn(getTypeMapping(), javaAttributeOverride.getColumn(), true); + } + return new VirtualXmlAttributeOverride(persistentAttribute.getName(), xmlColumn); + } + protected OrmAttributeOverride buildAttributeOverride(XmlAttributeOverride attributeOverride) { return getJpaFactory().buildOrmAttributeOverride(this, this, attributeOverride); } @@ -183,6 +293,7 @@ public abstract class AbstractOrmBaseEmbeddedMapping<T extends BaseXmlEmbedded> super.update(embedded); this.embeddable = embeddableFor(findJavaPersistentAttribute()); this.updateSpecifiedAttributeOverrides(embedded); + this.updateVirtualAttributeOverrides(); } protected void updateSpecifiedAttributeOverrides(T embedded) { @@ -204,6 +315,40 @@ public abstract class AbstractOrmBaseEmbeddedMapping<T extends BaseXmlEmbedded> } } + protected void updateVirtualAttributeOverrides() { + Iterator<PersistentAttribute> overridableAttributes = allOverridableAttributes(); + ListIterator<OrmAttributeOverride> virtualAttributeOverrides = virtualAttributeOverrides(); + + if (!getPersistentAttribute().isVirtual()) { + //specifiedAttributeOverrides are used if the persistentAttribute is virtual + for (PersistentAttribute persistentAttribute : CollectionTools.iterable(overridableAttributes)) { + OrmAttributeOverride ormAttributeOverride = getAttributeOverrideNamed(persistentAttribute.getName()); + if (ormAttributeOverride != null && !ormAttributeOverride.isVirtual()) { + continue; + } + JavaAttributeOverride javaAttributeOverride = null; + if (getJavaEmbeddedMapping() != null) { + javaAttributeOverride = getJavaEmbeddedMapping().getAttributeOverrideNamed(persistentAttribute.getName()); + } + if (ormAttributeOverride != null) { + if (virtualAttributeOverrides.hasNext()) { + OrmAttributeOverride virtualAttributeOverride = virtualAttributeOverrides.next(); + virtualAttributeOverride.update(buildVirtualXmlAttributeOverride(persistentAttribute, javaAttributeOverride)); + } + else { + addVirtualAttributeOverride(buildVirtualAttributeOverride(persistentAttribute, javaAttributeOverride)); + } + } + else { + addVirtualAttributeOverride(buildVirtualAttributeOverride(persistentAttribute, javaAttributeOverride)); + } + } + } + for (OrmAttributeOverride virtualAttributeOverride : CollectionTools.iterable(virtualAttributeOverrides)) { + removeVirtualAttributeOverride(virtualAttributeOverride); + } + + } //************ static methods ************ diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/GenericOrmAttributeOverride.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/GenericOrmAttributeOverride.java index 9b20747c2b..5344708385 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/GenericOrmAttributeOverride.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/GenericOrmAttributeOverride.java @@ -12,6 +12,7 @@ package org.eclipse.jpt.core.internal.context.orm; import java.util.List; import org.eclipse.jpt.core.context.AttributeOverride; import org.eclipse.jpt.core.context.BaseOverride; +import org.eclipse.jpt.core.context.ColumnMapping; import org.eclipse.jpt.core.context.TypeMapping; import org.eclipse.jpt.core.context.orm.OrmAttributeOverride; import org.eclipse.jpt.core.context.orm.OrmColumn; @@ -88,13 +89,27 @@ public class GenericOrmAttributeOverride extends AbstractOrmJpaContextNode } public String getDefaultColumnName() { - // TODO Auto-generated method stub - return null; + ColumnMapping columnMapping = getColumnMapping(); + if (columnMapping == null) { + return null; + } + return columnMapping.getColumn().getName(); } public String getDefaultTableName() { - // TODO Auto-generated method stub - return null; + ColumnMapping columnMapping = getColumnMapping(); + if (columnMapping == null) { + return null; + } + String tableName = columnMapping.getColumn().getSpecifiedTable(); + if (tableName != null) { + return tableName; + } + return getOwner().getTypeMapping().getTableName(); + } + + protected ColumnMapping getColumnMapping() { + return getOwner().getColumnMapping(getName()); } public boolean isVirtual() { diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/GenericOrmEntity.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/GenericOrmEntity.java index 677288de4c..bb73f75ecd 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/GenericOrmEntity.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/GenericOrmEntity.java @@ -35,6 +35,7 @@ import org.eclipse.jpt.core.context.RelationshipMapping; import org.eclipse.jpt.core.context.SecondaryTable; import org.eclipse.jpt.core.context.Table; import org.eclipse.jpt.core.context.TypeMapping; +import org.eclipse.jpt.core.context.java.JavaAttributeOverride; import org.eclipse.jpt.core.context.java.JavaEntity; import org.eclipse.jpt.core.context.java.JavaPersistentType; import org.eclipse.jpt.core.context.java.JavaPrimaryKeyJoinColumn; @@ -62,6 +63,7 @@ import org.eclipse.jpt.core.resource.orm.Inheritance; import org.eclipse.jpt.core.resource.orm.OrmFactory; import org.eclipse.jpt.core.resource.orm.XmlAssociationOverride; import org.eclipse.jpt.core.resource.orm.XmlAttributeOverride; +import org.eclipse.jpt.core.resource.orm.XmlColumn; import org.eclipse.jpt.core.resource.orm.XmlEntity; import org.eclipse.jpt.core.resource.orm.XmlEntityMappings; import org.eclipse.jpt.core.resource.orm.XmlIdClass; @@ -121,11 +123,11 @@ public class GenericOrmEntity extends AbstractOrmTypeMapping<XmlEntity> implemen protected final List<OrmAttributeOverride> specifiedAttributeOverrides; - protected final List<OrmAttributeOverride> defaultAttributeOverrides; + protected final List<OrmAttributeOverride> virtualAttributeOverrides; protected final List<OrmAssociationOverride> specifiedAssociationOverrides; - protected final List<OrmAssociationOverride> defaultAssociationOverrides; + protected final List<OrmAssociationOverride> virtualAssociationOverrides; protected final List<OrmNamedQuery> namedQueries; @@ -140,9 +142,9 @@ public class GenericOrmEntity extends AbstractOrmTypeMapping<XmlEntity> implemen this.specifiedPrimaryKeyJoinColumns = new ArrayList<OrmPrimaryKeyJoinColumn>(); this.defaultPrimaryKeyJoinColumns = new ArrayList<OrmPrimaryKeyJoinColumn>(); this.specifiedAttributeOverrides = new ArrayList<OrmAttributeOverride>(); - this.defaultAttributeOverrides = new ArrayList<OrmAttributeOverride>(); + this.virtualAttributeOverrides = new ArrayList<OrmAttributeOverride>(); this.specifiedAssociationOverrides = new ArrayList<OrmAssociationOverride>(); - this.defaultAssociationOverrides = new ArrayList<OrmAssociationOverride>(); + this.virtualAssociationOverrides = new ArrayList<OrmAssociationOverride>(); this.namedQueries = new ArrayList<OrmNamedQuery>(); this.namedNativeQueries = new ArrayList<OrmNamedNativeQuery>(); } @@ -715,13 +717,79 @@ public class GenericOrmEntity extends AbstractOrmTypeMapping<XmlEntity> implemen } public ListIterator<OrmAttributeOverride> virtualAttributeOverrides() { - return new CloneListIterator<OrmAttributeOverride>(this.defaultAttributeOverrides); + return new CloneListIterator<OrmAttributeOverride>(this.virtualAttributeOverrides); } public int virtualAttributeOverridesSize() { - return this.defaultAttributeOverrides.size(); + return this.virtualAttributeOverrides.size(); } + protected void addVirtualAttributeOverride(OrmAttributeOverride attributeOverride) { + addItemToList(attributeOverride, this.virtualAttributeOverrides, Entity.VIRTUAL_ATTRIBUTE_OVERRIDES_LIST); + } + + protected void removeVirtualAttributeOverride(OrmAttributeOverride attributeOverride) { + removeItemFromList(attributeOverride, this.virtualAttributeOverrides, Entity.VIRTUAL_ATTRIBUTE_OVERRIDES_LIST); + } + + protected OrmAttributeOverride setAttributeOverrideVirtual(boolean virtual, OrmAttributeOverride attributeOverride) { + if (virtual) { + return setAttributeOverrideVirtual(attributeOverride); + } + return setAttributeOverrideSpecified(attributeOverride); + } + + protected OrmAttributeOverride setAttributeOverrideVirtual(OrmAttributeOverride attributeOverride) { + int index = this.specifiedAttributeOverrides.indexOf(attributeOverride); + this.specifiedAttributeOverrides.remove(index); + String attributeOverrideName = attributeOverride.getName(); + //add the virtual attribute override so that I can control the order that change notification is sent. + //otherwise when we remove the annotation from java we will get an update and add the attribute override + //during the udpate. This causes the UI to be flaky, since change notification might not occur in the correct order + OrmAttributeOverride virtualAttributeOverride = null; + if (attributeOverrideName != null) { + for (PersistentAttribute persistentAttribute : CollectionTools.iterable(allOverridableAttributes())) { + if (persistentAttribute.getName().equals(attributeOverrideName)) { + JavaAttributeOverride javaAttributeOverride = null; + if (getJavaEntity() != null) { + javaAttributeOverride = getJavaEntity().getAttributeOverrideNamed(attributeOverrideName); + } + //store the virtualAttributeOverride so we can fire change notification later + virtualAttributeOverride = buildVirtualAttributeOverride(persistentAttribute, javaAttributeOverride); + this.virtualAttributeOverrides.add(virtualAttributeOverride); + } + } + } + + getTypeMappingResource().getAttributeOverrides().remove(index); + fireItemRemoved(Entity.SPECIFIED_ATTRIBUTE_OVERRIDES_LIST, index, attributeOverride); + + if (virtualAttributeOverride != null) { + fireItemAdded(Entity.VIRTUAL_ATTRIBUTE_OVERRIDES_LIST, virtualAttributeOverridesSize() - 1, virtualAttributeOverride); + } + return virtualAttributeOverride; + } + + protected OrmAttributeOverride setAttributeOverrideSpecified(OrmAttributeOverride oldAttributeOverride) { + int index = specifiedAttributeOverridesSize(); + XmlAttributeOverride xmlAttributeOverride = OrmFactory.eINSTANCE.createXmlAttributeOverrideImpl(); + OrmAttributeOverride newAttributeOverride = getJpaFactory().buildOrmAttributeOverride(this, createAttributeOverrideOwner(), xmlAttributeOverride); + this.specifiedAttributeOverrides.add(index, newAttributeOverride); + + getTypeMappingResource().getAttributeOverrides().add(xmlAttributeOverride); + + int defaultIndex = this.virtualAttributeOverrides.indexOf(oldAttributeOverride); + this.virtualAttributeOverrides.remove(defaultIndex); + + newAttributeOverride.setName(oldAttributeOverride.getName()); + newAttributeOverride.getColumn().setSpecifiedName(oldAttributeOverride.getColumn().getName()); + + this.fireItemRemoved(Entity.VIRTUAL_ATTRIBUTE_OVERRIDES_LIST, defaultIndex, oldAttributeOverride); + this.fireItemAdded(Entity.SPECIFIED_ATTRIBUTE_OVERRIDES_LIST, index, newAttributeOverride); + + return newAttributeOverride; + } + public ListIterator<OrmAttributeOverride> specifiedAttributeOverrides() { return new CloneListIterator<OrmAttributeOverride>(this.specifiedAttributeOverrides); } @@ -754,11 +822,11 @@ public class GenericOrmEntity extends AbstractOrmTypeMapping<XmlEntity> implemen } public ListIterator<OrmAssociationOverride> virtualAssociationOverrides() { - return new CloneListIterator<OrmAssociationOverride>(this.defaultAssociationOverrides); + return new CloneListIterator<OrmAssociationOverride>(this.virtualAssociationOverrides); } public int virtualAssociationOverridesSize() { - return this.defaultAssociationOverrides.size(); + return this.virtualAssociationOverrides.size(); } public ListIterator<OrmAssociationOverride> specifiedAssociationOverrides() { @@ -1133,6 +1201,7 @@ public class GenericOrmEntity extends AbstractOrmTypeMapping<XmlEntity> implemen this.initializeSpecifiedPrimaryKeyJoinColumns(entity); this.initializeDefaultPrimaryKeyJoinColumns(); this.initializeSpecifiedAttributeOverrides(entity); + this.initializeVirtualAttributeOverrides(); this.initializeSpecifiedAssociationOverrides(entity); this.initializeNamedQueries(entity); this.initializeNamedNativeQueries(entity); @@ -1226,6 +1295,35 @@ public class GenericOrmEntity extends AbstractOrmTypeMapping<XmlEntity> implemen } } + protected void initializeVirtualAttributeOverrides() { + for (PersistentAttribute persistentAttribute : CollectionTools.iterable(allOverridableAttributes())) { + OrmAttributeOverride attributeOverride = getAttributeOverrideNamed(persistentAttribute.getName()); + if (attributeOverride == null) { + JavaAttributeOverride javaAttributeOverride = null; + if (getJavaEntity() != null) { + javaAttributeOverride = getJavaEntity().getAttributeOverrideNamed(persistentAttribute.getName()); + } + this.virtualAttributeOverrides.add(buildVirtualAttributeOverride(persistentAttribute, javaAttributeOverride)); + } + } + } + + protected OrmAttributeOverride buildVirtualAttributeOverride(PersistentAttribute persistentAttribute, JavaAttributeOverride javaAttributeOverride) { + return buildAttributeOverride(buildVirtualXmlAttributeOverride(persistentAttribute, javaAttributeOverride)); + } + + protected XmlAttributeOverride buildVirtualXmlAttributeOverride(PersistentAttribute persistentAttribute, JavaAttributeOverride javaAttributeOverride) { + XmlColumn xmlColumn; + if (javaAttributeOverride == null) { + ColumnMapping columnMapping = (ColumnMapping) persistentAttribute.getMapping(); + xmlColumn = new VirtualXmlColumn(this, columnMapping.getColumn(), false); + } + else { + xmlColumn = new VirtualXmlColumn(this, javaAttributeOverride.getColumn(), isMetadataComplete()); + } + return new VirtualXmlAttributeOverride(persistentAttribute.getName(), xmlColumn); + } + protected void initializeSpecifiedAssociationOverrides(XmlEntity entity) { for (XmlAssociationOverride associationOverride : entity.getAssociationOverrides()) { this.specifiedAssociationOverrides.add(buildAssociationOverride(associationOverride)); @@ -1270,6 +1368,7 @@ public class GenericOrmEntity extends AbstractOrmTypeMapping<XmlEntity> implemen this.updateSpecifiedPrimaryKeyJoinColumns(entity); this.updateDefaultPrimaryKeyJoinColumns(); this.updateSpecifiedAttributeOverrides(entity); + this.updateVirtualAttributeOverrides(); this.updateSpecifiedAssociationOverrides(entity); this.updateNamedQueries(entity); this.updateNamedNativeQueries(entity); @@ -1493,6 +1592,37 @@ public class GenericOrmEntity extends AbstractOrmTypeMapping<XmlEntity> implemen } } + protected void updateVirtualAttributeOverrides() { + Iterator<PersistentAttribute> overridableAttributes = allOverridableAttributes(); + ListIterator<OrmAttributeOverride> virtualAttributeOverrides = virtualAttributeOverrides(); + + for (PersistentAttribute persistentAttribute : CollectionTools.iterable(overridableAttributes)) { + OrmAttributeOverride ormAttributeOverride = getAttributeOverrideNamed(persistentAttribute.getName()); + if (ormAttributeOverride != null && !ormAttributeOverride.isVirtual()) { + continue; + } + JavaAttributeOverride javaAttributeOverride = null; + if (getJavaEntity() != null) { + javaAttributeOverride = getJavaEntity().getAttributeOverrideNamed(persistentAttribute.getName()); + } + if (ormAttributeOverride != null) { + if (virtualAttributeOverrides.hasNext()) { + OrmAttributeOverride virtualAttributeOverride = virtualAttributeOverrides.next(); + virtualAttributeOverride.update(buildVirtualXmlAttributeOverride(persistentAttribute, javaAttributeOverride)); + } + else { + addVirtualAttributeOverride(buildVirtualAttributeOverride(persistentAttribute, javaAttributeOverride)); + } + } + else { + addVirtualAttributeOverride(buildVirtualAttributeOverride(persistentAttribute, javaAttributeOverride)); + } + } + for (OrmAttributeOverride virtualAttributeOverride : CollectionTools.iterable(virtualAttributeOverrides)) { + removeVirtualAttributeOverride(virtualAttributeOverride); + } + } + protected OrmAttributeOverride buildAttributeOverride(XmlAttributeOverride attributeOverride) { return getJpaFactory().buildOrmAttributeOverride(this, createAttributeOverrideOwner(), attributeOverride); } @@ -1808,12 +1938,11 @@ public class GenericOrmEntity extends AbstractOrmTypeMapping<XmlEntity> implemen } public boolean isVirtual(BaseOverride override) { - return GenericOrmEntity.this.defaultAttributeOverrides.contains(override); + return GenericOrmEntity.this.virtualAttributeOverrides.contains(override); } public BaseOverride setVirtual(boolean virtual, BaseOverride override) { - // TODO Auto-generated method stub - return null; + return GenericOrmEntity.this.setAttributeOverrideVirtual(virtual, (OrmAttributeOverride) override); } public TypeMapping getTypeMapping() { @@ -1840,7 +1969,7 @@ public class GenericOrmEntity extends AbstractOrmTypeMapping<XmlEntity> implemen } public boolean isVirtual(BaseOverride override) { - return GenericOrmEntity.this.defaultAssociationOverrides.contains(override); + return GenericOrmEntity.this.virtualAssociationOverrides.contains(override); } public BaseOverride setVirtual(boolean virtual, BaseOverride override) { diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/GenericOrmPersistentType.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/GenericOrmPersistentType.java index caf25e8dbc..a0d6c7cf92 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/GenericOrmPersistentType.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/GenericOrmPersistentType.java @@ -167,6 +167,15 @@ public class GenericOrmPersistentType extends AbstractOrmJpaContextNode implemen public PersistentType getParentPersistentType() { return this.parentPersistentType; } + + public void setParentPersistentType(PersistentType newParentPersistentType) { + if (attributeValueHasNotChanged(this.parentPersistentType, newParentPersistentType)) { + return; + } + PersistentType oldParentPersistentType = this.parentPersistentType; + this.parentPersistentType = newParentPersistentType; + firePropertyChanged(PersistentType.PARENT_PERSISTENT_TYPE_PROPERTY, oldParentPersistentType, newParentPersistentType); + } public AccessType getAccess() { return getMapping().getAccess(); @@ -545,12 +554,7 @@ public class GenericOrmPersistentType extends AbstractOrmJpaContextNode implemen protected void updateParentPersistentType() { JavaPersistentType javaPersistentType = getJavaPersistentType(); - if (javaPersistentType == null) { - //TODO change notification for this? - this.parentPersistentType = null; - return; - } - this.parentPersistentType = javaPersistentType.getParentPersistentType(); + setParentPersistentType(javaPersistentType == null ? null : javaPersistentType.getParentPersistentType()); } protected void updatePersistentAttributes(AbstractXmlTypeMapping typeMapping) { diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/VirtualXmlAttributeOverride.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/VirtualXmlAttributeOverride.java index f65d487bc4..7618d713d0 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/VirtualXmlAttributeOverride.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/VirtualXmlAttributeOverride.java @@ -9,34 +9,25 @@ ******************************************************************************/ package org.eclipse.jpt.core.internal.context.orm; -import org.eclipse.jpt.core.context.java.JavaAttributeOverride; -import org.eclipse.jpt.core.context.orm.OrmTypeMapping; import org.eclipse.jpt.core.resource.common.AbstractJpaEObject; import org.eclipse.jpt.core.resource.orm.XmlAttributeOverride; import org.eclipse.jpt.core.resource.orm.XmlColumn; public class VirtualXmlAttributeOverride extends AbstractJpaEObject implements XmlAttributeOverride { - - protected JavaAttributeOverride javaAttributeOverride; - - protected final VirtualXmlColumn column; - protected boolean metadataComplete; + protected String name; + + protected final XmlColumn column; - protected VirtualXmlAttributeOverride(OrmTypeMapping ormTypeMapping, JavaAttributeOverride javaAttributeOverride, boolean metadataComplete) { + protected VirtualXmlAttributeOverride(String name, XmlColumn xmlColumn) { super(); - this.javaAttributeOverride = javaAttributeOverride; - this.metadataComplete = metadataComplete; - this.column = new VirtualXmlColumn(ormTypeMapping, javaAttributeOverride.getColumn(), metadataComplete); + this.name = name; + this.column = xmlColumn; } - public String getName() { - if (this.metadataComplete) { - return null;//TODO is this right?? - } - return this.javaAttributeOverride.getName(); + return this.name; } public void setName(String value) { @@ -51,10 +42,4 @@ public class VirtualXmlAttributeOverride extends AbstractJpaEObject implements X public void setColumn(XmlColumn value) { throw new UnsupportedOperationException("cannot set values on a virtual mapping"); } - - public void update(JavaAttributeOverride javaAttributeOverride) { - this.javaAttributeOverride = javaAttributeOverride; - this.column.update(javaAttributeOverride.getColumn()); - } - } diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/VirtualXmlColumn.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/VirtualXmlColumn.java index 28f6b8a61e..7c8dbce6ef 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/VirtualXmlColumn.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/VirtualXmlColumn.java @@ -9,7 +9,7 @@ ******************************************************************************/ package org.eclipse.jpt.core.internal.context.orm; -import org.eclipse.jpt.core.context.java.JavaColumn; +import org.eclipse.jpt.core.context.Column; import org.eclipse.jpt.core.context.orm.OrmTypeMapping; import org.eclipse.jpt.core.resource.common.AbstractJpaEObject; import org.eclipse.jpt.core.resource.orm.XmlColumn; @@ -28,17 +28,17 @@ import org.eclipse.jpt.core.utility.TextRange; public class VirtualXmlColumn extends AbstractJpaEObject implements XmlColumn { - protected JavaColumn javaColumn; + protected Column column; protected boolean metadataComplete; protected OrmTypeMapping ormTypeMapping; - protected VirtualXmlColumn(OrmTypeMapping ormTypeMapping, JavaColumn javaColumn, boolean metadataComplete) { + protected VirtualXmlColumn(OrmTypeMapping ormTypeMapping, Column column, boolean metadataComplete) { super(); this.ormTypeMapping = ormTypeMapping; - this.javaColumn = javaColumn; + this.column = column; this.metadataComplete = metadataComplete; } @@ -46,7 +46,7 @@ public class VirtualXmlColumn extends AbstractJpaEObject implements XmlColumn if (this.metadataComplete) { return null; } - return this.javaColumn.getColumnDefinition(); + return this.column.getColumnDefinition(); } public void setColumnDefinition(String value) { @@ -55,9 +55,9 @@ public class VirtualXmlColumn extends AbstractJpaEObject implements XmlColumn public Boolean getInsertable() { if (this.metadataComplete) { - return this.javaColumn.getDefaultInsertable(); + return this.column.getDefaultInsertable(); } - return this.javaColumn.getInsertable(); + return this.column.getInsertable(); } public void setInsertable(Boolean value) { @@ -66,9 +66,9 @@ public class VirtualXmlColumn extends AbstractJpaEObject implements XmlColumn public Integer getLength() { if (this.metadataComplete) { - return this.javaColumn.getDefaultLength(); + return this.column.getDefaultLength(); } - return this.javaColumn.getLength(); + return this.column.getLength(); } public void setLength(Integer value) { @@ -77,9 +77,9 @@ public class VirtualXmlColumn extends AbstractJpaEObject implements XmlColumn public String getName() { if (this.metadataComplete) { - return this.javaColumn.getDefaultName(); + return this.column.getDefaultName(); } - return this.javaColumn.getName(); + return this.column.getName(); } public void setName(String value) { @@ -88,9 +88,9 @@ public class VirtualXmlColumn extends AbstractJpaEObject implements XmlColumn public Boolean getNullable() { if (this.metadataComplete) { - return this.javaColumn.getDefaultNullable(); + return this.column.getDefaultNullable(); } - return this.javaColumn.getNullable(); + return this.column.getNullable(); } public void setNullable(Boolean value) { @@ -99,9 +99,9 @@ public class VirtualXmlColumn extends AbstractJpaEObject implements XmlColumn public Integer getPrecision() { if (this.metadataComplete) { - return this.javaColumn.getDefaultPrecision(); + return this.column.getDefaultPrecision(); } - return this.javaColumn.getPrecision(); + return this.column.getPrecision(); } public void setPrecision(Integer value) { @@ -110,9 +110,9 @@ public class VirtualXmlColumn extends AbstractJpaEObject implements XmlColumn public Integer getScale() { if (this.metadataComplete) { - return this.javaColumn.getDefaultScale(); + return this.column.getDefaultScale(); } - return this.javaColumn.getScale(); + return this.column.getScale(); } public void setScale(Integer value) { @@ -121,8 +121,8 @@ public class VirtualXmlColumn extends AbstractJpaEObject implements XmlColumn public String getTable() { if (!this.metadataComplete) { - if (this.javaColumn.getSpecifiedTable() != null) { - return this.javaColumn.getSpecifiedTable(); + if (this.column.getSpecifiedTable() != null) { + return this.column.getSpecifiedTable(); } } return this.ormTypeMapping.getTableName(); @@ -134,9 +134,9 @@ public class VirtualXmlColumn extends AbstractJpaEObject implements XmlColumn public Boolean getUnique() { if (this.metadataComplete) { - return this.javaColumn.getDefaultUnique(); + return this.column.getDefaultUnique(); } - return this.javaColumn.getUnique(); + return this.column.getUnique(); } public void setUnique(Boolean value) { @@ -145,17 +145,17 @@ public class VirtualXmlColumn extends AbstractJpaEObject implements XmlColumn public Boolean getUpdatable() { if (this.metadataComplete) { - return this.javaColumn.getDefaultUpdatable(); + return this.column.getDefaultUpdatable(); } - return this.javaColumn.getUpdatable(); + return this.column.getUpdatable(); } public void setUpdatable(Boolean value) { throw new UnsupportedOperationException("cannot set values on a virtual mapping"); } - public void update(JavaColumn javaColumn) { - this.javaColumn = javaColumn; + public void update(Column column) { + this.column = column; } public TextRange getNameTextRange() { diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/VirtualXmlEmbedded.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/VirtualXmlEmbedded.java index a1ef573e56..2e144ba5b1 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/VirtualXmlEmbedded.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/VirtualXmlEmbedded.java @@ -10,15 +10,18 @@ package org.eclipse.jpt.core.internal.context.orm; import java.util.ListIterator; -import org.eclipse.emf.common.util.BasicEList; import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.ecore.util.EObjectContainmentEList; import org.eclipse.jpt.core.context.java.JavaAttributeOverride; import org.eclipse.jpt.core.context.java.JavaEmbeddedMapping; import org.eclipse.jpt.core.context.orm.OrmTypeMapping; import org.eclipse.jpt.core.resource.common.AbstractJpaEObject; +import org.eclipse.jpt.core.resource.orm.OrmPackage; import org.eclipse.jpt.core.resource.orm.XmlAttributeOverride; +import org.eclipse.jpt.core.resource.orm.XmlColumn; import org.eclipse.jpt.core.resource.orm.XmlEmbedded; import org.eclipse.jpt.core.utility.TextRange; +import org.eclipse.jpt.utility.internal.CollectionTools; /** * VirtualEmbedded is an implementation of Embedded used when there is @@ -29,8 +32,6 @@ public class VirtualXmlEmbedded extends AbstractJpaEObject implements XmlEmbedde JavaEmbeddedMapping javaEmbeddedMapping; protected boolean metadataComplete; - - protected EList<XmlAttributeOverride> virtualAttributeOverrides; protected OrmTypeMapping ormTypeMapping; @@ -39,24 +40,8 @@ public class VirtualXmlEmbedded extends AbstractJpaEObject implements XmlEmbedde this.ormTypeMapping = ormTypeMapping; this.javaEmbeddedMapping = javaEmbeddedMapping; this.metadataComplete = metadataComplete; - this.initializeAttributeOverrides(javaEmbeddedMapping); } - - protected void initializeAttributeOverrides(JavaEmbeddedMapping javaEmbeddedMapping) { - this.virtualAttributeOverrides = new BasicEList<XmlAttributeOverride>(); - ListIterator<JavaAttributeOverride> javaAttributesOverrides; - if (this.metadataComplete) { - javaAttributesOverrides = javaEmbeddedMapping.virtualAttributeOverrides(); - } - else { - javaAttributesOverrides = javaEmbeddedMapping.attributeOverrides(); - } - while (javaAttributesOverrides.hasNext()) { - this.virtualAttributeOverrides.add(new VirtualXmlAttributeOverride(this.ormTypeMapping, javaAttributesOverrides.next(), this.metadataComplete)); - } - } - public String getName() { return this.javaEmbeddedMapping.getPersistentAttribute().getName(); } @@ -65,44 +50,28 @@ public class VirtualXmlEmbedded extends AbstractJpaEObject implements XmlEmbedde throw new UnsupportedOperationException("cannot set values on a virtual mapping"); } - public EList<XmlAttributeOverride> getAttributeOverrides() { - return this.virtualAttributeOverrides; - } - - public void update(JavaEmbeddedMapping javaEmbeddedMapping) { - this.javaEmbeddedMapping = javaEmbeddedMapping; - this.updateAttributeOverrides(javaEmbeddedMapping); - } - - protected void updateAttributeOverrides(JavaEmbeddedMapping javaEmbeddedMapping) { - ListIterator<JavaAttributeOverride> javaAttributesOverrides; - ListIterator<XmlAttributeOverride> virtualAttributeOverrides = this.virtualAttributeOverrides.listIterator(); - if (this.metadataComplete) { - javaAttributesOverrides = javaEmbeddedMapping.virtualAttributeOverrides(); + EList<XmlAttributeOverride> attributeOverrides = new EObjectContainmentEList<XmlAttributeOverride>(XmlAttributeOverride.class, this, OrmPackage.XML_EMBEDDED__ATTRIBUTE_OVERRIDES); + ListIterator<JavaAttributeOverride> javaAttributeOverrides; + if (!this.metadataComplete) { + javaAttributeOverrides = this.javaEmbeddedMapping.attributeOverrides(); } else { - javaAttributesOverrides = javaEmbeddedMapping.attributeOverrides(); - } - - while (javaAttributesOverrides.hasNext()) { - JavaAttributeOverride javaAttributeOverride = javaAttributesOverrides.next(); - if (virtualAttributeOverrides.hasNext()) { - VirtualXmlAttributeOverride virtualAttributeOverride = (VirtualXmlAttributeOverride) virtualAttributeOverrides.next(); - virtualAttributeOverride.update(javaAttributeOverride); - } - else { - this.virtualAttributeOverrides.add(new VirtualXmlAttributeOverride(this.ormTypeMapping, javaAttributeOverride, this.metadataComplete)); - } + javaAttributeOverrides = this.javaEmbeddedMapping.virtualAttributeOverrides(); } - - while(virtualAttributeOverrides.hasNext()) { - this.virtualAttributeOverrides.remove(virtualAttributeOverrides.next()); + for (JavaAttributeOverride javaAttributeOverride : CollectionTools.iterable(javaAttributeOverrides)) { + XmlColumn xmlColumn = new VirtualXmlColumn(this.ormTypeMapping, javaAttributeOverride.getColumn(), this.metadataComplete); + XmlAttributeOverride xmlAttributeOverride = new VirtualXmlAttributeOverride(javaAttributeOverride.getName(), xmlColumn); + attributeOverrides.add(xmlAttributeOverride); } + return attributeOverrides; } - + + public void update(JavaEmbeddedMapping javaEmbeddedMapping) { + this.javaEmbeddedMapping = javaEmbeddedMapping; + } + public TextRange getNameTextRange() { return null; } - } diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/VirtualXmlEmbeddedId.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/VirtualXmlEmbeddedId.java index fa78b8e5a5..8b1a6f6dc7 100644 --- a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/VirtualXmlEmbeddedId.java +++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/VirtualXmlEmbeddedId.java @@ -10,15 +10,18 @@ package org.eclipse.jpt.core.internal.context.orm; import java.util.ListIterator; -import org.eclipse.emf.common.util.BasicEList; import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.ecore.util.EObjectContainmentEList; import org.eclipse.jpt.core.context.java.JavaAttributeOverride; import org.eclipse.jpt.core.context.java.JavaEmbeddedIdMapping; import org.eclipse.jpt.core.context.orm.OrmTypeMapping; import org.eclipse.jpt.core.resource.common.AbstractJpaEObject; +import org.eclipse.jpt.core.resource.orm.OrmPackage; import org.eclipse.jpt.core.resource.orm.XmlAttributeOverride; +import org.eclipse.jpt.core.resource.orm.XmlColumn; import org.eclipse.jpt.core.resource.orm.XmlEmbeddedId; import org.eclipse.jpt.core.utility.TextRange; +import org.eclipse.jpt.utility.internal.CollectionTools; /** * VirtualEmbeddedId is an implementation of EmbeddedId used when there is @@ -29,8 +32,6 @@ public class VirtualXmlEmbeddedId extends AbstractJpaEObject implements XmlEmbed JavaEmbeddedIdMapping javaEmbeddedIdMapping; protected boolean metadataComplete; - - protected EList<XmlAttributeOverride> virtualAttributeOverrides; protected OrmTypeMapping ormTypeMapping; @@ -39,22 +40,6 @@ public class VirtualXmlEmbeddedId extends AbstractJpaEObject implements XmlEmbed this.ormTypeMapping = ormTypeMapping; this.javaEmbeddedIdMapping = javaEmbeddedIdMapping; this.metadataComplete = metadataComplete; - this.initializeAttributeOverrides(javaEmbeddedIdMapping); - } - - protected void initializeAttributeOverrides(JavaEmbeddedIdMapping javaEmbeddedIdMapping) { - this.virtualAttributeOverrides = new BasicEList<XmlAttributeOverride>(); - ListIterator<JavaAttributeOverride> javaAttributesOverrides; - if (this.metadataComplete) { - javaAttributesOverrides = javaEmbeddedIdMapping.virtualAttributeOverrides(); - } - else { - javaAttributesOverrides = javaEmbeddedIdMapping.attributeOverrides(); - } - - while (javaAttributesOverrides.hasNext()) { - this.virtualAttributeOverrides.add(new VirtualXmlAttributeOverride(this.ormTypeMapping, javaAttributesOverrides.next(), this.metadataComplete)); - } } public String getName() { @@ -65,44 +50,28 @@ public class VirtualXmlEmbeddedId extends AbstractJpaEObject implements XmlEmbed throw new UnsupportedOperationException("cannot set values on a virtual mapping"); } - public EList<XmlAttributeOverride> getAttributeOverrides() { - return this.virtualAttributeOverrides; - } - - public void update(JavaEmbeddedIdMapping javaEmbeddedIdMapping) { - this.javaEmbeddedIdMapping = javaEmbeddedIdMapping; - this.updateAttributeOverrides(javaEmbeddedIdMapping); - } - - protected void updateAttributeOverrides(JavaEmbeddedIdMapping javaEmbeddedIdMapping) { - ListIterator<JavaAttributeOverride> javaAttributesOverrides; - ListIterator<XmlAttributeOverride> virtualAttributeOverrides = this.virtualAttributeOverrides.listIterator(); - if (this.metadataComplete) { - javaAttributesOverrides = javaEmbeddedIdMapping.virtualAttributeOverrides(); + EList<XmlAttributeOverride> attributeOverrides = new EObjectContainmentEList<XmlAttributeOverride>(XmlAttributeOverride.class, this, OrmPackage.XML_EMBEDDED_ID__ATTRIBUTE_OVERRIDES); + ListIterator<JavaAttributeOverride> javaAttributeOverrides; + if (!this.metadataComplete) { + javaAttributeOverrides = this.javaEmbeddedIdMapping.attributeOverrides(); } else { - javaAttributesOverrides = javaEmbeddedIdMapping.attributeOverrides(); + javaAttributeOverrides = this.javaEmbeddedIdMapping.virtualAttributeOverrides(); } - - while (javaAttributesOverrides.hasNext()) { - JavaAttributeOverride javaAttributeOverride = javaAttributesOverrides.next(); - if (virtualAttributeOverrides.hasNext()) { - VirtualXmlAttributeOverride virtualAttributeOverride = (VirtualXmlAttributeOverride) virtualAttributeOverrides.next(); - virtualAttributeOverride.update(javaAttributeOverride); - } - else { - this.virtualAttributeOverrides.add(new VirtualXmlAttributeOverride(this.ormTypeMapping, javaAttributeOverride, this.metadataComplete)); - } - } - - while(virtualAttributeOverrides.hasNext()) { - this.virtualAttributeOverrides.remove(virtualAttributeOverrides.next()); + for (JavaAttributeOverride javaAttributeOverride : CollectionTools.iterable(javaAttributeOverrides)) { + XmlColumn xmlColumn = new VirtualXmlColumn(this.ormTypeMapping, javaAttributeOverride.getColumn(), this.metadataComplete); + XmlAttributeOverride xmlAttributeOverride = new VirtualXmlAttributeOverride(javaAttributeOverride.getName(), xmlColumn); + attributeOverrides.add(xmlAttributeOverride); } + return attributeOverrides; } - + + public void update(JavaEmbeddedIdMapping javaEmbeddedIdMapping) { + this.javaEmbeddedIdMapping = javaEmbeddedIdMapping; + } + public TextRange getNameTextRange() { return null; } - } diff --git a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/context/orm/OrmEmbeddedIdMappingTests.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/context/orm/OrmEmbeddedIdMappingTests.java index 051ebf0f38..5a05f082bb 100644 --- a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/context/orm/OrmEmbeddedIdMappingTests.java +++ b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/context/orm/OrmEmbeddedIdMappingTests.java @@ -10,6 +10,7 @@ package org.eclipse.jpt.core.tests.internal.context.orm; import java.util.Iterator; +import java.util.ListIterator; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jpt.core.JptCorePlugin; import org.eclipse.jpt.core.MappingKeys; @@ -24,6 +25,12 @@ import org.eclipse.jpt.core.context.OneToManyMapping; import org.eclipse.jpt.core.context.OneToOneMapping; import org.eclipse.jpt.core.context.TransientMapping; import org.eclipse.jpt.core.context.VersionMapping; +import org.eclipse.jpt.core.context.java.JavaBasicMapping; +import org.eclipse.jpt.core.context.java.JavaEmbeddedIdMapping; +import org.eclipse.jpt.core.context.orm.OrmAttributeOverride; +import org.eclipse.jpt.core.context.orm.OrmColumn; +import org.eclipse.jpt.core.context.orm.OrmEmbeddedIdMapping; +import org.eclipse.jpt.core.context.orm.OrmEmbeddedMapping; import org.eclipse.jpt.core.context.orm.OrmPersistentAttribute; import org.eclipse.jpt.core.context.orm.OrmPersistentType; import org.eclipse.jpt.core.resource.java.JPA; @@ -32,6 +39,7 @@ import org.eclipse.jpt.core.resource.orm.XmlEmbeddedId; import org.eclipse.jpt.core.resource.persistence.PersistenceFactory; import org.eclipse.jpt.core.resource.persistence.XmlMappingFileRef; import org.eclipse.jpt.core.tests.internal.context.ContextModelTestCase; +import org.eclipse.jpt.core.tests.internal.projects.TestJavaProject.SourceWriter; import org.eclipse.jpt.utility.internal.iterators.ArrayIterator; public class OrmEmbeddedIdMappingTests extends ContextModelTestCase @@ -108,6 +116,43 @@ public class OrmEmbeddedIdMappingTests extends ContextModelTestCase }); } + private void createTestEmbeddableAddress() 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("import "); + sb.append(JPA.ID); + sb.append(";"); + sb.append(CR); + sb.append("import "); + sb.append(JPA.COLUMN); + sb.append(";"); + sb.append(CR); + sb.append(CR); + sb.append("@Embeddable"); + 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(" @Column(name=\"A_STATE\")").append(CR); + sb.append(" private String 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); + } // public void testUpdateName() throws Exception { // OrmPersistentType ormPersistentType = entityMappings().addOrmPersistentType(IMappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo"); @@ -488,5 +533,373 @@ public class OrmEmbeddedIdMappingTests extends ContextModelTestCase assertTrue(ormPersistentAttribute.getMapping() instanceof ManyToManyMapping); assertEquals("embeddedId", ormPersistentAttribute.getMapping().getName()); } + + public void testUpdateName() throws Exception { + OrmPersistentType ormPersistentType = entityMappings().addOrmPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo"); + OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedPersistentAttribute(MappingKeys.EMBEDDED_ID_ATTRIBUTE_MAPPING_KEY, "embeddedMapping"); + OrmEmbeddedIdMapping ormEmbeddedMapping = (OrmEmbeddedIdMapping) ormPersistentAttribute.getMapping(); + XmlEmbeddedId embeddedResource = ormResource().getEntityMappings().getEntities().get(0).getAttributes().getEmbeddedIds().get(0); + + assertEquals("embeddedMapping", ormEmbeddedMapping.getName()); + assertEquals("embeddedMapping", embeddedResource.getName()); + + //set name in the resource model, verify context model updated + embeddedResource.setName("newName"); + assertEquals("newName", ormEmbeddedMapping.getName()); + assertEquals("newName", embeddedResource.getName()); + + //set name to null in the resource model + embeddedResource.setName(null); + assertNull(ormEmbeddedMapping.getName()); + assertNull(embeddedResource.getName()); + } + + public void testModifyName() throws Exception { + OrmPersistentType ormPersistentType = entityMappings().addOrmPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo"); + OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedPersistentAttribute(MappingKeys.EMBEDDED_ID_ATTRIBUTE_MAPPING_KEY, "embeddedMapping"); + OrmEmbeddedIdMapping ormEmbeddedMapping = (OrmEmbeddedIdMapping) ormPersistentAttribute.getMapping(); + XmlEmbeddedId embeddedResource = ormResource().getEntityMappings().getEntities().get(0).getAttributes().getEmbeddedIds().get(0); + + assertEquals("embeddedMapping", ormEmbeddedMapping.getName()); + assertEquals("embeddedMapping", embeddedResource.getName()); + + //set name in the context model, verify resource model updated + ormEmbeddedMapping.setName("newName"); + assertEquals("newName", ormEmbeddedMapping.getName()); + assertEquals("newName", embeddedResource.getName()); + + //set name to null in the context model + ormEmbeddedMapping.setName(null); + assertNull(ormEmbeddedMapping.getName()); + assertNull(embeddedResource.getName()); + } + + public void testMoveSpecifiedAttributeOverride() throws Exception { + OrmPersistentType ormPersistentType = entityMappings().addOrmPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo"); + OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedPersistentAttribute(MappingKeys.EMBEDDED_ID_ATTRIBUTE_MAPPING_KEY, "embeddedMapping"); + OrmEmbeddedIdMapping ormEmbeddedIdMapping = (OrmEmbeddedIdMapping) ormPersistentAttribute.getMapping(); + XmlEmbeddedId embeddedIdResource = ormResource().getEntityMappings().getEntities().get(0).getAttributes().getEmbeddedIds().get(0); + + embeddedIdResource.getAttributeOverrides().add(OrmFactory.eINSTANCE.createXmlAttributeOverrideImpl()); + embeddedIdResource.getAttributeOverrides().add(OrmFactory.eINSTANCE.createXmlAttributeOverrideImpl()); + embeddedIdResource.getAttributeOverrides().add(OrmFactory.eINSTANCE.createXmlAttributeOverrideImpl()); + + embeddedIdResource.getAttributeOverrides().get(0).setName("FOO"); + embeddedIdResource.getAttributeOverrides().get(1).setName("BAR"); + embeddedIdResource.getAttributeOverrides().get(2).setName("BAZ"); + + assertEquals(3, embeddedIdResource.getAttributeOverrides().size()); + + ormEmbeddedIdMapping.moveSpecifiedAttributeOverride(2, 0); + ListIterator<OrmAttributeOverride> attributeOverrides = ormEmbeddedIdMapping.specifiedAttributeOverrides(); + assertEquals("BAR", attributeOverrides.next().getName()); + assertEquals("BAZ", attributeOverrides.next().getName()); + assertEquals("FOO", attributeOverrides.next().getName()); + + assertEquals("BAR", embeddedIdResource.getAttributeOverrides().get(0).getName()); + assertEquals("BAZ", embeddedIdResource.getAttributeOverrides().get(1).getName()); + assertEquals("FOO", embeddedIdResource.getAttributeOverrides().get(2).getName()); + + + ormEmbeddedIdMapping.moveSpecifiedAttributeOverride(0, 1); + attributeOverrides = ormEmbeddedIdMapping.specifiedAttributeOverrides(); + assertEquals("BAZ", attributeOverrides.next().getName()); + assertEquals("BAR", attributeOverrides.next().getName()); + assertEquals("FOO", attributeOverrides.next().getName()); + + assertEquals("BAZ", embeddedIdResource.getAttributeOverrides().get(0).getName()); + assertEquals("BAR", embeddedIdResource.getAttributeOverrides().get(1).getName()); + assertEquals("FOO", embeddedIdResource.getAttributeOverrides().get(2).getName()); + } + + public void testUpdateAttributeOverrides() throws Exception { + OrmPersistentType ormPersistentType = entityMappings().addOrmPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, "model.Foo"); + OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.addSpecifiedPersistentAttribute(MappingKeys.EMBEDDED_ID_ATTRIBUTE_MAPPING_KEY, "embeddedMapping"); + OrmEmbeddedIdMapping ormEmbeddedIdMapping = (OrmEmbeddedIdMapping) ormPersistentAttribute.getMapping(); + XmlEmbeddedId embeddedIdResource = ormResource().getEntityMappings().getEntities().get(0).getAttributes().getEmbeddedIds().get(0); + + embeddedIdResource.getAttributeOverrides().add(OrmFactory.eINSTANCE.createXmlAttributeOverrideImpl()); + embeddedIdResource.getAttributeOverrides().add(OrmFactory.eINSTANCE.createXmlAttributeOverrideImpl()); + embeddedIdResource.getAttributeOverrides().add(OrmFactory.eINSTANCE.createXmlAttributeOverrideImpl()); + + embeddedIdResource.getAttributeOverrides().get(0).setName("FOO"); + embeddedIdResource.getAttributeOverrides().get(1).setName("BAR"); + embeddedIdResource.getAttributeOverrides().get(2).setName("BAZ"); + + ListIterator<OrmAttributeOverride> attributeOverrides = ormEmbeddedIdMapping.specifiedAttributeOverrides(); + assertEquals("FOO", attributeOverrides.next().getName()); + assertEquals("BAR", attributeOverrides.next().getName()); + assertEquals("BAZ", attributeOverrides.next().getName()); + assertFalse(attributeOverrides.hasNext()); + + embeddedIdResource.getAttributeOverrides().move(2, 0); + attributeOverrides = ormEmbeddedIdMapping.specifiedAttributeOverrides(); + assertEquals("BAR", attributeOverrides.next().getName()); + assertEquals("BAZ", attributeOverrides.next().getName()); + assertEquals("FOO", attributeOverrides.next().getName()); + assertFalse(attributeOverrides.hasNext()); + + embeddedIdResource.getAttributeOverrides().move(0, 1); + attributeOverrides = ormEmbeddedIdMapping.specifiedAttributeOverrides(); + assertEquals("BAZ", attributeOverrides.next().getName()); + assertEquals("BAR", attributeOverrides.next().getName()); + assertEquals("FOO", attributeOverrides.next().getName()); + assertFalse(attributeOverrides.hasNext()); + + embeddedIdResource.getAttributeOverrides().remove(1); + attributeOverrides = ormEmbeddedIdMapping.specifiedAttributeOverrides(); + assertEquals("BAZ", attributeOverrides.next().getName()); + assertEquals("FOO", attributeOverrides.next().getName()); + assertFalse(attributeOverrides.hasNext()); + + embeddedIdResource.getAttributeOverrides().remove(1); + attributeOverrides = ormEmbeddedIdMapping.specifiedAttributeOverrides(); + assertEquals("BAZ", attributeOverrides.next().getName()); + assertFalse(attributeOverrides.hasNext()); + + embeddedIdResource.getAttributeOverrides().remove(0); + assertFalse(ormEmbeddedIdMapping.specifiedAttributeOverrides().hasNext()); + } + + + public void testEmbeddedMappingNoUnderylingJavaAttribute() throws Exception { + createTestEntityEmbeddedIdMapping(); + createTestEmbeddableAddress(); + + OrmPersistentType ormPersistentType = entityMappings().addOrmPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME); + entityMappings().addOrmPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address"); + ormPersistentType.addSpecifiedPersistentAttribute(MappingKeys.EMBEDDED_ID_ATTRIBUTE_MAPPING_KEY, "foo"); + assertEquals(3, ormPersistentType.virtualAttributesSize()); + + OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.specifiedAttributes().next(); + OrmEmbeddedIdMapping ormEmbeddedIdMapping = (OrmEmbeddedIdMapping) ormPersistentAttribute.getMapping(); + + assertEquals("foo", ormEmbeddedIdMapping.getName()); + + + assertFalse(ormEmbeddedIdMapping.specifiedAttributeOverrides().hasNext()); + assertFalse(ormEmbeddedIdMapping.virtualAttributeOverrides().hasNext()); + } + + public void testVirtualAttributeOverrides() throws Exception { + createTestEntityEmbeddedIdMapping(); + createTestEmbeddableAddress(); + OrmPersistentType persistentType = entityMappings().addOrmPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME); + OrmPersistentType persistentType2 = entityMappings().addOrmPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address"); + + //embedded mapping is virtual, specified attribute overrides should exist + OrmEmbeddedIdMapping embeddedIdMapping = (OrmEmbeddedIdMapping) persistentType.getAttributeNamed("address").getMapping(); + assertEquals(4, embeddedIdMapping.attributeOverridesSize()); + assertEquals(0, embeddedIdMapping.virtualAttributeOverridesSize()); + assertEquals(4, embeddedIdMapping.specifiedAttributeOverridesSize()); + ListIterator<OrmAttributeOverride> specifiedAttributeOverrides = embeddedIdMapping.specifiedAttributeOverrides(); + OrmAttributeOverride attributeOverride = specifiedAttributeOverrides.next(); + assertEquals("city", attributeOverride.getName()); + attributeOverride = specifiedAttributeOverrides.next(); + assertEquals("id", attributeOverride.getName()); + attributeOverride = specifiedAttributeOverrides.next(); + assertEquals("state", attributeOverride.getName()); + attributeOverride = specifiedAttributeOverrides.next(); + assertEquals("zip", attributeOverride.getName()); + + JavaEmbeddedIdMapping javaEmbeddedIdMapping = (JavaEmbeddedIdMapping) embeddedIdMapping.getJavaPersistentAttribute().getMapping(); + javaEmbeddedIdMapping.virtualAttributeOverrides().next().setVirtual(false); + javaEmbeddedIdMapping.specifiedAttributeOverrides().next().getColumn().setSpecifiedName("FOO_COLUMN"); + javaEmbeddedIdMapping.specifiedAttributeOverrides().next().getColumn().setSpecifiedTable("FOO_TABLE"); + JavaBasicMapping javaBasicMapping = (JavaBasicMapping) persistentType2.getJavaPersistentType().getAttributeNamed("state").getMapping(); + javaBasicMapping.getColumn().setSpecifiedName("MY_STATE_COLUMN"); + assertEquals(4, embeddedIdMapping.attributeOverridesSize()); + assertEquals(0, embeddedIdMapping.virtualAttributeOverridesSize()); + assertEquals(4, embeddedIdMapping.specifiedAttributeOverridesSize()); + specifiedAttributeOverrides = embeddedIdMapping.specifiedAttributeOverrides(); + attributeOverride = specifiedAttributeOverrides.next(); + assertEquals("city", attributeOverride.getName()); + assertEquals("FOO_COLUMN", attributeOverride.getColumn().getSpecifiedName()); + assertEquals("FOO_TABLE", attributeOverride.getColumn().getSpecifiedTable()); + + attributeOverride = specifiedAttributeOverrides.next(); + assertEquals("id", attributeOverride.getName()); + attributeOverride = specifiedAttributeOverrides.next(); + assertEquals("state", attributeOverride.getName()); + assertEquals("MY_STATE_COLUMN", attributeOverride.getColumn().getSpecifiedName()); + attributeOverride = specifiedAttributeOverrides.next(); + assertEquals("zip", attributeOverride.getName()); + + + + //embedded mapping is specified, virtual attribute overrides should exist + persistentType.getAttributeNamed("address").makeSpecified(); + embeddedIdMapping = (OrmEmbeddedIdMapping) persistentType.getAttributeNamed("address").getMapping(); + assertEquals(4, embeddedIdMapping.attributeOverridesSize()); + assertEquals(4, embeddedIdMapping.virtualAttributeOverridesSize()); + assertEquals(0, embeddedIdMapping.specifiedAttributeOverridesSize()); + ListIterator<OrmAttributeOverride> virtualAttributeOverrides = embeddedIdMapping.virtualAttributeOverrides(); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("id", attributeOverride.getName()); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("city", attributeOverride.getName()); + assertEquals("city", attributeOverride.getColumn().getDefaultName()); + assertEquals(TYPE_NAME, attributeOverride.getColumn().getDefaultTable()); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("state", attributeOverride.getName()); + assertEquals("MY_STATE_COLUMN", attributeOverride.getColumn().getDefaultName()); + assertEquals(TYPE_NAME, attributeOverride.getColumn().getDefaultTable()); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("zip", attributeOverride.getName()); + + //set one of the virtual attribute overrides to specified, verify others are still virtual + embeddedIdMapping.virtualAttributeOverrides().next().setVirtual(false); + + assertEquals(4, embeddedIdMapping.attributeOverridesSize()); + assertEquals(1, embeddedIdMapping.specifiedAttributeOverridesSize()); + assertEquals(3, embeddedIdMapping.virtualAttributeOverridesSize()); + assertEquals("id", embeddedIdMapping.specifiedAttributeOverrides().next().getName()); + virtualAttributeOverrides = embeddedIdMapping.virtualAttributeOverrides(); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("city", attributeOverride.getName()); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("state", attributeOverride.getName()); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("zip", attributeOverride.getName()); + } + + + public void testVirtualMappingMetadataCompleteFalse() throws Exception { + createTestEntityEmbeddedIdMapping(); + createTestEmbeddableAddress(); + + OrmPersistentType ormPersistentType = entityMappings().addOrmPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME); + entityMappings().addOrmPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address"); + assertEquals(3, ormPersistentType.virtualAttributesSize()); + OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.virtualAttributes().next(); + + OrmEmbeddedIdMapping ormEmbeddedIdMapping = (OrmEmbeddedIdMapping) ormPersistentAttribute.getMapping(); + assertEquals("address", ormEmbeddedIdMapping.getName()); + + assertEquals(4, ormEmbeddedIdMapping.specifiedAttributeOverridesSize()); + assertEquals(0, ormEmbeddedIdMapping.virtualAttributeOverridesSize()); + ListIterator<OrmAttributeOverride> ormAttributeOverrides = ormEmbeddedIdMapping.specifiedAttributeOverrides(); + + OrmAttributeOverride ormAttributeOverride = ormAttributeOverrides.next(); + assertEquals(ATTRIBUTE_OVERRIDE_NAME, ormAttributeOverride.getName()); + OrmColumn ormColumn = ormAttributeOverride.getColumn(); + assertEquals(ATTRIBUTE_OVERRIDE_COLUMN_NAME, ormColumn.getSpecifiedName()); + + + ormAttributeOverride = ormAttributeOverrides.next(); + assertEquals("id", ormAttributeOverride.getName()); + ormColumn = ormAttributeOverride.getColumn(); + assertEquals("id", ormColumn.getSpecifiedName()); + + ormAttributeOverride = ormAttributeOverrides.next(); + assertEquals("state", ormAttributeOverride.getName()); + ormColumn = ormAttributeOverride.getColumn(); + assertEquals("A_STATE", ormColumn.getSpecifiedName()); + + ormAttributeOverride = ormAttributeOverrides.next(); + assertEquals("zip", ormAttributeOverride.getName()); + ormColumn = ormAttributeOverride.getColumn(); + assertEquals("zip", ormColumn.getSpecifiedName()); + + } + + public void testVirtualMappingMetadataCompleteTrue() throws Exception { + createTestEntityEmbeddedIdMapping(); + createTestEmbeddableAddress(); + + OrmPersistentType ormPersistentType = entityMappings().addOrmPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME); + entityMappings().addOrmPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address"); + ormPersistentType.getMapping().setSpecifiedMetadataComplete(Boolean.TRUE); + assertEquals(3, ormPersistentType.virtualAttributesSize()); + OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.virtualAttributes().next(); + + //will be an OrmEmbeddedMapping instead of OrmEmbeddedIdMapping since that is the default + OrmEmbeddedMapping ormEmbeddedMapping = (OrmEmbeddedMapping) ormPersistentAttribute.getMapping(); + assertEquals("address", ormEmbeddedMapping.getName()); + + //TODO +// assertEquals(4, ormEmbeddedIdMapping.specifiedAttributeOverridesSize()); +// assertEquals(0, CollectionTools.size(ormEmbeddedIdMapping.defaultAttributeOverrides())); +// ListIterator<XmlAttributeOverride> ormAttributeOverrides = ormEmbeddedIdMapping.specifiedAttributeOverrides(); +// +// XmlAttributeOverride ormAttributeOverride = ormAttributeOverrides.next(); +// assertEquals(ATTRIBUTE_OVERRIDE_NAME, ormAttributeOverride.getName()); +// XmlColumn xmlColumn = ormAttributeOverride.getColumn(); +// assertEquals("city", xmlColumn.getSpecifiedName()); +//// assertEquals(Boolean.TRUE, xmlColumn.getSpecifiedUnique()); +//// assertEquals(Boolean.FALSE, xmlColumn.getSpecifiedNullable()); +//// assertEquals(Boolean.FALSE, xmlColumn.getSpecifiedInsertable()); +//// assertEquals(Boolean.FALSE, xmlColumn.getSpecifiedUpdatable()); +//// assertEquals("COLUMN_DEFINITION", xmlColumn.getColumnDefinition()); +//// assertEquals("MY_TABLE", xmlColumn.getSpecifiedTable()); +//// assertEquals(Integer.valueOf(5), xmlColumn.getSpecifiedLength()); +//// assertEquals(Integer.valueOf(6), xmlColumn.getSpecifiedPrecision()); +//// assertEquals(Integer.valueOf(7), xmlColumn.getSpecifiedScale()); +// +// ormAttributeOverride = ormAttributeOverrides.next(); +// assertEquals("id", ormAttributeOverride.getName()); +// xmlColumn = ormAttributeOverride.getColumn(); +// assertEquals("id", xmlColumn.getSpecifiedName()); +// +// ormAttributeOverride = ormAttributeOverrides.next(); +// assertEquals("state", ormAttributeOverride.getName()); +// xmlColumn = ormAttributeOverride.getColumn(); +// assertEquals("state", xmlColumn.getSpecifiedName()); +// +// ormAttributeOverride = ormAttributeOverrides.next(); +// assertEquals("zip", ormAttributeOverride.getName()); +// xmlColumn = ormAttributeOverride.getColumn(); +// assertEquals("zip", xmlColumn.getSpecifiedName()); + } + + public void testSpecifiedMapping() throws Exception { + createTestEntityEmbeddedIdMapping(); + createTestEmbeddableAddress(); + + OrmPersistentType ormPersistentType = entityMappings().addOrmPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME); + entityMappings().addOrmPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address"); + + ormPersistentType.addSpecifiedPersistentAttribute(MappingKeys.EMBEDDED_ID_ATTRIBUTE_MAPPING_KEY, "address"); + assertEquals(2, ormPersistentType.virtualAttributesSize()); + + OrmPersistentAttribute ormPersistentAttribute = ormPersistentType.specifiedAttributes().next(); + OrmEmbeddedIdMapping ormEmbeddedIdMapping = (OrmEmbeddedIdMapping) ormPersistentAttribute.getMapping(); + + assertEquals("address", ormEmbeddedIdMapping.getName()); + + assertEquals(0, ormEmbeddedIdMapping.specifiedAttributeOverridesSize()); + //TODO +// assertEquals(4, CollectionTools.size(ormEmbeddedIdMapping.defaultAttributeOverrides())); +// ListIterator<XmlAttributeOverride> ormAttributeOverrides = ormEmbeddedIdMapping.defaultAttributeOverrides(); +// +// XmlAttributeOverride ormAttributeOverride = ormAttributeOverrides.next(); +// assertEquals(ATTRIBUTE_OVERRIDE_NAME, ormAttributeOverride.getName()); +// XmlColumn xmlColumn = ormAttributeOverride.getColumn(); +// assertEquals("city", xmlColumn.getDefaultName()); +//// assertEquals(Boolean.TRUE, xmlColumn.getSpecifiedUnique()); +//// assertEquals(Boolean.FALSE, xmlColumn.getSpecifiedNullable()); +//// assertEquals(Boolean.FALSE, xmlColumn.getSpecifiedInsertable()); +//// assertEquals(Boolean.FALSE, xmlColumn.getSpecifiedUpdatable()); +//// assertEquals("COLUMN_DEFINITION", xmlColumn.getColumnDefinition()); +//// assertEquals("MY_TABLE", xmlColumn.getSpecifiedTable()); +//// assertEquals(Integer.valueOf(5), xmlColumn.getSpecifiedLength()); +//// assertEquals(Integer.valueOf(6), xmlColumn.getSpecifiedPrecision()); +//// assertEquals(Integer.valueOf(7), xmlColumn.getSpecifiedScale()); +// +// ormAttributeOverride = ormAttributeOverrides.next(); +// assertEquals("id", ormAttributeOverride.getName()); +// xmlColumn = ormAttributeOverride.getColumn(); +// assertEquals("id", xmlColumn.getDefaultName()); +// +// ormAttributeOverride = ormAttributeOverrides.next(); +// assertEquals("state", ormAttributeOverride.getName()); +// xmlColumn = ormAttributeOverride.getColumn(); +// assertEquals("state", xmlColumn.getDefaultName()); +// +// ormAttributeOverride = ormAttributeOverrides.next(); +// assertEquals("zip", ormAttributeOverride.getName()); +// xmlColumn = ormAttributeOverride.getColumn(); +// assertEquals("zip", xmlColumn.getDefaultName()); + } }
\ No newline at end of file diff --git a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/context/orm/OrmEmbeddedMappingTests.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/context/orm/OrmEmbeddedMappingTests.java index 49d28c22b2..a8abb3bcab 100644 --- a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/context/orm/OrmEmbeddedMappingTests.java +++ b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/context/orm/OrmEmbeddedMappingTests.java @@ -25,6 +25,8 @@ import org.eclipse.jpt.core.context.OneToManyMapping; import org.eclipse.jpt.core.context.OneToOneMapping; import org.eclipse.jpt.core.context.TransientMapping; import org.eclipse.jpt.core.context.VersionMapping; +import org.eclipse.jpt.core.context.java.JavaBasicMapping; +import org.eclipse.jpt.core.context.java.JavaEmbeddedMapping; import org.eclipse.jpt.core.context.orm.OrmAttributeOverride; import org.eclipse.jpt.core.context.orm.OrmColumn; import org.eclipse.jpt.core.context.orm.OrmEmbeddedMapping; @@ -359,6 +361,88 @@ public class OrmEmbeddedMappingTests extends ContextModelTestCase assertFalse(ormEmbeddedMapping.virtualAttributeOverrides().hasNext()); } + public void testVirtualAttributeOverrides() throws Exception { + createTestEntityEmbeddedMapping(); + createTestEmbeddableAddress(); + OrmPersistentType persistentType = entityMappings().addOrmPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME); + OrmPersistentType persistentType2 = entityMappings().addOrmPersistentType(MappingKeys.EMBEDDABLE_TYPE_MAPPING_KEY, PACKAGE_NAME + ".Address"); + + //embedded mapping is virtual, specified attribute overrides should exist + OrmEmbeddedMapping embeddedMapping = (OrmEmbeddedMapping) persistentType.getAttributeNamed("address").getMapping(); + assertEquals(4, embeddedMapping.attributeOverridesSize()); + assertEquals(0, embeddedMapping.virtualAttributeOverridesSize()); + assertEquals(4, embeddedMapping.specifiedAttributeOverridesSize()); + ListIterator<OrmAttributeOverride> specifiedAttributeOverrides = embeddedMapping.specifiedAttributeOverrides(); + OrmAttributeOverride attributeOverride = specifiedAttributeOverrides.next(); + assertEquals("city", attributeOverride.getName()); + attributeOverride = specifiedAttributeOverrides.next(); + assertEquals("id", attributeOverride.getName()); + attributeOverride = specifiedAttributeOverrides.next(); + assertEquals("state", attributeOverride.getName()); + attributeOverride = specifiedAttributeOverrides.next(); + assertEquals("zip", attributeOverride.getName()); + + JavaEmbeddedMapping javaEmbeddedMapping = (JavaEmbeddedMapping) embeddedMapping.getJavaPersistentAttribute().getMapping(); + javaEmbeddedMapping.specifiedAttributeOverrides().next().getColumn().setSpecifiedName("FOO_COLUMN"); + javaEmbeddedMapping.specifiedAttributeOverrides().next().getColumn().setSpecifiedTable("FOO_TABLE"); + JavaBasicMapping javaBasicMapping = (JavaBasicMapping) persistentType2.getJavaPersistentType().getAttributeNamed("state").getMapping(); + javaBasicMapping.getColumn().setSpecifiedName("MY_STATE_COLUMN"); + assertEquals(4, embeddedMapping.attributeOverridesSize()); + assertEquals(0, embeddedMapping.virtualAttributeOverridesSize()); + assertEquals(4, embeddedMapping.specifiedAttributeOverridesSize()); + specifiedAttributeOverrides = embeddedMapping.specifiedAttributeOverrides(); + attributeOverride = specifiedAttributeOverrides.next(); + assertEquals("city", attributeOverride.getName()); + assertEquals("FOO_COLUMN", attributeOverride.getColumn().getSpecifiedName()); + assertEquals("FOO_TABLE", attributeOverride.getColumn().getSpecifiedTable()); + + attributeOverride = specifiedAttributeOverrides.next(); + assertEquals("id", attributeOverride.getName()); + attributeOverride = specifiedAttributeOverrides.next(); + assertEquals("state", attributeOverride.getName()); + assertEquals("MY_STATE_COLUMN", attributeOverride.getColumn().getSpecifiedName()); + attributeOverride = specifiedAttributeOverrides.next(); + assertEquals("zip", attributeOverride.getName()); + + + + //embedded mapping is specified, virtual attribute overrides should exist + persistentType.getAttributeNamed("address").makeSpecified(); + ormResource().save(null); + embeddedMapping = (OrmEmbeddedMapping) persistentType.getAttributeNamed("address").getMapping(); + assertEquals(4, embeddedMapping.attributeOverridesSize()); + assertEquals(4, embeddedMapping.virtualAttributeOverridesSize()); + assertEquals(0, embeddedMapping.specifiedAttributeOverridesSize()); + ListIterator<OrmAttributeOverride> virtualAttributeOverrides = embeddedMapping.virtualAttributeOverrides(); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("id", attributeOverride.getName()); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("city", attributeOverride.getName()); + assertEquals("city", attributeOverride.getColumn().getDefaultName()); + assertEquals(TYPE_NAME, attributeOverride.getColumn().getDefaultTable()); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("state", attributeOverride.getName()); + assertEquals("MY_STATE_COLUMN", attributeOverride.getColumn().getDefaultName()); + assertEquals(TYPE_NAME, attributeOverride.getColumn().getDefaultTable()); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("zip", attributeOverride.getName()); + + //set one of the virtual attribute overrides to specified, verify others are still virtual + embeddedMapping.virtualAttributeOverrides().next().setVirtual(false); + + assertEquals(4, embeddedMapping.attributeOverridesSize()); + assertEquals(1, embeddedMapping.specifiedAttributeOverridesSize()); + assertEquals(3, embeddedMapping.virtualAttributeOverridesSize()); + assertEquals("id", embeddedMapping.specifiedAttributeOverrides().next().getName()); + virtualAttributeOverrides = embeddedMapping.virtualAttributeOverrides(); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("city", attributeOverride.getName()); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("state", attributeOverride.getName()); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("zip", attributeOverride.getName()); + } + public void testVirtualMappingMetadataCompleteFalse() throws Exception { createTestEntityEmbeddedMapping(); @@ -380,16 +464,8 @@ public class OrmEmbeddedMappingTests extends ContextModelTestCase assertEquals(ATTRIBUTE_OVERRIDE_NAME, ormAttributeOverride.getName()); OrmColumn ormColumn = ormAttributeOverride.getColumn(); assertEquals(ATTRIBUTE_OVERRIDE_COLUMN_NAME, ormColumn.getSpecifiedName()); -// assertEquals(Boolean.TRUE, xmlColumn.getSpecifiedUnique()); -// assertEquals(Boolean.FALSE, xmlColumn.getSpecifiedNullable()); -// assertEquals(Boolean.FALSE, xmlColumn.getSpecifiedInsertable()); -// assertEquals(Boolean.FALSE, xmlColumn.getSpecifiedUpdatable()); -// assertEquals("COLUMN_DEFINITION", xmlColumn.getColumnDefinition()); -// assertEquals("MY_TABLE", xmlColumn.getSpecifiedTable()); -// assertEquals(Integer.valueOf(5), xmlColumn.getSpecifiedLength()); -// assertEquals(Integer.valueOf(6), xmlColumn.getSpecifiedPrecision()); -// assertEquals(Integer.valueOf(7), xmlColumn.getSpecifiedScale()); - + + ormAttributeOverride = ormAttributeOverrides.next(); assertEquals("id", ormAttributeOverride.getName()); ormColumn = ormAttributeOverride.getColumn(); diff --git a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/context/orm/OrmEntityTests.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/context/orm/OrmEntityTests.java index 9c39a7393a..a0db2dc0e0 100644 --- a/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/context/orm/OrmEntityTests.java +++ b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/context/orm/OrmEntityTests.java @@ -21,6 +21,7 @@ import org.eclipse.jpt.core.context.java.JavaPrimaryKeyJoinColumn; import org.eclipse.jpt.core.context.java.JavaSecondaryTable; import org.eclipse.jpt.core.context.orm.OrmAssociationOverride; import org.eclipse.jpt.core.context.orm.OrmAttributeOverride; +import org.eclipse.jpt.core.context.orm.OrmBasicMapping; import org.eclipse.jpt.core.context.orm.OrmEmbeddable; import org.eclipse.jpt.core.context.orm.OrmEntity; import org.eclipse.jpt.core.context.orm.OrmIdMapping; @@ -1604,6 +1605,121 @@ public class OrmEntityTests extends ContextModelTestCase assertFalse(ormEntity.specifiedAttributeOverrides().hasNext()); } + public void testVirtualAttributeOverrides() throws Exception { + createTestMappedSuperclass(); + createTestSubType(); + OrmPersistentType persistentType = entityMappings().addOrmPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_CHILD_TYPE_NAME); + OrmPersistentType persistentType2 = entityMappings().addOrmPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME); + + + OrmEntity entity = (OrmEntity) persistentType.getMapping(); + + assertEquals(3, entity.virtualAttributeOverridesSize()); + ListIterator<OrmAttributeOverride> virtualAttributeOverrides = entity.virtualAttributeOverrides(); + OrmAttributeOverride attributeOverride = virtualAttributeOverrides.next(); + assertEquals("id", attributeOverride.getName()); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("name", attributeOverride.getName()); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("foo", attributeOverride.getName()); + + entity.virtualAttributeOverrides().next().setVirtual(false); + + assertEquals(2, entity.virtualAttributeOverridesSize()); + virtualAttributeOverrides = entity.virtualAttributeOverrides(); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("name", attributeOverride.getName()); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("foo", attributeOverride.getName()); + + entity.setSpecifiedMetadataComplete(Boolean.TRUE); + assertEquals(2, entity.virtualAttributeOverridesSize()); + virtualAttributeOverrides = entity.virtualAttributeOverrides(); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("name", attributeOverride.getName()); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("foo", attributeOverride.getName()); + + entity.specifiedAttributeOverrides().next().setVirtual(true); + entity.setSpecifiedMetadataComplete(Boolean.FALSE); + entity.getJavaEntity().virtualAttributeOverrides().next().setVirtual(false); + entity.getJavaEntity().specifiedAttributeOverrides().next().getColumn().setSpecifiedName("FOO"); + assertEquals(3, entity.virtualAttributeOverridesSize()); + virtualAttributeOverrides = entity.virtualAttributeOverrides(); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("id", attributeOverride.getName()); + assertEquals("FOO", attributeOverride.getColumn().getSpecifiedName());//TODO specified or default? + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("name", attributeOverride.getName()); + assertEquals("name", attributeOverride.getColumn().getSpecifiedName()); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("foo", attributeOverride.getName()); + + persistentType2.getAttributeNamed("name").makeSpecified(); + OrmBasicMapping basicMapping = (OrmBasicMapping) persistentType2.getAttributeNamed("name").getMapping(); + basicMapping.getColumn().setSpecifiedName("MY_NAME"); + + assertEquals(3, entity.virtualAttributeOverridesSize()); + virtualAttributeOverrides = entity.virtualAttributeOverrides(); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("name", attributeOverride.getName()); + assertEquals("MY_NAME", attributeOverride.getColumn().getSpecifiedName()); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("id", attributeOverride.getName()); + assertEquals("FOO", attributeOverride.getColumn().getSpecifiedName());//TODO specified or default? + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("foo", attributeOverride.getName()); + } + + public void testVirtualAttributeOverridesNoJavaEntity() throws Exception { + createTestMappedSuperclass(); + createTestSubType(); + OrmPersistentType persistentType = entityMappings().addOrmPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_CHILD_TYPE_NAME); + entityMappings().addOrmPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME); + + + OrmEntity entity = (OrmEntity) persistentType.getMapping(); + + persistentType.getJavaPersistentType().setMappingKey(MappingKeys.NULL_TYPE_MAPPING_KEY); + assertEquals(3, entity.virtualAttributeOverridesSize()); + ListIterator<OrmAttributeOverride> virtualAttributeOverrides = entity.virtualAttributeOverrides(); + OrmAttributeOverride attributeOverride = virtualAttributeOverrides.next(); + assertEquals("id", attributeOverride.getName()); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("name", attributeOverride.getName()); + attributeOverride = virtualAttributeOverrides.next(); + assertEquals("foo", attributeOverride.getName()); + } + + public void testAttributeOverrideColumnDefaults() throws Exception { + createTestMappedSuperclass(); + createTestSubType(); + OrmPersistentType persistentType = entityMappings().addOrmPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_CHILD_TYPE_NAME); + entityMappings().addOrmPersistentType(MappingKeys.MAPPED_SUPERCLASS_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME); + + + OrmEntity entity = (OrmEntity) persistentType.getMapping(); + + entity.virtualAttributeOverrides().next().setVirtual(false); + + OrmAttributeOverride attributeOverride = entity.specifiedAttributeOverrides().next(); + assertEquals("id", attributeOverride.getColumn().getDefaultName()); + assertEquals(CHILD_TYPE_NAME, attributeOverride.getColumn().getDefaultTable()); + + ((JavaEntity) persistentType.getJavaPersistentType().getMapping()).getTable().setSpecifiedName("FOO"); + assertEquals("id", attributeOverride.getColumn().getDefaultName()); + assertEquals("FOO", attributeOverride.getColumn().getDefaultTable()); + + entity.setSpecifiedMetadataComplete(Boolean.TRUE); + assertEquals("id", attributeOverride.getColumn().getDefaultName()); + assertEquals(CHILD_TYPE_NAME, attributeOverride.getColumn().getDefaultTable()); + + entity.setSpecifiedMetadataComplete(Boolean.FALSE); + entity.getTable().setSpecifiedName("BAR"); + assertEquals("id", attributeOverride.getColumn().getDefaultName()); + assertEquals("BAR", attributeOverride.getColumn().getDefaultTable()); + } + // public void testAddSpecifiedAssociationOverride() throws Exception { // OrmPersistentType persistentType = entityMappings().addOrmPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME); // OrmEntity ormEntity = (OrmEntity) persistentType.getMapping(); |