diff options
Diffstat (limited to 'jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmMultiRelationshipMapping.java')
-rw-r--r-- | jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmMultiRelationshipMapping.java | 116 |
1 files changed, 115 insertions, 1 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmMultiRelationshipMapping.java b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmMultiRelationshipMapping.java index eabf1c41cd..0fd2048d2e 100644 --- a/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmMultiRelationshipMapping.java +++ b/jpa/plugins/org.eclipse.jpt.jpa.core/src/org/eclipse/jpt/jpa/core/internal/context/orm/AbstractOrmMultiRelationshipMapping.java @@ -16,12 +16,14 @@ import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IType; import org.eclipse.jpt.common.core.utility.TextRange; import org.eclipse.jpt.common.utility.internal.Tools; +import org.eclipse.jpt.common.utility.internal.iterables.ArrayIterable; import org.eclipse.jpt.common.utility.internal.iterables.CompositeIterable; import org.eclipse.jpt.common.utility.internal.iterables.EmptyIterable; import org.eclipse.jpt.common.utility.internal.iterables.SingleElementIterable; import org.eclipse.jpt.jpa.core.context.AttributeMapping; import org.eclipse.jpt.jpa.core.context.AttributeOverrideContainer; import org.eclipse.jpt.jpa.core.context.Column; +import org.eclipse.jpt.jpa.core.context.Converter; import org.eclipse.jpt.jpa.core.context.Embeddable; import org.eclipse.jpt.jpa.core.context.Entity; import org.eclipse.jpt.jpa.core.context.FetchType; @@ -36,11 +38,13 @@ import org.eclipse.jpt.jpa.core.context.java.JavaAttributeOverride; import org.eclipse.jpt.jpa.core.context.java.JavaPersistentAttribute; import org.eclipse.jpt.jpa.core.context.orm.OrmAttributeOverrideContainer; import org.eclipse.jpt.jpa.core.context.orm.OrmColumn; +import org.eclipse.jpt.jpa.core.context.orm.OrmConverter; import org.eclipse.jpt.jpa.core.context.orm.OrmMultiRelationshipMapping; import org.eclipse.jpt.jpa.core.context.orm.OrmOrderable; import org.eclipse.jpt.jpa.core.context.orm.OrmPersistentAttribute; import org.eclipse.jpt.jpa.core.context.orm.OrmRelationshipStrategy; import org.eclipse.jpt.jpa.core.context.orm.OrmTypeMapping; +import org.eclipse.jpt.jpa.core.context.orm.OrmXmlContextNodeFactory; import org.eclipse.jpt.jpa.core.internal.context.BaseColumnTextRangeResolver; import org.eclipse.jpt.jpa.core.internal.context.JptValidator; import org.eclipse.jpt.jpa.core.internal.context.MappingTools; @@ -51,9 +55,12 @@ import org.eclipse.jpt.jpa.core.internal.jpa1.context.MapKeyAttributeOverrideCol import org.eclipse.jpt.jpa.core.internal.jpa1.context.MapKeyAttributeOverrideValidator; import org.eclipse.jpt.jpa.core.internal.jpa1.context.MapKeyColumnValidator; import org.eclipse.jpt.jpa.core.internal.jpa1.context.RelationshipStrategyTableDescriptionProvider; +import org.eclipse.jpt.jpa.core.internal.jpa1.context.orm.NullOrmConverter; import org.eclipse.jpt.jpa.core.jpa2.context.Orderable2_0; import org.eclipse.jpt.jpa.core.jpa2.context.java.JavaCollectionMapping2_0; import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmCollectionMapping2_0; +import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmMapKeyEnumeratedConverter2_0; +import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmMapKeyTemporalConverter2_0; import org.eclipse.jpt.jpa.core.jpa2.context.orm.OrmPersistentAttribute2_0; import org.eclipse.jpt.jpa.core.resource.orm.AbstractXmlMultiRelationshipMapping; import org.eclipse.jpt.jpa.core.resource.orm.MapKey; @@ -87,10 +94,17 @@ public abstract class AbstractOrmMultiRelationshipMapping<X extends AbstractXmlM protected Type keyType; protected final OrmColumn mapKeyColumn; + protected OrmConverter mapKeyConverter; // map key converter - never null protected final OrmAttributeOverrideContainer mapKeyAttributeOverrideContainer; + protected static final OrmConverter.Adapter[] MAP_KEY_CONVERTER_ADAPTER_ARRAY = new OrmConverter.Adapter[] { + OrmMapKeyEnumeratedConverter2_0.Adapter.instance(), + OrmMapKeyTemporalConverter2_0.Adapter.instance() + }; + protected static final Iterable<OrmConverter.Adapter> MAP_KEY_CONVERTER_ADAPTERS = new ArrayIterable<OrmConverter.Adapter>(MAP_KEY_CONVERTER_ADAPTER_ARRAY); + protected AbstractOrmMultiRelationshipMapping(OrmPersistentAttribute parent, X xmlMapping) { super(parent, xmlMapping); this.orderable = this.buildOrderable(); @@ -103,6 +117,7 @@ public abstract class AbstractOrmMultiRelationshipMapping<X extends AbstractXmlM this.specifiedMapKeyClass = this.buildSpecifiedMapKeyClass(); this.mapKeyColumn = this.buildMapKeyColumn(); + this.mapKeyConverter = this.buildMapKeyConverter(); this.mapKeyAttributeOverrideContainer = this.buildMapKeyAttributeOverrideContainer(); } @@ -122,6 +137,7 @@ public abstract class AbstractOrmMultiRelationshipMapping<X extends AbstractXmlM this.setSpecifiedMapKeyClass_(this.buildSpecifiedMapKeyClass()); this.mapKeyColumn.synchronizeWithResourceModel(); + this.syncMapKeyConverter(); this.mapKeyAttributeOverrideContainer.synchronizeWithResourceModel(); } @@ -138,6 +154,7 @@ public abstract class AbstractOrmMultiRelationshipMapping<X extends AbstractXmlM this.setKeyType(this.buildKeyType()); this.mapKeyColumn.update(); + this.mapKeyConverter.update(); this.mapKeyAttributeOverrideContainer.update(); } @@ -507,6 +524,103 @@ public abstract class AbstractOrmMultiRelationshipMapping<X extends AbstractXmlM } + // ********** map key converter ********** + + public OrmConverter getMapKeyConverter() { + return this.mapKeyConverter; + } + + public void setMapKeyConverter(Class<? extends Converter> converterType) { + if (this.mapKeyConverter.getType() != converterType) { + // note: we may also clear the XML value we want; + // but if we leave it, the resulting sync will screw things up... + this.clearXmlMapKeyConverterValues(); + OrmConverter.Adapter converterAdapter = this.getMapKeyConverterAdapter(converterType); + this.setMapKeyConverter_(this.buildMapKeyConverter(converterAdapter)); + this.mapKeyConverter.initialize(); + } + } + + protected OrmConverter buildMapKeyConverter(OrmConverter.Adapter converterAdapter) { + return (converterAdapter != null) ? + converterAdapter.buildNewConverter(this, this.getContextNodeFactory()) : + this.buildNullMapKeyConverter(); + } + + protected void setMapKeyConverter_(OrmConverter converter) { + Converter old = this.mapKeyConverter; + this.mapKeyConverter = converter; + this.firePropertyChanged(MAP_KEY_CONVERTER_PROPERTY, old, converter); + } + + protected void clearXmlMapKeyConverterValues() { + for (OrmConverter.Adapter adapter : this.getMapKeyConverterAdapters()) { + adapter.clearXmlValue(this.xmlAttributeMapping); + } + } + + protected OrmConverter buildMapKeyConverter() { + OrmXmlContextNodeFactory factory = this.getContextNodeFactory(); + for (OrmConverter.Adapter adapter : this.getMapKeyConverterAdapters()) { + OrmConverter ormConverter = adapter.buildConverter(this, factory); + if (ormConverter != null) { + return ormConverter; + } + } + return this.buildNullMapKeyConverter(); + } + + protected void syncMapKeyConverter() { + OrmConverter.Adapter adapter = this.getXmlMapKeyConverterAdapter(); + if (adapter == null) { + if (this.mapKeyConverter.getType() != null) { + this.setMapKeyConverter_(this.buildNullMapKeyConverter()); + } + } else { + if (this.mapKeyConverter.getType() == adapter.getConverterType()) { + this.mapKeyConverter.synchronizeWithResourceModel(); + } else { + this.setMapKeyConverter_(adapter.buildNewConverter(this, this.getContextNodeFactory())); + } + } + } + + /** + * Return the first adapter whose converter value is set in the XML mapping. + * Return <code>null</code> if there are no converter values in the XML. + */ + protected OrmConverter.Adapter getXmlMapKeyConverterAdapter() { + for (OrmConverter.Adapter adapter : this.getMapKeyConverterAdapters()) { + if (adapter.isActive(this.xmlAttributeMapping)) { + return adapter; + } + } + return null; + } + + protected OrmConverter buildNullMapKeyConverter() { + return new NullOrmConverter(this); + } + + + // ********** map key converter adapters ********** + + /** + * Return the converter adapter for the specified converter type. + */ + protected OrmConverter.Adapter getMapKeyConverterAdapter(Class<? extends Converter> converterType) { + for (OrmConverter.Adapter adapter : this.getMapKeyConverterAdapters()) { + if (adapter.getConverterType() == converterType) { + return adapter; + } + } + return null; + } + + protected Iterable<OrmConverter.Adapter> getMapKeyConverterAdapters() { + return MAP_KEY_CONVERTER_ADAPTERS; + } + // ********** map key attribute override container ********** public OrmAttributeOverrideContainer getMapKeyAttributeOverrideContainer() { @@ -670,7 +784,7 @@ public abstract class AbstractOrmMultiRelationshipMapping<X extends AbstractXmlM } if (this.keyType == Type.BASIC_TYPE) { this.mapKeyColumn.validate(messages, reporter); - //validate map key converter + this.mapKeyConverter.validate(messages, reporter); } else if (this.keyType == Type.ENTITY_TYPE) { //validate map key join columns |