[exo-jcr-commits] exo-jcr SVN: r4755 - in jcr/trunk/exo.jcr.component.core/src: main/java/org/exoplatform/services/jcr/impl/dataflow/persistent and 4 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Mon Aug 15 11:06:52 EDT 2011


Author: nzamosenchuk
Date: 2011-08-15 11:06:52 -0400 (Mon, 15 Aug 2011)
New Revision: 4755

Modified:
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionFactory.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.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/storage/jdbc/JDBCStorageConnection.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/CQJDBCStorageConnection.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MultiDbJDBCConnection.java
   jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestGetNodesLazily.java
Log:
EXOJCR-267 : contains multiple fixes:
1) fixed critical bug, when result set was not properly processed, causing completely wrong nodeDatas and result list. CQ result set was processed as non-CQ. Fixed.
2) last node retrieved from DB is not added to result child list cause it can be incomplete. It is added only if current page is the last one;
3) updated logic with min page size.

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java	2011-08-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java	2011-08-15 15:06:52 UTC (rev 4755)
@@ -302,9 +302,9 @@
          if (primaryTypeName == null)
          {
             throw new ConstraintViolationException("Can not define node type for " + name.getAsString()
-                     + ". No default primary type defined for child nodes in \""
-                     + nodeData().getPrimaryTypeName().getAsString()
-                     + "\" node type and no explicit primary type given to create a child node.");
+               + ". No default primary type defined for child nodes in \""
+               + nodeData().getPrimaryTypeName().getAsString()
+               + "\" node type and no explicit primary type given to create a child node.");
          }
       }
       // try to make new node
@@ -460,7 +460,7 @@
    {
 
       checkValid();
-      
+
       if (!session.getAccessManager().hasPermission(getACL(),
          new String[]{PermissionType.ADD_NODE, PermissionType.SET_PROPERTY}, session.getUserState().getIdentity()))
       {
@@ -544,7 +544,7 @@
       {
          throw new LockException("Node " + getPath() + " is locked ");
       }
-      
+
       if (checkedOut())
       {
          return;
@@ -911,8 +911,8 @@
             NodeData parent = (NodeData)dataManager.getItemData(getParentIdentifier());
 
             this.definition =
-               nodeTypesHolder.getChildNodeDefinition(getInternalName(), nodeData().getPrimaryTypeName(),
-                  parent.getPrimaryTypeName(), parent.getMixinTypeNames());
+               nodeTypesHolder.getChildNodeDefinition(getInternalName(), nodeData().getPrimaryTypeName(), parent
+                  .getPrimaryTypeName(), parent.getMixinTypeNames());
 
             if (definition == null)
             {
@@ -1295,8 +1295,8 @@
             else
             {
                childs =
-                  new ArrayList<PropertyData>(dataManager.getChildPropertiesData(nodeData(),
-                     filter.getQPathEntryFilters()));
+                  new ArrayList<PropertyData>(dataManager.getChildPropertiesData(nodeData(), filter
+                     .getQPathEntryFilters()));
                Collections.sort(childs, new PropertiesDataOrderComparator<PropertyData>());
             }
 
@@ -1631,18 +1631,15 @@
                new InternalQName[]{Constants.NT_BASE}, null, false);
          return;
       }
-      
+
       if (parent == null)
       {
          parent = (NodeData)dataManager.getItemData(getParentIdentifier());
       }
 
       this.definition =
-         session
-            .getWorkspace()
-            .getNodeTypesHolder()
-            .getChildNodeDefinition(getInternalName(), nodeData().getPrimaryTypeName(), parent.getPrimaryTypeName(),
-               parent.getMixinTypeNames());
+         session.getWorkspace().getNodeTypesHolder().getChildNodeDefinition(getInternalName(),
+            nodeData().getPrimaryTypeName(), parent.getPrimaryTypeName(), parent.getMixinTypeNames());
 
       if (definition == null)
       {
@@ -2563,11 +2560,8 @@
       }
       // Check if node is not protected
       NodeDefinitionData childNodeDefinition =
-         session
-            .getWorkspace()
-            .getNodeTypesHolder()
-            .getChildNodeDefinition(name, primaryTypeName, nodeData().getPrimaryTypeName(),
-               nodeData().getMixinTypeNames());
+         session.getWorkspace().getNodeTypesHolder().getChildNodeDefinition(name, primaryTypeName,
+            nodeData().getPrimaryTypeName(), nodeData().getMixinTypeNames());
       if (childNodeDefinition == null)
       {
          throw new ConstraintViolationException("Can't find child node definition for "
@@ -3045,11 +3039,8 @@
       if (def == null)
       {
          def =
-            session
-               .getWorkspace()
-               .getNodeTypesHolder()
-               .getChildNodeDefinition(nameToAdd, primaryTypeName, parentNode.getPrimaryTypeName(),
-                  parentNode.getMixinTypeNames());
+            session.getWorkspace().getNodeTypesHolder().getChildNodeDefinition(nameToAdd, primaryTypeName,
+               parentNode.getPrimaryTypeName(), parentNode.getMixinTypeNames());
       }
 
       boolean allowSns = def.isAllowsSameNameSiblings();
@@ -3493,7 +3484,7 @@
       private int fromOrderNum = 0;
 
       private boolean hasNext = true;
-      
+
       private int pos = 0;
 
       private LazyNodeIterator lazyNodeItetator = new LazyNodeIterator(new ArrayList<NodeData>());
@@ -3631,16 +3622,13 @@
             LOG.error("There are no more elements in iterator", e);
             throw new NoSuchElementException(e.toString());
          }
-         
+
          Collections.sort(storedNodes, new NodeDataOrderComparator());
 
          int size = storedNodes.size();
 
-         fromOrderNum =
-            size == 0 ? fromOrderNum + limit : Math.max(fromOrderNum + limit, storedNodes.get(size - 1)
-               .getOrderNumber() + 1);
+         fromOrderNum = size == 0 ? fromOrderNum + limit : storedNodes.get(size - 1).getOrderNumber() + 1;
 
-
          // skip some nodes
          if (size != 0)
          {

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionFactory.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionFactory.java	2011-08-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionFactory.java	2011-08-15 15:06:52 UTC (rev 4755)
@@ -98,6 +98,9 @@
       if (config.getContainer().getParameterInteger(WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE,
          WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE_DEFAULT) < WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE_MIN)
       {
+         // set proper value
+         config.getContainer().putParameterValue(WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE,
+            Integer.toString(WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE_MIN));
          LOG.warn("Value for \"lazy-node-iterator-page-size\" is too small. Using allowed minimum page size : "
             + WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE_MIN + ".");
       }

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java	2011-08-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java	2011-08-15 15:06:52 UTC (rev 4755)
@@ -257,10 +257,6 @@
       this.lazyNodeIteatorPageSize =
          wsConfig.getContainer().getParameterInteger(WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE,
             WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE_DEFAULT);
-      if (this.lazyNodeIteatorPageSize < WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE_MIN)
-      {
-         this.lazyNodeIteatorPageSize = WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE_MIN;
-      }
    }
 
    /**

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-08-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java	2011-08-15 15:06:52 UTC (rev 4755)
@@ -109,7 +109,7 @@
     * Read-only status.
     */
    protected boolean readOnly = false;
-   
+
    /**
     * The resource manager
     */
@@ -136,7 +136,7 @@
       {
          this.log = log;
       }
-      
+
       protected ItemStateChangesLog getChangesLog()
       {
          return log;
@@ -180,7 +180,7 @@
    {
       this(dataContainer, systemDataContainerHolder, null);
    }
-   
+
    /**
     * WorkspacePersistentDataManager constructor.
     * 
@@ -290,7 +290,7 @@
       {
          // The rollback is done normally
          persister.rollback();
-      }      
+      }
    }
 
    /**
@@ -310,29 +310,28 @@
          // fail later in the tx
          txResourceManager.addListener(new TransactionableResourceManagerListener()
          {
-            
+
             public void onCommit(boolean onePhase) throws Exception
             {
                persister.commit();
             }
-            
+
             public void onAfterCompletion(int status) throws Exception
             {
             }
-            
+
             public void onAbort() throws Exception
             {
                persister.rollback();
             }
          });
-      }      
+      }
    }
 
-   private enum ConnectionMode
-   {
+   private enum ConnectionMode {
       NORMAL, PARTIALLY_MANAGED
    }
-   
+
    class ChangesLogPersister
    {
 
@@ -629,11 +628,11 @@
          con.close();
       }
    }
-   
+
    /**
     * {@inheritDoc}
     */
-   public boolean getChildNodesDataByPage(final NodeData nodeData, int fromOrderNum, int limit, List<NodeData> childs)
+   public boolean getChildNodesDataByPage(final NodeData nodeData, int fromOrderNum, int limit, List<NodeData> childNodes)
       throws RepositoryException
    {
       final WorkspaceStorageConnection con = dataContainer.openConnection();
@@ -641,8 +640,7 @@
       {
          try
          {
-            childs.addAll(((JDBCStorageConnection)con).getChildNodesDataByPage(nodeData, fromOrderNum, limit));
-            return childs.size() == limit;
+            return ((JDBCStorageConnection)con).getChildNodesDataByPage(nodeData, fromOrderNum, limit, childNodes);
          }
          finally
          {
@@ -689,7 +687,7 @@
          con.close();
       }
    }
-   
+
    /**
     * {@inheritDoc}
     */
@@ -725,8 +723,8 @@
    /**
     * {@inheritDoc}
     */
-   public List<PropertyData> getChildPropertiesData(final NodeData nodeData, final List<QPathEntryFilter> itemDataFilters)
-      throws RepositoryException
+   public List<PropertyData> getChildPropertiesData(final NodeData nodeData,
+      final List<QPathEntryFilter> itemDataFilters) throws RepositoryException
    {
       final WorkspaceStorageConnection con = dataContainer.openConnection();
       try
@@ -1050,8 +1048,7 @@
    /**
     * {@inheritDoc}
     */
-   public ItemData getItemData(final NodeData parentData, final QPathEntry name)
-      throws RepositoryException
+   public ItemData getItemData(final NodeData parentData, final QPathEntry name) throws RepositoryException
    {
       return getItemData(parentData, name, ItemType.UNKNOWN);
    }

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-08-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCStorageConnection.java	2011-08-15 15:06:52 UTC (rev 4755)
@@ -73,6 +73,7 @@
 import javax.jcr.InvalidItemStateException;
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
+import javax.jcr.UnsupportedRepositoryOperationException;
 
 /**
  * Created by The eXo Platform SAS.
@@ -859,9 +860,11 @@
 
          // update type
          if (updatePropertyByIdentifier(data.getPersistedVersion(), data.getType(), cid) <= 0)
+         {
             throw new JCRInvalidItemStateException("(update) Property not found " + data.getQPath().getAsString() + " "
                + data.getIdentifier() + ". Probably was deleted by another session ", data.getIdentifier(),
                ItemState.UPDATED);
+         }
 
          // update reference
          try
@@ -893,13 +896,17 @@
       catch (IOException e)
       {
          if (LOG.isDebugEnabled())
+         {
             LOG.error("Property update. IO error: " + e, e);
+         }
          throw new RepositoryException("Error of Property Value update " + e, e);
       }
       catch (SQLException e)
       {
          if (LOG.isDebugEnabled())
+         {
             LOG.error("Property update. Database error: " + e, e);
+         }
          exceptionHandler.handleUpdateException(e, data);
       }
    }
@@ -1045,7 +1052,9 @@
          {
             List<PropertyData> children = new ArrayList<PropertyData>();
             while (prop.next())
+            {
                children.add((PropertyData)itemData(parent.getQPath(), prop, I_CLASS_PROPERTY, null));
+            }
 
             return children;
          }
@@ -1092,8 +1101,8 @@
     * @throws RepositoryException
     * @throws IllegalStateException
     */
-   public List<NodeDataIndexing> getNodesAndProperties(String lastNodeId, int offset, int limit) throws RepositoryException,
-      IllegalStateException
+   public List<NodeDataIndexing> getNodesAndProperties(String lastNodeId, int offset, int limit)
+      throws RepositoryException, IllegalStateException
    {
       List<NodeDataIndexing> result = new ArrayList<NodeDataIndexing>();
 
@@ -1172,43 +1181,11 @@
     * @throws RepositoryException
     * @throws IllegalStateException
     */
-   public List<NodeData> getChildNodesDataByPage(NodeData parent, int fromOrderNum, int limit) throws RepositoryException,
-      IllegalStateException
+   public boolean getChildNodesDataByPage(NodeData parent, int fromOrderNum, int limit, List<NodeData> childNodes)
+      throws RepositoryException, IllegalStateException
    {
-      checkIfOpened();
-      try
-      {
-         ResultSet node = findChildNodesByParentIdentifier(getInternalId(parent.getIdentifier()), fromOrderNum, limit);
-         try
-         {
-            List<NodeData> childrens = new ArrayList<NodeData>();
-            while (node.next())
-            {
-               childrens.add((NodeData)itemData(parent.getQPath(), node, I_CLASS_NODE, parent.getACL()));
-            }
-
-            return childrens;
-         }
-         finally
-         {
-            try
-            {
-               node.close();
-            }
-            catch (SQLException e)
-            {
-               LOG.error("Can't close the ResultSet: " + e);
-            }
-         }
-      }
-      catch (SQLException e)
-      {
-         throw new RepositoryException(e);
-      }
-      catch (IOException e)
-      {
-         throw new RepositoryException(e);
-      }
+      // not supported by non-CQ deprecated JDBC container
+      throw new UnsupportedRepositoryOperationException();
    }
 
    /**
@@ -1224,7 +1201,9 @@
          {
             List<PropertyData> children = new ArrayList<PropertyData>();
             while (prop.next())
+            {
                children.add(propertyData(parent.getQPath(), prop));
+            }
 
             return children;
          }
@@ -1342,8 +1321,8 @@
             if (valueRecord.next())
             {
                String storageId = valueRecord.getString(COLUMN_VSTORAGE_DESC);
-               return valueRecord.wasNull() ? readValueData(cid, orderNumb, persistedVersion,
-                  valueRecord.getBinaryStream(COLUMN_VDATA)) : readValueData(propertyId, orderNumb, storageId);
+               return valueRecord.wasNull() ? readValueData(cid, orderNumb, persistedVersion, valueRecord
+                  .getBinaryStream(COLUMN_VDATA)) : readValueData(propertyId, orderNumb, storageId);
             }
 
             return null;
@@ -1516,7 +1495,9 @@
          try
          {
             if (!parent.next())
+            {
                throw new InvalidItemStateException("Parent not found, uuid: " + getIdentifier(caid));
+            }
 
             QPathEntry qpe =
                new QPathEntry(InternalQName.parse(parent.getString(COLUMN_NAME)), parent.getInt(COLUMN_INDEX));
@@ -1608,12 +1589,18 @@
       {
          MixinInfo naMixins = readMixins(caid);
          if (naMixins.hasPrivilegeable())
+         {
             return readACLPermisions(caid);
+         }
 
          if (naMixins.parentId == null)
+         {
             caid = findParentId(caid);
+         }
          else
+         {
             caid = naMixins.parentId;
+         }
       }
 
       throw new IllegalACLException("Can not find permissions for a node with id " + getIdentifier(cpid));
@@ -1625,9 +1612,13 @@
       try
       {
          if (pidrs.next())
+         {
             return pidrs.getString(COLUMN_PARENTID);
+         }
          else
+         {
             throw new RepositoryException("Item not found id: " + getIdentifier(cid));
+         }
       }
       finally
       {
@@ -1666,12 +1657,18 @@
       {
          MixinInfo naMixins = readMixins(caid);
          if (naMixins.hasOwneable())
+         {
             return readACLOwner(caid);
+         }
 
          if (naMixins.parentId == null)
+         {
             caid = findParentId(caid);
+         }
          else
+         {
             caid = naMixins.parentId;
+         }
       }
 
       throw new IllegalACLException("Can not find owner for a node with id " + getIdentifier(cpid));
@@ -1707,19 +1704,27 @@
          {
             naOwner = readACLOwner(caid);
             if (naPermissions != null)
+            {
                break;
+            }
          }
          if (naPermissions == null && naMixins.hasPrivilegeable())
          {
             naPermissions = readACLPermisions(caid);
             if (naOwner != null)
+            {
                break;
+            }
          }
 
          if (naMixins.parentId == null)
+         {
             caid = findParentId(caid);
+         }
          else
+         {
             caid = naMixins.parentId;
+         }
       }
 
       if (naOwner != null && naPermissions != null)
@@ -1733,8 +1738,10 @@
          return new AccessControlList();
       }
       else
+      {
          throw new IllegalACLException("ACL is not found for node with id " + getIdentifier(cpid)
             + " or for its ancestors. But repository is ACL enabled.");
+      }
    }
 
    /**
@@ -1787,7 +1794,9 @@
 
             // parent = findItemByIdentifier(caid);
             if (qrpath.size() <= 0)
+            {
                throw new InvalidItemStateException("Parent not found, uuid: " + getIdentifier(cpid));
+            }
 
          }
          finally
@@ -1805,7 +1814,9 @@
             }
 
             if (cstmt != null)
+            {
                cstmt.close();
+            }
          }
 
          QPathEntry[] qentries = new QPathEntry[qrpath.size()];
@@ -1989,7 +2000,9 @@
             return mns;
          }
          else
+         {
             return new InternalQName[0];
+         }
       }
 
       /**
@@ -2050,9 +2063,13 @@
                   mts.add(mxn);
 
                   if (!privilegeable && Constants.EXO_PRIVILEGEABLE.equals(mxn))
+                  {
                      privilegeable = true;
+                  }
                   else if (!owneable && Constants.EXO_OWNEABLE.equals(mxn))
+                  {
                      owneable = true;
+                  }
                } // else, if SQL NULL - skip it
             }
             while (mtrs.next());
@@ -2103,8 +2120,10 @@
             return naPermissions;
          }
          else
+         {
             throw new IllegalACLException("Property exo:permissions is not found for node with id: "
                + getIdentifier(cid));
+         }
       }
       finally
       {
@@ -2136,9 +2155,13 @@
       try
       {
          if (exoOwner.next())
+         {
             return new String(exoOwner.getBytes(COLUMN_VDATA));
+         }
          else
+         {
             throw new IllegalACLException("Property exo:owner is not found for node with id: " + getIdentifier(cid));
+         }
       }
       finally
       {
@@ -2215,8 +2238,10 @@
          {
 
             if (!ptProp.next())
+            {
                throw new PrimaryTypeNotFoundException("FATAL ERROR primary type record not found. Node "
                   + qpath.getAsString() + ", id " + cid + ", container " + this.containerName, null);
+            }
 
             byte[] data = ptProp.getBytes(COLUMN_VDATA);
             InternalQName ptName = InternalQName.parse(new String((data != null ? data : new byte[]{})));
@@ -2239,8 +2264,8 @@
                {
                   // use permissions from existed parent
                   acl =
-                     new AccessControlList(readACLOwner(cid), parentACL.hasPermissions()
-                        ? parentACL.getPermissionEntries() : null);
+                     new AccessControlList(readACLOwner(cid), parentACL.hasPermissions() ? parentACL
+                        .getPermissionEntries() : null);
                }
                else
                {
@@ -2272,14 +2297,18 @@
             else
             {
                if (parentACL != null)
+               {
                   // construct ACL from existed parent ACL
                   acl =
-                     new AccessControlList(parentACL.getOwner(), parentACL.hasPermissions()
-                        ? parentACL.getPermissionEntries() : null);
+                     new AccessControlList(parentACL.getOwner(), parentACL.hasPermissions() ? parentACL
+                        .getPermissionEntries() : null);
+               }
                else
+               {
                   // have to search nearest ancestor owner and permissions in ACL manager
                   // acl = traverseACL(cpid);
                   acl = null;
+               }
             }
 
             return new PersistedNodeData(getIdentifier(cid), qpath, getIdentifier(parentCid), cversion, cnordernumb,
@@ -2449,8 +2478,8 @@
             final int orderNum = valueRecords.getInt(COLUMN_VORDERNUM);
             final String storageId = valueRecords.getString(COLUMN_VSTORAGE_DESC);
             ValueData vdata =
-               valueRecords.wasNull() ? readValueData(cid, orderNum, cversion,
-                  valueRecords.getBinaryStream(COLUMN_VDATA)) : readValueData(identifier, orderNum, storageId);
+               valueRecords.wasNull() ? readValueData(cid, orderNum, cversion, valueRecords
+                  .getBinaryStream(COLUMN_VDATA)) : readValueData(identifier, orderNum, storageId);
             data.add(vdata);
          }
       }
@@ -2531,6 +2560,7 @@
       {
          // stream from database
          if (content != null)
+         {
             while ((read = content.read(spoolBuffer)) >= 0)
             {
                if (out != null)
@@ -2566,6 +2596,7 @@
                   len += read;
                }
             }
+         }
       }
       finally
       {
@@ -2747,8 +2778,7 @@
 
          // build property data
          PropertyData pdata =
-            new PersistedPropertyData(identifier, qpath, tempNode.cid, prop.version, prop.type, prop.multi,
-               valueData);
+            new PersistedPropertyData(identifier, qpath, tempNode.cid, prop.version, prop.type, prop.multi, valueData);
 
          childProps.put(propName, pdata);
       }

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/CQJDBCStorageConnection.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/CQJDBCStorageConnection.java	2011-08-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/CQJDBCStorageConnection.java	2011-08-15 15:06:52 UTC (rev 4755)
@@ -322,6 +322,85 @@
     * {@inheritDoc}
     */
    @Override
+   public boolean getChildNodesDataByPage(NodeData parent, int fromOrderNum, int limit, List<NodeData> childNodes)
+      throws RepositoryException, IllegalStateException
+   {
+      checkIfOpened();
+      ResultSet resultSet = null;
+      try
+      {
+         // query will return nodes and properties in same result set
+         // last node can be incomplete, so reading one more ahead, to be sure returning 
+         // at least "limit" nodes.
+         int rowsLimit = (limit + 1) * 4;
+         resultSet = findChildNodesByParentIdentifier(getInternalId(parent.getIdentifier()), fromOrderNum, rowsLimit);
+         TempNodeData data = null;
+         int resultSetSize = 0;
+         while (resultSet.next())
+         {
+            resultSetSize++;
+            if (data == null)
+            {
+               data = new TempNodeData(resultSet);
+            }
+            else if (!resultSet.getString(COLUMN_ID).equals(data.cid))
+            {
+               NodeData nodeData = loadNodeFromTemporaryNodeData(data, parent.getQPath(), parent.getACL());
+               childNodes.add(nodeData);
+               data = new TempNodeData(resultSet);
+            }
+            Map<String, SortedSet<TempPropertyData>> properties = data.properties;
+            String key = resultSet.getString("PROP_NAME");
+            SortedSet<TempPropertyData> values = properties.get(key);
+            if (values == null)
+            {
+               values = new TreeSet<TempPropertyData>();
+               properties.put(key, values);
+            }
+            values.add(new TempPropertyData(resultSet));
+         }
+         // last node can be incomplete, so removed
+         boolean hasNext = resultSetSize == rowsLimit;
+         if (!hasNext)
+         {
+            // the last one node
+            if (data != null)
+            {
+               NodeData nodeData = loadNodeFromTemporaryNodeData(data, parent.getQPath(), parent.getACL());
+               childNodes.add(nodeData);
+            }
+         }
+
+         return hasNext;
+      }
+      catch (SQLException e)
+      {
+         throw new RepositoryException(e);
+      }
+      catch (IOException e)
+      {
+         throw new RepositoryException(e);
+      }
+      finally
+      {
+         if (resultSet != null)
+         {
+            try
+            {
+               resultSet.close();
+            }
+            catch (SQLException e)
+            {
+               LOG.error("Can't close the ResultSet: " + e);
+            }
+         }
+      }
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
    public void update(PropertyData data) throws RepositoryException, UnsupportedOperationException,
       InvalidItemStateException, IllegalStateException
    {
@@ -357,7 +436,7 @@
                + data.getIdentifier() + ". Probably was deleted by another session ", data.getIdentifier(),
                ItemState.UPDATED);
          }
-         
+
          // update reference
          try
          {
@@ -652,8 +731,8 @@
                try
                {
                   qpath =
-                     QPath.makeChildPath(parentPath == null ? traverseQPath(cpid) : parentPath,
-                        InternalQName.parse(cname));
+                     QPath.makeChildPath(parentPath == null ? traverseQPath(cpid) : parentPath, InternalQName
+                        .parse(cname));
                }
                catch (IllegalNameException e)
                {
@@ -670,8 +749,8 @@
                   {
                      final String storageId = resultSet.getString(COLUMN_VSTORAGE_DESC);
                      ValueData vdata =
-                        resultSet.wasNull() ? readValueData(cid, orderNum, cversion,
-                           resultSet.getBinaryStream(COLUMN_VDATA)) : readValueData(identifier, orderNum, storageId);
+                        resultSet.wasNull() ? readValueData(cid, orderNum, cversion, resultSet
+                           .getBinaryStream(COLUMN_VDATA)) : readValueData(identifier, orderNum, storageId);
                      data.add(vdata);
                   }
 

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MultiDbJDBCConnection.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MultiDbJDBCConnection.java	2011-08-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MultiDbJDBCConnection.java	2011-08-15 15:06:52 UTC (rev 4755)
@@ -226,9 +226,13 @@
    protected int addNodeRecord(NodeData data) throws SQLException
    {
       if (insertNode == null)
+      {
          insertNode = dbConnection.prepareStatement(INSERT_NODE);
+      }
       else
+      {
          insertNode.clearParameters();
+      }
 
       insertNode.setString(1, data.getIdentifier());
       insertNode.setString(2, data.getParentIdentifier() == null ? Constants.ROOT_PARENT_UUID : data
@@ -247,9 +251,13 @@
    protected int addPropertyRecord(PropertyData data) throws SQLException
    {
       if (insertProperty == null)
+      {
          insertProperty = dbConnection.prepareStatement(INSERT_PROPERTY);
+      }
       else
+      {
          insertProperty.clearParameters();
+      }
 
       insertProperty.setString(1, data.getIdentifier());
       insertProperty.setString(2, data.getParentIdentifier());
@@ -269,12 +277,18 @@
    protected int addReference(PropertyData data) throws SQLException, IOException
    {
       if (insertReference == null)
+      {
          insertReference = dbConnection.prepareStatement(INSERT_REF);
+      }
       else
+      {
          insertReference.clearParameters();
+      }
 
       if (data.getQPath().getAsString().indexOf("versionableUuid") > 0)
+      {
          LOG.info("add ref versionableUuid " + data.getQPath().getAsString());
+      }
 
       List<ValueData> values = data.getValues();
       int added = 0;
@@ -299,9 +313,13 @@
    protected int deleteReference(String propertyIdentifier) throws SQLException
    {
       if (deleteReference == null)
+      {
          deleteReference = dbConnection.prepareStatement(DELETE_REF);
+      }
       else
+      {
          deleteReference.clearParameters();
+      }
 
       deleteReference.setString(1, propertyIdentifier);
       return deleteReference.executeUpdate();
@@ -314,9 +332,13 @@
    protected int deleteItemByIdentifier(String identifier) throws SQLException
    {
       if (deleteItem == null)
+      {
          deleteItem = dbConnection.prepareStatement(DELETE_ITEM);
+      }
       else
+      {
          deleteItem.clearParameters();
+      }
 
       deleteItem.setString(1, identifier);
       return deleteItem.executeUpdate();
@@ -329,9 +351,13 @@
    protected int updateNodeByIdentifier(int version, int index, int orderNumb, String identifier) throws SQLException
    {
       if (updateNode == null)
+      {
          updateNode = dbConnection.prepareStatement(UPDATE_NODE);
+      }
       else
+      {
          updateNode.clearParameters();
+      }
 
       updateNode.setInt(1, version);
       updateNode.setInt(2, index);
@@ -347,9 +373,13 @@
    protected int updatePropertyByIdentifier(int version, int type, String identifier) throws SQLException
    {
       if (updateProperty == null)
+      {
          updateProperty = dbConnection.prepareStatement(UPDATE_PROPERTY);
+      }
       else
+      {
          updateProperty.clearParameters();
+      }
 
       updateProperty.setInt(1, version);
       updateProperty.setInt(2, type);
@@ -364,9 +394,13 @@
    protected ResultSet findItemByName(String parentId, String name, int index) throws SQLException
    {
       if (findItemByName == null)
+      {
          findItemByName = dbConnection.prepareStatement(FIND_ITEM_BY_NAME);
+      }
       else
+      {
          findItemByName.clearParameters();
+      }
 
       findItemByName.setString(1, parentId);
       findItemByName.setString(2, name);
@@ -381,9 +415,13 @@
    protected ResultSet findPropertyByName(String parentId, String name) throws SQLException
    {
       if (findPropertyByName == null)
+      {
          findPropertyByName = dbConnection.prepareStatement(FIND_PROPERTY_BY_NAME);
+      }
       else
+      {
          findPropertyByName.clearParameters();
+      }
 
       findPropertyByName.setString(1, parentId);
       findPropertyByName.setString(2, name);
@@ -397,9 +435,13 @@
    protected ResultSet findItemByIdentifier(String identifier) throws SQLException
    {
       if (findItemById == null)
+      {
          findItemById = dbConnection.prepareStatement(FIND_ITEM_BY_ID);
+      }
       else
+      {
          findItemById.clearParameters();
+      }
 
       findItemById.setString(1, identifier);
       return findItemById.executeQuery();
@@ -412,9 +454,13 @@
    protected ResultSet findReferences(String nodeIdentifier) throws SQLException
    {
       if (findReferences == null)
+      {
          findReferences = dbConnection.prepareStatement(FIND_REFERENCES);
+      }
       else
+      {
          findReferences.clearParameters();
+      }
 
       findReferences.setString(1, nodeIdentifier);
       return findReferences.executeQuery();
@@ -427,9 +473,13 @@
    protected ResultSet findChildNodesByParentIdentifier(String parentIdentifier) throws SQLException
    {
       if (findNodesByParentId == null)
+      {
          findNodesByParentId = dbConnection.prepareStatement(FIND_NODES_BY_PARENTID);
+      }
       else
+      {
          findNodesByParentId.clearParameters();
+      }
 
       findNodesByParentId.setString(1, parentIdentifier);
       return findNodesByParentId.executeQuery();
@@ -442,9 +492,13 @@
    protected ResultSet findChildNodesByParentIdentifierCQ(String parentIdentifier) throws SQLException
    {
       if (findNodesByParentIdCQ == null)
+      {
          findNodesByParentIdCQ = dbConnection.prepareStatement(FIND_NODES_BY_PARENTID_CQ);
+      }
       else
+      {
          findNodesByParentIdCQ.clearParameters();
+      }
 
       findNodesByParentIdCQ.setString(1, parentIdentifier);
       return findNodesByParentIdCQ.executeQuery();
@@ -496,9 +550,13 @@
    protected ResultSet findLastOrderNumberByParentIdentifier(String parentIdentifier) throws SQLException
    {
       if (findLastOrderNumberByParentId == null)
+      {
          findLastOrderNumberByParentId = dbConnection.prepareStatement(FIND_LAST_ORDER_NUMBER_BY_PARENTID);
+      }
       else
+      {
          findLastOrderNumberByParentId.clearParameters();
+      }
 
       findLastOrderNumberByParentId.setString(1, parentIdentifier);
       return findLastOrderNumberByParentId.executeQuery();
@@ -511,9 +569,13 @@
    protected ResultSet findChildNodesCountByParentIdentifier(String parentIdentifier) throws SQLException
    {
       if (findNodesCountByParentId == null)
+      {
          findNodesCountByParentId = dbConnection.prepareStatement(FIND_NODES_COUNT_BY_PARENTID);
+      }
       else
+      {
          findNodesCountByParentId.clearParameters();
+      }
 
       findNodesCountByParentId.setString(1, parentIdentifier);
       return findNodesCountByParentId.executeQuery();
@@ -526,9 +588,13 @@
    protected ResultSet findChildPropertiesByParentIdentifier(String parentIdentifier) throws SQLException
    {
       if (findPropertiesByParentId == null)
+      {
          findPropertiesByParentId = dbConnection.prepareStatement(FIND_PROPERTIES_BY_PARENTID);
+      }
       else
+      {
          findPropertiesByParentId.clearParameters();
+      }
 
       findPropertiesByParentId.setString(1, parentIdentifier);
       return findPropertiesByParentId.executeQuery();
@@ -577,9 +643,13 @@
       throws SQLException
    {
       if (findNodesByParentIdLazilyCQ == null)
+      {
          findNodesByParentIdLazilyCQ = dbConnection.prepareStatement(FIND_NODES_BY_PARENTID_LAZILY_CQ);
+      }
       else
+      {
          findNodesByParentIdLazilyCQ.clearParameters();
+      }
 
       findNodesByParentIdLazilyCQ.setString(1, parentCid);
       findNodesByParentIdLazilyCQ.setInt(2, fromOrderNum);
@@ -599,9 +669,13 @@
    {
 
       if (insertValue == null)
+      {
          insertValue = dbConnection.prepareStatement(INSERT_VALUE);
+      }
       else
+      {
          insertValue.clearParameters();
+      }
 
       if (stream == null)
       {
@@ -627,9 +701,13 @@
    protected int deleteValueData(String cid) throws SQLException
    {
       if (deleteValue == null)
+      {
          deleteValue = dbConnection.prepareStatement(DELETE_VALUE);
+      }
       else
+      {
          deleteValue.clearParameters();
+      }
 
       deleteValue.setString(1, cid);
       return deleteValue.executeUpdate();
@@ -642,9 +720,13 @@
    protected ResultSet findValuesByPropertyId(String cid) throws SQLException
    {
       if (findValuesByPropertyId == null)
+      {
          findValuesByPropertyId = dbConnection.prepareStatement(FIND_VALUES_BY_PROPERTYID);
+      }
       else
+      {
          findValuesByPropertyId.clearParameters();
+      }
 
       findValuesByPropertyId.setString(1, cid);
       return findValuesByPropertyId.executeQuery();
@@ -657,9 +739,13 @@
    protected ResultSet findValueByPropertyIdOrderNumber(String cid, int orderNumb) throws SQLException
    {
       if (findValueByPropertyIdOrderNumber == null)
+      {
          findValueByPropertyIdOrderNumber = dbConnection.prepareStatement(FIND_VALUE_BY_PROPERTYID_OREDERNUMB);
+      }
       else
+      {
          findValueByPropertyIdOrderNumber.clearParameters();
+      }
 
       findValueByPropertyIdOrderNumber.setString(1, cid);
       findValueByPropertyIdOrderNumber.setInt(2, orderNumb);
@@ -673,9 +759,13 @@
    protected int renameNode(NodeData data) throws SQLException
    {
       if (renameNode == null)
+      {
          renameNode = dbConnection.prepareStatement(RENAME_NODE);
+      }
       else
+      {
          renameNode.clearParameters();
+      }
 
       renameNode.setString(1, data.getParentIdentifier() == null ? Constants.ROOT_PARENT_UUID : data
          .getParentIdentifier());
@@ -694,10 +784,14 @@
    protected ResultSet findValuesStorageDescriptorsByPropertyId(String cid) throws SQLException
    {
       if (findValuesStorageDescriptorsByPropertyId == null)
+      {
          findValuesStorageDescriptorsByPropertyId =
             dbConnection.prepareStatement(FIND_VALUES_VSTORAGE_DESC_BY_PROPERTYID);
+      }
       else
+      {
          findValuesStorageDescriptorsByPropertyId.clearParameters();
+      }
 
       findValuesStorageDescriptorsByPropertyId.setString(1, cid);
       return findValuesStorageDescriptorsByPropertyId.executeQuery();
@@ -710,9 +804,13 @@
    protected ResultSet findChildPropertiesByParentIdentifierCQ(String parentIdentifier) throws SQLException
    {
       if (findPropertiesByParentIdCQ == null)
+      {
          findPropertiesByParentIdCQ = dbConnection.prepareStatement(FIND_PROPERTIES_BY_PARENTID_CQ);
+      }
       else
+      {
          findPropertiesByParentIdCQ.clearParameters();
+      }
 
       findPropertiesByParentIdCQ.setString(1, parentIdentifier);
       return findPropertiesByParentIdCQ.executeQuery();
@@ -725,10 +823,14 @@
    protected ResultSet findNodeMainPropertiesByParentIdentifierCQ(String parentIdentifier) throws SQLException
    {
       if (findNodeMainPropertiesByParentIdentifierCQ == null)
+      {
          findNodeMainPropertiesByParentIdentifierCQ =
             dbConnection.prepareStatement(FIND_NODE_MAIN_PROPERTIES_BY_PARENTID_CQ);
+      }
       else
+      {
          findNodeMainPropertiesByParentIdentifierCQ.clearParameters();
+      }
 
       findNodeMainPropertiesByParentIdentifierCQ.setString(1, parentIdentifier);
       return findNodeMainPropertiesByParentIdentifierCQ.executeQuery();
@@ -741,9 +843,13 @@
    protected ResultSet findItemQPathByIdentifierCQ(String identifier) throws SQLException
    {
       if (findItemQPathByIdentifierCQ == null)
+      {
          findItemQPathByIdentifierCQ = dbConnection.prepareStatement(FIND_ITEM_QPATH_BY_ID_CQ);
+      }
       else
+      {
          findItemQPathByIdentifierCQ.clearParameters();
+      }
 
       findItemQPathByIdentifierCQ.setString(1, identifier);
       return findItemQPathByIdentifierCQ.executeQuery();
@@ -752,9 +858,13 @@
    protected int deleteValueDataByOrderNum(String id, int orderNum) throws SQLException
    {
       if (deleteValueDataByOrderNum == null)
+      {
          deleteValueDataByOrderNum = dbConnection.prepareStatement(DELETE_VALUE_BY_ORDER_NUM);
+      }
       else
+      {
          deleteValueDataByOrderNum.clearParameters();
+      }
 
       deleteValueDataByOrderNum.setString(1, id);
       deleteValueDataByOrderNum.setInt(2, orderNum);
@@ -764,9 +874,13 @@
    protected ResultSet findPropertyById(String id) throws SQLException
    {
       if (findPropertyById == null)
+      {
          findPropertyById = dbConnection.prepareStatement(FIND_PROPERTY_BY_ID);
+      }
       else
+      {
          findPropertyById.clearParameters();
+      }
 
       findPropertyById.setString(1, id);
       return findPropertyById.executeQuery();
@@ -777,9 +891,13 @@
    {
 
       if (updateValue == null)
+      {
          updateValue = dbConnection.prepareStatement(UPDATE_VALUE);
+      }
       else
+      {
          updateValue.clearParameters();
+      }
 
       if (stream == null)
       {

Modified: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestGetNodesLazily.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestGetNodesLazily.java	2011-08-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestGetNodesLazily.java	2011-08-15 15:06:52 UTC (rev 4755)
@@ -53,10 +53,12 @@
       testRoot = (NodeImpl)session.getRootNode().addNode("TestGetNodesLazily");
 
       // add first 150 child nodes
-      nodesCount = 150;
+      nodesCount = 350;
       for (int i = 0; i < nodesCount; i++)
       {
-         testRoot.addNode("child" + i).setProperty(INDEX_PROPERTY, i);
+         Node newNode = testRoot.addNode("child" + i);
+         newNode.setProperty(INDEX_PROPERTY, i);
+         newNode.addMixin("exo:owneable");
       }
       session.save();
       txService = (TransactionService)container.getComponentInstanceOfType(TransactionService.class);



More information about the exo-jcr-commits mailing list