Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2015-05-27 11:54:17 +0000
committerEsteban Dugueperoux2015-05-27 14:03:03 +0000
commit909da9ee04592199f61d6b699355822786b0a38b (patch)
treeb24bd40955e1004f7cc2c17f4d80aeb4212bef47 /plugins
parent34d10c2aa6dfdf98c6a671ace992149668a88132 (diff)
downloadcdo-909da9ee04592199f61d6b699355822786b0a38b.tar.gz
cdo-909da9ee04592199f61d6b699355822786b0a38b.tar.xz
cdo-909da9ee04592199f61d6b699355822786b0a38b.zip
[437817] RuntimeException using connection aware URI
- Have CDOViewProvider set just after CDOView/CDOTransaction init to have CDOViewSetImpl.getViewURI() called from CDOViewSetImpl.add() use a correct viewURI as key of its map. - Have TCPConnector add default port number in authority to have an unique id for viewURI. Change-Id: Id02c6be9ad6cc29137d83bf3d0e149e588a906f3 Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=437817 Signed-off-by: Esteban Dugueperoux <esteban.dugueperoux@obeo.fr> Signed-off-by: Eike Stepper <stepper@esc-net.de>
Diffstat (limited to 'plugins')
-rw-r--r--plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/net4j/CDONet4jViewProvider.java13
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_437817_Test.java80
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOURIData.java8
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOViewContainerImpl.java9
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewProviderRegistryImpl.java16
-rw-r--r--plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPConnector.java8
6 files changed, 123 insertions, 11 deletions
diff --git a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/net4j/CDONet4jViewProvider.java b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/net4j/CDONet4jViewProvider.java
index b11ddc1fd0..3965ec027f 100644
--- a/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/net4j/CDONet4jViewProvider.java
+++ b/plugins/org.eclipse.emf.cdo.net4j/src/org/eclipse/emf/cdo/net4j/CDONet4jViewProvider.java
@@ -18,6 +18,7 @@ import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.emf.cdo.view.CDOViewProvider;
import org.eclipse.net4j.Net4jUtil;
+import org.eclipse.net4j.channel.IChannel;
import org.eclipse.net4j.connector.IConnector;
import org.eclipse.net4j.util.container.FactoryNotFoundException;
import org.eclipse.net4j.util.container.IManagedContainer;
@@ -89,7 +90,10 @@ public abstract class CDONet4jViewProvider extends AbstractCDOViewProvider
@Override
public URI getViewURI(URI uri)
{
- return super.getViewURI(uri).appendSegment(uri.segment(1));
+ CDOURIData uriData = new CDOURIData(uri);
+ uriData.setResourcePath(null);
+ uriData.setExtraParameters(null);
+ return uriData.toURI();
}
@Override
@@ -119,7 +123,12 @@ public abstract class CDONet4jViewProvider extends AbstractCDOViewProvider
// builder.append("@");
// }
- IConnector connector = (IConnector)session.options().getNet4jProtocol().getChannel().getMultiplexer();
+ IChannel channel = session.options().getNet4jProtocol().getChannel();
+ if (channel == null)
+ {
+ return null;
+ }
+ IConnector connector = (IConnector)channel.getMultiplexer();
String repositoryName = session.getRepositoryInfo().getName();
append(builder, connector, repositoryName);
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_437817_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_437817_Test.java
new file mode 100644
index 0000000000..b33b5cce59
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_437817_Test.java
@@ -0,0 +1,80 @@
+/*
+ * 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:
+ * Esteban Dugueperoux - initial API and implementation
+ */
+package org.eclipse.emf.cdo.tests.bugzilla;
+
+import org.eclipse.emf.cdo.eresource.CDOResource;
+import org.eclipse.emf.cdo.eresource.CDOResourceFactory;
+import org.eclipse.emf.cdo.net4j.CDONet4jUtil;
+import org.eclipse.emf.cdo.server.IRepository.Props;
+import org.eclipse.emf.cdo.tests.AbstractCDOTest;
+import org.eclipse.emf.cdo.tests.config.ISessionConfig;
+import org.eclipse.emf.cdo.tests.config.impl.ConfigTest.Requires;
+import org.eclipse.emf.cdo.tests.config.impl.RepositoryConfig;
+import org.eclipse.emf.cdo.util.CDOURIData;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.Resource.Factory.Registry;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+
+import org.junit.Assert;
+
+/**
+ * Bug 437817: "Only one view per repository..." RuntimeException using connection aware URI
+ *
+ * @author Esteban Dugueperoux
+ */
+@Requires(ISessionConfig.CAPABILITY_NET4J_TCP)
+public class Bugzilla_437817_Test extends AbstractCDOTest
+{
+
+ public void testConnectionAwareURITwiceCDOResourceCreation() throws Exception
+ {
+ getRepository();
+
+ Registry registry = Resource.Factory.Registry.INSTANCE;
+ registry.getProtocolToFactoryMap().put(CDONet4jUtil.PROTOCOL_TCP, CDOResourceFactory.INSTANCE);
+
+ try
+ {
+ ResourceSet resourceSet = new ResourceSetImpl();
+
+ URI sharedResource1URI = URI.createURI(
+ CDONet4jUtil.PROTOCOL_TCP + "://localhost:2036/" + RepositoryConfig.REPOSITORY_NAME
+ + getResourcePath("/sharedResource1")).appendQuery(CDOURIData.TRANSACTIONAL_PARAMETER + "=true");
+ URI sharedResource2URI = URI.createURI(
+ CDONet4jUtil.PROTOCOL_TCP + "://localhost:2036/" + RepositoryConfig.REPOSITORY_NAME
+ + getResourcePath("/sharedResource2")).appendQuery(CDOURIData.TRANSACTIONAL_PARAMETER + "=true");
+ Resource sharedResource1 = resourceSet.createResource(sharedResource1URI);
+ Resource sharedResource2 = resourceSet.createResource(sharedResource2URI);
+
+ Assert.assertTrue(sharedResource1 instanceof CDOResource);
+ Assert.assertTrue(sharedResource2 instanceof CDOResource);
+ CDOResource sharedCDOResource1 = (CDOResource)sharedResource1;
+ CDOResource sharedCDOResource2 = (CDOResource)sharedResource2;
+ assertEquals(
+ "Both CDOResources should have the same CDOView as they have the same ResourceSet and use content from the same repository",
+ sharedCDOResource1.cdoView(), sharedCDOResource2.cdoView());
+ }
+ finally
+ {
+ registry.getProtocolToFactoryMap().remove(CDONet4jUtil.PROTOCOL_TCP);
+ }
+ }
+
+ public void testConnectionAwareURITwiceCDOResourceCreationWithUUID() throws Exception
+ {
+ getTestProperties().put(Props.OVERRIDE_UUID, RepositoryConfig.REPOSITORY_NAME + "UUID");
+ testConnectionAwareURITwiceCDOResourceCreation();
+ }
+
+}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOURIData.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOURIData.java
index 695f9df644..62df8008af 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOURIData.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/util/CDOURIData.java
@@ -324,6 +324,14 @@ public final class CDOURIData
return extraParameters;
}
+ /**
+ * @since 4.4
+ */
+ public void setExtraParameters(Map<String, String> extraParameters)
+ {
+ this.extraParameters = extraParameters;
+ }
+
public URI toURI()
{
return URI.createURI(toString());
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOViewContainerImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOViewContainerImpl.java
index 947e191958..43f555a101 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOViewContainerImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/session/CDOViewContainerImpl.java
@@ -19,6 +19,7 @@ import org.eclipse.emf.cdo.common.branch.CDOBranch;
import org.eclipse.emf.cdo.common.branch.CDOBranchPoint;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.emf.cdo.view.CDOViewContainer;
+import org.eclipse.emf.cdo.view.CDOViewProvider;
import org.eclipse.emf.internal.cdo.view.CDOViewImpl;
@@ -42,6 +43,8 @@ import java.util.Set;
*/
public abstract class CDOViewContainerImpl extends Container<CDOView>implements CDOViewContainer
{
+ public static final ThreadLocal<CDOViewProvider> VIEW_PROVIDER = new ThreadLocal<CDOViewProvider>();
+
private Set<InternalCDOView> views = new HashSet<InternalCDOView>();
@ExcludeFromDump
@@ -247,6 +250,12 @@ public abstract class CDOViewContainerImpl extends Container<CDOView>implements
*/
protected void initView(InternalCDOView view, ResourceSet resourceSet)
{
+ CDOViewProvider viewProvider = VIEW_PROVIDER.get();
+ if (viewProvider != null)
+ {
+ view.setProvider(viewProvider);
+ }
+
InternalCDOViewSet viewSet = SessionUtil.prepareResourceSet(resourceSet);
synchronized (views)
{
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewProviderRegistryImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewProviderRegistryImpl.java
index 92e7d3759d..0cb23f632f 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewProviderRegistryImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/view/CDOViewProviderRegistryImpl.java
@@ -21,6 +21,7 @@ import org.eclipse.emf.cdo.view.CDOViewSet;
import org.eclipse.emf.internal.cdo.bundle.OM;
import org.eclipse.emf.internal.cdo.messages.Messages;
+import org.eclipse.emf.internal.cdo.session.CDOViewContainerImpl;
import org.eclipse.net4j.util.StringUtil;
import org.eclipse.net4j.util.WrappedException;
@@ -148,10 +149,19 @@ public class CDOViewProviderRegistryImpl extends Container<CDOViewProvider>imple
}
}
- InternalCDOView view = (InternalCDOView)viewProvider.getView(uri, resourceSet);
- if (view != null)
+ try
+ {
+ CDOViewContainerImpl.VIEW_PROVIDER.set(viewProvider);
+
+ InternalCDOView view = (InternalCDOView)viewProvider.getView(uri, resourceSet);
+ if (view != null)
+ {
+ return view;
+ }
+ }
+ finally
{
- return view;
+ CDOViewContainerImpl.VIEW_PROVIDER.remove();
}
return null;
diff --git a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPConnector.java b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPConnector.java
index bed021ce3d..5ebd81364d 100644
--- a/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPConnector.java
+++ b/plugins/org.eclipse.net4j.tcp/src/org/eclipse/net4j/internal/tcp/TCPConnector.java
@@ -159,12 +159,8 @@ public abstract class TCPConnector extends Connector implements ITCPConnector, I
StringBuilder builder = new StringBuilder();
builder.append(getProtocolString());
builder.append(host);
- if (port != DEFAULT_PORT)
- {
- builder.append(":");
- builder.append(port);
- }
-
+ builder.append(":");
+ builder.append(port);
return builder.toString();
}

Back to the top