[494954] CDOTransaction fails to invalidate URIs of loaded CDOResource upon name change of ancestor CDOResourceFolder
https://bugs.eclipse.org/bugs/show_bug.cgi?id=494954
Signed-off-by: Thorsten Schlathölter <tschlat@gmx.de>
Signed-off-by: Eike Stepper <stepper@esc-net.de>
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_494954_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_494954_Test.java
new file mode 100644
index 0000000..821f0ed
--- /dev/null
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_494954_Test.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2016 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:
+ * Thorsten Schlathoelter - initial API and implementation
+ */
+package org.eclipse.emf.cdo.tests.bugzilla;
+
+import org.eclipse.emf.cdo.common.commit.CDOCommitInfo;
+import org.eclipse.emf.cdo.eresource.CDOResource;
+import org.eclipse.emf.cdo.eresource.CDOResourceFolder;
+import org.eclipse.emf.cdo.eresource.impl.CDOResourceFolderImpl;
+import org.eclipse.emf.cdo.session.CDOSession;
+import org.eclipse.emf.cdo.tests.AbstractCDOTest;
+import org.eclipse.emf.cdo.tests.config.impl.ConfigTest.CleanRepositoriesBefore;
+import org.eclipse.emf.cdo.transaction.CDOTransaction;
+
+import org.eclipse.emf.common.util.URI;
+
+/**
+ * Bug 494954 - URI of CDOFolders is not updated upon name change
+ *
+ * @author Thorsten Schlathoelter
+ */
+@CleanRepositoriesBefore(reason = "Instrumented repository")
+public class Bugzilla_494954_Test extends AbstractCDOTest
+{
+ public void testFolderNameChange() throws Exception
+ {
+ CDOSession session = openSession();
+ CDOTransaction transaction = session.openTransaction();
+ String resourcePath = "folderA/folderB/resource.xmi";
+ CDOResource resource = transaction.createResource(resourcePath);
+ transaction.commit();
+
+ CDOResourceFolder folder = resource.getFolder();
+ String modifiedFolderName = "folderBMod";
+
+ folder.setName(modifiedFolderName);
+
+ transaction.commit();
+
+ URI uri = resource.getURI();
+
+ // URI of resource should reflect the folder name change
+ assertEquals(modifiedFolderName, uri.segment(uri.segmentCount() - 2));
+ }
+
+ public void testFolderNameGenChange() throws Exception
+ {
+ CDOSession session = openSession();
+ CDOTransaction transaction = session.openTransaction();
+ String resourcePath = "folderA/folderB/resource.xmi";
+ CDOResource resource = transaction.createResource(resourcePath);
+ transaction.commit();
+
+ CDOResourceFolder folder = resource.getFolder();
+ String modifiedFolderName = "folderBMod";
+ ((CDOResourceFolderImpl)folder).setNameGen(modifiedFolderName);
+
+ transaction.commit();
+
+ // URI of resource should reflect the folder name change
+ URI uri = resource.getURI();
+ assertEquals(modifiedFolderName, uri.segment(uri.segmentCount() - 2));
+ }
+
+ public void testFolderNameChangeInOtherTransaction() throws Exception
+ {
+ CDOSession session = openSession();
+ CDOTransaction transaction = session.openTransaction();
+ String resourcePath = "folderA/folderB/resource.xmi";
+ CDOResource resource = transaction.createResource(resourcePath);
+ transaction.commit();
+
+ CDOTransaction tx2 = session.openTransaction();
+ CDOResource resourceLoadedByTx2 = tx2.getObject(resource);
+
+ CDOResourceFolder folder = resource.getFolder();
+ String modifiedFolderName = "folderBMod";
+ folder.setName(modifiedFolderName);
+
+ CDOCommitInfo commitInfo = transaction.commit();
+ tx2.waitForUpdate(commitInfo.getTimeStamp());
+
+ URI uri = resourceLoadedByTx2.getURI();
+ assertEquals(modifiedFolderName, uri.segment(uri.segmentCount() - 2));
+ }
+}
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceNodeImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceNodeImpl.java
index 28bb2e4..3ccfe67 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceNodeImpl.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/cdo/eresource/impl/CDOResourceNodeImpl.java
@@ -8,6 +8,7 @@
* Contributors:
* Eike Stepper - initial API and implementation
* Christian W. Damus (CEA LIST) - bug 416298: CDOResourceNodes do not support reflective access to derived path attribute
+ * Thorsten Schlathoelter - bug 494954: Name change does not trigger recache of URI
*/
package org.eclipse.emf.cdo.eresource.impl;
@@ -333,6 +334,12 @@
default:
super.eSet(featureID, newValue);
}
+
+ // Bug 494954: Update the URI if name the changes
+ if (featureID == EresourcePackage.CDO_RESOURCE_NODE__NAME)
+ {
+ recacheURIs();
+ }
}
@Override