[exo-jcr-commits] exo-jcr SVN: r1172 - in jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation: db and 1 other directory.

do-not-reply at jboss.org do-not-reply at jboss.org
Thu Dec 24 10:52:23 EST 2009


Author: sergiykarpenko
Date: 2009-12-24 10:52:23 -0500 (Thu, 24 Dec 2009)
New Revision: 1172

Modified:
   jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/NewJDBCStorageConnection.java
   jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MultiDbJDBCConnection.java
Log:
EXOJCR-302: getChildNodes query result parsing implemented

Modified: jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/NewJDBCStorageConnection.java
===================================================================
--- jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/NewJDBCStorageConnection.java	2009-12-24 15:52:07 UTC (rev 1171)
+++ jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/NewJDBCStorageConnection.java	2009-12-24 15:52:23 UTC (rev 1172)
@@ -60,7 +60,10 @@
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.StringTokenizer;
 
 import javax.jcr.InvalidItemStateException;
@@ -587,12 +590,22 @@
       checkIfOpened();
       try
       {
-         ResultSet node = findChildNodesByParentIdentifier(getInternalId(parent.getIdentifier()));
-         List<NodeData> childrens = new ArrayList<NodeData>();
-         while (node.next())
-            childrens.add((NodeData)itemData(parent.getQPath(), node, I_CLASS_NODE, parent.getACL()));
+         //         ResultSet node = findChildNodesByParentIdentifier(getInternalId(parent.getIdentifier()));
+         //         List<NodeData> childrens = new ArrayList<NodeData>();
+         //         while (node.next())
+         //            childrens.add((NodeData)itemData(parent.getQPath(), node, I_CLASS_NODE, parent.getACL()));
+         //
+         //         return childrens;
+         ResultSet resultSet = findChildNodesByParentIdentifierNew(getInternalId(parent.getIdentifier()));
+         if (resultSet.next())
+         {
+            return loadChildNodesData(resultSet, parent);
+         }
+         else
+         {
+            return new ArrayList<NodeData>();
+         }
 
-         return childrens;
       }
       catch (SQLException e)
       {
@@ -604,6 +617,80 @@
       }
    }
 
+   protected List<NodeData> loadChildNodesData(ResultSet resultSet, NodeData parent) throws RepositoryException,
+      IOException, SQLException
+   {
+
+      Map<String, TempNodeData> nodesData = new LinkedHashMap<String, TempNodeData>();
+      do
+      {
+         int itemClass = resultSet.getInt(COLUMN_CLASS);
+         if (itemClass == I_CLASS_NODE)
+         {
+            TempNodeData data = new TempNodeData(resultSet);
+            nodesData.put(data.cid, data);
+         }
+         else
+         {
+            String cpid = resultSet.getString(COLUMN_PARENTID);
+            TempNodeData data = nodesData.get(cpid);
+            if (data.properties == null)
+            {
+               data.properties = new HashMap<String, List<byte[]>>();
+            }
+            Map<String, List<byte[]>> properties = data.properties;
+            String key = resultSet.getString(COLUMN_NAME);
+            List<byte[]> values = properties.get(key);
+            if (values == null)
+            {
+               values = new ArrayList<byte[]>();
+               properties.put(key, values);
+            }
+            values.add(resultSet.getBytes(COLUMN_VDATA));
+         }
+      }
+      while (resultSet.next());
+
+      List<NodeData> childrens = new ArrayList<NodeData>(nodesData.size());
+      QPath parentQPath = parent.getQPath();
+      AccessControlList parentACL = parent.getACL();
+      for (TempNodeData data : nodesData.values())
+      {
+         NodeData nodeData = loadNodeRecordFromBuffer(data, parentQPath, parentACL);
+         childrens.add(nodeData);
+      }
+      return childrens;
+   }
+
+   private static class TempNodeData
+   {
+      String cid;
+
+      String cname;
+
+      int cversion;
+
+      String cpid;
+
+      int cindex;
+
+      int cnordernumb;
+
+      Map<String, List<byte[]>> properties = new HashMap<String, List<byte[]>>();
+
+      public TempNodeData(ResultSet item) throws SQLException
+      {
+         cid = item.getString(COLUMN_ID);
+         cname = item.getString(COLUMN_NAME);
+         cversion = item.getInt(COLUMN_VERSION);
+
+         cpid = item.getString(COLUMN_PARENTID);
+
+         cindex = item.getInt(COLUMN_INDEX);
+         cnordernumb = item.getInt(COLUMN_NORDERNUM);
+      }
+   }
+
    /**
     * {@inheritDoc}
     */
@@ -1821,6 +1908,157 @@
       }
    }
 
+   protected PersistedNodeData loadNodeRecordFromBuffer(TempNodeData buf, QPath parentPath, AccessControlList pACL)
+      throws RepositoryException, SQLException, IOException
+   {
+
+      String cid = buf.cid;
+      String cname = buf.cname;
+      int cversion = buf.cversion;
+      String cpid = buf.cpid;
+      int cindex = buf.cindex;
+      int cnordernumb = buf.cnordernumb;
+      AccessControlList parentACL = pACL;
+
+      try
+      {
+         InternalQName qname = InternalQName.parse(cname);
+
+         // TODO can't avoid QPath traverse
+         QPath qpath;
+         String parentCid;
+         if (parentPath != null)
+         {
+            // get by parent and name
+            qpath = QPath.makeChildPath(parentPath, qname, cindex);
+            parentCid = cpid;
+         }
+         else
+         {
+            // get by id
+            if (cpid.equals(Constants.ROOT_PARENT_UUID))
+            {
+               // root node
+               qpath = Constants.ROOT_PATH;
+               parentCid = null;
+            }
+            else
+            {
+               qpath = QPath.makeChildPath(traverseQPath(cpid), qname, cindex);
+               parentCid = cpid;
+            }
+         }
+
+         // PRIMARY
+
+         List<byte[]> primaryType = buf.properties.get(Constants.JCR_PRIMARYTYPE.getAsString());
+         if (primaryType == null || primaryType.size() == 0)
+         {
+            throw new SQLException("Node finded but primaryType property not " + cid);
+         }
+
+         byte[] data = primaryType.get(0);
+         InternalQName ptName = InternalQName.parse(new String((data != null ? data : new byte[]{})));
+
+         // MIXIN
+         MixinInfo mixins = null;
+         List<InternalQName> mts = null;
+         boolean owneable = false;
+         boolean privilegeable = false;
+         List<byte[]> mixinTypes = buf.properties.get(Constants.JCR_MIXINTYPES.getAsString());
+         if (mixinTypes != null)
+         {
+            mts = new ArrayList<InternalQName>();
+            for (byte[] mxnb : mixinTypes)
+            {
+               InternalQName mxn = InternalQName.parse(new String(mxnb));
+               mts.add(mxn);
+
+               if (!privilegeable && Constants.EXO_PRIVILEGEABLE.equals(mxn))
+                  privilegeable = true;
+               else if (!owneable && Constants.EXO_OWNEABLE.equals(mxn))
+                  owneable = true;
+            }
+         }
+
+         mixins = new MixinInfo(mts, owneable, privilegeable);
+
+         try
+         {
+            // ACL
+            AccessControlList acl; // NO DEFAULT values!
+
+            if (mixins.hasOwneable())
+            {
+               // has own owner
+               if (mixins.hasPrivilegeable())
+               {
+                  // and permissions
+                  acl = new AccessControlList(readACLOwner(cid), readACLPermisions(cid));
+               }
+               else if (parentACL != null)
+               {
+                  // use permissions from existed parent
+                  acl =
+                     new AccessControlList(readACLOwner(cid), parentACL.hasPermissions() ? parentACL
+                        .getPermissionEntries() : null);
+               }
+               else
+               {
+                  // have to search nearest ancestor permissions in ACL manager
+                  // acl = new AccessControlList(readACLOwner(cid), traverseACLPermissions(cpid));
+                  acl = new AccessControlList(readACLOwner(cid), null);
+               }
+            }
+            else if (mixins.hasPrivilegeable())
+            {
+               // has own permissions
+               if (mixins.hasOwneable())
+               {
+                  // and owner
+                  acl = new AccessControlList(readACLOwner(cid), readACLPermisions(cid));
+               }
+               else if (parentACL != null)
+               {
+                  // use owner from existed parent
+                  acl = new AccessControlList(parentACL.getOwner(), readACLPermisions(cid));
+               }
+               else
+               {
+                  // have to search nearest ancestor owner in ACL manager
+                  // acl = new AccessControlList(traverseACLOwner(cpid), readACLPermisions(cid));
+                  acl = new AccessControlList(null, readACLPermisions(cid));
+               }
+            }
+            else
+            {
+               if (parentACL != null)
+                  // construct ACL from existed parent ACL
+                  acl =
+                     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,
+               ptName, mixins.mixinNames(), acl);
+
+         }
+         catch (IllegalACLException e)
+         {
+            throw new RepositoryException("FATAL ERROR Node " + getIdentifier(cid) + " " + qpath.getAsString()
+               + " has wrong formed ACL. ", e);
+         }
+      }
+      catch (IllegalNameException e)
+      {
+         throw new RepositoryException(e);
+      }
+   }
+
    protected PersistedPropertyData loadPropertyRecord(ResultSet item, QPath parentPath) throws RepositoryException,
       SQLException, IOException
    {

Modified: jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MultiDbJDBCConnection.java
===================================================================
--- jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MultiDbJDBCConnection.java	2009-12-24 15:52:07 UTC (rev 1171)
+++ jcr/branches/1.12.0-OPT/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MultiDbJDBCConnection.java	2009-12-24 15:52:23 UTC (rev 1172)
@@ -223,10 +223,10 @@
       FIND_NODES_BY_PARENTID = "select * from JCR_MITEM" + " where I_CLASS=1 and PARENT_ID=?" + " order by N_ORDER_NUM";
 
       FIND_NODES_BY_PARENTID_NEW =
-         "select I.*, V.ORDER_NUM, V.DATA, V.STORAGE_DESC"
-            + " from JCR_MITEM I LEFT OUTER JOIN JCR_MVALUE V ON (V.PROPERTY_ID=I.ID), (select ID, PARENT_ID from JCR_MITEM where PARENT_ID=? AND I_CLASS=1) I2"
-            + " where (I.PARENT_ID=? AND I.I_CLASS=1 AND I2.ID=I.ID) OR (I.I_CLASS=2 and I.PARENT_ID=I2.ID and"
-            + " I.NAME IN ('[http://www.jcp.org/jcr/1.0]primaryType','[http://www.jcp.org/jcr/1.0]mixinTypes')) order by I.I_CLASS, I.N_ORDER_NUM";
+         "select I.*, V.DATA"
+            + " from JCR_MITEM I LEFT OUTER JOIN JCR_MVALUE V ON (V.PROPERTY_ID=I.ID), (select ID from JCR_MITEM where PARENT_ID=? AND I_CLASS=1) I2"
+            + " where (I.I_CLASS=1 AND I.ID=I2.ID) OR (I.I_CLASS=2 and I.PARENT_ID=I2.ID and"
+            + " (I.NAME='[http://www.jcp.org/jcr/1.0]primaryType' OR I.NAME='[http://www.jcp.org/jcr/1.0]mixinTypes')) order by I.I_CLASS, I.N_ORDER_NUM";
       //,'[http://www.exoplatform.com/jcr/exo/1.0]owner','[http://www.exoplatform.com/jcr/exo/1.0]permissions'
 
       FIND_NODES_COUNT_BY_PARENTID = "select count(ID) from JCR_MITEM" + " where I_CLASS=1 and PARENT_ID=?";
@@ -506,7 +506,7 @@
          findNodesByParentId.clearParameters();
 
       findNodesByParentId.setString(1, parentIdentifier);
-      findNodesByParentId.setString(2, parentIdentifier);
+      //findNodesByParentId.setString(2, parentIdentifier);
       return findNodesByParentId.executeQuery();
    }
 



More information about the exo-jcr-commits mailing list