Author: andrew.plotnikov
Date: 2012-02-16 09:40:16 -0500 (Thu, 16 Feb 2012)
New Revision: 5654
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-1755: Improved queries for repository checking consistency
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 2012-02-16
14:31:09 UTC (rev 5653)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCWorkspaceDataContainerChecker.java 2012-02-16
14:40:16 UTC (rev 5654)
@@ -76,12 +76,14 @@
queries.add(new InspectionQuery(jdbcDataContainer.multiDb
? "select * from JCR_MITEM N where N.I_CLASS=1 and NOT EXISTS "
- + "(select * from JCR_MITEM P where P.I_CLASS=2 and
P.PARENT_ID=N.ID)"
+ + "(select * from JCR_MITEM P where P.I_CLASS=2 and P.PARENT_ID=N.ID
"
+ + "and
P.NAME='[http://www.jcp.org/jcr/1.0]primaryType')"
: "select * from JCR_SITEM N where N.CONTAINER_NAME='" +
jdbcDataContainer.containerName
+ "' and N.I_CLASS=1 and NOT EXISTS (select * from JCR_SITEM P
"
- + "where P.I_CLASS=2 and P.PARENT_ID=N.ID and
P.CONTAINER_NAME='" + jdbcDataContainer.containerName + "')",
- new String[]{DBConstants.COLUMN_ID, DBConstants.COLUMN_PARENTID,
DBConstants.COLUMN_NAME},
- "Nodes that do not have at least one property",
InspectionStatus.ERR));
+ + "where P.I_CLASS=2 and P.PARENT_ID=N.ID and
P.NAME='[http://www.jcp.org/jcr/1.0]primaryType' "
+ + "and P.CONTAINER_NAME='" + jdbcDataContainer.containerName +
"')", new String[]{DBConstants.COLUMN_ID,
+ DBConstants.COLUMN_PARENTID, DBConstants.COLUMN_NAME},
+ "Nodes that do not have at least one jcr:primaryType property",
InspectionStatus.ERR));
queries
.add(new InspectionQuery(jdbcDataContainer.multiDb
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 2012-02-16
14:31:09 UTC (rev 5653)
+++
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/TestRepositoryCheckController.java 2012-02-16
14:40:16 UTC (rev 5654)
@@ -745,6 +745,7 @@
public void testDBUsecasesNodeHasNoPropertiesSingleDB() throws Exception
{
checkDBUsecasesNodeHasNoProperties(helper.createRepository(container, false,
false));
+ checkDBUsecasesNodeHasPrimaryTypeProperties(helper.createRepository(container,
false, false));
}
/**
@@ -753,6 +754,7 @@
public void testDBUsecasesNodeHasNoPropertiesMultiDB() throws Exception
{
checkDBUsecasesNodeHasNoProperties(helper.createRepository(container, true,
false));
+ checkDBUsecasesNodeHasPrimaryTypeProperties(helper.createRepository(container,
false, false));
}
private void checkDBUsecasesNodeHasNoProperties(ManageableRepository repository)
throws Exception
@@ -802,6 +804,56 @@
checkController.getLastLogFile().delete();
}
+ private void checkDBUsecasesNodeHasPrimaryTypeProperties(ManageableRepository
repository) throws Exception
+ {
+ // create repository and add node
+ SessionImpl session =
+ (SessionImpl)repository.login(credentials,
repository.getConfiguration().getSystemWorkspaceName());
+ NodeImpl node = (NodeImpl)session.getRootNode().addNode("testNode");
+ session.save();
+
+ PropertyIterator iter = node.getProperties();
+
+ // 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);
+
+ // remove all properties
+ String sourceName =
wsEntry.getContainer().getParameterValue(JDBCWorkspaceDataContainer.SOURCE_NAME);
+
+ Connection conn = ((DataSource)new
InitialContext().lookup(sourceName)).getConnection();
+ while (iter.hasNext())
+ {
+ PropertyImpl prop = (PropertyImpl)iter.nextProperty();
+
+ if (!prop.getName().equals("jcr:primaryType"))
+ {
+ conn.prepareStatement(
+ "DELETE FROM JCR_" + (isMultiDb ? "M" : "S")
+ "VALUE WHERE PROPERTY_ID = '"
+ + (isMultiDb ? "" : wsEntry.getName()) +
prop.getInternalIdentifier() + "'").execute();
+
+ conn.prepareStatement(
+ "DELETE FROM JCR_" + (isMultiDb ? "M" : "S")
+ "ITEM WHERE ID = '"
+ + (isMultiDb ? "" : wsEntry.getName()) +
prop.getInternalIdentifier() + "'").execute();
+ }
+ }
+
+ conn.commit();
+ conn.close();
+
+ assertTrue(node.getProperties().hasNext());
+
+ session.logout();
+
+ // repository is inconsistent
+
assertTrue(checkController.checkRepositoryDataBaseConsistency().startsWith("Repository
data is consistent"));
+ checkController.getLastLogFile().delete();
+ }
+
/**
* Usescase when STORAGE_DESC field in JCR_SVALUE table is not empty but there is no
file in the value storage.
*/