diff options
author | Esteban Dugueperoux | 2013-08-06 07:48:26 +0000 |
---|---|---|
committer | Eike Stepper | 2013-08-07 06:22:18 +0000 |
commit | 843fb3a079b79d19266f614182fa635c829e1243 (patch) | |
tree | 008187d8ae6dc2f0a87adbec9b44458c5f73ee15 | |
parent | 768ac9122ff2cb4abbc7cdc92261de7aa3d0e8a1 (diff) | |
download | cdo-843fb3a079b79d19266f614182fa635c829e1243.tar.gz cdo-843fb3a079b79d19266f614182fa635c829e1243.tar.xz cdo-843fb3a079b79d19266f614182fa635c829e1243.zip |
[414532] "IllegalArgumentException: id is null on" on
ResourceSet.getResource() with connection aware URI with prefetch query
https://bugs.eclipse.org/bugs/show_bug.cgi?id=412767
2 files changed, 133 insertions, 15 deletions
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_412767_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_412767_Test.java new file mode 100644 index 0000000000..9992d044d1 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_412767_Test.java @@ -0,0 +1,118 @@ +/* + * 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.CDOState; +import org.eclipse.emf.cdo.common.revision.CDORevision; +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.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.tests.model1.Company; +import org.eclipse.emf.cdo.tests.model1.Customer; +import org.eclipse.emf.cdo.tests.model1.PurchaseOrder; +import org.eclipse.emf.cdo.tests.model1.SalesOrder; +import org.eclipse.emf.cdo.tests.model1.Supplier; +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 java.util.Collections; + +/** + * Bug 412767: "IllegalArgumentException: id is null on" on ResourceSet.getResource() with connection aware URI with prefetch query. + * + * @author Esteban Dugueperoux + */ +@Requires(ISessionConfig.CAPABILITY_NET4J_TCP) +public class Bugzilla_412767_Test extends AbstractCDOTest +{ + public void testConnectionAwareURIWithPrefetch() throws Exception + { + getRepository(); + + Registry registry = Resource.Factory.Registry.INSTANCE; + registry.getProtocolToFactoryMap().put(CDONet4jUtil.PROTOCOL_TCP, CDOResourceFactory.INSTANCE); + + try + { + URI sharedResourceURI = createRemoteResource(); + URI sharedResourceURIWithPrefetch = sharedResourceURI.appendQuery(sharedResourceURI.query() + "&" + + CDOResource.PREFETCH_PARAMETER + "=true"); + ResourceSet resourceSet = new ResourceSetImpl(); + CDOResource sharedResource = (CDOResource)resourceSet.getResource(sharedResourceURIWithPrefetch, true); + assertEquals(CDOState.PROXY, sharedResource.cdoState()); + } + finally + { + registry.getProtocolToFactoryMap().remove(CDONet4jUtil.PROTOCOL_TCP); + } + } + + public void testConnectionAwareURIWithPrefetchAfter() throws Exception + { + getRepository(); + + Registry registry = Resource.Factory.Registry.INSTANCE; + registry.getProtocolToFactoryMap().put(CDONet4jUtil.PROTOCOL_TCP, CDOResourceFactory.INSTANCE); + + try + { + URI sharedResourceURI = createRemoteResource(); + ResourceSet resourceSet = new ResourceSetImpl(); + CDOResource sharedResource = (CDOResource)resourceSet.getResource(sharedResourceURI, true); + sharedResource.cdoPrefetch(CDORevision.DEPTH_INFINITE); + assertEquals(CDOState.PROXY, sharedResource.cdoState()); + } + finally + { + registry.getProtocolToFactoryMap().remove(CDONet4jUtil.PROTOCOL_TCP); + } + } + + private URI createRemoteResource() throws Exception + { + ResourceSet resourceSet = new ResourceSetImpl(); + + URI sharedResourceURI = URI.createURI( + CDONet4jUtil.PROTOCOL_TCP + "://localhost:2036/" + RepositoryConfig.REPOSITORY_NAME + + getResourcePath("/sharedResource")).appendQuery(CDOURIData.TRANSACTIONAL_PARAMETER + "=true"); + Resource sharedResource = resourceSet.createResource(sharedResourceURI); + + Company sharedCompany = getModel1Factory().createCompany(); + sharedCompany.setName("sharedCompany"); + + Customer sharedCustomer = getModel1Factory().createCustomer(); + sharedCustomer.setName("sharedCustomer"); + + Supplier sharedSupplier = getModel1Factory().createSupplier(); + sharedSupplier.setName("sharedSupplier"); + + SalesOrder sharedSalesOrder = getModel1Factory().createSalesOrder(); + PurchaseOrder sharedPurchaseOrder = getModel1Factory().createPurchaseOrder(); + + sharedCompany.getCustomers().add(sharedCustomer); + sharedCompany.getSuppliers().add(sharedSupplier); + sharedCompany.getSalesOrders().add(sharedSalesOrder); + sharedCompany.getPurchaseOrders().add(sharedPurchaseOrder); + + sharedResource.getContents().add(sharedCompany); + sharedResource.save(Collections.emptyMap()); + return sharedResourceURI; + } +} diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java index ee7f72bdc8..67fff423a7 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceImpl.java @@ -1057,6 +1057,21 @@ public class CDOResourceImpl extends CDOResourceLeafImpl implements InternalCDOR } } + String query = initialURI.query(); + if (query != null && query.length() != 0) + { + Map<String, String> parameters = CDOURIUtil.getParameters(query); + String value = parameters.get(CDOResource.PREFETCH_PARAMETER); + if (value != null) + { + boolean prefetch = Boolean.parseBoolean(value); + if (prefetch) + { + cdoPrefetch(CDORevision.DEPTH_INFINITE); + } + } + } + Notification notification = setLoaded(true); if (notification != null) { @@ -1524,21 +1539,6 @@ public class CDOResourceImpl extends CDOResourceLeafImpl implements InternalCDOR viewProvider = pair.getElement2(); } } - - String query = getURI().query(); - if (query != null && query.length() != 0) - { - Map<String, String> parameters = CDOURIUtil.getParameters(query); - String value = parameters.get(CDOResource.PREFETCH_PARAMETER); - if (value != null) - { - boolean prefetch = Boolean.parseBoolean(value); - if (prefetch) - { - cdoPrefetch(CDORevision.DEPTH_INFINITE); - } - } - } } if (eNotificationRequired()) |