[exo-jcr-commits] exo-jcr SVN: r5252 - in jcr/trunk/exo.jcr.component.core/src: test/java/org/exoplatform/services/jcr/impl and 1 other directory.

do-not-reply at jboss.org do-not-reply at jboss.org
Thu Dec 1 10:02:40 EST 2011


Author: tolusha
Date: 2011-12-01 10:02:40 -0500 (Thu, 01 Dec 2011)
New Revision: 5252

Modified:
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCWorkspaceDataContainerChecker.java
   jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/TestRepositoryCheckController.java
Log:
EXOJCR-1664: Added the ability to check if an item is its own parent to the JCRConsistencyTool

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCWorkspaceDataContainerChecker.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCWorkspaceDataContainerChecker.java	2011-12-01 13:27:39 UTC (rev 5251)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCWorkspaceDataContainerChecker.java	2011-12-01 15:02:40 UTC (rev 5252)
@@ -19,6 +19,7 @@
 package org.exoplatform.services.jcr.impl.storage.jdbc;
 
 import org.exoplatform.commons.utils.SecurityHelper;
+import org.exoplatform.services.jcr.impl.Constants;
 import org.exoplatform.services.jcr.impl.InspectionLog;
 import org.exoplatform.services.jcr.impl.InspectionLog.InspectionStatus;
 import org.exoplatform.services.jcr.impl.storage.value.ValueDataNotFoundException;
@@ -203,6 +204,14 @@
          DBConstants.COLUMN_VORDERNUM},
          "Reference records that linked to unexisted nodes. Can be normal for some usecases.", InspectionStatus.WARN));
 
+      // an item is its own parent. 
+      queries.add(new InspectionQuery(jdbcDataContainer.multiDb
+         ? "select * from JCR_MITEM I where I.ID = I.PARENT_ID and I.NAME <> '" + Constants.ROOT_PARENT_NAME + "'"
+         : "select * from JCR_SITEM I where I.ID = I.PARENT_ID and I.CONTAINER_NAME='"
+            + jdbcDataContainer.containerName + "' and I.NAME <> '" + Constants.ROOT_PARENT_NAME + "'", new String[]{
+         DBConstants.COLUMN_ID, DBConstants.COLUMN_PARENTID, DBConstants.COLUMN_NAME}, "An item is its own parent.",
+         InspectionStatus.ERR));
+
       // using existing DataSource to get a JDBC Connection.
       Connection jdbcConn = jdbcDataContainer.getConnectionFactory().getJdbcConnection();
 

Modified: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/TestRepositoryCheckController.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/TestRepositoryCheckController.java	2011-12-01 13:27:39 UTC (rev 5251)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/TestRepositoryCheckController.java	2011-12-01 15:02:40 UTC (rev 5252)
@@ -309,8 +309,61 @@
       checkController.getLastLogFile().delete();
    }
 
+   /**
+    *  Usecase: property doens't have have parent node.
+    */
+   public void testDBUsecasesTheParentIdIsIdOfThisNodeSingleDB() throws Exception
+   {
+      checkDBUsecasesTheParentIdIsIdOfThisNode(helper.createRepository(container, false, false));
+   }
 
    /**
+    * Usecase: property doens't have have parent node.
+    */
+   public void testDBUsecasesTheParentIdIsIdOfThisNodeMultiDB() throws Exception
+   {
+      checkDBUsecasesTheParentIdIsIdOfThisNode(helper.createRepository(container, true, false));
+   }
+
+   private void checkDBUsecasesTheParentIdIsIdOfThisNode(ManageableRepository repository) throws Exception
+   {
+      // create repository and add property
+      SessionImpl session =
+         (SessionImpl)repository.login(credentials, repository.getConfiguration().getSystemWorkspaceName());
+      NodeImpl node = (NodeImpl)session.getRootNode().addNode("testNode");
+      PropertyImpl prop = (PropertyImpl)node.setProperty("prop", "test");
+      session.save();
+      session.logout();
+
+      // repository is consistent
+      checkController = new RepositoryCheckController(repository);
+      assertTrue(checkController.checkRepositoryDataBaseConsistency().startsWith("Repository data is consistent"));
+      checkController.getLastLogFile().delete();
+
+      WorkspaceEntry wsEntry = repository.getConfiguration().getWorkspaceEntries().get(0);
+      boolean isMultiDb = wsEntry.getContainer().getParameterBoolean(JDBCWorkspaceDataContainer.MULTIDB);
+
+      // change ITEM table
+      String sourceName = wsEntry.getContainer().getParameterValue(JDBCWorkspaceDataContainer.SOURCE_NAME);
+
+      Connection conn = ((DataSource)new InitialContext().lookup(sourceName)).getConnection();
+
+      conn.prepareStatement("DROP INDEX JCR_IDX_" + (isMultiDb ? "M" : "S") + "ITEM_PARENT").execute();
+      conn.prepareStatement("DROP INDEX JCR_IDX_" + (isMultiDb ? "M" : "S") + "ITEM_PARENT_NAME").execute();
+      conn.prepareStatement(
+         "UPDATE JCR_" + (isMultiDb ? "M" : "S") + "ITEM SET PARENT_ID = '" + (isMultiDb ? "" : wsEntry.getName())
+            + node.getInternalIdentifier() + "' WHERE ID='" + (isMultiDb ? "" : wsEntry.getName())
+            + node.getInternalIdentifier() + "'").execute();
+
+      conn.commit();
+      conn.close();
+
+      // repository is inconsistent
+      assertTrue(checkController.checkRepositoryDataBaseConsistency().startsWith("Repository data is inconsistent"));
+      checkController.getLastLogFile().delete();
+   }
+
+   /**
     *  Usecase: property doens't have have parent node.
     */
    public void testDBUsecasesPropertyWithoutParentSingleDB() throws Exception



More information about the exo-jcr-commits mailing list