Author: nfilotto
Date: 2009-12-24 05:29:04 -0500 (Thu, 24 Dec 2009)
New Revision: 1159
Modified:
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/access/AccessControlEntry.java
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/access/AccessManager.java
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/nodetype/ItemDefinitionDataHolder.java
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java
Log:
EXOJCR-344: Removal of the bottlenecks found with JProfiler
* The size of the array list is given in the constructor when it is possible
* We avoid to iterate over an iterator on a big set of data we use for (int i = 0, length
= nodeDatas.size(); i < length; i++) instead of for (NodeData data : nodeDatas)
* We store the corresponding MembershipEntry of the identity of a given AccessControlEntry
to avoid to call MembershipEntry.parse(ace.getIdentity()) too often
* We store the item definition in a tree of maps in ItemDefinitionDataHolder to avoid key
creation to get, update or remove an entry
* We use a ConcurrentHashMap in CacheableWorkspaceDataManager to allow to start different
DataRequest in parallel
Modified:
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/access/AccessControlEntry.java
===================================================================
---
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/access/AccessControlEntry.java 2009-12-24
08:18:30 UTC (rev 1158)
+++
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/access/AccessControlEntry.java 2009-12-24
10:29:04 UTC (rev 1159)
@@ -18,6 +18,8 @@
*/
package org.exoplatform.services.jcr.access;
+import org.exoplatform.services.security.MembershipEntry;
+
/**
* Created by The eXo Platform SAS.
*
@@ -27,10 +29,12 @@
public class AccessControlEntry
{
- private String identity;
+ private final String identity;
- private String permission;
+ private final String permission;
+ private volatile MembershipEntry membership;
+
public static final String DELIMITER = " ";
public AccessControlEntry(String identity, String permission)
@@ -49,6 +53,21 @@
return permission;
}
+ public MembershipEntry getMembershipEntry()
+ {
+ if (membership == null)
+ {
+ synchronized (this)
+ {
+ if (membership == null)
+ {
+ membership = MembershipEntry.parse(getIdentity());
+ }
+ }
+ }
+ return membership;
+ }
+
public String getAsString()
{
return identity + AccessControlEntry.DELIMITER + permission;
Modified:
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/access/AccessManager.java
===================================================================
---
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/access/AccessManager.java 2009-12-24
08:18:30 UTC (rev 1158)
+++
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/access/AccessManager.java 2009-12-24
10:29:04 UTC (rev 1159)
@@ -25,7 +25,6 @@
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.security.Identity;
-import org.exoplatform.services.security.MembershipEntry;
import java.util.ArrayList;
import java.util.HashMap;
@@ -176,8 +175,9 @@
private boolean isPermissionMatch(List<AccessControlEntry> existedPermission,
String testPermission, Identity user)
{
- for (AccessControlEntry ace : existedPermission)
+ for (int i = 0, length = existedPermission.size(); i < length; i++)
{
+ AccessControlEntry ace = existedPermission.get(i);
// match action
if (ace.getPermission().equals(testPermission))
{
@@ -191,7 +191,7 @@
return true;
}
- else if (user.isMemberOf(MembershipEntry.parse(ace.getIdentity())))
+ else if (user.isMemberOf(ace.getMembershipEntry()))
return true;
}
}
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-24
08:18:30 UTC (rev 1158)
+++
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java 2009-12-24
10:29:04 UTC (rev 1159)
@@ -43,7 +43,6 @@
import
org.exoplatform.services.jcr.impl.dataflow.persistent.LocalWorkspaceDataManagerStub;
import org.exoplatform.services.jcr.impl.dataflow.session.SessionChangesLog;
import org.exoplatform.services.jcr.impl.dataflow.session.TransactionableDataManager;
-import
org.exoplatform.services.jcr.impl.dataflow.session.WorkspaceStorageDataManagerProxy;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
@@ -522,9 +521,11 @@
*/
public List<PropertyImpl> getReferences(String identifier) throws
RepositoryException
{
- List<PropertyImpl> refs = new ArrayList<PropertyImpl>();
- for (PropertyData data : transactionableManager.getReferencesData(identifier,
true))
+ List<PropertyData> refDatas =
transactionableManager.getReferencesData(identifier, true);
+ List<PropertyImpl> refs = new
ArrayList<PropertyImpl>(refDatas.size());
+ for (int i = 0, length = refDatas.size(); i < length; i++)
{
+ PropertyData data = refDatas.get(i);
// check for permission for read
// [PN] 21.12.07 use item data
NodeData parent = (NodeData)getItemData(data.getParentIdentifier());
@@ -574,11 +575,12 @@
try
{
// merge data from changesLog with data from txManager
- List<NodeImpl> nodes = new ArrayList<NodeImpl>();
List<NodeData> nodeDatas = getChildNodesData(parent);
+ List<NodeImpl> nodes = new ArrayList<NodeImpl>(nodeDatas.size());
- for (NodeData data : nodeDatas)
+ for (int i = 0, length = nodeDatas.size(); i < length; i++)
{
+ NodeData data = nodeDatas.get(i);
NodeImpl item = itemFactory.createNode(data, parent);
session.getActionHandler().postRead(item);
@@ -625,9 +627,11 @@
try
{
- List<PropertyImpl> props = new ArrayList<PropertyImpl>();
- for (PropertyData data : getChildPropertiesData(parent))
+ List<PropertyData> propDatas = getChildPropertiesData(parent);
+ List<PropertyImpl> props = new
ArrayList<PropertyImpl>(propDatas.size());
+ for (int i = 0, length = propDatas.size(); i < length; i++)
{
+ PropertyData data = propDatas.get(i);
ItemImpl item = itemFactory.createItem(data);
session.getActionHandler().postRead(item);
if (accessManager.hasPermission(parent.getACL(), new
String[]{PermissionType.READ}, session.getUserState()
@@ -1537,15 +1541,25 @@
else
descendants.remove(data.getIdentifier());
}
- List<ItemData> retval = new ArrayList<ItemData>();
Collection<ItemData> desc = descendants.values();
+ List<ItemData> retval;
+ if (deep)
+ {
+ int size = desc.size();
+ retval = new ArrayList<ItemData>(size < 10 ? 10 : size);
- for (ItemData itemData : desc)
+ for (ItemData itemData : desc)
+ {
+ retval.add(itemData);
+ if (deep)
+ retval.addAll(merge(itemData, dataManager, true, action));
+ }
+ }
+ else
{
- retval.add(itemData);
- if (deep)
- retval.addAll(merge(itemData, dataManager, true, action));
+ retval = new ArrayList<ItemData>(desc);
}
+
return retval;
}
@@ -1581,14 +1595,23 @@
else
descendants.remove(data.getIdentifier());
}
- List<ItemData> retval = new ArrayList<ItemData>();
Collection<ItemData> desc = descendants.values();
+ List<ItemData> retval;
+ if (deep)
+ {
+ int size = desc.size();
+ retval = new ArrayList<ItemData>(size < 10 ? 10 : size);
- for (ItemData itemData : desc)
+ for (ItemData itemData : desc)
+ {
+ retval.add(itemData);
+ if (deep)
+ retval.addAll(mergeList(itemData, dataManager, true, action));
+ }
+ }
+ else
{
- retval.add(itemData);
- if (deep)
- retval.addAll(mergeList(itemData, dataManager, true, action));
+ retval = new ArrayList<ItemData>(desc);
}
return retval;
}
Modified:
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ItemDefinitionDataHolder.java
===================================================================
---
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ItemDefinitionDataHolder.java 2009-12-24
08:18:30 UTC (rev 1158)
+++
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ItemDefinitionDataHolder.java 2009-12-24
10:29:04 UTC (rev 1159)
@@ -28,6 +28,8 @@
import org.exoplatform.services.log.Log;
import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
/**
* Created by The eXo Platform SAS. <br/>
@@ -45,22 +47,23 @@
private static Log LOG =
ExoLogger.getLogger("jcr.ItemDefinitionDataHolder");
- private final HashMap<ChildNodeDefKey, NodeDefinitionData> nodeDefinitions;
+ private final Map<InternalQName, Map<InternalQName, Map<InternalQName,
NodeDefinitionData>>> nodeDefinitions;
- private final HashMap<PropertyDefKey, PropertyDefinitionData>
propertyDefinitions;
+ private final Map<InternalQName, Map<InternalQName, Map<Boolean,
PropertyDefinitionData>>> propertyDefinitions;
- private final HashMap<DefaultNodeDefKey, NodeDefinitionData>
defNodeDefinitions;
+ private final Map<InternalQName, Map<InternalQName, NodeDefinitionData>>
defNodeDefinitions;
public ItemDefinitionDataHolder()
{
- this.nodeDefinitions = new HashMap<ChildNodeDefKey, NodeDefinitionData>();
- this.propertyDefinitions = new HashMap<PropertyDefKey,
PropertyDefinitionData>();
- this.defNodeDefinitions = new HashMap<DefaultNodeDefKey,
NodeDefinitionData>();
+ this.nodeDefinitions = new HashMap<InternalQName, Map<InternalQName,
Map<InternalQName, NodeDefinitionData>>>();
+ this.propertyDefinitions = new HashMap<InternalQName, Map<InternalQName,
Map<Boolean, PropertyDefinitionData>>>();
+ this.defNodeDefinitions = new HashMap<InternalQName, Map<InternalQName,
NodeDefinitionData>>();
}
- private ItemDefinitionDataHolder(HashMap<ChildNodeDefKey, NodeDefinitionData>
nodeDefinitions,
- HashMap<PropertyDefKey, PropertyDefinitionData> propertyDefinitions,
- HashMap<DefaultNodeDefKey, NodeDefinitionData> defNodeDefinitions)
+ private ItemDefinitionDataHolder(
+ Map<InternalQName, Map<InternalQName, Map<InternalQName,
NodeDefinitionData>>> nodeDefinitions,
+ Map<InternalQName, Map<InternalQName, Map<Boolean,
PropertyDefinitionData>>> propertyDefinitions,
+ Map<InternalQName, Map<InternalQName, NodeDefinitionData>>
defNodeDefinitions)
{
this.nodeDefinitions = nodeDefinitions;
this.propertyDefinitions = propertyDefinitions;
@@ -92,7 +95,7 @@
for (InternalQName parentNodeType : nodeTypes)
{
- NodeDefinitionData def = defNodeDefinitions.get(new
DefaultNodeDefKey(parentNodeType, childName));
+ NodeDefinitionData def = getNodeDefinitionDataInternal(parentNodeType,
childName);
if (def != null)
return def;
}
@@ -100,7 +103,7 @@
// residual
for (InternalQName parentNodeType : nodeTypes)
{
- NodeDefinitionData def = defNodeDefinitions.get(new
DefaultNodeDefKey(parentNodeType, Constants.JCR_ANY_NAME));
+ NodeDefinitionData def = getNodeDefinitionDataInternal(parentNodeType,
Constants.JCR_ANY_NAME);
if (def != null)
return def;
}
@@ -118,13 +121,12 @@
InternalQName parentNodeType)
{
- PropertyDefKey key = new PropertyDefKey(parentNodeType, childName, multiValued);
- PropertyDefinitionData def = propertyDefinitions.get(key);
+ PropertyDefinitionData def = getPropertyDefinitionInternal(parentNodeType,
childName, multiValued);
// try residual def
if (def == null)
{
- return propertyDefinitions.get(new PropertyDefKey(parentNodeType,
Constants.JCR_ANY_NAME, multiValued));
+ return getPropertyDefinitionInternal(parentNodeType, Constants.JCR_ANY_NAME,
multiValued);
}
return def;
@@ -145,12 +147,12 @@
for (InternalQName nt : nodeTypes)
{
// single-valued
- PropertyDefinitionData def = propertyDefinitions.get(new PropertyDefKey(nt,
propertyName, false));
+ PropertyDefinitionData def = getPropertyDefinitionInternal(nt, propertyName,
false);
if (def != null && pdefs.getDefinition(def.isMultiple()) == null)
pdefs.setDefinition(def); // set if same is not exists
// multi-valued
- def = propertyDefinitions.get(new PropertyDefKey(nt, propertyName, true));
+ def = getPropertyDefinitionInternal(nt, propertyName, true);
if (def != null && pdefs.getDefinition(def.isMultiple()) == null)
pdefs.setDefinition(def); // set if same is not exists
@@ -177,25 +179,21 @@
// put required node type defs
for (InternalQName rnt : nodeDef.getRequiredPrimaryTypes())
{
- ChildNodeDefKey nodeDefKey = new ChildNodeDefKey(name, nodeDef.getName(),
rnt);
- nodeDefinitions.put(nodeDefKey, nodeDef);
-
+ addNodeDefinitionDataInternal(name, nodeDef.getName(), rnt, nodeDef);
if (LOG.isDebugEnabled())
{
LOG.debug("NodeDef added: parent NT: " + name.getAsString() +
" child nodeName: "
- + nodeDef.getName().getAsString() + " childNT: " +
rnt.getAsString() + " hash: "
- + nodeDefKey.hashCode());
+ + nodeDef.getName().getAsString() + " childNT: " +
rnt.getAsString());
}
}
// put default node definition
- DefaultNodeDefKey defNodeDefKey = new DefaultNodeDefKey(name,
nodeDef.getName());
- defNodeDefinitions.put(defNodeDefKey, nodeDef);
+ addNodeDefinitionDataInternal(name, nodeDef.getName(), nodeDef);
if (LOG.isDebugEnabled())
{
LOG.debug("Default NodeDef added: parent NT: " + name.getAsString()
+ " child nodeName: "
- + nodeDef.getName() + " hash: " + defNodeDefKey.hashCode());
+ + nodeDef.getName());
}
}
@@ -203,14 +201,12 @@
PropertyDefinitionData[] propDefs = nodeType.getDeclaredPropertyDefinitions();
for (PropertyDefinitionData propDef : propDefs)
{
- PropertyDefKey propDefKey = new PropertyDefKey(name, propDef.getName(),
propDef.isMultiple());
- propertyDefinitions.put(propDefKey, propDef);
-
+ addPropertyDefinitionInternal(name, propDef.getName(), propDef.isMultiple(),
propDef);
+
if (LOG.isDebugEnabled())
{
LOG.debug("PropDef added: parent NT: " + name.getAsString() +
" child propName: "
- + propDef.getName().getAsString() + " isMultiple: " +
propDef.isMultiple() + " hash: "
- + propDefKey.hashCode());
+ + propDef.getName().getAsString() + " isMultiple: " +
propDef.isMultiple());
}
}
@@ -225,40 +221,32 @@
// remove required node type defs
for (InternalQName rnt : nodeDef.getRequiredPrimaryTypes())
{
- ChildNodeDefKey nodeDefKey = new ChildNodeDefKey(name, nodeDef.getName(),
rnt);
- nodeDefinitions.remove(nodeDefKey);
-
+ removeNodeDefinitionDataInternal(name, nodeDef.getName(), rnt);
if (LOG.isDebugEnabled())
{
LOG.debug("NodeDef removed: parent NT: " + name.getAsString() +
" child nodeName: "
- + nodeDef.getName().getAsString() + " childNT: " +
rnt.getAsString() + " hash: "
- + nodeDefKey.hashCode());
+ + nodeDef.getName().getAsString() + " childNT: " +
rnt.getAsString());
}
}
// remove default node definition
- DefaultNodeDefKey defNodeDefKey = new DefaultNodeDefKey(name,
nodeDef.getName());
- defNodeDefinitions.remove(defNodeDefKey);
-
+ removeNodeDefinitionDataInternal(name, nodeDef.getName());
if (LOG.isDebugEnabled())
{
LOG.debug("Default NodeDef removed: parent NT: " +
name.getAsString() + " child nodeName: "
- + nodeDef.getName() + " hash: " + defNodeDefKey.hashCode());
- }
+ + nodeDef.getName());
+ }
}
// remove defs
PropertyDefinitionData[] propDefs = nodeType.getDeclaredPropertyDefinitions();
for (PropertyDefinitionData propDef : propDefs)
{
- PropertyDefKey propDefKey = new PropertyDefKey(name, propDef.getName(),
propDef.isMultiple());
- propertyDefinitions.remove(propDefKey);
-
+ removePropertyDefinitionInternal(name, propDef.getName(),
propDef.isMultiple());
if (LOG.isDebugEnabled())
{
LOG.debug("PropDef remode: parent NT: " + name.getAsString() +
" child propName: "
- + propDef.getName().getAsString() + " isMultiple: " +
propDef.isMultiple() + " hash: "
- + propDefKey.hashCode());
+ + propDef.getName().getAsString() + " isMultiple: " +
propDef.isMultiple());
}
}
}
@@ -267,299 +255,171 @@
InternalQName childName, InternalQName childNodeType)
{
- NodeDefinitionData def = nodeDefinitions.get(new ChildNodeDefKey(parentNodeType,
childName, childNodeType));
+ NodeDefinitionData def = getNodeDefinitionDataInternal(parentNodeType, childName,
childNodeType);
if (def != null)
return def;
return def;
}
- /**
- * Create copy of holder.
- *
- * @return
- */
- protected ItemDefinitionDataHolder createCopy()
+ private NodeDefinitionData getNodeDefinitionDataInternal(InternalQName parentNodeType,
InternalQName childName)
{
- return new ItemDefinitionDataHolder(new HashMap<ChildNodeDefKey,
NodeDefinitionData>(nodeDefinitions),
- new HashMap<PropertyDefKey, PropertyDefinitionData>(propertyDefinitions),
- new HashMap<DefaultNodeDefKey, NodeDefinitionData>(defNodeDefinitions));
+ Map<InternalQName, NodeDefinitionData> defs =
defNodeDefinitions.get(parentNodeType);
+ if (defs == null)
+ {
+ return null;
+ }
+ return defs.get(childName);
}
- private class ChildNodeDefKey extends ItemDefKey
+ private void addNodeDefinitionDataInternal(InternalQName parentNodeType, InternalQName
childName,
+ NodeDefinitionData nodeDef)
{
- private int hashCode = -1;
+ Map<InternalQName, NodeDefinitionData> defs =
defNodeDefinitions.get(parentNodeType);
+ if (defs == null)
+ {
+ defs = new HashMap<InternalQName, NodeDefinitionData>();
+ defNodeDefinitions.put(parentNodeType, defs);
+ }
- private final InternalQName childNodeType;
+ defs.put(childName, nodeDef);
+ }
- private ChildNodeDefKey(InternalQName parentNodeType, InternalQName childName,
InternalQName childNodeType)
+ private void removeNodeDefinitionDataInternal(InternalQName parentNodeType,
InternalQName childName)
+ {
+ Map<InternalQName, NodeDefinitionData> defs =
defNodeDefinitions.get(parentNodeType);
+ if (defs == null)
{
- super(parentNodeType, childName);
- this.childNodeType = childNodeType;
+ return;
}
+ defs.remove(childName);
+ }
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean equals(Object obj)
+ private PropertyDefinitionData getPropertyDefinitionInternal(InternalQName
parentNodeType, InternalQName childName,
+ boolean multiValued)
+ {
+ Map<InternalQName, Map<Boolean, PropertyDefinitionData>> defs =
propertyDefinitions.get(parentNodeType);
+ if (defs == null)
{
- if (this == obj)
- {
- return true;
- }
- if (!super.equals(obj))
- {
- return false;
- }
- if (!(obj instanceof ChildNodeDefKey))
- {
- return false;
- }
- ChildNodeDefKey other = (ChildNodeDefKey)obj;
- if (!getOuterType().equals(other.getOuterType()))
- {
- return false;
- }
- if (childNodeType == null)
- {
- if (other.childNodeType != null)
- {
- return false;
- }
- }
- else if (!childNodeType.equals(other.childNodeType))
- {
- return false;
- }
- return true;
+ return null;
}
-
- /**
- * {@inheritDoc}
- */
- @Override
- public int hashCode()
+ Map<Boolean, PropertyDefinitionData> def = defs.get(childName);
+ if (def == null)
{
- if (hashCode == -1)
- {
- final int prime = 31;
- int result = super.hashCode();
- result = prime * result + getOuterType().hashCode();
- result = prime * result + ((childNodeType == null) ? 0 :
childNodeType.hashCode());
- hashCode = result;
- }
-
- return hashCode;
+ return null;
}
+ return def.get(multiValued);
+ }
- /**
- * {@inheritDoc}
- */
- @Override
- public String toString()
+ private void addPropertyDefinitionInternal(InternalQName parentNodeType, InternalQName
childName,
+ boolean multiValued, PropertyDefinitionData propDef)
+ {
+ Map<InternalQName, Map<Boolean, PropertyDefinitionData>> defs =
propertyDefinitions.get(parentNodeType);
+ if (defs == null)
{
- String result = super.toString();
- result += ((childNodeType == null) ? "" :
childNodeType.getAsString());
-
- return result;
+ defs = new HashMap<InternalQName, Map<Boolean,
PropertyDefinitionData>>();
+ propertyDefinitions.put(parentNodeType, defs);
}
-
- private ItemDefinitionDataHolder getOuterType()
+ Map<Boolean, PropertyDefinitionData> def = defs.get(childName);
+ if (def == null)
{
- return ItemDefinitionDataHolder.this;
+ def = new HashMap<Boolean, PropertyDefinitionData>();
+ defs.put(childName, def);
}
+ def.put(multiValued, propDef);
}
-
- private class DefaultNodeDefKey extends ItemDefKey
+
+ private void removePropertyDefinitionInternal(InternalQName parentNodeType,
InternalQName childName,
+ boolean multiValued)
{
-
- private DefaultNodeDefKey(InternalQName parentNodeType, InternalQName childName)
+ Map<InternalQName, Map<Boolean, PropertyDefinitionData>> defs =
propertyDefinitions.get(parentNodeType);
+ if (defs == null)
{
- super(parentNodeType, childName);
+ return;
}
+ Map<Boolean, PropertyDefinitionData> def = defs.get(childName);
+ if (def == null)
+ {
+ return;
+ }
+ def.remove(multiValued);
}
-
- /**
- * @see about hash code generation:
- *
http://www.geocities.com/technofundo/tech/java/equalhash.html
- */
- private abstract class ItemDefKey
+
+ private NodeDefinitionData getNodeDefinitionDataInternal(InternalQName parentNodeType,
InternalQName childName,
+ InternalQName childNodeType)
{
-
- private final InternalQName parentNodeType;
-
- private final InternalQName childName;
-
- private int hashCode = -1;
-
- protected ItemDefKey(InternalQName parentNodeType, InternalQName childName)
+ Map<InternalQName, Map<InternalQName, NodeDefinitionData>> defs =
nodeDefinitions.get(parentNodeType);
+ if (defs == null)
{
- this.parentNodeType = parentNodeType;
- this.childName = childName;
+ return null;
}
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean equals(Object obj)
+ Map<InternalQName, NodeDefinitionData> def = defs.get(childName);
+ if (def == null)
{
- if (this == obj)
- {
- return true;
- }
- if (obj == null)
- {
- return false;
- }
- if (!(obj instanceof ItemDefKey))
- {
- return false;
- }
- ItemDefKey other = (ItemDefKey)obj;
- if (!getOuterType().equals(other.getOuterType()))
- {
- return false;
- }
- if (childName == null)
- {
- if (other.childName != null)
- {
- return false;
- }
- }
- else if (!childName.equals(other.childName))
- {
- return false;
- }
- if (parentNodeType == null)
- {
- if (other.parentNodeType != null)
- {
- return false;
- }
- }
- else if (!parentNodeType.equals(other.parentNodeType))
- {
- return false;
- }
- return true;
+ return null;
}
-
- /**
- * {@inheritDoc}
- */
- @Override
- public int hashCode()
+ return def.get(childNodeType);
+ }
+
+ private void addNodeDefinitionDataInternal(InternalQName parentNodeType, InternalQName
childName,
+ InternalQName childNodeType, NodeDefinitionData nodeDef)
+ {
+ Map<InternalQName, Map<InternalQName, NodeDefinitionData>> defs =
nodeDefinitions.get(parentNodeType);
+ if (defs == null)
{
- if (hashCode == -1)
- {
- final int prime = 31;
- int result = 1;
- result = prime * result + getOuterType().hashCode();
- result = prime * result + ((childName == null) ? 0 : childName.hashCode());
- result = prime * result + ((parentNodeType == null) ? 0 :
parentNodeType.hashCode());
- hashCode = result;
- }
- return hashCode;
+ defs = new HashMap<InternalQName, Map<InternalQName,
NodeDefinitionData>>();
+ nodeDefinitions.put(parentNodeType, defs);
}
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String toString()
+ Map<InternalQName, NodeDefinitionData> def = defs.get(childName);
+ if (def == null)
{
- String result = "";
- result += ((childName == null) ? 0 : childName.getAsString());
- result += ((parentNodeType == null) ? 0 : parentNodeType.getAsString());
- return result;
+ def = new HashMap<InternalQName, NodeDefinitionData>();
+ defs.put(childName, def);
}
- private ItemDefinitionDataHolder getOuterType()
- {
- return ItemDefinitionDataHolder.this;
- }
+ def.put(childNodeType, nodeDef);
}
-
- private class PropertyDefKey extends ItemDefKey
+
+ private void removeNodeDefinitionDataInternal(InternalQName parentNodeType,
InternalQName childName,
+ InternalQName childNodeType)
{
-
- private final boolean multiValued;
-
- private int hashCode = -1;
-
- private PropertyDefKey(InternalQName parentNodeType, InternalQName childName,
boolean multiValued)
+ Map<InternalQName, Map<InternalQName, NodeDefinitionData>> defs =
nodeDefinitions.get(parentNodeType);
+ if (defs == null)
{
- super(parentNodeType, childName);
- this.multiValued = multiValued;
+ return;
}
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean equals(Object obj)
+ Map<InternalQName, NodeDefinitionData> def = defs.get(childName);
+ if (def == null)
{
- if (this == obj)
- {
- return true;
- }
- if (!super.equals(obj))
- {
- return false;
- }
- if (!(obj instanceof PropertyDefKey))
- {
- return false;
- }
- PropertyDefKey other = (PropertyDefKey)obj;
- if (!getOuterType().equals(other.getOuterType()))
- {
- return false;
- }
- if (multiValued != other.multiValued)
- {
- return false;
- }
- return true;
+ return;
}
-
- /**
- * {@inheritDoc}
- */
- @Override
- public int hashCode()
+ def.remove(childNodeType);
+ }
+
+ /**
+ * Create copy of holder.
+ *
+ * @return
+ */
+ protected ItemDefinitionDataHolder createCopy()
+ {
+ return new ItemDefinitionDataHolder(cloneMap(nodeDefinitions),
cloneMap(propertyDefinitions),
+ cloneMap(defNodeDefinitions));
+ }
+
+ @SuppressWarnings("unchecked")
+ private static <K,V> Map<K,V> cloneMap(Map<? extends K, ? extends V>
map)
+ {
+ Map<K,V> copyMap = (Map<K,V>)((HashMap<K, V>)map).clone();
+
+ for (Entry<K, V> entry : copyMap.entrySet())
{
- if (hashCode == -1)
+ if (entry.getValue() instanceof Map<?, ?>)
{
- final int prime = 31;
- int result = super.hashCode();
- result = prime * result + getOuterType().hashCode();
- result = prime * result + (multiValued ? 1231 : 1237);
- hashCode = result;
+ entry.setValue((V)cloneMap((Map<?, ?>)entry.getValue()));
}
-
- return hashCode;
}
-
- /**
- * {@inheritDoc}
- */
- @Override
- public String toString()
- {
- String result = super.toString();
- result += " multiValued=" + multiValued;
- return result;
- }
-
- private ItemDefinitionDataHolder getOuterType()
- {
- return ItemDefinitionDataHolder.this;
- }
+ return copyMap;
}
-
}
Modified:
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java
===================================================================
---
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java 2009-12-24
08:18:30 UTC (rev 1158)
+++
jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/CacheableWorkspaceDataManager.java 2009-12-24
10:29:04 UTC (rev 1159)
@@ -26,9 +26,9 @@
import org.exoplatform.services.jcr.impl.storage.SystemDataContainerHolder;
import org.exoplatform.services.jcr.storage.WorkspaceDataContainer;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CountDownLatch;
import javax.jcr.RepositoryException;
@@ -178,11 +178,7 @@
*/
DataRequest waitSame()
{
- DataRequest prev = null;
- synchronized (requestCache)
- {
- prev = requestCache.get(this.hashCode());
- }
+ DataRequest prev = requestCache.get(this.hashCode());
if (prev != null)
prev.await();
return this;
@@ -193,10 +189,7 @@
*/
void start()
{
- synchronized (requestCache)
- {
- requestCache.put(this.hashCode(), this);
- }
+ requestCache.put(this.hashCode(), this);
}
/**
@@ -206,10 +199,7 @@
void done()
{
this.ready.countDown();
- synchronized (requestCache)
- {
- requestCache.remove(this.hashCode());
- }
+ requestCache.remove(this.hashCode());
}
/**
@@ -262,7 +252,7 @@
{
super(dataContainer, systemDataContainerHolder);
this.cache = cache;
- this.requestCache = new HashMap<Integer, DataRequest>();
+ this.requestCache = new ConcurrentHashMap<Integer, DataRequest>();
addItemPersistenceListener(cache);
}