exo-jcr SVN: r2178 - jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache.
by do-not-reply@jboss.org
Author: sergiykarpenko
Date: 2010-03-29 06:39:11 -0400 (Mon, 29 Mar 2010)
New Revision: 2178
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/BufferedJBossCache.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/JBossCacheWorkspaceStorageCache.java
Log:
EXOJCR-587: .InvalidItemStateException - No same-name sibling exists fixed
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/BufferedJBossCache.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/BufferedJBossCache.java 2010-03-29 09:37:22 UTC (rev 2177)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/BufferedJBossCache.java 2010-03-29 10:39:11 UTC (rev 2178)
@@ -252,6 +252,30 @@
return parentCache.get(fqn, key);
}
+ /**
+ * Look for Object by Fqn and key in internal buffer. If Buffer do not contain object, than return from JBoss-cache.
+ *
+ * @param fqn - Fqn
+ * @param key
+ * @return
+ */
+ public Object getFromBuffer(Fqn fqn, Serializable key)
+ {
+ //look at buffer for first
+ CompressedChangesBuffer changesContainer = getChangesBufferSafe();
+
+ Object objectFromBuffer = getObjectFromChangesContainer(changesContainer, fqn, key);
+
+ if (objectFromBuffer != null)
+ {
+ return objectFromBuffer;
+ }
+ else
+ {
+ return parentCache.get(fqn, key);
+ }
+ }
+
/* (non-Javadoc)
* @see org.jboss.cache.Cache#get(java.lang.String, java.lang.Object)
*/
@@ -442,6 +466,45 @@
return parentCache.get(fqn, key);
}
+ public Object putInBuffer(Fqn fqn, Serializable key, Object value)
+ {
+ CompressedChangesBuffer changesContainer = getChangesBufferSafe();
+
+ // take Object from buffer for first
+ Object prevObject = getObjectFromChangesContainer(changesContainer, fqn, key);
+
+ changesContainer.add(new PutKeyValueContainer(fqn, key, value, parentCache, changesContainer.getHistoryIndex(),
+ local.get()));
+
+ if (prevObject != null)
+ {
+ return prevObject;
+ }
+ else
+ {
+ return parentCache.get(fqn, key);
+ }
+ }
+
+ private Object getObjectFromChangesContainer(CompressedChangesBuffer changesContainer, Fqn fqn, Serializable key)
+ {
+ List<ChangesContainer> changes = changesContainer.getSortedList();
+ Object object = null;
+ for (ChangesContainer change : changes)
+ {
+ if (change.getChangesType().equals(ChangesType.PUT_KEY) && change.getFqn().equals(fqn))
+ {
+ PutKeyValueContainer cont = ((PutKeyValueContainer)change);
+ if (cont.key.equals(key))
+ {
+ object = ((PutKeyValueContainer)change).value;
+ }
+ }
+ }
+
+ return object;
+ }
+
/* (non-Javadoc)
* @see org.jboss.cache.Cache#put(java.lang.String, java.util.Map)
*/
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/JBossCacheWorkspaceStorageCache.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/JBossCacheWorkspaceStorageCache.java 2010-03-29 09:37:22 UTC (rev 2177)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/jbosscache/JBossCacheWorkspaceStorageCache.java 2010-03-29 10:39:11 UTC (rev 2178)
@@ -406,11 +406,13 @@
{
if (state.isPersisted())
{
- ItemData prevItem = putItem(state.getData());
+ // There was a problem with removing a list of samename siblings in on transaction,
+ // so putItemInBufferedCache(..) and updateInBufferedCache(..) used instead put(..) and update (..) methods.
+ ItemData prevItem = putItemInBufferedCache(state.getData());
if (prevItem != null && state.isNode())
{
- // nodes reordered, if prev is null it's InvalidItemState case
- update((NodeData)state.getData(), (NodeData)prevItem);
+ // nodes reordered, if previous is null it's InvalidItemState case
+ updateInBuffer((NodeData)state.getData(), (NodeData)prevItem);
}
}
}
@@ -749,6 +751,19 @@
}
}
+ protected ItemData putItemInBufferedCache(ItemData item)
+ {
+ if (item.isNode())
+ {
+ return putNodeInBufferedCache((NodeData)item, ModifyChildOption.MODIFY);
+ }
+ else
+ {
+ return putProperty((PropertyData)item, ModifyChildOption.MODIFY);
+ }
+
+ }
+
/**
* Internal put Node.
*
@@ -776,6 +791,27 @@
return (ItemData)cache.put(makeItemFqn(node.getIdentifier()), ITEM_DATA, node);
}
+ protected ItemData putNodeInBufferedCache(NodeData node, ModifyChildOption modifyListsOfChild)
+ {
+ // if not a root node
+ if (node.getParentIdentifier() != null)
+ {
+ // add in CHILD_NODES
+ cache.put(makeChildFqn(childNodes, node.getParentIdentifier(), node.getQPath().getEntries()[node.getQPath()
+ .getEntries().length - 1]), ITEM_ID, node.getIdentifier());
+ // if MODIFY and List present OR FORCE_MODIFY, then write
+ if ((modifyListsOfChild == ModifyChildOption.MODIFY && cache.getNode(makeChildListFqn(childNodesList, node
+ .getParentIdentifier())) != null)
+ || modifyListsOfChild == ModifyChildOption.FORCE_MODIFY)
+ {
+ cache.addToList(makeChildListFqn(childNodesList, node.getParentIdentifier()), ITEM_LIST, node
+ .getIdentifier());
+ }
+ }
+ // add in ITEMS
+ return (ItemData)cache.putInBuffer(makeItemFqn(node.getIdentifier()), ITEM_DATA, node);
+ }
+
/**
* Internal put Property.
*
@@ -896,6 +932,36 @@
}
/**
+ * This method duplicate update method, except using getFromBuffer inside.
+ *
+ * @param node NodeData
+ * @param prevNode NodeData
+ */
+ protected void updateInBuffer(final NodeData node, final NodeData prevNode)
+ {
+ // get previously cached NodeData and using its name remove child on the parent
+ Fqn<String> prevFqn =
+ makeChildFqn(childNodes, node.getParentIdentifier(), prevNode.getQPath().getEntries()[prevNode.getQPath()
+ .getEntries().length - 1]);
+ if (node.getIdentifier().equals(cache.getFromBuffer(prevFqn, ITEM_ID)))
+ {
+ // it's same-name siblings re-ordering, delete previous child
+ if (!cache.removeNode(prevFqn) && LOG.isDebugEnabled())
+ {
+ LOG.debug("Node not extists as a child but update asked " + node.getQPath().getAsString());
+ }
+ }
+
+ // update childs paths if index changed
+ int nodeIndex = node.getQPath().getEntries()[node.getQPath().getEntries().length - 1].getIndex();
+ int prevNodeIndex = prevNode.getQPath().getEntries()[prevNode.getQPath().getEntries().length - 1].getIndex();
+ if (nodeIndex != prevNodeIndex)
+ {
+ updateTreePath(node.getIdentifier(), node.getQPath(), null); // don't change ACL, it's same parent
+ }
+ }
+
+ /**
* Update Nodes tree with new path.
*
* @param parentId String - root node id of JCR subtree.
16 years, 1 month
exo-jcr SVN: r2177 - jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/repository.
by do-not-reply@jboss.org
Author: tolusha
Date: 2010-03-29 05:37:22 -0400 (Mon, 29 Mar 2010)
New Revision: 2177
Modified:
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/repository/RestRepositoryServiceTest.java
Log:
EXOJCR-256: add test creating repository with invalid chars
Modified: jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/repository/RestRepositoryServiceTest.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/repository/RestRepositoryServiceTest.java 2010-03-26 16:25:40 UTC (rev 2176)
+++ jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/repository/RestRepositoryServiceTest.java 2010-03-29 09:37:22 UTC (rev 2177)
@@ -65,8 +65,7 @@
* @author <a href="mailto:alex.reshetnyak@exoplatform.com.ua">Alex Reshetnyak</a>
* @version $Id: RestRepositoryServiceTest.java 111 2008-11-11 11:11:11Z rainf0x $
*/
-public class RestRepositoryServiceTest
- extends BaseStandaloneTest
+public class RestRepositoryServiceTest extends BaseStandaloneTest
{
private String REST_REPOSITORY_SERVICE_PATH = RestRepositoryService.Constants.BASE_URL;
@@ -76,10 +75,10 @@
{
super.setUp();
- handler = (RequestHandler) container.getComponentInstanceOfType(RequestHandler.class);
+ handler = (RequestHandler)container.getComponentInstanceOfType(RequestHandler.class);
SessionProviderService sessionProviderService =
- (SessionProviderService) container.getComponentInstanceOfType(ThreadLocalSessionProviderService.class);
+ (SessionProviderService)container.getComponentInstanceOfType(ThreadLocalSessionProviderService.class);
assertNotNull(sessionProviderService);
sessionProviderService.setSessionProvider(null, new SessionProvider(new ConversationState(new Identity("root"))));
}
@@ -88,9 +87,9 @@
{
MultivaluedMap<String, String> headers = new MultivaluedMapImpl();
ContainerRequestUserRole creq =
- new ContainerRequestUserRole("GET", new URI(REST_REPOSITORY_SERVICE_PATH
- + RestRepositoryService.Constants.OperationType.REPOSITORIES_LIST), new URI(""), null,
- new InputHeadersMap(headers));
+ new ContainerRequestUserRole("GET", new URI(REST_REPOSITORY_SERVICE_PATH
+ + RestRepositoryService.Constants.OperationType.REPOSITORIES_LIST), new URI(""), null, new InputHeadersMap(
+ headers));
ByteArrayContainerResponseWriter responseWriter = new ByteArrayContainerResponseWriter();
ContainerResponse cres = new ContainerResponse(responseWriter);
@@ -98,7 +97,7 @@
assertEquals(200, cres.getStatus());
- NamesList repositories = (NamesList) getObject(NamesList.class, responseWriter.getBody());
+ NamesList repositories = (NamesList)getObject(NamesList.class, responseWriter.getBody());
assertNotNull(repositories);
assertEquals(repositoryService.getConfig().getRepositoryConfigurations().size(), repositories.getNames().size());
@@ -110,9 +109,9 @@
MultivaluedMap<String, String> headers = new MultivaluedMapImpl();
ContainerRequestUserRole creq =
- new ContainerRequestUserRole("GET", new URI(REST_REPOSITORY_SERVICE_PATH
- + RestRepositoryService.Constants.OperationType.WORKSPACES_LIST + "/" + repoName + "/"),
- new URI(""), null, new InputHeadersMap(headers));
+ new ContainerRequestUserRole("GET", new URI(REST_REPOSITORY_SERVICE_PATH
+ + RestRepositoryService.Constants.OperationType.WORKSPACES_LIST + "/" + repoName + "/"), new URI(""), null,
+ new InputHeadersMap(headers));
ByteArrayContainerResponseWriter responseWriter = new ByteArrayContainerResponseWriter();
ContainerResponse cres = new ContainerResponse(responseWriter);
@@ -120,11 +119,11 @@
assertEquals(200, cres.getStatus());
- NamesList workspaces = (NamesList) getObject(NamesList.class, responseWriter.getBody());
+ NamesList workspaces = (NamesList)getObject(NamesList.class, responseWriter.getBody());
assertNotNull(workspaces);
assertEquals(repositoryService.getConfig().getRepositoryConfiguration(repoName).getWorkspaceEntries().size(),
- workspaces.getNames().size());
+ workspaces.getNames().size());
}
public void testGetDefaultWorkspaceConfig() throws Exception
@@ -133,9 +132,9 @@
MultivaluedMap<String, String> headers = new MultivaluedMapImpl();
ContainerRequestUserRole creq =
- new ContainerRequestUserRole("GET", new URI(REST_REPOSITORY_SERVICE_PATH
- + RestRepositoryService.Constants.OperationType.DEFAULT_WS_CONFIG + "/" + repoName + "/"),
- new URI(""), null, new InputHeadersMap(headers));
+ new ContainerRequestUserRole("GET", new URI(REST_REPOSITORY_SERVICE_PATH
+ + RestRepositoryService.Constants.OperationType.DEFAULT_WS_CONFIG + "/" + repoName + "/"), new URI(""),
+ null, new InputHeadersMap(headers));
ByteArrayContainerResponseWriter responseWriter = new ByteArrayContainerResponseWriter();
ContainerResponse cres = new ContainerResponse(responseWriter);
@@ -143,20 +142,20 @@
assertEquals(200, cres.getStatus());
- WorkspaceEntry workspaceEntry = (WorkspaceEntry) getObject(WorkspaceEntry.class, responseWriter.getBody());
+ WorkspaceEntry workspaceEntry = (WorkspaceEntry)getObject(WorkspaceEntry.class, responseWriter.getBody());
assertNotNull(workspaceEntry);
assertEquals(repositoryService.getConfig().getRepositoryConfiguration(repoName).getDefaultWorkspaceName(),
- workspaceEntry.getName());
+ workspaceEntry.getName());
}
public void testGetRepositoryServiceConfiguration() throws Exception
{
MultivaluedMap<String, String> headers = new MultivaluedMapImpl();
ContainerRequestUserRole creq =
- new ContainerRequestUserRole("GET", new URI(REST_REPOSITORY_SERVICE_PATH
- + RestRepositoryService.Constants.OperationType.REPOSITORY_SERVICE_CONFIGURATION), new URI(""),
- null, new InputHeadersMap(headers));
+ new ContainerRequestUserRole("GET", new URI(REST_REPOSITORY_SERVICE_PATH
+ + RestRepositoryService.Constants.OperationType.REPOSITORY_SERVICE_CONFIGURATION), new URI(""), null,
+ new InputHeadersMap(headers));
ByteArrayContainerResponseWriter responseWriter = new ByteArrayContainerResponseWriter();
ContainerResponse cres = new ContainerResponse(responseWriter);
@@ -165,12 +164,12 @@
assertEquals(200, cres.getStatus());
RepositoryServiceConf repositoryConf =
- (RepositoryServiceConf) getObject(RepositoryServiceConf.class, responseWriter.getBody());
+ (RepositoryServiceConf)getObject(RepositoryServiceConf.class, responseWriter.getBody());
assertNotNull(repositoryConf);
assertEquals(repositoryService.getConfig().getDefaultRepositoryName(), repositoryConf.getDefaultRepositoryName());
assertEquals(repositoryService.getConfig().getRepositoryConfigurations().size(), repositoryConf.getRepositories()
- .size());
+ .size());
}
public void testCreateRepository() throws Exception
@@ -179,8 +178,8 @@
String rName = "repo_over_rest";
RepositoryEntry rDefault =
- repositoryService.getConfig().getRepositoryConfiguration(
- repositoryService.getConfig().getDefaultRepositoryName());
+ repositoryService.getConfig().getRepositoryConfiguration(
+ repositoryService.getConfig().getDefaultRepositoryName());
RepositoryEntry rEntry = new RepositoryEntry();
@@ -192,7 +191,7 @@
rEntry.setDefaultWorkspaceName(wsName);
WorkspaceEntry wEntry =
- makeWorkspaceEntry(rDefault.getWorkspaceEntries().get(0), rName, wsName, "jdbcjcr_to_rest_repo_1", true);
+ makeWorkspaceEntry(rDefault.getWorkspaceEntries().get(0), rName, wsName, "jdbcjcr_to_rest_repo_1", true);
rEntry.addWorkspace(wEntry);
JsonGeneratorImpl generatorImpl = new JsonGeneratorImpl();
@@ -202,12 +201,12 @@
headers.putSingle("Content-Type", "application/json; charset=UTF-8");
ContainerRequestUserRole creq =
- new ContainerRequestUserRole("POST", new URI(REST_REPOSITORY_SERVICE_PATH
- + RestRepositoryService.Constants.OperationType.CREATE_REPOSITORY), new URI(""),
- new ByteArrayInputStream(json.toString().getBytes("UTF-8")), new InputHeadersMap(headers));
-
- System.out.print("testCreateRepository : " +json.toString());
+ new ContainerRequestUserRole("POST", new URI(REST_REPOSITORY_SERVICE_PATH
+ + RestRepositoryService.Constants.OperationType.CREATE_REPOSITORY), new URI(""), new ByteArrayInputStream(
+ json.toString().getBytes("UTF-8")), new InputHeadersMap(headers));
+ System.out.print("testCreateRepository : " + json.toString());
+
ByteArrayContainerResponseWriter responseWriter = new ByteArrayContainerResponseWriter();
ContainerResponse cres = new ContainerResponse(responseWriter);
handler.handleRequest(creq, cres);
@@ -215,20 +214,69 @@
assertEquals(200, cres.getStatus());
Session session =
- repositoryService.getRepository(rName).login(new CredentialsImpl("root", "exo".toCharArray()), wsName);
+ repositoryService.getRepository(rName).login(new CredentialsImpl("root", "exo".toCharArray()), wsName);
assertNotNull(session);
assertNotNull(session.getRootNode());
session.logout();
}
+ public void testCreateRepositoryWithInvalidChars() throws Exception
+ {
+ String wsName = "ws_over:?//\\__rest!!_1";
+ String rName = "repo:?//\\_over:_re??st";
+
+ RepositoryEntry rDefault =
+ repositoryService.getConfig().getRepositoryConfiguration(
+ repositoryService.getConfig().getDefaultRepositoryName());
+
+ RepositoryEntry rEntry = new RepositoryEntry();
+
+ rEntry.setName(rName);
+ rEntry.setSessionTimeOut(3600000);
+ rEntry.setAuthenticationPolicy("org.exoplatform.services.jcr.impl.core.access.JAASAuthenticator");
+ rEntry.setSecurityDomain("exo-domain");
+ rEntry.setSystemWorkspaceName(wsName);
+ rEntry.setDefaultWorkspaceName(wsName);
+
+ WorkspaceEntry wEntry =
+ makeWorkspaceEntry(rDefault.getWorkspaceEntries().get(0), rName, wsName, "jdbcjcr_to_rest_repo_1", true);
+ rEntry.addWorkspace(wEntry);
+
+ JsonGeneratorImpl generatorImpl = new JsonGeneratorImpl();
+ JsonValue json = generatorImpl.createJsonObject(rEntry);
+
+ MultivaluedMap<String, String> headers = new MultivaluedMapImpl();
+ headers.putSingle("Content-Type", "application/json; charset=UTF-8");
+
+ ContainerRequestUserRole creq =
+ new ContainerRequestUserRole("POST", new URI(REST_REPOSITORY_SERVICE_PATH
+ + RestRepositoryService.Constants.OperationType.CREATE_REPOSITORY), new URI(""), new ByteArrayInputStream(
+ json.toString().getBytes("UTF-8")), new InputHeadersMap(headers));
+
+ System.out.print("testCreateRepository : " + json.toString());
+
+ ByteArrayContainerResponseWriter responseWriter = new ByteArrayContainerResponseWriter();
+ ContainerResponse cres = new ContainerResponse(responseWriter);
+ handler.handleRequest(creq, cres);
+
+ assertEquals(200, cres.getStatus());
+
+ Session session =
+ repositoryService.getRepository(rName).login(new CredentialsImpl("root", "exo".toCharArray()), wsName);
+ assertNotNull(session);
+ assertNotNull(session.getRootNode());
+ session.logout();
+ }
+
public void testCreateWorkspace() throws Exception
{
String wsName = "ws_over_rest_2";
String rName = "repo_over_rest";
WorkspaceEntry wEntry =
- makeWorkspaceEntry(repositoryService.getDefaultRepository().getConfiguration().getWorkspaceEntries()
- .get(0), rName, wsName, "jdbcjcr_to_rest_repo_2", true);
+ makeWorkspaceEntry(repositoryService.getDefaultRepository().getConfiguration().getWorkspaceEntries().get(0),
+ rName, wsName, "jdbcjcr_to_rest_repo_2", true);
+ wEntry.setAccessManager(null);
JsonGeneratorImpl generatorImpl = new JsonGeneratorImpl();
JsonValue json = generatorImpl.createJsonObject(wEntry);
@@ -237,13 +285,12 @@
headers.putSingle("Content-Type", "application/json; charset=UTF-8");
ContainerRequestUserRole creq =
- new ContainerRequestUserRole("POST", new URI(REST_REPOSITORY_SERVICE_PATH
- + RestRepositoryService.Constants.OperationType.CREATE_WORKSPACE + "/"
- + rName), new URI(""),
- new ByteArrayInputStream(json.toString().getBytes("UTF-8")), new InputHeadersMap(headers));
-
- System.out.print("testCreateWorkspace : " +json.toString());
+ new ContainerRequestUserRole("POST", new URI(REST_REPOSITORY_SERVICE_PATH
+ + RestRepositoryService.Constants.OperationType.CREATE_WORKSPACE + "/" + rName), new URI(""),
+ new ByteArrayInputStream(json.toString().getBytes("UTF-8")), new InputHeadersMap(headers));
+ System.out.print("testCreateWorkspace : " + json.toString());
+
ByteArrayContainerResponseWriter responseWriter = new ByteArrayContainerResponseWriter();
ContainerResponse cres = new ContainerResponse(responseWriter);
handler.handleRequest(creq, cres);
@@ -251,7 +298,7 @@
assertEquals(200, cres.getStatus());
Session session =
- repositoryService.getRepository(rName).login(new CredentialsImpl("root", "exo".toCharArray()), wsName);
+ repositoryService.getRepository(rName).login(new CredentialsImpl("root", "exo".toCharArray()), wsName);
assertNotNull(session);
assertNotNull(session.getRootNode());
@@ -263,16 +310,16 @@
String wsName = "ws_over_rest_2";
String rName = "repo_over_rest";
Session session =
- repositoryService.getRepository(rName).login(new CredentialsImpl("root", "exo".toCharArray()), wsName);
+ repositoryService.getRepository(rName).login(new CredentialsImpl("root", "exo".toCharArray()), wsName);
assertNotNull(session);
assertNotNull(session.getRootNode());
MultivaluedMap<String, String> headers = new MultivaluedMapImpl();
ContainerRequestUserRole creq =
- new ContainerRequestUserRole("POST", new URI(REST_REPOSITORY_SERVICE_PATH
- + RestRepositoryService.Constants.OperationType.REMOVE_WORKSPACE + "/" + rName + "/"
- + wsName + "/false/"), new URI(""), null, new InputHeadersMap(headers));
+ new ContainerRequestUserRole("POST", new URI(REST_REPOSITORY_SERVICE_PATH
+ + RestRepositoryService.Constants.OperationType.REMOVE_WORKSPACE + "/" + rName + "/" + wsName + "/false/"),
+ new URI(""), null, new InputHeadersMap(headers));
ByteArrayContainerResponseWriter responseWriter = new ByteArrayContainerResponseWriter();
ContainerResponse cres = new ContainerResponse(responseWriter);
@@ -282,9 +329,9 @@
//remove with prepare close sessions
creq =
- new ContainerRequestUserRole("POST", new URI(REST_REPOSITORY_SERVICE_PATH
- + RestRepositoryService.Constants.OperationType.REMOVE_WORKSPACE + "/" + rName + "/"
- + wsName + "/true/"), new URI(""), null, new InputHeadersMap(headers));
+ new ContainerRequestUserRole("POST", new URI(REST_REPOSITORY_SERVICE_PATH
+ + RestRepositoryService.Constants.OperationType.REMOVE_WORKSPACE + "/" + rName + "/" + wsName + "/true/"),
+ new URI(""), null, new InputHeadersMap(headers));
responseWriter = new ByteArrayContainerResponseWriter();
cres = new ContainerResponse(responseWriter);
@@ -309,18 +356,16 @@
String repoName = "db2";
Session session =
- repositoryService.getRepository(repoName)
- .login(new CredentialsImpl("root", "exo".toCharArray()), wsName);
+ repositoryService.getRepository(repoName).login(new CredentialsImpl("root", "exo".toCharArray()), wsName);
assertNotNull(session);
assertNotNull(session.getRootNode());
MultivaluedMap<String, String> headers = new MultivaluedMapImpl();
ContainerRequestUserRole creq =
- new ContainerRequestUserRole("POST",
- new URI(REST_REPOSITORY_SERVICE_PATH
- + RestRepositoryService.Constants.OperationType.REMOVE_REPOSITORY + "/" + repoName
- + "/false/"), new URI(""), null, new InputHeadersMap(headers));
+ new ContainerRequestUserRole("POST", new URI(REST_REPOSITORY_SERVICE_PATH
+ + RestRepositoryService.Constants.OperationType.REMOVE_REPOSITORY + "/" + repoName + "/false/"),
+ new URI(""), null, new InputHeadersMap(headers));
ByteArrayContainerResponseWriter responseWriter = new ByteArrayContainerResponseWriter();
ContainerResponse cres = new ContainerResponse(responseWriter);
@@ -330,9 +375,9 @@
//remove with prepare close sessions
creq =
- new ContainerRequestUserRole("POST", new URI(REST_REPOSITORY_SERVICE_PATH
- + RestRepositoryService.Constants.OperationType.REMOVE_REPOSITORY + "/" + repoName + "/true/"),
- new URI(""), null, new InputHeadersMap(headers));
+ new ContainerRequestUserRole("POST", new URI(REST_REPOSITORY_SERVICE_PATH
+ + RestRepositoryService.Constants.OperationType.REMOVE_REPOSITORY + "/" + repoName + "/true/"),
+ new URI(""), null, new InputHeadersMap(headers));
responseWriter = new ByteArrayContainerResponseWriter();
cres = new ContainerResponse(responseWriter);
@@ -374,7 +419,7 @@
}
protected WorkspaceEntry makeWorkspaceEntry(WorkspaceEntry defWEntry, String repoNmae, String wsName,
- String sourceName, boolean multiDb)
+ String sourceName, boolean multiDb)
{
WorkspaceEntry ws1back = new WorkspaceEntry();
ws1back.setName(wsName);
@@ -396,7 +441,7 @@
ArrayList params = new ArrayList();
for (Iterator i = defWEntry.getContainer().getParameters().iterator(); i.hasNext();)
{
- SimpleParameterEntry p = (SimpleParameterEntry) i.next();
+ SimpleParameterEntry p = (SimpleParameterEntry)i.next();
SimpleParameterEntry newp = new SimpleParameterEntry(p.getName(), p.getValue());
if (newp.getName().equals("source-name"))
16 years, 1 month
exo-jcr SVN: r2176 - jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core.
by do-not-reply@jboss.org
Author: pnedonosko
Date: 2010-03-26 12:25:40 -0400 (Fri, 26 Mar 2010)
New Revision: 2176
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
Log:
EXOJCR-614 check of deleted REFERENCE property in getReferences()
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java 2010-03-26 15:52:20 UTC (rev 2175)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java 2010-03-26 16:25:40 UTC (rev 2176)
@@ -591,34 +591,31 @@
{
List<PropertyData> refDatas = transactionableManager.getReferencesData(identifier, true);
List<PropertyImpl> refs = new ArrayList<PropertyImpl>(refDatas.size());
- for (int i = 0, length = refDatas.size(); i < length; i++)
+ for (PropertyData data : refDatas)
{
- PropertyData data = refDatas.get(i);
+ ItemState state = changesLog.getItemState(data.getIdentifier());
+ if (state != null)
+ {
+ if (state.isDeleted())
+ {
+ // if the Property was deleted skip it for now
+ continue;
+ }
+
+ // otherwise use transient data
+ data = (PropertyData)state.getData();
+ }
+
NodeData parent = (NodeData)getItemData(data.getParentIdentifier());
- // if parent exists check for read permissions, otherwise the ref property was deleted in this session but not yet saved.
+ // if parent exists check for read permissions, otherwise the parent was deleted in another session.
if (parent != null)
{
// skip not permitted
if (accessManager.hasPermission(parent.getACL(), new String[]{PermissionType.READ}, session.getUserState()
.getIdentity()))
{
- PropertyImpl item;
- ItemState state = changesLog.getItemState(data.getIdentifier());
- if (state != null)
- {
- if (state.isDeleted())
- {
- // skip deleted
- continue;
- }
+ PropertyImpl item = (PropertyImpl)readItem(data, null, true, false);
- item = (PropertyImpl)readItem(state.getData(), null, true, false);
- }
- else
- {
- item = (PropertyImpl)readItem(data, null, true, false);
- }
-
refs.add(item);
session.getActionHandler().postRead(item);
}
16 years, 1 month
exo-jcr SVN: r2175 - in jcr/trunk/exo.jcr.component.core/src: test/java/org/exoplatform/services/jcr/api/writing and 1 other directory.
by do-not-reply@jboss.org
Author: pnedonosko
Date: 2010-03-26 11:52:20 -0400 (Fri, 26 Mar 2010)
New Revision: 2175
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestNodeReference.java
Log:
EXOJCR-614 check on deleted REFERENCE property's parent added to prevent NPE for transiently deleted ref properties
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java 2010-03-26 15:18:03 UTC (rev 2174)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java 2010-03-26 15:52:20 UTC (rev 2175)
@@ -594,31 +594,34 @@
for (int i = 0, length = refDatas.size(); i < length; i++)
{
PropertyData data = refDatas.get(i);
- // check for permission for read
NodeData parent = (NodeData)getItemData(data.getParentIdentifier());
- // skip not permitted
- if (accessManager.hasPermission(parent.getACL(), new String[]{PermissionType.READ}, session.getUserState()
- .getIdentity()))
+ // if parent exists check for read permissions, otherwise the ref property was deleted in this session but not yet saved.
+ if (parent != null)
{
- PropertyImpl item;
- ItemState state = changesLog.getItemState(data.getIdentifier());
- if (state != null)
+ // skip not permitted
+ if (accessManager.hasPermission(parent.getACL(), new String[]{PermissionType.READ}, session.getUserState()
+ .getIdentity()))
{
- if (state.isDeleted())
+ PropertyImpl item;
+ ItemState state = changesLog.getItemState(data.getIdentifier());
+ if (state != null)
{
- // skip deleted
- continue;
+ if (state.isDeleted())
+ {
+ // skip deleted
+ continue;
+ }
+
+ item = (PropertyImpl)readItem(state.getData(), null, true, false);
}
+ else
+ {
+ item = (PropertyImpl)readItem(data, null, true, false);
+ }
- item = (PropertyImpl)readItem(state.getData(), null, true, false);
+ refs.add(item);
+ session.getActionHandler().postRead(item);
}
- else
- {
- item = (PropertyImpl)readItem(data, null, true, false);
- }
-
- refs.add(item);
- session.getActionHandler().postRead(item);
}
}
return refs;
@@ -1141,7 +1144,7 @@
// We can't remove this VH now.
return;
} // else -- if we has a references in workspace where the VH is being
- // deleted we can remove VH now.
+ // deleted we can remove VH now.
}
}
finally
Modified: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestNodeReference.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestNodeReference.java 2010-03-26 15:18:03 UTC (rev 2174)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestNodeReference.java 2010-03-26 15:52:20 UTC (rev 2175)
@@ -21,12 +21,16 @@
import org.exoplatform.services.jcr.JcrAPIBaseTest;
import org.exoplatform.services.jcr.impl.core.NodeImpl;
+import java.io.ByteArrayInputStream;
+import java.util.Calendar;
+
import javax.jcr.Node;
import javax.jcr.Property;
import javax.jcr.PropertyIterator;
import javax.jcr.PropertyType;
import javax.jcr.ReferentialIntegrityException;
import javax.jcr.RepositoryException;
+import javax.jcr.Session;
import javax.jcr.Value;
import javax.jcr.ValueFactory;
@@ -342,6 +346,95 @@
PropertyIterator refs = testNode.getReferences();
assertEquals(1, refs.getSize());
+ }
+ public void testGetTransientDeletedReferences() throws Exception
+ {
+ Node file = root.addNode("n", "nt:file");
+ Node content = file.addNode("jcr:content", "nt:resource");
+ content.setProperty("jcr:data", new ByteArrayInputStream(new byte[0]));
+ content.setProperty("jcr:mimeType", "");
+ content.setProperty("jcr:lastModified", Calendar.getInstance());
+ root.save();
+ Node link = root.addNode("link", "nt:linkedFile");
+ link.setProperty("jcr:content", content);
+ root.save();
+
+ // remove linked file but don't save it
+ content.getReferences().nextProperty().getParent().remove();
+
+ try
+ {
+ PropertyIterator it = content.getReferences();
+ assertEquals(0, it.getSize());
+
+ root.refresh(false);
+
+ it = content.getReferences();
+ assertEquals(1, it.getSize());
+ }
+ catch (Exception e)
+ {
+ fail(e.getMessage());
+ }
}
+
+ public void testGetTransientDeletedReferences_AnotherSession() throws Exception
+ {
+ Node file = root.addNode("n", "nt:file");
+ Node content = file.addNode("jcr:content", "nt:resource");
+ content.setProperty("jcr:data", new ByteArrayInputStream(new byte[0]));
+ content.setProperty("jcr:mimeType", "");
+ content.setProperty("jcr:lastModified", Calendar.getInstance());
+ root.save();
+ Node link = root.addNode("link", "nt:linkedFile");
+ link.setProperty("jcr:content", content);
+ root.save();
+
+ // remove linked file but don't save it
+ content.getReferences().nextProperty().getParent().remove();
+
+ Session anotherSession = repository.login(credentials, root.getSession().getWorkspace().getName());
+ try
+ {
+ // but another session still see the link as a reference
+ PropertyIterator it = ((Node)anotherSession.getItem(content.getPath())).getReferences();
+ assertEquals(1, it.getSize());
+ }
+ catch (Exception e)
+ {
+ fail(e.getMessage());
+ }
+ finally
+ {
+ anotherSession.logout();
+ }
+ }
+
+ public void testGetDeletedReferences() throws Exception
+ {
+ Node file = root.addNode("n", "nt:file");
+ Node content = file.addNode("jcr:content", "nt:resource");
+ content.setProperty("jcr:data", new ByteArrayInputStream(new byte[0]));
+ content.setProperty("jcr:mimeType", "");
+ content.setProperty("jcr:lastModified", Calendar.getInstance());
+ root.save();
+ Node link = root.addNode("link", "nt:linkedFile");
+ link.setProperty("jcr:content", content);
+ root.save();
+
+ // remove linked file but and save it
+ content.getReferences().nextProperty().getParent().remove();
+ root.save();
+
+ try
+ {
+ PropertyIterator it = content.getReferences();
+ assertEquals(0, it.getSize());
+ }
+ catch (Exception e)
+ {
+ fail(e.getMessage());
+ }
+ }
}
16 years, 1 month
exo-jcr SVN: r2174 - jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core.
by do-not-reply@jboss.org
Author: areshetnyak
Date: 2010-03-26 11:18:03 -0400 (Fri, 26 Mar 2010)
New Revision: 2174
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/BackupWorkspaceInitializer.java
Log:
EXOJCR-549 : The implementation backup/restore whole repository.
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/BackupWorkspaceInitializer.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/BackupWorkspaceInitializer.java 2010-03-26 15:17:34 UTC (rev 2173)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/BackupWorkspaceInitializer.java 2010-03-26 15:18:03 UTC (rev 2174)
@@ -126,7 +126,7 @@
}
catch (XMLStreamException e)
{
- throw new RepositoryException(e);
+ throw new RepositoryException("The XML file is corrupted : " + restorePath, e);
}
catch (FactoryConfigurationError e)
{
16 years, 1 month
exo-jcr SVN: r2173 - jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl.
by do-not-reply@jboss.org
Author: areshetnyak
Date: 2010-03-26 11:17:34 -0400 (Fri, 26 Mar 2010)
New Revision: 2173
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryServiceImpl.java
Log:
EXOJCR-616 : The remove repository container from repositoryContainers map when repository container start fail.
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryServiceImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryServiceImpl.java 2010-03-26 14:57:09 UTC (rev 2172)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryServiceImpl.java 2010-03-26 15:17:34 UTC (rev 2173)
@@ -143,15 +143,28 @@
public void createRepository(RepositoryEntry rEntry) throws RepositoryConfigurationException, RepositoryException
{
if (repositoryContainers.containsKey(rEntry.getName()))
+ {
throw new RepositoryConfigurationException("Repository container " + rEntry.getName() + " already started");
+ }
RepositoryContainer repositoryContainer = new RepositoryContainer(parentContainer, rEntry);
// Storing and starting the repository container under
// key=repository_name
- repositoryContainers.put(rEntry.getName(), repositoryContainer);
- managerStartChanges.registerListeners(repositoryContainer);
- repositoryContainer.start();
+ try
+ {
+ repositoryContainers.put(rEntry.getName(), repositoryContainer);
+ managerStartChanges.registerListeners(repositoryContainer);
+ repositoryContainer.start();
+ }
+ catch (Throwable t)
+ {
+ //TODO will be implemented unregistration in managerStartChanges
+ //managerStartChanges.removeListeners(repositoryContainer);
+ repositoryContainers.remove(rEntry.getName());
+
+ throw new RepositoryConfigurationException("Repository conatainer " + rEntry.getName() + " was not started.", t);
+ }
if (!config.getRepositoryConfigurations().contains(rEntry))
{
16 years, 1 month
exo-jcr SVN: r2172 - in jcr/trunk/exo.jcr.component.ext/src: test/java/org/exoplatform/services/jcr/ext/backup and 1 other directory.
by do-not-reply@jboss.org
Author: areshetnyak
Date: 2010-03-26 10:57:09 -0400 (Fri, 26 Mar 2010)
New Revision: 2172
Modified:
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobRepositoryRestore.java
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/TestBackupManager.java
Log:
EXOJCR-549 : The implementation backup/restore whole repository in HTTPBackupAgent.
Modified: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobRepositoryRestore.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobRepositoryRestore.java 2010-03-26 14:47:07 UTC (rev 2171)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/JobRepositoryRestore.java 2010-03-26 14:57:09 UTC (rev 2172)
@@ -194,14 +194,14 @@
catch (InvalidItemStateException e)
{
restored = false;
- throw new RepositoryRestoreExeption("Workspace '" + "/" + repositoryEntry.getName() + "/"
+ throw new RepositoryRestoreExeption("The repository '" + "/" + repositoryEntry.getName() + "/"
+ currennWorkspaceName + "' can not be restored! There was database error!", e);
}
catch (Throwable t)
{
restored = false;
- throw new RepositoryRestoreExeption("Workspace '" + "/" + repositoryEntry.getName() + "/"
+ throw new RepositoryRestoreExeption("The repository '" + "/" + repositoryEntry.getName() + "/"
+ currennWorkspaceName + "' can not be restored!", t);
}
@@ -231,8 +231,7 @@
}
catch (Throwable thr)
{
- throw new RepositoryRestoreExeption("Reprository '" + "/" + repositoryEntry.getName()
- + "' can not be restored!", thr);
+ log.error("The partly restored repository '" + "/" + repositoryEntry.getName() + "' can not be removed!", thr);
}
}
}
Modified: jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/TestBackupManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/TestBackupManager.java 2010-03-26 14:47:07 UTC (rev 2171)
+++ jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/backup/TestBackupManager.java 2010-03-26 14:57:09 UTC (rev 2172)
@@ -33,6 +33,7 @@
import java.util.Map;
import javax.jcr.Node;
+import javax.jcr.RepositoryException;
import javax.jcr.lock.Lock;
/**
@@ -1095,32 +1096,6 @@
public void testRepositoryRestoreFail() throws Exception
{
- // backup
- File backDir = new File("target/backup");
- backDir.mkdirs();
-
- RepositoryBackupConfig config = new RepositoryBackupConfig();
- config.setRepository(repository.getName());
- config.setBackupType(BackupManager.FULL_AND_INCREMENTAL);
- config.setIncrementalJobPeriod(1000);
-
- config.setBackupDir(backDir);
-
- backup.startBackup(config);
-
- RepositoryBackupChain bch = backup.findRepositoryBackup(repository.getName());
-
- // wait till full backup will be stopped
- while (bch.getState() != RepositoryBackupChain.FULL_BACKUP_FINISHED_INCREMENTAL_BACKUP_WORKING)
- {
- Thread.yield();
- Thread.sleep(50);
- }
-
- // stop fullBackup
-
- backup.stopBackup(bch);
-
// restore
RepositoryEntry re = (RepositoryEntry)ws1Session.getContainer().getComponentInstanceOfType(RepositoryEntry.class);
@@ -1128,45 +1103,31 @@
RepositoryEntry newRepositoryEntry = makeRepositoryEntry(newRepositoryName, re, "jdbcjcr_to_repository_restore_5", null);
//create broken system workspaceEntry
-
newRepositoryEntry.getWorkspaceEntries().get(0).getQueryHandler().setType("gg");
- File backLog = new File(bch.getLogFilePath());
- if (backLog.exists())
- {
- RepositoryBackupChainLog bchLog = new RepositoryBackupChainLog(backLog);
+ File backLog = new File(backup.getRepositoryBackupsLogs()[0].getLogFilePath());
+
+ RepositoryBackupChainLog bchLog = new RepositoryBackupChainLog(backLog);
- assertNotNull(bchLog.getStartedTime());
- assertNotNull(bchLog.getFinishedTime());
-
+ try {
backup.restore(bchLog, newRepositoryEntry, false);
+ fail("The backup " + backLog.getAbsolutePath() + "shoulde not restored.");
+ }
+ catch (RepositoryRestoreExeption e)
+ {
+ // ok.
+ }
- // check
- ManageableRepository restoredRepository = repositoryService.getRepository(newRepositoryName);
+ // check
- for (String wsName : restoredRepository.getWorkspaceNames())
- {
- SessionImpl back1 = null;
- try
- {
- back1 = (SessionImpl)repository.login(credentials, wsName);
- Node ws1backTestRoot = back1.getRootNode().getNode("backupTest");
- assertEquals("Restored content should be same", "property-5", ws1backTestRoot.getNode("node_5")
- .getProperty("exo:data").getString());
- }
- catch (Exception e)
- {
- e.printStackTrace();
- fail(e.getMessage());
- }
- finally
- {
- if (back1 != null)
- back1.logout();
- }
- }
+ try
+ {
+ ManageableRepository restoredRepository = repositoryService.getRepository(newRepositoryName);
+ fail("The repository " + newRepositoryName + "shoulde not exists.");
}
- else
- fail("There are no backup files in " + backDir.getAbsolutePath());
+ catch (RepositoryException e)
+ {
+ // ok.
+ }
}
}
16 years, 1 month
exo-jcr SVN: r2171 - jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core.
by do-not-reply@jboss.org
Author: pnedonosko
Date: 2010-03-26 10:47:07 -0400 (Fri, 26 Mar 2010)
New Revision: 2171
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/ItemImpl.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
Log:
EXOJCR-615 checkValid in NodeImpl.isNodeType(String); formatting
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/ItemImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/ItemImpl.java 2010-03-26 14:40:50 UTC (rev 2170)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/ItemImpl.java 2010-03-26 14:47:07 UTC (rev 2171)
@@ -187,7 +187,9 @@
// 6.2.8 If depth > n is specified then an ItemNotFoundException is
// thrown.
if (degree < 0)
+ {
throw new ItemNotFoundException("Can't get ancestor with ancestor's degree < 0.");
+ }
final QPath myPath = getData().getQPath();
int n = myPath.getDepth() - degree;
@@ -277,7 +279,9 @@
public boolean isNew()
{
if (isValid())
+ {
return dataManager.isNew(getInternalIdentifier());
+ }
// if was removed (is invalid by check), isn't new
return false;
@@ -289,7 +293,9 @@
public boolean isModified()
{
if (isValid())
+ {
return dataManager.isModified(getData());
+ }
// if was removed (is invalid by check), was modified
return true;
@@ -304,25 +310,38 @@
checkValid();
if (isRoot())
+ {
throw new RepositoryException("Can't remove ROOT node.");
+ }
// Check constraints
ItemDefinition def;
if (isNode())
+ {
def = ((NodeImpl)this).getDefinition();
+ }
else
+ {
def = ((PropertyImpl)this).getDefinition();
+ }
if (def.isMandatory() || def.isProtected())
+ {
throw new ConstraintViolationException("Can't remove mandatory or protected item " + getPath());
+ }
+
NodeImpl parentNode = parent();
// Check if versionable ancestor is not checked-in
if (!parentNode.checkedOut())
+ {
throw new VersionException("Node " + parent().getPath() + " or its nearest ancestor is checked-in");
+ }
// Check locking
if (!parentNode.checkLocking())
+ {
throw new LockException("Node " + parent().getPath() + " is locked ");
+ }
// launch event
session.getActionHandler().preRemoveItem(this);
@@ -444,8 +463,10 @@
PropertyDefinitionData def = defs.getDefinition(isMultiValue);
if (def != null && def.isProtected())
+ {
throw new ConstraintViolationException("Can not set protected property "
+ locationFactory.createJCRPath(qpath).getAsString(false));
+ }
if (multiValue && (def == null || (prevProp != null && !prevProp.isMultiValued())))
{
@@ -461,11 +482,15 @@
// Check if checked-in (versionable)
if (!parentNode.checkedOut())
+ {
throw new VersionException("Node " + parentNode.getPath() + " or its nearest ancestor is checked-in");
+ }
// Check is locked
if (!parentNode.checkLocking())
+ {
throw new LockException("Node " + parentNode.getPath() + " is locked ");
+ }
List<ValueData> valueDataList = new ArrayList<ValueData>();
@@ -583,7 +608,9 @@
checkValid();
if (isNew())
+ {
throw new RepositoryException("It is impossible to call save() on the newly added item " + getPath());
+ }
NodeTypeDataManager ntManager = session.getWorkspace().getNodeTypesHolder();
@@ -658,9 +685,13 @@
checkValid();
if (keepChanges)
+ {
dataManager.refresh(this.getData());
+ }
else
+ {
dataManager.rollback(this.getData());
+ }
}
// -------------------- Implementation ----------------------
@@ -750,11 +781,6 @@
return nodeTypes;
}
- // @Deprecated
- // public ExtendedNodeType[] getParentNodeTypes() throws RepositoryException {
- // return nodeTypes(parentData());
- // }
-
public String getInternalIdentifier()
{
return data.getIdentifier();
@@ -856,7 +882,9 @@
{
if (value == null)
+ {
return null;
+ }
switch (type)
{
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java 2010-03-26 14:40:50 UTC (rev 2170)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java 2010-03-26 14:47:07 UTC (rev 2171)
@@ -1064,8 +1064,8 @@
*/
public NodeType getPrimaryNodeType() throws RepositoryException
{
+ checkValid();
- checkValid();
ExtendedNodeTypeManager nodeTypeManager = (ExtendedNodeTypeManager)session.getWorkspace().getNodeTypeManager();
return nodeTypeManager.findNodeType(nodeData().getPrimaryTypeName());
}
@@ -1334,6 +1334,7 @@
{
checkValid();
+
return session.getLockManager().holdsLock((NodeData)getData());
}
@@ -1379,6 +1380,7 @@
*/
public boolean isNodeType(InternalQName qName) throws RepositoryException
{
+ checkValid();
return session.getWorkspace().getNodeTypesHolder().isNodeType(qName, nodeData().getPrimaryTypeName(),
nodeData().getMixinTypeNames());
@@ -1733,8 +1735,13 @@
*/
public void removePermission(String identity) throws RepositoryException, AccessControlException
{
+
+ checkValid();
+
if (!isNodeType(Constants.EXO_PRIVILEGEABLE))
+ {
throw new AccessControlException("Node is not exo:privilegeable " + getPath());
+ }
checkPermission(PermissionType.CHANGE_PERMISSION);
@@ -1750,6 +1757,8 @@
public void removePermission(String identity, String permission) throws RepositoryException, AccessControlException
{
+ checkValid();
+
if (!isNodeType(Constants.EXO_PRIVILEGEABLE))
throw new AccessControlException("Node is not exo:privilegeable " + getPath());
@@ -1890,14 +1899,22 @@
public void setPermission(String identity, String[] permission) throws RepositoryException, AccessControlException
{
+ checkValid();
+
if (!isNodeType(Constants.EXO_PRIVILEGEABLE))
+ {
throw new AccessControlException("Node is not exo:privilegeable " + getPath());
+ }
if (identity == null)
+ {
throw new RepositoryException("Identity cannot be null");
+ }
if (permission == null)
+ {
throw new RepositoryException("Permission cannot be null");
+ }
// check if changing permission allowed
checkPermission(PermissionType.CHANGE_PERMISSION);
@@ -1918,12 +1935,18 @@
public void setPermissions(Map permissions) throws RepositoryException, AccessDeniedException,
AccessControlException
{
-
+
+ checkValid();
+
if (!isNodeType(Constants.EXO_PRIVILEGEABLE))
+ {
throw new AccessControlException("Node is not exo:privilegeable " + getPath());
+ }
if (permissions.size() == 0)
+ {
throw new RepositoryException("Permission map size cannot be 0");
+ }
checkPermission(PermissionType.CHANGE_PERMISSION);
@@ -1944,6 +1967,7 @@
aces.add(ace);
}
}
+
AccessControlList acl = new AccessControlList(getACL().getOwner(), aces);
setACL(acl);
updatePermissions(acl);
@@ -2289,7 +2313,9 @@
{
if (!this.isNodeType(Constants.MIX_VERSIONABLE))
+ {
throw new UnsupportedRepositoryOperationException("Node is not mix:versionable " + getPath());
+ }
PropertyData vhProp =
(PropertyData)dataManager.getItemData(nodeData(), new QPathEntry(Constants.JCR_VERSIONHISTORY, 1));
16 years, 1 month
exo-jcr SVN: r2170 - kernel/trunk/exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss.
by do-not-reply@jboss.org
Author: nfilotto
Date: 2010-03-26 10:40:50 -0400 (Fri, 26 Mar 2010)
New Revision: 2170
Modified:
kernel/trunk/exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss/AbstractExoCache.java
Log:
EXOJCR-612: a temporary fix until we have a real fix in JBC
Modified: kernel/trunk/exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss/AbstractExoCache.java
===================================================================
--- kernel/trunk/exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss/AbstractExoCache.java 2010-03-26 14:09:09 UTC (rev 2169)
+++ kernel/trunk/exo.kernel.component.ext.cache.impl.jboss.v3/src/main/java/org/exoplatform/services/cache/impl/jboss/AbstractExoCache.java 2010-03-26 14:40:50 UTC (rev 2170)
@@ -247,7 +247,15 @@
*/
protected V putOnly(K key, V value)
{
- return cache.put(getFqn(key), key, value);
+ try
+ {
+ return cache.put(getFqn(key), key, value);
+ }
+ catch (NullPointerException e)
+ {
+ // to fix temporary the bug JBCACHE-1572
+ }
+ return null;
}
/**
16 years, 1 month
exo-jcr SVN: r2169 - jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing.
by do-not-reply@jboss.org
Author: pnedonosko
Date: 2010-03-26 10:09:09 -0400 (Fri, 26 Mar 2010)
New Revision: 2169
Modified:
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestOrderBefore.java
Log:
EXOJCR-587 failing test
Modified: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestOrderBefore.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestOrderBefore.java 2010-03-26 13:28:05 UTC (rev 2168)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/writing/TestOrderBefore.java 2010-03-26 14:09:09 UTC (rev 2169)
@@ -25,6 +25,7 @@
import java.util.List;
import javax.jcr.ItemExistsException;
+import javax.jcr.ItemNotFoundException;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.PathNotFoundException;
@@ -971,13 +972,13 @@
session.getRootNode().addNode("a");
session.save();
session.logout();
-
+
session = repository.login(credentials, "ws");
Node a = session.getRootNode().getNode("a"); // We suppose it already exist
- a.addNode("n1");
- a.addNode("n2");
- a.addNode("n3");
- a.addNode("n4");
+ a.addNode("n");
+ a.addNode("n");
+ a.addNode("n");
+ a.addNode("n");
session.save();
session.logout();
@@ -992,11 +993,53 @@
session = repository.login(credentials, "ws");
a = session.getRootNode().getNode("a");
- a.addNode("n5");
- a.orderBefore("n5", null); // NPE happens here
- session.save();
+ a.addNode("n");
+ a.orderBefore("n", null); // NPE happens here
+ session.save();
}
+ public void testDeleteOrderBefore_SNS() throws Exception
+ {
+ Session session = repository.login(credentials, "ws");
+ session.getRootNode().addNode("a");
+ session.save();
+ session.logout();
+
+ session = repository.login(credentials, "ws");
+ Node a = session.getRootNode().getNode("a"); // We suppose it already exist
+ Node n1 = a.addNode("n");
+ n1.addMixin("mix:referenceable");
+ Node n2 = a.addNode("n");
+ n2.addMixin("mix:referenceable");
+ Node n3 = a.addNode("n");
+ n3.addMixin("mix:referenceable");
+ session.save();
+ String n1id = n1.getUUID();
+ String n2id = n2.getUUID();
+ String n3id = n3.getUUID();
+ session.logout();
+
+ session = repository.login(credentials, "ws");
+ a = session.getRootNode().getNode("a");
+ a.getNode("n[2]").remove();
+ a.save();
+ session.save();
+ session.logout();
+
+ session = repository.login(credentials, "ws");
+ a = session.getRootNode().getNode("a");
+
+ try
+ {
+ session.getNodeByUUID(n2id);
+ fail("Node with id " + n2id + " is deleted");
+ }
+ catch (ItemNotFoundException e)
+ {
+ // ok
+ }
+ }
+
private EntityCollection getEntityCollection(NodeIterator nodes)
{
List result = new ArrayList();
16 years, 1 month