[exo-jcr-commits] exo-jcr SVN: r1229 - jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core.
do-not-reply at jboss.org
do-not-reply at jboss.org
Tue Dec 29 06:56:33 EST 2009
Author: tolusha
Date: 2009-12-29 06:56:33 -0500 (Tue, 29 Dec 2009)
New Revision: 1229
Modified:
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
Log:
EXOJCR-344: SessionDataManager small refactoring merge() methods
Modified: jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
===================================================================
--- jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java 2009-12-29 10:16:00 UTC (rev 1228)
+++ jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java 2009-12-29 11:56:33 UTC (rev 1229)
@@ -664,7 +664,7 @@
try
{
- return (List<NodeData>)merge(parent, transactionableManager, false, MERGE_NODES);
+ return (List<NodeData>)mergeNodes(parent, transactionableManager);
}
finally
{
@@ -704,7 +704,7 @@
try
{
- return (List<PropertyData>)merge(parent, transactionableManager, false, MERGE_PROPS);
+ return (List<PropertyData>)mergeProps(parent, transactionableManager);
}
finally
{
@@ -728,7 +728,7 @@
try
{
- return (List<PropertyData>)mergeList(parent, transactionableManager, false, MERGE_PROPS);
+ return (List<PropertyData>)mergeProps(parent, transactionableManager);
}
finally
{
@@ -1566,31 +1566,63 @@
}
/**
- * merges incoming data with changes stored in this log i.e: 1. incoming data still not modified
+ * Merges incoming node with changes stored in this log i.e: 1. incoming data still not modified
* if there are no corresponding changes 2. incoming data is refreshed with corresponding changes
* if any 3. new datas is added from changes 4. if chaged data is marked as "deleted" it removes
* from outgoing list WARN. THIS METHOD HAS SIBLING - mergeList, see below
*
* @param rootData
- * @param deep
- * if true - traverses
- * @param action
- * : MERGE_NODES | MERGE_PROPS | MERGE_ITEMS
* @return
*/
- protected List<? extends ItemData> merge(ItemData rootData, DataManager dataManager, boolean deep, int action)
- throws RepositoryException
+ protected List<? extends ItemData> mergeNodes(ItemData rootData, DataManager dataManager) throws RepositoryException
{
// 1 get all transient descendants
- List<ItemState> transientDescendants = new ArrayList<ItemState>();
- traverseTransientDescendants(rootData, false, action, transientDescendants);
+ List<ItemState> transientDescendants = new ArrayList(changesLog.getLastChildrenStates(rootData, true));
- // 2 get ALL persisted descendants
- Map<String, ItemData> descendants = new LinkedHashMap<String, ItemData>();
- List<? extends ItemData> result = traverseStoredDescendants(rootData, dataManager, false, action, descendants, false, transientDescendants);
+ if (!transientDescendants.isEmpty())
+ {
+ // 2 get ALL persisted descendants
+ Map<String, ItemData> descendants = new LinkedHashMap<String, ItemData>();
+ traverseStoredDescendants(rootData, dataManager, MERGE_NODES, descendants, false, transientDescendants);
- if (deep || !transientDescendants.isEmpty())
+ // merge data
+ for (ItemState state : transientDescendants)
+ {
+ ItemData data = state.getData();
+ if (!state.isDeleted())
+ descendants.put(data.getIdentifier(), data);
+ else
+ descendants.remove(data.getIdentifier());
+ }
+ Collection<ItemData> desc = descendants.values();
+ return new ArrayList<ItemData>(desc);
+ }
+ else
{
+ return new ArrayList<ItemData>(dataManager.getChildNodesData((NodeData)rootData));
+ }
+ }
+
+ /**
+ * Merges incoming property data with changes stored in this log i.e: 1. incoming data still not modified
+ * if there are no corresponding changes 2. incoming data is refreshed with corresponding changes
+ * if any 3. new datas is added from changes 4. if chaged data is marked as "deleted" it removes
+ * from outgoing list WARN. THIS METHOD HAS SIBLING - mergeList, see below
+ *
+ * @param rootData
+ * @return
+ */
+ protected List<? extends ItemData> mergeProps(ItemData rootData, DataManager dataManager) throws RepositoryException
+ {
+ // 1 get all transient descendants
+ List<ItemState> transientDescendants = new ArrayList(changesLog.getLastChildrenStates(rootData, false));
+
+ if (!transientDescendants.isEmpty())
+ {
+ // 2 get ALL persisted descendants
+ Map<String, ItemData> descendants = new LinkedHashMap<String, ItemData>();
+ traverseStoredDescendants(rootData, dataManager, MERGE_PROPS, descendants, false, transientDescendants);
+
// merge data
for (ItemState state : transientDescendants)
{
@@ -1600,29 +1632,12 @@
else
descendants.remove(data.getIdentifier());
}
- Collection<? extends ItemData> desc = result != null ? result : descendants.values();
- List<ItemData> retval;
- if (deep)
- {
- int size = desc.size();
- retval = new ArrayList<ItemData>(size < 10 ? 10 : size);
-
- for (ItemData itemData : desc)
- {
- retval.add(itemData);
- if (deep)
- retval.addAll(merge(itemData, dataManager, true, action));
- }
- }
- else
- {
- retval = new ArrayList<ItemData>(desc);
- }
- return retval;
+ Collection<ItemData> desc = descendants.values();
+ return new ArrayList<ItemData>(desc);
}
else
{
- return new ArrayList<ItemData>(result);
+ return new ArrayList<ItemData>(dataManager.getChildPropertiesData((NodeData)rootData));
}
}
@@ -1643,14 +1658,14 @@
// 1 get all transient descendants
List<ItemState> transientDescendants = new ArrayList<ItemState>();
- traverseTransientDescendants(rootData, false, action, transientDescendants);
+ traverseTransientDescendants(rootData, action, transientDescendants);
- // 2 get ALL persisted descendants
- Map<String, ItemData> descendants = new LinkedHashMap<String, ItemData>();
- List<? extends ItemData> result = traverseStoredDescendants(rootData, dataManager, false, action, descendants, true, transientDescendants);
-
if (deep || !transientDescendants.isEmpty())
{
+ // 2 get ALL persisted descendants
+ Map<String, ItemData> descendants = new LinkedHashMap<String, ItemData>();
+ traverseStoredDescendants(rootData, dataManager, action, descendants, true, transientDescendants);
+
// merge data
for (ItemState state : transientDescendants)
{
@@ -1660,7 +1675,7 @@
else
descendants.remove(data.getIdentifier());
}
- Collection<? extends ItemData> desc = result != null ? result : descendants.values();
+ Collection<ItemData> desc = descendants.values();
List<ItemData> retval;
if (deep)
{
@@ -1678,11 +1693,11 @@
{
retval = new ArrayList<ItemData>(desc);
}
- return retval;
+ return retval;
}
else
{
- return new ArrayList<ItemData>(result);
+ return new ArrayList<ItemData>(getStoredDescendants(rootData, dataManager, action));
}
}
@@ -1696,78 +1711,83 @@
* @param ret
* @throws RepositoryException
*/
- private List<? extends ItemData> traverseStoredDescendants(ItemData parent, DataManager dataManager, boolean deep, int action,
+ private void traverseStoredDescendants(ItemData parent, DataManager dataManager, int action,
Map<String, ItemData> ret, boolean listOnly, List<ItemState> transientDescendants) throws RepositoryException
{
if (parent.isNode())
{
- List<ItemData> childItems = null;
if (action != MERGE_PROPS)
{
List<NodeData> childNodes = dataManager.getChildNodesData((NodeData)parent);
- if (deep || !transientDescendants.isEmpty())
+ for (NodeData childNode : childNodes)
{
- for (NodeData childNode : childNodes)
- {
- ret.put(childNode.getIdentifier(), childNode);
+ ret.put(childNode.getIdentifier(), childNode);
- if (log.isDebugEnabled())
- log.debug("Traverse stored (N) " + childNode.getQPath().getAsString());
-
- // TODO [PN] Not used
- if (deep)
- traverseStoredDescendants(childNode, dataManager, deep, action, ret, listOnly, transientDescendants);
- }
+ if (log.isDebugEnabled())
+ log.debug("Traverse stored (N) " + childNode.getQPath().getAsString());
}
- else
- {
- if (action != MERGE_NODES)
- {
- childItems = new ArrayList<ItemData>(childNodes);
- }
- else
- {
- return childNodes;
- }
- }
}
if (action != MERGE_NODES)
{
List<PropertyData> childProps =
listOnly ? dataManager.listChildPropertiesData((NodeData)parent) : dataManager
.getChildPropertiesData((NodeData)parent);
- if (deep || !transientDescendants.isEmpty())
+ outer : for (PropertyData childProp : childProps)
{
- outer : for (PropertyData childProp : childProps)
+ for (ItemState transientState : transientDescendants)
{
- for (ItemState transientState : transientDescendants)
+ if (!transientState.isNode() && !transientState.isDeleted()
+ && transientState.getData().getQPath().getDepth() == childProp.getQPath().getDepth()
+ && transientState.getData().getQPath().getName().equals(childProp.getQPath().getName()))
{
- if (!transientState.isNode() && !transientState.isDeleted()
- && transientState.getData().getQPath().getDepth() == childProp.getQPath().getDepth()
- && transientState.getData().getQPath().getName().equals(childProp.getQPath().getName()))
- {
- continue outer;
- }
+ continue outer;
}
- ret.put(childProp.getIdentifier(), childProp);
+ }
+ ret.put(childProp.getIdentifier(), childProp);
- if (log.isDebugEnabled())
- log.debug("Traverse stored (P) " + childProp.getQPath().getAsString());
- }
+ if (log.isDebugEnabled())
+ log.debug("Traverse stored (P) " + childProp.getQPath().getAsString());
}
- else
- {
- if (action != MERGE_PROPS)
- {
- childItems.addAll(childProps);
- }
- else
- {
- return childProps;
- }
- }
}
+ }
+ }
+
+ /**
+ * Get all stored descendants for the given parent node
+ *
+ * @param parent
+ * @param dataManager
+ * @param action
+ * @throws RepositoryException
+ */
+ private List<? extends ItemData> getStoredDescendants(ItemData parent, DataManager dataManager, int action)
+ throws RepositoryException
+ {
+ if (parent.isNode())
+ {
+ List<ItemData> childItems = null;
+
+ List<NodeData> childNodes = dataManager.getChildNodesData((NodeData)parent);
+ if (action != MERGE_NODES)
+ {
+ childItems = new ArrayList<ItemData>(childNodes);
+ }
+ else
+ {
+ return childNodes;
+ }
+
+ List<PropertyData> childProps = dataManager.getChildPropertiesData((NodeData)parent);
+ if (action != MERGE_PROPS)
+ {
+ childItems.addAll(childProps);
+ }
+ else
+ {
+ return childProps;
+ }
+
return childItems;
}
return null;
@@ -1782,7 +1802,7 @@
* @param ret
* @throws RepositoryException
*/
- private void traverseTransientDescendants(ItemData parent, boolean deep, int action, List<ItemState> ret)
+ private void traverseTransientDescendants(ItemData parent, int action, List<ItemState> ret)
throws RepositoryException
{
@@ -1794,9 +1814,6 @@
for (ItemState childNode : childNodes)
{
ret.add(childNode);
-
- if (deep)
- traverseTransientDescendants(childNode.getData(), deep, action, ret);
}
}
if (action != MERGE_NODES)
More information about the exo-jcr-commits
mailing list