Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java116
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

Back to the top