diff options
author | kmoore | 2008-05-15 03:44:50 +0000 |
---|---|---|
committer | kmoore | 2008-05-15 03:44:50 +0000 |
commit | 4430c991a979645c0853ca34d9226676638c87ab (patch) | |
tree | eab203e0ade69e65f6ef0dd049b9e580616070d7 | |
parent | 595a7dfcbac5fc2bff37bbb3ef993f8cb94770b1 (diff) | |
download | webtools.dali-4430c991a979645c0853ca34d9226676638c87ab.tar.gz webtools.dali-4430c991a979645c0853ca34d9226676638c87ab.tar.xz webtools.dali-4430c991a979645c0853ca34d9226676638c87ab.zip |
228571 - defaultPkJoinColumns for OrmEntity
14 files changed, 1120 insertions, 63 deletions
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 e31e2be756..6d9b7f0a84 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 @@ -88,6 +88,7 @@ public interface OrmEntity extends OrmTypeMapping, Entity, OrmGeneratorHolder ListIterator<OrmPrimaryKeyJoinColumn> primaryKeyJoinColumns(); OrmPrimaryKeyJoinColumn getDefaultPrimaryKeyJoinColumn(); ListIterator<OrmPrimaryKeyJoinColumn> defaultPrimaryKeyJoinColumns(); + String DEFAULT_PRIMARY_KEY_JOIN_COLUMNS_LIST = "defaultPrimaryKeyJoinColumnsList"; @SuppressWarnings("unchecked") ListIterator<OrmPrimaryKeyJoinColumn> specifiedPrimaryKeyJoinColumns(); OrmPrimaryKeyJoinColumn addSpecifiedPrimaryKeyJoinColumn(int index); 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 20a7442bb5..677288de4c 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 @@ -37,6 +37,7 @@ import org.eclipse.jpt.core.context.Table; import org.eclipse.jpt.core.context.TypeMapping; import org.eclipse.jpt.core.context.java.JavaEntity; import org.eclipse.jpt.core.context.java.JavaPersistentType; +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; @@ -622,8 +623,15 @@ public class GenericOrmEntity extends AbstractOrmTypeMapping<XmlEntity> implemen } public OrmPrimaryKeyJoinColumn getDefaultPrimaryKeyJoinColumn() { - // TODO Auto-generated method stub - return null; + throw new UnsupportedOperationException("use defaultPrimaryKeyJoinColumns() instead"); + } + + protected void addDefaultPrimaryKeyJoinColumn(OrmPrimaryKeyJoinColumn defaultPkJoinColumn) { + addItemToList(defaultPkJoinColumn, this.defaultPrimaryKeyJoinColumns, OrmEntity.DEFAULT_PRIMARY_KEY_JOIN_COLUMNS_LIST); + } + + protected void removeDefaultPrimaryKeyJoinColumn(PrimaryKeyJoinColumn defaultPkJoinColumn) { + removeItemFromList(defaultPkJoinColumn, this.defaultPrimaryKeyJoinColumns, OrmEntity.DEFAULT_PRIMARY_KEY_JOIN_COLUMNS_LIST); } public ListIterator<OrmPrimaryKeyJoinColumn> primaryKeyJoinColumns() { @@ -641,12 +649,22 @@ public class GenericOrmEntity extends AbstractOrmTypeMapping<XmlEntity> implemen public int specifiedPrimaryKeyJoinColumnsSize() { return this.specifiedPrimaryKeyJoinColumns.size(); } + + public boolean containsSpecifiedPrimaryKeyJoinColumns() { + return !this.specifiedPrimaryKeyJoinColumns.isEmpty(); + } public OrmPrimaryKeyJoinColumn addSpecifiedPrimaryKeyJoinColumn(int index) { - OrmPrimaryKeyJoinColumn primaryKeyJoinColumn = getJpaFactory().buildOrmPrimaryKeyJoinColumn(this, createPrimaryKeyJoinColumnOwner()); + if (!this.defaultPrimaryKeyJoinColumns.isEmpty()) { + this.defaultPrimaryKeyJoinColumns.clear(); + } + XmlPrimaryKeyJoinColumn xmlPrimaryKeyJoinColumn = OrmFactory.eINSTANCE.createXmlPrimaryKeyJoinColumnImpl(); + OrmPrimaryKeyJoinColumn primaryKeyJoinColumn = buildPrimaryKeyJoinColumn(xmlPrimaryKeyJoinColumn); this.specifiedPrimaryKeyJoinColumns.add(index, primaryKeyJoinColumn); - this.getTypeMappingResource().getPrimaryKeyJoinColumns().add(index, OrmFactory.eINSTANCE.createXmlPrimaryKeyJoinColumnImpl()); + this.getTypeMappingResource().getPrimaryKeyJoinColumns().add(index, xmlPrimaryKeyJoinColumn); + this.fireItemAdded(Entity.SPECIFIED_PRIMARY_KEY_JOIN_COLUMNS_LIST, index, primaryKeyJoinColumn); + this.fireListCleared(OrmEntity.DEFAULT_PRIMARY_KEY_JOIN_COLUMNS_LIST); return primaryKeyJoinColumn; } @@ -664,8 +682,17 @@ public class GenericOrmEntity extends AbstractOrmTypeMapping<XmlEntity> implemen public void removeSpecifiedPrimaryKeyJoinColumn(int index) { OrmPrimaryKeyJoinColumn removedPrimaryKeyJoinColumn = this.specifiedPrimaryKeyJoinColumns.remove(index); + if (!containsSpecifiedPrimaryKeyJoinColumns()) { + //create the defaultJoinColumn now or this will happen during project update + //after removing the join column from the resource model. That causes problems + //in the UI because the change notifications end up in the wrong order. + initializeDefaultPrimaryKeyJoinColumns(); + } this.getTypeMappingResource().getPrimaryKeyJoinColumns().remove(index); fireItemRemoved(Entity.SPECIFIED_PRIMARY_KEY_JOIN_COLUMNS_LIST, index, removedPrimaryKeyJoinColumn); + if (!this.defaultPrimaryKeyJoinColumns.isEmpty()) { + fireListChanged(OrmEntity.DEFAULT_PRIMARY_KEY_JOIN_COLUMNS_LIST); + } } protected void removeSpecifiedPrimaryKeyJoinColumn_(OrmPrimaryKeyJoinColumn primaryKeyJoinColumn) { @@ -1104,6 +1131,7 @@ public class GenericOrmEntity extends AbstractOrmTypeMapping<XmlEntity> implemen this.initializeSequenceGenerator(entity); this.initializeTableGenerator(entity); this.initializeSpecifiedPrimaryKeyJoinColumns(entity); + this.initializeDefaultPrimaryKeyJoinColumns(); this.initializeSpecifiedAttributeOverrides(entity); this.initializeSpecifiedAssociationOverrides(entity); this.initializeNamedQueries(entity); @@ -1142,6 +1170,26 @@ public class GenericOrmEntity extends AbstractOrmTypeMapping<XmlEntity> implemen } } + protected void initializeDefaultPrimaryKeyJoinColumns() { + if (isMetadataComplete()) { + return; + } + if (getJavaEntity() == null) { + this.defaultPrimaryKeyJoinColumns.add(buildPrimaryKeyJoinColumn(null)); + return; + } + if (specifiedPrimaryKeyJoinColumnsSize() > 0) { + return; + } + ListIterator<JavaPrimaryKeyJoinColumn> javaPkJoinColumns = getJavaEntity().primaryKeyJoinColumns(); + while(javaPkJoinColumns.hasNext()) { + JavaPrimaryKeyJoinColumn javaPkJoinColumn = javaPkJoinColumns.next(); + if (javaPkJoinColumn.getName() != null) { + this.defaultPrimaryKeyJoinColumns.add(buildVirtualPrimaryKeyJoinColumn(javaPkJoinColumn)); + } + } + } + protected void initializeTableGenerator(XmlEntity entity) { if (entity.getTableGenerator() != null) { this.tableGenerator = buildTableGenerator(entity.getTableGenerator()); @@ -1168,7 +1216,7 @@ public class GenericOrmEntity extends AbstractOrmTypeMapping<XmlEntity> implemen protected void initializeSpecifiedPrimaryKeyJoinColumns(XmlEntity entity) { for (XmlPrimaryKeyJoinColumn primaryKeyJoinColumn : entity.getPrimaryKeyJoinColumns()) { - this.specifiedPrimaryKeyJoinColumns.add(createPrimaryKeyJoinColumn(primaryKeyJoinColumn)); + this.specifiedPrimaryKeyJoinColumns.add(buildPrimaryKeyJoinColumn(primaryKeyJoinColumn)); } } @@ -1220,6 +1268,7 @@ public class GenericOrmEntity extends AbstractOrmTypeMapping<XmlEntity> implemen this.updateSequenceGenerator(entity); this.updateTableGenerator(entity); this.updateSpecifiedPrimaryKeyJoinColumns(entity); + this.updateDefaultPrimaryKeyJoinColumns(); this.updateSpecifiedAttributeOverrides(entity); this.updateSpecifiedAssociationOverrides(entity); this.updateNamedQueries(entity); @@ -1375,11 +1424,51 @@ public class GenericOrmEntity extends AbstractOrmTypeMapping<XmlEntity> implemen } while (resourcePrimaryKeyJoinColumns.hasNext()) { - addSpecifiedPrimaryKeyJoinColumn(specifiedPrimaryKeyJoinColumnsSize(), createPrimaryKeyJoinColumn(resourcePrimaryKeyJoinColumns.next())); + addSpecifiedPrimaryKeyJoinColumn(specifiedPrimaryKeyJoinColumnsSize(), buildPrimaryKeyJoinColumn(resourcePrimaryKeyJoinColumns.next())); } } - protected OrmPrimaryKeyJoinColumn createPrimaryKeyJoinColumn(XmlPrimaryKeyJoinColumn primaryKeyJoinColumn) { + //if there are any specified pkJoinColumns, then no default pkJoinColumns + //if the java has specified pkJoinColumns, then those are the default pkJoinColumns + //otherwise, just 1 pkJoinColumn, defaults being null if multiple primaryKey columns + protected void updateDefaultPrimaryKeyJoinColumns() { + ListIterator<OrmPrimaryKeyJoinColumn> defaultPkJoinColumns = defaultPrimaryKeyJoinColumns(); + ListIterator<JavaPrimaryKeyJoinColumn> javaPkJoinColumns = EmptyListIterator.instance(); + + if (getJavaEntity() != null && !isMetadataComplete() && specifiedPrimaryKeyJoinColumnsSize() == 0) { + javaPkJoinColumns = getJavaEntity().primaryKeyJoinColumns(); + } + while (defaultPkJoinColumns.hasNext()) { + OrmPrimaryKeyJoinColumn defaultPkJoinColumn = defaultPkJoinColumns.next(); + if (javaPkJoinColumns.hasNext()) { + JavaPrimaryKeyJoinColumn javaPkJoinColumn = javaPkJoinColumns.next(); + defaultPkJoinColumn.update(new VirtualXmlPrimaryKeyJoinColumn(javaPkJoinColumn)); + } + else { + if (defaultPrimaryKeyJoinColumnsSize() == 1) { + defaultPkJoinColumn.update(null); + } + else { + removeDefaultPrimaryKeyJoinColumn(defaultPkJoinColumn); + } + } + } + + while (javaPkJoinColumns.hasNext()) { + JavaPrimaryKeyJoinColumn javaPkJoinColumn = javaPkJoinColumns.next(); + addDefaultPrimaryKeyJoinColumn(buildVirtualPrimaryKeyJoinColumn(javaPkJoinColumn)); + } + + if (defaultPrimaryKeyJoinColumnsSize() == 0 && specifiedPrimaryKeyJoinColumnsSize() == 0) { + addDefaultPrimaryKeyJoinColumn(buildPrimaryKeyJoinColumn(null)); + } + } + + protected OrmPrimaryKeyJoinColumn buildVirtualPrimaryKeyJoinColumn(JavaPrimaryKeyJoinColumn javaSecondaryTable) { + return buildPrimaryKeyJoinColumn(new VirtualXmlPrimaryKeyJoinColumn(javaSecondaryTable)); + } + + protected OrmPrimaryKeyJoinColumn buildPrimaryKeyJoinColumn(XmlPrimaryKeyJoinColumn primaryKeyJoinColumn) { OrmPrimaryKeyJoinColumn ormPrimaryKeyJoinColumn = getJpaFactory().buildOrmPrimaryKeyJoinColumn(this, createPrimaryKeyJoinColumnOwner()); ormPrimaryKeyJoinColumn.initialize(primaryKeyJoinColumn); return ormPrimaryKeyJoinColumn; diff --git a/jpa/plugins/org.eclipse.jpt.ui/property_files/jpt_ui_mappings.properties b/jpa/plugins/org.eclipse.jpt.ui/property_files/jpt_ui_mappings.properties index c5ff38a1b7..7703f370a5 100644 --- a/jpa/plugins/org.eclipse.jpt.ui/property_files/jpt_ui_mappings.properties +++ b/jpa/plugins/org.eclipse.jpt.ui/property_files/jpt_ui_mappings.properties @@ -180,16 +180,16 @@ OverridesComposite_attribute=Attribute Override OverridesComposite_noName=<Name not set> OverridesComposite_joinColumn=Join Columns -InheritanceComposite_char=Character +AbstractInheritanceComposite_char=Character InheritanceComposite_detailsGroupBox=Details InheritanceComposite_discriminatorColumnGroupBox=Discriminator Column InheritanceComposite_discriminatorValue=Discriminator Value: -InheritanceComposite_integer=Integer -InheritanceComposite_joined=Joined -InheritanceComposite_single_table=Single Table +AbstractInheritanceComposite_integer=Integer +AbstractInheritanceComposite_joined=Joined +AbstractInheritanceComposite_single_table=Single Table InheritanceComposite_strategy=Strategy: -InheritanceComposite_string=String -InheritanceComposite_table_per_class=Table Per Class +AbstractInheritanceComposite_string=String +AbstractInheritanceComposite_table_per_class=Table Per Class DiscriminatorColumnComposite_defaultEmpty=Default(<provider-specific>) DiscriminatorColumnComposite_discriminatorType=Type: diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/details/JavaEntityComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/details/JavaEntityComposite.java index 4273139aec..5c237ca702 100644 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/details/JavaEntityComposite.java +++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/details/JavaEntityComposite.java @@ -18,7 +18,7 @@ import org.eclipse.swt.widgets.Composite; /** * The pane used for a Java entity. * - * @see OrmEntity + * @see JavaEntity * @see BaseJpaUiFactory - The factory creating this pane * @see JavaSecondaryTablesComposite * @@ -45,4 +45,9 @@ public class JavaEntityComposite extends AbstractEntityComposite<JavaEntity> protected void buildSecondaryTablesComposite(Composite container) { new JavaSecondaryTablesComposite(this, container); } + + @Override + protected void buildInheritanceComposite(Composite container) { + new JavaInheritanceComposite(this, container); + } }
\ No newline at end of file diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/details/JavaInheritanceComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/details/JavaInheritanceComposite.java new file mode 100644 index 0000000000..db97167753 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/details/JavaInheritanceComposite.java @@ -0,0 +1,60 @@ +/******************************************************************************* + * Copyright (c) 2008 Oracle. All rights reserved. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0, which accompanies this distribution + * and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Contributors: + * Oracle - initial API and implementation + ******************************************************************************/ +package org.eclipse.jpt.ui.internal.java.details; + +import org.eclipse.jpt.core.context.java.JavaEntity; +import org.eclipse.jpt.ui.WidgetFactory; +import org.eclipse.jpt.ui.internal.mappings.details.AbstractInheritanceComposite; +import org.eclipse.jpt.ui.internal.widgets.AbstractPane; +import org.eclipse.jpt.utility.model.value.PropertyValueModel; +import org.eclipse.swt.widgets.Composite; + +/** + * The pane used for java inheritance. + * + * @see JavaEntity + * @see JavaPrimaryKeyJoinColumnsComposite + * + * @version 2.0 + * @since 1.0 + */ +public class JavaInheritanceComposite extends AbstractInheritanceComposite<JavaEntity> { + + /** + * Creates a new <code>JavaInheritanceComposite</code>. + * + * @param parentPane The parent container of this one + * @param parent The parent container + */ + public JavaInheritanceComposite(AbstractPane<JavaEntity> parentPane, + Composite parent) { + + super(parentPane, parent); + } + + /** + * Creates a new <code>JavaInheritanceComposite</code>. + * + * @param subjectHolder The holder of the subject <code>JavaEntity</code> + * @param parent The parent container + * @param widgetFactory The factory used to create various common widgets + */ + public JavaInheritanceComposite(PropertyValueModel<JavaEntity> subjectHolder, + Composite parent, + WidgetFactory widgetFactory) { + + super(subjectHolder, parent, widgetFactory); + } + + @Override + protected void buildPrimaryKeyJoinColumnsComposite(Composite container) { + new JavaPrimaryKeyJoinColumnsComposite(this, container); + } +}
\ No newline at end of file diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/details/JavaPrimaryKeyJoinColumnsComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/details/JavaPrimaryKeyJoinColumnsComposite.java new file mode 100644 index 0000000000..374da4cb7c --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/java/details/JavaPrimaryKeyJoinColumnsComposite.java @@ -0,0 +1,90 @@ +/******************************************************************************* + * Copyright (c) 2008 Oracle. All rights reserved. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0, which accompanies this distribution + * and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Contributors: + * Oracle - initial API and implementation + ******************************************************************************/ +package org.eclipse.jpt.ui.internal.java.details; + +import org.eclipse.jpt.core.context.Entity; +import org.eclipse.jpt.core.context.PrimaryKeyJoinColumn; +import org.eclipse.jpt.core.context.java.JavaEntity; +import org.eclipse.jpt.ui.WidgetFactory; +import org.eclipse.jpt.ui.internal.mappings.details.AbstractPrimaryKeyJoinColumnsComposite; +import org.eclipse.jpt.ui.internal.widgets.AbstractPane; +import org.eclipse.jpt.utility.internal.model.value.PropertyAspectAdapter; +import org.eclipse.jpt.utility.internal.model.value.PropertyListValueModelAdapter; +import org.eclipse.jpt.utility.model.value.ListValueModel; +import org.eclipse.jpt.utility.model.value.PropertyValueModel; +import org.eclipse.swt.widgets.Composite; + +/** + * @see JavaEntity + * @see JavaInheritanceComposite - The container of this pane + * + * @version 2.0 + * @since 2.0 + */ +public class JavaPrimaryKeyJoinColumnsComposite extends AbstractPrimaryKeyJoinColumnsComposite<JavaEntity> +{ + + /** + * Creates a new <code>JavaPrimaryKeyJoinColumnsComposite</code>. + * + * @param parentPane The parent controller of this one + * @param parent The parent container + */ + public JavaPrimaryKeyJoinColumnsComposite(AbstractPane<? extends JavaEntity> subjectHolder, + Composite parent) { + + super(subjectHolder, parent); + } + + /** + * Creates a new <code>JavaPrimaryKeyJoinColumnsComposite</code>. + * + * @param subjectHolder The holder of this pane's subject + * @param parent The parent container + * @param widgetFactory The factory used to create various common widgets + */ + public JavaPrimaryKeyJoinColumnsComposite(PropertyValueModel<? extends JavaEntity> subjectHolder, + Composite parent, + WidgetFactory widgetFactory) { + + super(subjectHolder, parent, widgetFactory); + } + + @Override + protected ListValueModel<PrimaryKeyJoinColumn> buildDefaultJoinColumnsListHolder() { + return new PropertyListValueModelAdapter<PrimaryKeyJoinColumn>(buildDefaultJoinColumnHolder()); + } + + private PropertyValueModel<PrimaryKeyJoinColumn> buildDefaultJoinColumnHolder() { + return new PropertyAspectAdapter<Entity, PrimaryKeyJoinColumn>(getSubjectHolder(), Entity.DEFAULT_PRIMARY_KEY_JOIN_COLUMN) { + @Override + protected PrimaryKeyJoinColumn buildValue_() { + return subject.getDefaultPrimaryKeyJoinColumn(); + } + }; + } + + @Override + protected void switchDefaultToSpecified() { + PrimaryKeyJoinColumn defaultJoinColumn = subject().getDefaultPrimaryKeyJoinColumn(); + + if (defaultJoinColumn != null) { + String columnName = defaultJoinColumn.getDefaultName(); + String referencedColumnName = defaultJoinColumn.getDefaultReferencedColumnName(); + + PrimaryKeyJoinColumn pkJoinColumn = subject().addSpecifiedPrimaryKeyJoinColumn(0); + pkJoinColumn.setSpecifiedName(columnName); + pkJoinColumn.setSpecifiedReferencedColumnName(referencedColumnName); + + this.joinColumnHolder.setValue(pkJoinColumn); + } + } + +}
\ No newline at end of file diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/JptUiMappingsMessages.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/JptUiMappingsMessages.java index effa14c99d..47c45aedf3 100644 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/JptUiMappingsMessages.java +++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/JptUiMappingsMessages.java @@ -91,16 +91,16 @@ public class JptUiMappingsMessages extends NLS { public static String IdMappingComposite_primaryKeyGeneration; public static String IdMappingComposite_sequenceGenerator; public static String IdMappingComposite_tableGenerator; - public static String InheritanceComposite_char; + public static String AbstractInheritanceComposite_char; public static String InheritanceComposite_detailsGroupBox; public static String InheritanceComposite_discriminatorColumnGroupBox; public static String InheritanceComposite_discriminatorValue; - public static String InheritanceComposite_integer; - public static String InheritanceComposite_joined; - public static String InheritanceComposite_single_table; + public static String AbstractInheritanceComposite_integer; + public static String AbstractInheritanceComposite_joined; + public static String AbstractInheritanceComposite_single_table; public static String InheritanceComposite_strategy; - public static String InheritanceComposite_string; - public static String InheritanceComposite_table_per_class; + public static String AbstractInheritanceComposite_string; + public static String AbstractInheritanceComposite_table_per_class; public static String InverseJoinColumnDialog_editInverseJoinColumnTitle; public static String JoinColumnComposite_add; public static String JoinColumnComposite_defaultEmpty; diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/AbstractEntityComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/AbstractEntityComposite.java index 60c77374df..9bd2e633f0 100644 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/AbstractEntityComposite.java +++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/AbstractEntityComposite.java @@ -106,6 +106,8 @@ public abstract class AbstractEntityComposite<T extends Entity> extends Abstract } protected abstract void buildSecondaryTablesComposite(Composite container); + + protected abstract void buildInheritanceComposite(Composite container); private PropertyValueModel<Table> buildTableHolder() { return new TransformationPropertyValueModel<Entity, Table>(getSubjectHolder()) { @@ -167,7 +169,7 @@ public abstract class AbstractEntityComposite<T extends Entity> extends Abstract JptUiMappingsMessages.EntityComposite_inheritance ); - new InheritanceComposite(this, container); + buildInheritanceComposite(container); } @Override diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/AbstractInheritanceComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/AbstractInheritanceComposite.java new file mode 100644 index 0000000000..3491751a5b --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/AbstractInheritanceComposite.java @@ -0,0 +1,560 @@ +/******************************************************************************* + * Copyright (c) 2006, 2008 Oracle. All rights reserved. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0, which accompanies this distribution + * and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Contributors: + * Oracle - initial API and implementation + ******************************************************************************/ +package org.eclipse.jpt.ui.internal.mappings.details; + +import java.util.Collection; +import org.eclipse.jpt.core.context.DiscriminatorColumn; +import org.eclipse.jpt.core.context.DiscriminatorType; +import org.eclipse.jpt.core.context.Entity; +import org.eclipse.jpt.core.context.InheritanceType; +import org.eclipse.jpt.core.context.NamedColumn; +import org.eclipse.jpt.db.Table; +import org.eclipse.jpt.ui.WidgetFactory; +import org.eclipse.jpt.ui.internal.JpaHelpContextIds; +import org.eclipse.jpt.ui.internal.mappings.JptUiMappingsMessages; +import org.eclipse.jpt.ui.internal.mappings.db.ColumnCombo; +import org.eclipse.jpt.ui.internal.util.LabeledControlUpdater; +import org.eclipse.jpt.ui.internal.util.LabeledLabel; +import org.eclipse.jpt.ui.internal.widgets.AbstractPane; +import org.eclipse.jpt.ui.internal.widgets.EnumFormComboViewer; +import org.eclipse.jpt.utility.internal.StringConverter; +import org.eclipse.jpt.utility.internal.model.value.PropertyAspectAdapter; +import org.eclipse.jpt.utility.internal.model.value.PropertyListValueModelAdapter; +import org.eclipse.jpt.utility.internal.model.value.SimplePropertyValueModel; +import org.eclipse.jpt.utility.internal.model.value.TransformationPropertyValueModel; +import org.eclipse.jpt.utility.model.value.ListValueModel; +import org.eclipse.jpt.utility.model.value.PropertyValueModel; +import org.eclipse.jpt.utility.model.value.WritablePropertyValueModel; +import org.eclipse.osgi.util.NLS; +import org.eclipse.swt.custom.CCombo; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Spinner; + +/** + * Here the layout of this pane: + * <pre> + * ----------------------------------------------------------------------------- + * | ---------------------------------------------------- | + * | Strategy: | EnumComboViewer |v| | + * | ---------------------------------------------------- | + * | ---------------------------------------------------- | + * | Value: | I |v| | + * | ---------------------------------------------------- | + * | | + * | > Discriminator Column | + * | | + * | ---------------------------------------------------- | + * | Name: | ColumnCombo |v| | + * | ---------------------------------------------------- | + * | ---------------------------------------------------- | + * | Type: | EnumComboViewer |v| | + * | ---------------------------------------------------- | + * | ---------------------------------------------------- | + * | Column Definition: | I | | + * | ---------------------------------------------------- | + * | ------------- | + * | Length: | I |I| | + * | ------------- | + * | ------------------------------------------------------------------------- | + * | | | | + * | | PrimaryKeyJoinColumnsComposite | | + * | | | | + * | ------------------------------------------------------------------------- | + * -----------------------------------------------------------------------------</pre> + * + * @see Entity + * @see AbstractEntityComposite - The parent container + * @see ColumnCombo + * @see EnumComboViewer + * @see PrimaryKeyJoinColumnsComposite + * + * @version 2.0 + * @since 2.0 + */ +@SuppressWarnings("nls") +public abstract class AbstractInheritanceComposite<T extends Entity> extends AbstractPane<T> { + + /** + * A key used to represent the default value, this is required to convert + * the selected item from a combo to <code>null</code>. This key is most + * likely never typed the user and it will help to convert the value to + * <code>null</code> when it's time to set the new selected value into the + * model. + */ + protected static String DEFAULT_KEY = "?!#!?#?#?default?#?!#?!#?"; + + /** + * Creates a new <code>InheritanceComposite</code>. + * + * @param parentPane The parent container of this one + * @param parent The parent container + */ + public AbstractInheritanceComposite(AbstractPane<? extends T> parentPane, + Composite parent) { + + super(parentPane, parent, false); + } + + /** + * Creates a new <code>InheritanceComposite</code>. + * + * @param subjectHolder The holder of the subject <code>IEntity</code> + * @param parent The parent container + * @param widgetFactory The factory used to create various common widgets + */ + public AbstractInheritanceComposite(PropertyValueModel<? extends T> subjectHolder, + Composite parent, + WidgetFactory widgetFactory) { + + super(subjectHolder, parent, widgetFactory); + } + + private WritablePropertyValueModel<String> buildColumnDefinitionHolder(PropertyValueModel<DiscriminatorColumn> discriminatorColumnHolder) { + + return new PropertyAspectAdapter<DiscriminatorColumn, String>(discriminatorColumnHolder, DiscriminatorColumn.COLUMN_DEFINITION_PROPERTY) { + @Override + protected String buildValue_() { + return subject.getColumnDefinition(); + } + + @Override + protected void setValue_(String value) { + if (value.length() == 0) { + value = null; + } + subject.setColumnDefinition(value); + } + }; + } + + private ListValueModel<String> buildDefaultDiscriminatorListValueHolder() { + return new PropertyListValueModelAdapter<String>( + buildDefaultDiscriminatorValueHolder() + ); + } + + private WritablePropertyValueModel<String> buildDefaultDiscriminatorValueHolder() { + return new PropertyAspectAdapter<Entity, String>(getSubjectHolder(), Entity.DEFAULT_DISCRIMINATOR_VALUE_PROPERTY) { + @Override + protected String buildValue_() { + String name = subject.getDefaultDiscriminatorValue(); + + if (name == null) { + name = DEFAULT_KEY; + } + else { + name = DEFAULT_KEY + name; + } + + return name; + } + }; + } + + private WritablePropertyValueModel<Integer> buildDefaultLengthHolder() { + return new PropertyAspectAdapter<DiscriminatorColumn, Integer>(buildDiscriminatorColumnHolder(), DiscriminatorColumn.DEFAULT_LENGTH_PROPERTY) { + @Override + protected Integer buildValue_() { + return subject.getDefaultLength(); + } + + @Override + protected void subjectChanged() { + Object oldValue = this.getValue(); + super.subjectChanged(); + Object newValue = this.getValue(); + + // Make sure the default value is appended to the text + if (oldValue == newValue && newValue == null) { + this.fireAspectChange(Integer.MIN_VALUE, newValue); + } + } + }; + } + + private Control buildDefaultLengthLabel(Composite container) { + + Label label = buildLabel( + container, + JptUiMappingsMessages.DefaultWithoutValue + ); + + new LabeledControlUpdater( + new LabeledLabel(label), + buildDefaultLengthLabelHolder() + ); + + return label; + } + + private PropertyValueModel<String> buildDefaultLengthLabelHolder() { + + return new TransformationPropertyValueModel<Integer, String>(buildDefaultLengthHolder()) { + + @Override + protected String transform(Integer value) { + + Integer defaultValue = (subject() != null) ? subject().getDiscriminatorColumn().getDefaultLength() : + DiscriminatorColumn.DEFAULT_LENGTH; + + return NLS.bind( + JptUiMappingsMessages.DefaultWithValue, + defaultValue + ); + } + }; + } + + private ColumnCombo<DiscriminatorColumn> buildDiscriminatorColumnCombo( + Composite container, + PropertyValueModel<DiscriminatorColumn> discriminatorColumnHolder) { + + return new ColumnCombo<DiscriminatorColumn>( + this, + discriminatorColumnHolder, + container) + { + + @Override + protected void addPropertyNames(Collection<String> propertyNames) { + super.addPropertyNames(propertyNames); + propertyNames.add(NamedColumn.SPECIFIED_NAME_PROPERTY); + propertyNames.add(NamedColumn.DEFAULT_NAME_PROPERTY); + } + + @Override + protected String defaultValue() { + return subject().getDefaultName(); + } + + @Override + protected void setValue(String value) { + subject().setSpecifiedName(value); + } + + @Override + protected Table table() { + return subject().getDbTable(); + } + + @Override + protected String value() { + return subject().getSpecifiedName(); + } + }; + } + + private PropertyValueModel<DiscriminatorColumn> buildDiscriminatorColumnHolder() { + return new TransformationPropertyValueModel<Entity, DiscriminatorColumn>(getSubjectHolder()) { + @Override + protected DiscriminatorColumn transform_(Entity value) { + return value.getDiscriminatorColumn(); + } + }; + } + + private EnumFormComboViewer<DiscriminatorColumn, DiscriminatorType> buildDiscriminatorTypeCombo( + Composite container, + PropertyValueModel<DiscriminatorColumn> discriminatorColumnHolder) { + + return new EnumFormComboViewer<DiscriminatorColumn, DiscriminatorType>( + this, + discriminatorColumnHolder, + container) + { + @Override + protected void addPropertyNames(Collection<String> propertyNames) { + super.addPropertyNames(propertyNames); + propertyNames.add(DiscriminatorColumn.DEFAULT_DISCRIMINATOR_TYPE_PROPERTY); + propertyNames.add(DiscriminatorColumn.SPECIFIED_DISCRIMINATOR_TYPE_PROPERTY); + } + + @Override + protected DiscriminatorType[] choices() { + return DiscriminatorType.values(); + } + + @Override + protected DiscriminatorType defaultValue() { + return subject().getDefaultDiscriminatorType(); + } + + @Override + protected String displayString(DiscriminatorType value) { + return buildDisplayString( + JptUiMappingsMessages.class, + AbstractInheritanceComposite.class, + value + ); + } + + @Override + protected DiscriminatorType getValue() { + return subject().getSpecifiedDiscriminatorType(); + } + + @Override + protected void setValue(DiscriminatorType value) { + subject().setSpecifiedDiscriminatorType(value); + } + }; + } + + private StringConverter<String> buildDiscriminatorValueConverter() { + return new StringConverter<String>() { + public String convertToString(String value) { + + if (subject() == null) { + return null; + } + + if (value == null) { + value = subject().getDefaultDiscriminatorValue(); + + if (value != null) { + value = DEFAULT_KEY + value; + } + else { + value = DEFAULT_KEY; + } + } + + if (value.startsWith(DEFAULT_KEY)) { + String defaultName = value.substring(DEFAULT_KEY.length()); + + if (defaultName.length() > 0) { + value = NLS.bind( + JptUiMappingsMessages.DefaultWithValue, + defaultName + ); + } + else { + value = JptUiMappingsMessages.DefaultWithoutValue; + } + } + + return value; + } + }; + } + + private WritablePropertyValueModel<String> buildDiscriminatorValueHolder() { + return new PropertyAspectAdapter<Entity, String>(getSubjectHolder(), Entity.SPECIFIED_DISCRIMINATOR_VALUE_PROPERTY) { + @Override + protected String buildValue_() { + return subject.getSpecifiedDiscriminatorValue(); + } + + @Override + protected void setValue_(String value) { + + // Convert the default value or an empty string to null + if ((value != null) && + ((value.length() == 0) || value.startsWith(DEFAULT_KEY))) { + + value = null; + } + + subject.setSpecifiedDiscriminatorValue(value); + } + }; + } + + private ListValueModel<String> buildDiscriminatorValueListHolder() { + return buildDefaultDiscriminatorListValueHolder(); + } + + private WritablePropertyValueModel<Integer> buildLengthHolder(PropertyValueModel<DiscriminatorColumn> discriminatorColumnHolder) { + + return new PropertyAspectAdapter<DiscriminatorColumn, Integer>(discriminatorColumnHolder, DiscriminatorColumn.SPECIFIED_LENGTH_PROPERTY) { + @Override + protected Integer buildValue_() { + return subject.getSpecifiedLength(); + } + + @Override + protected void setValue_(Integer value) { + if (value == -1) { + value = null; + } + subject.setSpecifiedLength(value); + } + }; + } + + private EnumFormComboViewer<Entity, InheritanceType> buildStrategyCombo(Composite container) { + + return new EnumFormComboViewer<Entity, InheritanceType>(this, container) { + + @Override + protected void addPropertyNames(Collection<String> propertyNames) { + super.addPropertyNames(propertyNames); + propertyNames.add(Entity.DEFAULT_INHERITANCE_STRATEGY_PROPERTY); + propertyNames.add(Entity.SPECIFIED_INHERITANCE_STRATEGY_PROPERTY); + } + + @Override + protected InheritanceType[] choices() { + return InheritanceType.values(); + } + + @Override + protected InheritanceType defaultValue() { + return subject().getDefaultInheritanceStrategy(); + } + + @Override + protected String displayString(InheritanceType value) { + return buildDisplayString( + JptUiMappingsMessages.class, + AbstractInheritanceComposite.class, + value + ); + } + + @Override + protected InheritanceType getValue() { + return subject().getSpecifiedInheritanceStrategy(); + } + + @Override + protected void setValue(InheritanceType value) { + subject().setSpecifiedInheritanceStrategy(value); + } + }; + } + + private void initializeDiscriminatorColumnPane(Composite container) { + + PropertyValueModel<DiscriminatorColumn> discriminatorColumnHolder = + buildDiscriminatorColumnHolder(); + + // Name widgets + buildLabeledComposite( + container, + JptUiMappingsMessages.DiscriminatorColumnComposite_name, + buildDiscriminatorColumnCombo(container, discriminatorColumnHolder), + JpaHelpContextIds.ENTITY_INHERITANCE_DISCRIMINATOR_COLUMN + ); + + // Discriminator Type widgets + buildLabeledComposite( + container, + JptUiMappingsMessages.DiscriminatorColumnComposite_discriminatorType, + buildDiscriminatorTypeCombo(container, discriminatorColumnHolder), + JpaHelpContextIds.ENTITY_INHERITANCE_DISCRIMINATOR_TYPE + ); + + container = buildCollapsableSubSection( + buildSubPane(container, 10), + JptUiMappingsMessages.InheritanceComposite_detailsGroupBox, + new SimplePropertyValueModel<Boolean>(Boolean.FALSE) + ); + + // Length widgets + Spinner lengthSpinner = buildLabeledSpinner( + container, + JptUiMappingsMessages.ColumnComposite_length, + buildLengthHolder(discriminatorColumnHolder), + -1, + -1, + Integer.MAX_VALUE, + buildDefaultLengthLabel(container), + JpaHelpContextIds.MAPPING_COLUMN_LENGTH + ); + + updateGridData(container, lengthSpinner); + + // Column Definition widgets + buildLabeledText( + container, + JptUiMappingsMessages.ColumnComposite_columnDefinition, + buildColumnDefinitionHolder(discriminatorColumnHolder) + ); + } + + /* + * (non-Javadoc) + */ + @Override + protected void initializeLayout(Composite container) { + + int groupBoxMargin = groupBoxMargin(); + + Composite subPane = buildSubPane( + container, 0, groupBoxMargin, 0, groupBoxMargin + ); + + // Strategy widgets + buildLabeledComposite( + subPane, + JptUiMappingsMessages.InheritanceComposite_strategy, + buildStrategyCombo(subPane), + JpaHelpContextIds.ENTITY_INHERITANCE_STRATEGY + ); + + // Discrinator Value widgets + CCombo discriminatorValueCombo = buildLabeledEditableCCombo( + subPane, + JptUiMappingsMessages.InheritanceComposite_discriminatorValue, + buildDiscriminatorValueListHolder(), + buildDiscriminatorValueHolder(), + buildDiscriminatorValueConverter(), + JpaHelpContextIds.ENTITY_INHERITANCE_DISCRIMINATOR_VALUE + ); + + // Discriminator Column sub-pane + Composite discriminatorColumnContainer = buildTitledPane( + buildSubPane(container, 10), + JptUiMappingsMessages.InheritanceComposite_discriminatorColumnGroupBox + ); + + initializeDiscriminatorColumnPane(discriminatorColumnContainer); + + // Primary Key Join Columns widgets + buildPrimaryKeyJoinColumnsComposite(buildSubPane(container, 5)); + } + + protected abstract void buildPrimaryKeyJoinColumnsComposite(Composite container); + + /** + * Changes the layout of the given container by changing which widget will + * grab the excess of horizontal space. By default, the center control grabs + * the excess space, we change it to be the right control. + * + * @param container The container containing the controls needing their + * <code>GridData</code> to be modified from the default values + * @param spinner The spinner that got created + */ + private void updateGridData(Composite container, Spinner spinner) { + + // It is possible the spinner's parent is not the container of the + // label, spinner and right control (a pane is sometimes required for + // painting the spinner's border) + Composite paneContainer = spinner.getParent(); + + while (container != paneContainer.getParent()) { + paneContainer = paneContainer.getParent(); + } + + Control[] controls = paneContainer.getChildren(); + + GridData gridData = new GridData(); + gridData.grabExcessHorizontalSpace = false; + gridData.horizontalAlignment = GridData.BEGINNING; + controls[1].setLayoutData(gridData); + + controls[2].setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); + removeAlignRight(controls[2]); + } +}
\ No newline at end of file diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/PrimaryKeyJoinColumnsComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/AbstractPrimaryKeyJoinColumnsComposite.java index 782c8fcab8..cccea06381 100644 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/PrimaryKeyJoinColumnsComposite.java +++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/mappings/details/AbstractPrimaryKeyJoinColumnsComposite.java @@ -31,8 +31,6 @@ import org.eclipse.jpt.utility.internal.model.value.CompositeListValueModel; import org.eclipse.jpt.utility.internal.model.value.ItemPropertyListValueModelAdapter; import org.eclipse.jpt.utility.internal.model.value.ListAspectAdapter; import org.eclipse.jpt.utility.internal.model.value.ListPropertyValueModelAdapter; -import org.eclipse.jpt.utility.internal.model.value.PropertyAspectAdapter; -import org.eclipse.jpt.utility.internal.model.value.PropertyListValueModelAdapter; import org.eclipse.jpt.utility.internal.model.value.SimplePropertyValueModel; import org.eclipse.jpt.utility.internal.model.value.swing.ObjectListSelectionModel; import org.eclipse.jpt.utility.model.value.ListValueModel; @@ -64,9 +62,9 @@ import org.eclipse.swt.widgets.Group; * @version 2.0 * @since 2.0 */ -public class PrimaryKeyJoinColumnsComposite extends AbstractPane<Entity> +public abstract class AbstractPrimaryKeyJoinColumnsComposite<T extends Entity> extends AbstractPane<T> { - private WritablePropertyValueModel<PrimaryKeyJoinColumn> joinColumnHolder; + protected WritablePropertyValueModel<PrimaryKeyJoinColumn> joinColumnHolder; /** * Creates a new <code>PrimaryKeyJoinColumnsComposite</code>. @@ -74,7 +72,7 @@ public class PrimaryKeyJoinColumnsComposite extends AbstractPane<Entity> * @param parentPane The parent controller of this one * @param parent The parent container */ - public PrimaryKeyJoinColumnsComposite(AbstractPane<? extends Entity> subjectHolder, + public AbstractPrimaryKeyJoinColumnsComposite(AbstractPane<? extends T> subjectHolder, Composite parent) { super(subjectHolder, parent); @@ -87,7 +85,7 @@ public class PrimaryKeyJoinColumnsComposite extends AbstractPane<Entity> * @param parent The parent container * @param widgetFactory The factory used to create various common widgets */ - public PrimaryKeyJoinColumnsComposite(PropertyValueModel<? extends Entity> subjectHolder, + public AbstractPrimaryKeyJoinColumnsComposite(PropertyValueModel<? extends T> subjectHolder, Composite parent, WidgetFactory widgetFactory) { @@ -124,19 +122,7 @@ public class PrimaryKeyJoinColumnsComposite extends AbstractPane<Entity> }; } - private PropertyValueModel<PrimaryKeyJoinColumn> buildDefaultJoinColumnHolder() { - return new PropertyAspectAdapter<Entity, PrimaryKeyJoinColumn>(getSubjectHolder(), Entity.DEFAULT_PRIMARY_KEY_JOIN_COLUMN) { - @Override - protected PrimaryKeyJoinColumn buildValue_() { - return subject.getDefaultPrimaryKeyJoinColumn(); - } - }; - } - - private ListValueModel<PrimaryKeyJoinColumn> buildDefaultJoinColumnListHolder() { - return new PropertyListValueModelAdapter<PrimaryKeyJoinColumn>(buildDefaultJoinColumnHolder()); - - } + protected abstract ListValueModel<? extends PrimaryKeyJoinColumn> buildDefaultJoinColumnsListHolder(); private PostExecution<PrimaryKeyJoinColumnDialog> buildEditPrimaryKeyJoinColumnPostExecution() { return new PostExecution<PrimaryKeyJoinColumnDialog>() { @@ -239,10 +225,10 @@ public class PrimaryKeyJoinColumnsComposite extends AbstractPane<Entity> } private ListValueModel<PrimaryKeyJoinColumn> buildPrimaryKeyJoinColumnsListHolder() { - List<ListValueModel<PrimaryKeyJoinColumn>> list = new ArrayList<ListValueModel<PrimaryKeyJoinColumn>>(); + List<ListValueModel<? extends PrimaryKeyJoinColumn>> list = new ArrayList<ListValueModel<? extends PrimaryKeyJoinColumn>>(); list.add(buildSpecifiedJoinColumnsListHolder()); - list.add(buildDefaultJoinColumnListHolder()); - return new CompositeListValueModel<ListValueModel<PrimaryKeyJoinColumn>, PrimaryKeyJoinColumn>(list); + list.add(buildDefaultJoinColumnsListHolder()); + return new CompositeListValueModel<ListValueModel<? extends PrimaryKeyJoinColumn>, PrimaryKeyJoinColumn>(list); } private ListValueModel<PrimaryKeyJoinColumn> buildPrimaryKeyJoinColumnsListModel() { @@ -344,29 +330,16 @@ public class PrimaryKeyJoinColumnsComposite extends AbstractPane<Entity> setPopulating(true); try { - Entity subject = subject(); - // Add a join column by creating a specified one using the default // one if it exists if (selected) { - PrimaryKeyJoinColumn defaultJoinColumn = subject.getDefaultPrimaryKeyJoinColumn(); - - if (defaultJoinColumn != null) { - String columnName = defaultJoinColumn.getDefaultName(); - String referencedColumnName = defaultJoinColumn.getDefaultReferencedColumnName(); - - PrimaryKeyJoinColumn pkJoinColumn = subject.addSpecifiedPrimaryKeyJoinColumn(0); - pkJoinColumn.setSpecifiedName(columnName); - pkJoinColumn.setSpecifiedReferencedColumnName(referencedColumnName); - - joinColumnHolder.setValue(pkJoinColumn); - } + switchDefaultToSpecified(); } // Remove all the specified join columns else { - for (int index = subject.specifiedPrimaryKeyJoinColumnsSize(); --index >= 0; ) { - subject.removeSpecifiedPrimaryKeyJoinColumn(index); + for (int index = subject().specifiedPrimaryKeyJoinColumnsSize(); --index >= 0; ) { + subject().removeSpecifiedPrimaryKeyJoinColumn(index); } } } @@ -375,6 +348,8 @@ public class PrimaryKeyJoinColumnsComposite extends AbstractPane<Entity> } } + protected abstract void switchDefaultToSpecified(); + private class OverrideDefaultJoinColumnHolder extends ListPropertyValueModelAdapter<Boolean> implements WritablePropertyValueModel<Boolean> { diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/orm/details/OrmEntityComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/orm/details/OrmEntityComposite.java index d9eb606d0b..804df18739 100644 --- a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/orm/details/OrmEntityComposite.java +++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/orm/details/OrmEntityComposite.java @@ -45,4 +45,9 @@ public class OrmEntityComposite extends AbstractEntityComposite<OrmEntity> protected void buildSecondaryTablesComposite(Composite container) { new OrmSecondaryTablesComposite(this, container); } + + @Override + protected void buildInheritanceComposite(Composite container) { + new OrmInheritanceComposite(this, container); + } }
\ No newline at end of file diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/orm/details/OrmInheritanceComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/orm/details/OrmInheritanceComposite.java new file mode 100644 index 0000000000..b3abfae99c --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/orm/details/OrmInheritanceComposite.java @@ -0,0 +1,60 @@ +/******************************************************************************* + * Copyright (c) 2008 Oracle. All rights reserved. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0, which accompanies this distribution + * and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Contributors: + * Oracle - initial API and implementation + ******************************************************************************/ +package org.eclipse.jpt.ui.internal.orm.details; + +import org.eclipse.jpt.core.context.orm.OrmEntity; +import org.eclipse.jpt.ui.WidgetFactory; +import org.eclipse.jpt.ui.internal.mappings.details.AbstractInheritanceComposite; +import org.eclipse.jpt.ui.internal.widgets.AbstractPane; +import org.eclipse.jpt.utility.model.value.PropertyValueModel; +import org.eclipse.swt.widgets.Composite; + +/** + * The pane used for java inheritance. + * + * @see OrmEntity + * @see OrmPrimaryKeyJoinColumnsComposite + * + * @version 2.0 + * @since 1.0 + */ +public class OrmInheritanceComposite extends AbstractInheritanceComposite<OrmEntity> { + + /** + * Creates a new <code>OrmInheritanceComposite</code>. + * + * @param parentPane The parent container of this one + * @param parent The parent container + */ + public OrmInheritanceComposite(AbstractPane<OrmEntity> parentPane, + Composite parent) { + + super(parentPane, parent); + } + + /** + * Creates a new <code>OrmInheritanceComposite</code>. + * + * @param subjectHolder The holder of the subject <code>OrmEntity</code> + * @param parent The parent container + * @param widgetFactory The factory used to create various common widgets + */ + public OrmInheritanceComposite(PropertyValueModel<OrmEntity> subjectHolder, + Composite parent, + WidgetFactory widgetFactory) { + + super(subjectHolder, parent, widgetFactory); + } + + @Override + protected void buildPrimaryKeyJoinColumnsComposite(Composite container) { + new OrmPrimaryKeyJoinColumnsComposite(this, container); + } +}
\ No newline at end of file diff --git a/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/orm/details/OrmPrimaryKeyJoinColumnsComposite.java b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/orm/details/OrmPrimaryKeyJoinColumnsComposite.java new file mode 100644 index 0000000000..0be48c2f38 --- /dev/null +++ b/jpa/plugins/org.eclipse.jpt.ui/src/org/eclipse/jpt/ui/internal/orm/details/OrmPrimaryKeyJoinColumnsComposite.java @@ -0,0 +1,94 @@ +/******************************************************************************* + * Copyright (c) 2008 Oracle. All rights reserved. + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0, which accompanies this distribution + * and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Contributors: + * Oracle - initial API and implementation + ******************************************************************************/ +package org.eclipse.jpt.ui.internal.orm.details; + +import java.util.ListIterator; +import org.eclipse.jpt.core.context.PrimaryKeyJoinColumn; +import org.eclipse.jpt.core.context.orm.OrmEntity; +import org.eclipse.jpt.core.context.orm.OrmPrimaryKeyJoinColumn; +import org.eclipse.jpt.ui.WidgetFactory; +import org.eclipse.jpt.ui.internal.mappings.details.AbstractPrimaryKeyJoinColumnsComposite; +import org.eclipse.jpt.ui.internal.widgets.AbstractPane; +import org.eclipse.jpt.utility.internal.model.value.ListAspectAdapter; +import org.eclipse.jpt.utility.model.value.ListValueModel; +import org.eclipse.jpt.utility.model.value.PropertyValueModel; +import org.eclipse.swt.widgets.Composite; + +/** + * @see OrmEntity + * @see OrmInheritanceComposite - The container of this pane + * + * @version 2.0 + * @since 2.0 + */ +public class OrmPrimaryKeyJoinColumnsComposite extends AbstractPrimaryKeyJoinColumnsComposite<OrmEntity> +{ + + /** + * Creates a new <code>OrmPrimaryKeyJoinColumnsComposite</code>. + * + * @param parentPane The parent controller of this one + * @param parent The parent container + */ + public OrmPrimaryKeyJoinColumnsComposite(AbstractPane<? extends OrmEntity> subjectHolder, + Composite parent) { + + super(subjectHolder, parent); + } + + /** + * Creates a new <code>OrmPrimaryKeyJoinColumnsComposite</code>. + * + * @param subjectHolder The holder of this pane's subject + * @param parent The parent container + * @param widgetFactory The factory used to create various common widgets + */ + public OrmPrimaryKeyJoinColumnsComposite(PropertyValueModel<? extends OrmEntity> subjectHolder, + Composite parent, + WidgetFactory widgetFactory) { + + super(subjectHolder, parent, widgetFactory); + } + + @Override + protected ListValueModel<OrmPrimaryKeyJoinColumn> buildDefaultJoinColumnsListHolder() { + return new ListAspectAdapter<OrmEntity, OrmPrimaryKeyJoinColumn>( + getSubjectHolder(), + OrmEntity.DEFAULT_PRIMARY_KEY_JOIN_COLUMNS_LIST) + { + @Override + protected ListIterator<OrmPrimaryKeyJoinColumn> listIterator_() { + return subject.defaultPrimaryKeyJoinColumns(); + } +//TODO defaultPrimaryKeyJoinColumnsSize when I can change the API +// @Override +// protected int size_() { +// return subject.defaultPrimaryKeyJoinColumnsSize(); +// } + }; + } + + @Override + protected void switchDefaultToSpecified() { + ListIterator<OrmPrimaryKeyJoinColumn> defaultJoinColumns = subject().defaultPrimaryKeyJoinColumns(); + + int index = 0; + while (defaultJoinColumns.hasNext()) { + OrmPrimaryKeyJoinColumn defaultJoinColumn = defaultJoinColumns.next(); + String columnName = defaultJoinColumn.getName(); + String referencedColumnName = defaultJoinColumn.getReferencedColumnName(); + + PrimaryKeyJoinColumn pkJoinColumn = subject().addSpecifiedPrimaryKeyJoinColumn(index++); + pkJoinColumn.setSpecifiedName(columnName); + pkJoinColumn.setSpecifiedReferencedColumnName(referencedColumnName); + } + } + +}
\ 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/OrmEntityTests.java b/jpa/tests/org.eclipse.jpt.core.tests/src/org/eclipse/jpt/core/tests/internal/context/orm/OrmEntityTests.java index 04452a8f36..2b1ac74822 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007 Oracle. + * Copyright (c) 2007, 2008 Oracle. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -18,6 +18,7 @@ import org.eclipse.jpt.core.MappingKeys; import org.eclipse.jpt.core.context.AccessType; import org.eclipse.jpt.core.context.InheritanceType; import org.eclipse.jpt.core.context.java.JavaEntity; +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; @@ -44,6 +45,10 @@ import org.eclipse.jpt.utility.internal.iterators.ArrayIterator; public class OrmEntityTests extends ContextModelTestCase { + + protected static final String CHILD_TYPE_NAME = "AnnotationTestTypeChild"; + protected static final String FULLY_QUALIFIED_CHILD_TYPE_NAME = PACKAGE_NAME + "." + CHILD_TYPE_NAME; + public OrmEntityTests(String name) { super(name); } @@ -134,14 +139,25 @@ public class OrmEntityTests extends ContextModelTestCase sb.append(CR); sb.append("@Entity"); sb.append(CR); - sb.append("public class ").append("AnnotationTestTypeChild").append(" "); - sb.append("extends " + TYPE_NAME + " "); + sb.append("public class ").append(CHILD_TYPE_NAME).append(" "); + sb.append("extends ").append(TYPE_NAME).append(" "); + sb.append("{}").append(CR); + } + }; + return this.javaProject.createType(PACKAGE_NAME, "AnnotationTestTypeChild.java", sourceWriter); + } + + private IType createTestSubTypeUnmapped() throws Exception { + SourceWriter sourceWriter = new SourceWriter() { + public void appendSourceTo(StringBuilder sb) { + sb.append(CR); + sb.append("public class ").append(CHILD_TYPE_NAME).append(" "); + sb.append("extends ").append(TYPE_NAME).append(" "); sb.append("{}").append(CR); } }; return this.javaProject.createType(PACKAGE_NAME, "AnnotationTestTypeChild.java", sourceWriter); } - private IType createTestMappedSuperclass() throws Exception { createMappedSuperclassAnnotation(); @@ -1344,6 +1360,106 @@ public class OrmEntityTests extends ContextModelTestCase assertFalse(ormEntity.specifiedPrimaryKeyJoinColumns().hasNext()); } + public void testDefaultPrimaryKeyJoinColumns() throws Exception { + createTestType(); + createTestSubTypeUnmapped(); + + OrmPersistentType persistentType = entityMappings().addOrmPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME); + OrmPersistentType childPersistentType = entityMappings().addOrmPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_CHILD_TYPE_NAME); + childPersistentType.getJavaPersistentType().setMappingKey(MappingKeys.NULL_TYPE_MAPPING_KEY); + + persistentType.getAttributeNamed("id").makeSpecified(MappingKeys.ID_ATTRIBUTE_MAPPING_KEY); + + ((OrmEntity) persistentType.getMapping()).setSpecifiedInheritanceStrategy(InheritanceType.JOINED); + + OrmEntity childEntity = (OrmEntity) childPersistentType.getMapping(); + + assertTrue(childEntity.defaultPrimaryKeyJoinColumns().hasNext()); + assertEquals("id", childEntity.defaultPrimaryKeyJoinColumns().next().getDefaultName()); + assertEquals("id", childEntity.defaultPrimaryKeyJoinColumns().next().getDefaultReferencedColumnName()); + + childPersistentType.getJavaPersistentType().setMappingKey(MappingKeys.ENTITY_TYPE_MAPPING_KEY); + persistentType.getJavaPersistentType().setMappingKey(MappingKeys.ENTITY_TYPE_MAPPING_KEY); + + assertTrue(childEntity.defaultPrimaryKeyJoinColumns().hasNext()); + assertEquals("id", childEntity.defaultPrimaryKeyJoinColumns().next().getDefaultName()); + assertEquals("id", childEntity.defaultPrimaryKeyJoinColumns().next().getDefaultReferencedColumnName()); + + OrmPrimaryKeyJoinColumn specifiedPkJoinColumn = childEntity.addSpecifiedPrimaryKeyJoinColumn(0); + specifiedPkJoinColumn.setSpecifiedName("FOO"); + specifiedPkJoinColumn.setSpecifiedReferencedColumnName("BAR"); + + assertFalse(childEntity.defaultPrimaryKeyJoinColumns().hasNext()); + + //remove the pkJoinColumn from the context mode, verify context model has a default pkJoinColumn + childEntity.removeSpecifiedPrimaryKeyJoinColumn(0); + assertTrue(childEntity.defaultPrimaryKeyJoinColumns().hasNext()); + assertEquals("id", childEntity.defaultPrimaryKeyJoinColumns().next().getDefaultName()); + assertEquals("id", childEntity.defaultPrimaryKeyJoinColumns().next().getDefaultReferencedColumnName()); + + + childPersistentType.getJavaPersistentType().setMappingKey(MappingKeys.NULL_TYPE_MAPPING_KEY); + persistentType.getJavaPersistentType().setMappingKey(MappingKeys.NULL_TYPE_MAPPING_KEY); + + specifiedPkJoinColumn = childEntity.addSpecifiedPrimaryKeyJoinColumn(0); + specifiedPkJoinColumn.setSpecifiedName("FOO"); + specifiedPkJoinColumn.setSpecifiedReferencedColumnName("BAR"); + assertFalse(childEntity.defaultPrimaryKeyJoinColumns().hasNext()); + //now remove the pkJoinColumn from the resource model, verify context model updates and has a default pkJoinColumn + ((XmlEntity)childEntity.getTypeMappingResource()).getPrimaryKeyJoinColumns().remove(0); + assertTrue(childEntity.defaultPrimaryKeyJoinColumns().hasNext()); + assertEquals("id", childEntity.defaultPrimaryKeyJoinColumns().next().getDefaultName()); + assertEquals("id", childEntity.defaultPrimaryKeyJoinColumns().next().getDefaultReferencedColumnName()); + } + + public void testDefaultPrimaryKeyJoinColumnsFromJava() throws Exception { + createTestEntityFieldAccess(); + createTestSubType(); + + OrmPersistentType persistentType = entityMappings().addOrmPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME); + OrmPersistentType childPersistentType = entityMappings().addOrmPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_CHILD_TYPE_NAME); + + + ((JavaEntity) persistentType.getJavaPersistentType().getMapping()).setSpecifiedInheritanceStrategy(InheritanceType.JOINED); + + OrmEntity childEntity = (OrmEntity) childPersistentType.getMapping(); + + assertTrue(childEntity.defaultPrimaryKeyJoinColumns().hasNext()); + assertEquals("id", childEntity.defaultPrimaryKeyJoinColumns().next().getDefaultName()); + assertEquals("id", childEntity.defaultPrimaryKeyJoinColumns().next().getDefaultReferencedColumnName()); + + JavaEntity javaEntity = (JavaEntity) childPersistentType.getJavaPersistentType().getMapping(); + JavaPrimaryKeyJoinColumn javaPrimaryKeyJoinColumn = javaEntity.addSpecifiedPrimaryKeyJoinColumn(0); + javaPrimaryKeyJoinColumn.setSpecifiedName("FOO"); + javaPrimaryKeyJoinColumn.setSpecifiedReferencedColumnName("BAR"); + + JavaPrimaryKeyJoinColumn javaPrimaryKeyJoinColumn2 = javaEntity.addSpecifiedPrimaryKeyJoinColumn(1); + javaPrimaryKeyJoinColumn2.setSpecifiedName("FOO2"); + javaPrimaryKeyJoinColumn2.setSpecifiedReferencedColumnName("BAR2"); + + childPersistentType.getJavaPersistentType().setMappingKey(MappingKeys.ENTITY_TYPE_MAPPING_KEY); + persistentType.getJavaPersistentType().setMappingKey(MappingKeys.ENTITY_TYPE_MAPPING_KEY); + + ListIterator<OrmPrimaryKeyJoinColumn> defaultPrimaryKeyJoinColumns = childEntity.defaultPrimaryKeyJoinColumns(); + OrmPrimaryKeyJoinColumn defaultPrimaryKeyJoinColumn = defaultPrimaryKeyJoinColumns.next(); + assertEquals("FOO", defaultPrimaryKeyJoinColumn.getName()); + assertEquals("BAR", defaultPrimaryKeyJoinColumn.getReferencedColumnName()); + + defaultPrimaryKeyJoinColumn = defaultPrimaryKeyJoinColumns.next(); + assertEquals("FOO2", defaultPrimaryKeyJoinColumn.getName()); + assertEquals("BAR2", defaultPrimaryKeyJoinColumn.getReferencedColumnName()); + assertFalse(defaultPrimaryKeyJoinColumns.hasNext()); + + childEntity.setSpecifiedMetadataComplete(Boolean.TRUE); + defaultPrimaryKeyJoinColumns = childEntity.defaultPrimaryKeyJoinColumns(); + defaultPrimaryKeyJoinColumn = defaultPrimaryKeyJoinColumns.next(); + assertEquals("id", defaultPrimaryKeyJoinColumn.getDefaultName()); + assertEquals("id", defaultPrimaryKeyJoinColumn.getDefaultReferencedColumnName()); + + assertFalse(defaultPrimaryKeyJoinColumns.hasNext()); + + } + // public void testAddSpecifiedAttributeOverride() throws Exception { // OrmPersistentType persistentType = entityMappings().addOrmPersistentType(MappingKeys.ENTITY_TYPE_MAPPING_KEY, FULLY_QUALIFIED_TYPE_NAME); // OrmEntity ormEntity = (OrmEntity) persistentType.getMapping(); |