exo-jcr SVN: r5001 - jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db.
by do-not-reply@jboss.org
Author: tolusha
Date: 2011-09-29 07:09:50 -0400 (Thu, 29 Sep 2011)
New Revision: 5001
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLMultiDbJDBCConnection.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLSingleDbJDBCConnection.java
Log:
EXOJCR-1506: improve RDBMS reindexin for MSSQL
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLMultiDbJDBCConnection.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLMultiDbJDBCConnection.java 2011-09-29 10:18:52 UTC (rev 5000)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLMultiDbJDBCConnection.java 2011-09-29 11:09:50 UTC (rev 5001)
@@ -32,6 +32,10 @@
*/
public class MSSQLMultiDbJDBCConnection extends MultiDbJDBCConnection
{
+ /**
+ * Template for query. Since there is no way to set parameter for TOP via prepared statement.
+ * We need to replace it in the code.
+ */
public static final String FIND_NODES_AND_PROPERTIES_TEMPLATE =
"select J.*, P.ID AS P_ID, P.NAME AS P_NAME, P.VERSION AS P_VERSION, P.P_TYPE, P.P_MULTIVALUED,"
+ " V.DATA, V.ORDER_NUM, V.STORAGE_DESC from JCR_MVALUE V WITH (INDEX (jcr_idx_mvalue_property)), JCR_MITEM P "
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLSingleDbJDBCConnection.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLSingleDbJDBCConnection.java 2011-09-29 10:18:52 UTC (rev 5000)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLSingleDbJDBCConnection.java 2011-09-29 11:09:50 UTC (rev 5001)
@@ -34,6 +34,10 @@
*/
public class MSSQLSingleDbJDBCConnection extends SingleDbJDBCConnection
{
+ /**
+ * Template for query. Since there is no way to set parameter for TOP via prepared statement.
+ * We need to replace it in the code.
+ */
private static final String FIND_NODES_AND_PROPERTIES_TEMPLATE =
"select J.*, P.ID AS P_ID, P.NAME AS P_NAME, P.VERSION AS P_VERSION, P.P_TYPE, P.P_MULTIVALUED,"
+ " V.DATA, V.ORDER_NUM, V.STORAGE_DESC from JCR_SVALUE V WITH (INDEX (jcr_idx_svalue_property)), JCR_SITEM P "
12 years, 7 months
exo-jcr SVN: r5000 - in jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr: impl/core/query/lucene and 2 other directories.
by do-not-reply@jboss.org
Author: tolusha
Date: 2011-09-29 06:18:52 -0400 (Thu, 29 Sep 2011)
New Revision: 5000
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/datamodel/NodeDataIndexing.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeIndexer.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCStorageConnection.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLConnectionFactory.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLMultiDbJDBCConnection.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLSingleDbJDBCConnection.java
Log:
EXOJCR-1506: improve RDBMS reindexin for MSSQL
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/datamodel/NodeDataIndexing.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/datamodel/NodeDataIndexing.java 2011-09-29 06:52:50 UTC (rev 4999)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/datamodel/NodeDataIndexing.java 2011-09-29 10:18:52 UTC (rev 5000)
@@ -156,4 +156,12 @@
{
return nodeData.getACL();
}
+
+ /**
+ * Indicates if all properties was read from storage.
+ */
+ public boolean containAllProperties()
+ {
+ return properties != null;
+ }
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeIndexer.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeIndexer.java 2011-09-29 06:52:50 UTC (rev 4999)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeIndexer.java 2011-09-29 10:18:52 UTC (rev 5000)
@@ -310,7 +310,7 @@
// seems nt:file found, try for nt:resource props
PropertyData pmime = node.getProperty(Constants.JCR_MIMETYPE.getAsString());
- if (pmime == null)
+ if (pmime == null && !node.containAllProperties())
{
pmime =
(PropertyData)stateProvider.getItemData(node, new QPathEntry(Constants.JCR_MIMETYPE, 0),
@@ -342,7 +342,7 @@
// check the jcr:encoding property
PropertyData encProp = node.getProperty(Constants.JCR_ENCODING.getAsString());
- if (encProp == null)
+ if (encProp == null && !node.containAllProperties())
{
encProp =
(PropertyData)stateProvider.getItemData(node, new QPathEntry(Constants.JCR_ENCODING, 0),
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCStorageConnection.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCStorageConnection.java 2011-09-29 06:52:50 UTC (rev 4999)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCStorageConnection.java 2011-09-29 10:18:52 UTC (rev 5000)
@@ -1086,15 +1086,7 @@
}
/**
- * GetNodesAndProperties.
- *
- * @param lastNodeId the id if the last doc get from the db
- * @param offset
- * @param limit
- * @param result
- * @return
- * @throws RepositoryException
- * @throws IllegalStateException
+ * Returns from storage the next page of nodes and its properties.
*/
public List<NodeDataIndexing> getNodesAndProperties(String lastNodeId, int offset, int limit)
throws RepositoryException, IllegalStateException
@@ -1105,6 +1097,7 @@
try
{
ResultSet resultSet = findNodesAndProperties(lastNodeId, offset, limit);
+ int processed = 0;
try
{
@@ -1115,26 +1108,35 @@
if (tempNodeData == null)
{
tempNodeData = new TempNodeData(resultSet);
+ processed++;
}
else if (!resultSet.getString(COLUMN_ID).equals(tempNodeData.cid))
{
- result.add(createNodeDataIndexing(tempNodeData));
+ if (!needToSkipOffsetNodes() || processed > offset)
+ {
+ result.add(createNodeDataIndexing(tempNodeData));
+ }
+
tempNodeData = new TempNodeData(resultSet);
+ processed++;
}
- String key = resultSet.getString("P_NAME");
+ if (!needToSkipOffsetNodes() || processed > offset)
+ {
+ String key = resultSet.getString("P_NAME");
- SortedSet<TempPropertyData> values = tempNodeData.properties.get(key);
- if (values == null)
- {
- values = new TreeSet<TempPropertyData>();
- tempNodeData.properties.put(key, values);
+ SortedSet<TempPropertyData> values = tempNodeData.properties.get(key);
+ if (values == null)
+ {
+ values = new TreeSet<TempPropertyData>();
+ tempNodeData.properties.put(key, values);
+ }
+
+ values.add(new ExtendedTempPropertyData(resultSet));
}
-
- values.add(new ExtendedTempPropertyData(resultSet));
}
- if (tempNodeData != null)
+ if (tempNodeData != null && (!needToSkipOffsetNodes() || processed > offset))
{
result.add(createNodeDataIndexing(tempNodeData));
}
@@ -1168,6 +1170,15 @@
}
/**
+ * Some implementations could require to skip first 'offset' nodes from
+ * result set.
+ */
+ protected boolean needToSkipOffsetNodes()
+ {
+ return false;
+ }
+
+ /**
*
* @param parent
* @param lastOrderNum
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLConnectionFactory.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLConnectionFactory.java 2011-09-29 06:52:50 UTC (rev 4999)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLConnectionFactory.java 2011-09-29 10:18:52 UTC (rev 5000)
@@ -129,6 +129,6 @@
@Override
public boolean isIDNeededForPaging()
{
- return false;
+ return true;
}
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLMultiDbJDBCConnection.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLMultiDbJDBCConnection.java 2011-09-29 06:52:50 UTC (rev 4999)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLMultiDbJDBCConnection.java 2011-09-29 10:18:52 UTC (rev 5000)
@@ -32,6 +32,13 @@
*/
public class MSSQLMultiDbJDBCConnection extends MultiDbJDBCConnection
{
+ public static final String FIND_NODES_AND_PROPERTIES_TEMPLATE =
+ "select J.*, P.ID AS P_ID, P.NAME AS P_NAME, P.VERSION AS P_VERSION, P.P_TYPE, P.P_MULTIVALUED,"
+ + " V.DATA, V.ORDER_NUM, V.STORAGE_DESC from JCR_MVALUE V WITH (INDEX (jcr_idx_mvalue_property)), JCR_MITEM P "
+ + " join (select TOP ${TOP} I.ID, I.PARENT_ID, I.NAME, I.VERSION, I.I_INDEX, I.N_ORDER_NUM from JCR_MITEM I WITH (INDEX (jcr_pk_mitem))"
+ + " where I.I_CLASS=1 AND I.ID > ? order by I.ID) J on P.PARENT_ID = J.ID"
+ + " where P.I_CLASS=2 and V.PROPERTY_ID=P.ID order by J.ID";
+
/**
* MSSQL Multidatabase JDBC Connection constructor.
*
@@ -67,13 +74,6 @@
protected void prepareQueries() throws SQLException
{
super.prepareQueries();
- FIND_NODES_AND_PROPERTIES =
- "select J.*, P.ID AS P_ID, P.NAME AS P_NAME, P.VERSION AS P_VERSION, P.P_TYPE, P.P_MULTIVALUED,"
- + " V.DATA, V.ORDER_NUM, V.STORAGE_DESC from JCR_MVALUE V, JCR_MITEM P"
- + " join (select A.* from"
- + " (select Row_Number() over (order by I.ID) as r__, I.ID, I.PARENT_ID, I.NAME, I.VERSION, I.I_INDEX, I.N_ORDER_NUM"
- + " from JCR_MITEM I where I.I_CLASS=1) as A where A.r__ <= ? and A.r__ > ?) J on P.PARENT_ID = J.ID"
- + " where P.I_CLASS=2 and V.PROPERTY_ID=P.ID order by J.ID";
}
/**
@@ -82,22 +82,29 @@
@Override
protected ResultSet findNodesAndProperties(String lastNodeId, int offset, int limit) throws SQLException
{
- if (findNodesAndProperties == null)
+ if (findNodesAndProperties != null)
{
- findNodesAndProperties = dbConnection.prepareStatement(FIND_NODES_AND_PROPERTIES);
+ findNodesAndProperties.close();
}
- else
- {
- findNodesAndProperties.clearParameters();
- }
- findNodesAndProperties.setInt(1, offset + limit);
- findNodesAndProperties.setInt(2, offset);
+ findNodesAndProperties =
+ dbConnection.prepareStatement(FIND_NODES_AND_PROPERTIES_TEMPLATE.replace("${TOP}",
+ new Integer(offset + limit).toString()));
+ findNodesAndProperties.setString(1, getInternalId(lastNodeId));
+
return findNodesAndProperties.executeQuery();
}
/**
+ * {@inheritDoc}
+ */
+ protected boolean needToSkipOffsetNodes()
+ {
+ return true;
+ }
+
+ /**
* Replace underscore in pattern with escaped symbol. Replace jcr-wildcard '*' with sql-wildcard '%'.
* <p>
* MSSQL have a range pattern '[..]' so we need to escape it too.
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLSingleDbJDBCConnection.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLSingleDbJDBCConnection.java 2011-09-29 06:52:50 UTC (rev 4999)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MSSQLSingleDbJDBCConnection.java 2011-09-29 10:18:52 UTC (rev 5000)
@@ -34,6 +34,13 @@
*/
public class MSSQLSingleDbJDBCConnection extends SingleDbJDBCConnection
{
+ private static final String FIND_NODES_AND_PROPERTIES_TEMPLATE =
+ "select J.*, P.ID AS P_ID, P.NAME AS P_NAME, P.VERSION AS P_VERSION, P.P_TYPE, P.P_MULTIVALUED,"
+ + " V.DATA, V.ORDER_NUM, V.STORAGE_DESC from JCR_SVALUE V WITH (INDEX (jcr_idx_svalue_property)), JCR_SITEM P "
+ + " join (select TOP ${TOP} I.ID, I.PARENT_ID, I.NAME, I.VERSION, I.I_INDEX, I.N_ORDER_NUM from JCR_SITEM I WITH (INDEX (jcr_pk_sitem))"
+ + " where I.CONTAINER_NAME=? AND I.I_CLASS=1 AND I.ID > ? order by I.ID) J on P.PARENT_ID = J.ID"
+ + " where P.I_CLASS=2 and P.CONTAINER_NAME=? and V.PROPERTY_ID=P.ID order by J.ID";
+
/**
* MSSQL Singledatabase JDBC Connection constructor.
*
@@ -66,43 +73,33 @@
* {@inheritDoc}
*/
@Override
- protected void prepareQueries() throws SQLException
- {
- super.prepareQueries();
- FIND_NODES_AND_PROPERTIES =
- "select J.*, P.ID AS P_ID, P.NAME AS P_NAME, P.VERSION AS P_VERSION, P.P_TYPE, P.P_MULTIVALUED,"
- + " V.DATA, V.ORDER_NUM, V.STORAGE_DESC from JCR_SVALUE V, JCR_SITEM P"
- + " join (select A.* from"
- + " (select Row_Number() over (order by I.ID) as r__, I.ID, I.PARENT_ID, I.NAME, I.VERSION, I.I_INDEX, I.N_ORDER_NUM"
- + " from JCR_SITEM I where I.CONTAINER_NAME=? and I.I_CLASS=1) as A where A.r__ <= ? and A.r__ > ?"
- + " ) J on P.PARENT_ID = J.ID"
- + " where P.I_CLASS=2 and P.CONTAINER_NAME=? and V.PROPERTY_ID=P.ID order by J.ID";
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
protected ResultSet findNodesAndProperties(String lastNodeId, int offset, int limit) throws SQLException
{
- if (findNodesAndProperties == null)
+ if (findNodesAndProperties != null)
{
- findNodesAndProperties = dbConnection.prepareStatement(FIND_NODES_AND_PROPERTIES);
+ findNodesAndProperties.close();
}
- else
- {
- findNodesAndProperties.clearParameters();
- }
+ findNodesAndProperties =
+ dbConnection.prepareStatement(FIND_NODES_AND_PROPERTIES_TEMPLATE.replace("${TOP}",
+ new Integer(offset + limit).toString()));
+
findNodesAndProperties.setString(1, containerName);
- findNodesAndProperties.setInt(2, offset + limit);
- findNodesAndProperties.setInt(3, offset);
- findNodesAndProperties.setString(4, containerName);
+ findNodesAndProperties.setString(2, getInternalId(lastNodeId));
+ findNodesAndProperties.setString(3, containerName);
return findNodesAndProperties.executeQuery();
}
/**
+ * {@inheritDoc}
+ */
+ protected boolean needToSkipOffsetNodes()
+ {
+ return true;
+ }
+
+ /**
* Replace underscore in pattern with escaped symbol. Replace jcr-wildcard '*' with sql-wildcard '%'.
* <p>
* MSSQL have a range pattern '[..]' so we need to escape it too.
12 years, 7 months
exo-jcr SVN: r4999 - jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/statistics.
by do-not-reply@jboss.org
Author: sergiykarpenko
Date: 2011-09-29 02:52:50 -0400 (Thu, 29 Sep 2011)
New Revision: 4999
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/statistics/StatisticsJDBCStorageConnection.java
Log:
EXOJCR-1543: statistics - method name misprint fixed
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/statistics/StatisticsJDBCStorageConnection.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/statistics/StatisticsJDBCStorageConnection.java 2011-09-28 12:53:33 UTC (rev 4998)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/statistics/StatisticsJDBCStorageConnection.java 2011-09-29 06:52:50 UTC (rev 4999)
@@ -130,7 +130,7 @@
*/
private static final String GET_CHILD_NODES_DATA_DESCR = "getChildNodesData";
- private static final String GET_CHILD_NODES_DATA_PATTERN_DESCR = "getChildNodesData";
+ private static final String GET_CHILD_NODES_DATA_PATTERN_DESCR = "getChildNodesDataPattern";
/**
* The description of the statistics corresponding to the method
12 years, 7 months
exo-jcr SVN: r4998 - in jcr/branches/1.12.x/patch/1.12.11-GA: JCR-1671 and 1 other directory.
by do-not-reply@jboss.org
Author: nzamosenchuk
Date: 2011-09-28 08:53:33 -0400 (Wed, 28 Sep 2011)
New Revision: 4998
Added:
jcr/branches/1.12.x/patch/1.12.11-GA/JCR-1671/
jcr/branches/1.12.x/patch/1.12.11-GA/JCR-1671/JCR-1671.patch
Log:
JCR-1671 : patch proposed
Added: jcr/branches/1.12.x/patch/1.12.11-GA/JCR-1671/JCR-1671.patch
===================================================================
--- jcr/branches/1.12.x/patch/1.12.11-GA/JCR-1671/JCR-1671.patch (rev 0)
+++ jcr/branches/1.12.x/patch/1.12.11-GA/JCR-1671/JCR-1671.patch 2011-09-28 12:53:33 UTC (rev 4998)
@@ -0,0 +1,1726 @@
+Index: exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/session/SessionChangesLogTest.java
+===================================================================
+--- exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/session/SessionChangesLogTest.java (revision 4991)
++++ exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/dataflow/session/SessionChangesLogTest.java (working copy)
+@@ -20,10 +20,10 @@
+
+ import org.exoplatform.services.jcr.JcrImplBaseTest;
+ import org.exoplatform.services.jcr.dataflow.ItemState;
+-import org.exoplatform.services.jcr.dataflow.persistent.PersistedPropertyData;
+ import org.exoplatform.services.jcr.datamodel.InternalQName;
+ import org.exoplatform.services.jcr.datamodel.NodeData;
+ import org.exoplatform.services.jcr.impl.Constants;
++import org.exoplatform.services.jcr.impl.core.DummySession;
+ import org.exoplatform.services.jcr.impl.core.NodeImpl;
+ import org.exoplatform.services.jcr.impl.core.SessionDataManager;
+ import org.exoplatform.services.jcr.impl.core.SessionImpl;
+@@ -120,7 +120,7 @@
+ try
+ {
+ userSession = (SessionImpl)frepository.login(fcredentials, "ws");
+- chlog[0] = new SessionChangesLogInfo(new SessionChangesLog(userSession.getId()), userSession.getId());
++ chlog[0] = new SessionChangesLogInfo(new SessionChangesLog(userSession), userSession.getId());
+ }
+ catch (RepositoryException e)
+ {
+@@ -148,7 +148,7 @@
+ public void testSameSession()
+ {
+
+- SessionChangesLog chlog = new SessionChangesLog(session.getId());
++ SessionChangesLog chlog = new SessionChangesLog(session);
+ assertEquals("Session must be same as given id owns", session, getRegisteredSession(chlog.getSessionId()));
+ }
+
+@@ -156,7 +156,7 @@
+ {
+
+ String id = IdGenerator.generate();
+- SessionChangesLog chlog = new SessionChangesLog(id);
++ SessionChangesLog chlog = new SessionChangesLog(new DummySession(id));
+
+ assertNull("No session should be linked to the log", getRegisteredSession(chlog.getSessionId()));
+ }
+@@ -248,7 +248,7 @@
+
+ public void testAddRootChanges() throws Exception
+ {
+- SessionChangesLog changesLog = new SessionChangesLog(session.getId());
++ SessionChangesLog changesLog = new SessionChangesLog(session);
+ try
+ {
+ changesLog.add(new ItemState(new TransientPropertyData(Constants.ROOT_PATH, Constants.ROOT_UUID, 0,
+Index: exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/storage/fs/TestJCRVSReadWrite.java
+===================================================================
+--- exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/storage/fs/TestJCRVSReadWrite.java (revision 4991)
++++ exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/storage/fs/TestJCRVSReadWrite.java (working copy)
+@@ -147,7 +147,9 @@
+ path = resource.setProperty("jcr:data", vals).getPath();
+ }
+ else
++ {
+ path = resource.setProperty("jcr:data", fBLOB1).getPath();
++ }
+ resource.setProperty("jcr:mimeType", "application/x-octet-stream");
+ resource.setProperty("jcr:lastModified", Calendar.getInstance());
+ testRoot.save();
+@@ -191,7 +193,7 @@
+ {
+ try
+ {
+- SessionChangesLog changes = new SessionChangesLog(((NodeImpl)testRoot).getSession().getId());
++ SessionChangesLog changes = new SessionChangesLog(((NodeImpl)testRoot).getSession());
+
+ TransientNodeData ntfile =
+ TransientNodeData.createNodeData(rootData, InternalQName.parse("[]blob" + i), Constants.NT_FILE);
+@@ -218,7 +220,9 @@
+ data.add(new TransientValueData(fBLOB2));
+ }
+ else
++ {
+ data.add(new TransientValueData(fBLOB1));
++ }
+
+ TransientPropertyData resData =
+ TransientPropertyData.createPropertyData(res, Constants.JCR_DATA, PropertyType.BINARY, data.size() > 1,
+@@ -259,7 +263,7 @@
+ {
+ final DataManager dm =
+ ((NodeImpl)testRoot).getSession().getTransientNodesManager().getTransactManager().getStorageDataManager();
+- final SessionChangesLog changes = new SessionChangesLog(((NodeImpl)testRoot).getSession().getId());
++ final SessionChangesLog changes = new SessionChangesLog(((NodeImpl)testRoot).getSession());
+
+ class Remover
+ {
+@@ -301,12 +305,18 @@
+ }
+
+ if (item == null)
++ {
+ break;
++ }
+
+ if (item.isNode())
++ {
+ parent = (NodeData)item;
++ }
+ else if (i < relPathEntries.length - 1)
++ {
+ throw new IllegalPathException("Path can not contains a property as the intermediate element");
++ }
+ }
+ return item;
+ }
+Index: exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/version/BaseVersionImplTest.java
+===================================================================
+--- exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/version/BaseVersionImplTest.java (revision 4991)
++++ exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/version/BaseVersionImplTest.java (working copy)
+@@ -223,11 +223,11 @@
+ versionedVersionHistoryData = new ArrayList<ValueData>();
+ versionedVersionHistoryData.add(new TestTransientValueData(versionedVersionHistoryUuid.getBytes(), 0));
+
+- changesLog = new SessionChangesLog(session.getId());
++ changesLog = new SessionChangesLog(session);
+
+ ntManager = (NodeTypeManagerImpl)session.getWorkspace().getNodeTypeManager();
+
+- SessionChangesLog initChanges = new SessionChangesLog(session.getId());
++ SessionChangesLog initChanges = new SessionChangesLog(session);
+
+ NodeData wsRoot = (NodeData)((NodeImpl)session.getRootNode()).getData();
+ testRoot =
+@@ -267,7 +267,7 @@
+ public void createVersionable(int testCase) throws Exception
+ {
+
+- versionableLog = new SessionChangesLog(session.getId());
++ versionableLog = new SessionChangesLog(session);
+
+ // target node
+ versionable =
+Index: exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/DummySession.java
+===================================================================
+--- exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/DummySession.java (revision 0)
++++ exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/DummySession.java (revision 0)
+@@ -0,0 +1,268 @@
++/*
++ * Copyright (C) 2011 eXo Platform SAS.
++ *
++ * This is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU Lesser General Public License as
++ * published by the Free Software Foundation; either version 2.1 of
++ * the License, or (at your option) any later version.
++ *
++ * This software is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this software; if not, write to the Free
++ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
++ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
++ */
++package org.exoplatform.services.jcr.impl.core;
++
++import org.exoplatform.services.jcr.core.ExtendedSession;
++import org.exoplatform.services.jcr.core.SessionLifecycleListener;
++import org.exoplatform.services.jcr.impl.core.LocationFactory;
++import org.xml.sax.ContentHandler;
++import org.xml.sax.SAXException;
++import java.io.IOException;
++import java.io.InputStream;
++import java.io.OutputStream;
++import java.security.AccessControlException;
++import java.util.Map;
++import javax.jcr.AccessDeniedException;
++import javax.jcr.Credentials;
++import javax.jcr.InvalidItemStateException;
++import javax.jcr.InvalidSerializedDataException;
++import javax.jcr.Item;
++import javax.jcr.ItemExistsException;
++import javax.jcr.ItemNotFoundException;
++import javax.jcr.LoginException;
++import javax.jcr.NamespaceException;
++import javax.jcr.Node;
++import javax.jcr.PathNotFoundException;
++import javax.jcr.Repository;
++import javax.jcr.RepositoryException;
++import javax.jcr.Session;
++import javax.jcr.UnsupportedRepositoryOperationException;
++import javax.jcr.ValueFactory;
++import javax.jcr.Workspace;
++import javax.jcr.lock.LockException;
++import javax.jcr.nodetype.ConstraintViolationException;
++import javax.jcr.nodetype.NoSuchNodeTypeException;
++import javax.jcr.version.VersionException;
++import javax.transaction.xa.XAResource;
++
++/**
++* @author Nikolay Zamosenchuk
++* @version $Id: DummySession.xml 34360 2009-07-22 23:58:59Z nzamosenchuk $
++*
++*/
++public class DummySession implements ExtendedSession
++{
++ private String sessionId;
++
++ public DummySession(String sessionId)
++ {
++ this.sessionId = sessionId;
++ }
++
++ public String getId()
++ {
++ return sessionId;
++ }
++
++ // do nothing
++ public void exportSystemView(String absPath, OutputStream out, boolean skipBinary, boolean noRecurse,
++ boolean exportChildVersionHisotry) throws IOException, PathNotFoundException, RepositoryException
++ {
++ }
++
++ public LocationFactory getLocationFactory()
++ {
++ return null;
++ }
++
++ public Node getNodeByIdentifier(String identifier) throws ItemNotFoundException, RepositoryException
++ {
++ return null;
++ }
++
++ public long getTimeout()
++ {
++ return 0;
++ }
++
++ public XAResource getXAResource()
++ {
++ return null;
++ }
++
++ public boolean hasExpired()
++ {
++ return false;
++ }
++
++ public void importXML(String parentAbsPath, InputStream in, int uuidBehavior, Map<String, Object> context)
++ throws IOException, PathNotFoundException, ItemExistsException, ConstraintViolationException,
++ InvalidSerializedDataException, RepositoryException
++ {
++ }
++
++ public void registerLifecycleListener(SessionLifecycleListener listener)
++ {
++ }
++
++ public void setTimeout(long timeout)
++ {
++ }
++
++ public void addLockToken(String lt)
++ {
++ }
++
++ public void checkPermission(String absPath, String actions) throws AccessControlException, RepositoryException
++ {
++ }
++
++ public void exportDocumentView(String absPath, ContentHandler contentHandler, boolean skipBinary, boolean noRecurse)
++ throws PathNotFoundException, SAXException, RepositoryException
++ {
++ }
++
++ public void exportDocumentView(String absPath, OutputStream out, boolean skipBinary, boolean noRecurse)
++ throws IOException, PathNotFoundException, RepositoryException
++ {
++ }
++
++ public void exportSystemView(String absPath, ContentHandler contentHandler, boolean skipBinary, boolean noRecurse)
++ throws PathNotFoundException, SAXException, RepositoryException
++ {
++ }
++
++ public void exportSystemView(String absPath, OutputStream out, boolean skipBinary, boolean noRecurse)
++ throws IOException, PathNotFoundException, RepositoryException
++ {
++ }
++
++ public Object getAttribute(String name)
++ {
++ return null;
++ }
++
++ public String[] getAttributeNames()
++ {
++ return null;
++ }
++
++ public ContentHandler getImportContentHandler(String parentAbsPath, int uuidBehavior) throws PathNotFoundException,
++ ConstraintViolationException, VersionException, LockException, RepositoryException
++ {
++ return null;
++ }
++
++ public Item getItem(String absPath) throws PathNotFoundException, RepositoryException
++ {
++ return null;
++ }
++
++ public String[] getLockTokens()
++ {
++ return null;
++ }
++
++ public String getNamespacePrefix(String uri) throws NamespaceException, RepositoryException
++ {
++ return null;
++ }
++
++ public String[] getNamespacePrefixes() throws RepositoryException
++ {
++ return null;
++ }
++
++ public String getNamespaceURI(String prefix) throws NamespaceException, RepositoryException
++ {
++ return null;
++ }
++
++ public Node getNodeByUUID(String uuid) throws ItemNotFoundException, RepositoryException
++ {
++ return null;
++ }
++
++ public Repository getRepository()
++ {
++ return null;
++ }
++
++ public Node getRootNode() throws RepositoryException
++ {
++ return null;
++ }
++
++ public String getUserID()
++ {
++ return null;
++ }
++
++ public ValueFactory getValueFactory() throws UnsupportedRepositoryOperationException, RepositoryException
++ {
++ return null;
++ }
++
++ public Workspace getWorkspace()
++ {
++ return null;
++ }
++
++ public boolean hasPendingChanges() throws RepositoryException
++ {
++ return false;
++ }
++
++ public Session impersonate(Credentials credentials) throws LoginException, RepositoryException
++ {
++ return null;
++ }
++
++ public void importXML(String parentAbsPath, InputStream in, int uuidBehavior) throws IOException,
++ PathNotFoundException, ItemExistsException, ConstraintViolationException, VersionException,
++ InvalidSerializedDataException, LockException, RepositoryException
++ {
++ }
++
++ public boolean isLive()
++ {
++ return false;
++ }
++
++ public boolean itemExists(String absPath) throws RepositoryException
++ {
++ return false;
++ }
++
++ public void logout()
++ {
++ }
++
++ public void move(String srcAbsPath, String destAbsPath) throws ItemExistsException, PathNotFoundException,
++ VersionException, ConstraintViolationException, LockException, RepositoryException
++ {
++ }
++
++ public void refresh(boolean keepChanges) throws RepositoryException
++ {
++ }
++
++ public void removeLockToken(String lt)
++ {
++ }
++
++ public void save() throws AccessDeniedException, ItemExistsException, ConstraintViolationException,
++ InvalidItemStateException, VersionException, LockException, NoSuchNodeTypeException, RepositoryException
++ {
++ }
++
++ public void setNamespacePrefix(String prefix, String uri) throws NamespaceException, RepositoryException
++ {
++ }
++}
+Index: exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestItemDataChangesLog.java
+===================================================================
+--- exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestItemDataChangesLog.java (revision 4991)
++++ exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestItemDataChangesLog.java (working copy)
+@@ -70,7 +70,7 @@
+ public void testBasicOperations() throws Exception
+ {
+
+- SessionChangesLog cLog = new SessionChangesLog("s1");
++ SessionChangesLog cLog = new SessionChangesLog(new DummySession("s1"));
+ cLog.add(ItemState.createAddedState(data1));
+ cLog.add(ItemState.createAddedState(data2));
+ cLog.add(ItemState.createDeletedState(data2));
+@@ -92,7 +92,7 @@
+ public void testSessionOperations() throws Exception
+ {
+
+- SessionChangesLog cLog = new SessionChangesLog("s1");
++ SessionChangesLog cLog = new SessionChangesLog(new DummySession("s1"));
+
+ TransientNodeData d1 =
+ TransientNodeData.createNodeData(data1, new InternalQName(null, "testSessionOperations"), new InternalQName(
+Index: exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/observation/TestSessionsObservation.java
+===================================================================
+--- exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/observation/TestSessionsObservation.java (revision 4991)
++++ exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/api/observation/TestSessionsObservation.java (working copy)
+@@ -23,6 +23,7 @@
+
+ import javax.jcr.Node;
+ import javax.jcr.RepositoryException;
++import javax.jcr.Session;
+ import javax.jcr.observation.Event;
+
+ public class TestSessionsObservation extends JcrAPIBaseTest
+@@ -258,4 +259,26 @@
+ sessionWs1.getWorkspace().getObservationManager().removeEventListener(listener2);
+ }
+ }
++
++ public void testMoveOnClosedSession() throws Exception
++ {
++
++ testRootWs1.addNode("newNode");
++ sessionWs1.save();
++
++ int counter = 0;
++
++ SimpleListener listener = new SimpleListener("testSessionOpen", log, counter);
++
++ Session sessionWs1ForListener = repository.login(credentials, "ws1");
++
++ sessionWs1ForListener.getWorkspace().getObservationManager().addEventListener(listener,
++ Event.NODE_ADDED | Event.NODE_REMOVED, testRootWs1.getPath() + "/", false, null, null, false);
++
++ sessionWs1ForListener.logout();
++
++ sessionWs1.logout();
++ sessionWs1.getWorkspace().move(testRootWs1.getPath() + "/newNode", testRootWs1.getPath() + "/newNode2");
++ assertEquals(2, listener.getCounter());
++ }
+ }
+Index: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/PlainChangesLogImpl.java
+===================================================================
+--- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/PlainChangesLogImpl.java (revision 4991)
++++ exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/PlainChangesLogImpl.java (working copy)
+@@ -18,6 +18,7 @@
+ */
+ package org.exoplatform.services.jcr.dataflow;
+
++import org.exoplatform.services.jcr.core.ExtendedSession;
+ import org.exoplatform.services.jcr.impl.Constants;
+
+ import java.io.Externalizable;
+@@ -37,7 +38,7 @@
+ public class PlainChangesLogImpl implements Externalizable, PlainChangesLog
+ {
+ private static final int NULL_VALUE = -1;
+-
++
+ private static final int NOT_NULL_VALUE = 1;
+
+ private static final long serialVersionUID = 5624550860372364084L;
+@@ -48,25 +49,23 @@
+
+ protected int eventType;
+
++ protected ExtendedSession session;
++
+ /**
+ * Identifier of system and non-system logs pair. Null if no pair found.
+ */
+- protected String pairId = null;
++ protected String pairId;
+
+ /**
+- * Full qualified constructor.
++ * Constructor.
+ *
+ * @param items List of ItemState
+- * @param sessionId String
++ * @param session Session
+ * @param eventType int
+- * @param pairId String
+ */
+- public PlainChangesLogImpl(List<ItemState> items, String sessionId, int eventType, String pairId)
++ public PlainChangesLogImpl(List<ItemState> items, ExtendedSession session, int eventType)
+ {
+- this.items = items;
+- this.sessionId = sessionId;
+- this.eventType = eventType;
+- this.pairId = pairId;
++ this(items, session.getId(), eventType, null, session);
+ }
+
+ /**
+@@ -78,30 +77,38 @@
+ */
+ public PlainChangesLogImpl(List<ItemState> items, String sessionId, int eventType)
+ {
+- this.items = items;
+- this.sessionId = sessionId;
+- this.eventType = eventType;
++ this(items, sessionId, eventType, null, null);
+ }
+
+ /**
+ * Constructor with undefined event type.
+ *
+ * @param items List of ItemState
+- * @param sessionId String
++ * @param session Session
+ */
+- public PlainChangesLogImpl(List<ItemState> items, String sessionId)
++ public PlainChangesLogImpl(List<ItemState> items, ExtendedSession session)
+ {
+- this(items, sessionId, -1);
++ this(items, session, -1);
+ }
+
+ /**
+ * An empty log.
+ *
++ * @param session Session
++ */
++ public PlainChangesLogImpl(ExtendedSession session)
++ {
++ this(new ArrayList<ItemState>(), session);
++ }
++
++ /**
++ * An empty log.
++ *
+ * @param sessionId String
+ */
+ public PlainChangesLogImpl(String sessionId)
+ {
+- this(new ArrayList<ItemState>(), sessionId);
++ this(new ArrayList<ItemState>(), sessionId, -1);
+ }
+
+ /**
+@@ -109,7 +116,7 @@
+ */
+ public PlainChangesLogImpl()
+ {
+- this(new ArrayList<ItemState>(), null);
++ this(new ArrayList<ItemState>(), (String)null, -1);
+ }
+
+ /*
+@@ -152,6 +159,14 @@
+ return sessionId;
+ }
+
++ /**
++ * {@inheritDoc}
++ */
++ public ExtendedSession getSession()
++ {
++ return session;
++ }
++
+ /*
+ * (non-Javadoc)
+ *
+@@ -200,15 +215,66 @@
+ {
+ String str = "ChangesLog: \n";
+ for (int i = 0; i < items.size(); i++)
++ {
+ str +=
+ " " + ItemState.nameFromValue(items.get(i).getState()) + "\t" + items.get(i).getData().getIdentifier()
+ + "\t" + "isPersisted=" + items.get(i).isPersisted() + "\t" + "isEventFire="
+ + items.get(i).isEventFire() + "\t" + "isInternallyCreated=" + items.get(i).isInternallyCreated() + "\t"
+ + items.get(i).getData().getQPath().getAsString() + "\n";
++ }
+
+ return str;
+ }
+
++ /**
++ * Full qualified constructor.
++ *
++ * @param items List of ItemState
++ * @param sessionId String
++ * @param eventType int
++ * @param pairId String
++ */
++ protected PlainChangesLogImpl(List<ItemState> items, String sessionId, int eventType, String pairId,
++ ExtendedSession session)
++ {
++ this.items = items;
++ this.session = session;
++ this.sessionId = sessionId;
++ this.eventType = eventType;
++ this.pairId = pairId;
++ }
++
++ /**
++ * Creates a new instance of {@link PlainChangesLogImpl} by copying metadata from originalLog
++ * instance with Items provided.
++ *
++ * @param items
++ * @param originalLog
++ * @return
++ */
++ public static PlainChangesLogImpl createCopy(List<ItemState> items, PlainChangesLog originalLog)
++ {
++ return createCopy(items, originalLog.getPairId(), originalLog);
++ }
++
++ /**
++ * Creates a new instance of {@link PlainChangesLogImpl} by copying metadata from originalLog
++ * instance with Items and PairID provided. Metadata will be copied excluding PairID.
++ *
++ * @param items
++ * @param originalLog
++ * @return
++ */
++ public static PlainChangesLogImpl createCopy(List<ItemState> items, String pairId, PlainChangesLog originalLog)
++ {
++ if (originalLog.getSession() != null)
++ {
++ return new PlainChangesLogImpl(items, originalLog.getSession().getId(), originalLog.getEventType(), pairId,
++ originalLog.getSession());
++ }
++ return new PlainChangesLogImpl(items, originalLog.getSessionId(), originalLog.getEventType(), pairId, null);
++ }
++
+ // Need for Externalizable
+ // ------------------ [ BEGIN ] ------------------
+
+@@ -227,7 +293,7 @@
+ out.writeObject(items.get(i));
+ }
+
+- if (pairId != null)
++ if (pairId != null)
+ {
+ out.writeInt(NOT_NULL_VALUE);
+ buff = pairId.getBytes(Constants.DEFAULT_ENCODING);
+@@ -253,7 +319,7 @@
+ {
+ add((ItemState)in.readObject());
+ }
+-
++
+ if (in.readInt() == NOT_NULL_VALUE)
+ {
+ buf = new byte[in.readInt()];
+@@ -261,5 +327,7 @@
+ pairId = new String(buf, Constants.DEFAULT_ENCODING);
+ }
+ }
++
+ // ------------------ [ END ] ------------------
++
+ }
+Index: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/PlainChangesLog.java
+===================================================================
+--- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/PlainChangesLog.java (revision 4991)
++++ exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/PlainChangesLog.java (working copy)
+@@ -18,6 +18,7 @@
+ */
+ package org.exoplatform.services.jcr.dataflow;
+
++import org.exoplatform.services.jcr.core.ExtendedSession;
+ import org.exoplatform.services.jcr.observation.ExtendedEventType;
+
+ import java.util.List;
+@@ -38,7 +39,7 @@
+ * @return sessionId of a session produced this changes log
+ */
+ String getSessionId();
+-
++
+ /**
+ * Return pair Id of system and non-system logs.
+ *
+@@ -67,4 +68,10 @@
+ * @param states List of ItemState
+ */
+ PlainChangesLog addAll(List<ItemState> states);
++
++ /**
++ * Returns session instance is present
++ * @return session instance
++ */
++ ExtendedSession getSession();
+ }
+Index: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
+===================================================================
+--- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java (revision 4991)
++++ exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java (working copy)
+@@ -363,7 +363,7 @@
+
+ checkValid();
+
+- PlainChangesLog changesLog = new PlainChangesLogImpl(session.getId());
++ PlainChangesLog changesLog = new PlainChangesLogImpl(session);
+
+ removeMergeFailed(version, changesLog);
+
+@@ -439,7 +439,7 @@
+ // the new version identifier
+ String verIdentifier = IdGenerator.generate();
+
+- SessionChangesLog changesLog = new SessionChangesLog(session.getId());
++ SessionChangesLog changesLog = new SessionChangesLog(session);
+
+ VersionHistoryImpl vh = versionHistory(false);
+ vh.addVersion(this.nodeData(), verIdentifier, changesLog);
+@@ -486,7 +486,7 @@
+ if (checkedOut())
+ return;
+
+- SessionChangesLog changesLog = new SessionChangesLog(session.getId());
++ SessionChangesLog changesLog = new SessionChangesLog(session);
+
+ changesLog.add(ItemState.createUpdatedState(updatePropertyData(Constants.JCR_ISCHECKEDOUT,
+ new TransientValueData(true))));
+@@ -643,7 +643,7 @@
+ + session.getUserID() + " item owner " + getACL().getOwner());
+ }
+
+- PlainChangesLog changesLog = new PlainChangesLogImpl(session.getId());
++ PlainChangesLog changesLog = new PlainChangesLogImpl(session);
+
+ VersionImpl base = (VersionImpl)getBaseVersion();
+ base.addPredecessor(version.getUUID(), changesLog);
+@@ -1563,8 +1563,7 @@
+
+ Lock newLock = session.getLockManager().addLock(this, isDeep, isSessionScoped, -1);
+
+- PlainChangesLog changesLog =
+- new PlainChangesLogImpl(new ArrayList<ItemState>(), session.getId(), ExtendedEvent.LOCK);
++ PlainChangesLog changesLog = new PlainChangesLogImpl(new ArrayList<ItemState>(), session, ExtendedEvent.LOCK);
+
+ PropertyData propData =
+ TransientPropertyData.createPropertyData(nodeData(), Constants.JCR_LOCKOWNER, PropertyType.STRING, false,
+@@ -1608,8 +1607,7 @@
+
+ Lock newLock = session.getLockManager().addLock(this, isDeep, false, timeOut);
+
+- PlainChangesLog changesLog =
+- new PlainChangesLogImpl(new ArrayList<ItemState>(), session.getId(), ExtendedEvent.LOCK);
++ PlainChangesLog changesLog = new PlainChangesLogImpl(new ArrayList<ItemState>(), session, ExtendedEvent.LOCK);
+
+ PropertyData propData =
+ TransientPropertyData.createPropertyData(nodeData(), Constants.JCR_LOCKOWNER, PropertyType.STRING, false,
+@@ -2318,7 +2316,7 @@
+ if (!checkLocking())
+ throw new LockException("Node " + getPath() + " is locked ");
+
+- SessionChangesLog changes = new SessionChangesLog(session.getId());
++ SessionChangesLog changes = new SessionChangesLog(session);
+
+ String srcPath;
+ try
+@@ -2634,8 +2632,7 @@
+ protected void doUnlock() throws RepositoryException
+ {
+
+- PlainChangesLog changesLog =
+- new PlainChangesLogImpl(new ArrayList<ItemState>(), session.getId(), ExtendedEvent.UNLOCK);
++ PlainChangesLog changesLog = new PlainChangesLogImpl(new ArrayList<ItemState>(), session, ExtendedEvent.UNLOCK);
+
+ ItemData lockOwner =
+ dataManager.getItemData(nodeData(), new QPathEntry(Constants.JCR_LOCKOWNER, 0), ItemType.PROPERTY);
+Index: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
+===================================================================
+--- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java (revision 4991)
++++ exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java (working copy)
+@@ -104,7 +104,7 @@
+ public SessionDataManager(SessionImpl session, LocalWorkspaceDataManagerStub dataManager) throws RepositoryException
+ {
+ this.session = session;
+- this.changesLog = new SessionChangesLog(session.getId());
++ this.changesLog = new SessionChangesLog(session);
+ this.itemsPool = new ItemReferencePool();
+ this.itemFactory = new SessionItemFactory();
+ this.accessManager = session.getAccessManager();
+@@ -1703,7 +1703,7 @@
+
+ // remove from changes log (Session pending changes)
+ PlainChangesLog slog = changesLog.pushLog(item.getQPath());
+- SessionChangesLog changes = new SessionChangesLog(slog.getAllStates(), session.getId());
++ SessionChangesLog changes = new SessionChangesLog(slog.getAllStates(), session);
+
+ String exceptions = "";
+
+Index: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/FileSystemLockPersister.java
+===================================================================
+--- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/FileSystemLockPersister.java (revision 4991)
++++ exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/FileSystemLockPersister.java (working copy)
+@@ -152,7 +152,9 @@
+ return;
+ }
+ if (!lockFile.delete())
++ {
+ throw new LockException("Fail to remove lock information");
++ }
+
+ }
+
+@@ -197,9 +199,11 @@
+ (PropertyData)dataManager.getItemData(lockedNodeData, new QPathEntry(Constants.JCR_LOCKOWNER, 0),
+ ItemType.PROPERTY);
+ if (dataLockOwner != null)
++ {
+ plainChangesLog.add(ItemState.createDeletedState(new TransientPropertyData(QPath.makeChildPath(
+ lockedNodeData.getQPath(), Constants.JCR_LOCKOWNER), dataLockOwner.getIdentifier(), 0,
+ dataLockOwner.getType(), dataLockOwner.getParentIdentifier(), dataLockOwner.isMultiValued())));
++ }
+
+ if (plainChangesLog.getSize() > 0)
+ {
+@@ -222,7 +226,9 @@
+ log.warn("Persistent lock information for node id " + list[i] + " doesn't exists");
+ }
+ if (!lockFile.delete())
++ {
+ throw new LockException("Fail to remove lock information");
++ }
+ }
+ }
+ catch (RepositoryException e)
+@@ -288,8 +294,10 @@
+ String root = config.getParameterValue(PARAM_ROOT_DIR);
+
+ if (root == null)
++ {
+ throw new RepositoryConfigurationException("Repository service configuration." + " Source name ("
+ + PARAM_ROOT_DIR + ") is expected");
++ }
+ rootDir = new File(root);
+ if (rootDir.exists())
+ {
+@@ -301,7 +309,9 @@
+ else
+ {
+ if (!rootDir.mkdirs())
++ {
+ throw new RepositoryException("Can't create dir" + root);
++ }
+ }
+ }
+ }
+Index: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/BackupWorkspaceInitializer.java
+===================================================================
+--- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/BackupWorkspaceInitializer.java (revision 4991)
++++ exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/BackupWorkspaceInitializer.java (working copy)
+@@ -270,7 +270,7 @@
+ normalized.add(change);
+ }
+
+- PlainChangesLog plog = new PlainChangesLogImpl(normalized, next.getSessionId(), next.getEventType());
++ PlainChangesLog plog = PlainChangesLogImpl.createCopy(normalized,next);
+ result.addLog(plog);
+ }
+
+Index: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/ItemDataMergeVisitor.java
+===================================================================
+--- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/ItemDataMergeVisitor.java (revision 4991)
++++ exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/ItemDataMergeVisitor.java (working copy)
+@@ -174,7 +174,7 @@
+ this.bestEffort = bestEffort;
+ this.failed = failed;
+
+- this.changes = new SessionChangesLog(mergeSession.getId());
++ this.changes = new SessionChangesLog(mergeSession);
+ }
+
+ @Override
+@@ -530,6 +530,7 @@
+ ItemType.PROPERTY);
+
+ if (predecessorsProperty != null)
++ {
+ for (ValueData pv : predecessorsProperty.getValues())
+ {
+ try
+@@ -537,7 +538,9 @@
+ String pidentifier = new String(pv.getAsByteArray());
+
+ if (pidentifier.equals(corrVersion.getIdentifier()))
++ {
+ return true; // got it
++ }
+
+ // search in predecessors of the predecessor
+ NodeData predecessor = (NodeData)mergeDataManager.getItemData(pidentifier);
+@@ -560,6 +563,7 @@
+ }
+ }
+ // else it's a root version
++ }
+
+ return false;
+ }
+@@ -576,6 +580,7 @@
+ ItemType.PROPERTY);
+
+ if (successorsProperty != null)
++ {
+ for (ValueData sv : successorsProperty.getValues())
+ {
+ try
+@@ -583,7 +588,9 @@
+ String sidentifier = new String(sv.getAsByteArray());
+
+ if (sidentifier.equals(corrVersion.getIdentifier()))
++ {
+ return true; // got it
++ }
+
+ // search in successors of the successor
+ NodeData successor = (NodeData)mergeDataManager.getItemData(sidentifier);
+@@ -606,6 +613,7 @@
+ }
+ }
+ // else it's a end of version graph node
++ }
+
+ return false;
+ }
+Index: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/VersionHistoryImpl.java
+===================================================================
+--- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/VersionHistoryImpl.java (revision 4991)
++++ exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/VersionHistoryImpl.java (working copy)
+@@ -328,7 +328,7 @@
+ throw new ReferentialIntegrityException("There are Reference property pointed to this Version "
+ + refs.get(0).getQPath().getAsString());
+
+- PlainChangesLog changes = new PlainChangesLogImpl(session.getId());
++ PlainChangesLog changes = new PlainChangesLogImpl(session);
+
+ // remove labels first
+ try
+@@ -506,7 +506,7 @@
+
+ NodeData versionData = getVersionData(versionName);
+
+- SessionChangesLog changesLog = new SessionChangesLog(session.getId());
++ SessionChangesLog changesLog = new SessionChangesLog(session);
+
+ PropertyData labelData =
+ TransientPropertyData.createPropertyData(labels, labelQName, PropertyType.REFERENCE, false,
+@@ -532,7 +532,7 @@
+
+ if (vldata != null)
+ {
+- PlainChangesLog changes = new PlainChangesLogImpl(session.getId());
++ PlainChangesLog changes = new PlainChangesLogImpl(session);
+ changes.add(ItemState.createDeletedState(vldata));
+ dataManager.getTransactManager().save(changes);
+ }
+Index: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/ItemDataRestoreVisitor.java
+===================================================================
+--- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/ItemDataRestoreVisitor.java (revision 4991)
++++ exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/ItemDataRestoreVisitor.java (working copy)
+@@ -150,7 +150,7 @@
+ super(userSession.getTransientNodesManager().getTransactManager());
+
+ this.userSession = userSession;
+- this.changes = new SessionChangesLog(userSession.getId());
++ this.changes = new SessionChangesLog(userSession);
+ this.context = context;
+ this.destName = destName;
+ this.history = history;
+@@ -177,7 +177,9 @@
+ for (ItemState state : delegatedChanges.getAllStates())
+ {
+ if (state.getData().getIdentifier().equals(identifier))
++ {
+ return state.getData();
++ }
+ }
+ }
+
+@@ -191,7 +193,9 @@
+ for (ItemState state : delegatedChanges.getAllStates())
+ {
+ if (state.getData().getQPath().equals(path))
++ {
+ return state.getData();
++ }
+ }
+ }
+
+@@ -206,7 +210,9 @@
+ for (ItemState state : delegatedChanges.getAllStates())
+ {
+ if (state.getData().getQPath().equals(path) || state.getData().getQPath().isDescendantOf(path))
++ {
+ removed.add(state);
++ }
+ }
+
+ for (ItemState state : removed)
+@@ -223,7 +229,9 @@
+ QPath nodePath = QPath.makeChildPath(parentData.getQPath(), name);
+
+ if (log.isDebugEnabled())
++ {
+ log.debug("Restore: " + nodePath.getAsString() + ", removeExisting=" + removeExisting);
++ }
+
+ PropertyData frozenIdentifier =
+ (PropertyData)dataManager.getItemData(frozen, new QPathEntry(Constants.JCR_FROZENUUID, 1), ItemType.PROPERTY);
+@@ -254,8 +262,10 @@
+ // name
+
+ if (sameIdentifierPath.getIndex() != nodePath.getIndex())
++ {
+ // but different index, see below... fix it
+ nodePath = QPath.makeChildPath(parentData.getQPath(), name, sameIdentifierPath.getIndex());
++ }
+
+ // if it's a target node
+ existing = sameIdentifierNode;
+@@ -466,7 +476,9 @@
+
+ NodeData cHistory = null;
+ if ((cHistory = (NodeData)dataManager.getItemData(vhIdentifier)) == null)
++ {
+ throw new RepositoryException("Version history is not found with uuid " + vhIdentifier);
++ }
+
+ childHistory = new VersionHistoryDataHelper(cHistory, dataManager, nodeTypeDataManager);
+ }
+@@ -687,6 +699,7 @@
+ InternalQName qname = property.getQPath().getName();
+
+ if (nodeTypeDataManager.isNodeType(Constants.NT_FROZENNODE, frozenParent.getPrimaryTypeName()))
++ {
+ if (qname.equals(Constants.JCR_FROZENPRIMARYTYPE))
+ {
+ qname = Constants.JCR_PRIMARYTYPE;
+@@ -705,6 +718,7 @@
+ // skip these props, as they are a nt:frozenNode special props
+ return;
+ }
++ }
+
+ int action =
+ nodeTypeDataManager.getPropertyDefinitions(qname, currentNode().getPrimaryTypeName(),
+Index: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/observation/ActionLauncher.java
+===================================================================
+--- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/observation/ActionLauncher.java (revision 4991)
++++ exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/observation/ActionLauncher.java (working copy)
+@@ -18,6 +18,8 @@
+ */
+ package org.exoplatform.services.jcr.impl.core.observation;
+
++import org.exoplatform.services.jcr.core.ExtendedSession;
++import org.exoplatform.services.jcr.core.ExtendedWorkspace;
+ import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
+ import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
+ import org.exoplatform.services.jcr.dataflow.ChangesLogIterator;
+@@ -31,7 +33,6 @@
+ import org.exoplatform.services.jcr.datamodel.NodeData;
+ import org.exoplatform.services.jcr.datamodel.QPath;
+ import org.exoplatform.services.jcr.impl.core.LocationFactory;
+-import org.exoplatform.services.jcr.impl.core.SessionImpl;
+ import org.exoplatform.services.jcr.impl.core.SessionRegistry;
+ import org.exoplatform.services.jcr.impl.dataflow.persistent.WorkspacePersistentDataManager;
+ import org.exoplatform.services.jcr.impl.util.EntityCollection;
+@@ -92,9 +93,19 @@
+ PlainChangesLog subLog = logIterator.nextLog();
+ String sessionId = subLog.getSessionId();
+
+- SessionImpl userSession = sessionRegistry.getSession(sessionId);
++ ExtendedSession userSession;
+
++ if (subLog.getSession() != null)
++ {
++ userSession = subLog.getSession();
++ }
++ else
++ {
++ userSession = sessionRegistry.getSession(sessionId);
++ }
++
+ if (userSession != null)
++ {
+ for (ItemState itemState : subLog.getAllStates())
+ {
+ if (itemState.isEventFire())
+@@ -123,6 +134,7 @@
+ }
+ }
+ }
++ }
+ }
+ if (events.getSize() > 0)
+ {
+@@ -141,15 +153,15 @@
+
+ private boolean isSessionMatch(ListenerCriteria criteria, String sessionId)
+ {
+- if (criteria.getNoLocal() && criteria.getSessionId().equals(sessionId))
+- return false;
+- return true;
++ return !(criteria.getNoLocal() && criteria.getSessionId().equals(sessionId));
+ }
+
+- private boolean isPathMatch(ListenerCriteria criteria, ItemData item, SessionImpl userSession)
++ private boolean isPathMatch(ListenerCriteria criteria, ItemData item, ExtendedSession userSession)
+ {
+ if (criteria.getAbsPath() == null)
++ {
+ return true;
++ }
+ try
+ {
+ QPath cLoc = userSession.getLocationFactory().parseAbsPath(criteria.getAbsPath()).getInternalPath();
+@@ -171,25 +183,33 @@
+ {
+
+ if (criteria.getIdentifier() == null)
++ {
+ return true;
++ }
+
+ // assotiated parent is node itself for node and parent for property ????
+ for (int i = 0; i < criteria.getIdentifier().length; i++)
+ {
+ if (item.isNode() && criteria.getIdentifier()[i].equals(item.getIdentifier()))
++ {
+ return true;
++ }
+ else if (!item.isNode() && criteria.getIdentifier()[i].equals(item.getParentIdentifier()))
++ {
+ return true;
++ }
+ }
+ return false;
+
+ }
+
+- private boolean isNodeTypeMatch(ListenerCriteria criteria, ItemData item, SessionImpl userSession,
++ private boolean isNodeTypeMatch(ListenerCriteria criteria, ItemData item, ExtendedSession userSession,
+ PlainChangesLog changesLog) throws RepositoryException
+ {
+ if (criteria.getNodeTypeName() == null)
++ {
+ return true;
++ }
+
+ NodeData node = (NodeData)workspaceDataManager.getItemData(item.getParentIdentifier());
+ if (node == null)
+@@ -214,7 +234,7 @@
+ }
+ }
+
+- NodeTypeDataManager ntManager = userSession.getWorkspace().getNodeTypesHolder();
++ NodeTypeDataManager ntManager = ((ExtendedWorkspace)userSession.getWorkspace()).getNodeTypesHolder();
+ LocationFactory locationFactory = userSession.getLocationFactory();
+ for (int i = 0; i < criteria.getNodeTypeName().length; i++)
+ {
+@@ -231,7 +251,9 @@
+ testQNames[0] = node.getPrimaryTypeName();
+ }
+ if (ntManager.isNodeType(criteriaNT.getName(), testQNames))
++ {
+ return true;
++ }
+ }
+ return false;
+ }
+@@ -242,24 +264,40 @@
+ if (state.getData().isNode())
+ {
+ if (state.isAdded() || state.isRenamed() || state.isUpdated())
++ {
+ return Event.NODE_ADDED;
++ }
+ else if (state.isDeleted())
++ {
+ return Event.NODE_REMOVED;
++ }
+ else if (state.isUpdated())
++ {
+ return SKIP_EVENT;
++ }
+ else if (state.isUnchanged())
++ {
+ return SKIP_EVENT;
++ }
+ }
+ else
+ { // property
+ if (state.isAdded())
++ {
+ return Event.PROPERTY_ADDED;
++ }
+ else if (state.isDeleted())
++ {
+ return Event.PROPERTY_REMOVED;
++ }
+ else if (state.isUpdated())
++ {
+ return Event.PROPERTY_CHANGED;
++ }
+ else if (state.isUnchanged())
++ {
+ return SKIP_EVENT;
++ }
+ }
+ throw new RepositoryException("Unexpected ItemState for Node " + ItemState.nameFromValue(state.getState()) + " "
+ + state.getData().getQPath().getAsString());
+Index: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/WorkspaceImpl.java
+===================================================================
+--- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/WorkspaceImpl.java (revision 4991)
++++ exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/WorkspaceImpl.java (working copy)
+@@ -110,9 +110,13 @@
+
+ QueryManagerFactory qf = (QueryManagerFactory)container.getComponentInstanceOfType(QueryManagerFactory.class);
+ if (qf == null)
++ {
+ this.queryManager = null;
++ }
+ else
++ {
+ this.queryManager = qf.getQueryManager(session);
++ }
+ }
+
+ /**
+@@ -123,7 +127,7 @@
+ PathNotFoundException, ItemExistsException, RepositoryException
+ {
+
+- SessionChangesLog changes = new SessionChangesLog(session.getId());
++ SessionChangesLog changes = new SessionChangesLog(session);
+
+ clone(srcWorkspace, srcAbsPath, destAbsPath, removeExisting, changes);
+
+@@ -162,8 +166,10 @@
+ // get destination node
+ JCRPath destNodePath = session.getLocationFactory().parseAbsPath(destAbsPath);
+ if (destNodePath.isIndexSetExplicitly())
++ {
+ throw new RepositoryException("The path provided must not have an index on its final element. "
+ + destNodePath.getAsString(false));
++ }
+ // get source node
+ JCRPath srcNodePath = srcSession.getLocationFactory().parseAbsPath(srcAbsPath);
+
+@@ -208,7 +214,7 @@
+
+ srcNode.getData().accept(initializer);
+
+- PlainChangesLogImpl changesLog = new PlainChangesLogImpl(initializer.getItemAddStates(), session.getId());
++ PlainChangesLogImpl changesLog = new PlainChangesLogImpl(initializer.getItemAddStates(), session);
+
+ session.getTransientNodesManager().getTransactManager().save(changesLog);
+ }
+@@ -296,7 +302,9 @@
+ public QueryManager getQueryManager() throws RepositoryException
+ {
+ if (queryManager == null)
++ {
+ throw new RepositoryException("Query Manager Factory not found. Check configuration.");
++ }
+ return queryManager;
+ }
+
+@@ -382,8 +390,10 @@
+ // get destination node
+ JCRPath destNodePath = session.getLocationFactory().parseAbsPath(destAbsPath);
+ if (destNodePath.isIndexSetExplicitly())
++ {
+ throw new RepositoryException("The path provided must not have an index on its final element. "
+ + destNodePath.getAsString(false));
++ }
+ // get source node
+ JCRPath srcNodePath = session.getLocationFactory().parseAbsPath(srcAbsPath);
+
+@@ -427,19 +437,22 @@
+
+ // Check if versionable ancestor is not checked-in
+ if (!srcNode.checkedOut())
++ {
+ throw new VersionException("Source parent node " + srcNode.getPath()
+ + " or its nearest ancestor is checked-in");
++ }
+ // Check locking
+ if (!srcNode.checkLocking())
++ {
+ throw new LockException("Source parent node " + srcNode.getPath() + " is locked ");
++ }
+
+ ItemDataMoveVisitor initializer =
+ new ItemDataMoveVisitor((NodeData)destParentNode.getData(), destNodePath.getName().getInternalName(),
+ nodeTypeManager, session.getTransientNodesManager(), true);
+ srcNode.getData().accept(initializer);
+
+- PlainChangesLog changes = new PlainChangesLogImpl(session.getId());
+- changes.addAll(initializer.getAllStates());
++ PlainChangesLog changes = new PlainChangesLogImpl(initializer.getAllStates(), session);
+
+ session.getTransientNodesManager().getTransactManager().save(changes);
+ }
+@@ -460,13 +473,17 @@
+ {
+
+ if (srcWorkspace.equals(getName()))
++ {
+ throw new RepositoryException("Source and destination workspace are equals " + name);
++ }
+
+ // make dest node path
+ JCRPath destNodePath = session.getLocationFactory().parseAbsPath(destAbsPath);
+
+ if (destNodePath.isIndexSetExplicitly())
++ {
+ throw new RepositoryException("DestPath should not contain an index " + destAbsPath);
++ }
+
+ // find src node
+ SessionImpl srcSession = repository().internalLogin(session.getUserState(), srcWorkspace);
+@@ -540,7 +557,9 @@
+ {
+
+ if (session.hasPendingChanges())
++ {
+ throw new InvalidItemStateException("Session has pending changes ");
++ }
+
+ // for restore operation
+ List<String> existedIdentifiers = new ArrayList<String>(); // InWorkspace
+@@ -575,9 +594,13 @@
+ ((SessionImpl)v.getSession()).getTransientNodesManager().getTransactManager();
+ corrNode = (NodeData)vDataManager.getItemData(versionableIdentifier);
+ if (corrNode != null)
++ {
+ versionableParentIdentifier = corrNode.getParentIdentifier();
++ }
+ else
++ {
+ log.warn("Workspace.restore(). Correspondent node is not found " + versionableIdentifier);
++ }
+ }
+ if (versionableParentIdentifier != null && existedIdentifiers.contains(versionableParentIdentifier))
+ {
+@@ -592,7 +615,7 @@
+ }
+ }
+
+- SessionChangesLog changesLog = new SessionChangesLog(session.getId());
++ SessionChangesLog changesLog = new SessionChangesLog(session);
+
+ for (VersionImpl v : existedVersions.keySet())
+ {
+@@ -605,7 +628,7 @@
+ // parent
+ // it's a VH
+ VersionHistoryDataHelper historyHelper =
+- new VersionHistoryDataHelper((NodeData)vh, dataManager, nodeTypeManager);
++ new VersionHistoryDataHelper(vh, dataManager, nodeTypeManager);
+
+ changesLog.addAll(v.restoreLog(destParent, node.getQPath().getName(), historyHelper, session,
+ removeExisting, changesLog).getAllStates());
+@@ -643,7 +666,7 @@
+ // version parent it's a VH
+ NodeData vh = (NodeData)dataManager.getItemData(v.getParentIdentifier());
+ VersionHistoryDataHelper historyHelper =
+- new VersionHistoryDataHelper((NodeData)vh, dataManager, nodeTypeManager);
++ new VersionHistoryDataHelper(vh, dataManager, nodeTypeManager);
+
+ changesLog.addAll(v.restoreLog(destParent, node.getQPath().getName(), historyHelper, session,
+ removeExisting, changesLog).getAllStates());
+@@ -675,6 +698,9 @@
+ return (RepositoryImpl)session.getRepository();
+ }
+
++ /**
++ * {@inheritDoc}
++ */
+ public NodeTypeDataManager getNodeTypesHolder() throws RepositoryException
+ {
+ return nodeTypeManager;
+Index: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/LocalWorkspaceStorageDataManagerProxy.java
+===================================================================
+--- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/LocalWorkspaceStorageDataManagerProxy.java (revision 4991)
++++ exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/LocalWorkspaceStorageDataManagerProxy.java (working copy)
+@@ -94,7 +94,7 @@
+ .getAncestorToSave(), change.isInternallyCreated(), change.isPersisted()));
+ }
+
+- newLog.addLog(new PlainChangesLogImpl(states, changes.getSessionId(), changes.getEventType()));
++ newLog.addLog(PlainChangesLogImpl.createCopy(states, changes));
+ }
+
+ storageDataManager.save(newLog);
+@@ -139,7 +139,7 @@
+ {
+ return storageDataManager.getLastOrderNumber(parent);
+ }
+-
++
+ /**
+ * {@inheritDoc}
+ */
+Index: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/SessionChangesLog.java
+===================================================================
+--- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/SessionChangesLog.java (revision 4991)
++++ exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/SessionChangesLog.java (working copy)
+@@ -18,6 +18,7 @@
+ */
+ package org.exoplatform.services.jcr.impl.dataflow.session;
+
++import org.exoplatform.services.jcr.core.ExtendedSession;
+ import org.exoplatform.services.jcr.dataflow.ItemState;
+ import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
+ import org.exoplatform.services.jcr.dataflow.PlainChangesLogImpl;
+@@ -84,9 +85,9 @@
+ *
+ * @param sessionId
+ */
+- public SessionChangesLog(String sessionId)
++ public SessionChangesLog(ExtendedSession session)
+ {
+- super(sessionId);
++ super(session);
+ }
+
+ /**
+@@ -95,14 +96,14 @@
+ * @param items
+ * @param sessionId
+ */
+- public SessionChangesLog(List<ItemState> items, String sessionId)
++ public SessionChangesLog(List<ItemState> items, ExtendedSession session)
+ {
+- super(items, sessionId);
++ super(items, session);
+ for (int i = 0, length = items.size(); i < length; i++)
+ {
+ ItemState change = items.get(i);
+ addItem(change);
+- }
++ }
+ }
+
+ /**
+@@ -192,13 +193,17 @@
+ {
+ Map<String, ItemState> children = lastChildNodeStates.get(item.getData().getParentIdentifier());
+ if (children != null)
++ {
+ children.remove(item.getData().getIdentifier());
++ }
+ }
+ else
+ {
+ Map<String, ItemState> children = lastChildPropertyStates.get(item.getData().getParentIdentifier());
+ if (children != null)
++ {
+ children.remove(item.getData().getIdentifier());
++ }
+ }
+ }
+ }
+@@ -324,7 +329,8 @@
+ */
+ public PlainChangesLog pushLog(QPath rootPath)
+ {
+- PlainChangesLog cLog = new PlainChangesLogImpl(sessionId);
++ // session instance is always present in SessionChangesLog
++ PlainChangesLog cLog = new PlainChangesLogImpl(session);
+
+ if (rootPath.equals(Constants.ROOT_PATH))
+ {
+@@ -422,7 +428,9 @@
+ {
+ ItemData item = items.get(i).getData();
+ if (item.getParentIdentifier().equals(rootIdentifier) || item.getIdentifier().equals(rootIdentifier))
++ {
+ list.add(items.get(i));
++ }
+ }
+ return list;
+ }
+@@ -478,11 +486,15 @@
+ {
+ // the node
+ if (items.get(i).isAdded())
++ {
+ // if a new item - no modify changes can be
+ return new ArrayList<ItemState>();
++ }
+
+ if (!items.get(i).isDeleted())
++ {
+ changes.put(item.getIdentifier(), items.get(i));
++ }
+ }
+ else if (item.getParentIdentifier().equals(rootData.getIdentifier()))
+ {
+@@ -538,7 +550,9 @@
+ rename = state;
+ delete = allStates.get(i - 1); // try the fresh delete state
+ if (delete.getData().getIdentifier().equals(rename.getData().getIdentifier()))
++ {
+ return new ItemState[]{delete, rename}; // 3. ok, got it
++ }
+ }
+ }
+
+@@ -594,7 +608,9 @@
+ }
+ }
+ else
++ {
+ byState = true;
++ }
+ if (byState
+ && (isPersisted != null ? istate.isPersisted() == isPersisted : true)
+ && ((orAncestor != null && orAncestor ? rootPath.isDescendantOf(istate.getData().getQPath()) : true) || rootPath
+@@ -641,7 +657,9 @@
+ }
+ }
+ else
++ {
+ byState = true;
++ }
+ if (byState && (isPersisted != null ? istate.isPersisted() == isPersisted : true)
+ && istate.getData().getIdentifier().equals(id))
+ {
+@@ -757,22 +775,34 @@
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
++ {
+ return true;
++ }
+ if (obj == null)
++ {
+ return false;
++ }
+ if (getClass() != obj.getClass())
++ {
+ return false;
++ }
+ IDStateBasedKey other = (IDStateBasedKey)obj;
+
+ if (identifier == null)
+ {
+ if (other.identifier != null)
++ {
+ return false;
++ }
+ }
+ else if (!identifier.equals(other.identifier))
++ {
+ return false;
++ }
+ if (state != other.state)
++ {
+ return false;
++ }
+ return true;
+ }
+ }
+@@ -846,37 +876,55 @@
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
++ {
+ return true;
++ }
+ if (obj == null)
++ {
+ return false;
++ }
+ if (getClass() != obj.getClass())
++ {
+ return false;
++ }
+ ParentIDQPathBasedKey other = (ParentIDQPathBasedKey)obj;
+
+ if (name == null)
+ {
+ if (other.name != null)
++ {
+ return false;
++ }
+ }
+ else if (!name.getName().equals(other.name.getName())
+ || !name.getNamespace().equals(other.name.getNamespace()) || name.getIndex() != other.name.getIndex())
++ {
+ return false;
++ }
+
+ if (parentIdentifier == null)
+ {
+ if (other.parentIdentifier != null)
++ {
+ return false;
++ }
+ }
+ else if (!parentIdentifier.equals(other.parentIdentifier))
++ {
+ return false;
++ }
+
+ if (itemType == null)
+ {
+ if (other.itemType != null)
++ {
+ return false;
++ }
+ }
+ else if (!itemType.equals(other.itemType))
++ {
+ return false;
++ }
+
+ return true;
+ }
+Index: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java
+===================================================================
+--- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java (revision 4991)
++++ exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java (working copy)
+@@ -270,9 +270,7 @@
+ RepositoryException, IOException
+ {
+ // copy state
+- PlainChangesLogImpl newLog =
+- new PlainChangesLogImpl(new ArrayList<ItemState>(), changesLog.getSessionId(), changesLog.getEventType(),
+- changesLog.getPairId());
++ PlainChangesLogImpl newLog = PlainChangesLogImpl.createCopy(new ArrayList<ItemState>(), changesLog);
+
+ for (Iterator<ItemState> iter = changesLog.getAllStates().iterator(); iter.hasNext();)
+ {
+Index: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/VersionableWorkspaceDataManager.java
+===================================================================
+--- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/VersionableWorkspaceDataManager.java (revision 4991)
++++ exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/VersionableWorkspaceDataManager.java (working copy)
+@@ -219,19 +219,18 @@
+ // we have pair of logs for system and non-system (this) workspaces
+ final String pairId = IdGenerator.generate();
+
+- versionLogs.addLog(new PlainChangesLogImpl(vstates, changes.getSessionId(), changes.getEventType(),
+- pairId));
+- nonVersionLogs.addLog(new PlainChangesLogImpl(nvstates, changes.getSessionId(), changes.getEventType(),
+- pairId));
++ versionLogs.addLog(PlainChangesLogImpl.createCopy(vstates, pairId, changes));
++ nonVersionLogs.addLog(PlainChangesLogImpl.createCopy(nvstates, pairId, changes));
+ }
+ else
+ {
+- versionLogs.addLog(new PlainChangesLogImpl(vstates, changes.getSessionId(), changes.getEventType()));
++ versionLogs.addLog(PlainChangesLogImpl.createCopy(vstates, changes));
++ nonVersionLogs.addLog(PlainChangesLogImpl.createCopy(nvstates, changes));
+ }
+ }
+ else if (nvstates.size() > 0)
+ {
+- nonVersionLogs.addLog(new PlainChangesLogImpl(nvstates, changes.getSessionId(), changes.getEventType()));
++ nonVersionLogs.addLog(PlainChangesLogImpl.createCopy(nvstates, changes));
+ }
+ }
+
+Index: exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/core/ExtendedWorkspace.java
+===================================================================
+--- exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/core/ExtendedWorkspace.java (revision 4991)
++++ exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/core/ExtendedWorkspace.java (working copy)
+@@ -18,6 +18,8 @@
+ */
+ package org.exoplatform.services.jcr.core;
+
++import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
++
+ import java.io.IOException;
+ import java.io.InputStream;
+ import java.util.Map;
+@@ -58,4 +60,12 @@
+ throws IOException, PathNotFoundException, ItemExistsException, ConstraintViolationException,
+ InvalidSerializedDataException, RepositoryException;
+
++ /**
++ * Returns {@link NodeTypeDataManager} instance
++ *
++ * @return NodeTypeDataManager
++ * @throws RepositoryException
++ */
++ NodeTypeDataManager getNodeTypesHolder() throws RepositoryException;
++
+ }
12 years, 8 months
exo-jcr SVN: r4997 - in jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr: dataflow and 5 other directories.
by do-not-reply@jboss.org
Author: nzamosenchuk
Date: 2011-09-28 07:55:37 -0400 (Wed, 28 Sep 2011)
New Revision: 4997
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/core/ExtendedWorkspace.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/PlainChangesLog.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/PlainChangesLogImpl.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/JCRRestore.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/WorkspaceImpl.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/observation/ActionLauncher.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/VersionableWorkspaceDataManager.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/LocalWorkspaceStorageDataManagerProxy.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/SessionChangesLog.java
Log:
EXOJCR-1562 : applying remarks: factory method and interface usage.
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/core/ExtendedWorkspace.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/core/ExtendedWorkspace.java 2011-09-28 11:50:25 UTC (rev 4996)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/core/ExtendedWorkspace.java 2011-09-28 11:55:37 UTC (rev 4997)
@@ -18,6 +18,8 @@
*/
package org.exoplatform.services.jcr.core;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
+
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
@@ -58,4 +60,12 @@
throws IOException, PathNotFoundException, ItemExistsException, ConstraintViolationException,
InvalidSerializedDataException, RepositoryException;
+ /**
+ * Returns {@link NodeTypeDataManager} instance
+ *
+ * @return NodeTypeDataManager
+ * @throws RepositoryException
+ */
+ NodeTypeDataManager getNodeTypesHolder() throws RepositoryException;
+
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/PlainChangesLog.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/PlainChangesLog.java 2011-09-28 11:50:25 UTC (rev 4996)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/PlainChangesLog.java 2011-09-28 11:55:37 UTC (rev 4997)
@@ -18,12 +18,11 @@
*/
package org.exoplatform.services.jcr.dataflow;
+import org.exoplatform.services.jcr.core.ExtendedSession;
import org.exoplatform.services.jcr.observation.ExtendedEventType;
import java.util.List;
-import javax.jcr.Session;
-
/**
* Created by The eXo Platform SAS.<br/> Plain changes log implementation (i.e. no nested logs
* inside)
@@ -74,5 +73,5 @@
* Returns session instance is present
* @return session instance
*/
- Session getSession();
+ ExtendedSession getSession();
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/PlainChangesLogImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/PlainChangesLogImpl.java 2011-09-28 11:50:25 UTC (rev 4996)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/dataflow/PlainChangesLogImpl.java 2011-09-28 11:55:37 UTC (rev 4997)
@@ -28,8 +28,6 @@
import java.util.ArrayList;
import java.util.List;
-import javax.jcr.Session;
-
/**
* Created by The eXo Platform SAS.
*
@@ -59,48 +57,15 @@
protected String pairId;
/**
- * Full qualified constructor.
- *
- * @param items List of ItemState
- * @param session Session
- * @param eventType int
- * @param pairId String
- */
- public PlainChangesLogImpl(List<ItemState> items, Session session, int eventType, String pairId)
- {
- this.items = items;
- this.session = (ExtendedSession)session;
- this.sessionId = this.session.getId();
- this.eventType = eventType;
- this.pairId = pairId;
- }
-
- /**
- * Full qualified constructor. Used for compatibility with asynchronous replication.
- *
- * @param items List of ItemState
- * @param sessionId String
- * @param eventType int
- * @param pairId String
- */
- public PlainChangesLogImpl(List<ItemState> items, String sessionId, int eventType, String pairId)
- {
- this.items = items;
- this.sessionId = sessionId;
- this.eventType = eventType;
- this.pairId = pairId;
- }
-
- /**
* Constructor.
*
* @param items List of ItemState
* @param session Session
* @param eventType int
*/
- public PlainChangesLogImpl(List<ItemState> items, Session session, int eventType)
+ public PlainChangesLogImpl(List<ItemState> items, ExtendedSession session, int eventType)
{
- this(items, session, eventType, null);
+ this(items, session.getId(), eventType, null, session);
}
/**
@@ -112,18 +77,16 @@
*/
public PlainChangesLogImpl(List<ItemState> items, String sessionId, int eventType)
{
- this(items, sessionId, eventType, null);
+ this(items, sessionId, eventType, null, null);
}
- //
-
/**
* Constructor with undefined event type.
*
* @param items List of ItemState
* @param session Session
*/
- public PlainChangesLogImpl(List<ItemState> items, Session session)
+ public PlainChangesLogImpl(List<ItemState> items, ExtendedSession session)
{
this(items, session, -1);
}
@@ -133,7 +96,7 @@
*
* @param session Session
*/
- public PlainChangesLogImpl(Session session)
+ public PlainChangesLogImpl(ExtendedSession session)
{
this(new ArrayList<ItemState>(), session);
}
@@ -199,7 +162,7 @@
/**
* {@inheritDoc}
*/
- public Session getSession()
+ public ExtendedSession getSession()
{
return session;
}
@@ -263,6 +226,55 @@
return str;
}
+ /**
+ * Full qualified constructor.
+ *
+ * @param items List of ItemState
+ * @param sessionId String
+ * @param eventType int
+ * @param pairId String
+ */
+ protected PlainChangesLogImpl(List<ItemState> items, String sessionId, int eventType, String pairId,
+ ExtendedSession session)
+ {
+ this.items = items;
+ this.session = session;
+ this.sessionId = sessionId;
+ this.eventType = eventType;
+ this.pairId = pairId;
+ }
+
+ /**
+ * Creates a new instance of {@link PlainChangesLogImpl} by copying metadata from originalLog
+ * instance with Items provided.
+ *
+ * @param items
+ * @param originalLog
+ * @return
+ */
+ public static PlainChangesLogImpl createCopy(List<ItemState> items, PlainChangesLog originalLog)
+ {
+ return createCopy(items, originalLog.getPairId(), originalLog);
+ }
+
+ /**
+ * Creates a new instance of {@link PlainChangesLogImpl} by copying metadata from originalLog
+ * instance with Items and PairID provided. Metadata will be copied excluding PairID.
+ *
+ * @param items
+ * @param originalLog
+ * @return
+ */
+ public static PlainChangesLogImpl createCopy(List<ItemState> items, String pairId, PlainChangesLog originalLog)
+ {
+ if (originalLog.getSession() != null)
+ {
+ return new PlainChangesLogImpl(items, originalLog.getSession().getId(), originalLog.getEventType(), pairId,
+ originalLog.getSession());
+ }
+ return new PlainChangesLogImpl(items, originalLog.getSessionId(), originalLog.getEventType(), pairId, null);
+ }
+
// Need for Externalizable
// ------------------ [ BEGIN ] ------------------
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/JCRRestore.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/JCRRestore.java 2011-09-28 11:50:25 UTC (rev 4996)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/backup/JCRRestore.java 2011-09-28 11:55:37 UTC (rev 4997)
@@ -266,15 +266,7 @@
}
}
- PlainChangesLog plog;
- if (next.getSession() != null)
- {
- plog = new PlainChangesLogImpl(normalized, next.getSession(), next.getEventType());
- }
- else
- {
- plog = new PlainChangesLogImpl(normalized, next.getSessionId(), next.getEventType());
- }
+ PlainChangesLog plog = PlainChangesLogImpl.createCopy(normalized, next);
result.addLog(plog);
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/WorkspaceImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/WorkspaceImpl.java 2011-09-28 11:50:25 UTC (rev 4996)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/WorkspaceImpl.java 2011-09-28 11:55:37 UTC (rev 4997)
@@ -466,8 +466,7 @@
(NodeData)srcParentNode.getData(), nodeTypeManager, session.getTransientNodesManager(), true);
srcNode.getData().accept(initializer);
- PlainChangesLog changes = new PlainChangesLogImpl(session);
- changes.addAll(initializer.getAllStates());
+ PlainChangesLog changes = new PlainChangesLogImpl(initializer.getAllStates(), session);
// reload items pool
for (ItemState state : initializer.getItemAddStates())
@@ -724,6 +723,9 @@
return (RepositoryImpl)session.getRepository();
}
+ /**
+ * {@inheritDoc}
+ */
public NodeTypeDataManager getNodeTypesHolder() throws RepositoryException
{
return nodeTypeManager;
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/observation/ActionLauncher.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/observation/ActionLauncher.java 2011-09-28 11:50:25 UTC (rev 4996)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/observation/ActionLauncher.java 2011-09-28 11:55:37 UTC (rev 4997)
@@ -18,6 +18,8 @@
*/
package org.exoplatform.services.jcr.impl.core.observation;
+import org.exoplatform.services.jcr.core.ExtendedSession;
+import org.exoplatform.services.jcr.core.ExtendedWorkspace;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
import org.exoplatform.services.jcr.dataflow.ChangesLogIterator;
@@ -31,7 +33,6 @@
import org.exoplatform.services.jcr.datamodel.NodeData;
import org.exoplatform.services.jcr.datamodel.QPath;
import org.exoplatform.services.jcr.impl.core.LocationFactory;
-import org.exoplatform.services.jcr.impl.core.SessionImpl;
import org.exoplatform.services.jcr.impl.core.SessionRegistry;
import org.exoplatform.services.jcr.impl.dataflow.persistent.WorkspacePersistentDataManager;
import org.exoplatform.services.jcr.impl.util.EntityCollection;
@@ -92,11 +93,11 @@
PlainChangesLog subLog = logIterator.nextLog();
String sessionId = subLog.getSessionId();
- SessionImpl userSession;
+ ExtendedSession userSession;
- if (subLog.getSession() instanceof SessionImpl)
+ if (subLog.getSession() != null)
{
- userSession = (SessionImpl)subLog.getSession();
+ userSession = subLog.getSession();
}
else
{
@@ -155,7 +156,7 @@
return !(criteria.getNoLocal() && criteria.getSessionId().equals(sessionId));
}
- private boolean isPathMatch(ListenerCriteria criteria, ItemData item, SessionImpl userSession)
+ private boolean isPathMatch(ListenerCriteria criteria, ItemData item, ExtendedSession userSession)
{
if (criteria.getAbsPath() == null)
{
@@ -202,7 +203,7 @@
}
- private boolean isNodeTypeMatch(ListenerCriteria criteria, ItemData item, SessionImpl userSession,
+ private boolean isNodeTypeMatch(ListenerCriteria criteria, ItemData item, ExtendedSession userSession,
PlainChangesLog changesLog) throws RepositoryException
{
if (criteria.getNodeTypeName() == null)
@@ -233,7 +234,7 @@
}
}
- NodeTypeDataManager ntManager = userSession.getWorkspace().getNodeTypesHolder();
+ NodeTypeDataManager ntManager = ((ExtendedWorkspace)userSession.getWorkspace()).getNodeTypesHolder();
LocationFactory locationFactory = userSession.getLocationFactory();
for (int i = 0; i < criteria.getNodeTypeName().length; i++)
{
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/VersionableWorkspaceDataManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/VersionableWorkspaceDataManager.java 2011-09-28 11:50:25 UTC (rev 4996)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/VersionableWorkspaceDataManager.java 2011-09-28 11:55:37 UTC (rev 4997)
@@ -285,43 +285,18 @@
// we have pair of logs for system and non-system (this) workspaces
final String pairId = IdGenerator.generate();
- if (changes.getSession() != null)
- {
- versionLogs.addLog(new PlainChangesLogImpl(vstates, changes.getSession(), changes.getEventType(),
- pairId));
- nonVersionLogs.addLog(new PlainChangesLogImpl(nvstates, changes.getSession(), changes.getEventType(),
- pairId));
- }
- else
- {
- versionLogs.addLog(new PlainChangesLogImpl(vstates, changes.getSessionId(), changes.getEventType(),
- pairId));
- nonVersionLogs.addLog(new PlainChangesLogImpl(nvstates, changes.getSessionId(), changes
- .getEventType(), pairId));
- }
+ versionLogs.addLog(PlainChangesLogImpl.createCopy(vstates, pairId, changes));
+ nonVersionLogs.addLog(PlainChangesLogImpl.createCopy(nvstates, pairId, changes));
}
else
{
- if (changes.getSession() != null)
- {
- versionLogs.addLog(new PlainChangesLogImpl(vstates, changes.getSession(), changes.getEventType()));
- }
- else
- {
- versionLogs.addLog(new PlainChangesLogImpl(vstates, changes.getSessionId(), changes.getEventType()));
- }
+ versionLogs.addLog(PlainChangesLogImpl.createCopy(vstates, changes));
+ nonVersionLogs.addLog(PlainChangesLogImpl.createCopy(nvstates, changes));
}
}
else if (nvstates.size() > 0)
{
- if (changes.getSession() != null)
- {
- nonVersionLogs.addLog(new PlainChangesLogImpl(nvstates, changes.getSession(), changes.getEventType()));
- }
- else
- {
- nonVersionLogs.addLog(new PlainChangesLogImpl(nvstates, changes.getSessionId(), changes.getEventType()));
- }
+ nonVersionLogs.addLog(PlainChangesLogImpl.createCopy(nvstates, changes));
}
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java 2011-09-28 11:50:25 UTC (rev 4996)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java 2011-09-28 11:55:37 UTC (rev 4997)
@@ -418,19 +418,7 @@
RepositoryException, IOException
{
// copy state
- PlainChangesLogImpl newLog;
- if (changesLog.getSession() != null)
- {
- newLog =
- new PlainChangesLogImpl(new ArrayList<ItemState>(), changesLog.getSession(), changesLog.getEventType(),
- changesLog.getPairId());
- }
- else
- {
- newLog =
- new PlainChangesLogImpl(new ArrayList<ItemState>(), changesLog.getSessionId(),
- changesLog.getEventType(), changesLog.getPairId());
- }
+ PlainChangesLogImpl newLog = PlainChangesLogImpl.createCopy(new ArrayList<ItemState>(), changesLog);
for (Iterator<ItemState> iter = changesLog.getAllStates().iterator(); iter.hasNext();)
{
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/LocalWorkspaceStorageDataManagerProxy.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/LocalWorkspaceStorageDataManagerProxy.java 2011-09-28 11:50:25 UTC (rev 4996)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/LocalWorkspaceStorageDataManagerProxy.java 2011-09-28 11:55:37 UTC (rev 4997)
@@ -94,14 +94,8 @@
states.add(new ItemState(copyItemData(change.getData()), change.getState(), change.isEventFire(), change
.getAncestorToSave(), change.isInternallyCreated(), change.isPersisted(), change.getOldPath()));
}
- if (changes.getSession() != null)
- {
- newLog.addLog(new PlainChangesLogImpl(states, changes.getSession(), changes.getEventType()));
- }
- else
- {
- newLog.addLog(new PlainChangesLogImpl(states, changes.getSessionId(), changes.getEventType()));
- }
+
+ newLog.addLog(PlainChangesLogImpl.createCopy(states, changes));
}
storageDataManager.save(newLog);
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/SessionChangesLog.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/SessionChangesLog.java 2011-09-28 11:50:25 UTC (rev 4996)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/session/SessionChangesLog.java 2011-09-28 11:55:37 UTC (rev 4997)
@@ -18,6 +18,7 @@
*/
package org.exoplatform.services.jcr.impl.dataflow.session;
+import org.exoplatform.services.jcr.core.ExtendedSession;
import org.exoplatform.services.jcr.dataflow.ItemState;
import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
import org.exoplatform.services.jcr.dataflow.PlainChangesLogImpl;
@@ -35,8 +36,6 @@
import java.util.List;
import java.util.Map;
-import javax.jcr.Session;
-
/**
* Created by The eXo Platform SAS.<br/> Responsible for managing session changes log. Relying on
* fact that ItemData inside ItemState SHOULD be TransientItemData
@@ -86,7 +85,7 @@
*
* @param sessionId
*/
- public SessionChangesLog(Session session)
+ public SessionChangesLog(ExtendedSession session)
{
super(session);
}
@@ -97,7 +96,7 @@
* @param items
* @param sessionId
*/
- public SessionChangesLog(List<ItemState> items, Session session)
+ public SessionChangesLog(List<ItemState> items, ExtendedSession session)
{
super(items, session);
for (int i = 0, length = items.size(); i < length; i++)
12 years, 8 months
exo-jcr SVN: r4996 - in core/trunk: exo.core.component.organization.tests and 8 other directories.
by do-not-reply@jboss.org
Author: dkuleshov
Date: 2011-09-28 07:50:25 -0400 (Wed, 28 Sep 2011)
New Revision: 4996
Added:
core/trunk/exo.core.component.organization.tests/
core/trunk/exo.core.component.organization.tests/pom.xml
core/trunk/exo.core.component.organization.tests/src/
core/trunk/exo.core.component.organization.tests/src/main/
core/trunk/exo.core.component.organization.tests/src/main/java/
core/trunk/exo.core.component.organization.tests/src/main/java/org/
core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/
core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/
core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/
core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/
core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/AbstractOrganizationServiceTest.java
core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/TestGroupHandler.java
core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/TestMembershipHandler.java
core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/TestMembershipTypeHandler.java
core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/TestUserHandler.java
core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/TestUserProfileHandler.java
Modified:
core/trunk/pom.xml
Log:
EXOJCR-953: added org service tck tests module
Added: core/trunk/exo.core.component.organization.tests/pom.xml
===================================================================
--- core/trunk/exo.core.component.organization.tests/pom.xml (rev 0)
+++ core/trunk/exo.core.component.organization.tests/pom.xml 2011-09-28 11:50:25 UTC (rev 4996)
@@ -0,0 +1,70 @@
+<!--
+
+ Copyright (C) 2009 eXo Platform SAS.
+
+ This is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 of
+ the License, or (at your option) any later version.
+
+ This software is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this software; if not, write to the Free
+ Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.exoplatform.core</groupId>
+ <artifactId>core-parent</artifactId>
+ <version>2.4.2-GA-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>exo.core.component.organization.tests</artifactId>
+
+ <name>eXo Core :: Component :: Organization Service Tests</name>
+ <description>Create an Organisation Service TCK package</description>
+
+ <build>
+ <plugins>
+ <!--
+ To avoid test sources compilation we simply exclude them
+ -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <excludes>
+ <exclude>**/*.*</exclude>
+ </excludes>
+ </configuration>
+ </plugin>
+ <!--
+ Configure maven-source-plugin to add sources packed
+ in jar files to maven artifact
+ -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-source-plugin</artifactId>
+ <version>2.1.2</version>
+ <executions>
+ <execution>
+ <id>attach-sources</id>
+ <phase>verify</phase>
+ <goals>
+ <goal>jar-no-fork</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
Added: core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/AbstractOrganizationServiceTest.java
===================================================================
--- core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/AbstractOrganizationServiceTest.java (rev 0)
+++ core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/AbstractOrganizationServiceTest.java 2011-09-28 11:50:25 UTC (rev 4996)
@@ -0,0 +1,239 @@
+/*
+ * Copyright (C) 2003-2011 eXo Platform SAS.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see<http://www.gnu.org/licenses/>.
+ */
+package org.exoplatform.services.tck.organization;
+
+import junit.framework.TestCase;
+
+import org.exoplatform.container.StandaloneContainer;
+import org.exoplatform.services.organization.Group;
+import org.exoplatform.services.organization.GroupHandler;
+import org.exoplatform.services.organization.MembershipHandler;
+import org.exoplatform.services.organization.MembershipType;
+import org.exoplatform.services.organization.MembershipTypeHandler;
+import org.exoplatform.services.organization.OrganizationService;
+import org.exoplatform.services.organization.User;
+import org.exoplatform.services.organization.UserHandler;
+import org.exoplatform.services.organization.UserProfile;
+import org.exoplatform.services.organization.UserProfileHandler;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * <br/>Date: 2011
+ *
+ * @author <a href="mailto:alex.reshetnyak@exoplatform.com.ua">Alex Reshetnyak</a>
+ * @version $Id: AbstractOrganizationServiceTest.java 111 2011-11-11 11:11:11Z rainf0x $
+ */
+public class AbstractOrganizationServiceTest extends TestCase
+{
+
+ protected GroupHandler gHandler;
+
+ protected MembershipHandler mHandler;
+
+ protected UserHandler uHandler;
+
+ protected MembershipTypeHandler mtHandler;
+
+ protected UserProfileHandler upHandler;
+
+ protected String membershipType = "type";
+
+ protected String userName = "user";
+
+ protected String newUserName = "newUser";
+
+ protected String groupName1 = "group1";
+
+ protected String groupName2 = "group2";
+
+ protected StandaloneContainer container;
+
+ /**
+ * The list of users which have been created during test.
+ * Will be removed in tearDown() method.
+ */
+ private List<String> users = new ArrayList<String>();
+
+ /**
+ * The list of membership types which have been created during test.
+ * Will be removed in tearDown() method.
+ */
+ private List<String> types = new ArrayList<String>();
+
+ /**
+ * The list of group which have been created during test.
+ * Will be removed in tearDown() method.
+ */
+ private List<String> groups = new ArrayList<String>();
+
+ /**
+ * {@inheritDoc}
+ */
+ public void setUp() throws Exception
+ {
+ super.setUp();
+
+ String containerConf = getClass().getResource("/conf/standalone/test-configuration.xml").toString();
+
+ StandaloneContainer.addConfigurationURL(containerConf);
+ container = StandaloneContainer.getInstance();
+
+ OrganizationService organizationService =
+ (OrganizationService)container.getComponentInstanceOfType(OrganizationService.class);
+
+ gHandler = organizationService.getGroupHandler();
+ uHandler = organizationService.getUserHandler();
+ mHandler = organizationService.getMembershipHandler();
+ mtHandler = organizationService.getMembershipTypeHandler();
+ upHandler = organizationService.getUserProfileHandler();
+
+ users.add(userName);
+ users.add(newUserName);
+
+ groups.add("/" + groupName1);
+ groups.add("/" + groupName1 + "/" + groupName2);
+
+ types.add(membershipType);
+ }
+
+ /**
+ * Create new user for test purpose only.
+ */
+ protected void createUser(String userName) throws Exception
+ {
+ User u = uHandler.createUserInstance(userName);
+ u.setEmail("email@test");
+ u.setFirstName("first");
+ u.setLastLoginTime(Calendar.getInstance().getTime());
+ u.setCreatedDate(Calendar.getInstance().getTime());
+ u.setLastName("last");
+ u.setPassword("pwd");
+
+ uHandler.createUser(u, true);
+
+ users.add(userName);
+ }
+
+ /**
+ * Create user with profile.
+ */
+ protected void createUserProfile(String userName) throws Exception
+ {
+ UserProfile up = upHandler.createUserProfileInstance(userName);
+ up.setAttribute("key1", "value1");
+ up.setAttribute("key2", "value2");
+ upHandler.saveUserProfile(up, true);
+ }
+
+ /**
+ * Create membership type.
+ */
+ protected void createMembershipType(String type, String desc) throws Exception
+ {
+ MembershipType mt = mtHandler.createMembershipTypeInstance();
+ mt.setName(type);
+ mt.setDescription(desc);
+ mtHandler.createMembershipType(mt, true);
+
+ types.add(type);
+ }
+
+ /**
+ * Create new group.
+ */
+ protected void createGroup(String parentId, String name, String label, String desc) throws Exception
+ {
+ Group parent = gHandler.findGroupById(parentId);
+
+ Group child = gHandler.createGroupInstance();
+ child.setGroupName(name);
+ child.setLabel(label);
+ child.setDescription(desc);
+ gHandler.addChild(parent, child, true);
+
+ groups.add((parent == null ? "" : parentId) + "/" + name);
+ }
+
+ /**
+ * Create membership.
+ */
+ protected void createMembership(String userName, String groupName, String type) throws Exception
+ {
+ createUser(userName);
+ createGroup(null, groupName, "lable", "desc");
+ createMembershipType(type, "desc");
+
+ // link membership
+ mHandler.linkMembership(uHandler.findUserByName(userName), gHandler.findGroupById("/" + groupName), mtHandler
+ .findMembershipType(type), true);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void tearDown() throws Exception
+ {
+ // remove all users
+ Iterator<String> iter = users.iterator();
+ while (iter.hasNext())
+ {
+ String userName = iter.next();
+
+ if (uHandler.findUserByName(userName) != null)
+ {
+ uHandler.removeUser(userName, true);
+ }
+ iter.remove();
+ }
+
+ // remove all membership types
+ iter = types.iterator();
+ while (iter.hasNext())
+ {
+ String type = iter.next();
+
+ if (mtHandler.findMembershipType(type) != null)
+ {
+ mtHandler.removeMembershipType(type, true);
+ }
+ iter.remove();
+ }
+
+ // remove all groups
+ iter = groups.iterator();
+ while (iter.hasNext())
+ {
+ String groupId = iter.next();
+
+ Group group = gHandler.findGroupById(groupId);
+ if (group != null)
+ {
+ gHandler.removeGroup(group, true);
+ }
+
+ iter.remove();
+ }
+
+ super.tearDown();
+ }
+}
Added: core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/TestGroupHandler.java
===================================================================
--- core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/TestGroupHandler.java (rev 0)
+++ core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/TestGroupHandler.java 2011-09-28 11:50:25 UTC (rev 4996)
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2003-2007 eXo Platform SAS.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see<http://www.gnu.org/licenses/>.
+ */
+package org.exoplatform.services.tck.organization;
+
+import org.exoplatform.services.organization.Group;
+import org.exoplatform.services.organization.GroupEventListener;
+import org.exoplatform.services.organization.GroupEventListenerHandler;
+
+import java.util.List;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * @author <a href="mailto:anatoliy.bazko@exoplatform.com.ua">Anatoliy Bazko</a>
+ * @version $Id: TestOrganizationService.java 111 2008-11-11 11:11:11Z $
+ */
+public class TestGroupHandler extends AbstractOrganizationServiceTest
+{
+
+ /**
+ * Find group by id.
+ */
+ public void testFindGroupById() throws Exception
+ {
+ Group g = gHandler.findGroupById("/platform/administrators");
+ assertNotNull(g);
+ assertEquals(g.getDescription(), "the /platform/administrators group");
+ assertEquals(g.getGroupName(), "administrators");
+ assertEquals(g.getId(), "/platform/administrators");
+ assertEquals(g.getLabel(), "Administrators");
+ assertEquals(g.getParentId(), "/platform");
+
+ // try to find not existed group. We are supposed to get "null" instead of Exception
+ try
+ {
+ assertNull(gHandler.findGroupById("/not-existed-group"));
+ }
+ catch (Exception e)
+ {
+ fail("Exception should be thrown");
+ }
+ }
+
+ /**
+ * Find groups by user.
+ */
+ public void testFindGroupsByUser() throws Exception
+ {
+ assertEquals(gHandler.findGroupsOfUser("john").size(), 3);
+ }
+
+ /**
+ * Find groups.
+ */
+ public void testFindGroups() throws Exception
+ {
+ assertEquals(gHandler.findGroups(null).size(), 4);
+ assertEquals(gHandler.findGroups(gHandler.findGroupById("/organization/operations")).size(), 2);
+ assertEquals(gHandler.findGroups(gHandler.findGroupById("/organization/management/executive-board")).size(), 0);
+ }
+
+ /**
+ * Get all groups.
+ */
+ public void testGetAllGroups() throws Exception
+ {
+ assertEquals(gHandler.getAllGroups().size(), 16);
+ }
+
+ /**
+ * Remove group.
+ */
+ public void testRemoveGroup() throws Exception
+ {
+ createGroup("/organization", groupName1, "label", "desc");
+ createGroup("/organization/" + groupName1, groupName1, "label", "desc");
+
+ Group group = gHandler.removeGroup(gHandler.findGroupById("/organization/group1"), true);
+ assertNull(gHandler.findGroupById("/organization/group1"));
+ assertNull(gHandler.findGroupById("/organization/group1/group2"));
+
+ // try to remove not exited group. Exception should be thrown
+ try
+ {
+ gHandler.removeGroup(group, true);
+ fail("Exception should be thrown");
+ }
+ catch (Exception e)
+ {
+ }
+
+ // create in root
+ createGroup(null, groupName1, "label", "desc");
+ createGroup("/" + groupName1, groupName2, "label", "desc");
+
+ gHandler.removeGroup(gHandler.findGroupById("/" + groupName1), true);
+ assertNull(gHandler.findGroupById("/" + groupName1));
+ assertNull(gHandler.findGroupById("/" + groupName1 + "/" + groupName2));
+ }
+
+ /**
+ * Add child.
+ */
+ public void testAddChild() throws Exception
+ {
+ Group parent = gHandler.createGroupInstance();
+ parent.setGroupName(groupName1);
+
+ Group child = gHandler.createGroupInstance();
+ child.setGroupName(groupName2);
+
+ // try to add child to not existed parent group
+ try
+ {
+ gHandler.addChild(parent, child, false);
+ fail("Exception should be thrown.");
+ }
+ catch (Exception e)
+ {
+ }
+
+ // add parent group
+ gHandler.addChild(null, parent, false);
+ assertNotNull(gHandler.findGroupById("/" + groupName1));
+
+ // add child group
+ gHandler.addChild(parent, child, false);
+ assertNotNull(gHandler.findGroupById("/" + groupName1 + "/" + groupName2));
+ }
+
+ /**
+ * Create group.
+ */
+ public void testCreateGroup() throws Exception
+ {
+ Group group = gHandler.createGroupInstance();
+ group.setGroupName(groupName1);
+ gHandler.createGroup(group, true);
+
+ assertNotNull(gHandler.findGroupById("/" + groupName1));
+ }
+
+ /**
+ * Save group.
+ */
+ public void testSaveGroup() throws Exception
+ {
+ createGroup(null, groupName1, "label", "desc");
+
+ // set new description
+ Group g = gHandler.findGroupById("/" + groupName1);
+ g.setDescription("newDesc");
+ gHandler.saveGroup(g, true);
+
+ // check if group has new description
+ g = gHandler.findGroupById("/" + groupName1);
+ assertEquals(g.getDescription(), "newDesc");
+ }
+
+ /**
+ * Test get listeners.
+ */
+ public void testGetListeners() throws Exception
+ {
+ if (gHandler instanceof GroupEventListenerHandler)
+ {
+ List<GroupEventListener> list = ((GroupEventListenerHandler) gHandler).getGroupListeners();
+ try
+ {
+ list.clear();
+ fail("We are not supposed to be able to change list of listeners.");
+ }
+ catch (Exception e)
+ {
+ }
+ }
+ }
+}
Added: core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/TestMembershipHandler.java
===================================================================
--- core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/TestMembershipHandler.java (rev 0)
+++ core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/TestMembershipHandler.java 2011-09-28 11:50:25 UTC (rev 4996)
@@ -0,0 +1,486 @@
+/*
+ * Copyright (C) 2003-2008 eXo Platform SAS.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see<http://www.gnu.org/licenses/>.
+ */
+package org.exoplatform.services.tck.organization;
+
+import org.exoplatform.commons.utils.ListAccess;
+import org.exoplatform.services.organization.Group;
+import org.exoplatform.services.organization.Membership;
+import org.exoplatform.services.organization.MembershipEventListener;
+import org.exoplatform.services.organization.MembershipEventListenerHandler;
+import org.exoplatform.services.organization.MembershipType;
+import org.exoplatform.services.organization.User;
+
+import java.util.List;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * @author <a href="mailto:anatoliy.bazko@exoplatform.com.ua">Anatoliy Bazko</a>
+ * @version $Id: TestMembershipImpl.java 111 2008-11-11 11:11:11Z $
+ */
+public class TestMembershipHandler extends AbstractOrganizationServiceTest
+{
+ /**
+ * Find membership.
+ */
+ public void testFindMembership() throws Exception
+ {
+ createMembership(userName, groupName1, membershipType);
+
+ Membership m = mHandler.findMembershipByUserGroupAndType(userName, "/" + groupName1, membershipType);
+ assertNotNull(mHandler.findMembership(m.getId()));
+
+ // try to find not existed membership. We are supposed to get null instead of Exception
+ try
+ {
+ assertNull(mHandler.findMembership("not-existed-id"));
+ }
+ catch (Exception e)
+ {
+ fail("Exception should not be thrown");
+ }
+ }
+
+ /**
+ * Find membership by user and group.
+ */
+ public void testFindMembershipByUserGroupAndType() throws Exception
+ {
+ Membership m = mHandler.findMembershipByUserGroupAndType("marry", "/platform/users", "member");
+
+ assertNotNull(m);
+ assertEquals(m.getGroupId(), "/platform/users");
+ assertEquals(m.getMembershipType(), "member");
+ assertEquals(m.getUserName(), "marry");
+
+ // try to find not existed membership. We are supposed to get null instead of Exception
+ try
+ {
+ assertNull(mHandler.findMembershipByUserGroupAndType(userName, "/platform/users", "member"));
+ }
+ catch (Exception e)
+ {
+ fail("Exception should not be thrown");
+ }
+
+ try
+ {
+ assertNull(mHandler.findMembershipByUserGroupAndType("marry", "/" + groupName1, "member"));
+ }
+ catch (Exception e)
+ {
+ fail("Exception should not be thrown");
+ }
+
+ try
+ {
+ assertNull(mHandler.findMembershipByUserGroupAndType("marry", "/platform/users", membershipType));
+ }
+ catch (Exception e)
+ {
+ fail("Exception should not be thrown");
+ }
+ }
+
+ /**
+ * Find membership by group.
+ */
+ public void testFindMembershipsByGroup() throws Exception
+ {
+ Group g = gHandler.findGroupById("/platform/users");
+ assertEquals(mHandler.findMembershipsByGroup(g).size(), 4);
+
+ g = gHandler.createGroupInstance();
+ g.setGroupName(groupName1);
+ assertEquals(mHandler.findMembershipsByGroup(g).size(), 0);
+
+ }
+
+ /**
+ * Find membership by group.
+ */
+ public void testFindAllMembershipsByGroup() throws Exception
+ {
+ Group g = gHandler.findGroupById("/platform/users");
+ ListAccess<Membership> memberships = mHandler.findAllMembershipsByGroup(g);
+ assertEquals(memberships.getSize(), 4);
+
+ try
+ {
+ Membership[] m = memberships.load(0, 4);
+ assertEquals(4, m.length);
+ }
+ catch (Exception e)
+ {
+ fail("Exception should not be thrown");
+ }
+
+ try
+ {
+ Membership[] m = memberships.load(1, 2);
+ assertEquals(2, m.length);
+ }
+ catch (Exception e)
+ {
+ fail("Exception should not be thrown");
+ }
+
+ try
+ {
+ Membership[] m = memberships.load(1, 4);
+ fail("Exception should be thrown");
+ }
+ catch (Exception e)
+ {
+ }
+
+ g = gHandler.createGroupInstance();
+ g.setGroupName(groupName1);
+ assertEquals(mHandler.findMembershipsByGroup(g).size(), 0);
+
+ }
+
+ /**
+ * Find all memberships by user.
+ */
+ public void testFindMembershipsByUser() throws Exception
+ {
+ assertEquals(mHandler.findMembershipsByUser("john").size(), 3);
+ assertEquals(mHandler.findMembershipsByUser("not-existed-user").size(), 0);
+ }
+
+ /**
+ * Find all membership by user and group.
+ */
+ public void testFindMembershipsByUserAndGroup() throws Exception
+ {
+ assertEquals(mHandler.findMembershipsByUserAndGroup("john", "/platform/users").size(), 1);
+
+ // try to find not existed membership. We are supposed to get null instead of Exception
+ try
+ {
+ assertEquals(mHandler.findMembershipsByUserAndGroup("non-existed-john", "/platform/users").size(), 0);
+ }
+ catch (Exception e)
+ {
+ fail("Exception should not be thrown");
+ }
+
+ try
+ {
+ assertEquals(mHandler.findMembershipsByUserAndGroup("john", "/non-existed-group").size(), 0);
+ }
+ catch (Exception e)
+ {
+ fail("Exception should not be thrown");
+ }
+ }
+
+ /**
+ * Link membership.
+ */
+ public void testLinkMembership() throws Exception
+ {
+ createUser(userName);
+ createGroup(null, groupName1, "lable", "desc");
+ createMembershipType(membershipType, "desc");
+
+ // link membership
+ mHandler.linkMembership(uHandler.findUserByName(userName), gHandler.findGroupById("/" + groupName1), mtHandler
+ .findMembershipType(membershipType), true);
+
+ Membership m = mHandler.findMembershipByUserGroupAndType(userName, "/" + groupName1, membershipType);
+ assertNotNull(m);
+
+ // try to create already existed membership. Exception should not be thrown
+ try
+ {
+ mHandler.linkMembership(uHandler.findUserByName(userName), gHandler.findGroupById("/" + groupName1),
+ mtHandler.findMembershipType(membershipType), true);
+ }
+ catch (Exception e)
+ {
+ fail("Exception should not be thrown");
+ }
+
+ // we expect only 1 membership record
+ assertEquals(1, mHandler.findMembershipsByUser(userName).size());
+
+ // test deprecated memthod create membership
+ mHandler.removeMembership(m.getId(), true);
+ mHandler.createMembership(m, true);
+ m = mHandler.findMembershipByUserGroupAndType(userName, "/" + groupName1, membershipType);
+ assertNotNull(m);
+
+ // try to link membership with not existed entries. We are supposed to get Exception
+ Group group = gHandler.createGroupInstance();
+ group.setGroupName("not-existed-group");
+ try
+ {
+ mHandler.linkMembership(uHandler.findUserByName(userName), group,
+ mtHandler.findMembershipType(membershipType), true);
+ fail("Exception should be thrown");
+ }
+ catch (Exception e)
+ {
+ }
+
+ User user = uHandler.createUserInstance("not-existed-user");
+ try
+ {
+ mHandler.linkMembership(user, gHandler.findGroupById("/" + groupName1), mtHandler
+ .findMembershipType(membershipType), true);
+ fail("Exception should be thrown");
+ }
+ catch (Exception e)
+ {
+ }
+
+ MembershipType mt = mtHandler.createMembershipTypeInstance();
+ mt.setName("not-existed-mt");
+ try
+ {
+ mHandler.linkMembership(uHandler.findUserByName(userName), gHandler.findGroupById("/" + groupName1), mt, true);
+ fail("Exception should be thrown");
+ }
+ catch (Exception e)
+ {
+ }
+
+ try
+ {
+ mHandler.linkMembership(uHandler.findUserByName(userName), null, mtHandler.findMembershipType(membershipType),
+ true);
+ fail("Exception should be thrown");
+ }
+ catch (Exception e)
+ {
+ }
+
+ try
+ {
+ mHandler.linkMembership(null, gHandler.findGroupById("/" + groupName1), mtHandler
+ .findMembershipType(membershipType), true);
+ fail("Exception should be thrown");
+ }
+ catch (Exception e)
+ {
+ }
+
+ try
+ {
+ mHandler.linkMembership(uHandler.findUserByName(userName), gHandler.findGroupById("/" + groupName1), null,
+ true);
+ fail("Exception should be thrown");
+ }
+ catch (Exception e)
+ {
+ }
+ }
+
+ /**
+ * Remove membership
+ */
+ public void testRemoveMembership() throws Exception
+ {
+
+ createMembership(userName, groupName1, membershipType);
+ Membership m = mHandler.findMembershipByUserGroupAndType(userName, "/" + groupName1, membershipType);
+
+ assertNotNull(m);
+
+ m = mHandler.removeMembership(m.getId(), true);
+ assertEquals(m.getGroupId(), "/" + groupName1);
+ assertEquals(m.getMembershipType(), membershipType);
+ assertEquals(m.getUserName(), userName);
+
+ assertNull(mHandler.findMembershipByUserGroupAndType(userName, "/" + groupName1, membershipType));
+
+
+ // try to remove not existed membership. We are supposed to get "null" instead of Exception
+ try
+ {
+ assertNull(mHandler.removeMembership("not-existed-id", true));
+ }
+ catch (Exception e)
+ {
+ fail("Exception should not be thrown");
+ }
+ }
+
+ /**
+ * Remove membership by user.
+ */
+ public void testRemoveMembershipByUser() throws Exception
+ {
+ createMembership(userName, groupName1, membershipType);
+
+ assertEquals(mHandler.removeMembershipByUser("user", true).size(), 1);
+ assertNull(mHandler.findMembershipByUserGroupAndType("user", "/group", "type"));
+
+ // try to remove memberships by not existed users. We are supposed to get empty list instead of Exception
+ try
+ {
+ assertEquals(mHandler.removeMembershipByUser("not-existed-user", true).size(), 0);
+ }
+ catch (Exception e)
+ {
+ fail("Exception should not be thrown");
+ }
+ }
+
+ /**
+ * Find group by membership.
+ */
+ public void testFindGroupByMembership() throws Exception
+ {
+ assertEquals(gHandler.findGroupByMembership("john", "manager").size(), 1);
+
+ // try to find groups by not existed entries. We supposed to get empty list instead of Exception
+ try
+ {
+ assertEquals(gHandler.findGroupByMembership("not-existed-john", "manager").size(), 0);
+ }
+ catch (Exception e)
+ {
+ fail("Exception should not be thrown");
+ }
+
+
+ }
+
+ /**
+ * Find groups of user.
+ */
+ public void testFindGroupsOfUser() throws Exception
+ {
+ assertEquals(gHandler.findGroupsOfUser("john").size(), 3);
+
+ // try to find groups by not existed entries. We supposed to get empty list instead of Exception
+ try
+ {
+ assertEquals(gHandler.findGroupsOfUser("not-existed-james").size(), 0);
+ }
+ catch (Exception e)
+ {
+ fail("Exception should not be thrown");
+ }
+ }
+
+ /**
+ * Find users by group.
+ */
+ public void testFindUsersByGroupId() throws Exception
+ {
+ assertEquals(uHandler.findUsersByGroupId("/platform/users").getSize(), 4);
+
+ // try to find users by not existed entries. We supposed to get empty list instead of Exception
+ try
+ {
+ assertEquals(uHandler.findUsersByGroupId("/not-existed-group").getSize(), 0);
+ }
+ catch (Exception e)
+ {
+ fail("Exception should not be thrown");
+ }
+ }
+
+ /**
+ * Find users by group.
+ */
+ public void testFindUsersByGroup() throws Exception
+ {
+ assertEquals(uHandler.findUsersByGroup("/platform/users").getAll().size(), 4);
+
+ // try to find users by not existed entries. We supposed to get empty list instead of Exception
+ try
+ {
+ assertEquals(uHandler.findUsersByGroup("/not-existed-group").getAll().size(), 0);
+ }
+ catch (Exception e)
+ {
+ fail("Exception should not be thrown");
+ }
+ }
+
+ /**
+ * Remove membership type.
+ */
+ public void testRemoveMembershipType() throws Exception
+ {
+ createMembership(userName, groupName1, membershipType);
+
+ mtHandler.removeMembershipType("type", true);
+ assertNull(mtHandler.findMembershipType("type"));
+ assertNull(mHandler.findMembershipByUserGroupAndType(userName, "/" + groupName1, membershipType));
+ }
+
+ /**
+ * Remove group.
+ */
+ public void testRemoveGroup() throws Exception
+ {
+ createMembership(userName, groupName1, membershipType);
+
+ gHandler.removeGroup(gHandler.findGroupById("/" + groupName1), true);
+
+ assertNull(gHandler.findGroupById("/" + groupName1));
+ assertNull(mHandler.findMembershipByUserGroupAndType(userName, "/" + groupName1, membershipType));
+
+
+ // try to remove not existed groups. We are supposed to get Exception
+ try
+ {
+ Group g = gHandler.createGroupInstance();
+ g.setGroupName("not-existed-group");
+ gHandler.removeGroup(g, true);
+
+ fail("Exception should be thrown");
+ }
+ catch (Exception e)
+ {
+ }
+
+ try
+ {
+ gHandler.removeGroup(null, true);
+ fail("Exception should be thrown");
+ }
+ catch (Exception e)
+ {
+ }
+ }
+
+ /**
+ * Test get listeners.
+ */
+ public void testGetListeners() throws Exception
+ {
+ if (mHandler instanceof MembershipEventListenerHandler)
+ {
+ List<MembershipEventListener> list = ((MembershipEventListenerHandler) mHandler).getMembershipListeners();
+ try
+ {
+ list.clear();
+ fail("We are not supposed to change list of listners");
+ }
+ catch (Exception e)
+ {
+ }
+ }
+ }
+}
Added: core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/TestMembershipTypeHandler.java
===================================================================
--- core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/TestMembershipTypeHandler.java (rev 0)
+++ core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/TestMembershipTypeHandler.java 2011-09-28 11:50:25 UTC (rev 4996)
@@ -0,0 +1,223 @@
+/**
+ *
+ */
+/*
+ * Copyright (C) 2003-2007 eXo Platform SAS.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see<http://www.gnu.org/licenses/>.
+ */
+package org.exoplatform.services.tck.organization;
+
+import org.exoplatform.services.organization.MembershipType;
+import org.exoplatform.services.organization.MembershipTypeEventListener;
+import org.exoplatform.services.organization.MembershipTypeEventListenerHandler;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * @author <a href="mailto:anatoliy.bazko@exoplatform.com.ua">Anatoliy Bazko</a>
+ * @version $Id: TestMembershipTypeHandlerImpl.java 111 2008-11-11 11:11:11Z $
+ */
+public class TestMembershipTypeHandler extends AbstractOrganizationServiceTest
+{
+
+ /**
+ * Find membership type.
+ */
+ public void testFindMembershipType() throws Exception
+ {
+ MembershipType mt = mtHandler.findMembershipType("manager");
+ assertNotNull(mt);
+ assertEquals(mt.getName(), "manager");
+ assertEquals(mt.getDescription(), "manager membership type");
+
+ // try to find not existed membership type
+ assertNull(mtHandler.findMembershipType("manager_"));
+ }
+
+ /**
+ * Find membership types.
+ */
+ public void testFindMembershipTypes() throws Exception
+ {
+ assertEquals(mtHandler.findMembershipTypes().size(), 3);
+ }
+
+ /**
+ * Remove membership type.
+ */
+ public void testRemoveMembershipType() throws Exception
+ {
+ createMembershipType(membershipType, "desc");
+
+ MembershipType mt = mtHandler.removeMembershipType("type", true);
+ assertEquals(mt.getName(), membershipType);
+ assertNull(mtHandler.findMembershipType("type"));
+
+ // try to remove not existed membership type. We are supposed to get "null" instead of Exception
+ try
+ {
+ assertNull(mtHandler.removeMembershipType("not-existed-mt", true));
+ }
+ catch (Exception e)
+ {
+ fail("Exception should not be thrown");
+ }
+ }
+
+ /**
+ * Save membership type.
+ */
+ public void testSaveMembershipType() throws Exception
+ {
+ createMembershipType(membershipType, "desc");
+ MembershipType mt = mtHandler.findMembershipType(membershipType);
+
+ // change description
+ mt.setDescription("newDesc");
+ mtHandler.saveMembershipType(mt, true);
+
+ mt = mtHandler.findMembershipType(membershipType);
+ assertEquals(mt.getDescription(), "newDesc");
+ }
+
+ /**
+ * Test get listeners.
+ */
+ public void testGetListeners() throws Exception
+ {
+ if (mtHandler instanceof MembershipTypeEventListenerHandler)
+ {
+ List<MembershipTypeEventListener> list =
+ ((MembershipTypeEventListenerHandler)mtHandler).getMembershipTypeListeners();
+
+ assertEquals(1, list.size());
+ try
+ {
+ list.clear();
+ fail("We are not supposed to change list of listeners");
+ }
+ catch (Exception e)
+ {
+ }
+ }
+ }
+
+ /**
+ * Test events.
+ */
+ public void testMembershipTypeEventListener() throws Exception
+ {
+ TesterMembershipTypeEventListener testListener = new TesterMembershipTypeEventListener();
+ mtHandler.addMembershipTypeEventListener(testListener);
+
+ if (mtHandler instanceof MembershipTypeEventListenerHandler)
+ {
+ List<MembershipTypeEventListener> list =
+ ((MembershipTypeEventListenerHandler)mtHandler).getMembershipTypeListeners();
+
+ assertEquals(2, list.size());
+ }
+
+ // Create new membership type. In preSave event there is not recored in db.
+ createMembershipType(membershipType, "desc");
+
+ assertEquals(2, testListener.mtInEvent.size());
+ assertEquals(2, testListener.mtInStorage.size());
+
+ // preSave Event
+ assertEquals(membershipType, testListener.mtInEvent.get(0).getName());
+ assertNull(testListener.mtInStorage.get(0));
+
+ // postSave Event
+ assertEquals(membershipType, testListener.mtInEvent.get(1).getName());
+ assertNotNull(testListener.mtInStorage.get(1));
+ assertEquals(membershipType, testListener.mtInStorage.get(1).getName());
+
+ testListener.mtInEvent.clear();
+ testListener.mtInStorage.clear();
+
+ // Modify membership type. In preSave event there is old record in storage.
+ MembershipType mt = mtHandler.findMembershipType(membershipType);
+ mt.setDescription("newDesc");
+
+ mtHandler.saveMembershipType(mt, true);
+
+ // preSave Event
+ assertEquals(2, testListener.mtInEvent.size());
+ assertEquals(2, testListener.mtInStorage.size());
+
+ assertEquals("newDesc", testListener.mtInEvent.get(0).getDescription());
+ assertEquals("desc", testListener.mtInStorage.get(0).getDescription());
+
+ // postSave Event
+ assertEquals("newDesc", testListener.mtInEvent.get(1).getDescription());
+ assertEquals("newDesc", testListener.mtInStorage.get(1).getDescription());
+
+ testListener.mtInEvent.clear();
+ testListener.mtInStorage.clear();
+
+ // Remove membership type. In preDelete Event there is still record in storage
+ mtHandler.removeMembershipType(membershipType, true);
+
+ assertEquals(2, testListener.mtInEvent.size());
+ assertEquals(2, testListener.mtInStorage.size());
+
+ // preDelete Event
+ assertEquals(membershipType, testListener.mtInEvent.get(0).getName());
+ assertNotNull(testListener.mtInStorage.get(0));
+
+ // postDelete Event
+ assertEquals(membershipType, testListener.mtInEvent.get(1).getName());
+ assertNull(testListener.mtInStorage.get(1));
+
+ testListener.mtInEvent.clear();
+ testListener.mtInStorage.clear();
+
+ }
+
+ private class TesterMembershipTypeEventListener extends MembershipTypeEventListener
+ {
+ List<MembershipType> mtInEvent = new ArrayList<MembershipType>();
+
+ List<MembershipType> mtInStorage = new ArrayList<MembershipType>();
+
+ public void preSave(MembershipType type, boolean isNew) throws Exception
+ {
+ mtInEvent.add(type);
+ mtInStorage.add(mtHandler.findMembershipType(type.getName()));
+ }
+
+ public void postSave(MembershipType type, boolean isNew) throws Exception
+ {
+ mtInEvent.add(type);
+ mtInStorage.add(mtHandler.findMembershipType(type.getName()));
+ }
+
+ public void preDelete(MembershipType type) throws Exception
+ {
+ mtInEvent.add(type);
+ mtInStorage.add(mtHandler.findMembershipType(type.getName()));
+ }
+
+ public void postDelete(MembershipType type) throws Exception
+ {
+ mtInEvent.add(type);
+ mtInStorage.add(mtHandler.findMembershipType(type.getName()));
+ }
+ }
+}
Added: core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/TestUserHandler.java
===================================================================
--- core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/TestUserHandler.java (rev 0)
+++ core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/TestUserHandler.java 2011-09-28 11:50:25 UTC (rev 4996)
@@ -0,0 +1,331 @@
+/*
+ * Copyright (C) 2003-2008 eXo Platform SAS.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see<http://www.gnu.org/licenses/>.
+ */
+package org.exoplatform.services.tck.organization;
+
+import org.exoplatform.services.organization.Query;
+import org.exoplatform.services.organization.User;
+import org.exoplatform.services.organization.UserEventListener;
+import org.exoplatform.services.organization.UserEventListenerHandler;
+
+import java.util.Calendar;
+import java.util.List;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * @author <a href="mailto:anatoliy.bazko@exoplatform.com.ua">Anatoliy Bazko</a>
+ * @version $Id: TestOrganizationService.java 111 2008-11-11 11:11:11Z $
+ */
+public class TestUserHandler extends AbstractOrganizationServiceTest
+{
+
+ /**
+ * User authentication.
+ */
+ public void testAuthenticate() throws Exception
+ {
+ // authentication with existed user and correct password
+ assertTrue(uHandler.authenticate("demo", "exo"));
+
+ // unknown user authentication
+ assertFalse(uHandler.authenticate("demo_", "exo"));
+
+ // authentication with wrong password
+ assertFalse(uHandler.authenticate("demo", "exo_"));
+ }
+
+ /**
+ * Find user by name.
+ */
+ public void testFindUserByName() throws Exception
+ {
+ // try to find existed user
+ User u = uHandler.findUserByName("demo");
+
+ assertNotNull(u);
+ assertEquals("demo@localhost", u.getEmail());
+ assertEquals("Demo", u.getFirstName());
+ assertEquals("exo", u.getLastName());
+ assertEquals("exo", u.getPassword());
+ assertEquals("demo", u.getUserName());
+
+ // try to find not existed user. We are supposed to get "null" instead of Exception.
+ try
+ {
+ assertNull(uHandler.findUserByName("not-existed-user"));
+ }
+ catch (Exception e)
+ {
+ fail("Exception should not be thrown");
+ }
+ }
+
+ /**
+ * Find users by query.
+ */
+ public void testFindUsersByQuery() throws Exception
+ {
+ createUser("tolik");
+
+ Query query = new Query();
+ query.setEmail("email@test");
+
+ // try to find user by email
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 1);
+
+ // try to find user by name with mask
+ query = new Query();
+ query.setUserName("*tolik*");
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 1);
+
+ // try to find user by name with mask
+ query = new Query();
+ query.setUserName("tol*");
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 1);
+
+ // try to find user by name with mask
+ query = new Query();
+ query.setUserName("*lik");
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 1);
+
+ // try to find user by name explicitly
+ query = new Query();
+ query.setUserName("tolik");
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 1);
+
+ // try to find user by name explicitly, case sensitive search
+ query = new Query();
+ query.setUserName("Tolik");
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 1);
+
+ // try to find user by part of name without mask
+ query = new Query();
+ query.setUserName("tol");
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 1);
+
+ // try to find user by fist and last names, case sensitive search
+ query = new Query();
+ query.setFirstName("fiRst");
+ query.setLastName("lasT");
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 1);
+
+ // try to find user by login date
+ Calendar calc = Calendar.getInstance();
+ calc.set(Calendar.YEAR, calc.get(Calendar.YEAR) - 1);
+
+ query = new Query();
+ query.setFromLoginDate(calc.getTime());
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 1);
+
+ calc = Calendar.getInstance();
+ calc.set(Calendar.YEAR, calc.get(Calendar.YEAR) + 1);
+
+ query = new Query();
+ query.setFromLoginDate(calc.getTime());
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 0);
+
+ calc = Calendar.getInstance();
+ calc.set(Calendar.YEAR, calc.get(Calendar.YEAR) - 1);
+
+ query = new Query();
+ query.setToLoginDate(calc.getTime());
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 0);
+
+ calc = Calendar.getInstance();
+ calc.set(Calendar.YEAR, calc.get(Calendar.YEAR) + 1);
+
+ query = new Query();
+ query.setToLoginDate(calc.getTime());
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 1);
+ }
+
+ /**
+ * Find users.
+ */
+ public void testFindUsers() throws Exception
+ {
+ createUser("tolik");
+
+ Query query = new Query();
+ query.setEmail("email@test");
+
+ // try to find user by email
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 1);
+
+ // try to find user by name with mask
+ query = new Query();
+ query.setUserName("*tolik*");
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 1);
+
+ // try to find user by name with mask
+ query = new Query();
+ query.setUserName("tol*");
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 1);
+
+ // try to find user by name with mask
+ query = new Query();
+ query.setUserName("*lik");
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 1);
+
+ // try to find user by name explicitly
+ query = new Query();
+ query.setUserName("tolik");
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 1);
+
+ // try to find user by name explicitly, case sensitive search
+ query = new Query();
+ query.setUserName("Tolik");
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 1);
+
+ // try to find user by part of name without mask
+ query = new Query();
+ query.setUserName("tol");
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 1);
+
+ // try to find user by fist and last names, case sensitive search
+ query = new Query();
+ query.setFirstName("fiRst");
+ query.setLastName("lasT");
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 1);
+
+ // try to find user by login date
+ Calendar calc = Calendar.getInstance();
+ calc.set(Calendar.YEAR, calc.get(Calendar.YEAR) - 1);
+
+ query = new Query();
+ query.setFromLoginDate(calc.getTime());
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 1);
+
+ calc = Calendar.getInstance();
+ calc.set(Calendar.YEAR, calc.get(Calendar.YEAR) + 1);
+
+ query = new Query();
+ query.setFromLoginDate(calc.getTime());
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 0);
+
+ calc = Calendar.getInstance();
+ calc.set(Calendar.YEAR, calc.get(Calendar.YEAR) - 1);
+
+ query = new Query();
+ query.setToLoginDate(calc.getTime());
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 0);
+
+ calc = Calendar.getInstance();
+ calc.set(Calendar.YEAR, calc.get(Calendar.YEAR) + 1);
+
+ query = new Query();
+ query.setToLoginDate(calc.getTime());
+ assertEquals(uHandler.findUsersByQuery(query).getSize(), 1);
+ }
+
+ /**
+ * Get users page list.
+ */
+ public void testGetUserPageList() throws Exception
+ {
+ assertEquals(uHandler.getUserPageList(10).getAll().size(), 4);
+ }
+
+ /**
+ * Find all users.
+ */
+ public void testFindAllUsers() throws Exception
+ {
+ assertEquals(uHandler.findAllUsers().getSize(), 4);
+ }
+
+ /**
+ * Remove user.
+ */
+ public void testRemoveUser() throws Exception
+ {
+ createUser(userName);
+ assertNotNull(uHandler.removeUser(userName, true));
+
+ // try to find user after remove. We are supposed to get "null" instead of exception
+ try
+ {
+ assertNull(uHandler.findUserByName(userName + "_"));
+ }
+ catch (Exception e)
+ {
+ fail("Exception should not be thrown");
+ }
+ }
+
+ /**
+ * Save user.
+ */
+ public void testSaveUser() throws Exception
+ {
+ createUser(userName);
+
+ String newEmail = "new@Email";
+
+ // change email and check
+ User u = uHandler.findUserByName(userName);
+ u.setEmail(newEmail);
+
+ uHandler.saveUser(u, true);
+ assertEquals(newEmail, uHandler.findUserByName(userName).getEmail());
+
+ // change name
+ u = uHandler.findUserByName(userName);
+ u.setUserName(newUserName);
+ uHandler.saveUser(u, true);
+
+ // we should to find user with new name but not with old one
+ assertNotNull(uHandler.findUserByName(newUserName));
+ assertNull(uHandler.findUserByName(userName));
+ }
+
+ /**
+ * Create user.
+ */
+ public void testCreateUser() throws Exception
+ {
+ User u = uHandler.createUserInstance(userName);
+ u.setEmail("email@test");
+ u.setFirstName("first");
+ u.setLastName("last");
+ u.setPassword("pwd");
+ uHandler.createUser(u, true);
+
+ // check if user exists
+ assertNotNull(uHandler.findUserByName(userName));
+ }
+
+ /**
+ * Test get listeners.
+ */
+ public void testGetListeners() throws Exception
+ {
+ if (uHandler instanceof UserEventListenerHandler)
+ {
+ List<UserEventListener> list = ((UserEventListenerHandler) uHandler).getUserListeners();
+ try
+ {
+ // check if we able to modify the list of listeners
+ list.clear();
+ fail("Exception should not be thrown");
+ }
+ catch (Exception e)
+ {
+ }
+ }
+ }
+}
Added: core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/TestUserProfileHandler.java
===================================================================
--- core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/TestUserProfileHandler.java (rev 0)
+++ core/trunk/exo.core.component.organization.tests/src/main/java/org/exoplatform/services/tck/organization/TestUserProfileHandler.java 2011-09-28 11:50:25 UTC (rev 4996)
@@ -0,0 +1,158 @@
+/**
+ *
+ */
+/*
+ * Copyright (C) 2003-2007 eXo Platform SAS.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see<http://www.gnu.org/licenses/>.
+ */
+package org.exoplatform.services.tck.organization;
+
+import org.exoplatform.services.organization.UserProfile;
+import org.exoplatform.services.organization.UserProfileEventListener;
+import org.exoplatform.services.organization.UserProfileEventListenerHandler;
+
+import java.util.List;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * @author <a href="mailto:anatoliy.bazko@exoplatform.com.ua">Anatoliy Bazko</a>
+ * @version $Id: TestUserProfileHandlerImpl.java 111 2008-11-11 11:11:11Z $
+ */
+public class TestUserProfileHandler extends AbstractOrganizationServiceTest
+{
+ /**
+ * Find user profile by name.
+ */
+ public void testFindUserProfileByName() throws Exception
+ {
+ createUser(userName);
+ createUserProfile(userName);
+
+ UserProfile up = upHandler.findUserProfileByName(userName);
+ assertNotNull(up);
+ assertEquals(userName, up.getUserName());
+ assertEquals("value1", up.getAttribute("key1"));
+ assertEquals("value2", up.getAttribute("key2"));
+
+ // try to find profile for not existed user. We are supposed to get "null" instead of Exception
+ try
+ {
+ assertNull(upHandler.findUserProfileByName(newUserName));
+ }
+ catch (Exception e)
+ {
+ fail("Exception should not be thrown");
+ }
+
+ // try to find not existed profile. We are supposed to get "null" instead of Exception
+ createUser(newUserName);
+ try
+ {
+ assertNull(upHandler.findUserProfileByName(newUserName));
+ }
+ catch (Exception e)
+ {
+ fail("Exception should not be thrown");
+ }
+ }
+
+ /**
+ * Find user profiles.
+ */
+ public void testFindUserProfiles() throws Exception
+ {
+ createUser(userName);
+ createUserProfile(userName);
+
+ createUser(newUserName);
+ createUserProfile(newUserName);
+
+ assertEquals(upHandler.findUserProfiles().size(), 2);
+ }
+
+ /**
+ * Remove user profile.
+ */
+ public void testRemoveUserProfile() throws Exception
+ {
+ createUser(userName);
+ createUserProfile(userName);
+
+ UserProfile up = upHandler.removeUserProfile(userName, true);
+ assertNotNull(up);
+ assertEquals(up.getAttribute("key1"), "value1");
+ assertEquals(up.getAttribute("key2"), "value2");
+ assertNull(upHandler.findUserProfileByName("userP1"));
+
+ // remove not existed profile. We are supposed to get "null" instead of Exception
+ try
+ {
+ assertNull(upHandler.removeUserProfile(newUserName, true));
+ }
+ catch (Exception e)
+ {
+ fail("Exception should not be thrown");
+ }
+ }
+
+ /**
+ * Save user profile.
+ */
+ public void testSaveUserProfile() throws Exception
+ {
+ createUser(userName);
+ createUserProfile(userName);
+
+ UserProfile up = upHandler.findUserProfileByName(userName);
+ up.setAttribute("key1", "value11");
+ up.setAttribute("key2", null);
+ upHandler.saveUserProfile(up, true);
+
+ up = upHandler.findUserProfileByName(userName);
+ assertEquals(up.getAttribute("key1"), "value11");
+ assertNull(up.getAttribute("key2"));
+
+ // try to save user profile for not existed user
+ try
+ {
+ up = upHandler.createUserProfileInstance(newUserName);
+ upHandler.saveUserProfile(up, true);
+ }
+ catch (Exception e)
+ {
+ fail("Exception should not be thrown");
+ }
+ }
+
+ /**
+ * Test get listeners.
+ */
+ public void testGetListeners() throws Exception
+ {
+ if (upHandler instanceof UserProfileEventListenerHandler)
+ {
+ List<UserProfileEventListener> list = ((UserProfileEventListenerHandler) upHandler).getUserProfileListeners();
+ try
+ {
+ list.clear();
+ fail("We should not able to modife list of listeners");
+ }
+ catch (Exception e)
+ {
+ }
+ }
+ }
+}
Modified: core/trunk/pom.xml
===================================================================
--- core/trunk/pom.xml 2011-09-28 10:27:01 UTC (rev 4995)
+++ core/trunk/pom.xml 2011-09-28 11:50:25 UTC (rev 4996)
@@ -56,6 +56,7 @@
<module>exo.core.component.organization.api</module>
<module>exo.core.component.organization.jdbc</module>
<module>exo.core.component.organization.ldap</module>
+ <module>exo.core.component.organization.tests</module>
<module>exo.core.component.xml-processing</module>
<module>exo.core.component.script.groovy</module>
<module>exo.core.component.web.css</module>
@@ -128,6 +129,14 @@
<dependency>
<groupId>org.exoplatform.core</groupId>
+ <artifactId>exo.core.component.organization.tests</artifactId>
+ <version>${project.version}</version>
+ <classifier>sources</classifier>
+ <scope>test</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.exoplatform.core</groupId>
<artifactId>exo.core.component.security.core</artifactId>
<version>${project.version}</version>
</dependency>
12 years, 8 months
exo-jcr SVN: r4995 - jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/distribution.
by do-not-reply@jboss.org
Author: tolusha
Date: 2011-09-28 06:27:01 -0400 (Wed, 28 Sep 2011)
New Revision: 4995
Modified:
jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/distribution/TestDataDistributionManager.java
Log:
EXOJCR-1498: Migration tool and guideline for migration from 1.12.10-GA to 1.14.0.CR4-CP01, Test added
Modified: jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/distribution/TestDataDistributionManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/distribution/TestDataDistributionManager.java 2011-09-28 10:24:22 UTC (rev 4994)
+++ jcr/trunk/exo.jcr.component.ext/src/test/java/org/exoplatform/services/jcr/ext/distribution/TestDataDistributionManager.java 2011-09-28 10:27:01 UTC (rev 4995)
@@ -624,6 +624,7 @@
public void testMigration() throws Exception
{
Node rootNode = session.getRootNode().addNode("testRoot");
+ rootNode.addNode("a").setProperty("a", "a");
rootNode.addNode("bob").setProperty("bob", "bob");
rootNode.addNode("john.smith").setProperty("john.smith", "john.smith");
rootNode.addNode("joiv").setProperty("joiv", "joiv");
@@ -633,6 +634,7 @@
manager.getDataDistributionType(DataDistributionMode.READABLE).migrate(rootNode);
+ assertTrue(rootNode.hasNode("a"));
assertFalse(rootNode.hasNode("bob"));
assertFalse(rootNode.hasNode("john.smith"));
assertFalse(rootNode.hasNode("joiv"));
@@ -645,6 +647,7 @@
assertTrue(rootNode.hasNode("b___/bo___/bon___/bonjov"));
assertTrue(rootNode.hasNode("a___/an___/ana___/anatoliy.bazko"));
+ assertTrue(rootNode.getNode("a").hasProperty("a"));
assertTrue(rootNode.getNode("b___/bo___/bob").hasProperty("bob"));
assertTrue(rootNode.getNode("j___/jo___/joh___/john.smith").hasProperty("john.smith"));
assertTrue(rootNode.getNode("j___/jo___/joi___/joiv").hasProperty("joiv"));
@@ -654,6 +657,7 @@
// shoud not be any changes
manager.getDataDistributionType(DataDistributionMode.READABLE).migrate(rootNode);
+ assertTrue(rootNode.hasNode("a"));
assertFalse(rootNode.hasNode("bob"));
assertFalse(rootNode.hasNode("john.smith"));
assertFalse(rootNode.hasNode("joiv"));
@@ -666,6 +670,7 @@
assertTrue(rootNode.hasNode("b___/bo___/bon___/bonjov"));
assertTrue(rootNode.hasNode("a___/an___/ana___/anatoliy.bazko"));
+ assertTrue(rootNode.getNode("a").hasProperty("a"));
assertTrue(rootNode.getNode("b___/bo___/bob").hasProperty("bob"));
assertTrue(rootNode.getNode("j___/jo___/joh___/john.smith").hasProperty("john.smith"));
assertTrue(rootNode.getNode("j___/jo___/joi___/joiv").hasProperty("joiv"));
12 years, 8 months
exo-jcr SVN: r4994 - jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/distribution/impl.
by do-not-reply@jboss.org
Author: tolusha
Date: 2011-09-28 06:24:22 -0400 (Wed, 28 Sep 2011)
New Revision: 4994
Modified:
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/distribution/impl/DataDistributionByName.java
Log:
EXOJCR-1498: Migration tool and guideline for migration from 1.12.10-GA to 1.14.0.CR4-CP01
Modified: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/distribution/impl/DataDistributionByName.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/distribution/impl/DataDistributionByName.java 2011-09-28 09:19:18 UTC (rev 4993)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/distribution/impl/DataDistributionByName.java 2011-09-28 10:24:22 UTC (rev 4994)
@@ -98,36 +98,55 @@
public void migrate(Node rootNode, String nodeType, List<String> mixinTypes, Map<String, String[]> permissions)
throws RepositoryException
{
+ // try to detect if migration is needed
NodeIterator iter = ((NodeImpl)rootNode).getNodesLazily(1);
- if (iter.hasNext() && !iter.nextNode().getPath().endsWith(suffix))
+ while (iter.hasNext())
{
- iter = ((NodeImpl)rootNode).getNodesLazily();
- while (iter.hasNext())
+ String userName = iter.nextNode().getName();
+ if (userName.length() == 1)
{
- Node userNode = iter.nextNode();
- List<String> ancestors = getAncestors(userNode.getName());
-
- Node node = rootNode;
+ continue;
+ }
+ else if (userName.endsWith(suffix) || (!iter.hasNext()))
+ {
+ return;
+ }
+ else
+ {
+ break;
+ }
+ }
- for (int i = 0, length = ancestors.size() - 1; i < length; i++)
+ iter = ((NodeImpl)rootNode).getNodesLazily();
+ while (iter.hasNext())
+ {
+ Node userNode = iter.nextNode();
+ if (userNode.getName().length() == 1)
+ {
+ continue;
+ }
+ List<String> ancestors = getAncestors(userNode.getName());
+
+ Node node = rootNode;
+
+ for (int i = 0, length = ancestors.size() - 1; i < length; i++)
+ {
+ String nodeName = ancestors.get(i);
+ try
{
- String nodeName = ancestors.get(i);
- try
- {
- node = node.getNode(nodeName);
- continue;
- }
- catch (PathNotFoundException e)
- {
- // ignore me
- }
-
- // The node doesn't exist we need to create it
- node = createNode(node, nodeName, nodeType, mixinTypes, permissions, false, false);
+ node = node.getNode(nodeName);
+ continue;
}
+ catch (PathNotFoundException e)
+ {
+ // ignore me
+ }
- userNode.getSession().move(userNode.getPath(), node.getPath() + "/" + ancestors.get(ancestors.size() - 1));
+ // The node doesn't exist we need to create it
+ node = createNode(node, nodeName, nodeType, mixinTypes, permissions, false, false);
}
+
+ userNode.getSession().move(userNode.getPath(), node.getPath() + "/" + ancestors.get(ancestors.size() - 1));
}
rootNode.getSession().save();
12 years, 8 months
exo-jcr SVN: r4993 - in jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext: distribution/impl and 1 other directories.
by do-not-reply@jboss.org
Author: tolusha
Date: 2011-09-28 05:19:18 -0400 (Wed, 28 Sep 2011)
New Revision: 4993
Modified:
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/distribution/DataDistributionType.java
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/distribution/impl/AbstractDataDistributionType.java
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/distribution/impl/DataDistributionByName.java
jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/hierarchy/impl/NodeHierarchyCreatorImpl.java
Log:
EXOJCR-1498: Migration tool and guideline for migration from 1.12.10-GA to 1.14.0.CR4-CP01
Modified: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/distribution/DataDistributionType.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/distribution/DataDistributionType.java 2011-09-28 09:13:04 UTC (rev 4992)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/distribution/DataDistributionType.java 2011-09-28 09:19:18 UTC (rev 4993)
@@ -108,4 +108,16 @@
* @throws RepositoryException if an error occurred during migration
*/
void migrate(Node rootNode) throws RepositoryException;
+
+ /**
+ * Migrate from old structure to new one.
+ *
+ * @param rootNode the root node under which the data to migrate is stored
+ * @param nodeType the node type to use in case we need to create the node
+ * @param mixinTypes the mixin types to use in case we need to create the node
+ * @param permissions the permissions to use in case we need to create the node
+ * @throws RepositoryException if an error occurred during migration
+ */
+ void migrate(Node rootNode, String nodeType, List<String> mixinTypes, Map<String, String[]> permissions)
+ throws RepositoryException;
}
Modified: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/distribution/impl/AbstractDataDistributionType.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/distribution/impl/AbstractDataDistributionType.java 2011-09-28 09:13:04 UTC (rev 4992)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/distribution/impl/AbstractDataDistributionType.java 2011-09-28 09:19:18 UTC (rev 4993)
@@ -43,7 +43,7 @@
/**
* The default node type to use when we create a new node
*/
- protected static final String DEFAULT_NODE_TYPE = "nt:unstructured".intern();
+ private static final String DEFAULT_NODE_TYPE = "nt:unstructured".intern();
/**
* The map defining all the locks available
@@ -113,7 +113,7 @@
// ignore me
}
// The node doesn't exist we need to create it
- node = createNode(node, nodeName, nodeType, mixinTypes, permissions, i == length - 1);
+ node = createNode(node, nodeName, nodeType, mixinTypes, permissions, i == length - 1, true);
}
return node;
}
@@ -151,6 +151,15 @@
}
/**
+ * {@inheritDoc}
+ */
+ public void migrate(Node rootNode, String nodeType, List<String> mixinTypes, Map<String, String[]> permissions)
+ throws RepositoryException
+ {
+ throw new UnsupportedOperationException("The method is not supported");
+ }
+
+ /**
* Creates the node of the given node type with the given node name directly under
* the given parent node, using the given mixin types and permissions
* @param parentNode the parent node
@@ -162,9 +171,9 @@
* @return the created node
* @throws RepositoryException if any exception occurs while creating the node
*/
- private Node createNode(final Node parentNode, final String nodeName, final String nodeType,
- final List<String> mixinTypes, final Map<String, String[]> permissions, final boolean isLeaf)
- throws RepositoryException
+ protected Node createNode(final Node parentNode, final String nodeName, final String nodeType,
+ final List<String> mixinTypes, final Map<String, String[]> permissions, final boolean isLeaf,
+ final boolean callSave) throws RepositoryException
{
Lock lock = getLock(parentNode, nodeName);
lock.lock();
@@ -212,7 +221,11 @@
}
}
}
- parentNode.save();
+
+ if (callSave)
+ {
+ parentNode.save();
+ }
return node;
}
finally
Modified: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/distribution/impl/DataDistributionByName.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/distribution/impl/DataDistributionByName.java 2011-09-28 09:13:04 UTC (rev 4992)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/distribution/impl/DataDistributionByName.java 2011-09-28 09:19:18 UTC (rev 4993)
@@ -22,6 +22,7 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
@@ -88,6 +89,15 @@
*/
public void migrate(Node rootNode) throws RepositoryException
{
+ migrate(rootNode, null, null, null);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void migrate(Node rootNode, String nodeType, List<String> mixinTypes, Map<String, String[]> permissions)
+ throws RepositoryException
+ {
NodeIterator iter = ((NodeImpl)rootNode).getNodesLazily(1);
if (iter.hasNext() && !iter.nextNode().getPath().endsWith(suffix))
{
@@ -113,7 +123,7 @@
}
// The node doesn't exist we need to create it
- node = node.addNode(nodeName, DEFAULT_NODE_TYPE);
+ node = createNode(node, nodeName, nodeType, mixinTypes, permissions, false, false);
}
userNode.getSession().move(userNode.getPath(), node.getPath() + "/" + ancestors.get(ancestors.size() - 1));
Modified: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/hierarchy/impl/NodeHierarchyCreatorImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/hierarchy/impl/NodeHierarchyCreatorImpl.java 2011-09-28 09:13:04 UTC (rev 4992)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/hierarchy/impl/NodeHierarchyCreatorImpl.java 2011-09-28 09:19:18 UTC (rev 4993)
@@ -93,8 +93,12 @@
}
jcrService_ = jcrService;
dataDistributionManager_ = dataDistributionManager;
- oldDistribution = params != null && Boolean.valueOf(params.getValueParam("old-user-distribution").getValue());
- autoMigrate = params != null && Boolean.valueOf(params.getValueParam("auto-migrate").getValue());
+ oldDistribution =
+ params != null && params.getValueParam("old-user-distribution") != null
+ && Boolean.valueOf(params.getValueParam("old-user-distribution").getValue());
+ autoMigrate =
+ params != null && params.getValueParam("auto-migrate") != null
+ && Boolean.valueOf(params.getValueParam("auto-migrate").getValue());
if (PropertyManager.isDevelopping() && !oldDistribution)
{
12 years, 8 months
exo-jcr SVN: r4992 - jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db.
by do-not-reply@jboss.org
Author: tolusha
Date: 2011-09-28 05:13:04 -0400 (Wed, 28 Sep 2011)
New Revision: 4992
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/OracleMultiDbJDBCConnection.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/OracleSingleDbJDBCConnection.java
Log:
EXOJCR-1543: using the same indexes as for MySQL
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/OracleMultiDbJDBCConnection.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/OracleMultiDbJDBCConnection.java 2011-09-28 08:31:57 UTC (rev 4991)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/OracleMultiDbJDBCConnection.java 2011-09-28 09:13:04 UTC (rev 4992)
@@ -87,7 +87,7 @@
FIND_PROPERTIES_BY_PARENTID_CQ = FIND_PROPERTIES_BY_PARENTID_CQ_QUERY;
FIND_ITEM_QPATH_BY_ID_CQ = FIND_ITEM_QPATH_BY_ID_CQ_QUERY;
FIND_PROPERTIES_BY_PARENTID_AND_PATTERN_CQ_TEMPLATE =
- "select /*+ INDEX(I JCR_IDX_MITEM_PARENT_ID) INDEX(V JCR_IDX_MVALUE_PROPERTY)*/ I.ID, I.PARENT_ID, I.NAME, I.VERSION, I.I_CLASS, I.I_INDEX, I.N_ORDER_NUM, I.P_TYPE, I.P_MULTIVALUED,"
+ "select /*+ INDEX(I JCR_FK_MITEM_PARENT) INDEX(V JCR_IDX_MVALUE_PROPERTY)*/ I.ID, I.PARENT_ID, I.NAME, I.VERSION, I.I_CLASS, I.I_INDEX, I.N_ORDER_NUM, I.P_TYPE, I.P_MULTIVALUED,"
+ " V.ORDER_NUM, V.DATA, V.STORAGE_DESC from JCR_MITEM I LEFT OUTER JOIN JCR_MVALUE V ON (V.PROPERTY_ID=I.ID)";
FIND_NODES_AND_PROPERTIES =
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/OracleSingleDbJDBCConnection.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/OracleSingleDbJDBCConnection.java 2011-09-28 08:31:57 UTC (rev 4991)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/OracleSingleDbJDBCConnection.java 2011-09-28 09:13:04 UTC (rev 4992)
@@ -87,7 +87,7 @@
FIND_PROPERTIES_BY_PARENTID_CQ = FIND_PROPERTIES_BY_PARENTID_CQ_QUERY;
FIND_ITEM_QPATH_BY_ID_CQ = FIND_ITEM_QPATH_BY_ID_CQ_QUERY;
FIND_PROPERTIES_BY_PARENTID_AND_PATTERN_CQ_TEMPLATE =
- "select /*+ INDEX(I JCR_IDX_SITEM_PARENT_ID) INDEX(V JCR_IDX_SVALUE_PROPERTY)*/ I.ID, I.PARENT_ID, I.NAME, I.VERSION, I.I_CLASS, I.I_INDEX, I.N_ORDER_NUM, I.P_TYPE, I.P_MULTIVALUED, V.ORDER_NUM,"
+ "select /*+ INDEX(I JCR_FK_SITEM_PARENT) INDEX(V JCR_IDX_SVALUE_PROPERTY)*/ I.ID, I.PARENT_ID, I.NAME, I.VERSION, I.I_CLASS, I.I_INDEX, I.N_ORDER_NUM, I.P_TYPE, I.P_MULTIVALUED, V.ORDER_NUM,"
+ " V.DATA, V.STORAGE_DESC from JCR_SITEM I LEFT OUTER JOIN JCR_SVALUE V ON (V.PROPERTY_ID=I.ID)";
FIND_NODES_AND_PROPERTIES =
12 years, 8 months