[exo-jcr-commits] exo-jcr SVN: r1323 - in jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main: java/org/exoplatform/services/jcr/impl/core and 1 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Fri Jan 8 07:38:15 EST 2010


Author: pnedonosko
Date: 2010-01-08 07:38:14 -0500 (Fri, 08 Jan 2010)
New Revision: 1323

Modified:
   jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/WorkspaceEntry.java
   jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.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/SessionImpl.java
   jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/resources/binding.xml
Log:
EXOJCR-338 lazy load for childs items with thresold parameter (100 default).

Modified: jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/WorkspaceEntry.java
===================================================================
--- jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/WorkspaceEntry.java	2010-01-08 12:03:33 UTC (rev 1322)
+++ jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/WorkspaceEntry.java	2010-01-08 12:38:14 UTC (rev 1323)
@@ -29,6 +29,8 @@
 {
 
    protected String name;
+   
+   protected int lazyReadThreshold = 0;
 
    @Deprecated
    protected String autoInitializedRootNt;
@@ -192,5 +194,15 @@
    {
       this.initializer = initializer;
    }
+   
+   public int getLazyReadThreshold()
+   {
+      return lazyReadThreshold;
+   }
 
+   public void setLazyReadThreshold(int lazyReadThreshold)
+   {
+      this.lazyReadThreshold = lazyReadThreshold;
+   }   
+
 }

Modified: jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
===================================================================
--- jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java	2010-01-08 12:03:33 UTC (rev 1322)
+++ jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java	2010-01-08 12:38:14 UTC (rev 1323)
@@ -1035,11 +1035,29 @@
       checkValid();
       try
       {
-         // TODO full iterator code
-         // return new EntityCollection(childNodes());
+         List<NodeData> childs = childNodesData();
 
-         // lazy childs
-         return new LazyNodeIterator(childNodesData());
+         if (childs.size() < session.getLazyReadThreshold())
+         {
+            // full iterator 
+            List<NodeImpl> nodes = new ArrayList<NodeImpl>();
+            for (NodeData child : childs)
+            {
+               if (session.getAccessManager().hasPermission(child.getACL(), new String[]{PermissionType.READ},
+                  session.getUserState().getIdentity()))
+               {
+                  NodeImpl item = (NodeImpl)dataManager.readItem(child, nodeData(), true, false);
+                  session.getActionHandler().postRead(item);
+                  nodes.add(item);
+               }
+            }
+            return new EntityCollection(nodes);
+         }
+         else
+         {
+            // lazy iterator
+            return new LazyNodeIterator(childs);
+         }
       }
       finally
       {
@@ -1066,20 +1084,32 @@
 
       try
       {
-         // TODO full iterator code
-         //         ItemFilter filter = new NamePatternFilter(namePattern);
-         //         ArrayList<NodeImpl> list = new ArrayList<NodeImpl>();
-         //         for (NodeImpl item : childNodes())
-         //         {
-         //            if (filter.accept(item))
-         //            {
-         //               list.add(item);
-         //            }
-         //         }
-         //         return new EntityCollection(list);
+         List<NodeData> childs = childNodesData();
 
-         // lazy childs
-         return new LazyNodeIterator(childNodesData(), new ItemDataNamePatternFilter(namePattern, session));
+         ItemDataFilter filter = new ItemDataNamePatternFilter(namePattern, session);
+
+         if (childs.size() < session.getLazyReadThreshold())
+         {
+            // full iterator 
+            List<NodeImpl> nodes = new ArrayList<NodeImpl>();
+            for (NodeData child : childs)
+            {
+               if (filter.accept(child)
+                  && session.getAccessManager().hasPermission(child.getACL(), new String[]{PermissionType.READ},
+                     session.getUserState().getIdentity()))
+               {
+                  NodeImpl item = (NodeImpl)dataManager.readItem(child, nodeData(), true, false);
+                  session.getActionHandler().postRead(item);
+                  nodes.add(item);
+               }
+            }
+            return new EntityCollection(nodes);
+         }
+         else
+         {
+            // lazy iterator
+            return new LazyNodeIterator(childNodesData(), filter);
+         }
       }
       finally
       {
@@ -1149,11 +1179,35 @@
 
       try
       {
-         // TODO full iterator code
-         // return new EntityCollection(childProperties());
+         List<PropertyData> childs = childPropertiesData();
 
-         // lazy childs
-         return new LazyPropertyIterator(childPropertiesData());
+         if (session.getAccessManager().hasPermission(nodeData().getACL(), new String[]{PermissionType.READ},
+            session.getUserState().getIdentity()))
+         {
+            if (childs.size() < session.getLazyReadThreshold())
+            {
+               // full iterator 
+               List<PropertyImpl> props = new ArrayList<PropertyImpl>();
+               for (PropertyData child : childs)
+               {
+                  PropertyImpl item = (PropertyImpl)dataManager.readItem(child, nodeData(), true, false);
+                  session.getActionHandler().postRead(item);
+                  props.add(item);
+
+               }
+               return new EntityCollection(props);
+            }
+            else
+            {
+               // lazy iterator
+               return new LazyPropertyIterator(childs);
+            }
+         }
+         else
+         {
+            // return empty
+            return new EntityCollection();
+         }
       }
       finally
       {
@@ -1169,28 +1223,50 @@
     */
    public PropertyIterator getProperties(String namePattern) throws RepositoryException
    {
-
       long start = System.currentTimeMillis();
       if (LOG.isDebugEnabled())
+      {
          LOG.debug("getProperties(String) >>>>>");
+      }
 
       checkValid();
 
       try
       {
-         // TODO full iterator code
-         //         ItemFilter filter = new NamePatternFilter(namePattern);
-         //         ArrayList<PropertyImpl> list = new ArrayList<PropertyImpl>();
-         //         for (PropertyImpl item : childProperties())
-         //         {
-         //            if (filter.accept(item))
-         //               list.add(item);
-         //         }
-         //
-         //         return new EntityCollection(list);
+         List<PropertyData> childs = childPropertiesData();
 
-         // lazy childs
-         return new LazyPropertyIterator(childPropertiesData(), new ItemDataNamePatternFilter(namePattern, session));
+         ItemDataFilter filter = new ItemDataNamePatternFilter(namePattern, session);
+
+         if (session.getAccessManager().hasPermission(nodeData().getACL(), new String[]{PermissionType.READ},
+            session.getUserState().getIdentity()))
+         {
+            if (childs.size() < session.getLazyReadThreshold())
+            {
+               // full iterator 
+               List<PropertyImpl> props = new ArrayList<PropertyImpl>();
+               for (PropertyData child : childs)
+               {
+                  if (filter.accept(child))
+                  {
+                     PropertyImpl item = (PropertyImpl)dataManager.readItem(child, nodeData(), true, false);
+                     session.getActionHandler().postRead(item);
+                     props.add(item);
+                  }
+
+               }
+               return new EntityCollection(props);
+            }
+            else
+            {
+               // lazy iterator
+               return new LazyPropertyIterator(childPropertiesData(), filter);
+            }
+         }
+         else
+         {
+            // return empty
+            return new EntityCollection();
+         }
       }
       finally
       {
@@ -2672,39 +2748,9 @@
     */
    private List<NodeData> childNodesData() throws RepositoryException, AccessDeniedException
    {
-
-      //List<NodeData> storedNodes = dataManager.getChildNodesData(nodeData());
       List<NodeData> storedNodes = new ArrayList<NodeData>(dataManager.getChildNodesData(nodeData()));
-
-      // TODO we should not sort here!
       Collections.sort(storedNodes, new NodeDataOrderComparator());
-
       return storedNodes;
-
-      // TODO cleanup
-      //      List<Object> results = new ArrayList<Object>(storedNodes.size());
-      //
-      //      Iterator<NodeData> it = storedNodes.iterator();
-      //      while (it.hasNext())
-      //      {
-      //         NodeData node = it.next();
-      //
-      //         if (session.getAccessManager().hasPermission(node.getACL(), new String[]{PermissionType.READ},
-      //            session.getUserState().getIdentity()))
-      //         {
-      //            ItemImpl pooled = dataManager.reloadItem(node);
-      //            if (pooled != null)
-      //            {
-      //               results.add(pooled);
-      //            }
-      //            else
-      //            {
-      //               results.add(node);
-      //            }
-      //         }
-      //      }
-      //
-      //      return results;
    }
 
    private EntityCollection createMergeFailed(Map<String, String> failed, SessionChangesLog changes)

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	2010-01-08 12:03:33 UTC (rev 1322)
+++ jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java	2010-01-08 12:38:14 UTC (rev 1323)
@@ -592,7 +592,6 @@
       {
          PropertyData data = refDatas.get(i);
          // check for permission for read
-         // [PN] 21.12.07 use item data
          NodeData parent = (NodeData)getItemData(data.getParentIdentifier());
          // skip not permitted
          if (accessManager.hasPermission(parent.getACL(), new String[]{PermissionType.READ}, session.getUserState()
@@ -609,12 +608,10 @@
                }
 
                item = (PropertyImpl)readItem(state.getData(), null, true, false);
-               // TODO item = (PropertyImpl)itemFactory.createItem(state.getData());
             }
             else
             {
                item = (PropertyImpl)readItem(data, null, true, false);
-               // TODO item = (PropertyImpl)itemFactory.createItem(data);
             }
 
             refs.add(item);
@@ -643,7 +640,9 @@
 
       long start = System.currentTimeMillis();
       if (log.isDebugEnabled())
+      {
          log.debug("getChildNodes(" + parent.getQPath().getAsString() + ") >>>>>");
+      }
 
       try
       {
@@ -657,13 +656,8 @@
             if (accessManager.hasPermission(data.getACL(), new String[]{PermissionType.READ}, session.getUserState()
                .getIdentity()))
             {
-               //NodeImpl item = itemFactory.createNode(data, parent.getPrimaryTypeName(), parent.getMixinTypeNames());
                NodeImpl item = (NodeImpl)readItem(data, parent, pool, false);
                session.getActionHandler().postRead(item);
-
-               //TODO if (pool)
-               //   item = (NodeImpl)itemsPool.get(item);
-
                nodes.add(item);
             }
          }
@@ -672,8 +666,10 @@
       finally
       {
          if (log.isDebugEnabled())
+         {
             log.debug("getChildNodes(" + parent.getQPath().getAsString() + ") <<<<< "
                + ((System.currentTimeMillis() - start) / 1000d) + "sec");
+         }
       }
    }
 
@@ -708,15 +704,11 @@
          for (int i = 0, length = propDatas.size(); i < length; i++)
          {
             PropertyData data = propDatas.get(i);
-            //ItemImpl item = itemFactory.createItem(data);
             if (accessManager.hasPermission(parent.getACL(), new String[]{PermissionType.READ}, session.getUserState()
                .getIdentity()))
             {
-               // TODO if (pool)
-               //   item = itemsPool.get(item);
                ItemImpl item = readItem(data, parent, pool, false);
                session.getActionHandler().postRead(item);
-
                props.add((PropertyImpl)item);
             }
          }
@@ -725,8 +717,10 @@
       finally
       {
          if (log.isDebugEnabled())
+         {
             log.debug("getChildProperties(" + parent.getQPath().getAsString() + ") <<<<< "
                + ((System.currentTimeMillis() - start) / 1000d) + "sec");
+         }
       }
    }
 

Modified: jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java
===================================================================
--- jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java	2010-01-08 12:03:33 UTC (rev 1322)
+++ jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java	2010-01-08 12:38:14 UTC (rev 1323)
@@ -98,6 +98,8 @@
 public class SessionImpl implements ExtendedSession, NamespaceAccessor
 {
 
+   public static final int DEFAULT_LAZY_READ_THRESHOLD = 100;
+
    private final RepositoryImpl repository;
 
    private final ConversationState userState;
@@ -132,6 +134,8 @@
 
    private long lastAccessTime;
 
+   private final int lazyReadThreshold;
+
    private final SessionRegistry sessionRegistry;
 
    protected final SessionDataManager dataManager;
@@ -154,6 +158,10 @@
       this.accessManager = (AccessManager)container.getComponentInstanceOfType(AccessManager.class);
       this.lockManager = (LockManagerImpl)container.getComponentInstanceOfType(LockManagerImpl.class);
       WorkspaceEntry wsConfig = (WorkspaceEntry)container.getComponentInstanceOfType(WorkspaceEntry.class);
+
+      this.lazyReadThreshold =
+         wsConfig.getLazyReadThreshold() > 0 ? wsConfig.getLazyReadThreshold() : DEFAULT_LAZY_READ_THRESHOLD;
+
       WorkspaceFileCleanerHolder cleanerHolder =
          (WorkspaceFileCleanerHolder)container.getComponentInstanceOfType(WorkspaceFileCleanerHolder.class);
 
@@ -620,7 +628,7 @@
    {
       return getNamespaceURI(prefix);
    }
-   
+
    /**
     * {@inheritDoc}
     */
@@ -961,5 +969,10 @@
    {
       return this.userState;
    }
+   
+   int getLazyReadThreshold()
+   {
+      return lazyReadThreshold;
+   }
 
 }

Modified: jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/resources/binding.xml
===================================================================
--- jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/resources/binding.xml	2010-01-08 12:03:33 UTC (rev 1322)
+++ jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/resources/binding.xml	2010-01-08 12:38:14 UTC (rev 1323)
@@ -23,7 +23,8 @@
     <value name="name" field="name" style="attribute" />
     <value name="auto-init-root-nodetype" field="autoInitializedRootNt" style="attribute" usage="optional" />
     <value name="auto-init-permissions" field="autoInitPermissions" style="attribute" usage="optional" />
-
+    <value name="lazy-read-threshold" field="lazyReadThreshold" usage="optional" />
+    
     <structure name="container" field="container">
       <value name="class" field="type" style="attribute" />
       <collection name="properties" field="parameters" usage="optional"



More information about the exo-jcr-commits mailing list