[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