[exo-jcr-commits] exo-jcr SVN: r464 - in jcr/trunk/exo.jcr.component.core/src: test/java/org/exoplatform/services/jcr/impl/core and 1 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Mon Nov 2 11:32:35 EST 2009


Author: areshetnyak
Date: 2009-11-02 11:32:35 -0500 (Mon, 02 Nov 2009)
New Revision: 464

Added:
   jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestSVNodeDataOptimization.java
Modified:
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SysViewWorkspaceInitializer.java
   jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-configuration.xml
Log:
EXOJCR-219 : The method SysViewWorkspaceinitializer.SVNodeData.addChildNode(InternalQName childName) was optimized.

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SysViewWorkspaceInitializer.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SysViewWorkspaceInitializer.java	2009-11-02 15:00:38 UTC (rev 463)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SysViewWorkspaceInitializer.java	2009-11-02 16:32:35 UTC (rev 464)
@@ -55,6 +55,7 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Stack;
@@ -299,11 +300,14 @@
       }
    }
 
-   protected class SVNodeData extends TransientNodeData
+   protected class SVNodeData
+      extends TransientNodeData
    {
 
-      List<InternalQName> childNodes = new LinkedList<InternalQName>();
+      int orderNumber = 0;
 
+      HashMap<InternalQName, Integer> childNodesMap = new HashMap<InternalQName, Integer>();
+
       SVNodeData(QPath path, String identifier, String parentIdentifier, int version, int orderNum)
       {
          super(path, identifier, version, null, null, orderNum, parentIdentifier, null);
@@ -321,15 +325,16 @@
        */
       int[] addChildNode(InternalQName childName)
       {
-         int orderNumber = childNodes.size();
-         int index = 1;
-         for (int i = 0; i < childNodes.size(); i++)
+         Integer count = childNodesMap.get(childName);
+         if (count != null)
          {
-            if (childName.equals(childNodes.get(i)))
-               index++;
+            childNodesMap.put(childName, count + 1);
          }
-         childNodes.add(childName);
-         return new int[]{orderNumber, index};
+         else
+            childNodesMap.put(childName, 1);
+
+         int index = childNodesMap.get(childName);
+         return new int[] {orderNumber++, index};
       }
    }
 

Added: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestSVNodeDataOptimization.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestSVNodeDataOptimization.java	                        (rev 0)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestSVNodeDataOptimization.java	2009-11-02 16:32:35 UTC (rev 464)
@@ -0,0 +1,263 @@
+/*
+ * Copyright (C) 2003-2009 eXo Platform SAS.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Affero General Public License
+ * as published by the Free Software Foundation; either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see<http://www.gnu.org/licenses/>.
+ */
+package org.exoplatform.services.jcr.impl.core;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.jcr.Node;
+import javax.jcr.NodeIterator;
+
+import org.exoplatform.services.jcr.JcrImplBaseTest;
+import org.exoplatform.services.jcr.config.ContainerEntry;
+import org.exoplatform.services.jcr.config.QueryHandlerEntry;
+import org.exoplatform.services.jcr.config.SimpleParameterEntry;
+import org.exoplatform.services.jcr.config.WorkspaceEntry;
+import org.exoplatform.services.jcr.config.WorkspaceInitializerEntry;
+import org.exoplatform.services.jcr.datamodel.NodeData;
+
+/**
+ * Created by The eXo Platform SAS.
+ * 
+ * <br/>
+ * Date: 02.11.2009
+ * 
+ * @author <a href="mailto:alex.reshetnyak at exoplatform.com.ua">Alex Reshetnyak</a>
+ * @version $Id$
+ */
+public class TestSVNodeDataOptimization
+   extends JcrImplBaseTest
+{
+   
+   @Override
+   public void setUp() throws Exception
+   {
+      super.setUp();
+      SessionImpl ses = (SessionImpl) repository.login(credentials, "ws1");
+      if (ses != null)
+      {
+         try
+         {
+            ses.refresh(false);
+            Node rootNode = ses.getRootNode();
+            if (rootNode.hasNodes())
+            {
+               // clean test root
+               for (NodeIterator children = rootNode.getNodes(); children.hasNext();)
+               {
+                  Node node = children.nextNode();
+                  if (!node.getPath().startsWith("/jcr:system"))
+                  {
+                     // log.info("DELETing ------------- "+node.getPath());
+                     node.remove();
+                  }
+               }
+               ses.save();
+            }
+         }
+         catch (Exception e)
+         {
+            log.error("tearDown() ERROR " + getClass().getName() + "." + getName() + " " + e, e);
+         }
+         finally
+         {
+            ses.logout();
+         }
+      }
+   }
+
+   @Override
+   protected void tearDown() throws Exception
+   {
+      SessionImpl ses = (SessionImpl) repository.login(credentials, "ws1");
+      if (ses != null)
+      {
+         try
+         {
+            ses.refresh(false);
+            Node rootNode = ses.getRootNode();
+            if (rootNode.hasNodes())
+            {
+               // clean test root
+               for (NodeIterator children = rootNode.getNodes(); children.hasNext();)
+               {
+                  Node node = children.nextNode();
+                  if (!node.getPath().startsWith("/jcr:system"))
+                  {
+                     // log.info("DELETing ------------- "+node.getPath());
+                     node.remove();
+                  }
+               }
+               ses.save();
+            }
+         }
+         catch (Exception e)
+         {
+            log.error("tearDown() ERROR " + getClass().getName() + "." + getName() + " " + e, e);
+         }
+         finally
+         {
+            ses.logout();
+         }
+      }
+      super.tearDown();
+   }
+
+   public void testSVNodeData() throws Exception
+   {
+
+      //ADD content
+      SessionImpl ses = (SessionImpl) repository.login(credentials, "ws1");
+
+      //Add node with sub name sibling
+      Node nodeSNS = ses.getRootNode().addNode("node_with_sns");
+      for (int i = 0; i < 100; i++)
+      {
+         nodeSNS.addNode("node_sns_");
+      }
+
+      //Add node without sub name sibling
+      Node nodeWOSNS = ses.getRootNode().addNode("node_without_sns");
+      for (int i = 0; i < 100; i++)
+      {
+         nodeSNS.addNode("node_" + i);
+      }
+
+      ses.save();
+
+      // Cereate backup
+      File backup = File.createTempFile("full-backup", ".xml");
+      backup.deleteOnExit();
+
+      ses.exportWorkspaceSystemView(new FileOutputStream(backup), false, false);
+
+      // restore to ws1_restored
+      WorkspaceEntry ws1_restore =
+               makeWorkspaceEntry("ws1_restored", isMultiDB(session) ? "jdbcjcr2export3" : "jdbcjcr", backup, ses);
+      repository.configWorkspace(ws1_restore);
+      repository.createWorkspace(ws1_restore.getName());
+
+      // check
+      SessionImpl backupSession = (SessionImpl) repository.login(credentials, "ws1_restored");
+
+      assertNotNull(backupSession);
+
+      checkEquals(ses, backupSession);
+   }
+
+   private void checkEquals(SessionImpl expected, SessionImpl actual) throws Exception
+   {
+      NodeImpl srcNode = (NodeImpl) expected.getRootNode();
+      NodeImpl destNode = (NodeImpl) actual.getRootNode();
+
+      checkNodeEquals(srcNode, destNode);
+   }
+
+   private void checkNodeEquals(NodeImpl src, NodeImpl dest) throws Exception
+   {
+      assertTrue(dest.equals(src));
+      assertEquals(src.getIndex(), dest.getIndex());
+      assertEquals(((NodeData) src.getData()).getOrderNumber(), ((NodeData) dest.getData()).getOrderNumber());
+
+      NodeIterator srcIterator = src.getNodes();
+      NodeIterator destIterator = dest.getNodes();
+
+      assertEquals(srcIterator.getSize(), destIterator.getSize());
+
+      while (srcIterator.hasNext())
+         checkNodeEquals((NodeImpl) srcIterator.nextNode(), (NodeImpl) destIterator.nextNode());
+   }
+
+   private WorkspaceEntry makeWorkspaceEntry(String name, String sourceName, File sysViewFile, SessionImpl ses)
+   {
+      WorkspaceEntry ws1e = (WorkspaceEntry) ses.getContainer().getComponentInstanceOfType(WorkspaceEntry.class);
+
+      WorkspaceEntry ws1back = new WorkspaceEntry();
+      ws1back.setName(name);
+      ws1back.setUniqueName(((RepositoryImpl) ses.getRepository()).getName() + "_" + ws1back.getName());
+
+      ws1back.setAccessManager(ws1e.getAccessManager());
+      ws1back.setAutoInitializedRootNt(ws1e.getAutoInitializedRootNt());
+      ws1back.setAutoInitPermissions(ws1e.getAutoInitPermissions());
+      ws1back.setCache(ws1e.getCache());
+      ws1back.setContainer(ws1e.getContainer());
+      ws1back.setLockManager(ws1e.getLockManager());
+
+      // Initializer
+      WorkspaceInitializerEntry wiEntry = new WorkspaceInitializerEntry();
+      wiEntry.setType(SysViewWorkspaceInitializer.class.getCanonicalName());
+
+      List<SimpleParameterEntry> wieParams = new ArrayList<SimpleParameterEntry>();
+      wieParams
+               .add(new SimpleParameterEntry(SysViewWorkspaceInitializer.RESTORE_PATH_PARAMETER, sysViewFile.getPath()));
+
+      wiEntry.setParameters(wieParams);
+
+      ws1back.setInitializer(wiEntry);
+
+      // Indexer
+      ArrayList qParams = new ArrayList();
+      qParams.add(new SimpleParameterEntry("indexDir", "target" + File.separator + name));
+      QueryHandlerEntry qEntry =
+               new QueryHandlerEntry("org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex", qParams);
+
+      ws1back.setQueryHandler(qEntry);
+
+      ArrayList params = new ArrayList();
+      for (Iterator i = ws1back.getContainer().getParameters().iterator(); i.hasNext();)
+      {
+         SimpleParameterEntry p = (SimpleParameterEntry) i.next();
+         SimpleParameterEntry newp = new SimpleParameterEntry(p.getName(), p.getValue());
+
+         if (isMultiDB(ses) && newp.getName().equals("source-name"))
+            newp.setValue(sourceName);
+         else if (newp.getName().equals("swap-directory"))
+            newp.setValue("target/temp/swap/" + name);
+         else if (isMultiDB(ses) && newp.getName().equals("dialect"))
+            newp.setValue("hsqldb");
+
+         params.add(newp);
+      }
+
+      ContainerEntry ce =
+               new ContainerEntry("org.exoplatform.services.jcr.impl.storage.jdbc.JDBCWorkspaceDataContainer", params);
+      ws1back.setContainer(ce);
+
+      return ws1back;
+   }
+
+   private boolean isMultiDB(SessionImpl session)
+   {
+      WorkspaceEntry ws1e = (WorkspaceEntry) session.getContainer().getComponentInstanceOfType(WorkspaceEntry.class);
+
+      for (Iterator i = ws1e.getContainer().getParameters().iterator(); i.hasNext();)
+      {
+         SimpleParameterEntry p = (SimpleParameterEntry) i.next();
+         SimpleParameterEntry newp = new SimpleParameterEntry(p.getName(), p.getValue());
+
+         if (newp.getName().equals("multi-db"))
+            return Boolean.valueOf(newp.getValue());
+      }
+
+      throw new RuntimeException("Can not get property 'multi-db' in configuration on workspace '" + ws1e.getName()
+               + "'");
+   }
+
+}


Property changes on: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestSVNodeDataOptimization.java
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Modified: jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-configuration.xml
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-configuration.xml	2009-11-02 15:00:38 UTC (rev 463)
+++ jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-configuration.xml	2009-11-02 16:32:35 UTC (rev 464)
@@ -478,6 +478,33 @@
         </properties-param>
       </init-params>
     </component-plugin>
+    <component-plugin>
+      <name>bind.datasource</name>
+      <set-method>addPlugin</set-method>
+      <type>org.exoplatform.services.naming.BindReferencePlugin</type>
+      <init-params>
+        <value-param>
+          <name>bind-name</name>
+          <value>jdbcjcr2export3</value>
+        </value-param>
+        <value-param>
+          <name>class-name</name>
+          <value>javax.sql.DataSource</value>
+        </value-param>
+        <value-param>
+          <name>factory</name>
+          <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
+        </value-param>
+        <properties-param>
+          <name>ref-addresses</name>
+          <description>ref-addresses</description>
+          <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
+          <property name="url" value="jdbc:hsqldb:file:target/temp/data/jdbcjcr2export3"/>
+          <property name="username" value="sa"/>
+          <property name="password" value=""/>
+        </properties-param>
+      </init-params>
+    </component-plugin>
     <!-- Resource configuration for UserTransaction
     use JOTM
     -->



More information about the exo-jcr-commits mailing list