diff options
author | Eike Stepper | 2013-08-10 11:01:36 +0000 |
---|---|---|
committer | Eike Stepper | 2013-08-10 11:01:36 +0000 |
commit | 565e69367c0cf925713e95a1d87f1f6283b45ac6 (patch) | |
tree | 43556fc78bc9adec2ce11459d87bf9052566455f | |
parent | aceccebe56cd2582af37fb7105847ae5bec8de25 (diff) | |
download | cdo-565e69367c0cf925713e95a1d87f1f6283b45ac6.tar.gz cdo-565e69367c0cf925713e95a1d87f1f6283b45ac6.tar.xz cdo-565e69367c0cf925713e95a1d87f1f6283b45ac6.zip |
[414806] ClassCastException when using unchunked and restricted
CollectionLoadingPolicies
https://bugs.eclipse.org/bugs/show_bug.cgi?id=414806
39 files changed, 512 insertions, 108 deletions
diff --git a/features/org.eclipse.emf.cdo.server.lissome-feature/feature.xml b/features/org.eclipse.emf.cdo.server.lissome-feature/feature.xml index acab3f002b..62decb5567 100644 --- a/features/org.eclipse.emf.cdo.server.lissome-feature/feature.xml +++ b/features/org.eclipse.emf.cdo.server.lissome-feature/feature.xml @@ -12,7 +12,7 @@ <feature id="org.eclipse.emf.cdo.server.lissome" label="%featureName" - version="4.2.0.qualifier" + version="4.2.1.qualifier" provider-name="%providerName" image="eclipse_update_120.jpg" license-feature="org.eclipse.emf.cdo.license" diff --git a/plugins/org.eclipse.emf.cdo.common/.settings/.api_filters b/plugins/org.eclipse.emf.cdo.common/.settings/.api_filters index a83b062f11..6f5fed218e 100644 --- a/plugins/org.eclipse.emf.cdo.common/.settings/.api_filters +++ b/plugins/org.eclipse.emf.cdo.common/.settings/.api_filters @@ -140,6 +140,15 @@ </message_arguments> </filter> </resource> + <resource path="src/org/eclipse/emf/cdo/common/protocol/CDOProtocolConstants.java" type="org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants"> + <filter id="388194388"> + <message_arguments> + <message_argument value="org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants"/> + <message_argument value="PROTOCOL_VERSION"/> + <message_argument value="13"/> + </message_arguments> + </filter> + </resource> <resource path="src/org/eclipse/emf/cdo/spi/common/id/AbstractCDOID.java" type="org.eclipse.emf.cdo.spi.common.id.AbstractCDOID"> <filter id="337682486"> <message_arguments> diff --git a/plugins/org.eclipse.emf.cdo.common/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.common/META-INF/MANIFEST.MF index 740f476366..3b47f7bc5c 100644 --- a/plugins/org.eclipse.emf.cdo.common/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.emf.cdo.common/META-INF/MANIFEST.MF @@ -36,6 +36,7 @@ Export-Package: org.eclipse.emf.cdo.common;version="4.2.1", org.eclipse.emf.cdo.server, org.eclipse.emf.cdo.server.net4j, org.eclipse.emf.cdo.ui, + org.eclipse.emf.cdo.workspace, org.eclipse.emf.cdo.tests, org.eclipse.emf.cdo.server.hibernate", org.eclipse.emf.cdo.internal.common.branch;version="4.2.1"; @@ -79,6 +80,8 @@ Export-Package: org.eclipse.emf.cdo.common;version="4.2.1", org.eclipse.emf.cdo, org.eclipse.emf.cdo.net4j, org.eclipse.emf.cdo.server, + org.eclipse.emf.cdo.server.db, + org.eclipse.emf.cdo.server.lissome, org.eclipse.emf.cdo.server.net4j, org.eclipse.emf.cdo.ui, org.eclipse.emf.cdo.tests", diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/commit/handler/BinaryCommitInfoLog.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/commit/handler/BinaryCommitInfoLog.java index 4afc31ba66..fb4bf46c6c 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/commit/handler/BinaryCommitInfoLog.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/commit/handler/BinaryCommitInfoLog.java @@ -15,7 +15,7 @@ import org.eclipse.emf.cdo.common.commit.CDOCommitInfoHandler; import org.eclipse.emf.cdo.common.id.CDOIDProvider; import org.eclipse.emf.cdo.common.model.CDOPackageRegistry; import org.eclipse.emf.cdo.common.protocol.CDODataOutput; -import org.eclipse.emf.cdo.common.util.CDOCommonUtil; +import org.eclipse.emf.cdo.internal.common.CDODataUtil; import org.eclipse.emf.cdo.internal.common.bundle.OM; import org.eclipse.net4j.util.io.ExtendedDataOutput; @@ -37,7 +37,7 @@ public class BinaryCommitInfoLog implements CDOCommitInfoHandler public BinaryCommitInfoLog(OutputStream stream, CDOPackageRegistry packageRegistry) { ExtendedDataOutput eod = ExtendedDataOutputStream.wrap(stream); - out = CDOCommonUtil.createCDODataOutput(eod, packageRegistry, CDOIDProvider.NOOP); + out = CDODataUtil.createCDODataOutput(eod, packageRegistry, CDOIDProvider.NOOP, null); } public void handleCommitInfo(CDOCommitInfo commitInfo) diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDOProtocolConstants.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDOProtocolConstants.java index ee296f172e..e2976c35a0 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDOProtocolConstants.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/protocol/CDOProtocolConstants.java @@ -28,7 +28,7 @@ public interface CDOProtocolConstants /** * @since 4.2 */ - public static final int PROTOCOL_VERSION = 13; + public static final int PROTOCOL_VERSION = 14; // ////////////////////////////////////////////////////////////////////// // Signal IDs diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/util/CDOCommonUtil.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/util/CDOCommonUtil.java index 09e73e603f..f50ad56a15 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/util/CDOCommonUtil.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/common/util/CDOCommonUtil.java @@ -23,8 +23,9 @@ import org.eclipse.emf.cdo.common.protocol.CDODataOutput; import org.eclipse.emf.cdo.common.revision.CDOListFactory; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.revision.CDORevisionFactory; +import org.eclipse.emf.cdo.internal.common.CDODataUtil; +import org.eclipse.emf.cdo.internal.common.revision.CDORevisionUnchunker; import org.eclipse.emf.cdo.spi.common.protocol.CDODataInputImpl; -import org.eclipse.emf.cdo.spi.common.protocol.CDODataOutputImpl; import org.eclipse.net4j.util.event.IEvent; import org.eclipse.net4j.util.event.IListener; @@ -109,25 +110,13 @@ public final class CDOCommonUtil } /** + * @see CDODataUtil#createCDODataOutput(ExtendedDataOutput, CDOPackageRegistry, CDOIDProvider, CDORevisionUnchunker) * @since 4.0 */ public static CDODataOutput createCDODataOutput(ExtendedDataOutput extendedDataOutputStream, final CDOPackageRegistry packageRegistry, final CDOIDProvider idProvider) { - return new CDODataOutputImpl(extendedDataOutputStream) - { - @Override - public CDOPackageRegistry getPackageRegistry() - { - return packageRegistry; - } - - @Override - public CDOIDProvider getIDProvider() - { - return idProvider; - } - }; + return CDODataUtil.createCDODataOutput(extendedDataOutputStream, packageRegistry, idProvider, null); } public static boolean isValidTimeStamp(long timeStamp, long startTime, long endTime) diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/CDODataUtil.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/CDODataUtil.java new file mode 100644 index 0000000000..7663fd27fb --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/CDODataUtil.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2010-2013 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; + +import org.eclipse.emf.cdo.common.id.CDOIDProvider; +import org.eclipse.emf.cdo.common.model.CDOPackageRegistry; +import org.eclipse.emf.cdo.common.protocol.CDODataOutput; +import org.eclipse.emf.cdo.internal.common.revision.CDORevisionUnchunker; +import org.eclipse.emf.cdo.spi.common.protocol.CDODataOutputImpl; + +import org.eclipse.net4j.util.io.ExtendedDataOutput; + + +/** + * Maintenance workaround. + * + * @author Eike Stepper + * @since 4.2 + */ +public final class CDODataUtil +{ + + /** + * @since 4.2 + */ + public static CDODataOutput createCDODataOutput(ExtendedDataOutput extendedDataOutputStream, + final CDOPackageRegistry packageRegistry, final CDOIDProvider idProvider, final CDORevisionUnchunker unchunker) + { + return new CDODataOutputImpl(extendedDataOutputStream) + { + @Override + public CDOPackageRegistry getPackageRegistry() + { + return packageRegistry; + } + + @Override + public CDOIDProvider getIDProvider() + { + return idProvider; + } + + @Override + public CDORevisionUnchunker getRevisionUnchunker() + { + return unchunker; + } + }; + } +} diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionUnchunker.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionUnchunker.java new file mode 100644 index 0000000000..ffecb72999 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/internal/common/revision/CDORevisionUnchunker.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2004-2013 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.revision; + +import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; + +/** + * @author Eike Stepper + * @since 4.2 + */ +public interface CDORevisionUnchunker +{ + public void ensureChunks(InternalCDORevision revision, int chunkSize); +} diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/protocol/CDODataOutputImpl.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/protocol/CDODataOutputImpl.java index 73cd79c095..fc42a2c61f 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/protocol/CDODataOutputImpl.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/protocol/CDODataOutputImpl.java @@ -45,6 +45,7 @@ import org.eclipse.emf.cdo.common.security.CDOPermissionProvider; import org.eclipse.emf.cdo.internal.common.bundle.OM; import org.eclipse.emf.cdo.internal.common.messages.Messages; import org.eclipse.emf.cdo.internal.common.model.CDOTypeImpl; +import org.eclipse.emf.cdo.internal.common.revision.CDORevisionUnchunker; import org.eclipse.emf.cdo.internal.common.revision.delta.CDOFeatureDeltaImpl; import org.eclipse.emf.cdo.internal.common.revision.delta.CDORevisionDeltaImpl; import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageInfo; @@ -564,6 +565,16 @@ public class CDODataOutputImpl extends ExtendedDataOutput.Delegating implements return CDORevision.PERMISSION_PROVIDER; } + /** + * @noreference This method is not intended to be referenced by clients. + * @nooverride This method is not intended to be re-implemented or extended by clients. + * @since 4.2 + */ + public CDORevisionUnchunker getRevisionUnchunker() + { + return null; + } + protected StringIO getPackageURICompressor() { return StringIO.DIRECT; diff --git a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/BaseCDORevision.java b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/BaseCDORevision.java index 1343941de4..fa91ddef6e 100644 --- a/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/BaseCDORevision.java +++ b/plugins/org.eclipse.emf.cdo.common/src/org/eclipse/emf/cdo/spi/common/revision/BaseCDORevision.java @@ -23,6 +23,7 @@ import org.eclipse.emf.cdo.common.model.CDOModelUtil; import org.eclipse.emf.cdo.common.model.CDOType; import org.eclipse.emf.cdo.common.protocol.CDODataInput; import org.eclipse.emf.cdo.common.protocol.CDODataOutput; +import org.eclipse.emf.cdo.common.revision.CDOElementProxy; import org.eclipse.emf.cdo.common.revision.CDOList; import org.eclipse.emf.cdo.common.revision.CDOListFactory; import org.eclipse.emf.cdo.common.revision.CDORevision; @@ -36,9 +37,11 @@ import org.eclipse.emf.cdo.common.security.NoPermissionException; import org.eclipse.emf.cdo.common.util.CDOCommonUtil; import org.eclipse.emf.cdo.internal.common.bundle.OM; import org.eclipse.emf.cdo.internal.common.messages.Messages; +import org.eclipse.emf.cdo.internal.common.revision.CDORevisionUnchunker; import org.eclipse.emf.cdo.internal.common.revision.delta.CDORevisionDeltaImpl; import org.eclipse.emf.cdo.spi.common.branch.CDOBranchUtil; import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranch; +import org.eclipse.emf.cdo.spi.common.protocol.CDODataOutputImpl; import org.eclipse.emf.cdo.spi.common.revision.InternalCDOList.ConfigurableEquality; import org.eclipse.net4j.util.om.trace.ContextTracer; @@ -89,8 +92,6 @@ public abstract class BaseCDORevision extends AbstractCDORevision private static final byte PERMISSION_MASK = 0x03; - private static final byte TRANSFER_MASK = PERMISSION_MASK | UNCHUNKED_FLAG; - private CDOID id; private CDOBranchPoint branchPoint; @@ -139,7 +140,7 @@ public abstract class BaseCDORevision extends AbstractCDORevision resourceID = source.resourceID; containerID = source.containerID; containingFeatureID = source.containingFeatureID; - flags = (byte)(source.flags & TRANSFER_MASK); + flags = (byte)(source.flags & ~FROZEN_FLAG); } /** @@ -154,10 +155,15 @@ public abstract class BaseCDORevision extends AbstractCDORevision readSystemValues(in); - byte flagBits = (byte)(in.readByte() & TRANSFER_MASK); + byte flagBits = in.readByte(); // Don't set permissions into this.falgs before readValues() + flagBits |= UNCHUNKED_FLAG; // First assume all lists are unchunked; may be revised below + if ((flagBits & PERMISSION_MASK) != CDOPermission.NONE.ordinal()) { - readValues(in); + if (!readValues(in)) + { + flagBits &= ~UNCHUNKED_FLAG; + } } flags = flagBits; @@ -219,23 +225,19 @@ public abstract class BaseCDORevision extends AbstractCDORevision CDOPermissionProvider permissionProvider = out.getPermissionProvider(); CDOPermission permission = permissionProvider.getPermission(this, securityContext); - - int bits = flags & TRANSFER_MASK & ~PERMISSION_MASK; - bits |= permission.getBits(); - - if (referenceChunk == CDORevision.UNCHUNKED) - { - bits |= UNCHUNKED_FLAG; - } - else - { - bits &= ~UNCHUNKED_FLAG; - } - - out.writeByte(bits); + out.writeByte(permission.getBits()); if (permission != CDOPermission.NONE) { + if (!isUnchunked() && referenceChunk != 0 && out instanceof CDODataOutputImpl) + { + CDORevisionUnchunker unchunker = ((CDODataOutputImpl)out).getRevisionUnchunker(); + if (unchunker != null) + { + unchunker.ensureChunks(this, referenceChunk); + } + } + writeValues(out, referenceChunk); } @@ -920,11 +922,13 @@ public abstract class BaseCDORevision extends AbstractCDORevision } } - private void readValues(CDODataInput in) throws IOException + private boolean readValues(CDODataInput in) throws IOException { EClass owner = getEClass(); EStructuralFeature[] features = getAllPersistentFeatures(); initValues(features); + + boolean unchunked = true; for (int i = 0; i < features.length; i++) { Object value; @@ -942,7 +946,21 @@ public abstract class BaseCDORevision extends AbstractCDORevision if (feature.isMany()) { - value = in.readCDOList(owner, feature); + CDOList list = in.readCDOList(owner, feature); + if (unchunked) + { + int size = list.size(); + if (size != 0) + { + Object lastElement = list.get(size - 1); + if (lastElement == InternalCDOList.UNINITIALIZED || lastElement instanceof CDOElementProxy) + { + unchunked = false; + } + } + } + + value = list; } else { @@ -955,6 +973,8 @@ public abstract class BaseCDORevision extends AbstractCDORevision setValue(i, value); } + + return unchunked; } public static void checkNoFeatureMap(EStructuralFeature feature) diff --git a/plugins/org.eclipse.emf.cdo.net4j/.settings/.api_filters b/plugins/org.eclipse.emf.cdo.net4j/.settings/.api_filters index d6ff76681e..710b957230 100644 --- a/plugins/org.eclipse.emf.cdo.net4j/.settings/.api_filters +++ b/plugins/org.eclipse.emf.cdo.net4j/.settings/.api_filters @@ -32,6 +32,24 @@ </message_arguments> </filter> </resource> + <resource path="src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientRequest.java" type="org.eclipse.emf.cdo.internal.net4j.protocol.CDOClientRequest"> + <filter id="642777099"> + <message_arguments> + <message_argument value="CDODataOutputImpl"/> + <message_argument value="CDOClientRequest<RESULT>"/> + <message_argument value="getRevisionUnchunker()"/> + </message_arguments> + </filter> + </resource> + <resource path="src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientRequestWithMonitoring.java" type="org.eclipse.emf.cdo.internal.net4j.protocol.CDOClientRequestWithMonitoring"> + <filter id="642777099"> + <message_arguments> + <message_argument value="CDODataOutputImpl"/> + <message_argument value="CDOClientRequestWithMonitoring<RESULT>"/> + <message_argument value="getRevisionUnchunker()"/> + </message_arguments> + </filter> + </resource> <resource path="src/org/eclipse/emf/cdo/internal/net4j/protocol/OpenSessionRequest.java" type="org.eclipse.emf.cdo.internal.net4j.protocol.OpenSessionRequest"> <filter id="572522506"> <message_arguments> diff --git a/plugins/org.eclipse.emf.cdo.net4j/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.net4j/META-INF/MANIFEST.MF index 3036f89a78..797e16edf6 100644 --- a/plugins/org.eclipse.emf.cdo.net4j/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.emf.cdo.net4j/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.emf.cdo.net4j; singleton:=true -Bundle-Version: 4.1.100.qualifier +Bundle-Version: 4.1.101.qualifier Bundle-ClassPath: . Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -10,17 +10,17 @@ Bundle-Activator: org.eclipse.emf.cdo.internal.net4j.bundle.OM$Activator Bundle-RequiredExecutionEnvironment: J2SE-1.5 Require-Bundle: org.eclipse.emf.cdo;bundle-version="[4.0.0,5.0.0)";visibility:=reexport, org.eclipse.net4j;bundle-version="[4.0.0,5.0.0)";visibility:=reexport -Export-Package: org.eclipse.emf.cdo.internal.net4j;version="4.1.100"; +Export-Package: org.eclipse.emf.cdo.internal.net4j;version="4.1.101"; x-friends:="org.eclipse.emf.cdo.tests, org.eclipse.emf.cdo.defs, org.eclipse.emf.cdo.ui, org.eclipse.emf.cdo.examples", - org.eclipse.emf.cdo.internal.net4j.bundle;version="4.1.100";x-friends:="org.eclipse.emf.cdo.tests", - org.eclipse.emf.cdo.internal.net4j.messages;version="4.1.100";x-internal:=true, - org.eclipse.emf.cdo.internal.net4j.protocol;version="4.1.100"; + org.eclipse.emf.cdo.internal.net4j.bundle;version="4.1.101";x-friends:="org.eclipse.emf.cdo.tests", + org.eclipse.emf.cdo.internal.net4j.messages;version="4.1.101";x-internal:=true, + org.eclipse.emf.cdo.internal.net4j.protocol;version="4.1.101"; x-friends:="org.eclipse.emf.cdo.tests, org.eclipse.emf.cdo.defs, org.eclipse.emf.cdo.ui, org.eclipse.emf.cdo.examples", - org.eclipse.emf.cdo.net4j;version="4.1.100" + org.eclipse.emf.cdo.net4j;version="4.1.101" Bundle-ActivationPolicy: lazy diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientRequest.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientRequest.java index 223fcebdd0..c6428a367c 100644 --- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientRequest.java +++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientRequest.java @@ -21,6 +21,7 @@ import org.eclipse.emf.cdo.common.protocol.CDODataOutput; import org.eclipse.emf.cdo.common.revision.CDOListFactory; import org.eclipse.emf.cdo.common.revision.CDORevisionFactory; import org.eclipse.emf.cdo.internal.common.revision.CDOListWithElementProxiesImpl; +import org.eclipse.emf.cdo.internal.common.revision.CDORevisionUnchunker; import org.eclipse.emf.cdo.spi.common.protocol.CDODataInputImpl; import org.eclipse.emf.cdo.spi.common.protocol.CDODataOutputImpl; @@ -71,6 +72,12 @@ public abstract class CDOClientRequest<RESULT> extends RequestWithConfirmation<R } @Override + public CDORevisionUnchunker getRevisionUnchunker() + { + return getSession(); + } + + @Override public CDOIDProvider getIDProvider() { return CDOClientRequest.this.getIDProvider(); diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientRequestWithMonitoring.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientRequestWithMonitoring.java index 584d14a3c5..90979f9802 100644 --- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientRequestWithMonitoring.java +++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/internal/net4j/protocol/CDOClientRequestWithMonitoring.java @@ -24,6 +24,7 @@ import org.eclipse.emf.cdo.common.protocol.CDODataOutput; import org.eclipse.emf.cdo.common.revision.CDOListFactory; import org.eclipse.emf.cdo.common.revision.CDORevisionFactory; import org.eclipse.emf.cdo.internal.common.revision.CDOListWithElementProxiesImpl; +import org.eclipse.emf.cdo.internal.common.revision.CDORevisionUnchunker; import org.eclipse.emf.cdo.spi.common.protocol.CDODataInputImpl; import org.eclipse.emf.cdo.spi.common.protocol.CDODataOutputImpl; @@ -103,6 +104,12 @@ public abstract class CDOClientRequestWithMonitoring<RESULT> extends RequestWith } @Override + public CDORevisionUnchunker getRevisionUnchunker() + { + return getSession(); + } + + @Override protected StringIO getPackageURICompressor() { return getProtocol().getPackageURICompressor(); 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 13da4b20ad..5e90529832 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 @@ -1042,7 +1042,7 @@ public class HorizontalBranchingClassMapping extends AbstractHorizontalClassMapp } // Make sure all chunks are loaded - repository.ensureChunks(oldRevision); + repository.ensureChunks(oldRevision, CDORevision.UNCHUNKED); InternalCDORevision newRevision = oldRevision.copy(); newRevision.adjustForCommit(accessor.getTransaction().getBranch(), created); diff --git a/plugins/org.eclipse.emf.cdo.server.lissome/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.server.lissome/META-INF/MANIFEST.MF index 3a2642f061..50b718d8cc 100644 --- a/plugins/org.eclipse.emf.cdo.server.lissome/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.emf.cdo.server.lissome/META-INF/MANIFEST.MF @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.eclipse.emf.cdo.server.lissome;singleton:=true -Bundle-Version: 4.2.0.qualifier +Bundle-Version: 4.2.1.qualifier Bundle-Name: %pluginName Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -14,9 +14,9 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)", org.eclipse.net4j.db.h2;bundle-version="[4.0.0,5.0.0)" Import-Package: org.h2;version="[1.0.0,2.0.0)", org.h2.jdbcx;version="[1.0.0,2.0.0)" -Export-Package: org.eclipse.emf.cdo.server.internal.lissome;version="4.2.0";x-friends:="org.eclipse.emf.cdo.tests.lissome", - org.eclipse.emf.cdo.server.internal.lissome.bundle;version="4.2.0";x-friends:="org.eclipse.emf.cdo.tests.lissome", - org.eclipse.emf.cdo.server.internal.lissome.db;version="4.2.0";x-friends:="org.eclipse.emf.cdo.tests.lissome", - org.eclipse.emf.cdo.server.internal.lissome.file;version="4.2.0";x-friends:="org.eclipse.emf.cdo.tests.lissome", - org.eclipse.emf.cdo.server.internal.lissome.optimizer;version="4.2.0";x-friends:="org.eclipse.emf.cdo.tests.lissome", - org.eclipse.emf.cdo.server.lissome;version="4.2.0" +Export-Package: org.eclipse.emf.cdo.server.internal.lissome;version="4.2.1";x-friends:="org.eclipse.emf.cdo.tests.lissome", + org.eclipse.emf.cdo.server.internal.lissome.bundle;version="4.2.1";x-friends:="org.eclipse.emf.cdo.tests.lissome", + org.eclipse.emf.cdo.server.internal.lissome.db;version="4.2.1";x-friends:="org.eclipse.emf.cdo.tests.lissome", + org.eclipse.emf.cdo.server.internal.lissome.file;version="4.2.1";x-friends:="org.eclipse.emf.cdo.tests.lissome", + org.eclipse.emf.cdo.server.internal.lissome.optimizer;version="4.2.1";x-friends:="org.eclipse.emf.cdo.tests.lissome", + org.eclipse.emf.cdo.server.lissome;version="4.2.1" diff --git a/plugins/org.eclipse.emf.cdo.server.lissome/src/org/eclipse/emf/cdo/server/internal/lissome/LissomeFileHandle.java b/plugins/org.eclipse.emf.cdo.server.lissome/src/org/eclipse/emf/cdo/server/internal/lissome/LissomeFileHandle.java index b07f0f66ff..205a9a4932 100644 --- a/plugins/org.eclipse.emf.cdo.server.lissome/src/org/eclipse/emf/cdo/server/internal/lissome/LissomeFileHandle.java +++ b/plugins/org.eclipse.emf.cdo.server.lissome/src/org/eclipse/emf/cdo/server/internal/lissome/LissomeFileHandle.java @@ -45,6 +45,7 @@ import org.eclipse.emf.cdo.common.revision.CDORevisionKey; import org.eclipse.emf.cdo.common.revision.delta.CDOFeatureDelta; import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta; import org.eclipse.emf.cdo.common.security.CDOPermissionProvider; +import org.eclipse.emf.cdo.internal.common.revision.CDORevisionUnchunker; import org.eclipse.emf.cdo.spi.common.protocol.CDODataInputImpl; import org.eclipse.emf.cdo.spi.common.protocol.CDODataOutputImpl; import org.eclipse.emf.cdo.spi.common.revision.DetachedCDORevision; @@ -109,6 +110,11 @@ public class LissomeFileHandle extends DataInputOutputFile implements CDODataInp return getStore().getRepository().getCommitInfoManager(); } + public CDORevisionUnchunker getRevisionUnchunker() + { + return null; + } + public CDORevisionFactory getRevisionFactory() { return CDORevisionFactory.DEFAULT; diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/.settings/.api_filters b/plugins/org.eclipse.emf.cdo.server.net4j/.settings/.api_filters index 5d1cff289d..5436a2f1e0 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/.settings/.api_filters +++ b/plugins/org.eclipse.emf.cdo.server.net4j/.settings/.api_filters @@ -1,5 +1,23 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <component id="org.eclipse.emf.cdo.server.net4j" version="2"> + <resource path="src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerIndication.java" type="org.eclipse.emf.cdo.server.internal.net4j.protocol.CDOServerIndication"> + <filter id="642777099"> + <message_arguments> + <message_argument value="CDODataOutputImpl"/> + <message_argument value="CDOServerIndication"/> + <message_argument value="getRevisionUnchunker()"/> + </message_arguments> + </filter> + </resource> + <resource path="src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerIndicationWithMonitoring.java" type="org.eclipse.emf.cdo.server.internal.net4j.protocol.CDOServerIndicationWithMonitoring"> + <filter id="642777099"> + <message_arguments> + <message_argument value="CDODataOutputImpl"/> + <message_argument value="CDOServerIndicationWithMonitoring"/> + <message_argument value="getRevisionUnchunker()"/> + </message_arguments> + </filter> + </resource> <resource path="src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerProtocol.java" type="org.eclipse.emf.cdo.server.internal.net4j.protocol.CDOServerProtocol"> <filter id="574619656"> <message_arguments> @@ -8,6 +26,15 @@ </message_arguments> </filter> </resource> + <resource path="src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerRequest.java" type="org.eclipse.emf.cdo.server.internal.net4j.protocol.CDOServerRequest"> + <filter id="642777099"> + <message_arguments> + <message_argument value="CDODataOutputImpl"/> + <message_argument value="CDOServerRequest"/> + <message_argument value="getRevisionUnchunker()"/> + </message_arguments> + </filter> + </resource> <resource path="src/org/eclipse/emf/cdo/server/internal/net4j/protocol/ReplicateRepositoryIndication.java" type="org.eclipse.emf.cdo.server.internal.net4j.protocol.ReplicateRepositoryIndication"> <filter id="574619656"> <message_arguments> diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.server.net4j/META-INF/MANIFEST.MF index 82e167aca1..0942b408d4 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.emf.cdo.server.net4j/META-INF/MANIFEST.MF @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.eclipse.emf.cdo.server.net4j;singleton:=true -Bundle-Version: 4.1.0.qualifier +Bundle-Version: 4.1.1.qualifier Bundle-Name: %pluginName Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -12,6 +12,6 @@ Bundle-ClassPath: . Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)";resolution:=optional, org.eclipse.emf.cdo.server;bundle-version="[4.0.0,5.0.0)";visibility:=reexport, org.eclipse.net4j;bundle-version="[4.0.0,5.0.0)";visibility:=reexport -Export-Package: org.eclipse.emf.cdo.server.internal.net4j.bundle;version="4.1.0";x-internal:=true, - org.eclipse.emf.cdo.server.internal.net4j.protocol;version="4.1.0";x-friends:="org.eclipse.emf.cdo.tests", - org.eclipse.emf.cdo.server.net4j;version="4.1.0" +Export-Package: org.eclipse.emf.cdo.server.internal.net4j.bundle;version="4.1.1";x-internal:=true, + org.eclipse.emf.cdo.server.internal.net4j.protocol;version="4.1.1";x-friends:="org.eclipse.emf.cdo.tests", + org.eclipse.emf.cdo.server.net4j;version="4.1.1" diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerIndication.java index f8c87600e7..c23ba3a609 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerIndication.java +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerIndication.java @@ -22,6 +22,7 @@ import org.eclipse.emf.cdo.common.revision.CDOListFactory; import org.eclipse.emf.cdo.common.revision.CDORevisionFactory; import org.eclipse.emf.cdo.common.security.CDOPermissionProvider; import org.eclipse.emf.cdo.internal.common.revision.CDOListImpl; +import org.eclipse.emf.cdo.internal.common.revision.CDORevisionUnchunker; import org.eclipse.emf.cdo.server.IStore; import org.eclipse.emf.cdo.spi.common.protocol.CDODataInputImpl; import org.eclipse.emf.cdo.spi.common.protocol.CDODataOutputImpl; @@ -139,6 +140,12 @@ public abstract class CDOServerIndication extends IndicationWithResponse } @Override + public CDORevisionUnchunker getRevisionUnchunker() + { + return getRepository(); + } + + @Override public CDOIDProvider getIDProvider() { return getSession(); diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerIndicationWithMonitoring.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerIndicationWithMonitoring.java index 2703c8968e..ce119bfcb6 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerIndicationWithMonitoring.java +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerIndicationWithMonitoring.java @@ -23,6 +23,7 @@ import org.eclipse.emf.cdo.common.protocol.CDODataOutput; import org.eclipse.emf.cdo.common.revision.CDOListFactory; import org.eclipse.emf.cdo.common.revision.CDORevisionFactory; import org.eclipse.emf.cdo.internal.common.revision.CDOListImpl; +import org.eclipse.emf.cdo.internal.common.revision.CDORevisionUnchunker; import org.eclipse.emf.cdo.server.IStore; import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry; import org.eclipse.emf.cdo.spi.common.protocol.CDODataInputImpl; @@ -175,6 +176,12 @@ public abstract class CDOServerIndicationWithMonitoring extends IndicationWithMo } @Override + public CDORevisionUnchunker getRevisionUnchunker() + { + return CDOServerIndicationWithMonitoring.this.getRepository(); + } + + @Override public CDOIDProvider getIDProvider() { return CDOServerIndicationWithMonitoring.this.getSession(); diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerRequest.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerRequest.java index 3f41f947cc..1df334f00d 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerRequest.java +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerRequest.java @@ -13,6 +13,7 @@ package org.eclipse.emf.cdo.server.internal.net4j.protocol; import org.eclipse.emf.cdo.common.id.CDOIDProvider; import org.eclipse.emf.cdo.common.model.CDOPackageRegistry; import org.eclipse.emf.cdo.common.protocol.CDODataOutput; +import org.eclipse.emf.cdo.internal.common.revision.CDORevisionUnchunker; import org.eclipse.emf.cdo.spi.common.protocol.CDODataOutputImpl; import org.eclipse.emf.cdo.spi.server.InternalSession; @@ -55,6 +56,12 @@ public abstract class CDOServerRequest extends Request } @Override + public CDORevisionUnchunker getRevisionUnchunker() + { + return getSession().getManager().getRepository(); + } + + @Override protected StringIO getPackageURICompressor() { return getProtocol().getPackageURICompressor(); diff --git a/plugins/org.eclipse.emf.cdo.server/.settings/.api_filters b/plugins/org.eclipse.emf.cdo.server/.settings/.api_filters index f790337344..30844fe201 100644 --- a/plugins/org.eclipse.emf.cdo.server/.settings/.api_filters +++ b/plugins/org.eclipse.emf.cdo.server/.settings/.api_filters @@ -393,6 +393,14 @@ </message_arguments> </filter> </resource> + <resource path="src/org/eclipse/emf/cdo/spi/server/InternalRepository.java" type="org.eclipse.emf.cdo.spi.server.InternalRepository"> + <filter id="576720909"> + <message_arguments> + <message_argument value="CDORevisionUnchunker"/> + <message_argument value="InternalRepository"/> + </message_arguments> + </filter> + </resource> <resource path="src/org/eclipse/emf/cdo/spi/server/InternalSession.java" type="org.eclipse.emf.cdo.spi.server.InternalSession"> <filter id="571473929"> <message_arguments> diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/DelegatingRepository.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/DelegatingRepository.java index 8f10d1ce0a..3fe2aa9f5c 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/DelegatingRepository.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/DelegatingRepository.java @@ -471,9 +471,9 @@ public abstract class DelegatingRepository implements InternalRepository getDelegate().setLastCommitTimeStamp(commitTimeStamp); } - public void ensureChunks(InternalCDORevision revision) + public void ensureChunk(InternalCDORevision revision, int chunkSize) { - getDelegate().ensureChunks(revision); + getDelegate().ensureChunks(revision, chunkSize); } public void replicate(CDOReplicationContext context) 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 9c671fc2a8..07b05504a6 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 @@ -597,16 +597,48 @@ public class Repository extends Container<Object> implements InternalRepository public void ensureChunks(InternalCDORevision revision) { - if (!revision.isUnchunked()) + ensureChunks(revision, CDORevision.UNCHUNKED); + } + + public void ensureChunks(InternalCDORevision revision, int chunkSize) + { + if (revision.isUnchunked()) { - for (EStructuralFeature feature : revision.getClassInfo().getAllPersistentFeatures()) + return; + } + + IStoreAccessor accessor = null; + boolean unchunked = true; + for (EStructuralFeature feature : revision.getClassInfo().getAllPersistentFeatures()) + { + if (feature.isMany()) { - if (feature.isMany()) + MoveableList<Object> list = revision.getList(feature); + int size = list.size(); + if (chunkSize == CDORevision.UNCHUNKED) { - ensureChunk(revision, feature, 0, revision.getList(feature).size()); + chunkSize = size; + } + + int chunkEnd = Math.min(chunkSize, size); + accessor = ensureChunk(revision, feature, accessor, list, 0, chunkEnd); + + if (unchunked) + { + for (int i = chunkEnd + 1; i < size; i++) + { + if (list.get(i) == InternalCDOList.UNINITIALIZED) + { + unchunked = false; + break; + } + } } } + } + if (unchunked) + { revision.setUnchunked(); } } @@ -618,12 +650,42 @@ public class Repository extends Container<Object> implements InternalRepository { MoveableList<Object> list = revision.getList(feature); chunkEnd = Math.min(chunkEnd, list.size()); - return ensureChunk(revision, feature, StoreThreadLocal.getAccessor(), list, chunkStart, chunkEnd); + IStoreAccessor accessor = StoreThreadLocal.getAccessor(); + ensureChunk(revision, feature, accessor, list, chunkStart, chunkEnd); + + // TODO Expensive: if the revision is unchunked all lists/elements must be visited + if (isUnchunked(revision)) + { + revision.setUnchunked(); + } + + return accessor; } return null; } + private boolean isUnchunked(InternalCDORevision revision) + { + for (EStructuralFeature feature : revision.getClassInfo().getAllPersistentFeatures()) + { + if (feature.isMany()) + { + MoveableList<Object> list = revision.getList(feature); + int size = list.size(); + for (int i = 0; i < size; i++) + { + if (list.get(i) == InternalCDOList.UNINITIALIZED) + { + return false; + } + } + } + } + + return true; + } + protected IStoreAccessor ensureChunk(InternalCDORevision revision, EStructuralFeature feature, IStoreAccessor accessor, MoveableList<Object> list, int chunkStart, int chunkEnd) { diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java index 51d65a91b7..96da2a92b0 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/ServerCDOView.java @@ -905,6 +905,11 @@ public class ServerCDOView extends AbstractCDOView implements org.eclipse.emf.cd throw new UnsupportedOperationException(); } + public void ensureChunks(InternalCDORevision revision, int chunkSize) + { + throw new UnsupportedOperationException(); + } + public void processRefreshSessionResult(RefreshSessionResult result, CDOBranch branch, List<InternalCDOView> branchViews, Map<CDOBranch, Map<CDOID, InternalCDORevision>> viewedRevisions) { 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 c7ac0db18c..efac9096a8 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 @@ -1098,7 +1098,7 @@ public class TransactionCommitContext implements InternalCommitContext } // Make sure all chunks are loaded - repository.ensureChunks(oldRevision); + repository.ensureChunks(oldRevision, CDORevision.UNCHUNKED); InternalCDORevision newRevision = oldRevision.copy(); newRevision.adjustForCommit(branch, timeStamp); diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java index 2798fe707c..8d25ded65b 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/View.java @@ -145,8 +145,8 @@ public class View extends Lifecycle implements InternalView, CDOCommonView.Optio else if (newRevision != oldRevision) { // Fix for Bug 369646: ensure that revisions are fully loaded - repository.ensureChunks((InternalCDORevision)newRevision); - repository.ensureChunks((InternalCDORevision)oldRevision); + repository.ensureChunks((InternalCDORevision)newRevision, CDORevision.UNCHUNKED); + repository.ensureChunks((InternalCDORevision)oldRevision, CDORevision.UNCHUNKED); CDORevisionDelta delta = newRevision.compare(oldRevision); allChangedObjects.add(delta); 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 6e76b1f60c..0634c6d387 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 @@ -506,7 +506,7 @@ public abstract class CDOServerExporter<OUT> out.push(); InternalRepository repository = (InternalRepository)getRepository(); - repository.ensureChunks(rev); + repository.ensureChunks(rev, CDORevision.UNCHUNKED); CDOClassInfo classInfo = rev.getClassInfo(); for (EStructuralFeature feature : classInfo.getAllPersistentFeatures()) diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalRepository.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalRepository.java index 02a95206f3..d5e4566453 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalRepository.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/spi/server/InternalRepository.java @@ -20,6 +20,7 @@ import org.eclipse.emf.cdo.common.protocol.CDODataOutput; import org.eclipse.emf.cdo.common.revision.CDORevision; import org.eclipse.emf.cdo.common.revision.CDORevisionHandler; import org.eclipse.emf.cdo.common.revision.CDORevisionKey; +import org.eclipse.emf.cdo.internal.common.revision.CDORevisionUnchunker; import org.eclipse.emf.cdo.server.IQueryHandlerProvider; import org.eclipse.emf.cdo.server.IRepository; import org.eclipse.emf.cdo.server.IStoreAccessor; @@ -62,7 +63,7 @@ import java.util.concurrent.Semaphore; * @noimplement This interface is not intended to be implemented by clients. */ public interface InternalRepository extends IRepository, PackageProcessor, PackageLoader, BranchLoader, RevisionLoader, - CommitInfoLoader + CommitInfoLoader, CDORevisionUnchunker { public void setName(String name); diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ChunkingTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ChunkingTest.java index 8f3e20cc9c..e5c7aedb7b 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ChunkingTest.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ChunkingTest.java @@ -35,6 +35,8 @@ import java.util.List; */ public class ChunkingTest extends AbstractCDOTest { + private static final String RESOURCE_PATH = "/test"; + public void testReadNative() throws Exception { { @@ -137,8 +139,6 @@ public class ChunkingTest extends AbstractCDOTest clearCache(getRepository().getRevisionManager()); - // ************************************************************* // - CDOSession session = openSession(); CDOTransaction transaction = session.openTransaction(); transaction.options().setRevisionPrefetchingPolicy(CDOUtil.createRevisionPrefetchingPolicy(10)); @@ -174,7 +174,6 @@ public class ChunkingTest extends AbstractCDOTest } clearCache(getRepository().getRevisionManager()); - // ************************************************************* // CDOSession session = openSession(); session.options().setCollectionLoadingPolicy(CDOUtil.createCollectionLoadingPolicy(10, 10)); @@ -217,7 +216,6 @@ public class ChunkingTest extends AbstractCDOTest } clearCache(getRepository().getRevisionManager()); - // ************************************************************* // CDOSession session = openSession(); session.options().setCollectionLoadingPolicy(CDOUtil.createCollectionLoadingPolicy(10, 10)); @@ -242,8 +240,6 @@ public class ChunkingTest extends AbstractCDOTest } } - private static final String RESOURCE_PATH = "/test"; - public void testPartiallyLoadedAdd() throws CommitException { createInitialList(); @@ -257,7 +253,6 @@ public class ChunkingTest extends AbstractCDOTest list.getElements().add(9); tx.commit(); - tx.close(); session.close(); clearCache(getRepository().getRevisionManager()); @@ -326,20 +321,16 @@ public class ChunkingTest extends AbstractCDOTest private void createInitialList() throws CommitException { - CDOSession session = openSession(); - CDOTransaction tx = session.openTransaction(); - CDOResource resource = tx.createResource(getResourcePath(RESOURCE_PATH)); - GenListOfInt list = Model5Factory.eINSTANCE.createGenListOfInt(); - list.getElements().addAll(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8)); + CDOSession session = openSession(); + CDOTransaction tx = session.openTransaction(); + CDOResource resource = tx.createResource(getResourcePath(RESOURCE_PATH)); resource.getContents().add(list); tx.commit(); - tx.close(); session.close(); - clearCache(getRepository().getRevisionManager()); } diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_405606_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_405606_Test.java new file mode 100644 index 0000000000..a030140494 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_405606_Test.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2013 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.tests.bugzilla; + +import org.eclipse.emf.cdo.eresource.CDOResource; +import org.eclipse.emf.cdo.session.CDOSession; +import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; +import org.eclipse.emf.cdo.tests.AbstractCDOTest; +import org.eclipse.emf.cdo.tests.model1.Category; +import org.eclipse.emf.cdo.transaction.CDOTransaction; +import org.eclipse.emf.cdo.util.CDOUtil; +import org.eclipse.emf.cdo.view.CDOView; + +import org.eclipse.net4j.util.io.IOUtil; + +/** + * @author Eike Stepper + */ +public class Bugzilla_405606_Test extends AbstractCDOTest +{ + public void testUnchunkedRevisionWithPCL() throws Exception + { + { + // Set up a resource with 10 objects as content + CDOSession session = openSession(); + CDOTransaction transaction = session.openTransaction(); + CDOResource res = transaction.createResource(getResourcePath("/test")); + + Category cat = getModel1Factory().createCategory(); + cat.setName("Container"); + res.getContents().add(cat); + + for (int i = 0; i < 10; i++) + { + Category c = getModel1Factory().createCategory(); + c.setName("Test " + i); + cat.getCategories().add(c); + } + + transaction.commit(); + session.close(); + } + + // Now clear the cache on server + clearCache(getRepository().getRevisionManager()); + + { + // Open a new session with PCL enabled + CDOSession session = openSession(); + session.options().setCollectionLoadingPolicy(CDOUtil.createCollectionLoadingPolicy(1, 1)); + + // Load the category into the resource (is now partially loaded) + CDOView view = session.openView(); + CDOResource res = view.getResource(getResourcePath("/test")); + Category cat = (Category)res.getContents().get(0); + + IOUtil.OUT() + .println("Unchunked: " + ((InternalCDORevision)CDOUtil.getCDOObject(cat).cdoRevision()).isUnchunked()); + + session.close(); + } + + { + // Open a new session, this time with PCL disabled + CDOSession session = openSession(); + session.options().setCollectionLoadingPolicy(null); + + // Load the category into the resource (is now partially loaded) + CDOView view = session.openView(); + CDOResource res = view.getResource(getResourcePath("/test")); + Category cat = (Category)res.getContents().get(0); + + IOUtil.OUT() + .println("Unchunked: " + ((InternalCDORevision)CDOUtil.getCDOObject(cat).cdoRevision()).isUnchunked()); + + // Try to iterate over the items + for (Category child : cat.getCategories()) + { + IOUtil.OUT().println(child.getName()); + } + + session.close(); + } + } +} diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/impl/RepositoryConfig.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/impl/RepositoryConfig.java index c50865cc36..70e2ec918a 100644 --- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/impl/RepositoryConfig.java +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/config/impl/RepositoryConfig.java @@ -82,6 +82,7 @@ import java.io.FileOutputStream; import java.io.PrintStream; import java.lang.annotation.Annotation; import java.lang.reflect.Method; +import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -231,6 +232,17 @@ public abstract class RepositoryConfig extends Config implements IRepositoryConf return repositoryProperties; } + public synchronized InternalRepository[] getRepositories() + { + if (repositories == null) + { + return new InternalRepository[0]; + } + + Collection<InternalRepository> values = repositories.values(); + return values.toArray(new InternalRepository[values.size()]); + } + public synchronized InternalRepository getRepository(String name) { return getRepository(name, true); @@ -310,7 +322,7 @@ public abstract class RepositoryConfig extends Config implements IRepositoryConf protected void onDeactivated(ILifecycle lifecycle) { IRepository repository = (IRepository)lifecycle; - synchronized (repositories) + synchronized (RepositoryConfig.this) { repositories.remove(repository.getName()); } @@ -356,6 +368,10 @@ public abstract class RepositoryConfig extends Config implements IRepositoryConf { deactivateRepositories(); } + else + { + resetRepositories(); + } if (repositories == null) { @@ -417,13 +433,7 @@ public abstract class RepositoryConfig extends Config implements IRepositoryConf protected void deactivateRepositories() { - Object[] array; - synchronized (repositories) - { - array = repositories.values().toArray(); - } - - for (Object repository : array) + for (InternalRepository repository : getRepositories()) { LifecycleUtil.deactivate(repository); } @@ -434,6 +444,14 @@ public abstract class RepositoryConfig extends Config implements IRepositoryConf StoreThreadLocal.release(); } + protected void resetRepositories() + { + for (InternalRepository repository : getRepositories()) + { + repository.getRevisionManager().getCache().clear(); + } + } + protected void addResourcePathChecker(InternalRepository repository) { if (resourcePathChecker == null) @@ -473,13 +491,7 @@ public abstract class RepositoryConfig extends Config implements IRepositoryConf protected void removeResourcePathChecker() { - InternalRepository[] array; - synchronized (repositories) - { - array = repositories.values().toArray(new InternalRepository[repositories.size()]); - } - - for (InternalRepository repository : array) + for (InternalRepository repository : getRepositories()) { for (Handler handler : repository.getHandlers()) { @@ -734,7 +746,7 @@ public abstract class RepositoryConfig extends Config implements IRepositoryConf final String masterName = "master"; InternalRepository master; - synchronized (repositories) + synchronized (OfflineConfig.this) { master = repositories.get(masterName); if (master == null) diff --git a/plugins/org.eclipse.emf.cdo.workspace/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.cdo.workspace/META-INF/MANIFEST.MF index bcb993a2bf..6c0708437e 100644 --- a/plugins/org.eclipse.emf.cdo.workspace/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.emf.cdo.workspace/META-INF/MANIFEST.MF @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.eclipse.emf.cdo.workspace;singleton:=true -Bundle-Version: 4.1.100.qualifier +Bundle-Version: 4.1.101.qualifier Bundle-Name: %pluginName Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -13,7 +13,7 @@ Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)";resoluti org.eclipse.emf.cdo.server.net4j;bundle-version="[4.0.0,5.0.0)", org.eclipse.emf.cdo.net4j;bundle-version="[4.0.0,5.0.0)", org.eclipse.net4j.jvm;bundle-version="[4.0.0,5.0.0)" -Export-Package: org.eclipse.emf.cdo.internal.workspace;version="4.1.100";x-friends:="org.eclipse.emf.cdo.tests,org.eclipse.emf.cdo.tests.db,org.eclipse.emf.cdo.ui.workspace", - org.eclipse.emf.cdo.internal.workspace.bundle;version="4.1.100";x-internal:=true, - org.eclipse.emf.cdo.spi.workspace;version="4.1.100", - org.eclipse.emf.cdo.workspace;version="4.1.100" +Export-Package: org.eclipse.emf.cdo.internal.workspace;version="4.1.101";x-friends:="org.eclipse.emf.cdo.tests,org.eclipse.emf.cdo.tests.db,org.eclipse.emf.cdo.ui.workspace", + org.eclipse.emf.cdo.internal.workspace.bundle;version="4.1.101";x-internal:=true, + org.eclipse.emf.cdo.spi.workspace;version="4.1.101", + org.eclipse.emf.cdo.workspace;version="4.1.101" diff --git a/plugins/org.eclipse.emf.cdo.workspace/src/org/eclipse/emf/cdo/internal/workspace/AbstractCDOWorkspaceBase.java b/plugins/org.eclipse.emf.cdo.workspace/src/org/eclipse/emf/cdo/internal/workspace/AbstractCDOWorkspaceBase.java index 99e4502bc8..5c8f6c1823 100644 --- a/plugins/org.eclipse.emf.cdo.workspace/src/org/eclipse/emf/cdo/internal/workspace/AbstractCDOWorkspaceBase.java +++ b/plugins/org.eclipse.emf.cdo.workspace/src/org/eclipse/emf/cdo/internal/workspace/AbstractCDOWorkspaceBase.java @@ -17,9 +17,11 @@ import org.eclipse.emf.cdo.common.protocol.CDODataOutput; import org.eclipse.emf.cdo.common.revision.CDOListFactory; import org.eclipse.emf.cdo.common.revision.CDORevisionFactory; import org.eclipse.emf.cdo.common.util.CDOCommonUtil; +import org.eclipse.emf.cdo.internal.common.CDODataUtil; import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranchManager; import org.eclipse.emf.cdo.spi.common.model.InternalCDOPackageRegistry; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; +import org.eclipse.emf.cdo.spi.server.InternalRepository; import org.eclipse.emf.cdo.spi.workspace.InternalCDOWorkspace; import org.eclipse.emf.cdo.spi.workspace.InternalCDOWorkspaceBase; import org.eclipse.emf.cdo.transaction.CDOTransaction; @@ -121,10 +123,11 @@ public abstract class AbstractCDOWorkspaceBase implements InternalCDOWorkspaceBa protected CDODataOutput createCDODataOutput(ExtendedDataOutputStream edos) { - InternalCDOPackageRegistry packageRegistry = workspace.getLocalRepository().getPackageRegistry(false); + InternalRepository localRepository = workspace.getLocalRepository(); + InternalCDOPackageRegistry packageRegistry = localRepository.getPackageRegistry(false); CDOIDProvider idProvider = CDOIDProvider.NOOP; - return CDOCommonUtil.createCDODataOutput(edos, packageRegistry, idProvider); + return CDODataUtil.createCDODataOutput(edos, packageRegistry, idProvider, localRepository); } protected abstract void doClear(); diff --git a/plugins/org.eclipse.emf.cdo/.settings/.api_filters b/plugins/org.eclipse.emf.cdo/.settings/.api_filters index a8efbde16d..731ca9445e 100644 --- a/plugins/org.eclipse.emf.cdo/.settings/.api_filters +++ b/plugins/org.eclipse.emf.cdo/.settings/.api_filters @@ -589,6 +589,15 @@ </message_arguments> </filter> </resource> + <resource path="src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java" type="org.eclipse.emf.internal.cdo.transaction.CDOTransactionImpl"> + <filter id="642777099"> + <message_arguments> + <message_argument value="CDODataOutputImpl"/> + <message_argument value="CDOTransactionImpl"/> + <message_argument value="getRevisionUnchunker()"/> + </message_arguments> + </filter> + </resource> <resource path="src/org/eclipse/emf/internal/cdo/util/DefaultLocksChangedEvent.java" type="org.eclipse.emf.internal.cdo.util.DefaultLocksChangedEvent"> <filter id="574619656"> <message_arguments> @@ -661,4 +670,12 @@ </message_arguments> </filter> </resource> + <resource path="src/org/eclipse/emf/spi/cdo/InternalCDOSession.java" type="org.eclipse.emf.spi.cdo.InternalCDOSession"> + <filter id="576720909"> + <message_arguments> + <message_argument value="CDORevisionUnchunker"/> + <message_argument value="InternalCDOSession"/> + </message_arguments> + </filter> + </resource> </component> diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java index e20477f37b..1385fabeae 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOSessionImpl.java @@ -839,6 +839,11 @@ public abstract class CDOSessionImpl extends CDOTransactionContainerImpl impleme } } + public void ensureChunks(InternalCDORevision revision, int chunkSize) + { + resolveAllElementProxies(revision); + } + public void handleRepositoryTypeChanged(CDOCommonRepository.Type oldType, CDOCommonRepository.Type newType) { fireEvent(new RepositoryTypeChangedEvent(this, oldType, newType)); diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java index ccfb9bb20d..1658e28e5b 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOTransactionImpl.java @@ -68,6 +68,7 @@ import org.eclipse.emf.cdo.eresource.impl.CDOResourceImpl; import org.eclipse.emf.cdo.eresource.impl.CDOResourceNodeImpl; import org.eclipse.emf.cdo.internal.common.commit.FailureCommitInfo; import org.eclipse.emf.cdo.internal.common.revision.CDOListWithElementProxiesImpl; +import org.eclipse.emf.cdo.internal.common.revision.CDORevisionUnchunker; import org.eclipse.emf.cdo.session.CDORepositoryInfo; import org.eclipse.emf.cdo.spi.common.branch.CDOBranchUtil; import org.eclipse.emf.cdo.spi.common.commit.CDOCommitInfoUtil; @@ -2007,6 +2008,12 @@ public class CDOTransactionImpl extends CDOViewImpl implements InternalCDOTransa { return getSession().getPackageRegistry(); } + + @Override + public CDORevisionUnchunker getRevisionUnchunker() + { + return getSession(); + } }; List<CDOSavepoint> savepoints = new ArrayList<CDOSavepoint>(); diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOSession.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOSession.java index 77d8c492d9..905356caac 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOSession.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/InternalCDOSession.java @@ -20,6 +20,7 @@ import org.eclipse.emf.cdo.common.id.CDOIDGenerator; import org.eclipse.emf.cdo.common.lob.CDOLobStore; import org.eclipse.emf.cdo.common.lock.CDOLockChangeInfo; import org.eclipse.emf.cdo.common.revision.CDORevision; +import org.eclipse.emf.cdo.internal.common.revision.CDORevisionUnchunker; import org.eclipse.emf.cdo.session.CDORepositoryInfo; import org.eclipse.emf.cdo.session.CDOSession; import org.eclipse.emf.cdo.spi.common.branch.InternalCDOBranch; @@ -52,7 +53,8 @@ import java.util.Set; * @noextend This interface is not intended to be extended by clients. * @noimplement This interface is not intended to be implemented by clients. */ -public interface InternalCDOSession extends CDOSession, PackageProcessor, PackageLoader, RevisionLocker, ILifecycle +public interface InternalCDOSession extends CDOSession, PackageProcessor, PackageLoader, RevisionLocker, + CDORevisionUnchunker, ILifecycle { public CDOSessionProtocol getSessionProtocol(); |