diff options
89 files changed, 1776 insertions, 3308 deletions
diff --git a/plugins/org.eclipse.emf.cdo.common/.options b/plugins/org.eclipse.emf.cdo.common/.options index a933232c86..71d542d56e 100644 --- a/plugins/org.eclipse.emf.cdo.common/.options +++ b/plugins/org.eclipse.emf.cdo.common/.options @@ -2,7 +2,6 @@ org.eclipse.emf.cdo.common/debug = true org.eclipse.emf.cdo.common/debug.protocol = true -org.eclipse.emf.cdo.common/debug.metaid = false org.eclipse.emf.cdo.common/debug.id = true org.eclipse.emf.cdo.common/debug.revision= true diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOID.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOID.java index 77c0654b9e..af1054882c 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOID.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOID.java @@ -31,8 +31,6 @@ public interface CDOID extends Serializable, Comparable<CDOID> public boolean isObject(); - public boolean isMeta(); - public boolean isTemporary(); /** @@ -72,9 +70,7 @@ public interface CDOID extends Serializable, Comparable<CDOID> * @since 2.0 */ EXTERNAL_TEMP_OBJECT('e'), // - TEMP_OBJECT('t'), // - META('M'), // - TEMP_META('m'); + TEMP_OBJECT('t'); private static Enum<?>[] chars; diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOIDMeta.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOIDMeta.java deleted file mode 100644 index 1ea0215219..0000000000 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOIDMeta.java +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (c) 2004 - 2010 Eike Stepper (Berlin, Germany) and others. - * 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: - * Eike Stepper - initial API and implementation - */ -package org.eclipse.emf.cdo.common.id; - -/** - * @author Eike Stepper - * @noimplement This interface is not intended to be implemented by clients. - */ -public interface CDOIDMeta extends CDOID -{ - public long getLongValue(); -} diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOIDMetaRange.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOIDMetaRange.java deleted file mode 100644 index 6aa32b10fb..0000000000 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOIDMetaRange.java +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright (c) 2004 - 2010 Eike Stepper (Berlin, Germany) and others. - * 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: - * Eike Stepper - initial API and implementation - */ -package org.eclipse.emf.cdo.common.id; - -import org.eclipse.emf.cdo.common.id.CDOID.Type; - -import java.io.Serializable; - -/** - * @author Eike Stepper - * @noimplement This interface is not intended to be implemented by clients. - */ -public interface CDOIDMetaRange extends Serializable -{ - public CDOID getLowerBound(); - - public CDOID getUpperBound(); - - public CDOID get(int index); - - public int size(); - - public boolean isEmpty(); - - public boolean contains(CDOID id); - - public CDOIDMetaRange increase(); - - public Type getType(); - - public boolean isTemporary(); -} diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOIDTempMeta.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOIDTempMeta.java deleted file mode 100644 index 72d536747d..0000000000 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOIDTempMeta.java +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright (c) 2004 - 2010 Eike Stepper (Berlin, Germany) and others. - * 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: - * Eike Stepper - initial API and implementation - * Simon McDuff - bug 213402 - */ -package org.eclipse.emf.cdo.common.id; - -/** - * @author Eike Stepper - * @noimplement This interface is not intended to be implemented by clients. - * @since 2.0 - */ -public interface CDOIDTempMeta extends CDOIDTemp -{ - public int getIntValue(); -} diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOIDUtil.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOIDUtil.java index b4d86b1f14..30eea895af 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOIDUtil.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/id/CDOIDUtil.java @@ -20,14 +20,11 @@ import org.eclipse.emf.cdo.common.model.CDOClassifierRef; import org.eclipse.emf.cdo.internal.common.id.CDOIDAndBranchImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDAndVersionImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDExternalImpl; -import org.eclipse.emf.cdo.internal.common.id.CDOIDMetaImpl; -import org.eclipse.emf.cdo.internal.common.id.CDOIDMetaRangeImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDObjectLongImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDObjectLongWithClassifierImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDObjectStringImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDObjectStringWithClassifierImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDObjectUUIDImpl; -import org.eclipse.emf.cdo.internal.common.id.CDOIDTempMetaImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDTempObjectExternalImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDTempObjectImpl; import org.eclipse.emf.cdo.internal.common.messages.Messages; @@ -78,10 +75,6 @@ public final class CDOIDUtil throw new IllegalArgumentException(MessageFormat.format( Messages.getString("CDOIDUtil.0"), id.getClass().getName())); //$NON-NLS-1$ - case META: - return ((CDOIDMeta)id).getLongValue(); - - case TEMP_META: case TEMP_OBJECT: throw new IllegalArgumentException(Messages.getString("CDOIDUtil.1")); //$NON-NLS-1$ @@ -108,11 +101,6 @@ public final class CDOIDUtil return null; } - public static CDOIDTemp createTempMeta(int value) - { - return new CDOIDTempMetaImpl(value); - } - public static CDOIDTemp createTempObject(int value) { return new CDOIDTempObjectImpl(value); @@ -160,16 +148,6 @@ public final class CDOIDUtil return new CDOIDExternalImpl(uri); } - public static CDOIDMeta createMeta(long value) - { - return new CDOIDMetaImpl(value); - } - - public static CDOIDMetaRange createMetaRange(CDOID lowerBound, int count) - { - return new CDOIDMetaRangeImpl(lowerBound, count); - } - public static CDOIDAndVersion createIDAndVersion(CDOID id, int version) { return new CDOIDAndVersionImpl(id, version); @@ -305,12 +283,6 @@ public final class CDOIDUtil case TEMP_OBJECT: return new CDOIDTempObjectImpl(Integer.valueOf(fragment)); - case TEMP_META: - return new CDOIDTempMetaImpl(Integer.valueOf(fragment)); - - case META: - return new CDOIDMetaImpl(Long.valueOf(fragment)); - case EXTERNAL_OBJECT: return new CDOIDExternalImpl(fragment); diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOModelUtil.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOModelUtil.java index 2e7d70cbe7..dafb50dd41 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOModelUtil.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOModelUtil.java @@ -425,6 +425,18 @@ public final class CDOModelUtil } /** + * @since 3.0 + */ + public static EPackage readPackage(ExtendedDataInput in, ResourceSet resourceSet, boolean lookForResource) + throws IOException + { + String uri = in.readString(); + boolean zipped = in.readBoolean(); + byte[] bytes = in.readByteArray(); + return EMFUtil.createEPackage(uri, bytes, zipped, resourceSet, lookForResource); + } + + /** * @since 2.0 */ public static void writePackage(ExtendedDataOutput out, EPackage ePackage, boolean zipped, @@ -506,16 +518,4 @@ public final class CDOModelUtil } } } - - /** - * @since 3.0 - */ - public static EPackage readPackage(ExtendedDataInput in, ResourceSet resourceSet, boolean lookForResource) - throws IOException - { - String uri = in.readString(); - boolean zipped = in.readBoolean(); - byte[] bytes = in.readByteArray(); - return EMFUtil.createEPackage(uri, bytes, zipped, resourceSet, lookForResource); - } } diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOPackageInfo.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOPackageInfo.java index 136d3bf8d1..a857a0a8fe 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOPackageInfo.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/model/CDOPackageInfo.java @@ -10,12 +10,9 @@ */ package org.eclipse.emf.cdo.common.model; -import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; import org.eclipse.emf.cdo.common.model.CDOPackageUnit.State; import org.eclipse.emf.common.notify.Adapter; -import org.eclipse.emf.ecore.EModelElement; import org.eclipse.emf.ecore.EPackage; /** @@ -49,12 +46,6 @@ public interface CDOPackageInfo extends Adapter, EPackage.Descriptor, Comparable public String getParentURI(); /** - * Returns the consecutive range of {@link CDOID ids} permanently assigned to the {@link EModelElement model elements} - * in the package described by this package info. - */ - public CDOIDMetaRange getMetaIDRange(); - - /** * Returns the {@link EPackage package} described by this package info. * * @param loadOnDemand diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDODataInput.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDODataInput.java index c44ca1dec6..3eb46583a1 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDODataInput.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDODataInput.java @@ -20,7 +20,6 @@ import org.eclipse.emf.cdo.common.commit.CDOCommitInfo; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDAndBranch; import org.eclipse.emf.cdo.common.id.CDOIDAndVersion; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; import org.eclipse.emf.cdo.common.model.CDOClassifierRef; import org.eclipse.emf.cdo.common.model.CDOPackageInfo; import org.eclipse.emf.cdo.common.model.CDOPackageUnit; @@ -87,8 +86,6 @@ public interface CDODataInput extends ExtendedDataInput public CDOIDAndBranch readCDOIDAndBranch() throws IOException; - public CDOIDMetaRange readCDOIDMetaRange() throws IOException; - // ///////////////////////////////////////////////////////////////////////////////////////////////// public CDORevisionKey readCDORevisionKey() throws IOException; diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDODataOutput.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDODataOutput.java index 859f76c393..8c30addb56 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDODataOutput.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDODataOutput.java @@ -20,7 +20,6 @@ import org.eclipse.emf.cdo.common.commit.CDOCommitInfo; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDAndBranch; import org.eclipse.emf.cdo.common.id.CDOIDAndVersion; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; import org.eclipse.emf.cdo.common.id.CDOIDProvider; import org.eclipse.emf.cdo.common.model.CDOClassifierRef; import org.eclipse.emf.cdo.common.model.CDOPackageInfo; @@ -92,8 +91,6 @@ public interface CDODataOutput extends ExtendedDataOutput public void writeCDOIDAndBranch(CDOIDAndBranch idAndBranch) throws IOException; - public void writeCDOIDMetaRange(CDOIDMetaRange metaRange) throws IOException; - // ///////////////////////////////////////////////////////////////////////////////////////////////// public void writeCDORevisionKey(CDORevisionKey revisionKey) throws IOException; diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/bundle/OM.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/bundle/OM.java index 80d1dc8bc5..bdd040b0f6 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/bundle/OM.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/bundle/OM.java @@ -31,8 +31,6 @@ public abstract class OM public static final OMTracer DEBUG_PROTOCOL = DEBUG.tracer("protocol"); //$NON-NLS-1$ - public static final OMTracer DEBUG_METAID = DEBUG.tracer("metaid"); //$NON-NLS-1$ - public static final OMTracer DEBUG_ID = DEBUG.tracer("id"); //$NON-NLS-1$ public static final OMTracer DEBUG_REVISION = DEBUG.tracer("revision"); //$NON-NLS-1$ diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDExternalImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDExternalImpl.java index a518bd2dbc..9e6373ece2 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDExternalImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDExternalImpl.java @@ -50,11 +50,6 @@ public class CDOIDExternalImpl extends AbstractCDOID implements CDOIDExternal return true; } - public boolean isMeta() - { - return false; - } - public boolean isNull() { return false; diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDMetaImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDMetaImpl.java deleted file mode 100644 index a058b39681..0000000000 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDMetaImpl.java +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Copyright (c) 2004 - 2010 Eike Stepper (Berlin, Germany) and others. - * 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: - * Eike Stepper - initial API and implementation - */ -package org.eclipse.emf.cdo.internal.common.id; - -import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.id.CDOIDMeta; -import org.eclipse.emf.cdo.spi.common.id.AbstractCDOIDLong; - -/** - * @author Eike Stepper - */ -public class CDOIDMetaImpl extends AbstractCDOIDLong implements CDOIDMeta -{ - private static final long serialVersionUID = 1L; - - public CDOIDMetaImpl(long value) - { - super(value); - } - - public Type getType() - { - return Type.META; - } - - public boolean isDangling() - { - return false; - } - - public boolean isExternal() - { - return false; - } - - public boolean isMeta() - { - return true; - } - - public boolean isNull() - { - return false; - } - - public boolean isObject() - { - return false; - } - - public boolean isTemporary() - { - return false; - } - - @Override - public String toString() - { - return "MID" + getLongValue(); //$NON-NLS-1$ - } - - @Override - protected int doCompareTo(CDOID o) throws ClassCastException - { - return new Long(getLongValue()).compareTo(((CDOIDMetaImpl)o).getLongValue()); - } -} diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDMetaRangeImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDMetaRangeImpl.java deleted file mode 100644 index ff08ef6d95..0000000000 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDMetaRangeImpl.java +++ /dev/null @@ -1,118 +0,0 @@ -/** - * Copyright (c) 2004 - 2010 Eike Stepper (Berlin, Germany) and others. - * 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: - * Eike Stepper - initial API and implementation - */ -package org.eclipse.emf.cdo.internal.common.id; - -import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.id.CDOID.Type; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; - -import java.text.MessageFormat; - -/** - * @author Eike Stepper - */ -public final class CDOIDMetaRangeImpl implements CDOIDMetaRange -{ - private static final long serialVersionUID = 1L; - - private CDOID lowerBound; - - private int size; - - public CDOIDMetaRangeImpl(CDOID lowerBound, int size) - { - if (size < 0) - { - throw new IllegalArgumentException("size < 0"); //$NON-NLS-1$ - } - - this.lowerBound = lowerBound; - this.size = size; - } - - public CDOID getLowerBound() - { - return lowerBound; - } - - public CDOID getUpperBound() - { - return size > 0 ? get(size - 1) : null; - } - - public CDOID get(int index) - { - if (index < 0 || index >= size) - { - throw new IllegalArgumentException("ids < 0 || ids >= size"); //$NON-NLS-1$ - } - - if (isTemporary()) - { - return new CDOIDTempMetaImpl(((CDOIDTempMetaImpl)lowerBound).getIntValue() + index); - } - - return new CDOIDMetaImpl(((CDOIDMetaImpl)lowerBound).getLongValue() + index); - } - - public int size() - { - return size; - } - - public boolean isEmpty() - { - return size == 0; - } - - public boolean contains(CDOID id) - { - if (isTemporary()) - { - if (id.getType() != Type.TEMP_META) - { - throw new IllegalArgumentException("id.getType() != Type.TEMP_META"); //$NON-NLS-1$ - } - - int index = ((CDOIDTempMetaImpl)id).getIntValue() - ((CDOIDTempMetaImpl)lowerBound).getIntValue(); - return 0 <= index && index < size; - } - - if (id.getType() != Type.META) - { - throw new IllegalArgumentException("id.getType() != Type.META"); //$NON-NLS-1$ - } - - long index = ((CDOIDMetaImpl)id).getLongValue() - ((CDOIDMetaImpl)lowerBound).getLongValue(); - return 0L <= index && index < size; - } - - public CDOIDMetaRange increase() - { - return new CDOIDMetaRangeImpl(lowerBound, size + 1); - } - - public Type getType() - { - return lowerBound.getType(); - } - - public boolean isTemporary() - { - return lowerBound.isTemporary(); - } - - @Override - public String toString() - { - return MessageFormat.format("[{0}:{1}]", lowerBound, getUpperBound()); //$NON-NLS-1$ - } -} diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDNullImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDNullImpl.java index 301779022e..d492df5c35 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDNullImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDNullImpl.java @@ -13,7 +13,6 @@ package org.eclipse.emf.cdo.internal.common.id; import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.id.CDOIDMeta; import org.eclipse.emf.cdo.common.id.CDOIDObject; import org.eclipse.emf.cdo.common.id.CDOIDTemp; import org.eclipse.emf.cdo.spi.common.id.AbstractCDOID; @@ -26,7 +25,7 @@ import java.io.IOException; /** * @author Eike Stepper */ -public final class CDOIDNullImpl extends AbstractCDOID implements CDOIDMeta, CDOIDTemp, CDOIDObject +public final class CDOIDNullImpl extends AbstractCDOID implements CDOIDTemp, CDOIDObject { public static final CDOIDNullImpl INSTANCE = new CDOIDNullImpl(); @@ -51,11 +50,6 @@ public final class CDOIDNullImpl extends AbstractCDOID implements CDOIDMeta, CDO return false; } - public boolean isMeta() - { - return false; - } - public boolean isNull() { return true; diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDObjectLongImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDObjectLongImpl.java index 749354ca9a..0312b05075 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDObjectLongImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDObjectLongImpl.java @@ -46,11 +46,6 @@ public class CDOIDObjectLongImpl extends AbstractCDOIDLong implements InternalCD return false; } - public boolean isMeta() - { - return false; - } - public boolean isNull() { return false; diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDObjectStringImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDObjectStringImpl.java index dbb8f21e07..84a2842fec 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDObjectStringImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDObjectStringImpl.java @@ -47,11 +47,6 @@ public class CDOIDObjectStringImpl extends AbstractCDOIDString implements Intern return false; } - public boolean isMeta() - { - return false; - } - public boolean isNull() { return false; diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDObjectUUIDImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDObjectUUIDImpl.java index 6561da37b1..b7d6ac91ba 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDObjectUUIDImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDObjectUUIDImpl.java @@ -47,11 +47,6 @@ public class CDOIDObjectUUIDImpl extends AbstractCDOIDString implements Internal return false; } - public boolean isMeta() - { - return false; - } - public boolean isNull() { return false; diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDTempMetaImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDTempMetaImpl.java deleted file mode 100644 index a5596a57c4..0000000000 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDTempMetaImpl.java +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Copyright (c) 2004 - 2010 Eike Stepper (Berlin, Germany) and others. - * 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: - * Eike Stepper - initial API and implementation - * Simon McDuff - bug 213402 - */ -package org.eclipse.emf.cdo.internal.common.id; - -import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.id.CDOIDTempMeta; -import org.eclipse.emf.cdo.spi.common.id.AbstractCDOIDInteger; - -/** - * @author Eike Stepper - */ -public class CDOIDTempMetaImpl extends AbstractCDOIDInteger implements CDOIDTempMeta -{ - private static final long serialVersionUID = 1L; - - public CDOIDTempMetaImpl(int value) - { - super(value); - } - - public Type getType() - { - return Type.TEMP_META; - } - - public boolean isDangling() - { - return false; - } - - public boolean isExternal() - { - return false; - } - - public boolean isMeta() - { - return true; - } - - public boolean isNull() - { - return false; - } - - public boolean isObject() - { - return false; - } - - public boolean isTemporary() - { - return true; - } - - @Override - public String toString() - { - return "mid" + getIntValue(); //$NON-NLS-1$ - } - - @Override - protected int doCompareTo(CDOID o) throws ClassCastException - { - return new Integer(getIntValue()).compareTo(((CDOIDTempMetaImpl)o).getIntValue()); - } -} diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDTempObjectImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDTempObjectImpl.java index 5f5da8161c..a69251ccff 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDTempObjectImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/id/CDOIDTempObjectImpl.java @@ -41,11 +41,6 @@ public class CDOIDTempObjectImpl extends AbstractCDOIDInteger implements CDOIDTe return false; } - public boolean isMeta() - { - return false; - } - public boolean isNull() { return false; diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/messages/messages.properties b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/messages/messages.properties index 5a639f71e1..19067d6b71 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/messages/messages.properties +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/messages/messages.properties @@ -27,9 +27,6 @@ CDOIDUtil.5=Invalid ID type: {0} CDOModelUtil.6=No type for id {0} CDOModelUtil.7=Not a primitive type nor String nor Date: {0} CDOPackageRegistryImpl.0=No package unit available for: {0} -CDOPackageRegistryImpl.1=No meta instance mapped for {0} -CDOPackageRegistryImpl.10=Unknown meta instance ID: {0} -CDOPackageRegistryImpl.6=No meta ID mapped for {0}\nContaining package: {1} CDOPackageUnit.0=Package unit type is unknown CDOPackageUnitImpl.0=UNINITIALIZED CDOPackageUnitImpl.1=Package unit not initialized diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageInfoImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageInfoImpl.java index 28a98d4ae4..f0c811dfaa 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageInfoImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageInfoImpl.java @@ -10,7 +10,6 @@ */ package org.eclipse.emf.cdo.internal.common.model; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; import org.eclipse.emf.cdo.common.model.CDOModelUtil; import org.eclipse.emf.cdo.common.model.CDOPackageInfo; import org.eclipse.emf.cdo.common.protocol.CDODataInput; @@ -41,8 +40,6 @@ public class CDOPackageInfoImpl extends AdapterImpl implements InternalCDOPackag private String parentURI; - private CDOIDMetaRange metaIDRange; - public CDOPackageInfoImpl() { } @@ -77,16 +74,6 @@ public class CDOPackageInfoImpl extends AdapterImpl implements InternalCDOPackag this.parentURI = parentURI; } - public CDOIDMetaRange getMetaIDRange() - { - return metaIDRange; - } - - public void setMetaIDRange(CDOIDMetaRange metaIDRange) - { - this.metaIDRange = metaIDRange; - } - public void write(CDODataOutput out) throws IOException { if (TRACER.isEnabled()) @@ -96,14 +83,12 @@ public class CDOPackageInfoImpl extends AdapterImpl implements InternalCDOPackag out.writeCDOPackageURI(packageURI); out.writeCDOPackageURI(parentURI); - out.writeCDOIDMetaRange(getMetaIDRange()); } public void read(CDODataInput in) throws IOException { packageURI = in.readCDOPackageURI(); parentURI = in.readCDOPackageURI(); - metaIDRange = in.readCDOIDMetaRange(); if (TRACER.isEnabled()) { TRACER.format("Read {0}", this); //$NON-NLS-1$ @@ -165,7 +150,6 @@ public class CDOPackageInfoImpl extends AdapterImpl implements InternalCDOPackag @Override public String toString() { - return MessageFormat.format("CDOPackageInfo[packageURI={0}, parentURI={1}, metaIDRange={2}]", packageURI, //$NON-NLS-1$ - parentURI, metaIDRange); + return MessageFormat.format("CDOPackageInfo[packageURI={0}, parentURI={1}]", packageURI, parentURI); //$NON-NLS-1$ } } diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageRegistryImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageRegistryImpl.java index b3db8a0893..bb16ac1b74 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageRegistryImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageRegistryImpl.java @@ -11,11 +11,6 @@ package org.eclipse.emf.cdo.internal.common.model; import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; -import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; -import org.eclipse.emf.cdo.common.id.CDOIDTemp; -import org.eclipse.emf.cdo.common.id.CDOIDTempMeta; -import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.model.CDOModelUtil; import org.eclipse.emf.cdo.common.model.CDOPackageInfo; import org.eclipse.emf.cdo.common.model.CDOPackageUnit; @@ -43,18 +38,12 @@ import org.eclipse.emf.common.util.Enumerator; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EEnum; import org.eclipse.emf.ecore.EEnumLiteral; -import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; -import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.impl.EPackageRegistryImpl; -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -70,12 +59,8 @@ public class CDOPackageRegistryImpl extends EPackageRegistryImpl implements Inte private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, CDOPackageRegistryImpl.class); - private static final ContextTracer METAID_TRACER = new ContextTracer(OM.DEBUG_METAID, MetaInstanceMapperImpl.class); - private static final boolean eagerInternalCaches = false; - private MetaInstanceMapperImpl metaInstanceMapper = new MetaInstanceMapperImpl(); - private boolean replacingDescriptors; private PackageProcessor packageProcessor; @@ -98,11 +83,6 @@ public class CDOPackageRegistryImpl extends EPackageRegistryImpl implements Inte { } - public MetaInstanceMapper getMetaInstanceMapper() - { - return metaInstanceMapper; - } - public boolean isReplacingDescriptors() { return replacingDescriptors; @@ -210,10 +190,6 @@ public class CDOPackageRegistryImpl extends EPackageRegistryImpl implements Inte EPackage oldPackage = (EPackage)oldValue; InternalCDOPackageInfo oldPackageInfo = getPackageInfo(oldPackage); InternalCDOPackageInfo newPackageInfo = (InternalCDOPackageInfo)value; - if (oldPackageInfo.getMetaIDRange().isTemporary() && !newPackageInfo.getMetaIDRange().isTemporary()) - { - oldPackageInfo.setMetaIDRange(newPackageInfo.getMetaIDRange()); - } InternalCDOPackageUnit oldPackageUnit = oldPackageInfo.getPackageUnit(); InternalCDOPackageUnit newPackageUnit = newPackageInfo.getPackageUnit(); @@ -610,8 +586,6 @@ public class CDOPackageRegistryImpl extends EPackageRegistryImpl implements Inte try { disposePackageUnits(); - metaInstanceMapper.clear(); - clear(); active = false; } @@ -659,258 +633,4 @@ public class CDOPackageRegistryImpl extends EPackageRegistryImpl implements Inte packageUnit.setPackageRegistry(this); return packageUnit; } - - /** - * @author Eike Stepper - */ - public class MetaInstanceMapperImpl implements MetaInstanceMapper - { - private Map<CDOID, InternalEObject> idToMetaInstanceMap = new HashMap<CDOID, InternalEObject>(); - - private Map<InternalEObject, CDOID> metaInstanceToIDMap = new HashMap<InternalEObject, CDOID>(); - - @ExcludeFromDump - private transient int lastTempMetaID; - - public MetaInstanceMapperImpl() - { - } - - public synchronized InternalEObject lookupMetaInstance(CDOID id) - { - LifecycleUtil.checkActive(CDOPackageRegistryImpl.this); - InternalEObject metaInstance = idToMetaInstanceMap.get(id); - if (metaInstance != null) - { - return metaInstance; - } - - if (delegateRegistry instanceof InternalCDOPackageRegistry) - { - try - { - InternalCDOPackageRegistry delegate = (InternalCDOPackageRegistry)delegateRegistry; - return delegate.getMetaInstanceMapper().lookupMetaInstance(id); - } - catch (RuntimeException ex) - { - // Fall-through - } - } - - for (InternalCDOPackageInfo packageInfo : getPackageInfos()) - { - CDOIDMetaRange metaIDRange = packageInfo.getMetaIDRange(); - if (metaIDRange != null && metaIDRange.contains(id)) - { - EPackage ePackage = packageInfo.getEPackage(); - mapMetaInstances(ePackage, packageInfo.getMetaIDRange()); - metaInstance = idToMetaInstanceMap.get(id); - if (metaInstance != null) - { - return metaInstance; - } - - break; - } - } - - throw new IllegalStateException( - MessageFormat.format(Messages.getString("CDOPackageRegistryImpl.1"), id) + "\n" + dump()); //$NON-NLS-1$ //$NON-NLS-2$ - } - - public synchronized CDOID lookupMetaInstanceID(InternalEObject metaInstance) - { - LifecycleUtil.checkActive(CDOPackageRegistryImpl.this); - CDOID metaID = metaInstanceToIDMap.get(metaInstance); - if (metaID != null) - { - return metaID; - } - - if (delegateRegistry instanceof InternalCDOPackageRegistry) - { - try - { - InternalCDOPackageRegistry delegate = (InternalCDOPackageRegistry)delegateRegistry; - return delegate.getMetaInstanceMapper().lookupMetaInstanceID(metaInstance); - } - catch (RuntimeException ex) - { - if (TRACER.isEnabled()) - { - TRACER.trace(ex); - } - } - } - - EPackage ePackage = getContainingPackage(metaInstance); - if (ePackage != null) - { - InternalCDOPackageInfo packageInfo = getPackageInfo(ePackage); - if (packageInfo != null) - { - mapMetaInstances(ePackage, packageInfo.getMetaIDRange()); - metaID = metaInstanceToIDMap.get(metaInstance); - if (metaID != null) - { - return metaID; - } - } - } - - throw new IllegalStateException(MessageFormat.format(Messages.getString("CDOPackageRegistryImpl.6"), - metaInstance, ePackage) // $NON-NLS-1$ - // + "\n" + dump() // $NON-NLS-1$ - ); - } - - private EPackage getContainingPackage(InternalEObject metaInstance) - { - EObject object = metaInstance; - while ((object = object.eContainer()) != null) - { - if (object instanceof EPackage) - { - return (EPackage)object; - } - } - - return null; - } - - public synchronized CDOIDMetaRange mapMetaInstances(EPackage ePackage) - { - LifecycleUtil.checkActive(CDOPackageRegistryImpl.this); - CDOIDMetaRange range = map(ePackage, lastTempMetaID + 1); - lastTempMetaID = ((CDOIDTempMeta)range.getUpperBound()).getIntValue(); - return range; - } - - public synchronized void mapMetaInstances(EPackage ePackage, CDOIDMetaRange metaIDRange) - { - LifecycleUtil.checkActive(CDOPackageRegistryImpl.this); - CDOIDMetaRange range = CDOIDUtil.createMetaRange(metaIDRange.getLowerBound(), 0); - range = map((InternalEObject)ePackage, range); - if (range.size() != metaIDRange.size()) - { - throw new IllegalStateException("range.size() != metaIDRange.size()"); //$NON-NLS-1$ - } - } - - public void mapMetaInstances(MetaInstanceMapper source) - { - for (Map.Entry<CDOID, InternalEObject> entry : source.getEntrySet()) - { - map(entry.getKey(), entry.getValue()); - } - } - - public Set<Map.Entry<CDOID, InternalEObject>> getEntrySet() - { - return idToMetaInstanceMap.entrySet(); - } - - public synchronized void remapMetaInstanceID(CDOID oldID, CDOID newID) - { - LifecycleUtil.checkActive(CDOPackageRegistryImpl.this); - InternalEObject metaInstance = idToMetaInstanceMap.remove(oldID); - if (metaInstance == null) - { - throw new IllegalArgumentException(MessageFormat.format(Messages.getString("CDOPackageRegistryImpl.10"), oldID)); //$NON-NLS-1$ - } - - if (METAID_TRACER.isEnabled()) - { - METAID_TRACER.format("Remapping meta instance: {0} --> {1} <-> {2}", oldID, newID, metaInstance); //$NON-NLS-1$ - } - - map(newID, metaInstance); - } - - public void clear() - { - idToMetaInstanceMap.clear(); - metaInstanceToIDMap.clear(); - lastTempMetaID = 0; - } - - private String dump() - { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - PrintStream stream = new PrintStream(baos); - - stream.println(); - stream.println(); - stream.println(CDOPackageRegistryImpl.this); - - stream.println(); - List<Map.Entry<CDOID, InternalEObject>> list = new ArrayList<Map.Entry<CDOID, InternalEObject>>( - idToMetaInstanceMap.entrySet()); - Collections.sort(list, new Comparator<Map.Entry<CDOID, InternalEObject>>() - { - public int compare(Map.Entry<CDOID, InternalEObject> o1, Map.Entry<CDOID, InternalEObject> o2) - { - return o1.getKey().compareTo(o2.getKey()); - } - }); - - for (Map.Entry<CDOID, InternalEObject> entry : list) - { - stream.println(" " + entry.getKey() + " --> " + entry.getValue()); //$NON-NLS-1$ //$NON-NLS-2$ - } - - return baos.toString(); - } - - private CDOIDMetaRange map(EPackage ePackage, int firstMetaID) - { - CDOIDTemp lowerBound = CDOIDUtil.createTempMeta(firstMetaID); - CDOIDMetaRange range = CDOIDUtil.createMetaRange(lowerBound, 0); - return map((InternalEObject)ePackage, range); - } - - private CDOIDMetaRange map(InternalEObject metaInstance, CDOIDMetaRange range) - { - range = range.increase(); - CDOID id = range.getUpperBound(); - checkID(id); - if (METAID_TRACER.isEnabled()) - { - METAID_TRACER.format("Registering meta instance: {0} <-> {1}", id, metaInstance); //$NON-NLS-1$ - } - - idToMetaInstanceMap.put(id, metaInstance); - CDOID oldID = metaInstanceToIDMap.put(metaInstance, id); - if (oldID != null) - { - idToMetaInstanceMap.remove(oldID); - } - - for (EObject content : metaInstance.eContents()) - { - if (!(content instanceof EPackage)) - { - range = map((InternalEObject)content, range); - } - } - - return range; - } - - private void map(CDOID metaID, InternalEObject metaInstance) - { - checkID(metaID); - idToMetaInstanceMap.put(metaID, metaInstance); - metaInstanceToIDMap.put(metaInstance, metaID); - } - - private void checkID(CDOID id) - { - if (!id.isMeta()) - { - throw new IllegalArgumentException("Not a meta ID: " + id); - } - } - } } diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageUnitImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageUnitImpl.java index 423ff098f1..4f10265550 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageUnitImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/model/CDOPackageUnitImpl.java @@ -339,7 +339,6 @@ public class CDOPackageUnitImpl implements InternalCDOPackageUnit packageInfo.setPackageUnit(this); packageInfo.setPackageURI(ePackage.getNsURI()); packageInfo.setParentURI(ePackage.getESuperPackage() == null ? null : ePackage.getESuperPackage().getNsURI()); - packageInfo.setMetaIDRange(packageRegistry.getMetaInstanceMapper().mapMetaInstances(ePackage)); EMFUtil.addAdapter(ePackage, packageInfo); packageRegistry.basicPut(ePackage.getNsURI(), ePackage); diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataInputImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataInputImpl.java index 2e767e4e1a..696b9e28f7 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataInputImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataInputImpl.java @@ -23,7 +23,6 @@ import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOID.Type; import org.eclipse.emf.cdo.common.id.CDOIDAndBranch; import org.eclipse.emf.cdo.common.id.CDOIDAndVersion; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.model.CDOClassifierRef; import org.eclipse.emf.cdo.common.model.CDOModelUtil; @@ -49,10 +48,7 @@ import org.eclipse.emf.cdo.internal.common.commit.CDOCommitDataImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDAndBranchImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDAndVersionImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDExternalImpl; -import org.eclipse.emf.cdo.internal.common.id.CDOIDMetaImpl; -import org.eclipse.emf.cdo.internal.common.id.CDOIDMetaRangeImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDObjectLongImpl; -import org.eclipse.emf.cdo.internal.common.id.CDOIDTempMetaImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDTempObjectExternalImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDTempObjectImpl; import org.eclipse.emf.cdo.internal.common.messages.Messages; @@ -287,12 +283,6 @@ public abstract class CDODataInputImpl extends ExtendedDataInput.Delegating impl case TEMP_OBJECT: return new CDOIDTempObjectImpl(readInt()); - case TEMP_META: - return new CDOIDTempMetaImpl(readInt()); - - case META: - return new CDOIDMetaImpl(readLong()); - case EXTERNAL_OBJECT: return new CDOIDExternalImpl(readString()); @@ -352,17 +342,6 @@ public abstract class CDODataInputImpl extends ExtendedDataInput.Delegating impl return new CDOIDAndBranchImpl(id, branch); } - public CDOIDMetaRange readCDOIDMetaRange() throws IOException - { - boolean exist = readBoolean(); - if (exist) - { - return new CDOIDMetaRangeImpl(readCDOID(), readInt()); - } - - return null; - } - public CDORevisionKey readCDORevisionKey() throws IOException { CDOID id = readCDOID(); diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataOutputImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataOutputImpl.java index c0d5213cb5..ab8fffbc87 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataOutputImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/protocol/CDODataOutputImpl.java @@ -19,7 +19,6 @@ import org.eclipse.emf.cdo.common.commit.CDOCommitInfo; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDAndBranch; import org.eclipse.emf.cdo.common.id.CDOIDAndVersion; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; import org.eclipse.emf.cdo.common.id.CDOIDProvider; import org.eclipse.emf.cdo.common.model.CDOClassifierRef; import org.eclipse.emf.cdo.common.model.CDOModelUtil; @@ -253,20 +252,6 @@ public abstract class CDODataOutputImpl extends ExtendedDataOutput.Delegating im writeCDOBranch(idAndBranch.getBranch()); } - public void writeCDOIDMetaRange(CDOIDMetaRange metaRange) throws IOException - { - if (metaRange == null) - { - writeBoolean(false); - } - else - { - writeBoolean(true); - writeCDOID(metaRange.getLowerBound()); - writeInt(metaRange.size()); - } - } - public void writeCDORevisionKey(CDORevisionKey revisionKey) throws IOException { writeCDOID(revisionKey.getID()); diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/model/InternalCDOPackageInfo.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/model/InternalCDOPackageInfo.java index c720dd1723..e55e140c0d 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/model/InternalCDOPackageInfo.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/model/InternalCDOPackageInfo.java @@ -10,7 +10,6 @@ */ package org.eclipse.emf.cdo.spi.common.model; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; import org.eclipse.emf.cdo.common.model.CDOPackageInfo; import org.eclipse.emf.cdo.common.protocol.CDODataInput; import org.eclipse.emf.cdo.common.protocol.CDODataOutput; @@ -33,8 +32,6 @@ public interface InternalCDOPackageInfo extends CDOPackageInfo, Adapter.Internal public void setParentURI(String parentURI); - public void setMetaIDRange(CDOIDMetaRange metaIDRange); - /** * @since 3.0 */ diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/model/InternalCDOPackageRegistry.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/model/InternalCDOPackageRegistry.java index b74b644424..aa675f1397 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/model/InternalCDOPackageRegistry.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/model/InternalCDOPackageRegistry.java @@ -10,8 +10,6 @@ */ package org.eclipse.emf.cdo.spi.common.model; -import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; import org.eclipse.emf.cdo.common.model.CDOPackageRegistry; import org.eclipse.emf.cdo.common.model.CDOPackageUnit; import org.eclipse.emf.cdo.common.model.CDOPackageUnit.State; @@ -19,7 +17,6 @@ import org.eclipse.emf.cdo.common.model.CDOPackageUnit.State; import org.eclipse.net4j.util.lifecycle.ILifecycle; import org.eclipse.emf.ecore.EPackage; -import org.eclipse.emf.ecore.InternalEObject; import java.util.Set; @@ -29,8 +26,6 @@ import java.util.Set; */ public interface InternalCDOPackageRegistry extends CDOPackageRegistry, ILifecycle { - public MetaInstanceMapper getMetaInstanceMapper(); - public void setReplacingDescriptors(boolean replacingDescriptors); public PackageProcessor getPackageProcessor(); @@ -105,24 +100,4 @@ public interface InternalCDOPackageRegistry extends CDOPackageRegistry, ILifecyc { public EPackage[] loadPackages(CDOPackageUnit packageUnit); } - - /** - * @author Eike Stepper - */ - public interface MetaInstanceMapper - { - public Set<Entry<CDOID, InternalEObject>> getEntrySet(); - - public InternalEObject lookupMetaInstance(CDOID id); - - public CDOID lookupMetaInstanceID(InternalEObject metaInstance); - - public CDOIDMetaRange mapMetaInstances(EPackage ePackage); - - public void mapMetaInstances(EPackage ePackage, CDOIDMetaRange metaIDRange); - - public void mapMetaInstances(MetaInstanceMapper source); - - public void remapMetaInstanceID(CDOID oldID, CDOID newID); - } } diff --git a/plugins/org.eclipse.emf.cdo.location/.options b/plugins/org.eclipse.emf.cdo.location/.options index a933232c86..fedbcac2fb 100644 --- a/plugins/org.eclipse.emf.cdo.location/.options +++ b/plugins/org.eclipse.emf.cdo.location/.options @@ -1,12 +1,3 @@ # Debugging and tracing options org.eclipse.emf.cdo.common/debug = true -org.eclipse.emf.cdo.common/debug.protocol = true -org.eclipse.emf.cdo.common/debug.metaid = false -org.eclipse.emf.cdo.common/debug.id = true -org.eclipse.emf.cdo.common/debug.revision= true - -org.eclipse.emf.cdo.common/perf = false -org.eclipse.emf.cdo.common/perf.revision = false -org.eclipse.emf.cdo.common/perf.revision.reading = false -org.eclipse.emf.cdo.common/perf.revision.writing = false diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitDelegationRequest.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitDelegationRequest.java index 1e8bc4d029..cad82ec322 100644 --- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitDelegationRequest.java +++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitDelegationRequest.java @@ -14,11 +14,9 @@ import org.eclipse.emf.cdo.common.branch.CDOBranch; import org.eclipse.emf.cdo.common.commit.CDOCommitData; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDProvider; -import org.eclipse.emf.cdo.common.id.CDOIDTemp; import org.eclipse.emf.cdo.common.model.lob.CDOLob; import org.eclipse.emf.cdo.common.protocol.CDODataOutput; import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants; -import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry.MetaInstanceMapper; import org.eclipse.emf.ecore.EClass; @@ -62,10 +60,4 @@ public class CommitDelegationRequest extends CommitTransactionRequest { return detachedObjectTypes.get(id); } - - @Override - protected void remapMetaInstanceID(MetaInstanceMapper metaInstanceMapper, CDOIDTemp oldID, CDOID newID) - { - // Do nothing - } } diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitTransactionRequest.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitTransactionRequest.java index 5af184e81d..c6b9a5cd06 100644 --- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitTransactionRequest.java +++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitTransactionRequest.java @@ -19,11 +19,9 @@ import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; import org.eclipse.emf.cdo.common.commit.CDOCommitData; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDAndVersion; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; import org.eclipse.emf.cdo.common.id.CDOIDProvider; import org.eclipse.emf.cdo.common.id.CDOIDTemp; import org.eclipse.emf.cdo.common.id.CDOIDUtil; -import org.eclipse.emf.cdo.common.model.CDOPackageInfo; import org.eclipse.emf.cdo.common.model.CDOPackageUnit; import org.eclipse.emf.cdo.common.model.lob.CDOBlob; import org.eclipse.emf.cdo.common.model.lob.CDOClob; @@ -35,8 +33,6 @@ import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.revision.CDORevisionKey; import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta; import org.eclipse.emf.cdo.internal.net4j.bundle.OM; -import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageInfo; -import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry.MetaInstanceMapper; import org.eclipse.emf.cdo.transaction.CDOTransaction; import org.eclipse.net4j.util.io.ExtendedDataOutputStream; @@ -219,7 +215,6 @@ public class CommitTransactionRequest extends CDOClientRequestWithMonitoring<Com } result = confirmingResult(in); - confirmingMappingNewPackages(in, result); confirmingMappingNewObjects(in, result); return result; } @@ -244,32 +239,6 @@ public class CommitTransactionRequest extends CDOClientRequestWithMonitoring<Com return new CommitTransactionResult(idProvider, branchPoint, previousTimeStamp); } - protected void confirmingMappingNewPackages(CDODataInput in, CommitTransactionResult result) throws IOException - { - MetaInstanceMapper metaInstanceMapper = getSession().getPackageRegistry().getMetaInstanceMapper(); - for (CDOPackageUnit newPackageUnit : commitData.getNewPackageUnits()) - { - for (CDOPackageInfo packageInfo : newPackageUnit.getPackageInfos()) - { - CDOIDMetaRange oldRange = packageInfo.getMetaIDRange(); - CDOIDMetaRange newRange = in.readCDOIDMetaRange(); - ((InternalCDOPackageInfo)packageInfo).setMetaIDRange(newRange); - for (int i = 0; i < oldRange.size(); i++) - { - CDOIDTemp oldID = (CDOIDTemp)oldRange.get(i); - CDOID newID = newRange.get(i); - result.addIDMapping(oldID, newID); - remapMetaInstanceID(metaInstanceMapper, oldID, newID); - } - } - } - } - - protected void remapMetaInstanceID(MetaInstanceMapper metaInstanceMapper, CDOIDTemp oldID, CDOID newID) - { - metaInstanceMapper.remapMetaInstanceID(oldID, newID); - } - protected void confirmingMappingNewObjects(CDODataInput in, CommitTransactionResult result) throws IOException { for (;;) diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitXATransactionPhase3Request.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitXATransactionPhase3Request.java index 804c9c4e98..a6a3f5bd9c 100644 --- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitXATransactionPhase3Request.java +++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CommitXATransactionPhase3Request.java @@ -54,7 +54,6 @@ public class CommitXATransactionPhase3Request extends CommitXATransactionRequest } InternalCDOXACommitContext context = getCommitContext(); - confirmingMappingNewPackages(in, context.getResult()); return context.getResult(); } } diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/db/IExternalReferenceManager.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/db/IExternalReferenceManager.java index d070df1da8..98a1c770ad 100644 --- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/db/IExternalReferenceManager.java +++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/db/IExternalReferenceManager.java @@ -23,6 +23,16 @@ public interface IExternalReferenceManager public long mapExternalReference(IDBStoreAccessor accessor, CDOIDExternal id, long commitTime); public CDOIDExternal unmapExternalReference(IDBStoreAccessor accessor, long mappedId); + + /** + * @since 4.0 + */ + public long mapURI(IDBStoreAccessor accessor, String uri, long commitTime); + + /** + * @since 4.0 + */ + public String unmapURI(IDBStoreAccessor accessor, long mappedId); /** * @author Eike Stepper diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/db/IMetaDataManager.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/db/IMetaDataManager.java index bbdba0595f..2f88234848 100644 --- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/db/IMetaDataManager.java +++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/db/IMetaDataManager.java @@ -39,17 +39,17 @@ public interface IMetaDataManager * @param modelElement * the element * @return the corresponding ID - * @since 2.0 + * @since 4.0 */ - public long getMetaID(EModelElement modelElement); + public long getMetaID(IDBStoreAccessor accessor, EModelElement modelElement, long commitTime); /** * Returns the {@link EModelElement} referred to by the given ID. <code> getMetaInstance(getMetaID(m))</code> yields * <code>m</code> * - * @since 2.0 + * @since 4.0 */ - public EModelElement getMetaInstance(long id); + public EModelElement getMetaInstance(IDBStoreAccessor accessor, long id); /** * Loads a package unit from the database. @@ -64,6 +64,11 @@ public interface IMetaDataManager public EPackage[] loadPackageUnit(Connection connection, InternalCDOPackageUnit packageUnit); /** + * @since 4.0 + */ + public void clearMetaIDMappings(); + + /** * Reads information about package units present in the database. * * @param connection @@ -98,4 +103,5 @@ public interface IMetaDataManager */ public Collection<InternalCDOPackageUnit> rawImport(Connection connection, CDODataInput in, long fromCommitTime, long toCommitTime, OMMonitor monitor) throws IOException; + } diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/CDODBSchema.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/CDODBSchema.java index 2efe138189..26f1098f1b 100644 --- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/CDODBSchema.java +++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/CDODBSchema.java @@ -86,12 +86,6 @@ public class CDODBSchema extends DBSchema public static final IDBField PACKAGE_INFOS_UNIT = // PACKAGE_INFOS.addField("unit", DBType.VARCHAR, 255); //$NON-NLS-1$ - public static final IDBField PACKAGE_INFOS_META_LB = // - PACKAGE_INFOS.addField("meta_lb", DBType.BIGINT); //$NON-NLS-1$ - - public static final IDBField PACKAGE_INFOS_META_UB = // - PACKAGE_INFOS.addField("meta_ub", DBType.BIGINT); //$NON-NLS-1$ - public static final IDBIndex INDEX_PACKAGE_INFOS_PK = // PACKAGE_INFOS.addIndex(IDBIndex.Type.PRIMARY_KEY, PACKAGE_INFOS_URI); @@ -209,7 +203,7 @@ public class CDODBSchema extends DBSchema public static final String SQL_QUERY_LOBS = "SELECT 1 FROM " + CDODBSchema.LOBS + " WHERE " + CDODBSchema.LOBS_ID + "=?"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - public static final String SQL_HANDLE_LOBS = "SELECT " + CDODBSchema.LOBS_ID + ", " + CDODBSchema.LOBS_SIZE + ", " + CDODBSchema.LOBS_BDATA + ", " + CDODBSchema.LOBS_CDATA + " FROM " + CDODBSchema.LOBS; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + public static final String SQL_HANDLE_LOBS = "SELECT " + CDODBSchema.LOBS_ID + ", " + CDODBSchema.LOBS_SIZE + ", " + CDODBSchema.LOBS_BDATA + ", " + CDODBSchema.LOBS_CDATA + " FROM " + CDODBSchema.LOBS; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ public static final String SQL_LOAD_LOB = "SELECT " + CDODBSchema.LOBS_SIZE + ", " + CDODBSchema.LOBS_BDATA + ", " + CDODBSchema.LOBS_CDATA + " FROM " + CDODBSchema.LOBS + " WHERE " + CDODBSchema.LOBS_ID + "=?"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStore.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStore.java index 552923e83f..5db8da2838 100644 --- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStore.java +++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStore.java @@ -75,8 +75,6 @@ public class DBStore extends LongIDStore implements IDBStore, CDOAllRevisionsPro private static final String PROP_LAST_CDOID = "org.eclipse.emf.cdo.server.db.lastCDOID"; //$NON-NLS-1$ - private static final String PROP_LAST_METAID = "org.eclipse.emf.cdo.server.db.lastMetaID"; //$NON-NLS-1$ - private static final String PROP_LAST_BRANCHID = "org.eclipse.emf.cdo.server.db.lastBranchID"; //$NON-NLS-1$ private static final String PROP_LAST_LOCAL_BRANCHID = "org.eclipse.emf.cdo.server.db.lastLocalBranchID"; //$NON-NLS-1$ @@ -487,12 +485,6 @@ public class DBStore extends LongIDStore implements IDBStore, CDOAllRevisionsPro connection.commit(); } - dbSchema = createSchema(); - metaDataManager = new MetaDataManager(this); - LifecycleUtil.activate(metaDataManager); - - LifecycleUtil.activate(mappingStrategy); - createdTables = CDODBSchema.INSTANCE.create(dbAdapter, connection); connection.commit(); } @@ -501,6 +493,17 @@ public class DBStore extends LongIDStore implements IDBStore, CDOAllRevisionsPro DBUtil.close(connection); } + dbSchema = createSchema(); + + externalReferenceManager = createExternalReferenceManager(); + externalReferenceManager.setStore(this); + LifecycleUtil.activate(externalReferenceManager); + + metaDataManager = new MetaDataManager(this); + LifecycleUtil.activate(metaDataManager); + + LifecycleUtil.activate(mappingStrategy); + if (isFirstStart(createdTables)) { firstStart(); @@ -509,10 +512,6 @@ public class DBStore extends LongIDStore implements IDBStore, CDOAllRevisionsPro { reStart(); } - - externalReferenceManager = createExternalReferenceManager(); - externalReferenceManager.setStore(this); - LifecycleUtil.activate(externalReferenceManager); } @Override @@ -527,7 +526,6 @@ public class DBStore extends LongIDStore implements IDBStore, CDOAllRevisionsPro map.put(PROP_REPOSITORY_STOPPED, Long.toString(getRepository().getTimeStamp())); map.put(PROP_NEXT_LOCAL_CDOID, Long.toString(getNextLocalObjectID())); map.put(PROP_LAST_CDOID, Long.toString(getLastObjectID())); - map.put(PROP_LAST_METAID, Long.toString(getLastMetaID())); map.put(PROP_LAST_BRANCHID, Integer.toString(getLastBranchID())); map.put(PROP_LAST_LOCAL_BRANCHID, Integer.toString(getLastLocalBranchID())); map.put(PROP_LAST_COMMITTIME, Long.toString(getLastCommitTime())); @@ -579,7 +577,6 @@ public class DBStore extends LongIDStore implements IDBStore, CDOAllRevisionsPro names.clear(); names.add(PROP_NEXT_LOCAL_CDOID); names.add(PROP_LAST_CDOID); - names.add(PROP_LAST_METAID); names.add(PROP_LAST_BRANCHID); names.add(PROP_LAST_LOCAL_BRANCHID); names.add(PROP_LAST_COMMITTIME); @@ -588,7 +585,6 @@ public class DBStore extends LongIDStore implements IDBStore, CDOAllRevisionsPro setNextLocalObjectID(Long.valueOf(map.get(PROP_NEXT_LOCAL_CDOID))); setLastObjectID(Long.valueOf(map.get(PROP_LAST_CDOID))); - setLastMetaID(Long.valueOf(map.get(PROP_LAST_METAID))); setLastBranchID(Integer.valueOf(map.get(PROP_LAST_BRANCHID))); setLastLocalBranchID(Integer.valueOf(map.get(PROP_LAST_LOCAL_BRANCHID))); setLastCommitTime(Long.valueOf(map.get(PROP_LAST_COMMITTIME))); @@ -608,9 +604,6 @@ public class DBStore extends LongIDStore implements IDBStore, CDOAllRevisionsPro setNextLocalObjectID(result[0]); setLastObjectID(result[1]); - long lastMetaID = DBUtil.selectMaximumLong(connection, CDODBSchema.PACKAGE_INFOS_META_UB); - setLastMetaID(lastMetaID); - int branchID = DBUtil.selectMaximumInt(connection, CDODBSchema.BRANCHES_ID); setLastBranchID(branchID > 0 ? branchID : 0); @@ -624,7 +617,9 @@ public class DBStore extends LongIDStore implements IDBStore, CDOAllRevisionsPro CDOBranch.MAIN_BRANCH_ID + "<=" + CDODBSchema.COMMIT_INFOS_BRANCH); setLastNonLocalCommitTime(lastNonLocalCommitTime); - OM.LOG.info(MessageFormat.format(Messages.getString("DBStore.10"), getLastObjectID(), getLastMetaID())); //$NON-NLS-1$ + OM.LOG + .info(MessageFormat.format( + Messages.getString("DBStore.10"), getLastObjectID(), getNextLocalObjectID(), getLastBranchID(), getLastCommitTime(), getLastNonLocalCommitTime())); //$NON-NLS-1$ } catch (SQLException e) { diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java index 9d425f47f3..dcc9052a5e 100644 --- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java +++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/DBStoreAccessor.java @@ -705,6 +705,8 @@ public class DBStoreAccessor extends LongIDStoreAccessor implements IDBStoreAcce @Override protected final void rollback(IStoreAccessor.CommitContext commitContext) { + getStore().getMetaDataManager().clearMetaIDMappings(); + if (TRACER.isEnabled()) { TRACER.format("--- DB ROLLBACK ---"); //$NON-NLS-1$ diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/ExternalReferenceManager.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/ExternalReferenceManager.java index d88492f8aa..c519471363 100644 --- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/ExternalReferenceManager.java +++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/ExternalReferenceManager.java @@ -68,18 +68,27 @@ public class ExternalReferenceManager extends Lifecycle implements IExternalRefe public long mapExternalReference(IDBStoreAccessor accessor, CDOIDExternal id, long commitTime) { - String uri = id.getURI(); + return mapURI(accessor, id.getURI(), commitTime); + } + + public CDOIDExternal unmapExternalReference(IDBStoreAccessor accessor, long mappedId) + { + return CDOIDUtil.createExternal(unmapURI(accessor, mappedId)); + } + + public long mapURI(IDBStoreAccessor accessor, String uri, long commitTime) + { long result = lookupByID(accessor, uri); if (result < DBStore.NULL) { // mapping found return result; } - + return insertNew(accessor, uri, commitTime); } - public CDOIDExternal unmapExternalReference(IDBStoreAccessor accessor, long mappedId) + public String unmapURI(IDBStoreAccessor accessor, long mappedId) { PreparedStatement stmt = null; ResultSet rs = null; @@ -97,7 +106,7 @@ public class ExternalReferenceManager extends Lifecycle implements IExternalRefe } String uri = rs.getString(1); - return CDOIDUtil.createExternal(uri); + return uri; } catch (SQLException e) { diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/MetaDataManager.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/MetaDataManager.java index 15532ce94c..d577a6d7eb 100644 --- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/MetaDataManager.java +++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/MetaDataManager.java @@ -13,17 +13,15 @@ */ package org.eclipse.emf.cdo.server.internal.db; -import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.id.CDOIDMeta; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; -import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.model.CDOModelUtil; -import org.eclipse.emf.cdo.common.model.CDOPackageRegistry; import org.eclipse.emf.cdo.common.model.CDOPackageUnit; import org.eclipse.emf.cdo.common.model.EMFUtil; import org.eclipse.emf.cdo.common.protocol.CDODataInput; import org.eclipse.emf.cdo.common.protocol.CDODataOutput; import org.eclipse.emf.cdo.server.db.IDBStore; +import org.eclipse.emf.cdo.server.db.IDBStoreAccessor; +import org.eclipse.emf.cdo.server.db.IExternalReferenceManager; +import org.eclipse.emf.cdo.server.db.IExternalReferenceManager.Internal; import org.eclipse.emf.cdo.server.db.IMetaDataManager; import org.eclipse.emf.cdo.server.internal.db.bundle.OM; import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageInfo; @@ -39,10 +37,12 @@ import org.eclipse.net4j.util.om.monitor.OMMonitor; import org.eclipse.net4j.util.om.monitor.OMMonitor.Async; import org.eclipse.net4j.util.om.trace.ContextTracer; +import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EModelElement; import org.eclipse.emf.ecore.EPackage; -import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; +import org.eclipse.emf.ecore.util.EcoreUtil; import java.io.IOException; import java.sql.Connection; @@ -66,22 +66,53 @@ public class MetaDataManager extends Lifecycle implements IMetaDataManager private IDBStore store; + private Map<EModelElement, Long> modelElementToMetaID = new HashMap<EModelElement, Long>(); + + private Map<Long, EModelElement> metaIDToModelElement = new HashMap<Long, EModelElement>(); + public MetaDataManager(IDBStore store) { this.store = store; } - public long getMetaID(EModelElement modelElement) + public synchronized long getMetaID(IDBStoreAccessor accessor, EModelElement modelElement, long commitTime) { - CDOID cdoid = getPackageRegistry().getMetaInstanceMapper().lookupMetaInstanceID((InternalEObject)modelElement); - return CDOIDUtil.getLong(cdoid); + Long metaID = modelElementToMetaID.get(modelElement); + if (metaID != null) + { + return metaID; + } + + IExternalReferenceManager.Internal manager = (Internal)getStore().getExternalReferenceManager(); + String uri = EcoreUtil.getURI(modelElement).toString(); + + metaID = manager.mapURI(accessor, uri, commitTime); + cacheMetaIDMapping(modelElement, metaID); + + return metaID; } - public EModelElement getMetaInstance(long id) + public synchronized EModelElement getMetaInstance(IDBStoreAccessor accessor, long id) { - CDOIDMeta cdoid = CDOIDUtil.createMeta(id); - InternalEObject metaInstance = getPackageRegistry().getMetaInstanceMapper().lookupMetaInstance(cdoid); - return (EModelElement)metaInstance; + EModelElement modelElement = metaIDToModelElement.get(id); + if (modelElement != null) + { + return modelElement; + } + + IExternalReferenceManager.Internal externalManager = (Internal)getStore().getExternalReferenceManager(); + String uri = externalManager.unmapURI(accessor, id); + + ResourceSet resourceSet = new ResourceSetImpl(); + resourceSet.setPackageRegistry(getStore().getRepository().getPackageRegistry()); + + return (EModelElement)resourceSet.getEObject(URI.createURI(uri), true); + } + + public synchronized void clearMetaIDMappings() + { + modelElementToMetaID.clear(); + metaIDToModelElement.clear(); } public final EPackage[] loadPackageUnit(Connection connection, InternalCDOPackageUnit packageUnit) @@ -152,7 +183,14 @@ public class MetaDataManager extends Lifecycle implements IMetaDataManager @Override protected void doBeforeActivate() throws Exception { - checkState(store != null, "Store is not set"); //$NON-NLS-1$ + checkState(store, "Store is not set"); //$NON-NLS-1$ + } + + @Override + protected void doDeactivate() throws Exception + { + clearMetaIDMappings(); + super.doDeactivate(); } protected InternalCDOPackageInfo createPackageInfo() @@ -179,8 +217,7 @@ public class MetaDataManager extends Lifecycle implements IMetaDataManager private byte[] getEPackageBytes(InternalCDOPackageUnit packageUnit) { EPackage ePackage = packageUnit.getTopLevelPackageInfo().getEPackage(); - CDOPackageRegistry packageRegistry = getStore().getRepository().getPackageRegistry(); - return EMFUtil.getEPackageBytes(ePackage, ZIP_PACKAGE_BYTES, packageRegistry); + return EMFUtil.getEPackageBytes(ePackage, ZIP_PACKAGE_BYTES, getPackageRegistry()); } private void fillSystemTables(Connection connection, InternalCDOPackageUnit packageUnit, OMMonitor monitor) @@ -269,11 +306,8 @@ public class MetaDataManager extends Lifecycle implements IMetaDataManager String packageURI = packageInfo.getPackageURI(); String parentURI = packageInfo.getParentURI(); String unitID = packageInfo.getPackageUnit().getID(); - CDOIDMetaRange metaIDRange = packageInfo.getMetaIDRange(); - long metaLB = metaIDRange == null ? 0L : ((CDOIDMeta)metaIDRange.getLowerBound()).getLongValue(); - long metaUB = metaIDRange == null ? 0L : ((CDOIDMeta)metaIDRange.getUpperBound()).getLongValue(); - String sql = "INSERT INTO " + CDODBSchema.PACKAGE_INFOS + " VALUES (?, ?, ?, ?, ?)"; //$NON-NLS-1$ //$NON-NLS-2$ + String sql = "INSERT INTO " + CDODBSchema.PACKAGE_INFOS + " VALUES (?, ?, ?)"; //$NON-NLS-1$ //$NON-NLS-2$ DBUtil.trace(sql); PreparedStatement pstmt = null; Async async = monitor.forkAsync(); @@ -284,8 +318,6 @@ public class MetaDataManager extends Lifecycle implements IMetaDataManager pstmt.setString(1, packageURI); pstmt.setString(2, parentURI); pstmt.setString(3, unitID); - pstmt.setLong(4, metaLB); - pstmt.setLong(5, metaUB); if (pstmt.execute()) { @@ -344,15 +376,9 @@ public class MetaDataManager extends Lifecycle implements IMetaDataManager { public boolean handle(int row, final Object... values) { - long metaLB = (Long)values[3]; - long metaUB = (Long)values[4]; - CDOIDMetaRange metaIDRange = metaLB == 0 ? null : CDOIDUtil.createMetaRange(CDOIDUtil.createMeta(metaLB), - (int)(metaUB - metaLB) + 1); - InternalCDOPackageInfo packageInfo = createPackageInfo(); packageInfo.setPackageURI((String)values[1]); packageInfo.setParentURI((String)values[2]); - packageInfo.setMetaIDRange(metaIDRange); String unit = (String)values[0]; List<InternalCDOPackageInfo> list = packageInfos.get(unit); @@ -373,7 +399,7 @@ public class MetaDataManager extends Lifecycle implements IMetaDataManager try { DBUtil.select(connection, infoRowHandler, CDODBSchema.PACKAGE_INFOS_UNIT, CDODBSchema.PACKAGE_INFOS_URI, - CDODBSchema.PACKAGE_INFOS_PARENT, CDODBSchema.PACKAGE_INFOS_META_LB, CDODBSchema.PACKAGE_INFOS_META_UB); + CDODBSchema.PACKAGE_INFOS_PARENT); } finally { @@ -393,4 +419,10 @@ public class MetaDataManager extends Lifecycle implements IMetaDataManager return packageUnits.values(); } + + private void cacheMetaIDMapping(EModelElement modelElement, Long metaID) + { + modelElementToMetaID.put(modelElement, metaID); + metaIDToModelElement.put(metaID, modelElement); + } } diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/AbstractMappingStrategy.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/AbstractMappingStrategy.java index c890bde45e..d10093802a 100644 --- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/AbstractMappingStrategy.java +++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/AbstractMappingStrategy.java @@ -45,6 +45,8 @@ import org.eclipse.net4j.util.ImplementationError; import org.eclipse.net4j.util.StringUtil; import org.eclipse.net4j.util.collection.CloseableIterator; import org.eclipse.net4j.util.lifecycle.Lifecycle; +import org.eclipse.net4j.util.lifecycle.LifecycleUtil; +import org.eclipse.net4j.util.om.monitor.Monitor; import org.eclipse.net4j.util.om.monitor.OMMonitor; import org.eclipse.net4j.util.om.monitor.OMMonitor.Async; @@ -316,7 +318,7 @@ public abstract class AbstractMappingStrategy extends Lifecycle implements IMapp prefix += NAME_SEPARATOR; } - return getName(prefix + name, typePrefix + getMetaDataManager().getMetaID(element), getMaxTableNameLength()); + return getName(prefix + name, typePrefix + getUniqueID(element), getMaxTableNameLength()); } public String getTableName(EClass eClass, EStructuralFeature feature) @@ -337,8 +339,7 @@ public abstract class AbstractMappingStrategy extends Lifecycle implements IMapp prefix += NAME_SEPARATOR; } - return getName(prefix + name, TYPE_PREFIX_FEATURE + getMetaDataManager().getMetaID(feature), - getMaxTableNameLength()); + return getName(prefix + name, TYPE_PREFIX_FEATURE + getUniqueID(feature), getMaxTableNameLength()); } public String getFieldName(EStructuralFeature feature) @@ -346,8 +347,7 @@ public abstract class AbstractMappingStrategy extends Lifecycle implements IMapp String name = DBAnnotation.COLUMN_NAME.getValue(feature); if (name == null) { - name = getName(feature.getName(), TYPE_PREFIX_FEATURE + getMetaDataManager().getMetaID(feature), - getMaxFieldNameLength()); + name = getName(feature.getName(), TYPE_PREFIX_FEATURE + getUniqueID(feature), getMaxFieldNameLength()); } return name; @@ -361,7 +361,7 @@ public abstract class AbstractMappingStrategy extends Lifecycle implements IMapp return CDO_SET_PREFIX + name; } - return getName(CDO_SET_PREFIX + feature.getName(), TYPE_PREFIX_FEATURE + getMetaDataManager().getMetaID(feature), + return getName(CDO_SET_PREFIX + feature.getName(), TYPE_PREFIX_FEATURE + getUniqueID(feature), getMaxFieldNameLength()); } @@ -388,6 +388,30 @@ public abstract class AbstractMappingStrategy extends Lifecycle implements IMapp return name; } + private long getUniqueID(ENamedElement element) + { + // TODO: replace with a better logic. For now, we fall back to the + // element IDs... + + IDBStoreAccessor accessor = getStore().getWriter(null); + + try + { + long result = getMetaDataManager().getMetaID(accessor, element, System.currentTimeMillis()); + accessor.commit(new Monitor()); + return Math.abs(result); + } + catch (Throwable t) + { + accessor.rollback(); + throw new DBException(t); + } + finally + { + LifecycleUtil.deactivate(accessor); // do not let the null-accessor go into the pool! + } + } + // -- factories for mapping of classes, values, lists ------------------ public void createMapping(Connection connection, InternalCDOPackageUnit[] packageUnits, OMMonitor monitor) diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AbstractFeatureMapTableMapping.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AbstractFeatureMapTableMapping.java index a2961d8c2c..c2c556c472 100644 --- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AbstractFeatureMapTableMapping.java +++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AbstractFeatureMapTableMapping.java @@ -299,14 +299,14 @@ public abstract class AbstractFeatureMapTableMapping extends BasicAbstractListTa while ((listChunk == CDORevision.UNCHUNKED || --listChunk >= 0) && resultSet.next()) { Long tag = resultSet.getLong(1); - Object value = getTypeMapping(tag).readValue(resultSet); + Object value = getTypeMapping(accessor, tag).readValue(resultSet); if (TRACER.isEnabled()) { TRACER.format("Read value for index {0} from result set: {1}", list.size(), value); } - list.set(currentIndex++, CDORevisionUtil.createFeatureMapEntry(getFeatureByTag(tag), value)); + list.set(currentIndex++, CDORevisionUtil.createFeatureMapEntry(getFeatureByTag(accessor, tag), value)); } } catch (SQLException ex) @@ -326,9 +326,9 @@ public abstract class AbstractFeatureMapTableMapping extends BasicAbstractListTa } } - private void addFeature(Long tag) + private void addFeature(IDBStoreAccessor accessor, long tag) { - EStructuralFeature modelFeature = getFeatureByTag(tag); + EStructuralFeature modelFeature = getFeatureByTag(accessor, tag); ITypeMapping typeMapping = getMappingStrategy().createValueMapping(modelFeature); String column = CDODBSchema.FEATUREMAP_VALUE + "_" + typeMapping.getDBType(); @@ -375,7 +375,7 @@ public abstract class AbstractFeatureMapTableMapping extends BasicAbstractListTa while (resultSet.next()) { Long tag = resultSet.getLong(1); - Object value = getTypeMapping(tag).readValue(resultSet); + Object value = getTypeMapping(chunkReader.getAccessor(), tag).readValue(resultSet); if (chunk == null) { @@ -394,7 +394,8 @@ public abstract class AbstractFeatureMapTableMapping extends BasicAbstractListTa TRACER.format("Read value for chunk index {0} from result set: {1}", indexInChunk, value); } - chunk.add(indexInChunk++, CDORevisionUtil.createFeatureMapEntry(getFeatureByTag(tag), value)); + chunk.add(indexInChunk++, + CDORevisionUtil.createFeatureMapEntry(getFeatureByTag(chunkReader.getAccessor(), tag), value)); if (indexInChunk == chunkSize) { if (TRACER.isEnabled()) @@ -409,8 +410,8 @@ public abstract class AbstractFeatureMapTableMapping extends BasicAbstractListTa if (TRACER.isEnabled()) { - TRACER.format("Reading list chunk values done for feature {0}.{1} of {2}v{3}", getContainingClass().getName(), - getTagByFeature(getFeature()), chunkReader.getRevision().getID(), chunkReader.getRevision().getVersion()); + TRACER.format("Reading list chunk values done for feature {0}.{1} of {2}", getContainingClass().getName(), + getFeature(), chunkReader.getRevision()); } } catch (SQLException ex) @@ -444,15 +445,15 @@ public abstract class AbstractFeatureMapTableMapping extends BasicAbstractListTa { TRACER .format( - "Writing value for feature {0}.{1} index {2} of {3}v{4} : {5}", getContainingClass().getName(), getTagByFeature(getFeature()), idx, revision.getID(), revision.getVersion(), value); //$NON-NLS-1$ + "Writing value for feature {0}.{1} index {2} of {3} : {4}", getContainingClass().getName(), getFeature(), idx, revision, value); //$NON-NLS-1$ } try { FeatureMap.Entry entry = (FeatureMap.Entry)value; EStructuralFeature entryFeature = entry.getEStructuralFeature(); - Long tag = getTagByFeature(entryFeature); - String column = getColumnName(tag); + Long tag = getTagByFeature(accessor, entryFeature, revision.getTimeStamp()); + String column = getColumnName(accessor, tag); String sql = sqlInsert; stmt = statementCache.getPreparedStatement(sql, ReuseProbability.HIGH); @@ -463,7 +464,7 @@ public abstract class AbstractFeatureMapTableMapping extends BasicAbstractListTa { if (columnNames.get(i).equals(column)) { - getTypeMapping(tag).setValue(stmt, stmtIndex++, entry.getValue()); + getTypeMapping(accessor, tag).setValue(stmt, stmtIndex++, entry.getValue()); } else { @@ -492,12 +493,12 @@ public abstract class AbstractFeatureMapTableMapping extends BasicAbstractListTa * The feature's MetaID in CDO * @return the column name where the values are stored */ - protected String getColumnName(Long tag) + protected String getColumnName(IDBStoreAccessor accessor, Long tag) { String column = tagMap.get(tag); if (column == null) { - addFeature(tag); + addFeature(accessor, tag); column = tagMap.get(tag); } @@ -511,12 +512,12 @@ public abstract class AbstractFeatureMapTableMapping extends BasicAbstractListTa * The feature's MetaID in CDO * @return the corresponding type mapping */ - protected ITypeMapping getTypeMapping(Long tag) + protected ITypeMapping getTypeMapping(IDBStoreAccessor accessor, Long tag) { ITypeMapping typeMapping = typeMappings.get(tag); if (typeMapping == null) { - addFeature(tag); + addFeature(accessor, tag); typeMapping = typeMappings.get(tag); } @@ -527,9 +528,9 @@ public abstract class AbstractFeatureMapTableMapping extends BasicAbstractListTa * @param metaID * @return the column name where the values are stored */ - private EStructuralFeature getFeatureByTag(Long tag) + private EStructuralFeature getFeatureByTag(IDBStoreAccessor accessor, long tag) { - return (EStructuralFeature)getMappingStrategy().getStore().getMetaDataManager().getMetaInstance(tag); + return (EStructuralFeature)getMappingStrategy().getStore().getMetaDataManager().getMetaInstance(accessor, tag); } /** @@ -537,9 +538,9 @@ public abstract class AbstractFeatureMapTableMapping extends BasicAbstractListTa * The EStructuralFeature * @return The feature's MetaID in CDO */ - protected Long getTagByFeature(EStructuralFeature feature) + protected Long getTagByFeature(IDBStoreAccessor accessor, EStructuralFeature feature, long timeStamp) { - return getMappingStrategy().getStore().getMetaDataManager().getMetaID(feature); + return getMappingStrategy().getStore().getMetaDataManager().getMetaID(accessor, feature, timeStamp); } /** diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AbstractHorizontalClassMapping.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AbstractHorizontalClassMapping.java index a10fadd826..ec1c15b849 100644 --- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AbstractHorizontalClassMapping.java +++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AbstractHorizontalClassMapping.java @@ -119,7 +119,6 @@ public abstract class AbstractHorizontalClassMapping implements IClassMapping IDBField branchField = addBranchingField(table); - table.addField(CDODBSchema.ATTRIBUTES_CLASS, DBType.BIGINT, true); table.addField(CDODBSchema.ATTRIBUTES_CREATED, DBType.BIGINT, true); IDBField revisedField = table.addField(CDODBSchema.ATTRIBUTES_REVISED, DBType.BIGINT, true); table.addField(CDODBSchema.ATTRIBUTES_RESOURCE, DBType.BIGINT, true); diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AuditFeatureMapTableMappingWithRanges.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AuditFeatureMapTableMappingWithRanges.java index a8f8ada17f..8583c3c78a 100644 --- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AuditFeatureMapTableMappingWithRanges.java +++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/AuditFeatureMapTableMappingWithRanges.java @@ -424,14 +424,14 @@ public class AuditFeatureMapTableMappingWithRanges extends BasicAbstractListTabl while ((listChunk == CDORevision.UNCHUNKED || --listChunk >= 0) && resultSet.next()) { Long tag = resultSet.getLong(1); - Object value = getTypeMapping(tag).readValue(resultSet); + Object value = getTypeMapping(accessor, tag).readValue(resultSet); if (TRACER.isEnabled()) { TRACER.format("Read value for index {0} from result set: {1}", list.size(), value); //$NON-NLS-1$ } - list.set(currentIndex++, CDORevisionUtil.createFeatureMapEntry(getFeatureByTag(tag), value)); + list.set(currentIndex++, CDORevisionUtil.createFeatureMapEntry(getFeatureByTag(accessor, tag), value)); } } catch (SQLException ex) @@ -451,9 +451,9 @@ public class AuditFeatureMapTableMappingWithRanges extends BasicAbstractListTabl } } - private void addFeature(Long tag) + private void addFeature(IDBStoreAccessor accessor, Long tag) { - EStructuralFeature modelFeature = getFeatureByTag(tag); + EStructuralFeature modelFeature = getFeatureByTag(accessor, tag); ITypeMapping typeMapping = getMappingStrategy().createValueMapping(modelFeature); String column = CDODBSchema.FEATUREMAP_VALUE + "_" + typeMapping.getDBType(); //$NON-NLS-1$ @@ -502,7 +502,7 @@ public class AuditFeatureMapTableMappingWithRanges extends BasicAbstractListTabl while (resultSet.next()) { Long tag = resultSet.getLong(1); - Object value = getTypeMapping(tag).readValue(resultSet); + Object value = getTypeMapping(chunkReader.getAccessor(), tag).readValue(resultSet); if (chunk == null) { @@ -521,7 +521,8 @@ public class AuditFeatureMapTableMappingWithRanges extends BasicAbstractListTabl TRACER.format("Read value for chunk index {0} from result set: {1}", indexInChunk, value); //$NON-NLS-1$ } - chunk.add(indexInChunk++, CDORevisionUtil.createFeatureMapEntry(getFeatureByTag(tag), value)); + chunk.add(indexInChunk++, + CDORevisionUtil.createFeatureMapEntry(getFeatureByTag(chunkReader.getAccessor(), tag), value)); if (indexInChunk == chunkSize) { if (TRACER.isEnabled()) @@ -536,8 +537,8 @@ public class AuditFeatureMapTableMappingWithRanges extends BasicAbstractListTabl if (TRACER.isEnabled()) { - TRACER.format("Reading list chunk values done for feature {0}.{1} of {2}v{3}", getContainingClass().getName(), //$NON-NLS-1$ - getTagByFeature(getFeature()), chunkReader.getRevision().getID(), chunkReader.getRevision().getVersion()); + TRACER.format("Reading list chunk values done for feature {0}.{1} of {2}", getContainingClass().getName(), //$NON-NLS-1$ + getFeature(), chunkReader.getRevision()); } } catch (SQLException ex) @@ -573,10 +574,10 @@ public class AuditFeatureMapTableMappingWithRanges extends BasicAbstractListTabl { TRACER .format( - "Writing value for feature {0}.{1} index {2} of {3}v{4} : {5}", getContainingClass().getName(), getTagByFeature(getFeature()), idx, revision.getID(), revision.getVersion(), value); //$NON-NLS-1$ + "Writing value for feature {0}.{1} index {2} of {3} : {4}", getContainingClass().getName(), getFeature(), idx, revision, value); //$NON-NLS-1$ } - addEntry(accessor, revision.getID(), revision.getVersion(), idx, value); + addEntry(accessor, revision.getID(), revision.getVersion(), idx, value, revision.getTimeStamp()); } /** @@ -586,12 +587,12 @@ public class AuditFeatureMapTableMappingWithRanges extends BasicAbstractListTabl * The feature's MetaID in CDO * @return the column name where the values are stored */ - protected String getColumnName(Long tag) + protected String getColumnName(IDBStoreAccessor accessor, Long tag) { String column = tagMap.get(tag); if (column == null) { - addFeature(tag); + addFeature(accessor, tag); column = tagMap.get(tag); } @@ -605,12 +606,12 @@ public class AuditFeatureMapTableMappingWithRanges extends BasicAbstractListTabl * The feature's MetaID in CDO * @return the corresponding type mapping */ - protected ITypeMapping getTypeMapping(Long tag) + protected ITypeMapping getTypeMapping(IDBStoreAccessor accessor, Long tag) { ITypeMapping typeMapping = typeMappings.get(tag); if (typeMapping == null) { - addFeature(tag); + addFeature(accessor, tag); typeMapping = typeMappings.get(tag); } @@ -621,9 +622,9 @@ public class AuditFeatureMapTableMappingWithRanges extends BasicAbstractListTabl * @param metaID * @return the column name where the values are stored */ - private EStructuralFeature getFeatureByTag(Long tag) + private EStructuralFeature getFeatureByTag(IDBStoreAccessor accessor, Long tag) { - return (EStructuralFeature)getMappingStrategy().getStore().getMetaDataManager().getMetaInstance(tag); + return (EStructuralFeature)getMappingStrategy().getStore().getMetaDataManager().getMetaInstance(accessor, tag); } /** @@ -631,9 +632,9 @@ public class AuditFeatureMapTableMappingWithRanges extends BasicAbstractListTabl * The EStructuralFeature * @return The feature's MetaID in CDO */ - protected Long getTagByFeature(EStructuralFeature feature) + protected Long getTagByFeature(IDBStoreAccessor accessor, EStructuralFeature feature, long timestamp) { - return getMappingStrategy().getStore().getMetaDataManager().getMetaID(feature); + return getMappingStrategy().getStore().getMetaDataManager().getMetaID(accessor, feature, timestamp); } /** @@ -718,7 +719,7 @@ public class AuditFeatureMapTableMappingWithRanges extends BasicAbstractListTabl } // let the visitor collect the changes - ListDeltaVisitor visitor = new ListDeltaVisitor(accessor, originalRevision, oldVersion, newVersion); + ListDeltaVisitor visitor = new ListDeltaVisitor(accessor, originalRevision, oldVersion, newVersion, created); if (TRACER.isEnabled()) { @@ -745,8 +746,10 @@ public class AuditFeatureMapTableMappingWithRanges extends BasicAbstractListTabl private int lastIndex; + private long timestamp; + public ListDeltaVisitor(IDBStoreAccessor accessor, InternalCDORevision originalRevision, int oldVersion, - int newVersion) + int newVersion, long timestamp) { this.accessor = accessor; this.originalRevision = originalRevision; @@ -754,6 +757,7 @@ public class AuditFeatureMapTableMappingWithRanges extends BasicAbstractListTabl this.oldVersion = oldVersion; this.newVersion = newVersion; lastIndex = originalRevision.getList(getFeature()).size() - 1; + this.timestamp = timestamp; } public void visit(CDOMoveFeatureDelta delta) @@ -782,7 +786,7 @@ public class AuditFeatureMapTableMappingWithRanges extends BasicAbstractListTabl } // create the item - addEntry(accessor, id, newVersion, toIdx, value); + addEntry(accessor, id, newVersion, toIdx, value, timestamp); } public void visit(CDOAddFeatureDelta delta) @@ -802,7 +806,7 @@ public class AuditFeatureMapTableMappingWithRanges extends BasicAbstractListTabl } // create the item - addEntry(accessor, id, newVersion, startIndex, delta.getValue()); + addEntry(accessor, id, newVersion, startIndex, delta.getValue(), timestamp); ++lastIndex; } @@ -839,7 +843,7 @@ public class AuditFeatureMapTableMappingWithRanges extends BasicAbstractListTabl removeEntry(accessor, id, oldVersion, newVersion, index); // create the item - addEntry(accessor, id, newVersion, index, delta.getValue()); + addEntry(accessor, id, newVersion, index, delta.getValue(), timestamp); } public void visit(CDOUnsetFeatureDelta delta) @@ -918,7 +922,7 @@ public class AuditFeatureMapTableMappingWithRanges extends BasicAbstractListTabl TRACER.format("moveOneUp add: {0}", index - 1); //$NON-NLS-1$ } - addEntry(accessor, id, newVersion, index - 1, value); + addEntry(accessor, id, newVersion, index - 1, value, timestamp); break; case 1: @@ -987,7 +991,7 @@ public class AuditFeatureMapTableMappingWithRanges extends BasicAbstractListTabl TRACER.format("moveOneDown add: {0}", index + 1); //$NON-NLS-1$ } - addEntry(accessor, id, newVersion, index + 1, value); + addEntry(accessor, id, newVersion, index + 1, value, timestamp); break; case 1: @@ -1019,7 +1023,7 @@ public class AuditFeatureMapTableMappingWithRanges extends BasicAbstractListTabl } } - private void addEntry(IDBStoreAccessor accessor, CDOID id, int version, int index, Object value) + private void addEntry(IDBStoreAccessor accessor, CDOID id, int version, int index, Object value, long timestamp) { IPreparedStatementCache statementCache = accessor.getStatementCache(); PreparedStatement pstmt = null; @@ -1034,8 +1038,8 @@ public class AuditFeatureMapTableMappingWithRanges extends BasicAbstractListTabl { FeatureMap.Entry entry = (FeatureMap.Entry)value; EStructuralFeature entryFeature = entry.getEStructuralFeature(); - Long tag = getTagByFeature(entryFeature); - String column = getColumnName(tag); + Long tag = getTagByFeature(accessor, entryFeature, timestamp); + String column = getColumnName(accessor, tag); pstmt = statementCache.getPreparedStatement(sqlInsert, ReuseProbability.HIGH); @@ -1048,7 +1052,7 @@ public class AuditFeatureMapTableMappingWithRanges extends BasicAbstractListTabl { if (columnNames.get(i).equals(column)) { - getTypeMapping(tag).setValue(pstmt, stmtIndex++, entry.getValue()); + getTypeMapping(accessor, tag).setValue(pstmt, stmtIndex++, entry.getValue()); } else { @@ -1172,8 +1176,8 @@ public class AuditFeatureMapTableMappingWithRanges extends BasicAbstractListTabl } Long tag = resultSet.getLong(1); - Object value = getTypeMapping(tag).readValue(resultSet); - result = CDORevisionUtil.createFeatureMapEntry(getFeatureByTag(tag), value); + Object value = getTypeMapping(accessor, tag).readValue(resultSet); + result = CDORevisionUtil.createFeatureMapEntry(getFeatureByTag(accessor, tag), value); if (TRACER.isEnabled()) { diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/BranchingFeatureMapTableMappingWithRanges.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/BranchingFeatureMapTableMappingWithRanges.java index 57076ca100..0fe1abbc87 100644 --- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/BranchingFeatureMapTableMappingWithRanges.java +++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/BranchingFeatureMapTableMappingWithRanges.java @@ -1,1479 +1,1489 @@ -/**
- * Copyright (c) 2004 - 2010 Eike Stepper (Berlin, Germany) and others.
- * 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:
- * Stefan Winkler - initial API and implementation taken from AuditFeatureMapTableMappingWithRanges
- * Stefan Winkler - Bug 329025: [DB] Support branching for range-based mapping strategy
- */
-package org.eclipse.emf.cdo.server.internal.db.mapping.horizontal;
-
-import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
-import org.eclipse.emf.cdo.common.id.CDOID;
-import org.eclipse.emf.cdo.common.id.CDOIDUtil;
-import org.eclipse.emf.cdo.common.revision.CDOList;
-import org.eclipse.emf.cdo.common.revision.CDORevision;
-import org.eclipse.emf.cdo.common.revision.CDORevisionUtil;
-import org.eclipse.emf.cdo.common.revision.delta.CDOAddFeatureDelta;
-import org.eclipse.emf.cdo.common.revision.delta.CDOClearFeatureDelta;
-import org.eclipse.emf.cdo.common.revision.delta.CDOContainerFeatureDelta;
-import org.eclipse.emf.cdo.common.revision.delta.CDOFeatureDelta;
-import org.eclipse.emf.cdo.common.revision.delta.CDOFeatureDeltaVisitor;
-import org.eclipse.emf.cdo.common.revision.delta.CDOListFeatureDelta;
-import org.eclipse.emf.cdo.common.revision.delta.CDOMoveFeatureDelta;
-import org.eclipse.emf.cdo.common.revision.delta.CDORemoveFeatureDelta;
-import org.eclipse.emf.cdo.common.revision.delta.CDOSetFeatureDelta;
-import org.eclipse.emf.cdo.common.revision.delta.CDOUnsetFeatureDelta;
-import org.eclipse.emf.cdo.server.IStoreAccessor.QueryXRefsContext;
-import org.eclipse.emf.cdo.server.IStoreChunkReader;
-import org.eclipse.emf.cdo.server.IStoreChunkReader.Chunk;
-import org.eclipse.emf.cdo.server.db.CDODBUtil;
-import org.eclipse.emf.cdo.server.db.IDBStoreAccessor;
-import org.eclipse.emf.cdo.server.db.IDBStoreChunkReader;
-import org.eclipse.emf.cdo.server.db.IPreparedStatementCache;
-import org.eclipse.emf.cdo.server.db.IPreparedStatementCache.ReuseProbability;
-import org.eclipse.emf.cdo.server.db.mapping.IListMappingDeltaSupport;
-import org.eclipse.emf.cdo.server.db.mapping.IMappingStrategy;
-import org.eclipse.emf.cdo.server.db.mapping.ITypeMapping;
-import org.eclipse.emf.cdo.server.internal.db.CDODBSchema;
-import org.eclipse.emf.cdo.server.internal.db.bundle.OM;
-import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
-
-import org.eclipse.net4j.db.DBException;
-import org.eclipse.net4j.db.DBType;
-import org.eclipse.net4j.db.DBUtil;
-import org.eclipse.net4j.db.ddl.IDBField;
-import org.eclipse.net4j.db.ddl.IDBIndex.Type;
-import org.eclipse.net4j.db.ddl.IDBTable;
-import org.eclipse.net4j.util.ImplementationError;
-import org.eclipse.net4j.util.collection.MoveableList;
-import org.eclipse.net4j.util.om.trace.ContextTracer;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.util.FeatureMap;
-
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-/**
- * This is a featuremap-table mapping for audit mode. It is optimized for frequent insert operations at the list's end,
- * which causes just 1 DB row to be changed. This is achieved by introducing a version range (columns
- * {@link CDODBSchema#LIST_REVISION_VERSION_ADDED cdo_version_added} and
- * {@link CDODBSchema#LIST_REVISION_VERSION_REMOVED cdo_version_removed}) which records for which revisions a particular
- * entry existed. Also, this mapping is mainly optimized for potentially very large lists: the need for having the
- * complete list stored in memory to do in-the-middle-moved and inserts is traded in for a few more DB access
- * operations.
- *
- * @author Eike Stepper
- * @author Stefan Winkler
- * @author Lothar Werzinger
- * @since 3.0
- */
-public class BranchingFeatureMapTableMappingWithRanges extends BasicAbstractListTableMapping implements
- IListMappingDeltaSupport
-{
- private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG,
- BranchingFeatureMapTableMappingWithRanges.class);
-
- /**
- * Used to clean up lists for detached objects.
- */
- private static final int FINAL_VERSION = Integer.MAX_VALUE;
-
- /**
- * The table of this mapping.
- */
- private IDBTable table;
-
- /**
- * The tags mapped to column names
- */
- private HashMap<Long, String> tagMap;
-
- /**
- * Column name Set
- */
- private List<String> columnNames;
-
- /**
- * The type mappings for the value fields.
- */
- private Map<Long, ITypeMapping> typeMappings;
-
- // --------- SQL strings - see initSQLStrings() -----------------
- private String sqlSelectChunksPrefix;
-
- private String sqlOrderByIndex;
-
- protected String sqlInsert;
-
- private List<DBType> dbTypes;
-
- private String sqlRemoveEntry;
-
- private String sqlDeleteEntry;
-
- private String sqlUpdateIndex;
-
- private String sqlGetValue;
-
- private String sqlClearList;
-
- public BranchingFeatureMapTableMappingWithRanges(IMappingStrategy mappingStrategy, EClass eClass,
- EStructuralFeature feature)
- {
- super(mappingStrategy, eClass, feature);
- initDBTypes();
- initTable();
- initSQLStrings();
- }
-
- private void initDBTypes()
- {
- // TODO add annotation processing here ...
- ITypeMapping.Registry registry = ITypeMapping.Registry.INSTANCE;
- dbTypes = new ArrayList<DBType>(registry.getDefaultFeatureMapDBTypes());
- }
-
- private void initTable()
- {
- String tableName = getMappingStrategy().getTableName(getContainingClass(), getFeature());
- table = getMappingStrategy().getStore().getDBSchema().addTable(tableName);
-
- // add fields for CDOID
- IDBField idField = table.addField(CDODBSchema.FEATUREMAP_REVISION_ID, DBType.INTEGER);
-
- IDBField branchField = table.addField(CDODBSchema.LIST_REVISION_BRANCH, DBType.INTEGER);
-
- // add fields for version range
- IDBField versionAddedField = table.addField(CDODBSchema.FEATUREMAP_VERSION_ADDED, DBType.INTEGER);
- IDBField versionRemovedField = table.addField(CDODBSchema.FEATUREMAP_VERSION_REMOVED, DBType.INTEGER);
-
- // add field for list index
- IDBField idxField = table.addField(CDODBSchema.FEATUREMAP_IDX, DBType.INTEGER);
-
- // add field for FeatureMap tag (MetaID for Feature in CDO registry)
- IDBField tagField = table.addField(CDODBSchema.FEATUREMAP_TAG, DBType.INTEGER);
-
- tagMap = new HashMap<Long, String>();
- typeMappings = new HashMap<Long, ITypeMapping>();
- columnNames = new ArrayList<String>();
-
- // create columns for all DBTypes
- for (DBType type : getDBTypes())
- {
- String column = CDODBSchema.FEATUREMAP_VALUE + "_" + type.name();
- table.addField(column, type);
- columnNames.add(column);
- }
-
- table.addIndex(Type.NON_UNIQUE, idField);
- table.addIndex(Type.NON_UNIQUE, branchField);
- table.addIndex(Type.NON_UNIQUE, versionAddedField);
- table.addIndex(Type.NON_UNIQUE, versionRemovedField);
- table.addIndex(Type.NON_UNIQUE, idxField);
- table.addIndex(Type.NON_UNIQUE, tagField);
- }
-
- public Collection<IDBTable> getDBTables()
- {
- return Arrays.asList(table);
- }
-
- private void initSQLStrings()
- {
- String tableName = getTable().getName();
-
- // ---------------- SELECT to read chunks ----------------------------
- StringBuilder builder = new StringBuilder();
- builder.append("SELECT "); //$NON-NLS-1$
-
- builder.append(CDODBSchema.FEATUREMAP_IDX);
- builder.append(", "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_TAG);
- builder.append(", "); //$NON-NLS-1$
-
- Iterator<String> iter = columnNames.iterator();
- while (iter.hasNext())
- {
- builder.append(iter.next());
- if (iter.hasNext())
- {
- builder.append(", "); //$NON-NLS-1$
- }
- }
-
- builder.append(" FROM "); //$NON-NLS-1$
- builder.append(tableName);
- builder.append(" WHERE "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_REVISION_ID);
- builder.append("=? AND "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_BRANCH);
- builder.append("=? AND "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_VERSION_ADDED);
- builder.append("<=? AND ("); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_VERSION_REMOVED);
- builder.append(" IS NULL OR "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_VERSION_REMOVED);
- builder.append(">?)"); //$NON-NLS-1$
- sqlSelectChunksPrefix = builder.toString();
-
- sqlOrderByIndex = " ORDER BY " + CDODBSchema.FEATUREMAP_IDX; //$NON-NLS-1$
-
- // ----------------- INSERT - prefix -----------------
- builder = new StringBuilder("INSERT INTO "); //$NON-NLS-1$
- builder.append(tableName);
- builder.append("("); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_REVISION_ID);
- builder.append(","); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_BRANCH);
- builder.append(","); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_VERSION_ADDED);
- builder.append(","); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_VERSION_REMOVED);
- builder.append(","); //$NON-NLS-1$
-
- for (int i = 0; i < columnNames.size(); i++)
- {
- builder.append(columnNames.get(i));
- builder.append(", "); //$NON-NLS-1$
- }
-
- builder.append(CDODBSchema.FEATUREMAP_IDX);
- builder.append(", "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_TAG);
- builder.append(") VALUES (?, ?, ?, ?, "); //$NON-NLS-1$
- for (int i = 0; i < columnNames.size(); i++)
- {
- builder.append("?, "); //$NON-NLS-1$
- }
-
- builder.append("?, ?)"); //$NON-NLS-1$
- sqlInsert = builder.toString();
-
- // ----------------- remove current entry -----------------
- builder = new StringBuilder("UPDATE "); //$NON-NLS-1$
- builder.append(tableName);
- builder.append(" SET "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_VERSION_REMOVED);
- builder.append("=? "); //$NON-NLS-1$
- builder.append(" WHERE "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_REVISION_ID);
- builder.append("=? AND "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_BRANCH);
- builder.append("=? AND "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_IDX);
- builder.append("=? AND "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_VERSION_REMOVED);
- builder.append(" IS NULL"); //$NON-NLS-1$
- sqlRemoveEntry = builder.toString();
-
- // ----------------- delete temporary entry -----------------
- builder = new StringBuilder("DELETE FROM "); //$NON-NLS-1$
- builder.append(tableName);
- builder.append(" WHERE "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_REVISION_ID);
- builder.append("=? AND "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_BRANCH);
- builder.append("=? AND "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_IDX);
- builder.append("=? AND "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_VERSION_ADDED);
- builder.append("=?"); //$NON-NLS-1$
- sqlDeleteEntry = builder.toString();
-
- // ----------------- update index -----------------
- builder = new StringBuilder("UPDATE "); //$NON-NLS-1$
- builder.append(tableName);
- builder.append(" SET "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_IDX);
- builder.append("=? WHERE "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_REVISION_ID);
- builder.append("=? AND "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_BRANCH);
- builder.append("=? AND "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_VERSION_ADDED);
- builder.append("=? AND "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_IDX);
- builder.append("=?"); //$NON-NLS-1$
- sqlUpdateIndex = builder.toString();
-
- // ----------------- get current value -----------------
- builder = new StringBuilder("SELECT "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_TAG);
- builder.append(", "); //$NON-NLS-1$
-
- iter = columnNames.iterator();
- while (iter.hasNext())
- {
- builder.append(iter.next());
- if (iter.hasNext())
- {
- builder.append(", "); //$NON-NLS-1$
- }
- }
-
- builder.append(" FROM "); //$NON-NLS-1$
- builder.append(tableName);
- builder.append(" WHERE "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_REVISION_ID);
- builder.append("=? AND "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_BRANCH);
- builder.append("=? AND "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_IDX);
- builder.append("=? AND "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_VERSION_REMOVED);
- builder.append(" IS NULL"); //$NON-NLS-1$
- sqlGetValue = builder.toString();
-
- // ----------- clear list items -------------------------
- builder = new StringBuilder("UPDATE "); //$NON-NLS-1$
- builder.append(tableName);
- builder.append(" SET "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_VERSION_REMOVED);
- builder.append("=? "); //$NON-NLS-1$
- builder.append(" WHERE "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_REVISION_ID);
- builder.append("=? AND "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_BRANCH);
- builder.append("=? AND "); //$NON-NLS-1$
- builder.append(CDODBSchema.FEATUREMAP_VERSION_REMOVED);
- builder.append(" IS NULL"); //$NON-NLS-1$
- sqlClearList = builder.toString();
- }
-
- protected List<DBType> getDBTypes()
- {
- return dbTypes;
- }
-
- protected final IDBTable getTable()
- {
- return table;
- }
-
- protected final List<String> getColumnNames()
- {
- return columnNames;
- }
-
- protected final Map<Long, ITypeMapping> getTypeMappings()
- {
- return typeMappings;
- }
-
- protected final Map<Long, String> getTagMap()
- {
- return tagMap;
- }
-
- public void readValues(IDBStoreAccessor accessor, InternalCDORevision revision, int listChunk)
- {
- MoveableList<Object> list = revision.getList(getFeature());
- int valuesToRead = list.size();
-
- if (listChunk != CDORevision.UNCHUNKED && listChunk < valuesToRead)
- {
- valuesToRead = listChunk;
- }
-
- if (valuesToRead == 0)
- {
- // nothing to read take shortcut
- return;
- }
-
- if (TRACER.isEnabled())
- {
- TRACER.format("Reading list values for feature {0}.{1} of {2}", getContainingClass().getName(), getFeature() //$NON-NLS-1$
- .getName(), revision);
- }
-
- IPreparedStatementCache statementCache = accessor.getStatementCache();
- PreparedStatement pstmt = null;
- ResultSet resultSet = null;
-
- IStoreChunkReader baseReader = null;
- try
- {
- String sql = sqlSelectChunksPrefix + sqlOrderByIndex;
-
- CDOID id = revision.getID();
- int branchID = revision.getBranch().getID();
-
- pstmt = statementCache.getPreparedStatement(sql, ReuseProbability.HIGH);
- pstmt.setLong(1, CDOIDUtil.getLong(id));
- pstmt.setInt(2, branchID);
- pstmt.setInt(3, revision.getVersion());
- pstmt.setInt(4, revision.getVersion());
-
- pstmt.setMaxRows(valuesToRead); // optimization - don't read unneeded rows.
-
- resultSet = pstmt.executeQuery();
-
- int currentIndex = 0;
-
- while (valuesToRead > 0 && resultSet.next())
- {
- int index = resultSet.getInt(1);
- if (index > currentIndex)
- {
- if (baseReader == null)
- {
- baseReader = createBaseChunkReader(accessor, id, branchID);
- }
-
- baseReader.addRangedChunk(currentIndex, index);
- if (TRACER.isEnabled())
- {
- TRACER.format("Scheduling range {0}-{1} to be read from base revision", currentIndex, index); //$NON-NLS-1$
- }
-
- valuesToRead -= index - currentIndex;
- currentIndex = index;
- }
-
- Long tag = resultSet.getLong(2);
- Object value = getTypeMapping(tag).readValue(resultSet);
- if (TRACER.isEnabled())
- {
- TRACER.format("Read value for index {0} from result set: {1}", currentIndex, value); //$NON-NLS-1$
- }
-
- list.set(currentIndex++, CDORevisionUtil.createFeatureMapEntry(getFeatureByTag(tag), value));
- valuesToRead--;
- }
-
- if (valuesToRead > 0)
- {
- if (baseReader == null)
- {
- baseReader = createBaseChunkReader(accessor, id, branchID);
- }
-
- baseReader.addRangedChunk(currentIndex, currentIndex + valuesToRead);
- }
- }
- catch (SQLException ex)
- {
- throw new DBException(ex);
- }
- finally
- {
- DBUtil.close(resultSet);
- statementCache.releasePreparedStatement(pstmt);
- }
-
- if (baseReader != null)
- {
- if (TRACER.isEnabled())
- {
- TRACER.format("Reading base revision chunks for featureMap {0}.{1} of {2} from base revision {3}", //$NON-NLS-1$
- getContainingClass().getName(), getFeature().getName(), revision, baseReader.getRevision());
- }
-
- List<Chunk> baseChunks = baseReader.executeRead();
- for (Chunk chunk : baseChunks)
- {
- int startIndex = chunk.getStartIndex();
- for (int i = 0; i < chunk.size(); i++)
- {
- list.set(startIndex + i, chunk.get(i));
- }
- }
- }
-
- if (TRACER.isEnabled())
- {
- TRACER.format("Reading list values done for feature {0}.{1} of {2}", getContainingClass().getName(), //$NON-NLS-1$
- getFeature().getName(), revision);
- }
- }
-
- private void addFeature(Long tag)
- {
- EStructuralFeature modelFeature = getFeatureByTag(tag);
-
- ITypeMapping typeMapping = getMappingStrategy().createValueMapping(modelFeature);
- String column = CDODBSchema.FEATUREMAP_VALUE + "_" + typeMapping.getDBType(); //$NON-NLS-1$
-
- tagMap.put(tag, column);
- typeMapping.setDBField(table, column);
- typeMappings.put(tag, typeMapping);
- }
-
- public final void readChunks(IDBStoreChunkReader chunkReader, List<Chunk> chunks, String where)
- {
- CDORevision revision = chunkReader.getRevision();
- if (TRACER.isEnabled())
- {
- TRACER.format("Reading list chunk values for feature {0}.{1} of {2}", getContainingClass().getName(), //$NON-NLS-1$
- getFeature().getName(), revision);
- }
-
- IPreparedStatementCache statementCache = chunkReader.getAccessor().getStatementCache();
- PreparedStatement pstmt = null;
- ResultSet resultSet = null;
-
- IStoreChunkReader baseReader = null;
- try
- {
- StringBuilder builder = new StringBuilder(sqlSelectChunksPrefix);
- if (where != null)
- {
- builder.append(" AND "); //$NON-NLS-1$
- builder.append(where);
- }
-
- builder.append(sqlOrderByIndex);
-
- String sql = builder.toString();
- pstmt = statementCache.getPreparedStatement(sql, ReuseProbability.LOW);
- pstmt.setLong(1, CDOIDUtil.getLong(revision.getID()));
- pstmt.setInt(2, revision.getBranch().getID());
- pstmt.setInt(3, revision.getVersion());
- pstmt.setInt(4, revision.getVersion());
-
- resultSet = pstmt.executeQuery();
-
- int nextDBIndex = Integer.MAX_VALUE; // next available DB index
- if (resultSet.next())
- {
- nextDBIndex = resultSet.getInt(1);
- }
-
- for (Chunk chunk : chunks)
- {
- int startIndex = chunk.getStartIndex();
- int missingValueStartIndex = -1;
-
- for (int i = 0; i < chunk.size(); i++)
- {
- int nextListIndex = startIndex + i; // next expected list index
-
- if (nextDBIndex == nextListIndex)
- {
- // DB value is available. check first if missing indexes were present before.
- if (missingValueStartIndex != -1)
- {
- // read missing indexes from missingValueStartIndex to currentIndex
- if (baseReader == null)
- {
- baseReader = createBaseChunkReader(chunkReader.getAccessor(), chunkReader.getRevision().getID(),
- chunkReader.getRevision().getBranch().getID());
- }
- if (TRACER.isEnabled())
- {
- TRACER.format(
- "Scheduling range {0}-{1} to be read from base revision", missingValueStartIndex, nextListIndex); //$NON-NLS-1$
- }
-
- baseReader.addRangedChunk(missingValueStartIndex, nextListIndex);
-
- // reset missingValueStartIndex
- missingValueStartIndex = -1;
- }
-
- // now read value and set to chunk
- Long tag = resultSet.getLong(2);
- Object value = getTypeMapping(tag).readValue(resultSet);
- if (TRACER.isEnabled())
- {
- TRACER.format("ChunkReader read value for index {0} from result set: {1}", nextDBIndex, value); //$NON-NLS-1$
- }
- chunk.add(i, CDORevisionUtil.createFeatureMapEntry(getFeatureByTag(tag), value));
-
- // advance DB cursor and read next available index
- if (resultSet.next())
- {
- nextDBIndex = resultSet.getInt(1);
- }
- else
- {
- // no more DB indexes available, but we have to continue checking for gaps, therefore set to MAX_VALUE
- nextDBIndex = Integer.MAX_VALUE;
- }
- }
- else
- {
- // gap between next DB index and next list index detected.
- // skip until end of chunk or until DB value becomes available
- if (missingValueStartIndex == -1)
- {
- missingValueStartIndex = nextListIndex;
- }
- }
- }
-
- // chunk complete. check for missing values at the end of the chunk.
- if (missingValueStartIndex != -1)
- {
- // read missing indexes from missingValueStartIndex to last chunk index
- if (baseReader == null)
- {
- baseReader = createBaseChunkReader(chunkReader.getAccessor(), chunkReader.getRevision().getID(),
- chunkReader.getRevision().getBranch().getID());
- }
- baseReader.addRangedChunk(missingValueStartIndex, chunk.getStartIndex() + chunk.size());
- }
- }
- }
- catch (SQLException ex)
- {
- throw new DBException(ex);
- }
- finally
- {
- DBUtil.close(resultSet);
- statementCache.releasePreparedStatement(pstmt);
- }
-
- // now read missing values from base revision.
- if (baseReader != null)
- {
- List<Chunk> baseChunks = baseReader.executeRead();
-
- Iterator<Chunk> thisIterator = chunks.iterator();
- Chunk thisChunk = thisIterator.next();
-
- for (Chunk baseChunk : baseChunks)
- {
- int baseStartIndex = baseChunk.getStartIndex();
-
- while (baseStartIndex > thisChunk.getStartIndex() + thisChunk.size())
- {
- // advance thisChunk, because it does not match baseChunk
- thisChunk = thisIterator.next();
- }
-
- // baseChunk now corresponds to this chunk, but startIndex of baseChunk may be higher.
- // therefore calculate offset
- int offset = thisChunk.getStartIndex() - baseStartIndex;
-
- // and copy values.
- for (int i = 0; i < baseChunk.size(); i++)
- {
- thisChunk.add(i + offset, baseChunk.get(i));
- }
- } // finally, continue with the next baseChunk
-
- }
-
- if (TRACER.isEnabled())
- {
- TRACER.format("Reading list chunk values done for feature {0}.{1} of {2}", getContainingClass().getName(), //$NON-NLS-1$
- getTagByFeature(getFeature()), revision);
- }
- }
-
- public void writeValues(IDBStoreAccessor accessor, InternalCDORevision revision)
- {
- CDOList values = revision.getList(getFeature());
-
- int idx = 0;
- for (Object element : values)
- {
- writeValue(accessor, revision, idx++, element);
- }
-
- if (TRACER.isEnabled())
- {
- TRACER.format("Writing done"); //$NON-NLS-1$
- }
- }
-
- protected final void writeValue(IDBStoreAccessor accessor, CDORevision revision, int idx, Object value)
- {
- if (TRACER.isEnabled())
- {
- TRACER
- .format(
- "Writing value for feature {0}.{1} index {2} of {3} : {4}", getContainingClass().getName(), getTagByFeature(getFeature()), idx, revision, value); //$NON-NLS-1$
- }
-
- addEntry(accessor, revision.getID(), revision.getBranch().getID(), revision.getVersion(), idx, value);
- }
-
- /**
- * Get column name (lazy).
- *
- * @param tag
- * The feature's MetaID in CDO
- * @return the column name where the values are stored
- */
- protected String getColumnName(Long tag)
- {
- String column = tagMap.get(tag);
- if (column == null)
- {
- addFeature(tag);
- column = tagMap.get(tag);
- }
-
- return column;
- }
-
- /**
- * Get type mapping (lazy).
- *
- * @param tag
- * The feature's MetaID in CDO
- * @return the corresponding type mapping
- */
- protected ITypeMapping getTypeMapping(Long tag)
- {
- ITypeMapping typeMapping = typeMappings.get(tag);
- if (typeMapping == null)
- {
- addFeature(tag);
- typeMapping = typeMappings.get(tag);
- }
-
- return typeMapping;
- }
-
- /**
- * @param metaID
- * @return the column name where the values are stored
- */
- private EStructuralFeature getFeatureByTag(Long tag)
- {
- return (EStructuralFeature)getMappingStrategy().getStore().getMetaDataManager().getMetaInstance(tag);
- }
-
- /**
- * @param feature
- * The EStructuralFeature
- * @return The feature's MetaID in CDO
- */
- protected Long getTagByFeature(EStructuralFeature feature)
- {
- return getMappingStrategy().getStore().getMetaDataManager().getMetaID(feature);
- }
-
- /**
- * Clear a list of a given revision.
- *
- * @param accessor
- * the accessor to use
- * @param id
- * the id of the revision from which to remove all items
- */
- public void clearList(IDBStoreAccessor accessor, CDOID id, int branchId, int oldVersion, int newVersion, int lastIndex)
- {
- IPreparedStatementCache statementCache = accessor.getStatementCache();
- PreparedStatement pstmtDeleteTemp = null;
- PreparedStatement pstmtClear = null;
-
- try
- {
- // check for each index if the value exists in the current branch
- for (int i = 0; i <= lastIndex; i++)
- {
- if (getValue(accessor, id, branchId, i, false) == null)
- {
- // if not, add a historic entry for missing ones.
- addHistoricEntry(accessor, id, branchId, 0, newVersion, i, getValueFromBase(accessor, id, branchId, i));
- }
- }
-
- // clear rest of the list
- pstmtClear = statementCache.getPreparedStatement(sqlClearList, ReuseProbability.HIGH);
- pstmtClear.setInt(1, newVersion);
- pstmtClear.setLong(2, CDOIDUtil.getLong(id));
- pstmtClear.setInt(3, branchId);
-
- int result = CDODBUtil.sqlUpdate(pstmtClear, false);
- if (TRACER.isEnabled())
- {
- TRACER.format("ClearList result: {0}", result); //$NON-NLS-1$
- }
- }
- catch (SQLException e)
- {
- throw new DBException(e);
- }
- finally
- {
- statementCache.releasePreparedStatement(pstmtDeleteTemp);
- statementCache.releasePreparedStatement(pstmtClear);
- }
- }
-
- public void objectDetached(IDBStoreAccessor accessor, CDOID id, long revised)
- {
- InternalCDORevision revision = (InternalCDORevision)accessor.getTransaction().getRevision(id);
- int branchId = accessor.getTransaction().getBranch().getID();
-
- if (TRACER.isEnabled())
- {
- TRACER.format("objectDetached {1}", revision); //$NON-NLS-1$
- }
-
- clearList(accessor, id, branchId, revision.getVersion(), FINAL_VERSION, revision.getList(getFeature()).size() - 1);
- }
-
- public void processDelta(final IDBStoreAccessor accessor, final CDOID id, final int branchId, int oldVersion,
- final int newVersion, long created, CDOListFeatureDelta delta)
- {
- List<CDOFeatureDelta> listChanges = delta.getListChanges();
- if (listChanges.size() == 0)
- {
- // nothing to do.
- return;
- }
-
- InternalCDORevision originalRevision = (InternalCDORevision)accessor.getTransaction().getRevision(id);
- int oldListSize = originalRevision.getList(getFeature()).size();
-
- if (TRACER.isEnabled())
- {
- TRACER.format("ListTableMapping.processDelta for revision {0} - previous list size: {1}", originalRevision, //$NON-NLS-1$
- oldListSize);
- }
-
- // let the visitor collect the changes
- ListDeltaVisitor visitor = new ListDeltaVisitor(accessor, originalRevision, branchId, oldVersion, newVersion);
-
- if (TRACER.isEnabled())
- {
- TRACER.format("Processing deltas..."); //$NON-NLS-1$
- }
-
- // optimization: it's only necessary to process deltas
- // starting with the last feature delta which clears the list
- // (any operation before the clear is cascaded by it anyway)
- int index = listChanges.size() - 1;
- while (index > 0)
- {
- CDOFeatureDelta listDelta = listChanges.get(index);
- if (listDelta instanceof CDOClearFeatureDelta || listDelta instanceof CDOUnsetFeatureDelta)
- {
- break;
- }
- index--;
- }
- while (index < listChanges.size())
- {
- listChanges.get(index++).accept(visitor);
- }
- }
-
- private class ListDeltaVisitor implements CDOFeatureDeltaVisitor
- {
- private IDBStoreAccessor accessor;
-
- private InternalCDORevision originalRevision;
-
- private CDOID id;
-
- private int branchID;
-
- private int oldVersion;
-
- private int newVersion;
-
- private int lastIndex;
-
- public ListDeltaVisitor(IDBStoreAccessor accessor, InternalCDORevision originalRevision, int targetBranchID,
- int oldVersion, int newVersion)
- {
- this.accessor = accessor;
- this.originalRevision = originalRevision;
- id = this.originalRevision.getID();
- branchID = targetBranchID;
- this.oldVersion = oldVersion;
- this.newVersion = newVersion;
- lastIndex = originalRevision.getList(getFeature()).size() - 1;
- }
-
- public void visit(CDOMoveFeatureDelta delta)
- {
- int fromIdx = delta.getOldPosition();
- int toIdx = delta.getNewPosition();
-
- if (TRACER.isEnabled())
- {
- TRACER.format("Delta Moving: {0} to {1}", fromIdx, toIdx); //$NON-NLS-1$
- }
-
- Object value = getValue(accessor, id, branchID, fromIdx, true);
-
- // remove the item
- removeEntry(accessor, id, branchID, oldVersion, newVersion, fromIdx);
-
- // adjust indexes and shift either up or down
- if (fromIdx < toIdx)
- {
- moveOneUp(accessor, id, branchID, oldVersion, newVersion, fromIdx + 1, toIdx);
- }
- else
- { // fromIdx > toIdx here
- moveOneDown(accessor, id, branchID, oldVersion, newVersion, toIdx, fromIdx - 1);
- }
-
- // create the item
- addEntry(accessor, id, branchID, newVersion, toIdx, value);
- }
-
- public void visit(CDOAddFeatureDelta delta)
- {
- int startIndex = delta.getIndex();
- int endIndex = lastIndex;
-
- if (TRACER.isEnabled())
- {
- TRACER.format("Delta Adding at: {0}", startIndex); //$NON-NLS-1$
- }
-
- if (startIndex <= endIndex)
- {
- // make room for the new item
- moveOneDown(accessor, id, branchID, oldVersion, newVersion, startIndex, endIndex);
- }
-
- // create the item
- addEntry(accessor, id, branchID, newVersion, startIndex, delta.getValue());
-
- ++lastIndex;
- }
-
- public void visit(CDORemoveFeatureDelta delta)
- {
- int startIndex = delta.getIndex();
- int endIndex = lastIndex;
-
- if (TRACER.isEnabled())
- {
- TRACER.format("Delta Removing at: {0}", startIndex); //$NON-NLS-1$
- }
-
- // remove the item
- removeEntry(accessor, id, branchID, oldVersion, newVersion, startIndex);
-
- // make room for the new item
- moveOneUp(accessor, id, branchID, oldVersion, newVersion, startIndex + 1, endIndex);
-
- --lastIndex;
- }
-
- public void visit(CDOSetFeatureDelta delta)
- {
- int index = delta.getIndex();
-
- if (TRACER.isEnabled())
- {
- TRACER.format("Delta Setting at: {0}", index); //$NON-NLS-1$
- }
-
- // remove the item
- removeEntry(accessor, id, branchID, oldVersion, newVersion, index);
-
- // create the item
- addEntry(accessor, id, branchID, newVersion, index, delta.getValue());
- }
-
- public void visit(CDOUnsetFeatureDelta delta)
- {
- if (delta.getFeature().isUnsettable())
- {
- throw new ImplementationError("Should not be called"); //$NON-NLS-1$
- }
-
- if (TRACER.isEnabled())
- {
- TRACER.format("Delta Unsetting"); //$NON-NLS-1$
- }
-
- clearList(accessor, id, branchID, oldVersion, newVersion, lastIndex);
- lastIndex = -1;
- }
-
- public void visit(CDOListFeatureDelta delta)
- {
- throw new ImplementationError("Should not be called"); //$NON-NLS-1$
- }
-
- public void visit(CDOClearFeatureDelta delta)
- {
- if (TRACER.isEnabled())
- {
- TRACER.format("Delta Clearing"); //$NON-NLS-1$
- }
-
- clearList(accessor, id, branchID, oldVersion, newVersion, lastIndex);
- lastIndex = -1;
- }
-
- public void visit(CDOContainerFeatureDelta delta)
- {
- throw new ImplementationError("Should not be called"); //$NON-NLS-1$
- }
-
- private void moveOneUp(IDBStoreAccessor accessor, CDOID id, int branchId, int oldVersion, int newVersion,
- int startIndex, int endIndex)
- {
- IPreparedStatementCache statementCache = accessor.getStatementCache();
- PreparedStatement pstmt = null;
-
- try
- {
- pstmt = statementCache.getPreparedStatement(sqlUpdateIndex, ReuseProbability.HIGH);
-
- for (int index = startIndex; index <= endIndex; ++index)
- {
- if (TRACER.isEnabled())
- {
- TRACER.format("moveOneUp moving: {0} -> {1}", index, index - 1); //$NON-NLS-1$
- }
-
- int stmtIndex = 1;
- pstmt.setInt(stmtIndex++, index - 1);
- pstmt.setLong(stmtIndex++, CDOIDUtil.getLong(id));
- pstmt.setInt(stmtIndex++, branchId);
- pstmt.setInt(stmtIndex++, newVersion);
- pstmt.setInt(stmtIndex++, index);
-
- int result = CDODBUtil.sqlUpdate(pstmt, false);
- switch (result)
- {
- case 1:
- // entry for current revision was already present.
- // index update succeeded.
- if (TRACER.isEnabled())
- {
- TRACER.format("moveOneUp updated: {0} -> {1}", index, index - 1); //$NON-NLS-1$
- }
-
- break;
- case 0:
- Object value = getValue(accessor, id, branchId, index, false);
-
- if (value != null)
- {
- if (TRACER.isEnabled())
- {
- TRACER.format("moveOneUp remove: {0}", index); //$NON-NLS-1$
- }
-
- removeEntry(accessor, id, branchId, oldVersion, newVersion, index);
- }
- else
- {
- value = getValueFromBase(accessor, id, branchId, index);
- {
- TRACER.format("moveOneUp add historic entry at: {0}", index); //$NON-NLS-1$
- }
-
- addHistoricEntry(accessor, id, branchId, 0, newVersion, index, value);
- }
-
- if (TRACER.isEnabled())
- {
- TRACER.format("moveOneUp add: {0}", index - 1); //$NON-NLS-1$
- }
-
- addEntry(accessor, id, branchId, newVersion, index - 1, value);
- break;
- default:
- if (TRACER.isEnabled())
- {
- TRACER.format("moveOneUp Too many results: {0} -> {1}: {2}", index, index + 1, result); //$NON-NLS-1$
- }
-
- throw new DBException("Too many results"); //$NON-NLS-1$
- }
- }
- }
- catch (SQLException e)
- {
- throw new DBException(e);
- }
- finally
- {
- statementCache.releasePreparedStatement(pstmt);
- }
- }
-
- private void moveOneDown(IDBStoreAccessor accessor, CDOID id, int branchId, int oldVersion, int newVersion,
- int startIndex, int endIndex)
- {
- IPreparedStatementCache statementCache = accessor.getStatementCache();
- PreparedStatement pstmt = null;
-
- try
- {
- pstmt = statementCache.getPreparedStatement(sqlUpdateIndex, ReuseProbability.HIGH);
- for (int index = endIndex; index >= startIndex; --index)
- {
- if (TRACER.isEnabled())
- {
- TRACER.format("moveOneDown moving: {0} -> {1}", index, index + 1); //$NON-NLS-1$
- }
-
- int stmtIndex = 1;
- pstmt.setInt(stmtIndex++, index + 1);
- pstmt.setLong(stmtIndex++, CDOIDUtil.getLong(id));
- pstmt.setInt(stmtIndex++, branchId);
- pstmt.setInt(stmtIndex++, newVersion);
- pstmt.setInt(stmtIndex++, index);
-
- int result = CDODBUtil.sqlUpdate(pstmt, false);
- switch (result)
- {
- case 1:
- // entry for current revision was already present.
- // index update succeeded.
- if (TRACER.isEnabled())
- {
- TRACER.format("moveOneDown updated: {0} -> {1}", index, index + 1); //$NON-NLS-1$
- }
-
- break;
- case 0:
- Object value = getValue(accessor, id, branchId, index, false);
- if (value != null)
- {
- if (TRACER.isEnabled())
- {
- TRACER.format("moveOneDown remove: {0}", index); //$NON-NLS-1$
- }
-
- removeEntry(accessor, id, branchId, oldVersion, newVersion, index);
- }
- else
- {
- value = getValueFromBase(accessor, id, branchId, index);
- {
- TRACER.format("moveOneDown add historic entry at: {0}", index); //$NON-NLS-1$
- }
-
- addHistoricEntry(accessor, id, branchId, 0, newVersion, index, value);
- }
-
- addEntry(accessor, id, branchId, newVersion, index + 1, value);
- break;
- default:
- if (TRACER.isEnabled())
- {
- TRACER.format("moveOneDown Too many results: {0} -> {1}: {2}", index, index + 1, result); //$NON-NLS-1$
- }
-
- throw new DBException("Too many results"); //$NON-NLS-1$
- }
- }
- }
- catch (SQLException e)
- {
- throw new DBException(e);
- }
- finally
- {
- statementCache.releasePreparedStatement(pstmt);
- }
- }
- }
-
- private void addEntry(IDBStoreAccessor accessor, CDOID id, int branchId, int version, int index, Object value)
- {
- IPreparedStatementCache statementCache = accessor.getStatementCache();
- PreparedStatement pstmt = null;
-
- if (TRACER.isEnabled())
- {
- TRACER.format("Adding value for feature() {0}.{1} index {2} of {3}v{4} : {5}", //$NON-NLS-1$
- getContainingClass().getName(), getFeature().getName(), index, id, version, value);
- }
-
- try
- {
- FeatureMap.Entry entry = (FeatureMap.Entry)value;
- EStructuralFeature entryFeature = entry.getEStructuralFeature();
- Long tag = getTagByFeature(entryFeature);
- String column = getColumnName(tag);
-
- pstmt = statementCache.getPreparedStatement(sqlInsert, ReuseProbability.HIGH);
-
- int stmtIndex = 1;
- pstmt.setLong(stmtIndex++, CDOIDUtil.getLong(id));
- pstmt.setInt(stmtIndex++, branchId);
- pstmt.setInt(stmtIndex++, version);
- pstmt.setNull(stmtIndex++, DBType.INTEGER.getCode()); // versionRemoved
-
- for (int i = 0; i < columnNames.size(); i++)
- {
- if (columnNames.get(i).equals(column))
- {
- getTypeMapping(tag).setValue(pstmt, stmtIndex++, entry.getValue());
- }
- else
- {
- pstmt.setNull(stmtIndex++, getDBTypes().get(i).getCode());
- }
- }
-
- pstmt.setInt(stmtIndex++, index);
- pstmt.setLong(stmtIndex++, tag);
- CDODBUtil.sqlUpdate(pstmt, true);
- }
- catch (SQLException e)
- {
- throw new DBException(e);
- }
- catch (IllegalStateException e)
- {
- throw new DBException(e);
- }
- finally
- {
- statementCache.releasePreparedStatement(pstmt);
- }
- }
-
- private void addHistoricEntry(IDBStoreAccessor accessor, CDOID id, int branchId, int versionAdded,
- int versionRemoved, int index, Object value)
- {
- IPreparedStatementCache statementCache = accessor.getStatementCache();
- PreparedStatement pstmt = null;
-
- if (TRACER.isEnabled())
- {
- TRACER.format(
- "Adding historic value for feature {0}.{1} index {2} of {3}:{4}v{5}-v{6} : {7}", //$NON-NLS-1$
- getContainingClass().getName(), getFeature().getName(), index, id, branchId, versionAdded, versionRemoved,
- value);
- }
-
- try
- {
- FeatureMap.Entry entry = (FeatureMap.Entry)value;
- EStructuralFeature entryFeature = entry.getEStructuralFeature();
- Long tag = getTagByFeature(entryFeature);
- String column = getColumnName(tag);
-
- pstmt = statementCache.getPreparedStatement(sqlInsert, ReuseProbability.HIGH);
-
- int stmtIndex = 1;
- pstmt.setLong(stmtIndex++, CDOIDUtil.getLong(id));
- pstmt.setInt(stmtIndex++, branchId);
- pstmt.setInt(stmtIndex++, versionAdded);
- pstmt.setNull(stmtIndex++, versionRemoved);
- pstmt.setInt(stmtIndex++, index);
-
- for (int i = 0; i < columnNames.size(); i++)
- {
- if (columnNames.get(i).equals(column))
- {
- getTypeMapping(tag).setValue(pstmt, stmtIndex++, entry.getValue());
- }
- else
- {
- pstmt.setNull(stmtIndex++, getDBTypes().get(i).getCode());
- }
- }
-
- pstmt.setInt(stmtIndex++, index);
- pstmt.setLong(stmtIndex++, tag);
- CDODBUtil.sqlUpdate(pstmt, true);
- }
- catch (SQLException e)
- {
- throw new DBException(e);
- }
- catch (IllegalStateException e)
- {
- throw new DBException(e);
- }
- finally
- {
- statementCache.releasePreparedStatement(pstmt);
- }
- }
-
- private void removeEntry(IDBStoreAccessor accessor, CDOID id, int branchId, int oldVersion, int newVersion, int index)
- {
- IPreparedStatementCache statementCache = accessor.getStatementCache();
- PreparedStatement pstmt = null;
-
- if (TRACER.isEnabled())
- {
- TRACER.format("Removing value for feature() {0}.{1} index {2} of {3}v{4}", //$NON-NLS-1$
- getContainingClass().getName(), getFeature().getName(), index, id, newVersion);
- }
-
- try
- {
- // try to delete a temporary entry first
- pstmt = statementCache.getPreparedStatement(sqlDeleteEntry, ReuseProbability.HIGH);
-
- int stmtIndex = 1;
- pstmt.setLong(stmtIndex++, CDOIDUtil.getLong(id));
- pstmt.setInt(stmtIndex++, branchId);
- pstmt.setInt(stmtIndex++, index);
- pstmt.setInt(stmtIndex++, newVersion);
-
- int result = CDODBUtil.sqlUpdate(pstmt, false);
- if (result == 1)
- {
- if (TRACER.isEnabled())
- {
- TRACER.format("removeEntry deleted: {0}", index); //$NON-NLS-1$
- }
- }
- else if (result > 1)
- {
- if (TRACER.isEnabled())
- {
- TRACER.format("removeEntry Too many results: {0}: {1}", index, result); //$NON-NLS-1$
- }
-
- throw new DBException("Too many results"); //$NON-NLS-1$
- }
- else
- {
- // no temporary entry found, so mark the entry as removed
- statementCache.releasePreparedStatement(pstmt);
- pstmt = statementCache.getPreparedStatement(sqlRemoveEntry, ReuseProbability.HIGH);
-
- stmtIndex = 1;
- pstmt.setInt(stmtIndex++, newVersion);
- pstmt.setLong(stmtIndex++, CDOIDUtil.getLong(id));
- pstmt.setInt(stmtIndex++, branchId);
- pstmt.setInt(stmtIndex++, index);
- result = CDODBUtil.sqlUpdate(pstmt, false);
-
- if (result == 0)
- {
- // no entry removed -> this means that we are in a branch and
- // the entry has not been modified since the branch fork.
- // therefore, we have to copy the base value and mark it as removed
- Object value = getValueFromBase(accessor, id, branchId, index);
- addHistoricEntry(accessor, id, branchId, 0, newVersion, index, value);
- }
- }
- }
- catch (SQLException e)
- {
- if (TRACER.isEnabled())
- {
- TRACER.format("Removing value for feature() {0}.{1} index {2} of {3}v{4} FAILED {5}", //$NON-NLS-1$
- getContainingClass().getName(), getFeature().getName(), index, id, newVersion, e.getMessage());
- }
-
- throw new DBException(e);
- }
- catch (IllegalStateException e)
- {
- if (TRACER.isEnabled())
- {
- TRACER.format("Removing value for feature() {0}.{1} index {2} of {3}v{4} FAILED {5}", //$NON-NLS-1$
- getContainingClass().getName(), getFeature().getName(), index, id, newVersion, e.getMessage());
- }
-
- throw new DBException(e);
- }
- finally
- {
- statementCache.releasePreparedStatement(pstmt);
- }
- }
-
- private FeatureMap.Entry getValue(IDBStoreAccessor accessor, CDOID id, int branchId, int index, boolean getFromBase)
- {
- IPreparedStatementCache statementCache = accessor.getStatementCache();
- PreparedStatement pstmt = null;
- FeatureMap.Entry result = null;
-
- try
- {
- pstmt = statementCache.getPreparedStatement(sqlGetValue, ReuseProbability.HIGH);
-
- int stmtIndex = 1;
- pstmt.setLong(stmtIndex++, CDOIDUtil.getLong(id));
- pstmt.setInt(stmtIndex++, branchId);
- pstmt.setInt(stmtIndex++, index);
-
- ResultSet resultSet = pstmt.executeQuery();
- if (resultSet.next())
- {
- Long tag = resultSet.getLong(1);
- Object value = getTypeMapping(tag).readValue(resultSet);
- result = CDORevisionUtil.createFeatureMapEntry(getFeatureByTag(tag), value);
- }
- else
- {
- // value is not in this branch.
- // -> read from base revision
- if (getFromBase)
- {
- result = getValueFromBase(accessor, id, branchId, index);
- } // else: result remains null
- }
- if (TRACER.isEnabled())
- {
- TRACER.format("Read value (index {0}) from result set: {1}", index, result); //$NON-NLS-1$
- }
- }
- catch (SQLException e)
- {
- throw new DBException(e);
- }
- finally
- {
- statementCache.releasePreparedStatement(pstmt);
- }
-
- return result;
- }
-
- /**
- * Read a single value (at a given index) from the base revision
- *
- * @param accessor
- * the DBStoreAccessor
- * @param id
- * the ID of the revision
- * @param branchID
- * the ID of the current (child) branch
- * @param index
- * the index to read the value from
- * @return the value which is at index <code>index</code> in revision with ID <code>id</code> in the parent branch at
- * the base of this branch (indicated by <code>branchID</code>).
- */
- private FeatureMap.Entry getValueFromBase(IDBStoreAccessor accessor, CDOID id, int branchID, int index)
- {
- IStoreChunkReader chunkReader = createBaseChunkReader(accessor, id, branchID);
- chunkReader.addSimpleChunk(index);
- List<Chunk> chunks = chunkReader.executeRead();
- return (FeatureMap.Entry)chunks.get(0).get(0);
- }
-
- private IStoreChunkReader createBaseChunkReader(IDBStoreAccessor accessor, CDOID id, int branchID)
- {
- CDOBranchPoint base = accessor.getStore().getRepository().getBranchManager().getBranch(branchID).getBase();
- InternalCDORevision baseRevision = (InternalCDORevision)accessor.getStore().getRepository().getRevisionManager()
- .getRevision(id, base, /* referenceChunk = */0, /* prefetchDepth = */CDORevision.DEPTH_NONE, true);
- IStoreChunkReader chunkReader = accessor.createChunkReader(baseRevision, getFeature());
- return chunkReader;
- }
-
- public final boolean queryXRefs(IDBStoreAccessor accessor, String mainTableName, String mainTableWhere,
- QueryXRefsContext context, String idString)
- {
- // must never be called (a feature map is not associated with an EReference feature, so XRefs are nor supported
- // here)
- throw new ImplementationError("Should never be called!");
- }
-}
+/** + * Copyright (c) 2004 - 2010 Eike Stepper (Berlin, Germany) and others. + * 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: + * Stefan Winkler - initial API and implementation taken from AuditFeatureMapTableMappingWithRanges + * Stefan Winkler - Bug 329025: [DB] Support branching for range-based mapping strategy + */ +package org.eclipse.emf.cdo.server.internal.db.mapping.horizontal; + +import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; +import org.eclipse.emf.cdo.common.id.CDOID; +import org.eclipse.emf.cdo.common.id.CDOIDUtil; +import org.eclipse.emf.cdo.common.revision.CDOList; +import org.eclipse.emf.cdo.common.revision.CDORevision; +import org.eclipse.emf.cdo.common.revision.CDORevisionUtil; +import org.eclipse.emf.cdo.common.revision.delta.CDOAddFeatureDelta; +import org.eclipse.emf.cdo.common.revision.delta.CDOClearFeatureDelta; +import org.eclipse.emf.cdo.common.revision.delta.CDOContainerFeatureDelta; +import org.eclipse.emf.cdo.common.revision.delta.CDOFeatureDelta; +import org.eclipse.emf.cdo.common.revision.delta.CDOFeatureDeltaVisitor; +import org.eclipse.emf.cdo.common.revision.delta.CDOListFeatureDelta; +import org.eclipse.emf.cdo.common.revision.delta.CDOMoveFeatureDelta; +import org.eclipse.emf.cdo.common.revision.delta.CDORemoveFeatureDelta; +import org.eclipse.emf.cdo.common.revision.delta.CDOSetFeatureDelta; +import org.eclipse.emf.cdo.common.revision.delta.CDOUnsetFeatureDelta; +import org.eclipse.emf.cdo.server.IStoreAccessor.QueryXRefsContext; +import org.eclipse.emf.cdo.server.IStoreChunkReader; +import org.eclipse.emf.cdo.server.IStoreChunkReader.Chunk; +import org.eclipse.emf.cdo.server.db.CDODBUtil; +import org.eclipse.emf.cdo.server.db.IDBStoreAccessor; +import org.eclipse.emf.cdo.server.db.IDBStoreChunkReader; +import org.eclipse.emf.cdo.server.db.IPreparedStatementCache; +import org.eclipse.emf.cdo.server.db.IPreparedStatementCache.ReuseProbability; +import org.eclipse.emf.cdo.server.db.mapping.IListMappingDeltaSupport; +import org.eclipse.emf.cdo.server.db.mapping.IMappingStrategy; +import org.eclipse.emf.cdo.server.db.mapping.ITypeMapping; +import org.eclipse.emf.cdo.server.internal.db.CDODBSchema; +import org.eclipse.emf.cdo.server.internal.db.bundle.OM; +import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; + +import org.eclipse.net4j.db.DBException; +import org.eclipse.net4j.db.DBType; +import org.eclipse.net4j.db.DBUtil; +import org.eclipse.net4j.db.ddl.IDBField; +import org.eclipse.net4j.db.ddl.IDBIndex.Type; +import org.eclipse.net4j.db.ddl.IDBTable; +import org.eclipse.net4j.util.ImplementationError; +import org.eclipse.net4j.util.collection.MoveableList; +import org.eclipse.net4j.util.om.trace.ContextTracer; + +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.emf.ecore.util.FeatureMap; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +/** + * This is a featuremap-table mapping for audit mode. It is optimized for frequent insert operations at the list's end, + * which causes just 1 DB row to be changed. This is achieved by introducing a version range (columns + * {@link CDODBSchema#LIST_REVISION_VERSION_ADDED cdo_version_added} and + * {@link CDODBSchema#LIST_REVISION_VERSION_REMOVED cdo_version_removed}) which records for which revisions a particular + * entry existed. Also, this mapping is mainly optimized for potentially very large lists: the need for having the + * complete list stored in memory to do in-the-middle-moved and inserts is traded in for a few more DB access + * operations. + * + * @author Eike Stepper + * @author Stefan Winkler + * @author Lothar Werzinger + * @since 3.0 + */ +public class BranchingFeatureMapTableMappingWithRanges extends BasicAbstractListTableMapping implements + IListMappingDeltaSupport +{ + private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, + BranchingFeatureMapTableMappingWithRanges.class); + + /** + * Used to clean up lists for detached objects. + */ + private static final int FINAL_VERSION = Integer.MAX_VALUE; + + /** + * The table of this mapping. + */ + private IDBTable table; + + /** + * The tags mapped to column names + */ + private HashMap<Long, String> tagMap; + + /** + * Column name Set + */ + private List<String> columnNames; + + /** + * The type mappings for the value fields. + */ + private Map<Long, ITypeMapping> typeMappings; + + // --------- SQL strings - see initSQLStrings() ----------------- + private String sqlSelectChunksPrefix; + + private String sqlOrderByIndex; + + protected String sqlInsert; + + private List<DBType> dbTypes; + + private String sqlRemoveEntry; + + private String sqlDeleteEntry; + + private String sqlUpdateIndex; + + private String sqlGetValue; + + private String sqlClearList; + + public BranchingFeatureMapTableMappingWithRanges(IMappingStrategy mappingStrategy, EClass eClass, + EStructuralFeature feature) + { + super(mappingStrategy, eClass, feature); + initDBTypes(); + initTable(); + initSQLStrings(); + } + + private void initDBTypes() + { + // TODO add annotation processing here ... + ITypeMapping.Registry registry = ITypeMapping.Registry.INSTANCE; + dbTypes = new ArrayList<DBType>(registry.getDefaultFeatureMapDBTypes()); + } + + private void initTable() + { + String tableName = getMappingStrategy().getTableName(getContainingClass(), getFeature()); + table = getMappingStrategy().getStore().getDBSchema().addTable(tableName); + + // add fields for CDOID + IDBField idField = table.addField(CDODBSchema.FEATUREMAP_REVISION_ID, DBType.INTEGER); + + IDBField branchField = table.addField(CDODBSchema.LIST_REVISION_BRANCH, DBType.INTEGER); + + // add fields for version range + IDBField versionAddedField = table.addField(CDODBSchema.FEATUREMAP_VERSION_ADDED, DBType.INTEGER); + IDBField versionRemovedField = table.addField(CDODBSchema.FEATUREMAP_VERSION_REMOVED, DBType.INTEGER); + + // add field for list index + IDBField idxField = table.addField(CDODBSchema.FEATUREMAP_IDX, DBType.INTEGER); + + // add field for FeatureMap tag (MetaID for Feature in CDO registry) + IDBField tagField = table.addField(CDODBSchema.FEATUREMAP_TAG, DBType.INTEGER); + + tagMap = new HashMap<Long, String>(); + typeMappings = new HashMap<Long, ITypeMapping>(); + columnNames = new ArrayList<String>(); + + // create columns for all DBTypes + for (DBType type : getDBTypes()) + { + String column = CDODBSchema.FEATUREMAP_VALUE + "_" + type.name(); + table.addField(column, type); + columnNames.add(column); + } + + table.addIndex(Type.NON_UNIQUE, idField); + table.addIndex(Type.NON_UNIQUE, branchField); + table.addIndex(Type.NON_UNIQUE, versionAddedField); + table.addIndex(Type.NON_UNIQUE, versionRemovedField); + table.addIndex(Type.NON_UNIQUE, idxField); + table.addIndex(Type.NON_UNIQUE, tagField); + } + + public Collection<IDBTable> getDBTables() + { + return Arrays.asList(table); + } + + private void initSQLStrings() + { + String tableName = getTable().getName(); + + // ---------------- SELECT to read chunks ---------------------------- + StringBuilder builder = new StringBuilder(); + builder.append("SELECT "); //$NON-NLS-1$ + + builder.append(CDODBSchema.FEATUREMAP_IDX); + builder.append(", "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_TAG); + builder.append(", "); //$NON-NLS-1$ + + Iterator<String> iter = columnNames.iterator(); + while (iter.hasNext()) + { + builder.append(iter.next()); + if (iter.hasNext()) + { + builder.append(", "); //$NON-NLS-1$ + } + } + + builder.append(" FROM "); //$NON-NLS-1$ + builder.append(tableName); + builder.append(" WHERE "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_REVISION_ID); + builder.append("=? AND "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_BRANCH); + builder.append("=? AND "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_VERSION_ADDED); + builder.append("<=? AND ("); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_VERSION_REMOVED); + builder.append(" IS NULL OR "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_VERSION_REMOVED); + builder.append(">?)"); //$NON-NLS-1$ + sqlSelectChunksPrefix = builder.toString(); + + sqlOrderByIndex = " ORDER BY " + CDODBSchema.FEATUREMAP_IDX; //$NON-NLS-1$ + + // ----------------- INSERT - prefix ----------------- + builder = new StringBuilder("INSERT INTO "); //$NON-NLS-1$ + builder.append(tableName); + builder.append("("); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_REVISION_ID); + builder.append(","); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_BRANCH); + builder.append(","); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_VERSION_ADDED); + builder.append(","); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_VERSION_REMOVED); + builder.append(","); //$NON-NLS-1$ + + for (int i = 0; i < columnNames.size(); i++) + { + builder.append(columnNames.get(i)); + builder.append(", "); //$NON-NLS-1$ + } + + builder.append(CDODBSchema.FEATUREMAP_IDX); + builder.append(", "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_TAG); + builder.append(") VALUES (?, ?, ?, ?, "); //$NON-NLS-1$ + for (int i = 0; i < columnNames.size(); i++) + { + builder.append("?, "); //$NON-NLS-1$ + } + + builder.append("?, ?)"); //$NON-NLS-1$ + sqlInsert = builder.toString(); + + // ----------------- remove current entry ----------------- + builder = new StringBuilder("UPDATE "); //$NON-NLS-1$ + builder.append(tableName); + builder.append(" SET "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_VERSION_REMOVED); + builder.append("=? "); //$NON-NLS-1$ + builder.append(" WHERE "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_REVISION_ID); + builder.append("=? AND "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_BRANCH); + builder.append("=? AND "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_IDX); + builder.append("=? AND "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_VERSION_REMOVED); + builder.append(" IS NULL"); //$NON-NLS-1$ + sqlRemoveEntry = builder.toString(); + + // ----------------- delete temporary entry ----------------- + builder = new StringBuilder("DELETE FROM "); //$NON-NLS-1$ + builder.append(tableName); + builder.append(" WHERE "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_REVISION_ID); + builder.append("=? AND "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_BRANCH); + builder.append("=? AND "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_IDX); + builder.append("=? AND "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_VERSION_ADDED); + builder.append("=?"); //$NON-NLS-1$ + sqlDeleteEntry = builder.toString(); + + // ----------------- update index ----------------- + builder = new StringBuilder("UPDATE "); //$NON-NLS-1$ + builder.append(tableName); + builder.append(" SET "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_IDX); + builder.append("=? WHERE "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_REVISION_ID); + builder.append("=? AND "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_BRANCH); + builder.append("=? AND "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_VERSION_ADDED); + builder.append("=? AND "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_IDX); + builder.append("=?"); //$NON-NLS-1$ + sqlUpdateIndex = builder.toString(); + + // ----------------- get current value ----------------- + builder = new StringBuilder("SELECT "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_TAG); + builder.append(", "); //$NON-NLS-1$ + + iter = columnNames.iterator(); + while (iter.hasNext()) + { + builder.append(iter.next()); + if (iter.hasNext()) + { + builder.append(", "); //$NON-NLS-1$ + } + } + + builder.append(" FROM "); //$NON-NLS-1$ + builder.append(tableName); + builder.append(" WHERE "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_REVISION_ID); + builder.append("=? AND "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_BRANCH); + builder.append("=? AND "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_IDX); + builder.append("=? AND "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_VERSION_REMOVED); + builder.append(" IS NULL"); //$NON-NLS-1$ + sqlGetValue = builder.toString(); + + // ----------- clear list items ------------------------- + builder = new StringBuilder("UPDATE "); //$NON-NLS-1$ + builder.append(tableName); + builder.append(" SET "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_VERSION_REMOVED); + builder.append("=? "); //$NON-NLS-1$ + builder.append(" WHERE "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_REVISION_ID); + builder.append("=? AND "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_BRANCH); + builder.append("=? AND "); //$NON-NLS-1$ + builder.append(CDODBSchema.FEATUREMAP_VERSION_REMOVED); + builder.append(" IS NULL"); //$NON-NLS-1$ + sqlClearList = builder.toString(); + } + + protected List<DBType> getDBTypes() + { + return dbTypes; + } + + protected final IDBTable getTable() + { + return table; + } + + protected final List<String> getColumnNames() + { + return columnNames; + } + + protected final Map<Long, ITypeMapping> getTypeMappings() + { + return typeMappings; + } + + protected final Map<Long, String> getTagMap() + { + return tagMap; + } + + public void readValues(IDBStoreAccessor accessor, InternalCDORevision revision, int listChunk) + { + MoveableList<Object> list = revision.getList(getFeature()); + int valuesToRead = list.size(); + + if (listChunk != CDORevision.UNCHUNKED && listChunk < valuesToRead) + { + valuesToRead = listChunk; + } + + if (valuesToRead == 0) + { + // nothing to read take shortcut + return; + } + + if (TRACER.isEnabled()) + { + TRACER.format("Reading list values for feature {0}.{1} of {2}", getContainingClass().getName(), getFeature() //$NON-NLS-1$ + .getName(), revision); + } + + IPreparedStatementCache statementCache = accessor.getStatementCache(); + PreparedStatement pstmt = null; + ResultSet resultSet = null; + + IStoreChunkReader baseReader = null; + try + { + String sql = sqlSelectChunksPrefix + sqlOrderByIndex; + + CDOID id = revision.getID(); + int branchID = revision.getBranch().getID(); + + pstmt = statementCache.getPreparedStatement(sql, ReuseProbability.HIGH); + pstmt.setLong(1, CDOIDUtil.getLong(id)); + pstmt.setInt(2, branchID); + pstmt.setInt(3, revision.getVersion()); + pstmt.setInt(4, revision.getVersion()); + + pstmt.setMaxRows(valuesToRead); // optimization - don't read unneeded rows. + + resultSet = pstmt.executeQuery(); + + int currentIndex = 0; + + while (valuesToRead > 0 && resultSet.next()) + { + int index = resultSet.getInt(1); + if (index > currentIndex) + { + if (baseReader == null) + { + baseReader = createBaseChunkReader(accessor, id, branchID); + } + + baseReader.addRangedChunk(currentIndex, index); + if (TRACER.isEnabled()) + { + TRACER.format("Scheduling range {0}-{1} to be read from base revision", currentIndex, index); //$NON-NLS-1$ + } + + valuesToRead -= index - currentIndex; + currentIndex = index; + } + + Long tag = resultSet.getLong(2); + Object value = getTypeMapping(accessor, tag).readValue(resultSet); + if (TRACER.isEnabled()) + { + TRACER.format("Read value for index {0} from result set: {1}", currentIndex, value); //$NON-NLS-1$ + } + + list.set(currentIndex++, CDORevisionUtil.createFeatureMapEntry(getFeatureByTag(accessor, tag), value)); + valuesToRead--; + } + + if (valuesToRead > 0) + { + if (baseReader == null) + { + baseReader = createBaseChunkReader(accessor, id, branchID); + } + + baseReader.addRangedChunk(currentIndex, currentIndex + valuesToRead); + } + } + catch (SQLException ex) + { + throw new DBException(ex); + } + finally + { + DBUtil.close(resultSet); + statementCache.releasePreparedStatement(pstmt); + } + + if (baseReader != null) + { + if (TRACER.isEnabled()) + { + TRACER.format("Reading base revision chunks for featureMap {0}.{1} of {2} from base revision {3}", //$NON-NLS-1$ + getContainingClass().getName(), getFeature().getName(), revision, baseReader.getRevision()); + } + + List<Chunk> baseChunks = baseReader.executeRead(); + for (Chunk chunk : baseChunks) + { + int startIndex = chunk.getStartIndex(); + for (int i = 0; i < chunk.size(); i++) + { + list.set(startIndex + i, chunk.get(i)); + } + } + } + + if (TRACER.isEnabled()) + { + TRACER.format("Reading list values done for feature {0}.{1} of {2}", getContainingClass().getName(), //$NON-NLS-1$ + getFeature().getName(), revision); + } + } + + private void addFeature(IDBStoreAccessor accessor, Long tag) + { + EStructuralFeature modelFeature = getFeatureByTag(accessor, tag); + + ITypeMapping typeMapping = getMappingStrategy().createValueMapping(modelFeature); + String column = CDODBSchema.FEATUREMAP_VALUE + "_" + typeMapping.getDBType(); //$NON-NLS-1$ + + tagMap.put(tag, column); + typeMapping.setDBField(table, column); + typeMappings.put(tag, typeMapping); + } + + public final void readChunks(IDBStoreChunkReader chunkReader, List<Chunk> chunks, String where) + { + CDORevision revision = chunkReader.getRevision(); + if (TRACER.isEnabled()) + { + TRACER.format("Reading list chunk values for feature {0}.{1} of {2}", getContainingClass().getName(), //$NON-NLS-1$ + getFeature().getName(), revision); + } + + IPreparedStatementCache statementCache = chunkReader.getAccessor().getStatementCache(); + PreparedStatement pstmt = null; + ResultSet resultSet = null; + + IStoreChunkReader baseReader = null; + try + { + StringBuilder builder = new StringBuilder(sqlSelectChunksPrefix); + if (where != null) + { + builder.append(" AND "); //$NON-NLS-1$ + builder.append(where); + } + + builder.append(sqlOrderByIndex); + + String sql = builder.toString(); + pstmt = statementCache.getPreparedStatement(sql, ReuseProbability.LOW); + pstmt.setLong(1, CDOIDUtil.getLong(revision.getID())); + pstmt.setInt(2, revision.getBranch().getID()); + pstmt.setInt(3, revision.getVersion()); + pstmt.setInt(4, revision.getVersion()); + + resultSet = pstmt.executeQuery(); + + int nextDBIndex = Integer.MAX_VALUE; // next available DB index + if (resultSet.next()) + { + nextDBIndex = resultSet.getInt(1); + } + + for (Chunk chunk : chunks) + { + int startIndex = chunk.getStartIndex(); + int missingValueStartIndex = -1; + + for (int i = 0; i < chunk.size(); i++) + { + int nextListIndex = startIndex + i; // next expected list index + + if (nextDBIndex == nextListIndex) + { + // DB value is available. check first if missing indexes were present before. + if (missingValueStartIndex != -1) + { + // read missing indexes from missingValueStartIndex to currentIndex + if (baseReader == null) + { + baseReader = createBaseChunkReader(chunkReader.getAccessor(), chunkReader.getRevision().getID(), + chunkReader.getRevision().getBranch().getID()); + } + if (TRACER.isEnabled()) + { + TRACER.format( + "Scheduling range {0}-{1} to be read from base revision", missingValueStartIndex, nextListIndex); //$NON-NLS-1$ + } + + baseReader.addRangedChunk(missingValueStartIndex, nextListIndex); + + // reset missingValueStartIndex + missingValueStartIndex = -1; + } + + // now read value and set to chunk + Long tag = resultSet.getLong(2); + Object value = getTypeMapping(chunkReader.getAccessor(), tag).readValue(resultSet); + if (TRACER.isEnabled()) + { + TRACER.format("ChunkReader read value for index {0} from result set: {1}", nextDBIndex, value); //$NON-NLS-1$ + } + chunk.add(i, CDORevisionUtil.createFeatureMapEntry(getFeatureByTag(chunkReader.getAccessor(), tag), value)); + + // advance DB cursor and read next available index + if (resultSet.next()) + { + nextDBIndex = resultSet.getInt(1); + } + else + { + // no more DB indexes available, but we have to continue checking for gaps, therefore set to MAX_VALUE + nextDBIndex = Integer.MAX_VALUE; + } + } + else + { + // gap between next DB index and next list index detected. + // skip until end of chunk or until DB value becomes available + if (missingValueStartIndex == -1) + { + missingValueStartIndex = nextListIndex; + } + } + } + + // chunk complete. check for missing values at the end of the chunk. + if (missingValueStartIndex != -1) + { + // read missing indexes from missingValueStartIndex to last chunk index + if (baseReader == null) + { + baseReader = createBaseChunkReader(chunkReader.getAccessor(), chunkReader.getRevision().getID(), + chunkReader.getRevision().getBranch().getID()); + } + baseReader.addRangedChunk(missingValueStartIndex, chunk.getStartIndex() + chunk.size()); + } + } + } + catch (SQLException ex) + { + throw new DBException(ex); + } + finally + { + DBUtil.close(resultSet); + statementCache.releasePreparedStatement(pstmt); + } + + // now read missing values from base revision. + if (baseReader != null) + { + List<Chunk> baseChunks = baseReader.executeRead(); + + Iterator<Chunk> thisIterator = chunks.iterator(); + Chunk thisChunk = thisIterator.next(); + + for (Chunk baseChunk : baseChunks) + { + int baseStartIndex = baseChunk.getStartIndex(); + + while (baseStartIndex > thisChunk.getStartIndex() + thisChunk.size()) + { + // advance thisChunk, because it does not match baseChunk + thisChunk = thisIterator.next(); + } + + // baseChunk now corresponds to this chunk, but startIndex of baseChunk may be higher. + // therefore calculate offset + int offset = thisChunk.getStartIndex() - baseStartIndex; + + // and copy values. + for (int i = 0; i < baseChunk.size(); i++) + { + thisChunk.add(i + offset, baseChunk.get(i)); + } + } // finally, continue with the next baseChunk + + } + + if (TRACER.isEnabled()) + { + TRACER.format("Reading list chunk values done for feature {0}.{1} of {2}", getContainingClass().getName(), //$NON-NLS-1$ + getFeature(), revision); + } + } + + public void writeValues(IDBStoreAccessor accessor, InternalCDORevision revision) + { + CDOList values = revision.getList(getFeature()); + + int idx = 0; + for (Object element : values) + { + writeValue(accessor, revision, idx++, element); + } + + if (TRACER.isEnabled()) + { + TRACER.format("Writing done"); //$NON-NLS-1$ + } + } + + protected final void writeValue(IDBStoreAccessor accessor, CDORevision revision, int idx, Object value) + { + if (TRACER.isEnabled()) + { + TRACER + .format( + "Writing value for feature {0}.{1} index {2} of {3} : {4}", getContainingClass().getName(), getFeature(), idx, revision, value); //$NON-NLS-1$ + } + + addEntry(accessor, revision.getID(), revision.getBranch().getID(), revision.getVersion(), idx, value, + revision.getTimeStamp()); + } + + /** + * Get column name (lazy). + * + * @param tag + * The feature's MetaID in CDO + * @return the column name where the values are stored + */ + protected String getColumnName(IDBStoreAccessor accessor, Long tag) + { + String column = tagMap.get(tag); + if (column == null) + { + addFeature(accessor, tag); + column = tagMap.get(tag); + } + + return column; + } + + /** + * Get type mapping (lazy). + * + * @param tag + * The feature's MetaID in CDO + * @return the corresponding type mapping + */ + protected ITypeMapping getTypeMapping(IDBStoreAccessor accessor, Long tag) + { + ITypeMapping typeMapping = typeMappings.get(tag); + if (typeMapping == null) + { + addFeature(accessor, tag); + typeMapping = typeMappings.get(tag); + } + + return typeMapping; + } + + /** + * @param metaID + * @return the column name where the values are stored + */ + private EStructuralFeature getFeatureByTag(IDBStoreAccessor accessor, Long tag) + { + return (EStructuralFeature)getMappingStrategy().getStore().getMetaDataManager().getMetaInstance(accessor, tag); + } + + /** + * @param feature + * The EStructuralFeature + * @return The feature's MetaID in CDO + */ + protected Long getTagByFeature(IDBStoreAccessor accessor, EStructuralFeature feature, long created) + { + return getMappingStrategy().getStore().getMetaDataManager().getMetaID(accessor, feature, created); + } + + /** + * Clear a list of a given revision. + * + * @param accessor + * the accessor to use + * @param id + * the id of the revision from which to remove all items + */ + public void clearList(IDBStoreAccessor accessor, CDOID id, int branchId, int oldVersion, int newVersion, + int lastIndex, long timestamp) + { + IPreparedStatementCache statementCache = accessor.getStatementCache(); + PreparedStatement pstmtDeleteTemp = null; + PreparedStatement pstmtClear = null; + + try + { + // check for each index if the value exists in the current branch + for (int i = 0; i <= lastIndex; i++) + { + if (getValue(accessor, id, branchId, i, false) == null) + { + // if not, add a historic entry for missing ones. + addHistoricEntry(accessor, id, branchId, 0, newVersion, i, getValueFromBase(accessor, id, branchId, i), + timestamp); + } + } + + // clear rest of the list + pstmtClear = statementCache.getPreparedStatement(sqlClearList, ReuseProbability.HIGH); + pstmtClear.setInt(1, newVersion); + pstmtClear.setLong(2, CDOIDUtil.getLong(id)); + pstmtClear.setInt(3, branchId); + + int result = CDODBUtil.sqlUpdate(pstmtClear, false); + if (TRACER.isEnabled()) + { + TRACER.format("ClearList result: {0}", result); //$NON-NLS-1$ + } + } + catch (SQLException e) + { + throw new DBException(e); + } + finally + { + statementCache.releasePreparedStatement(pstmtDeleteTemp); + statementCache.releasePreparedStatement(pstmtClear); + } + } + + public void objectDetached(IDBStoreAccessor accessor, CDOID id, long revised) + { + InternalCDORevision revision = (InternalCDORevision)accessor.getTransaction().getRevision(id); + int branchId = accessor.getTransaction().getBranch().getID(); + + if (TRACER.isEnabled()) + { + TRACER.format("objectDetached {1}", revision); //$NON-NLS-1$ + } + + clearList(accessor, id, branchId, revision.getVersion(), FINAL_VERSION, revision.getList(getFeature()).size() - 1, + revised); + } + + public void processDelta(final IDBStoreAccessor accessor, final CDOID id, final int branchId, int oldVersion, + final int newVersion, long created, CDOListFeatureDelta delta) + { + List<CDOFeatureDelta> listChanges = delta.getListChanges(); + if (listChanges.size() == 0) + { + // nothing to do. + return; + } + + InternalCDORevision originalRevision = (InternalCDORevision)accessor.getTransaction().getRevision(id); + int oldListSize = originalRevision.getList(getFeature()).size(); + + if (TRACER.isEnabled()) + { + TRACER.format("ListTableMapping.processDelta for revision {0} - previous list size: {1}", originalRevision, //$NON-NLS-1$ + oldListSize); + } + + // let the visitor collect the changes + ListDeltaVisitor visitor = new ListDeltaVisitor(accessor, originalRevision, branchId, oldVersion, newVersion, + created); + + if (TRACER.isEnabled()) + { + TRACER.format("Processing deltas..."); //$NON-NLS-1$ + } + + // optimization: it's only necessary to process deltas + // starting with the last feature delta which clears the list + // (any operation before the clear is cascaded by it anyway) + int index = listChanges.size() - 1; + while (index > 0) + { + CDOFeatureDelta listDelta = listChanges.get(index); + if (listDelta instanceof CDOClearFeatureDelta || listDelta instanceof CDOUnsetFeatureDelta) + { + break; + } + index--; + } + while (index < listChanges.size()) + { + listChanges.get(index++).accept(visitor); + } + } + + private class ListDeltaVisitor implements CDOFeatureDeltaVisitor + { + private IDBStoreAccessor accessor; + + private InternalCDORevision originalRevision; + + private CDOID id; + + private int branchID; + + private int oldVersion; + + private int newVersion; + + private int lastIndex; + + private long timestamp; + + public ListDeltaVisitor(IDBStoreAccessor accessor, InternalCDORevision originalRevision, int targetBranchID, + int oldVersion, int newVersion, long timestamp) + { + this.accessor = accessor; + this.originalRevision = originalRevision; + id = this.originalRevision.getID(); + branchID = targetBranchID; + this.oldVersion = oldVersion; + this.newVersion = newVersion; + lastIndex = originalRevision.getList(getFeature()).size() - 1; + this.timestamp = timestamp; + } + + public void visit(CDOMoveFeatureDelta delta) + { + int fromIdx = delta.getOldPosition(); + int toIdx = delta.getNewPosition(); + + if (TRACER.isEnabled()) + { + TRACER.format("Delta Moving: {0} to {1}", fromIdx, toIdx); //$NON-NLS-1$ + } + + Object value = getValue(accessor, id, branchID, fromIdx, true); + + // remove the item + removeEntry(accessor, id, branchID, oldVersion, newVersion, fromIdx, timestamp); + + // adjust indexes and shift either up or down + if (fromIdx < toIdx) + { + moveOneUp(accessor, id, branchID, oldVersion, newVersion, fromIdx + 1, toIdx); + } + else + { // fromIdx > toIdx here + moveOneDown(accessor, id, branchID, oldVersion, newVersion, toIdx, fromIdx - 1); + } + + // create the item + addEntry(accessor, id, branchID, newVersion, toIdx, value, timestamp); + } + + public void visit(CDOAddFeatureDelta delta) + { + int startIndex = delta.getIndex(); + int endIndex = lastIndex; + + if (TRACER.isEnabled()) + { + TRACER.format("Delta Adding at: {0}", startIndex); //$NON-NLS-1$ + } + + if (startIndex <= endIndex) + { + // make room for the new item + moveOneDown(accessor, id, branchID, oldVersion, newVersion, startIndex, endIndex); + } + + // create the item + addEntry(accessor, id, branchID, newVersion, startIndex, delta.getValue(), timestamp); + + ++lastIndex; + } + + public void visit(CDORemoveFeatureDelta delta) + { + int startIndex = delta.getIndex(); + int endIndex = lastIndex; + + if (TRACER.isEnabled()) + { + TRACER.format("Delta Removing at: {0}", startIndex); //$NON-NLS-1$ + } + + // remove the item + removeEntry(accessor, id, branchID, oldVersion, newVersion, startIndex, timestamp); + + // make room for the new item + moveOneUp(accessor, id, branchID, oldVersion, newVersion, startIndex + 1, endIndex); + + --lastIndex; + } + + public void visit(CDOSetFeatureDelta delta) + { + int index = delta.getIndex(); + + if (TRACER.isEnabled()) + { + TRACER.format("Delta Setting at: {0}", index); //$NON-NLS-1$ + } + + // remove the item + removeEntry(accessor, id, branchID, oldVersion, newVersion, index, timestamp); + + // create the item + addEntry(accessor, id, branchID, newVersion, index, delta.getValue(), timestamp); + } + + public void visit(CDOUnsetFeatureDelta delta) + { + if (delta.getFeature().isUnsettable()) + { + throw new ImplementationError("Should not be called"); //$NON-NLS-1$ + } + + if (TRACER.isEnabled()) + { + TRACER.format("Delta Unsetting"); //$NON-NLS-1$ + } + + clearList(accessor, id, branchID, oldVersion, newVersion, lastIndex, timestamp); + lastIndex = -1; + } + + public void visit(CDOListFeatureDelta delta) + { + throw new ImplementationError("Should not be called"); //$NON-NLS-1$ + } + + public void visit(CDOClearFeatureDelta delta) + { + if (TRACER.isEnabled()) + { + TRACER.format("Delta Clearing"); //$NON-NLS-1$ + } + + clearList(accessor, id, branchID, oldVersion, newVersion, lastIndex, timestamp); + lastIndex = -1; + } + + public void visit(CDOContainerFeatureDelta delta) + { + throw new ImplementationError("Should not be called"); //$NON-NLS-1$ + } + + private void moveOneUp(IDBStoreAccessor accessor, CDOID id, int branchId, int oldVersion, int newVersion, + int startIndex, int endIndex) + { + IPreparedStatementCache statementCache = accessor.getStatementCache(); + PreparedStatement pstmt = null; + + try + { + pstmt = statementCache.getPreparedStatement(sqlUpdateIndex, ReuseProbability.HIGH); + + for (int index = startIndex; index <= endIndex; ++index) + { + if (TRACER.isEnabled()) + { + TRACER.format("moveOneUp moving: {0} -> {1}", index, index - 1); //$NON-NLS-1$ + } + + int stmtIndex = 1; + pstmt.setInt(stmtIndex++, index - 1); + pstmt.setLong(stmtIndex++, CDOIDUtil.getLong(id)); + pstmt.setInt(stmtIndex++, branchId); + pstmt.setInt(stmtIndex++, newVersion); + pstmt.setInt(stmtIndex++, index); + + int result = CDODBUtil.sqlUpdate(pstmt, false); + switch (result) + { + case 1: + // entry for current revision was already present. + // index update succeeded. + if (TRACER.isEnabled()) + { + TRACER.format("moveOneUp updated: {0} -> {1}", index, index - 1); //$NON-NLS-1$ + } + + break; + case 0: + Object value = getValue(accessor, id, branchId, index, false); + + if (value != null) + { + if (TRACER.isEnabled()) + { + TRACER.format("moveOneUp remove: {0}", index); //$NON-NLS-1$ + } + + removeEntry(accessor, id, branchId, oldVersion, newVersion, index, timestamp); + } + else + { + value = getValueFromBase(accessor, id, branchId, index); + { + TRACER.format("moveOneUp add historic entry at: {0}", index); //$NON-NLS-1$ + } + + addHistoricEntry(accessor, id, branchId, 0, newVersion, index, value, timestamp); + } + + if (TRACER.isEnabled()) + { + TRACER.format("moveOneUp add: {0}", index - 1); //$NON-NLS-1$ + } + + addEntry(accessor, id, branchId, newVersion, index - 1, value, timestamp); + break; + default: + if (TRACER.isEnabled()) + { + TRACER.format("moveOneUp Too many results: {0} -> {1}: {2}", index, index + 1, result); //$NON-NLS-1$ + } + + throw new DBException("Too many results"); //$NON-NLS-1$ + } + } + } + catch (SQLException e) + { + throw new DBException(e); + } + finally + { + statementCache.releasePreparedStatement(pstmt); + } + } + + private void moveOneDown(IDBStoreAccessor accessor, CDOID id, int branchId, int oldVersion, int newVersion, + int startIndex, int endIndex) + { + IPreparedStatementCache statementCache = accessor.getStatementCache(); + PreparedStatement pstmt = null; + + try + { + pstmt = statementCache.getPreparedStatement(sqlUpdateIndex, ReuseProbability.HIGH); + for (int index = endIndex; index >= startIndex; --index) + { + if (TRACER.isEnabled()) + { + TRACER.format("moveOneDown moving: {0} -> {1}", index, index + 1); //$NON-NLS-1$ + } + + int stmtIndex = 1; + pstmt.setInt(stmtIndex++, index + 1); + pstmt.setLong(stmtIndex++, CDOIDUtil.getLong(id)); + pstmt.setInt(stmtIndex++, branchId); + pstmt.setInt(stmtIndex++, newVersion); + pstmt.setInt(stmtIndex++, index); + + int result = CDODBUtil.sqlUpdate(pstmt, false); + switch (result) + { + case 1: + // entry for current revision was already present. + // index update succeeded. + if (TRACER.isEnabled()) + { + TRACER.format("moveOneDown updated: {0} -> {1}", index, index + 1); //$NON-NLS-1$ + } + + break; + case 0: + Object value = getValue(accessor, id, branchId, index, false); + if (value != null) + { + if (TRACER.isEnabled()) + { + TRACER.format("moveOneDown remove: {0}", index); //$NON-NLS-1$ + } + + removeEntry(accessor, id, branchId, oldVersion, newVersion, index, timestamp); + } + else + { + value = getValueFromBase(accessor, id, branchId, index); + { + TRACER.format("moveOneDown add historic entry at: {0}", index); //$NON-NLS-1$ + } + + addHistoricEntry(accessor, id, branchId, 0, newVersion, index, value, timestamp); + } + + addEntry(accessor, id, branchId, newVersion, index + 1, value, timestamp); + break; + default: + if (TRACER.isEnabled()) + { + TRACER.format("moveOneDown Too many results: {0} -> {1}: {2}", index, index + 1, result); //$NON-NLS-1$ + } + + throw new DBException("Too many results"); //$NON-NLS-1$ + } + } + } + catch (SQLException e) + { + throw new DBException(e); + } + finally + { + statementCache.releasePreparedStatement(pstmt); + } + } + } + + private void addEntry(IDBStoreAccessor accessor, CDOID id, int branchId, int version, int index, Object value, + long timestamp) + { + IPreparedStatementCache statementCache = accessor.getStatementCache(); + PreparedStatement pstmt = null; + + if (TRACER.isEnabled()) + { + TRACER.format("Adding value for feature() {0}.{1} index {2} of {3}v{4} : {5}", //$NON-NLS-1$ + getContainingClass().getName(), getFeature().getName(), index, id, version, value); + } + + try + { + FeatureMap.Entry entry = (FeatureMap.Entry)value; + EStructuralFeature entryFeature = entry.getEStructuralFeature(); + Long tag = getTagByFeature(accessor, entryFeature, timestamp); + String column = getColumnName(accessor, tag); + + pstmt = statementCache.getPreparedStatement(sqlInsert, ReuseProbability.HIGH); + + int stmtIndex = 1; + pstmt.setLong(stmtIndex++, CDOIDUtil.getLong(id)); + pstmt.setInt(stmtIndex++, branchId); + pstmt.setInt(stmtIndex++, version); + pstmt.setNull(stmtIndex++, DBType.INTEGER.getCode()); // versionRemoved + + for (int i = 0; i < columnNames.size(); i++) + { + if (columnNames.get(i).equals(column)) + { + getTypeMapping(accessor, tag).setValue(pstmt, stmtIndex++, entry.getValue()); + } + else + { + pstmt.setNull(stmtIndex++, getDBTypes().get(i).getCode()); + } + } + + pstmt.setInt(stmtIndex++, index); + pstmt.setLong(stmtIndex++, tag); + CDODBUtil.sqlUpdate(pstmt, true); + } + catch (SQLException e) + { + throw new DBException(e); + } + catch (IllegalStateException e) + { + throw new DBException(e); + } + finally + { + statementCache.releasePreparedStatement(pstmt); + } + } + + private void addHistoricEntry(IDBStoreAccessor accessor, CDOID id, int branchId, int versionAdded, + int versionRemoved, int index, Object value, long timestamp) + { + IPreparedStatementCache statementCache = accessor.getStatementCache(); + PreparedStatement pstmt = null; + + if (TRACER.isEnabled()) + { + TRACER.format( + "Adding historic value for feature {0}.{1} index {2} of {3}:{4}v{5}-v{6} : {7}", //$NON-NLS-1$ + getContainingClass().getName(), getFeature().getName(), index, id, branchId, versionAdded, versionRemoved, + value); + } + + try + { + FeatureMap.Entry entry = (FeatureMap.Entry)value; + EStructuralFeature entryFeature = entry.getEStructuralFeature(); + Long tag = getTagByFeature(accessor, entryFeature, timestamp); + String column = getColumnName(accessor, tag); + + pstmt = statementCache.getPreparedStatement(sqlInsert, ReuseProbability.HIGH); + + int stmtIndex = 1; + pstmt.setLong(stmtIndex++, CDOIDUtil.getLong(id)); + pstmt.setInt(stmtIndex++, branchId); + pstmt.setInt(stmtIndex++, versionAdded); + pstmt.setNull(stmtIndex++, versionRemoved); + pstmt.setInt(stmtIndex++, index); + + for (int i = 0; i < columnNames.size(); i++) + { + if (columnNames.get(i).equals(column)) + { + getTypeMapping(accessor, tag).setValue(pstmt, stmtIndex++, entry.getValue()); + } + else + { + pstmt.setNull(stmtIndex++, getDBTypes().get(i).getCode()); + } + } + + pstmt.setInt(stmtIndex++, index); + pstmt.setLong(stmtIndex++, tag); + CDODBUtil.sqlUpdate(pstmt, true); + } + catch (SQLException e) + { + throw new DBException(e); + } + catch (IllegalStateException e) + { + throw new DBException(e); + } + finally + { + statementCache.releasePreparedStatement(pstmt); + } + } + + private void removeEntry(IDBStoreAccessor accessor, CDOID id, int branchId, int oldVersion, int newVersion, + int index, long timestamp) + { + IPreparedStatementCache statementCache = accessor.getStatementCache(); + PreparedStatement pstmt = null; + + if (TRACER.isEnabled()) + { + TRACER.format("Removing value for feature() {0}.{1} index {2} of {3}v{4}", //$NON-NLS-1$ + getContainingClass().getName(), getFeature().getName(), index, id, newVersion); + } + + try + { + // try to delete a temporary entry first + pstmt = statementCache.getPreparedStatement(sqlDeleteEntry, ReuseProbability.HIGH); + + int stmtIndex = 1; + pstmt.setLong(stmtIndex++, CDOIDUtil.getLong(id)); + pstmt.setInt(stmtIndex++, branchId); + pstmt.setInt(stmtIndex++, index); + pstmt.setInt(stmtIndex++, newVersion); + + int result = CDODBUtil.sqlUpdate(pstmt, false); + if (result == 1) + { + if (TRACER.isEnabled()) + { + TRACER.format("removeEntry deleted: {0}", index); //$NON-NLS-1$ + } + } + else if (result > 1) + { + if (TRACER.isEnabled()) + { + TRACER.format("removeEntry Too many results: {0}: {1}", index, result); //$NON-NLS-1$ + } + + throw new DBException("Too many results"); //$NON-NLS-1$ + } + else + { + // no temporary entry found, so mark the entry as removed + statementCache.releasePreparedStatement(pstmt); + pstmt = statementCache.getPreparedStatement(sqlRemoveEntry, ReuseProbability.HIGH); + + stmtIndex = 1; + pstmt.setInt(stmtIndex++, newVersion); + pstmt.setLong(stmtIndex++, CDOIDUtil.getLong(id)); + pstmt.setInt(stmtIndex++, branchId); + pstmt.setInt(stmtIndex++, index); + result = CDODBUtil.sqlUpdate(pstmt, false); + + if (result == 0) + { + // no entry removed -> this means that we are in a branch and + // the entry has not been modified since the branch fork. + // therefore, we have to copy the base value and mark it as removed + Object value = getValueFromBase(accessor, id, branchId, index); + addHistoricEntry(accessor, id, branchId, 0, newVersion, index, value, timestamp); + } + } + } + catch (SQLException e) + { + if (TRACER.isEnabled()) + { + TRACER.format("Removing value for feature() {0}.{1} index {2} of {3}v{4} FAILED {5}", //$NON-NLS-1$ + getContainingClass().getName(), getFeature().getName(), index, id, newVersion, e.getMessage()); + } + + throw new DBException(e); + } + catch (IllegalStateException e) + { + if (TRACER.isEnabled()) + { + TRACER.format("Removing value for feature() {0}.{1} index {2} of {3}v{4} FAILED {5}", //$NON-NLS-1$ + getContainingClass().getName(), getFeature().getName(), index, id, newVersion, e.getMessage()); + } + + throw new DBException(e); + } + finally + { + statementCache.releasePreparedStatement(pstmt); + } + } + + private FeatureMap.Entry getValue(IDBStoreAccessor accessor, CDOID id, int branchId, int index, boolean getFromBase) + { + IPreparedStatementCache statementCache = accessor.getStatementCache(); + PreparedStatement pstmt = null; + FeatureMap.Entry result = null; + + try + { + pstmt = statementCache.getPreparedStatement(sqlGetValue, ReuseProbability.HIGH); + + int stmtIndex = 1; + pstmt.setLong(stmtIndex++, CDOIDUtil.getLong(id)); + pstmt.setInt(stmtIndex++, branchId); + pstmt.setInt(stmtIndex++, index); + + ResultSet resultSet = pstmt.executeQuery(); + if (resultSet.next()) + { + Long tag = resultSet.getLong(1); + Object value = getTypeMapping(accessor, tag).readValue(resultSet); + result = CDORevisionUtil.createFeatureMapEntry(getFeatureByTag(accessor, tag), value); + } + else + { + // value is not in this branch. + // -> read from base revision + if (getFromBase) + { + result = getValueFromBase(accessor, id, branchId, index); + } // else: result remains null + } + if (TRACER.isEnabled()) + { + TRACER.format("Read value (index {0}) from result set: {1}", index, result); //$NON-NLS-1$ + } + } + catch (SQLException e) + { + throw new DBException(e); + } + finally + { + statementCache.releasePreparedStatement(pstmt); + } + + return result; + } + + /** + * Read a single value (at a given index) from the base revision + * + * @param accessor + * the DBStoreAccessor + * @param id + * the ID of the revision + * @param branchID + * the ID of the current (child) branch + * @param index + * the index to read the value from + * @return the value which is at index <code>index</code> in revision with ID <code>id</code> in the parent branch at + * the base of this branch (indicated by <code>branchID</code>). + */ + private FeatureMap.Entry getValueFromBase(IDBStoreAccessor accessor, CDOID id, int branchID, int index) + { + IStoreChunkReader chunkReader = createBaseChunkReader(accessor, id, branchID); + chunkReader.addSimpleChunk(index); + List<Chunk> chunks = chunkReader.executeRead(); + return (FeatureMap.Entry)chunks.get(0).get(0); + } + + private IStoreChunkReader createBaseChunkReader(IDBStoreAccessor accessor, CDOID id, int branchID) + { + CDOBranchPoint base = accessor.getStore().getRepository().getBranchManager().getBranch(branchID).getBase(); + InternalCDORevision baseRevision = (InternalCDORevision)accessor.getStore().getRepository().getRevisionManager() + .getRevision(id, base, /* referenceChunk = */0, /* prefetchDepth = */CDORevision.DEPTH_NONE, true); + IStoreChunkReader chunkReader = accessor.createChunkReader(baseRevision, getFeature()); + return chunkReader; + } + + public final boolean queryXRefs(IDBStoreAccessor accessor, String mainTableName, String mainTableWhere, + QueryXRefsContext context, String idString) + { + // must never be called (a feature map is not associated with an EReference feature, so XRefs are nor supported + // here) + throw new ImplementationError("Should never be called!"); + } +} diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/DelegatingObjectTypeMapper.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/DelegatingObjectTypeMapper.java index b7211b1ee0..23fd28072e 100644 --- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/DelegatingObjectTypeMapper.java +++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/DelegatingObjectTypeMapper.java @@ -57,7 +57,7 @@ public abstract class DelegatingObjectTypeMapper extends AbstractObjectTypeMappe if (type != null) { long classID = type; - EClass eClass = (EClass)getMetaDataManager().getMetaInstance(classID); + EClass eClass = (EClass)getMetaDataManager().getMetaInstance(accessor, classID); return new CDOClassifierRef(eClass); } @@ -67,7 +67,7 @@ public abstract class DelegatingObjectTypeMapper extends AbstractObjectTypeMappe public void putObjectType(IDBStoreAccessor accessor, long timeStamp, CDOID id, EClass type) { long longId = CDOIDUtil.getLong(id); - long classID = getMetaDataManager().getMetaID(type); + long classID = getMetaDataManager().getMetaID(accessor, type, timeStamp); doPutObjectType(longId, classID); delegate.putObjectType(accessor, timeStamp, id, type); diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/HorizontalAuditClassMapping.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/HorizontalAuditClassMapping.java index 2c5d4e2ada..bb349063fb 100644 --- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/HorizontalAuditClassMapping.java +++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/HorizontalAuditClassMapping.java @@ -181,8 +181,6 @@ public class HorizontalAuditClassMapping extends AbstractHorizontalClassMapping builder.append(", "); //$NON-NLS-1$ builder.append(CDODBSchema.ATTRIBUTES_VERSION); builder.append(", "); //$NON-NLS-1$ - builder.append(CDODBSchema.ATTRIBUTES_CLASS); - builder.append(", "); //$NON-NLS-1$ builder.append(CDODBSchema.ATTRIBUTES_CREATED); builder.append(", "); //$NON-NLS-1$ builder.append(CDODBSchema.ATTRIBUTES_REVISED); @@ -217,7 +215,7 @@ public class HorizontalAuditClassMapping extends AbstractHorizontalClassMapping } } - builder.append(") VALUES (?, ?, ?, ?, ?, ?, ?, ?"); //$NON-NLS-1$ + builder.append(") VALUES (?, ?, ?, ?, ?, ?, ?"); //$NON-NLS-1$ for (int i = 0; i < getValueMappings().size(); i++) { @@ -449,7 +447,6 @@ public class HorizontalAuditClassMapping extends AbstractHorizontalClassMapping stmt = statementCache.getPreparedStatement(sqlInsertAttributes, ReuseProbability.HIGH); stmt.setLong(col++, CDOIDUtil.getLong(revision.getID())); stmt.setInt(col++, revision.getVersion()); - stmt.setLong(col++, accessor.getStore().getMetaDataManager().getMetaID(revision.getEClass())); stmt.setLong(col++, commitTime); stmt.setLong(col++, revision.getRevised()); stmt.setLong(col++, @@ -521,7 +518,6 @@ public class HorizontalAuditClassMapping extends AbstractHorizontalClassMapping stmt.setLong(col++, CDOIDUtil.getLong(id)); stmt.setInt(col++, -version); // cdo_version - stmt.setLong(col++, accessor.getStore().getMetaDataManager().getMetaID(getEClass())); stmt.setLong(col++, timeStamp); // cdo_created stmt.setLong(col++, DBStore.UNSPECIFIED_DATE); // cdo_revised stmt.setLong(col++, DBStore.NULL); // resource diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/HorizontalBranchingClassMapping.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/HorizontalBranchingClassMapping.java index 78a0b2610f..ace65f7d01 100644 --- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/HorizontalBranchingClassMapping.java +++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/HorizontalBranchingClassMapping.java @@ -304,8 +304,6 @@ public class HorizontalBranchingClassMapping extends AbstractHorizontalClassMapp builder.append(", "); //$NON-NLS-1$ builder.append(CDODBSchema.ATTRIBUTES_BRANCH); builder.append(", "); //$NON-NLS-1$ - builder.append(CDODBSchema.ATTRIBUTES_CLASS); - builder.append(", "); //$NON-NLS-1$ builder.append(CDODBSchema.ATTRIBUTES_CREATED); builder.append(", "); //$NON-NLS-1$ builder.append(CDODBSchema.ATTRIBUTES_REVISED); @@ -340,7 +338,7 @@ public class HorizontalBranchingClassMapping extends AbstractHorizontalClassMapp } } - builder.append(") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?"); //$NON-NLS-1$ + builder.append(") VALUES (?, ?, ?, ?, ?, ?, ?, ?"); //$NON-NLS-1$ for (int i = 0; i < getValueMappings().size(); i++) { @@ -604,7 +602,6 @@ public class HorizontalBranchingClassMapping extends AbstractHorizontalClassMapp stmt.setLong(col++, CDOIDUtil.getLong(revision.getID())); stmt.setInt(col++, revision.getVersion()); stmt.setInt(col++, revision.getBranch().getID()); - stmt.setLong(col++, accessor.getStore().getMetaDataManager().getMetaID(revision.getEClass())); stmt.setLong(col++, commitTime); stmt.setLong(col++, revision.getRevised()); stmt.setLong(col++, @@ -675,7 +672,6 @@ public class HorizontalBranchingClassMapping extends AbstractHorizontalClassMapp stmt.setLong(col++, CDOIDUtil.getLong(id)); stmt.setInt(col++, -version); // cdo_version stmt.setInt(col++, branch.getID()); - stmt.setLong(col++, accessor.getStore().getMetaDataManager().getMetaID(getEClass())); stmt.setLong(col++, timeStamp); // cdo_created stmt.setLong(col++, DBStore.UNSPECIFIED_DATE); // cdo_revised stmt.setLong(col++, DBStore.NULL); // resource diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/HorizontalNonAuditClassMapping.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/HorizontalNonAuditClassMapping.java index af16f15e53..d9423f6dc3 100644 --- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/HorizontalNonAuditClassMapping.java +++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/HorizontalNonAuditClassMapping.java @@ -159,8 +159,6 @@ public class HorizontalNonAuditClassMapping extends AbstractHorizontalClassMappi builder.append(", "); //$NON-NLS-1$ builder.append(CDODBSchema.ATTRIBUTES_VERSION); builder.append(", "); //$NON-NLS-1$ - builder.append(CDODBSchema.ATTRIBUTES_CLASS); - builder.append(", "); //$NON-NLS-1$ builder.append(CDODBSchema.ATTRIBUTES_CREATED); builder.append(", "); //$NON-NLS-1$ builder.append(CDODBSchema.ATTRIBUTES_REVISED); @@ -195,8 +193,7 @@ public class HorizontalNonAuditClassMapping extends AbstractHorizontalClassMappi } } - builder.append(") VALUES (?, ?, "); //$NON-NLS-1$ - builder.append("?, ?, ?, ?, ?, ?"); //$NON-NLS-1$ + builder.append(") VALUES (?, ?, ?, ?, ?, ?, ?"); //$NON-NLS-1$ for (int i = 0; i < getValueMappings().size(); i++) { builder.append(", ?"); //$NON-NLS-1$ @@ -266,7 +263,6 @@ public class HorizontalNonAuditClassMapping extends AbstractHorizontalClassMappi stmt = statementCache.getPreparedStatement(sqlInsertAttributes, ReuseProbability.HIGH); stmt.setLong(col++, CDOIDUtil.getLong(revision.getID())); stmt.setInt(col++, revision.getVersion()); - stmt.setLong(col++, accessor.getStore().getMetaDataManager().getMetaID(revision.getEClass())); stmt.setLong(col++, commitTime); stmt.setLong(col++, revision.getRevised()); stmt.setLong(col++, diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/NonAuditFeatureMapTableMapping.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/NonAuditFeatureMapTableMapping.java index 7add5d558e..96672ca40a 100644 --- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/NonAuditFeatureMapTableMapping.java +++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/NonAuditFeatureMapTableMapping.java @@ -247,13 +247,13 @@ public class NonAuditFeatureMapTableMapping extends AbstractFeatureMapTableMappi * @param value * the value to insert. */ - public void insertListItem(IDBStoreAccessor accessor, CDOID id, int index, Object value) + public void insertListItem(IDBStoreAccessor accessor, CDOID id, int index, Object value, long timestamp) { move1up(accessor, id, index, UNBOUNDED_MOVE); - insertValue(accessor, id, index, value); + insertValue(accessor, id, index, value, timestamp); } - private void insertValue(IDBStoreAccessor accessor, CDOID id, int index, Object value) + private void insertValue(IDBStoreAccessor accessor, CDOID id, int index, Object value, long timestamp) { PreparedStatement stmt = null; @@ -261,8 +261,8 @@ public class NonAuditFeatureMapTableMapping extends AbstractFeatureMapTableMappi { FeatureMap.Entry entry = (FeatureMap.Entry)value; EStructuralFeature entryFeature = entry.getEStructuralFeature(); - Long tag = getTagByFeature(entryFeature); - String column = getColumnName(tag); + Long tag = getTagByFeature(accessor, entryFeature, timestamp); + String column = getColumnName(accessor, tag); String sql = sqlInsert; @@ -275,7 +275,7 @@ public class NonAuditFeatureMapTableMapping extends AbstractFeatureMapTableMappi { if (getColumnNames().get(i).equals(column)) { - getTypeMapping(tag).setValue(stmt, stmtIndex++, entry.getValue()); + getTypeMapping(accessor, tag).setValue(stmt, stmtIndex++, entry.getValue()); } else { @@ -470,15 +470,15 @@ public class NonAuditFeatureMapTableMapping extends AbstractFeatureMapTableMappi * @param value * the value to be set. */ - public void setListItem(IDBStoreAccessor accessor, CDOID id, int index, Object value) + public void setListItem(IDBStoreAccessor accessor, CDOID id, int index, Object value, long timestamp) { PreparedStatement stmt = null; FeatureMap.Entry entry = (FeatureMap.Entry)value; EStructuralFeature entryFeature = entry.getEStructuralFeature(); - Long tag = getTagByFeature(entryFeature); - String column = getColumnName(tag); - ITypeMapping mapping = getTypeMapping(tag); + Long tag = getTagByFeature(accessor, entryFeature, timestamp); + String column = getColumnName(accessor, tag); + ITypeMapping mapping = getTypeMapping(accessor, tag); try { @@ -515,7 +515,7 @@ public class NonAuditFeatureMapTableMapping extends AbstractFeatureMapTableMappi } public void processDelta(final IDBStoreAccessor accessor, final CDOID id, final int branchId, int oldVersion, - final int newVersion, long created, CDOListFeatureDelta listDelta) + final int newVersion, final long created, CDOListFeatureDelta listDelta) { CDOFeatureDeltaVisitor visitor = new CDOFeatureDeltaVisitor() { @@ -526,7 +526,7 @@ public class NonAuditFeatureMapTableMapping extends AbstractFeatureMapTableMappi public void visit(CDOAddFeatureDelta delta) { - insertListItem(accessor, id, delta.getIndex(), delta.getValue()); + insertListItem(accessor, id, delta.getIndex(), delta.getValue(), created); } public void visit(CDORemoveFeatureDelta delta) @@ -536,7 +536,7 @@ public class NonAuditFeatureMapTableMapping extends AbstractFeatureMapTableMappi public void visit(CDOSetFeatureDelta delta) { - setListItem(accessor, id, delta.getIndex(), delta.getValue()); + setListItem(accessor, id, delta.getIndex(), delta.getValue(), created); } public void visit(CDOUnsetFeatureDelta delta) diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/ObjectTypeTable.java b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/ObjectTypeTable.java index fd7e5e9cc4..0839d79437 100644 --- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/ObjectTypeTable.java +++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/mapping/horizontal/ObjectTypeTable.java @@ -88,7 +88,7 @@ public class ObjectTypeTable extends AbstractObjectTypeMapper } long classID = resultSet.getLong(1); - EClass eClass = (EClass)getMetaDataManager().getMetaInstance(classID); + EClass eClass = (EClass)getMetaDataManager().getMetaInstance(accessor, classID); return new CDOClassifierRef(eClass); } catch (SQLException ex) @@ -109,7 +109,7 @@ public class ObjectTypeTable extends AbstractObjectTypeMapper { stmt = accessor.getStatementCache().getPreparedStatement(sqlInsert, ReuseProbability.MAX); stmt.setLong(1, CDOIDUtil.getLong(id)); - stmt.setLong(2, getMetaDataManager().getMetaID(type)); + stmt.setLong(2, getMetaDataManager().getMetaID(accessor, type, timeStamp)); stmt.setLong(3, timeStamp); DBUtil.trace(stmt.toString()); int result = stmt.executeUpdate(); diff --git a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/messages/messages.properties b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/messages/messages.properties index e551313dbc..a225827d95 100644 --- a/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/messages/messages.properties +++ b/plugins/org.eclipse.emf.cdo.server.db/src/org/eclipse/emf/cdo/server/internal/db/messages/messages.properties @@ -11,7 +11,7 @@ DBStore.0=dbConnectionProvider is null DBStore.1=dbAdapter is null -DBStore.10=Repaired after crash: maxObjectID={0}, maxMetaID={1} +DBStore.10=Repaired after crash: lastObjectID={0}, nextLocalObjectID={1}, lastBranchID={2}, lastCommitTime={3}, lastNonLocalCommitTime={4} DBStore.2=mappingStrategy is null DBStore.7=AuditSupport of MappingStrategy and Store does not match. Please check configuration. DBStore.8=First start: {0,date} {0,time} diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/mappings/meta.hbm.xml b/plugins/org.eclipse.emf.cdo.server.hibernate/mappings/meta.hbm.xml index 602ac165cf..2bbfdc284a 100644 --- a/plugins/org.eclipse.emf.cdo.server.hibernate/mappings/meta.hbm.xml +++ b/plugins/org.eclipse.emf.cdo.server.hibernate/mappings/meta.hbm.xml @@ -1,9 +1,8 @@ <?xml version="1.0"?> <!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="org.eclipse.emf.cdo.internal.common.model"> - - <class name="org.eclipse.emf.cdo.server.internal.hibernate.HibernateCDOPackageUnitDTO" table="cdo_package_unit" lazy="false" entity-name="CDOPackageUnit"> + <class name="org.eclipse.emf.cdo.server.internal.hibernate.HibernateCDOPackageUnitDTO" table="cdo_package_unit" lazy="false" entity-name="CDOPackageUnit"> <id name="nsUri" access="property"/> <property name="originalType" access="field" /> @@ -12,7 +11,7 @@ <!-- Need to set an explicit length for derby: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2614 setting it to an arbitrary large value - --> + --> <property name="EPackageBlob" access="property" type="blob" length="65500"/> <array name="packageInfos" cascade="all, delete-orphan" access="field"> @@ -20,28 +19,21 @@ <list-index column="idx"/> <one-to-many class="CDOPackageInfoImpl"/> </array> - + </class> - - <class name="CDOPackageInfoImpl" table="cdo_package_info" lazy="false"> + <class name="CDOPackageInfoImpl" table="cdo_package_info" lazy="false"> <id name="packageURI" access="property"/> - <property name="parentURI" length="255" access="field" /> - <property name="metaIDRange" type="org.eclipse.emf.cdo.server.internal.hibernate.tuplizer.CDOIDMetaRangeUserType" - not-null="true" access="field"> - <column name="metaIDStart" /> - <column name="metaIDSize" /> - </property> </class> - + <class name="org.eclipse.emf.cdo.server.internal.hibernate.SystemInformation" table="cdo_system_information" lazy="false"> <id column="id" type="int"> <generator class="native" /> </id> <property name="creationTime"/> </class> - + <class name="org.eclipse.emf.cdo.server.internal.hibernate.SystemProperty" table="cdo_system_property" lazy="false"> <id name="name" type="string" length="255"/> <property name="value" type="text" length="2000"/> diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/ContainerInfoConverter.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/ContainerInfoConverter.java index b8bc4d321e..45f94aec28 100644 --- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/ContainerInfoConverter.java +++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/ContainerInfoConverter.java @@ -12,7 +12,6 @@ package org.eclipse.emf.cdo.server.internal.hibernate; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDExternal; -import org.eclipse.emf.cdo.common.id.CDOIDMeta; import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.model.CDOClassifierRef; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; @@ -139,7 +138,7 @@ public class ContainerInfoConverter cdoRevision.setContainerID(containerID); final String containerFeatureStr = containerInfo.substring(index + SEPARATOR.length()); - if (containerID instanceof CDOIDMeta || containerID instanceof CDOIDExternal) + if (containerID instanceof CDOIDExternal) { cdoRevision.setContainingFeatureID(Integer.parseInt(containerFeatureStr)); return; diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateUtil.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateUtil.java index e65bebcef4..225ff864f9 100644 --- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateUtil.java +++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/HibernateUtil.java @@ -14,7 +14,6 @@ package org.eclipse.emf.cdo.server.internal.hibernate; import org.eclipse.emf.cdo.CDOObject; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDExternal; -import org.eclipse.emf.cdo.common.id.CDOIDMeta; import org.eclipse.emf.cdo.common.id.CDOIDTemp; import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.model.CDOClassifierRef; @@ -275,7 +274,7 @@ public class HibernateUtil /** * Converts a CDOID to an unique String representations. Null, {@link CDOIDTemp} and null CDOID's are returned as null - * value. Supports {@link CDOID}, {@link CDOIDMeta} and {@link CDOIDExternal}. + * value. Supports {@link CDOID} and {@link CDOIDExternal}. * * @param cdoID * the cdoID to convert diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOIDExternalUserType.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOIDExternalUserType.java index f345c42d55..9192bb5d89 100644 --- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOIDExternalUserType.java +++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOIDExternalUserType.java @@ -12,7 +12,6 @@ package org.eclipse.emf.cdo.server.internal.hibernate.tuplizer; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDExternal; -import org.eclipse.emf.cdo.common.id.CDOIDMeta; import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.server.internal.hibernate.HibernateUtil; @@ -28,15 +27,12 @@ import java.sql.Types; import java.util.Properties; /** - * A user type which can handle both {@link CDOIDMeta} as well as {@link CDOIDExternal}. Both are stored in a single - * varchar field. + * A user type which can handle {@link CDOIDExternal}. It's stored in a single varchar field. * * @author <a href="mailto:mtaal@elver.org">Martin Taal</a> */ public class CDOIDExternalUserType implements UserType, ParameterizedType { - private static final String META_PREFIX = "MID"; //$NON-NLS-1$ - private static final int[] SQL_TYPES = { Types.VARCHAR }; public CDOIDExternalUserType() @@ -86,11 +82,6 @@ public class CDOIDExternalUserType implements UserType, ParameterizedType return null; } - if (data.startsWith(META_PREFIX)) - { - return CDOIDUtil.createMeta(Long.parseLong(data.substring(META_PREFIX.length()))); - } - return CDOIDUtil.createExternal(data); } @@ -112,11 +103,7 @@ public class CDOIDExternalUserType implements UserType, ParameterizedType localValue = value; } - if (localValue instanceof CDOIDMeta) - { - statement.setString(index, META_PREFIX + ((CDOIDMeta)localValue).getLongValue()); - } - else if (localValue instanceof CDOIDExternal) + if (localValue instanceof CDOIDExternal) { statement.setString(index, ((CDOIDExternal)localValue).getURI()); } diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOIDMetaRangeUserType.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOIDMetaRangeUserType.java deleted file mode 100644 index 17081305b9..0000000000 --- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOIDMetaRangeUserType.java +++ /dev/null @@ -1,132 +0,0 @@ -/** - * Copyright (c) 2004 - 2010 Eike Stepper (Berlin, Germany) and others. - * 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: - * Martin Taal - initial api - * Eike Stepper - maintenance - */ -package org.eclipse.emf.cdo.server.internal.hibernate.tuplizer; - -import org.eclipse.emf.cdo.common.id.CDOIDMeta; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; -import org.eclipse.emf.cdo.common.id.CDOIDUtil; - -import org.hibernate.Hibernate; -import org.hibernate.usertype.UserType; - -import java.io.Serializable; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Types; - -/** - * @author Martin Taal - */ -public class CDOIDMetaRangeUserType implements UserType -{ - private static final int[] SQL_TYPES = { Types.INTEGER, Types.INTEGER }; - - public CDOIDMetaRangeUserType() - { - } - - public int[] sqlTypes() - { - return SQL_TYPES; - } - - public Class<?> returnedClass() - { - return CDOIDMetaRange.class; - } - - public boolean isMutable() - { - return true; - } - - public Object deepCopy(Object value) - { - if (value == null) - { - return null; - } - - CDOIDMetaRange cdoRange = (CDOIDMetaRange)value; - CDOIDMeta newCdoIDMeta = CDOIDUtil.createMeta(((CDOIDMeta)cdoRange.getLowerBound()).getLongValue()); - return CDOIDUtil.createMetaRange(newCdoIDMeta, cdoRange.size()); - } - - public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws SQLException - { - Integer start = (Integer)Hibernate.INTEGER.nullSafeGet(rs, names[0]); - if (rs.wasNull()) - { - return null; - } - - Integer size = (Integer)Hibernate.INTEGER.nullSafeGet(rs, names[1]); - if (rs.wasNull()) - { - return null; - } - - CDOIDMeta newCdoIDMeta = CDOIDUtil.createMeta(start); - return CDOIDUtil.createMetaRange(newCdoIDMeta, size); - } - - public void nullSafeSet(PreparedStatement statement, Object value, int index) throws SQLException - { - if (value != null) - { - CDOIDMetaRange cdoRange = (CDOIDMetaRange)value; - statement.setLong(index, ((CDOIDMeta)cdoRange.getLowerBound()).getLongValue()); - statement.setInt(index + 1, cdoRange.size()); - } - else - { - statement.setNull(index, Types.INTEGER); - statement.setNull(index + 1, Types.INTEGER); - } - } - - public Serializable disassemble(Object value) - { - return (Serializable)value; - } - - public Object assemble(Serializable cachedValue, Object owner) - { - return cachedValue; - } - - public Object replace(Object original, Object target, Object owner) - { - return original; - } - - public boolean equals(Object x, Object y) - { - if (x == y) - { - return true; - } - - if (x == null || y == null) - { - return false; - } - - return x.equals(y); - } - - public int hashCode(Object x) - { - return x.hashCode(); - } -} diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOIDUserType.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOIDUserType.java index 448b5a842d..4cdf98a2af 100644 --- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOIDUserType.java +++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOIDUserType.java @@ -13,7 +13,6 @@ package org.eclipse.emf.cdo.server.internal.hibernate.tuplizer; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDExternal; -import org.eclipse.emf.cdo.common.id.CDOIDMeta; import org.eclipse.emf.cdo.common.id.CDOIDTemp; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.server.internal.hibernate.HibernateUtil; @@ -28,7 +27,7 @@ import java.sql.SQLException; import java.sql.Types; /** - * Persists a CDOID in the DB. Currently {@link CDOIDMeta} and {@link CDOIDExternal} are supported. + * Persists a CDOID in the DB. Currently {@link CDOIDExternal} is supported. */ public class CDOIDUserType implements UserType { diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOReferenceGetter.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOReferenceGetter.java index 5bec96ccd9..03abc592d7 100644 --- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOReferenceGetter.java +++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOReferenceGetter.java @@ -4,7 +4,7 @@ * 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: * Martin Taal - copied from CDORevisionPropertyHandler and adapted * Eike Stepper - maintenance @@ -13,7 +13,6 @@ package org.eclipse.emf.cdo.server.internal.hibernate.tuplizer; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDExternal; -import org.eclipse.emf.cdo.common.id.CDOIDMeta; import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.server.internal.hibernate.HibernateUtil; @@ -39,7 +38,7 @@ public class CDOReferenceGetter extends CDOPropertyGetter { return null; } - else if (o instanceof CDOIDMeta || o instanceof CDOIDExternal) + else if (o instanceof CDOIDExternal) { return o; } diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOReferenceSetter.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOReferenceSetter.java index 079eb600f6..1c548727de 100644 --- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOReferenceSetter.java +++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/CDOReferenceSetter.java @@ -4,7 +4,7 @@ * 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: * Martin Taal - copied from CDORevisionPropertyHandler and adapted * Eike Stepper - maintenance @@ -12,7 +12,6 @@ package org.eclipse.emf.cdo.server.internal.hibernate.tuplizer; import org.eclipse.emf.cdo.common.id.CDOIDExternal; -import org.eclipse.emf.cdo.common.id.CDOIDMeta; import org.eclipse.emf.cdo.server.internal.hibernate.HibernateUtil; import org.hibernate.HibernateException; @@ -37,7 +36,7 @@ public class CDOReferenceSetter extends CDOPropertySetter { super.set(target, null, factory); } - else if (value instanceof CDOIDMeta || value instanceof CDOIDExternal) + else if (value instanceof CDOIDExternal) { super.set(target, value, factory); } diff --git a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/HibernateMoveableListWrapper.java b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/HibernateMoveableListWrapper.java index d82a0da16f..1463902c23 100644 --- a/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/HibernateMoveableListWrapper.java +++ b/plugins/org.eclipse.emf.cdo.server.hibernate/src/org/eclipse/emf/cdo/server/internal/hibernate/tuplizer/HibernateMoveableListWrapper.java @@ -13,7 +13,6 @@ package org.eclipse.emf.cdo.server.internal.hibernate.tuplizer; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDExternal; -import org.eclipse.emf.cdo.common.id.CDOIDMeta; import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.server.internal.hibernate.HibernateUtil; @@ -46,7 +45,7 @@ public class HibernateMoveableListWrapper implements MoveableList<Object> int size = size(); if (sourceIndex >= size) { - throw new IndexOutOfBoundsException("sourceIndex=" + sourceIndex + ", size=" + size); //$NON-NLS-1$ //$NON-NLS-2$ + throw new IndexOutOfBoundsException("sourceIndex=" + sourceIndex + ", size=" + size); //$NON-NLS-1$ //$NON-NLS-2$ } if (targetIndex >= size) @@ -117,7 +116,7 @@ public class HibernateMoveableListWrapper implements MoveableList<Object> { return null; } - else if (o instanceof CDOIDMeta || o instanceof CDOIDExternal) + else if (o instanceof CDOIDExternal) { return o; } @@ -144,7 +143,7 @@ public class HibernateMoveableListWrapper implements MoveableList<Object> protected Object getValue(Object o) { - if (o instanceof CDOIDMeta || o instanceof CDOIDExternal) + if (o instanceof CDOIDExternal) { return o; } diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java index 40813ea2eb..77edd97d31 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitTransactionIndication.java @@ -14,7 +14,6 @@ package org.eclipse.emf.cdo.server.internal.net4j.protocol; import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; import org.eclipse.emf.cdo.common.model.EMFUtil; import org.eclipse.emf.cdo.common.protocol.CDODataInput; import org.eclipse.emf.cdo.common.protocol.CDODataOutput; @@ -41,7 +40,6 @@ import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl; import java.io.IOException; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -244,7 +242,6 @@ public class CommitTransactionIndication extends CDOServerIndicationWithMonitori if (success) { respondingResult(out); - respondingMappingNewPackages(out); respondingMappingNewObjects(out); } } @@ -272,28 +269,15 @@ public class CommitTransactionIndication extends CDOServerIndicationWithMonitori out.writeLong(commitContext.getPreviousTimeStamp()); } - protected void respondingMappingNewPackages(CDODataOutput out) throws Exception - { - // Meta ID ranges - List<CDOIDMetaRange> metaRanges = commitContext.getMetaIDRanges(); - for (CDOIDMetaRange metaRange : metaRanges) - { - out.writeCDOIDMetaRange(metaRange); - } - } - protected void respondingMappingNewObjects(CDODataOutput out) throws Exception { Map<CDOID, CDOID> idMappings = commitContext.getIDMappings(); for (Entry<CDOID, CDOID> entry : idMappings.entrySet()) { CDOID oldID = entry.getKey(); - if (!oldID.isMeta()) - { - CDOID newID = entry.getValue(); - out.writeCDOID(oldID); - out.writeCDOID(newID); - } + CDOID newID = entry.getValue(); + out.writeCDOID(oldID); + out.writeCDOID(newID); } out.writeCDOID(CDOID.NULL); diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionPhase3Indication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionPhase3Indication.java index d0495120c7..114ee9f671 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionPhase3Indication.java +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CommitXATransactionPhase3Indication.java @@ -38,11 +38,6 @@ public class CommitXATransactionPhase3Indication extends CommitTransactionIndica { commitContext.commit(monitor); boolean success = respondingException(out, commitContext.getRollbackMessage()); - if (success) - { - respondingMappingNewPackages(out); - } - commitContext.postCommit(success); } diff --git a/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/ObjectivityStoreAccessor.java b/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/ObjectivityStoreAccessor.java index db43ae7aa4..0dc4383887 100644 --- a/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/ObjectivityStoreAccessor.java +++ b/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/ObjectivityStoreAccessor.java @@ -18,8 +18,6 @@ import org.eclipse.emf.cdo.common.branch.CDOBranchVersion; import org.eclipse.emf.cdo.common.commit.CDOCommitInfo; import org.eclipse.emf.cdo.common.commit.CDOCommitInfoHandler; import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.id.CDOIDMeta; -import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.model.CDOPackageRegistry; import org.eclipse.emf.cdo.common.model.EMFUtil; import org.eclipse.emf.cdo.common.model.lob.CDOLobHandler; @@ -49,7 +47,6 @@ import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranch; import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranchManager; import org.eclipse.emf.cdo.spi.common.commit.CDOChangeSetSegment; import org.eclipse.emf.cdo.spi.common.commit.InternalCDOCommitInfoManager; -import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry; import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageUnit; import org.eclipse.emf.cdo.spi.common.revision.DetachedCDORevision; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; @@ -66,10 +63,8 @@ import org.eclipse.net4j.util.om.monitor.OMMonitor; import org.eclipse.net4j.util.om.trace.ContextTracer; import org.eclipse.emf.ecore.EClass; -import org.eclipse.emf.ecore.EModelElement; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EStructuralFeature; -import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.resource.ResourceSet; import com.objy.db.app.oo; @@ -692,28 +687,6 @@ public class ObjectivityStoreAccessor extends StoreAccessor implements IObjectiv return getStore().getRepository().getPackageRegistry(); } - private InternalCDOPackageRegistry getInternalPackageRegistry() - { - return (InternalCDOPackageRegistry)getPackageRegistry(); - } - - // TODO - move the following two calls to perhaps a MetaDataManager (as in cdo.db package). - // we shouldn't pollute this class with extra stuff. - // The meta info is definitely useful for FeatureMapEntry details. - public long getMetaID(EModelElement modelElement) - { - CDOID cdoid = getInternalPackageRegistry().getMetaInstanceMapper().lookupMetaInstanceID( - (InternalEObject)modelElement); - return CDOIDUtil.getLong(cdoid); - } - - public EModelElement getMetaInstance(long id) - { - CDOIDMeta cdoid = CDOIDUtil.createMeta(id); - InternalEObject metaInstance = getInternalPackageRegistry().getMetaInstanceMapper().lookupMetaInstance(cdoid); - return (EModelElement)metaInstance; - } - /** * TODO - 1) make sure that we return the root resource when we asked for "null" pathPrefix. 2) Create the "null" * resource folder if it doesn't exist, perhaps when we initialize the store. diff --git a/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/db/ObjyObject.java b/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/db/ObjyObject.java index b7a455e3f8..a39584fa4c 100644 --- a/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/db/ObjyObject.java +++ b/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/db/ObjyObject.java @@ -16,7 +16,6 @@ import org.eclipse.emf.cdo.common.id.CDOIDExternal; import org.eclipse.emf.cdo.common.model.EMFUtil; import org.eclipse.emf.cdo.common.revision.CDOList; import org.eclipse.emf.cdo.common.revision.CDORevision; -import org.eclipse.emf.cdo.common.revision.CDORevisionUtil; import org.eclipse.emf.cdo.server.internal.objectivity.ObjectivityStoreAccessor; import org.eclipse.emf.cdo.server.internal.objectivity.bundle.OM; import org.eclipse.emf.cdo.server.internal.objectivity.mapper.IManyTypeMapper; @@ -463,11 +462,7 @@ public class ObjyObject FeatureMap.Entry entry = (FeatureMap.Entry)value; EStructuralFeature entryFeature = entry.getEStructuralFeature(); Object entryValue = entry.getValue(); - long metaId = storeAccessor.getMetaID(entryFeature); - // System.out.println("-->> FeatureMap.Entry (" + i + ") -> feature:" + entryFeature.getName() + - // " - value:" - // + entryValue + " - MetaID: " + metaId); ooId oid = null; if (entryValue instanceof CDOIDExternal) { @@ -488,9 +483,10 @@ public class ObjyObject TRACER_DEBUG.trace("OBJY: don't know what kind of entryValue is this!!! - " + entryValue); } } + // FeatureMapEntry is a presistent class. - ObjyFeatureMapEntry featureMapEntry = new ObjyFeatureMapEntry(entryFeature.getName(), oid, metaId, - objectId); + ObjyFeatureMapEntry featureMapEntry = new ObjyFeatureMapEntry(entryFeature.getName(), oid, objectId); + // this.cluster(featureMapEntry); values[i] = featureMapEntry; } @@ -674,7 +670,6 @@ public class ObjyObject else if (objects[i] instanceof ObjyFeatureMapEntry) { ObjyFeatureMapEntry mapEntry = (ObjyFeatureMapEntry)objects[i]; - long metaId = mapEntry.getMetaId(); ooId oid = mapEntry.getObject(); CDOID cdoId = null; Class_Object refClassObject = Class_Object.class_object_from_oid(oid); @@ -688,13 +683,13 @@ public class ObjyObject { cdoId = OBJYCDOIDUtil.getCDOID((ooId)objects[i]); } - EStructuralFeature entryFeature = (EStructuralFeature)storeAccessor.getMetaInstance(metaId); - FeatureMap.Entry entry = CDORevisionUtil.createFeatureMapEntry(entryFeature, cdoId); - // for verifications... - entryFeature = entry.getEStructuralFeature(); - list.add(entry); - refClassObject = null; + throw new UnsupportedOperationException("FIXME"); + + // FIXME Uncomment the following 3 lines: + // FeatureMap.Entry entry = CDORevisionUtil.createFeatureMapEntry(entryFeature, cdoId); + // list.add(entry); + // refClassObject = null; } else { @@ -786,7 +781,6 @@ public class ObjyObject else if (objects[i] instanceof ObjyFeatureMapEntry) { ObjyFeatureMapEntry mapEntry = (ObjyFeatureMapEntry)objects[i]; - long metaId = mapEntry.getMetaId(); ooId oid = mapEntry.getObject(); CDOID cdoId = null; Class_Object refClassObject = Class_Object.class_object_from_oid(oid); @@ -799,13 +793,12 @@ public class ObjyObject { cdoId = OBJYCDOIDUtil.getCDOID((ooId)objects[i]); } - // get the entry feature using the metaId. - EStructuralFeature entryFeature = (EStructuralFeature)storeAccessor.getMetaInstance(metaId); - FeatureMap.Entry entry = CDORevisionUtil.createFeatureMapEntry(entryFeature, cdoId); - // for verifications... - entryFeature = entry.getEStructuralFeature(); - results.add(entry); + throw new UnsupportedOperationException("FIXME"); + + // FIXME Uncomment the following 2 lines: + // FeatureMap.Entry entry = CDORevisionUtil.createFeatureMapEntry(entryFeature, cdoId); + // results.add(entry); } } } @@ -1123,11 +1116,7 @@ public class ObjyObject else if (objects[i] instanceof ObjyFeatureMapEntry) { ObjyFeatureMapEntry mapEntry = (ObjyFeatureMapEntry)objects[i]; - // long metaId = mapEntry.getMetaId(); - // String name = mapEntry.getTagName(); ooId oid = mapEntry.getObject(); - // System.out.println("-->> FeatureMapEntry (" + i + ") -> feature:" + name + " - value:" + oid - // + " - metaId: " + metaId); ooObj obj = ooObj.create_ooObj(oid); obj.delete(); } diff --git a/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/db/ObjyPackageHandler.java b/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/db/ObjyPackageHandler.java index abcf249bbe..081ce80e5b 100644 --- a/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/db/ObjyPackageHandler.java +++ b/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/db/ObjyPackageHandler.java @@ -10,8 +10,6 @@ */ package org.eclipse.emf.cdo.server.internal.objectivity.db; -import org.eclipse.emf.cdo.common.id.CDOIDMeta; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; import org.eclipse.emf.cdo.common.model.CDOModelUtil; import org.eclipse.emf.cdo.common.model.CDOPackageRegistry; import org.eclipse.emf.cdo.common.model.CDOPackageUnit; @@ -19,7 +17,6 @@ import org.eclipse.emf.cdo.common.model.EMFUtil; import org.eclipse.emf.cdo.server.internal.objectivity.bundle.OM; import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyPackageInfo; import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyPackageUnit; -import org.eclipse.emf.cdo.server.internal.objectivity.utils.OBJYCDOIDUtil; import org.eclipse.emf.cdo.server.internal.objectivity.utils.ObjyDb; import org.eclipse.emf.cdo.server.internal.objectivity.utils.SmartLock; import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageInfo; @@ -141,12 +138,6 @@ public class ObjyPackageHandler ooPackageInfo.setUnitID(packageInfo.getPackageUnit().getID()); ooPackageInfo.setPackageName(packageInfo.getEPackage().getName()); - CDOIDMetaRange metaIDRange = packageInfo.getMetaIDRange(); - long metaLB = metaIDRange == null ? 0L : ((CDOIDMeta)metaIDRange.getLowerBound()).getLongValue(); - long metaUB = metaIDRange == null ? 0L : ((CDOIDMeta)metaIDRange.getUpperBound()).getLongValue(); - ooPackageInfo.setMetaLB(metaLB); - ooPackageInfo.setMetaUB(metaUB); - return ooPackageInfo; } @@ -224,11 +215,6 @@ public class ObjyPackageHandler packageInfo.setPackageURI(ooPackageInfo.getPackageURI()); packageInfo.setParentURI(ooPackageInfo.getParentURI()); // TODO - do we need this!!!! setUnitID(packageInfo.getPackageUnit().getID()); - long metaLB = ooPackageInfo.getMetaLB(); - long metaUB = ooPackageInfo.getMetaUB(); - CDOIDMetaRange metaIDRange = metaLB == 0 ? null : OBJYCDOIDUtil.createMetaRange(OBJYCDOIDUtil.createMeta(metaLB), - (int)(metaUB - metaLB) + 1); - packageInfo.setMetaIDRange(metaIDRange); return packageInfo; } diff --git a/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/schema/ObjyFeatureMapEntry.java b/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/schema/ObjyFeatureMapEntry.java index fc0c662a9b..5f1abe7bf4 100644 --- a/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/schema/ObjyFeatureMapEntry.java +++ b/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/schema/ObjyFeatureMapEntry.java @@ -4,7 +4,7 @@ * 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: * Simon McDuff - initial API and implementation * Ibrahim Sallam - code refactoring for CDO 3.0 @@ -14,19 +14,14 @@ package org.eclipse.emf.cdo.server.internal.objectivity.schema; import org.eclipse.emf.cdo.server.internal.objectivity.db.ObjySchema; import com.objy.as.app.Class_Object; -import com.objy.as.app.Numeric_Value; import com.objy.as.app.Proposed_Class; import com.objy.as.app.String_Value; import com.objy.as.app.d_Access_Kind; import com.objy.as.app.d_Module; -import com.objy.as.app.ooBaseType; import com.objy.db.app.ooId; public class ObjyFeatureMapEntry { - // caching some details. - protected long metaId; - protected String tagName; protected ooId object; @@ -35,8 +30,6 @@ public class ObjyFeatureMapEntry public static final String MapEntryClassName = "ObjyFeatureMapEntry"; - public static final String MetaId = "metaId"; - public static final String EntryName = "tagName"; public static final String EntryObject = "object"; @@ -50,13 +43,6 @@ public class ObjyFeatureMapEntry Proposed_Class B = top_mod.propose_new_class(MapEntryClassName); B.add_base_class(com.objy.as.app.d_Module.LAST, com.objy.as.app.d_Access_Kind.d_PUBLIC, "ooObj"); - B.add_basic_attribute(com.objy.as.app.d_Module.LAST, // Access kind - d_Access_Kind.d_PUBLIC, // Access kind - ObjyFeatureMapEntry.MetaId, // Attribute name - 1, // # elements in fixed-size array - ooBaseType.ooINT64 // type - ); - B.add_embedded_class_attribute(com.objy.as.app.d_Module.LAST, // Access kind d_Access_Kind.d_PUBLIC, // Access kind ObjyFeatureMapEntry.EntryName, // Attribute name @@ -78,16 +64,13 @@ public class ObjyFeatureMapEntry * @param tagName * @param oid */ - public ObjyFeatureMapEntry(String tagName, ooId oid, long metaId, ooId near) + public ObjyFeatureMapEntry(String tagName, ooId oid, ooId near) { this.tagName = tagName; object = oid; - this.metaId = metaId; classObject = Class_Object.new_persistent_object(ObjySchema.getObjyClass(MapEntryClassName).getASClass(), near, false); - Numeric_Value numericValue = new Numeric_Value(metaId); - classObject.nset_numeric(MetaId, numericValue); String_Value stringValue = classObject.nget_string(EntryName); stringValue.update(); String newValue = this.tagName; @@ -105,9 +88,6 @@ public class ObjyFeatureMapEntry { this.classObject = classObject; - Numeric_Value numericValue = classObject.nget_numeric(MetaId); - metaId = numericValue.longValue(); - String_Value value = classObject.nget_string(EntryName); // for objy10.0 -> this.tagName = (value == null || value.toString() == null || value.toString().isEmpty()) ? null : // value.toString(); @@ -140,14 +120,4 @@ public class ObjyFeatureMapEntry { return classObject.objectID(); } - - public long getMetaId() - { - return metaId; - } - - public void setMetaId(long metaId) - { - this.metaId = metaId; - } } diff --git a/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/schema/ObjyPackageInfo.java b/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/schema/ObjyPackageInfo.java index 27e6f9be6d..afd5840f69 100644 --- a/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/schema/ObjyPackageInfo.java +++ b/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/schema/ObjyPackageInfo.java @@ -25,10 +25,6 @@ public class ObjyPackageInfo extends ooObj protected String unitID; - protected long metaLB; - - protected long metaUB; - protected ToOneRelationship packageUnit; private String name; @@ -105,30 +101,6 @@ public class ObjyPackageInfo extends ooObj this.unitID = unitID; } - public long getMetaLB() - { - fetch(); - return metaLB; - } - - public void setMetaLB(long metaLB) - { - markModified(); - this.metaLB = metaLB; - } - - public long getMetaUB() - { - fetch(); - return metaUB; - } - - public void setMetaUB(long metaUB) - { - markModified(); - this.metaUB = metaUB; - } - public void setPackageName(String name) { markModified(); diff --git a/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/utils/OBJYCDOIDUtil.java b/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/utils/OBJYCDOIDUtil.java index b1cc8dd951..729070e4bf 100644 --- a/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/utils/OBJYCDOIDUtil.java +++ b/plugins/org.eclipse.emf.cdo.server.objectivity/src/org/eclipse/emf/cdo/server/internal/objectivity/utils/OBJYCDOIDUtil.java @@ -13,8 +13,6 @@ package org.eclipse.emf.cdo.server.internal.objectivity.utils; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDExternal; -import org.eclipse.emf.cdo.common.id.CDOIDMeta; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; import org.eclipse.emf.cdo.common.id.CDOIDObject; import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.server.internal.objectivity.schema.ObjyProxy; @@ -137,19 +135,8 @@ public class OBJYCDOIDUtil return getContainerId(longCdoID); } - public static CDOIDMeta createMeta(long value) - { - return CDOIDUtil.createMeta(value); - } - - public static CDOIDMetaRange createMetaRange(CDOID lowerBound, int count) - { - return CDOIDUtil.createMetaRange(lowerBound, count); - } - public static CDOIDExternal createCDIDExternal(ObjyProxy proxyObject) { return CDOIDUtil.createExternal(proxyObject.getUri()); } - } diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/DelegatingCommitContext.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/DelegatingCommitContext.java index 2b5b2290aa..197dca9c79 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/DelegatingCommitContext.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/DelegatingCommitContext.java @@ -12,7 +12,6 @@ package org.eclipse.emf.cdo.internal.server; import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.server.IStoreAccessor; import org.eclipse.emf.cdo.server.IStoreAccessor.CommitContext; @@ -24,7 +23,6 @@ import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionDelta; import org.eclipse.emf.ecore.EClass; -import java.util.List; import java.util.Map; /** @@ -104,11 +102,6 @@ public abstract class DelegatingCommitContext implements IStoreAccessor.CommitCo return getDelegate().getIDMappings(); } - public List<CDOIDMetaRange> getMetaIDRanges() - { - return getDelegate().getMetaIDRanges(); - } - public String getRollbackMessage() { return getDelegate().getRollbackMessage(); diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java index 8ad5225cb3..d19fd0ea02 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/Repository.java @@ -23,7 +23,6 @@ import org.eclipse.emf.cdo.common.commit.CDOChangeSetData; import org.eclipse.emf.cdo.common.commit.CDOCommitData; import org.eclipse.emf.cdo.common.commit.CDOCommitInfoHandler; import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; import org.eclipse.emf.cdo.common.id.CDOIDTemp; import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.model.CDOModelUtil; @@ -1299,9 +1298,6 @@ public class Repository extends Container<Object> implements InternalRepository { EMFUtil.registerPackage(ePackage, packageRegistry); InternalCDOPackageInfo packageInfo = packageRegistry.getPackageInfo(ePackage); - CDOIDMetaRange metaIDRange = store.getNextMetaIDRange(packageInfo.getMetaIDRange().size()); - packageInfo.setMetaIDRange(metaIDRange); - packageRegistry.getMetaInstanceMapper().mapMetaInstances(ePackage, metaIDRange); InternalCDOPackageUnit packageUnit = packageInfo.getPackageUnit(); packageUnit.setTimeStamp(store.getCreationTime()); diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java index 8d6614966c..3bf3df93da 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java @@ -18,9 +18,7 @@ import org.eclipse.emf.cdo.common.commit.CDOCommitData; import org.eclipse.emf.cdo.common.commit.CDOCommitInfo; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDAndVersion; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; import org.eclipse.emf.cdo.common.id.CDOIDObject; -import org.eclipse.emf.cdo.common.id.CDOIDTemp; import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.model.CDOModelUtil; import org.eclipse.emf.cdo.common.model.CDOPackageUnit; @@ -67,7 +65,6 @@ import org.eclipse.net4j.util.collection.IndexedList; import org.eclipse.net4j.util.concurrent.IRWLockManager.LockType; import org.eclipse.net4j.util.io.ExtendedDataInputStream; import org.eclipse.net4j.util.om.monitor.OMMonitor; -import org.eclipse.net4j.util.om.trace.ContextTracer; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EPackage; @@ -93,8 +90,6 @@ import java.util.concurrent.ConcurrentMap; */ public class TransactionCommitContext implements InternalCommitContext { - private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG_TRANSACTION, TransactionCommitContext.class); - private static final InternalCDORevision DETACHED = new StubCDORevision(null); private InternalTransaction transaction; @@ -129,8 +124,6 @@ public class TransactionCommitContext implements InternalCommitContext private List<CDOID> lockedTargets; - private List<CDOIDMetaRange> metaIDRanges = new ArrayList<CDOIDMetaRange>(); - private ConcurrentMap<CDOID, CDOID> idMappings = new ConcurrentHashMap<CDOID, CDOID>(); private CDOReferenceAdjuster idMapper = new CDOIDMapper(idMappings); @@ -274,11 +267,6 @@ public class TransactionCommitContext implements InternalCommitContext return cache; } - public List<CDOIDMetaRange> getMetaIDRanges() - { - return Collections.unmodifiableList(metaIDRanges); - } - public Map<CDOID, CDOID> getIDMappings() { return Collections.unmodifiableMap(idMappings); @@ -382,10 +370,8 @@ public class TransactionCommitContext implements InternalCommitContext monitor.begin(107); dirtyObjects = new InternalCDORevision[dirtyObjectDeltas.length]; - adjustMetaRanges(); - monitor.worked(); - lockObjects(); + monitor.worked(); // Could throw an exception long[] times = createTimeStamp(monitor.fork()); @@ -512,12 +498,6 @@ public class TransactionCommitContext implements InternalCommitContext packageRegistry = null; } - if (metaIDRanges != null) - { - metaIDRanges.clear(); - metaIDRanges = null; - } - if (idMappings != null) { idMappings.clear(); @@ -605,49 +585,6 @@ public class TransactionCommitContext implements InternalCommitContext } } - protected void adjustMetaRanges() - { - for (InternalCDOPackageUnit newPackageUnit : newPackageUnits) - { - for (InternalCDOPackageInfo packageInfo : newPackageUnit.getPackageInfos()) - { - adjustMetaRange(packageInfo); - } - } - } - - private void adjustMetaRange(InternalCDOPackageInfo packageInfo) - { - CDOIDMetaRange oldRange = packageInfo.getMetaIDRange(); - if (!oldRange.isTemporary()) - { - throw new IllegalStateException("!oldRange.isTemporary()"); //$NON-NLS-1$ - } - - int count = oldRange.size(); - CDOIDMetaRange newRange = transaction.getRepository().getStore().getNextMetaIDRange(count); - packageInfo.setMetaIDRange(newRange); - packageRegistry.getMetaInstanceMapper().mapMetaInstances(packageInfo.getEPackage(), newRange); - - for (int i = 0; i < count; i++) - { - CDOIDTemp oldID = (CDOIDTemp)oldRange.get(i); - CDOID newID = newRange.get(i); - idMappings.put(oldID, newID); - } - - addMetaIDRange(newRange); - if (TRACER.isEnabled()) - { - TRACER.format("Mapping meta ID range: {0} --> {1}", oldRange, newRange); //$NON-NLS-1$ - } - } - - protected void addMetaIDRange(CDOIDMetaRange range) - { - metaIDRanges.add(range); - } - protected void lockObjects() throws InterruptedException { lockedObjects.clear(); @@ -1053,8 +990,6 @@ public class TransactionCommitContext implements InternalCommitContext repositoryPackageRegistry.putPackageUnit(newPackageUnits[i]); monitor.worked(); } - - repositoryPackageRegistry.getMetaInstanceMapper().mapMetaInstances(packageRegistry.getMetaInstanceMapper()); } finally { diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/embedded/DelegatingCDOPackageRegistry.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/embedded/DelegatingCDOPackageRegistry.java index eea956c03b..4605bd9197 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/embedded/DelegatingCDOPackageRegistry.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/embedded/DelegatingCDOPackageRegistry.java @@ -80,11 +80,6 @@ public abstract class DelegatingCDOPackageRegistry extends Lifecycle implements return getDelegate().getEPackages(); } - public MetaInstanceMapper getMetaInstanceMapper() - { - return getDelegate().getMetaInstanceMapper(); - } - public InternalCDOPackageInfo getPackageInfo(EPackage ePackage) { return getDelegate().getPackageInfo(ePackage); diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/ReplicatorCommitContext.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/ReplicatorCommitContext.java index f4774bbdd9..7bdb6909ff 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/ReplicatorCommitContext.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/ReplicatorCommitContext.java @@ -69,12 +69,6 @@ public final class ReplicatorCommitContext extends TransactionCommitContext } @Override - protected void adjustMetaRanges() - { - // Do nothing - } - - @Override protected void adjustForCommit() { // Do nothing diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/SynchronizableRepository.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/SynchronizableRepository.java index c879c6d1e9..2d4206cf12 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/SynchronizableRepository.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/SynchronizableRepository.java @@ -19,7 +19,6 @@ import org.eclipse.emf.cdo.common.commit.CDOCommitInfo; import org.eclipse.emf.cdo.common.commit.CDOCommitInfoHandler; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDAndVersion; -import org.eclipse.emf.cdo.common.model.CDOPackageInfo; import org.eclipse.emf.cdo.common.model.CDOPackageUnit; import org.eclipse.emf.cdo.common.model.lob.CDOLob; import org.eclipse.emf.cdo.common.protocol.CDODataInput; @@ -514,7 +513,6 @@ public abstract class SynchronizableRepository extends Repository.Default implem // Prepare data needed for commit result and commit notifications long timeStamp = result.getTimeStamp(); setTimeStamp(timeStamp); - addMetaIDRanges(commitData.getNewPackageUnits()); addIDMappings(result.getIDMappings()); applyIDMappings(new Monitor()); @@ -555,23 +553,6 @@ public abstract class SynchronizableRepository extends Repository.Default implem // Do nothing } - @Override - protected void adjustMetaRanges() - { - // Do nothing - } - - private void addMetaIDRanges(List<CDOPackageUnit> newPackageUnits) - { - for (CDOPackageUnit newPackageUnit : newPackageUnits) - { - for (CDOPackageInfo packageInfo : newPackageUnit.getPackageInfos()) - { - addMetaIDRange(packageInfo.getMetaIDRange()); - } - } - } - private void addIDMappings(Map<CDOID, CDOID> idMappings) { for (Map.Entry<CDOID, CDOID> idMapping : idMappings.entrySet()) diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/CDOServerExporter.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/CDOServerExporter.java index d3ce41cfd5..5782937488 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/CDOServerExporter.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/CDOServerExporter.java @@ -16,7 +16,6 @@ import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; import org.eclipse.emf.cdo.common.commit.CDOCommitInfo; import org.eclipse.emf.cdo.common.commit.CDOCommitInfoHandler; import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.model.CDOClassInfo; import org.eclipse.emf.cdo.common.model.CDOClassifierRef; @@ -133,8 +132,7 @@ public abstract class CDOServerExporter<OUT> for (InternalCDOPackageInfo packageInfo : packageUnit.getPackageInfos()) { String packageURI = packageInfo.getPackageURI(); - CDOIDMetaRange metaIDRange = packageInfo.getMetaIDRange(); - exportPackageInfo(out, packageURI, metaIDRange); + exportPackageInfo(out, packageURI); } endPackageUnit(out); @@ -146,7 +144,7 @@ public abstract class CDOServerExporter<OUT> protected abstract void endPackageUnit(OUT out) throws Exception; - protected abstract void exportPackageInfo(OUT out, String packageURI, CDOIDMetaRange metaIDRange) throws Exception; + protected abstract void exportPackageInfo(OUT out, String packageURI) throws Exception; protected void exportBranches(final OUT out) throws Exception { @@ -286,10 +284,6 @@ public abstract class CDOServerExporter<OUT> public static final String PACKAGE_INFO_URI = "uri"; - public static final String PACKAGE_INFO_FIRST = "first"; - - public static final String PACKAGE_INFO_COUNT = "count"; - public static final String INSTANCES = "instances"; public static final String BRANCH = "branch"; @@ -427,12 +421,10 @@ public abstract class CDOServerExporter<OUT> } @Override - protected void exportPackageInfo(XMLOutput out, String uri, CDOIDMetaRange metaIDRange) throws Exception + protected void exportPackageInfo(XMLOutput out, String uri) throws Exception { out.element(PACKAGE_INFO); out.attribute(PACKAGE_INFO_URI, uri); - out.attribute(PACKAGE_INFO_FIRST, str(metaIDRange.getLowerBound())); - out.attribute(PACKAGE_INFO_COUNT, metaIDRange.size()); } @Override diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/CDOServerImporter.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/CDOServerImporter.java index 06db2ea9b1..a43b69037d 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/CDOServerImporter.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/CDOServerImporter.java @@ -13,7 +13,6 @@ package org.eclipse.emf.cdo.server; import org.eclipse.emf.cdo.common.branch.CDOBranch; import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.model.CDOClassifierRef; import org.eclipse.emf.cdo.common.model.CDOModelUtil; @@ -123,7 +122,7 @@ public abstract class CDOServerImporter public InternalCDOPackageUnit handlePackageUnit(String id, Type type, long time, String data); - public InternalCDOPackageInfo handlePackageInfo(String packageURI, CDOIDMetaRange metaIDRange); + public InternalCDOPackageInfo handlePackageInfo(String packageURI); public InternalCDOPackageRegistry handleModels(); @@ -187,11 +186,10 @@ public abstract class CDOServerImporter return packageUnit; } - public InternalCDOPackageInfo handlePackageInfo(String packageURI, CDOIDMetaRange metaIDRange) + public InternalCDOPackageInfo handlePackageInfo(String packageURI) { InternalCDOPackageInfo packageInfo = (InternalCDOPackageInfo)CDOModelUtil.createPackageInfo(); packageInfo.setPackageURI(packageURI); - packageInfo.setMetaIDRange(metaIDRange); packageInfos.add(packageInfo); return packageInfo; } @@ -358,10 +356,7 @@ public abstract class CDOServerImporter else if (PACKAGE_INFO.equals(qName)) { String packageURI = attributes.getValue(PACKAGE_INFO_URI); - CDOID lowerBound = id(attributes.getValue(PACKAGE_INFO_FIRST)); - int count = Integer.parseInt(attributes.getValue(PACKAGE_INFO_COUNT)); - CDOIDMetaRange metaIDRange = CDOIDUtil.createMetaRange(lowerBound, count); - handler.handlePackageInfo(packageURI, metaIDRange); + handler.handlePackageInfo(packageURI); } else if (BRANCH.equals(qName)) { diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IStore.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IStore.java index ce02ce289d..5cdfbc7ac0 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IStore.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IStore.java @@ -15,8 +15,6 @@ import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.net4j.util.om.monitor.ProgressDistributor; -import org.eclipse.emf.ecore.EModelElement; - import java.util.Collection; import java.util.Map; import java.util.Set; @@ -114,13 +112,6 @@ public interface IStore public long getLastNonLocalCommitTime(); /** - * Returns the id of the last {@link EModelElement} that has been committed to this store. - * - * @since 3.0 - */ - public long getLastMetaID(); - - /** * Returns a map filled with the property entries for the requested property <code>names</code> if names is not * <code>null</code> and not {@link Collection#isEmpty() empty}, all existing property entries otherwise. * diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IStoreAccessor.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IStoreAccessor.java index a71624f868..107ab269ea 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IStoreAccessor.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/server/IStoreAccessor.java @@ -15,8 +15,6 @@ import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; import org.eclipse.emf.cdo.common.branch.CDOBranchVersion; import org.eclipse.emf.cdo.common.commit.CDOCommitInfo; import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; -import org.eclipse.emf.cdo.common.model.CDOPackageInfo; import org.eclipse.emf.cdo.common.model.CDOPackageUnit; import org.eclipse.emf.cdo.common.model.lob.CDOBlob; import org.eclipse.emf.cdo.common.model.lob.CDOClob; @@ -374,19 +372,13 @@ public interface IStoreAccessor extends IQueryHandlerProvider, BranchLoader, Com public ExtendedDataInputStream getLobs(); /** - * Returns an unmodifiable map from all temporary IDs (meta or not) to their persistent counter parts. It is - * initially populated with the mappings of all new <b>meta</b> objects. + * Returns an unmodifiable map from all temporary IDs to their persistent counter parts. */ public Map<CDOID, CDOID> getIDMappings(); /** * @since 3.0 */ - public List<CDOIDMetaRange> getMetaIDRanges(); - - /** - * @since 3.0 - */ public String getRollbackMessage(); } @@ -541,8 +533,8 @@ public interface IStoreAccessor extends IQueryHandlerProvider, BranchLoader, Com * Stores the given {@link CDOPackageUnit package units} in the backend represented by this * {@link IStoreAccessor.Raw raw store accessor} without going through a regular * {@link IStoreAccessor #commit(OMMonitor) commit}. A regular commit operation would assign new - * {@link CDOPackageInfo#getMetaIDRange() meta IDs} and {@link CDOPackageUnit#getTimeStamp() time stamps}, which is - * not desired in the context of a replication operation. + * {@link CDOPackageUnit#getTimeStamp() time stamps}, which is not desired in the context of a replication + * operation. * <p> * <b>Implementation note:</b> The implementor of this method may rely on the fact that multiple subsequent calls to * this method are followed by a single final call to the {@link #rawCommit(OMMonitor) rawCommit()} method where the diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalStore.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalStore.java index 9691579ca8..cddcb3391e 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalStore.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalStore.java @@ -11,7 +11,6 @@ package org.eclipse.emf.cdo.spi.server; import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; import org.eclipse.emf.cdo.server.IRepository; import org.eclipse.emf.cdo.server.IStore; @@ -31,8 +30,6 @@ public interface InternalStore extends IStore, ILifecycle public void setRevisionParallelism(RevisionParallelism revisionParallelism); - public CDOIDMetaRange getNextMetaIDRange(int count); - public int getNextBranchID(); public int getNextLocalBranchID(); @@ -45,8 +42,6 @@ public interface InternalStore extends IStore, ILifecycle public void setLastNonLocalCommitTime(long lastNonLocalCommitTime); - public void setLastMetaID(long lastMetaID); - /** * @since 4.0 */ diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/Store.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/Store.java index 65b95ebb35..b6120aef18 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/Store.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/Store.java @@ -15,8 +15,6 @@ import org.eclipse.emf.cdo.common.branch.CDOBranch; import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOID.ObjectType; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; -import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.revision.CDORevisionFactory; import org.eclipse.emf.cdo.internal.server.Repository; import org.eclipse.emf.cdo.server.IRepository; @@ -88,12 +86,6 @@ public abstract class Store extends Lifecycle implements InternalStore private transient int lastLocalBranchID; @ExcludeFromDump - private transient long lastMetaID; - - @ExcludeFromDump - private transient Object lastMetaIDLock = new Object(); - - @ExcludeFromDump private transient long lastCommitTime; @ExcludeFromDump @@ -277,32 +269,6 @@ public abstract class Store extends Lifecycle implements InternalStore return --lastLocalBranchID; } - public long getLastMetaID() - { - synchronized (lastMetaIDLock) - { - return lastMetaID; - } - } - - public void setLastMetaID(long lastMetaID) - { - synchronized (lastMetaIDLock) - { - this.lastMetaID = lastMetaID; - } - } - - public CDOIDMetaRange getNextMetaIDRange(int count) - { - synchronized (lastMetaIDLock) - { - CDOID lowerBound = CDOIDUtil.createMeta(lastMetaID + 1); - lastMetaID += count; - return CDOIDUtil.createMetaRange(lowerBound, count); - } - } - /** * @since 3.0 */ diff --git a/plugins/org.eclipse.emf.cdo.tests/logic/TestLogic.java b/plugins/org.eclipse.emf.cdo.tests/logic/TestLogic.java index d00cce0076..ee71f67015 100644 --- a/plugins/org.eclipse.emf.cdo.tests/logic/TestLogic.java +++ b/plugins/org.eclipse.emf.cdo.tests/logic/TestLogic.java @@ -11,7 +11,6 @@ package org.eclipse.emf.cdo.tests.store.logic; import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.id.CDOIDMetaRange; import org.eclipse.emf.cdo.common.id.CDOIDTemp; import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.model.CDOModelUtil; @@ -239,7 +238,6 @@ public abstract class TestLogic extends AbstractOMTest String name = ePackage.getName(); boolean dynamic = EMFUtil.isDynamicEPackage(ePackage); String ecore = null; - CDOIDMetaRange idRange = null; if (parentURI == null) { @@ -247,12 +245,10 @@ public abstract class TestLogic extends AbstractOMTest { ecore = EMFUtil.ePackageToString(ePackage, EPackage.Registry.INSTANCE); } - - idRange = SessionUtil.registerEPackage(ePackage, 1, null, null); } TransactionPackageRegistry packageManager = transactionCommitContext.getPackageRegistry(); - EPackage newPackage = CDOModelUtil.createPackage(packageManager, uri, name, ecore, dynamic, idRange, parentURI); + EPackage newPackage = CDOModelUtil.createPackage(packageManager, uri, name, ecore, dynamic, parentURI); ModelUtil.initializeEPackage(ePackage, newPackage); packageManager.addPackage(newPackage); newPackages.add(newPackage); diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/CDOIDTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/CDOIDTest.java index 67ec0acd02..af0bb475cd 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/CDOIDTest.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/CDOIDTest.java @@ -14,10 +14,8 @@ import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDExternal; import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.eresource.CDOResource; -import org.eclipse.emf.cdo.internal.common.id.CDOIDMetaImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDNullImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDObjectLongImpl; -import org.eclipse.emf.cdo.internal.common.id.CDOIDTempMetaImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDTempObjectExternalImpl; import org.eclipse.emf.cdo.internal.common.id.CDOIDTempObjectImpl; import org.eclipse.emf.cdo.session.CDOSession; @@ -48,24 +46,12 @@ public class CDOIDTest extends AbstractCDOTest assertEquals(123L, CDOIDUtil.getLong(id)); } - public void testGetLong_MetaId() - { - CDOIDMetaImpl id = new CDOIDMetaImpl(135L); - assertEquals(135, CDOIDUtil.getLong(id)); - } - public void testGetLong_TempId() { CDOIDTempObjectImpl id = new CDOIDTempObjectImpl(456); assertIllegalArgument(id); } - public void testGetLong_TempMetaId() - { - CDOIDTempMetaImpl id = new CDOIDTempMetaImpl(789); - assertIllegalArgument(id); - } - public void testGetLong_ExtTempId() { CDOIDTempObjectExternalImpl id = new CDOIDTempObjectExternalImpl("cdo://repo123/resource456"); diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/PackageRegistryTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/PackageRegistryTest.java index 10ef92a8f7..a7550ae29f 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/PackageRegistryTest.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/PackageRegistryTest.java @@ -464,7 +464,6 @@ public class PackageRegistryTest extends AbstractCDOTest packageRegistry.putEPackage(model1Package); CDOPackageUnit packageUnit = packageRegistry.getPackageUnit(model1Package); - assertEquals(false, packageUnit.getTopLevelPackageInfo().getMetaIDRange().isTemporary()); assertEquals(CDOPackageUnit.State.LOADED, packageUnit.getState()); { @@ -553,7 +552,6 @@ public class PackageRegistryTest extends AbstractCDOTest Model1Package model1Package = getModel1Package(); CDOPackageUnit packageUnit = packageRegistry.getPackageUnit(model1Package); - assertEquals(false, packageUnit.getTopLevelPackageInfo().getMetaIDRange().isTemporary()); assertEquals(CDOPackageUnit.State.LOADED, packageUnit.getState()); { diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java index ab5710a1be..2236477a07 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOUtil.java @@ -47,13 +47,10 @@ import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.util.BasicEList; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.URI; -import org.eclipse.emf.ecore.EGenericType; -import org.eclipse.emf.ecore.EModelElement; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.InternalEObject; -import org.eclipse.emf.ecore.impl.EStringToStringMapEntryImpl; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.spi.cdo.FSMUtil; @@ -329,30 +326,6 @@ public final class CDOUtil /** * @since 2.0 */ - public static CDOObject getCDOObject(EModelElement object, CDOView view) - { - return FSMUtil.adaptMeta((InternalEObject)object, view); - } - - /** - * @since 2.0 - */ - public static CDOObject getCDOObject(EGenericType object, CDOView view) - { - return FSMUtil.adaptMeta((InternalEObject)object, view); - } - - /** - * @since 2.0 - */ - public static CDOObject getCDOObject(EStringToStringMapEntryImpl object, CDOView view) - { - return FSMUtil.adaptMeta(object, view); - } - - /** - * @since 2.0 - */ public static CDORevision getRevisionByVersion(CDOObject object, int version) { if (FSMUtil.isTransient(object)) diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOIDDanglingImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOIDDanglingImpl.java index 962cd580c2..35b748a7e3 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOIDDanglingImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOIDDanglingImpl.java @@ -90,11 +90,6 @@ public class CDOIDDanglingImpl extends AbstractCDOID implements CDOIDDangling return false; } - public boolean isMeta() - { - return false; - } - public boolean isNull() { return false; diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOMetaWrapper.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOMetaWrapper.java deleted file mode 100644 index 1fe6e15384..0000000000 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/CDOMetaWrapper.java +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Copyright (c) 2004 - 2010 Eike Stepper (Berlin, Germany) and others. - * 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: - * Eike Stepper - initial API and implementation - * Martin Fluegge - bug 247226: Transparently support legacy models - */ -package org.eclipse.emf.internal.cdo; - -import org.eclipse.emf.cdo.CDOState; -import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.common.revision.CDORevision; -import org.eclipse.emf.cdo.eresource.impl.CDOResourceImpl; -import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; - -import org.eclipse.emf.ecore.EClass; -import org.eclipse.emf.ecore.InternalEObject; -import org.eclipse.emf.spi.cdo.InternalCDOView; - -/** - * @author Eike Stepper - * @since 2.0 - */ -public class CDOMetaWrapper extends CDOObjectWrapper -{ - public CDOMetaWrapper(InternalCDOView view, InternalEObject instance, CDOID id) - { - this.view = view; - this.instance = instance; - this.id = id; - } - - public CDOState cdoState() - { - return CDOState.CLEAN; - } - - public InternalCDORevision cdoRevision() - { - throw new UnsupportedOperationException(); - } - - @Override - public CDOResourceImpl cdoResource() - { - throw new UnsupportedOperationException(); - } - - @Override - public CDOResourceImpl cdoDirectResource() - { - throw new UnsupportedOperationException(); - } - - @Override - public EClass eClass() - { - throw new UnsupportedOperationException(); - } - - public void cdoReload() - { - throw new UnsupportedOperationException(); - } - - public boolean cdoTransient() - { - return false; - } - - public CDOState cdoInternalSetState(CDOState state) - { - throw new UnsupportedOperationException(); - } - - public void cdoInternalSetRevision(CDORevision revision) - { - throw new UnsupportedOperationException(); - } - - public void cdoInternalPreLoad() - { - throw new UnsupportedOperationException(); - } - - public void cdoInternalPostLoad() - { - throw new UnsupportedOperationException(); - } - - public void cdoInternalCleanup() - { - throw new UnsupportedOperationException(); - } - - public void cdoInternalPostAttach() - { - throw new UnsupportedOperationException(); - } - - public void cdoInternalPostDetach(boolean remote) - { - throw new UnsupportedOperationException(); - } - - public void cdoInternalPostInvalidate() - { - throw new UnsupportedOperationException(); - } - - /** - * @since 3.0 - */ - public void cdoInternalPostRollback() - { - // Do nothing - } - - public void cdoInternalPreCommit() - { - throw new UnsupportedOperationException(); - } - - @Override - public String toString() - { - if (cdoID() == null) - { - return instance.eClass().getName() + "?"; //$NON-NLS-1$ - } - - return instance.eClass().getName() + "@" + cdoID(); //$NON-NLS-1$ - } -} diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java index 2b4c84a54a..391232ec59 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/AbstractCDOView.java @@ -20,7 +20,6 @@ import org.eclipse.emf.cdo.common.branch.CDOBranchPoint; import org.eclipse.emf.cdo.common.commit.CDOChangeSetData; import org.eclipse.emf.cdo.common.id.CDOID; import org.eclipse.emf.cdo.common.id.CDOIDAndVersion; -import org.eclipse.emf.cdo.common.id.CDOIDMeta; import org.eclipse.emf.cdo.common.id.CDOIDUtil; import org.eclipse.emf.cdo.common.model.CDOClassifierRef; import org.eclipse.emf.cdo.common.model.CDOModelUtil; @@ -37,7 +36,6 @@ import org.eclipse.emf.cdo.eresource.impl.CDOResourceImpl; import org.eclipse.emf.cdo.internal.common.revision.delta.CDORevisionDeltaImpl; import org.eclipse.emf.cdo.session.CDOSession; import org.eclipse.emf.cdo.spi.common.branch.CDOBranchUtil; -import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; import org.eclipse.emf.cdo.transaction.CDOTransaction; import org.eclipse.emf.cdo.util.CDOURIUtil; @@ -53,7 +51,6 @@ import org.eclipse.emf.cdo.view.CDOViewAdaptersNotifiedEvent; import org.eclipse.emf.cdo.view.CDOViewEvent; import org.eclipse.emf.cdo.view.CDOViewTargetChangedEvent; -import org.eclipse.emf.internal.cdo.CDOMetaWrapper; import org.eclipse.emf.internal.cdo.CDOStateMachine; import org.eclipse.emf.internal.cdo.CDOStore; import org.eclipse.emf.internal.cdo.CDOURIHandler; @@ -691,23 +688,14 @@ public abstract class AbstractCDOView extends Lifecycle implements InternalCDOVi InternalCDOObject localLookupObject = objects.get(id); if (localLookupObject == null) { - if (id.isMeta()) + if (!loadOnDemand) { - localLookupObject = createMetaObject((CDOIDMeta)id); - } - else - { - if (loadOnDemand) - { - excludeTempIDs(id); - localLookupObject = createObject(id); - } - else - { - return null; - } + return null; } + excludeTempIDs(id); + localLookupObject = createObject(id); + // CDOResource have a special way to register to the view. if (!CDOModelUtil.isResource(localLookupObject.eClass())) { @@ -792,21 +780,6 @@ public abstract class AbstractCDOView extends Lifecycle implements InternalCDOVi /** * @return Never <code>null</code> */ - private InternalCDOObject createMetaObject(CDOIDMeta id) - { - if (TRACER.isEnabled()) - { - TRACER.trace("Creating meta object for " + id); //$NON-NLS-1$ - } - - InternalCDOPackageRegistry packageRegistry = getSession().getPackageRegistry(); - InternalEObject metaInstance = packageRegistry.getMetaInstanceMapper().lookupMetaInstance(id); - return new CDOMetaWrapper(this, metaInstance, id); - } - - /** - * @return Never <code>null</code> - */ private InternalCDOObject createObject(CDOID id) { if (TRACER.isEnabled()) diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/FSMUtil.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/FSMUtil.java index a3e71784e1..ac4a27cbbc 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/FSMUtil.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/FSMUtil.java @@ -13,24 +13,16 @@ package org.eclipse.emf.spi.cdo; import org.eclipse.emf.cdo.CDOObject; import org.eclipse.emf.cdo.CDOState; -import org.eclipse.emf.cdo.common.id.CDOID; -import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry; import org.eclipse.emf.cdo.util.LegacyModeNotEnabledException; import org.eclipse.emf.cdo.view.CDOView; import org.eclipse.emf.internal.cdo.CDOLegacyAdapter; -import org.eclipse.emf.internal.cdo.CDOMetaWrapper; import org.eclipse.emf.internal.cdo.CDOObjectImpl; import org.eclipse.emf.internal.cdo.messages.Messages; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.util.EList; -import org.eclipse.emf.ecore.EClass; -import org.eclipse.emf.ecore.EGenericType; -import org.eclipse.emf.ecore.EModelElement; import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.EPackage; -import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.util.EcoreUtil; @@ -71,37 +63,11 @@ public final class FSMUtil return state == CDOState.NEW; } - public static boolean isMeta(Object object) - { - if (object instanceof EModelElement || object instanceof EGenericType) - { - EClass eClass = ((EObject)object).eClass(); - if (eClass == null) - { - return false; - } - - EPackage ePackage = eClass.getEPackage(); - if (ePackage == null) - { - return false; - } - - return ePackage.getNsURI() == EcorePackage.eNS_URI; - } - - return object instanceof org.eclipse.emf.ecore.impl.EStringToStringMapEntryImpl; - } - public static boolean isNative(EObject eObject) { return eObject instanceof CDOObjectImpl; } - /** - * @param view - * Only needed if object is a meta instance. - */ public static InternalCDOObject adapt(Object object, CDOView view) { if (view.isClosed()) @@ -119,11 +85,6 @@ public final class FSMUtil throw new IllegalArgumentException(Messages.getString("FSMUtil.1")); //$NON-NLS-1$ } - if (isMeta(object)) - { - return adaptMeta((InternalEObject)object, view); - } - if (object instanceof InternalEObject) { if (!view.isLegacyModeEnabled()) @@ -137,30 +98,6 @@ public final class FSMUtil return null; } - public static InternalCDOObject adaptMeta(InternalEObject object, CDOView view) - { - if (view == null) - { - throw new IllegalArgumentException(Messages.getString("FSMUtil.2")); //$NON-NLS-1$ - } - - if (object.eIsProxy()) - { - object = (InternalEObject)EcoreUtil.resolve(object, view.getResourceSet()); - } - - try - { - InternalCDOPackageRegistry packageRegistry = (InternalCDOPackageRegistry)view.getSession().getPackageRegistry(); - CDOID id = packageRegistry.getMetaInstanceMapper().lookupMetaInstanceID(object); - return new CDOMetaWrapper((InternalCDOView)view, object, id); - } - catch (RuntimeException ex) - { - return null; - } - } - /* * IMPORTANT: Compile errors in this method might indicate an old version of EMF. Legacy support is only enabled for * EMF with fixed bug #247130. These compile errors do not affect native models! diff --git a/plugins/org.eclipse.net4j.db.tests/src/org/eclipse/net4j/db/tests/TestSchema.java b/plugins/org.eclipse.net4j.db.tests/src/org/eclipse/net4j/db/tests/TestSchema.java index 8de0eb9928..98d14b4814 100644 --- a/plugins/org.eclipse.net4j.db.tests/src/org/eclipse/net4j/db/tests/TestSchema.java +++ b/plugins/org.eclipse.net4j.db.tests/src/org/eclipse/net4j/db/tests/TestSchema.java @@ -4,7 +4,7 @@ * 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: * Eike Stepper - initial API and implementation */ @@ -46,9 +46,6 @@ public class TestSchema extends DBSchema public static final IDBField REPOSITORY_NEXT_CDOID = // REPOSITORY.addField("next_cdoid", DBType.BIGINT); //$NON-NLS-1$ - public static final IDBField REPOSITORY_NEXT_METAID = // - REPOSITORY.addField("next_metaid", DBType.BIGINT); //$NON-NLS-1$ - /** * DBTable cdo_packages */ |