diff options
author | Eike Stepper | 2015-05-27 11:54:17 +0000 |
---|---|---|
committer | Esteban Dugueperoux | 2015-05-27 14:03:03 +0000 |
commit | 909da9ee04592199f61d6b699355822786b0a38b (patch) | |
tree | b24bd40955e1004f7cc2c17f4d80aeb4212bef47 /plugins | |
parent | 34d10c2aa6dfdf98c6a671ace992149668a88132 (diff) | |
download | cdo-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')
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(); } |