Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/XmlSecondaryTable.java')
-rw-r--r--jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/XmlSecondaryTable.java216
1 files changed, 216 insertions, 0 deletions
diff --git a/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/XmlSecondaryTable.java b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/XmlSecondaryTable.java
new file mode 100644
index 0000000000..ff7d8a79fd
--- /dev/null
+++ b/jpa/plugins/org.eclipse.jpt.core/src/org/eclipse/jpt/core/internal/context/orm/XmlSecondaryTable.java
@@ -0,0 +1,216 @@
+/*******************************************************************************
+ * Copyright (c) 2007 Oracle. All rights reserved.
+ * This program and the accompanying materials are made available under the terms of
+ * the Eclipse Public License v1.0, which accompanies this distribution and is available at
+ * http://www.eclipse.org/legal/epl-v10.html.
+ *
+ * Contributors:
+ * Oracle - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.jpt.core.internal.context.orm;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
+import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jpt.core.internal.ITextRange;
+import org.eclipse.jpt.core.internal.context.base.IAbstractJoinColumn;
+import org.eclipse.jpt.core.internal.context.base.ISecondaryTable;
+import org.eclipse.jpt.core.internal.context.base.ITypeMapping;
+import org.eclipse.jpt.core.internal.resource.orm.AbstractTable;
+import org.eclipse.jpt.core.internal.resource.orm.OrmFactory;
+import org.eclipse.jpt.core.internal.resource.orm.PrimaryKeyJoinColumn;
+import org.eclipse.jpt.core.internal.resource.orm.SecondaryTable;
+import org.eclipse.jpt.db.internal.Table;
+import org.eclipse.jpt.utility.internal.CollectionTools;
+import org.eclipse.jpt.utility.internal.iterators.CloneListIterator;
+
+
+public class XmlSecondaryTable extends AbstractXmlTable
+ implements ISecondaryTable
+{
+ protected SecondaryTable secondaryTable;
+
+ protected final List<XmlPrimaryKeyJoinColumn> specifiedPrimaryKeyJoinColumns;
+
+ protected final List<XmlPrimaryKeyJoinColumn> defaultPrimaryKeyJoinColumns;
+
+ protected XmlSecondaryTable(XmlEntity parent) {
+ super(parent);
+ this.specifiedPrimaryKeyJoinColumns = new ArrayList<XmlPrimaryKeyJoinColumn>();
+ this.defaultPrimaryKeyJoinColumns = new ArrayList<XmlPrimaryKeyJoinColumn>();
+// this.getDefaultPrimaryKeyJoinColumns().add(this.createPrimaryKeyJoinColumn(0));
+ }
+
+ public XmlEntity xmlEntity() {
+ return (XmlEntity) super.parent();
+ }
+
+ @SuppressWarnings("unchecked")
+ public ListIterator<XmlPrimaryKeyJoinColumn> defaultPrimaryKeyJoinColumns() {
+ return new CloneListIterator<XmlPrimaryKeyJoinColumn>(this.defaultPrimaryKeyJoinColumns);
+ }
+
+ @SuppressWarnings("unchecked")
+ public ListIterator<XmlPrimaryKeyJoinColumn> primaryKeyJoinColumns() {
+ return this.specifiedPrimaryKeyJoinColumns.isEmpty() ? this.defaultPrimaryKeyJoinColumns() : this.specifiedPrimaryKeyJoinColumns();
+ }
+
+ @SuppressWarnings("unchecked")
+ public ListIterator<XmlPrimaryKeyJoinColumn> specifiedPrimaryKeyJoinColumns() {
+ return new CloneListIterator<XmlPrimaryKeyJoinColumn>(this.specifiedPrimaryKeyJoinColumns);
+ }
+
+ public int specifiedPrimaryKeyJoinColumnsSize() {
+ return this.specifiedPrimaryKeyJoinColumns.size();
+ }
+
+ public XmlPrimaryKeyJoinColumn addSpecifiedPrimaryKeyJoinColumn(int index) {
+ XmlPrimaryKeyJoinColumn primaryKeyJoinColumn = new XmlPrimaryKeyJoinColumn(this, createPrimaryKeyJoinColumnOwner());
+ this.specifiedPrimaryKeyJoinColumns.add(index, primaryKeyJoinColumn);
+ this.secondaryTable.getPrimaryKeyJoinColumns().add(index, OrmFactory.eINSTANCE.createPrimaryKeyJoinColumn());
+ this.fireItemAdded(ISecondaryTable.SPECIFIED_PRIMARY_KEY_JOIN_COLUMNS_LIST, index, primaryKeyJoinColumn);
+ return primaryKeyJoinColumn;
+ }
+
+ protected IAbstractJoinColumn.Owner createPrimaryKeyJoinColumnOwner() {
+ return new PrimaryKeyJoinColumnOwner();
+ }
+
+ protected void addSpecifiedPrimaryKeyJoinColumn(int index, XmlPrimaryKeyJoinColumn primaryKeyJoinColumn) {
+ addItemToList(index, primaryKeyJoinColumn, this.specifiedPrimaryKeyJoinColumns, ISecondaryTable.SPECIFIED_PRIMARY_KEY_JOIN_COLUMNS_LIST);
+ }
+
+ public void removeSpecifiedPrimaryKeyJoinColumn(int index) {
+ XmlPrimaryKeyJoinColumn removedPrimaryKeyJoinColumn = this.specifiedPrimaryKeyJoinColumns.remove(index);
+ this.secondaryTable.getPrimaryKeyJoinColumns().remove(index);
+ fireItemRemoved(ISecondaryTable.SPECIFIED_PRIMARY_KEY_JOIN_COLUMNS_LIST, index, removedPrimaryKeyJoinColumn);
+ }
+
+ protected void removeSpecifiedPrimaryKeyJoinColumn(XmlPrimaryKeyJoinColumn primaryKeyJoinColumn) {
+ removeItemFromList(primaryKeyJoinColumn, this.specifiedPrimaryKeyJoinColumns, ISecondaryTable.SPECIFIED_PRIMARY_KEY_JOIN_COLUMNS_LIST);
+ }
+
+ public void moveSpecifiedPrimaryKeyJoinColumn(int targetIndex, int sourceIndex) {
+ CollectionTools.move(this.specifiedPrimaryKeyJoinColumns, targetIndex, sourceIndex);
+ this.secondaryTable.getPrimaryKeyJoinColumns().move(targetIndex, sourceIndex);
+ fireItemMoved(ISecondaryTable.SPECIFIED_PRIMARY_KEY_JOIN_COLUMNS_LIST, targetIndex, sourceIndex);
+ }
+
+
+ public boolean isVirtual() {
+ return xmlEntity().containsVirtualSecondaryTable(this);
+ }
+
+ @Override
+ protected void addTableResource() {
+ //secondaryTables are part of a collection, the secondary-table element will be removed/added
+ //when the XmlSecondaryTable is removed/added to the XmlEntity collection
+ }
+
+ @Override
+ protected void removeTableResource() {
+ //secondaryTables are part of a collection, the secondary-table element will be removed/added
+ //when the XmlSecondaryTable is removed/added to the XmlEntity collection
+ }
+
+ @Override
+ protected AbstractTable table() {
+ return this.secondaryTable;
+ }
+
+ public void initialize(SecondaryTable secondaryTable) {
+ this.secondaryTable = secondaryTable;
+ super.initialize(secondaryTable);
+ this.initializeSpecifiedPrimaryKeyJoinColumns(secondaryTable);
+ }
+
+ protected void initializeSpecifiedPrimaryKeyJoinColumns(SecondaryTable secondaryTable) {
+ for (PrimaryKeyJoinColumn primaryKeyJoinColumn : secondaryTable.getPrimaryKeyJoinColumns()) {
+ this.specifiedPrimaryKeyJoinColumns.add(createPrimaryKeyJoinColumn(primaryKeyJoinColumn));
+ }
+ }
+
+ public void update(SecondaryTable secondaryTable) {
+ this.secondaryTable = secondaryTable;
+ super.update(secondaryTable);
+ this.updateSpecifiedPrimaryKeyJoinColumns(secondaryTable);
+ }
+
+ protected void updateSpecifiedPrimaryKeyJoinColumns(SecondaryTable secondaryTable) {
+ ListIterator<XmlPrimaryKeyJoinColumn> primaryKeyJoinColumns = specifiedPrimaryKeyJoinColumns();
+ ListIterator<PrimaryKeyJoinColumn> resourcePrimaryKeyJoinColumns = secondaryTable.getPrimaryKeyJoinColumns().listIterator();
+
+ while (primaryKeyJoinColumns.hasNext()) {
+ XmlPrimaryKeyJoinColumn primaryKeyJoinColumn = primaryKeyJoinColumns.next();
+ if (resourcePrimaryKeyJoinColumns.hasNext()) {
+ primaryKeyJoinColumn.update(resourcePrimaryKeyJoinColumns.next());
+ }
+ else {
+ removeSpecifiedPrimaryKeyJoinColumn(primaryKeyJoinColumn);
+ }
+ }
+
+ while (resourcePrimaryKeyJoinColumns.hasNext()) {
+ addSpecifiedPrimaryKeyJoinColumn(specifiedPrimaryKeyJoinColumnsSize(), createPrimaryKeyJoinColumn(resourcePrimaryKeyJoinColumns.next()));
+ }
+ }
+
+ protected XmlPrimaryKeyJoinColumn createPrimaryKeyJoinColumn(PrimaryKeyJoinColumn primaryKeyJoinColumn) {
+ XmlPrimaryKeyJoinColumn xmlPrimaryKeyJoinColumn = new XmlPrimaryKeyJoinColumn(this, createPrimaryKeyJoinColumnOwner());
+ xmlPrimaryKeyJoinColumn.initialize(primaryKeyJoinColumn);
+ return xmlPrimaryKeyJoinColumn;
+ }
+
+ @Override
+ //no default name for secondaryTables
+ protected String defaultName() {
+ return null;
+ }
+
+ @Override
+ protected String defaultCatalog() {
+ return entityMappings().getCatalog();
+ }
+
+ @Override
+ protected String defaultSchema() {
+ return entityMappings().getSchema();
+ }
+
+ class PrimaryKeyJoinColumnOwner implements IAbstractJoinColumn.Owner
+ {
+ public ITextRange validationTextRange(CompilationUnit astRoot) {
+ //TODO textRange
+ return null;//return XmlSecondaryTable.this.validationTextRange(astRoot);
+ }
+
+ public ITypeMapping typeMapping() {
+ return XmlSecondaryTable.this.xmlEntity();
+ }
+
+ public Table dbTable(String tableName) {
+ return XmlSecondaryTable.this.dbTable();
+ }
+
+ public Table dbReferencedColumnTable() {
+ return typeMapping().primaryDbTable();
+ }
+
+ public int joinColumnsSize() {
+ return CollectionTools.size(XmlSecondaryTable.this.primaryKeyJoinColumns());
+ }
+
+ public boolean isVirtual(IAbstractJoinColumn joinColumn) {
+ return XmlSecondaryTable.this.defaultPrimaryKeyJoinColumns.contains(joinColumn);
+ }
+
+ public String defaultColumnName() {
+ if (joinColumnsSize() != 1) {
+ return null;
+ }
+ return xmlEntity().parentEntity().primaryKeyColumnName();
+
+ }
+ }
+}

Back to the top