Improve JCR
authorMathieu Baudier <mbaudier@argeo.org>
Mon, 19 Apr 2010 11:17:35 +0000 (11:17 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Mon, 19 Apr 2010 11:17:35 +0000 (11:17 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@3479 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

24 files changed:
demo/pom.xml
demo/server.properties
demo/server_jcr.properties [new file with mode: 0644]
demo/site/org.argeo.slc.demo.log4j/log4j.properties
dist/org.argeo.slc.sdk/pom.xml
integration-tests/org.argeo.slc.it.webapp/pom.xml
modules/server/org.argeo.slc.server.hibernate/META-INF/MANIFEST.MF
modules/server/org.argeo.slc.server.hibernate/META-INF/spring/db-osgi.xml
modules/server/org.argeo.slc.server.hibernate/META-INF/spring/db.xml
modules/server/org.argeo.slc.server.jcr/META-INF/MANIFEST.MF
modules/server/org.argeo.slc.server.jcr/META-INF/spring/jcr-osgi.xml
modules/server/org.argeo.slc.server.jcr/META-INF/spring/jcr.xml
modules/server/org.argeo.slc.server.jcr/repository.xml [new file with mode: 0644]
modules/server/org.argeo.slc.server.main/META-INF/spring/main.xml
modules/server/org.argeo.slc.webapp.war/META-INF/MANIFEST.MF
modules/server/org.argeo.slc.webapp.war/WEB-INF/applicationContext.xml
modules/server/org.argeo.slc.webapp.war/WEB-INF/osgi.xml
runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/dao/AbstractSlcJcrDao.java
runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/dao/SlcExecutionDaoJcr.java
runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/dao/TreeTestResultCollectionDaoJcr.java
runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/dao/TreeTestResultDaoJcr.java
runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/dao/TreeTestResultNodeMapper.java
runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/mvc/OpenSessionInViewJcrInterceptor.java [new file with mode: 0644]
runtime/org.argeo.slc.support.jcr/src/test/resources/org/argeo/slc/jcr/dao/applicationContext.xml

index d3a3da7595a91159cd1d48ce89c5bbf0c101d93d..2fad017961e6c7c60883fb9331985bbf7de00295 100644 (file)
@@ -42,7 +42,7 @@
                                                                        org.springframework.osgi.extender,
                                                                        org.argeo.server.ads.server,
                                                                        org.argeo.slc.server.hsqldb,
-                                                                       org.argeo.slc.server.jcr,
+                                                                       org.argeo.slc.server.hibernate,
                                                                        org.argeo.slc.server.main,
                                                                        org.argeo.slc.ria
                                                                </argeo.osgi.start>
index a05439d43dd4e4b4b3fda862f01947f40d26309a..0f5eabe9df23ab3e3b170826c0408eceff335adb 100644 (file)
@@ -2,5 +2,6 @@ argeo.osgi.start=\
 org.springframework.osgi.extender,\
 org.argeo.server.ads.server,\
 org.argeo.slc.server.hsqldb,\
+org.argeo.slc.server.hibernate,\
 org.argeo.slc.server.main,\
 org.argeo.slc.ria
diff --git a/demo/server_jcr.properties b/demo/server_jcr.properties
new file mode 100644 (file)
index 0000000..800ab8e
--- /dev/null
@@ -0,0 +1,6 @@
+argeo.osgi.start=\
+org.springframework.osgi.extender,\
+org.argeo.server.ads.server,\
+org.argeo.slc.server.jcr,\
+org.argeo.slc.server.main,\
+org.argeo.slc.ria
index 1b67114231b030dab2a4f1038b38fecc4de3c9b2..5c44cdd99f2d1cf20e44d04545fdd17165552bba 100644 (file)
@@ -32,6 +32,9 @@ log4j.logger.org.apache.directory.server=INFO
 log4j.logger.org.apache.directory.server.core.partition=ERROR
 log4j.logger.org.apache.directory.server.core.schema.bootstrap.BootstrapAttributeTypeRegistry=ERROR
 
+log4j.logger.org.apache.jackrabbit=WARN
+log4j.logger.org.apache.jackrabbit.core.query.lucene=ERROR
+
 ## Appenders
 # console is set to be a ConsoleAppender.
 log4j.appender.console=org.apache.log4j.ConsoleAppender
index f69e9a952c58cf9f0dce734119d95540991ba63e..e3b2e55afea45bf8d2b86e96cec53c5b49c24059 100644 (file)
                </plugins>
        </build>
        <dependencies>
-               <dependency>
-                       <groupId>org.argeo.slc.dep</groupId>
-                       <artifactId>org.argeo.slc.dep.server</artifactId>
-                       <version>${project.version}</version>
-               </dependency>
                <dependency>
                        <groupId>org.argeo.slc.dep</groupId>
                        <artifactId>org.argeo.slc.dep.sdk</artifactId>
index 321687592ccc9303b3966e160e55dcd48f493a29..9d3bfae5d667d6445957cc7ce210259f63dbe85c 100644 (file)
                                                <arg>-clean</arg>
                                        </argsToAppend>
                                        <systemProperties>
+                                               <argeo.osgi.bundles>
+                                                       ${basedir}/../../demo/site;in=*;ex=target;ex=pom.xml;ex=.*,
+                                               </argeo.osgi.bundles><!--                                               
                                                <argeo.osgi.bundles>
                                                        ${basedir}/../../demo/site;in=*;ex=target;ex=pom.xml;ex=.*,
                                                        ${basedir}/../../modules/server;in=*;ex=target;ex=pom.xml;ex=.*,
                                                        ${basedir}/../../modules/agent;in=*;ex=target;ex=pom.xml;ex=.*
                                                </argeo.osgi.bundles>
+                                               --><!--
                                                <argeo.osgi.start>
                                                        org.springframework.osgi.extender,
                                                        org.argeo.slc.server.main,
                                                        org.argeo.slc.server.hsqldb,
+                                                       org.argeo.slc.server.hibernate,
+                                                       org.argeo.slc.ria,
+                                                       org.argeo.slc.agent,
+                                                       org.argeo.slc.agent.jms                                                 
+                                               </argeo.osgi.start>
+                                               --><argeo.osgi.start>
+                                                       org.springframework.osgi.extender,
+                                                       org.argeo.slc.server.jcr,
+                                                       org.argeo.slc.server.main,
                                                        org.argeo.slc.ria,
                                                        org.argeo.slc.agent,
                                                        org.argeo.slc.agent.jms                                                 
                </plugins>
        </build>
        <dependencies>
-               <dependency>
-                       <groupId>org.argeo.commons.osgi</groupId>
-                       <artifactId>org.argeo.osgi.boot</artifactId>
-                       <version>${version.argeo-commons}</version>
-               </dependency>
-
-               <dependency>
-                       <groupId>org.argeo.slc.dep</groupId>
-                       <artifactId>org.argeo.slc.dep.server</artifactId>
-                       <version>${project.version}</version>
-               </dependency>
                <dependency>
                        <groupId>org.argeo.slc.dep</groupId>
-                       <artifactId>org.argeo.slc.dep.agent</artifactId>
+                       <artifactId>org.argeo.slc.dep.sdk</artifactId>
                        <version>${project.version}</version>
                </dependency>
-
-               <!-- Security -->
-               <dependency>
-                       <groupId>org.argeo.commons.security</groupId>
-                       <artifactId>org.argeo.security.dep.ads</artifactId>
-                       <version>${version.argeo-commons}</version>
-                       <type>pom</type>
-               </dependency>
-
-               <!-- RIA -->
-               <dependency>
-                       <groupId>org.argeo.slc.server</groupId>
-                       <artifactId>org.argeo.slc.ria</artifactId>
-               </dependency>
-
                <!-- Unit Tests -->
                <dependency>
                        <groupId>org.argeo.slc.runtime</groupId>
index cb8c9cdee227e79935e42090f3c19c973913c2db..38f86340fbdea062b8f57f7664f8e781fb3c228a 100644 (file)
@@ -23,5 +23,7 @@ Import-Package: org.aopalliance.aop,
  org.springframework.aop,
  org.springframework.aop.framework,
  org.springframework.orm.hibernate3,
- org.springframework.transaction
+ org.springframework.orm.hibernate3.support,
+ org.springframework.transaction,
+ org.springframework.web.context.request
 Bundle-Name: Server Hibernate
index d17489ba397c25072e2f5d8694b85f72444812bb..c85ccd5a2c65f1438ba97dec419a5eaf8f7cccda 100644 (file)
        <service interface="org.argeo.slc.dao.runtime.SlcAgentDescriptorDao"\r
                ref="slcAgentDescriptorDao" />\r
 \r
+       <service\r
+               interface="org.springframework.web.context.request.WebRequestInterceptor"\r
+               ref="osivInterceptor" />\r
+\r
        <reference id="sessionFactory" interface="org.hibernate.SessionFactory" />\r
 \r
 </beans:beans>
\ No newline at end of file
index 7345ebd54f186e43369c3b1cea1203a6d912f1d9..a5d4329ddf206beeae98c90366e49aacbaa3760b 100644 (file)
@@ -36,4 +36,8 @@
                <property name="hibernateTemplate" ref="hibernateTemplate" />
        </bean>
 
+       <bean id="osivInterceptor"
+               class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
+               <property name="sessionFactory" ref="sessionFactory" />
+       </bean>
 </beans>
\ No newline at end of file
index 22e6065ef33d99a489a455e7900a613556b0afee..602a3b83fc2c9794fb19043358d4083ff8e47bd1 100644 (file)
@@ -17,8 +17,10 @@ Import-Package: javax.jcr,
  org.argeo.slc.dao.test.tree,
  org.argeo.slc.execution,
  org.argeo.slc.jcr.dao,
+ org.argeo.slc.jcr.mvc,
  org.argeo.slc.process,
  org.argeo.slc.runtime;specification-version="0.12.2.SNAPSHOT-r3445",
  org.argeo.slc.test,
  org.springframework.beans.factory.config,
- org.springframework.osgi.util
+ org.springframework.osgi.util,
+ org.springframework.web.context.request;specification-version="2.5.6.SEC01"
index 7bf84a66ed45a81638aecd186d890197af517462..7327e466fde6189e7ddc3a2051461ca8d08fd1a0 100644 (file)
@@ -16,4 +16,8 @@
                ref="testRunDescriptorDao" />\r
        <service interface="org.argeo.slc.dao.runtime.SlcAgentDescriptorDao"\r
                ref="slcAgentDescriptorDao" />\r
+\r
+       <service\r
+               interface="org.springframework.web.context.request.WebRequestInterceptor"\r
+               ref="osivInterceptor" />\r
 </beans:beans>
\ No newline at end of file
index 4adfd61caae7ef49a3c9d6765f2d4037f4b1aac6..ccc14fccfbb92ea1b0a46c8be57161e15d0c7915 100644 (file)
@@ -45,6 +45,9 @@
                <property name="nodeMapperProvider" ref="nodeMapperProvider" />\r
        </bean>\r
 \r
+       <bean id="osivInterceptor" class="org.argeo.slc.jcr.mvc.OpenSessionInViewJcrInterceptor">\r
+       </bean>\r
+\r
        <!--  JCR node mappers -->\r
        <bean id="bundleClassLoader"\r
                class="org.springframework.osgi.util.BundleDelegatingClassLoader"\r
@@ -73,9 +76,8 @@
        </bean>\r
 \r
        <bean id="argeo.jcr.repository.inMemory" class="org.argeo.server.jackrabbit.JackrabbitContainer">\r
-               <property name="homeDirectory" value="${java.io.tmpdir}/jackrabbit-slc-unit" />\r
-               <property name="configuration"\r
-                       value="classpath:/org/argeo/server/jackrabbit/repository-inMemory.xml" />\r
+               <property name="homeDirectory" value="${argeo.osgi.data.dir}/jackrabbit" />\r
+               <property name="configuration" value="osgibundle:/repository.xml" />\r
        </bean>\r
 \r
 </beans>
\ No newline at end of file
diff --git a/modules/server/org.argeo.slc.server.jcr/repository.xml b/modules/server/org.argeo.slc.server.jcr/repository.xml
new file mode 100644 (file)
index 0000000..d980f8b
--- /dev/null
@@ -0,0 +1,152 @@
+<?xml version="1.0"?>
+       <!--
+               Licensed to the Apache Software Foundation (ASF) under one or more
+               contributor license agreements. See the NOTICE file distributed with
+               this work for additional information regarding copyright ownership.
+               The ASF licenses this file to You under the Apache License, Version
+               2.0 (the "License"); you may not use this file except in compliance
+               with the License. You may obtain a copy of the License at
+
+               http://www.apache.org/licenses/LICENSE-2.0 Unless required by
+               applicable law or agreed to in writing, software distributed under the
+               License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+               CONDITIONS OF ANY KIND, either express or implied. See the License for
+               the specific language governing permissions and limitations under the
+               License.
+       -->
+<!DOCTYPE Repository PUBLIC "-//The Apache Software Foundation//DTD Jackrabbit 1.6//EN"
+                            "http://jackrabbit.apache.org/dtd/repository-1.6.dtd">
+       <!--
+               Example Repository Configuration File Used by -
+               org.apache.jackrabbit.core.config.RepositoryConfigTest.java -
+       -->
+<Repository>
+       <!--
+               virtual file system where the repository stores global state (e.g.
+               registered namespaces, custom node types, etc.)
+       -->
+       <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
+               <param name="path" value="${rep.home}/repository" />
+       </FileSystem>
+
+       <!--
+        security configuration
+    -->
+       <Security appName="Jackrabbit">
+               <!--
+                       security manager: class: FQN of class implementing the
+                       JackrabbitSecurityManager interface
+               -->
+               <SecurityManager
+                       class="org.apache.jackrabbit.core.security.simple.SimpleSecurityManager"
+                       workspaceName="security">
+                       <!--
+                               workspace access: class: FQN of class implementing the
+                               WorkspaceAccessManager interface
+                       -->
+                       <!-- <WorkspaceAccessManager class="..."/> -->
+                       <!-- <param name="config" value="${rep.home}/security.xml"/> -->
+               </SecurityManager>
+
+               <!--
+                       access manager: class: FQN of class implementing the AccessManager
+                       interface
+               -->
+               <AccessManager
+                       class="org.apache.jackrabbit.core.security.simple.SimpleAccessManager">
+                       <!-- <param name="config" value="${rep.home}/access.xml"/> -->
+               </AccessManager>
+
+               <LoginModule
+                       class="org.apache.jackrabbit.core.security.simple.SimpleLoginModule">
+                       <!--
+                               anonymous user name ('anonymous' is the default value)
+                       -->
+                       <param name="anonymousId" value="anonymous" />
+                       <!--
+                               administrator user id (default value if param is missing is 'admin')
+                       -->
+                       <param name="adminId" value="admin" />
+               </LoginModule>
+       </Security>
+
+       <!--
+               location of workspaces root directory and name of default workspace
+       -->
+       <Workspaces rootPath="${rep.home}/workspaces"
+               defaultWorkspace="default" />
+       <!--
+               workspace configuration template: used to create the initial workspace
+               if there's no workspace yet
+       -->
+       <Workspace name="${wsp.name}">
+               <!--
+                       virtual file system of the workspace: class: FQN of class
+                       implementing the FileSystem interface
+               -->
+               <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
+                       <param name="path" value="${wsp.home}" />
+               </FileSystem>
+               <!--
+                       persistence manager of the workspace: class: FQN of class
+                       implementing the PersistenceManager interface
+               -->
+               <PersistenceManager
+                       class="org.apache.jackrabbit.core.persistence.bundle.DerbyPersistenceManager">
+                       <!--
+                               <param name="url" value="jdbc:derby:memory:db;create=true" />
+                       -->
+                       <param name="url" value="jdbc:derby:${wsp.home}/db;create=true" />
+                       <param name="driver" value="org.apache.derby.jdbc.EmbeddedDriver" />
+                       <param name="schemaObjectPrefix" value="${wsp.name}_" />
+               </PersistenceManager>
+               <!--
+                       Search index and the file system it uses. class: FQN of class
+                       implementing the QueryHandler interface
+               -->
+               <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
+                       <param name="path" value="${wsp.home}/index" />
+                       <param name="extractorPoolSize" value="2" />
+                       <param name="supportHighlighting" value="true" />
+               </SearchIndex>
+       </Workspace>
+
+       <!--
+        Configures the versioning
+    -->
+       <Versioning rootPath="${rep.home}/version">
+               <!--
+                       Configures the filesystem to use for versioning for the respective
+                       persistence manager
+               -->
+               <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
+                       <param name="path" value="${rep.home}/version" />
+               </FileSystem>
+
+               <!--
+                       Configures the persistence manager to be used for persisting version
+                       state. Please note that the current versioning implementation is
+                       based on a 'normal' persistence manager, but this could change in
+                       future implementations.
+               -->
+               <PersistenceManager
+                       class="org.apache.jackrabbit.core.persistence.bundle.DerbyPersistenceManager">
+                       <!--
+                               <param name="url" value="jdbc:derby:memory:version;create=true" />
+                       -->
+                       <param name="url" value="jdbc:derby:${rep.home}/version/db;create=true" />
+                       <param name="driver" value="org.apache.derby.jdbc.EmbeddedDriver" />
+                       <param name="schemaObjectPrefix" value="version_" />
+               </PersistenceManager>
+       </Versioning>
+
+       <!--
+               Search index for content that is shared repository wide (/jcr:system
+               tree, contains mainly versions)
+       -->
+       <SearchIndex class="org.apache.jackrabbit.core.query.lucene.SearchIndex">
+               <param name="path" value="${rep.home}/repository/index" />
+               <param name="extractorPoolSize" value="2" />
+               <param name="supportHighlighting" value="true" />
+       </SearchIndex>
+</Repository>
index 83468060ece7228663079aca3aadb4c99da2339f..e625491e9c7db6afa0f006a5f6644fbe99d74307 100644 (file)
@@ -23,8 +23,6 @@
                action="start" />
        <bundle id="agentProxy" symbolic-name="org.argeo.slc.server.agentproxy"
                action="start" />
-       <bundle id="hibernate" symbolic-name="org.argeo.slc.server.hibernate"
-               action="start" />
        <bundle id="services" symbolic-name="org.argeo.slc.server.services"
                action="start" />
        <bundle id="jms" symbolic-name="org.argeo.slc.server.jms"
index 77a0cc70138f7b1e5f5a53a5ccbbc8f630e4274a..f981fd3668a1c8878f181a6ff368c4192d93934c 100644 (file)
@@ -30,14 +30,12 @@ Import-Package: net.sf.cglib.core,
  org.argeo.slc.web.mvc.provisioning,
  org.argeo.slc.web.mvc.result,
  org.argeo.slc.web.mvc.runtime,
- org.hibernate,
- org.hibernate.hql.ast,
- org.hibernate.jdbc,
+ org.hibernate.hql.ast;resolution:=optional,
+ org.hibernate.jdbc;resolution:=optional,
  org.springframework.aop,
  org.springframework.aop.framework,
  org.springframework.aop.scope,
  org.springframework.beans.factory.support,
- org.springframework.orm.hibernate3.support,
  org.springframework.osgi.web.context.support,
  org.springframework.oxm,
  org.springframework.security,
index d23a533b552203f5e8749dc3dc699bde9239bda3..c6c1e5534824dfb43d492f25699798de5305c2d4 100644 (file)
        <import resource="osgi.xml" />
        <import resource="security.xml" />
 
-       <!-- Hibernate instrumentation-->
+       <!-- Hibernate instrumentation
        <bean id="osivInterceptor"
                class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
                <property name="sessionFactory" ref="sessionFactory" />
-       </bean>
+       </bean>-->
 
 
        <!--  Properties -->
@@ -29,7 +29,7 @@
                <property name="ignoreUnresolvablePlaceholders" value="true" />
        </bean>
 
-       <!-- Web Services transactions -->
+       <!-- Web Services transactions
        <aop:config>
                <aop:pointcut id="epMethods"
                        expression="execution(* org.springframework.web.servlet.mvc.Controller.handleRequest(..))" />
@@ -40,6 +40,6 @@
                <tx:attributes>
                        <tx:method name="*" propagation="REQUIRED" />
                </tx:attributes>
-       </tx:advice>
+       </tx:advice> -->
 
 </beans>
\ No newline at end of file
index d7dde2d34d92e1c5f044efd1a140004391667b4b..5772d67be129166c279ea6f08f2e2c3e5536421d 100644 (file)
        <reference interface="org.argeo.slc.dao.runtime.SlcAgentDescriptorDao"\r
                id="slcAgentDescriptorDao" />\r
 \r
-       <reference interface="org.hibernate.SessionFactory" id="sessionFactory" />\r
+       <reference id="osivInterceptor"\r
+               interface="org.springframework.web.context.request.WebRequestInterceptor" />\r
+       <!--\r
+\r
 \r
+               <reference interface="org.hibernate.SessionFactory"\r
+               id="sessionFactory" />\r
+       -->\r
        <!--\r
                <reference interface="org.argeo.slc.execution.ExecutionModulesManager"\r
                id="modulesManager" />\r
        <reference id="testManagerService" interface="org.argeo.slc.services.TestManagerService" />\r
        <reference id="agentService" interface="org.argeo.slc.services.AgentService" />\r
        <reference id="slcExecutionService" interface="org.argeo.slc.services.SlcExecutionService" />\r
+       <!--\r
 \r
-       <reference id="hibernateTransactionManager"\r
+               <reference id="hibernateTransactionManager"\r
                interface="org.springframework.transaction.PlatformTransactionManager"\r
                bean-name="hibernateTransactionManager" />\r
-\r
+       -->\r
        <reference id="agentFactory" interface="org.argeo.slc.runtime.SlcAgentFactory" />\r
 \r
        <reference id="eventListener" interface="org.argeo.slc.msg.event.SlcEventListener" />\r
                cardinality="0..N" />\r
 \r
        <!-- Security -->\r
-       <!-- <reference id="authenticationEntryPoint"\r
-               interface="org.springframework.security.ui.AuthenticationEntryPoint" />-->\r
+       <!--\r
+               <reference id="authenticationEntryPoint"\r
+               interface="org.springframework.security.ui.AuthenticationEntryPoint"\r
+               />\r
+       -->\r
        <reference id="_authenticationManager"\r
                interface="org.springframework.security.AuthenticationManager" />\r
 \r
index 2bf9cc64c46e2cdad9e1647ccb716334e99b5802..bb752a8c1aeb16793d4cc9acd32d03e22ab44281 100644 (file)
@@ -56,23 +56,16 @@ public abstract class AbstractSlcJcrDao {
        protected String basePath(TestResult testResult) {\r
                Calendar cal = new GregorianCalendar();\r
                cal.setTime(new Date());\r
-               // cal.setTime(slcExecution.getStartDate());\r
-               return "/slc/testresult/" + JcrUtils.dateAsPath(cal) + "testresult";\r
+               return "/slc/testresults/" + JcrUtils.dateAsPath(cal) + "testresult";\r
        }\r
 \r
        protected String basePath(SlcAgentDescriptor slcAgentDescriptor) {\r
-               Calendar cal = new GregorianCalendar();\r
-               cal.setTime(new Date());\r
-               // cal.setTime(slcExecution.getStartDate());\r
                return "/slc/agents/"\r
-                               + JcrUtils.hostAsPath(slcAgentDescriptor.getHost() + "/agent");\r
+                               + JcrUtils.hostAsPath(slcAgentDescriptor.getHost()) + "/agent";\r
        }\r
 \r
        protected String basePath(TestRunDescriptor testRunDescriptor) {\r
-               Calendar cal = new GregorianCalendar();\r
-               cal.setTime(new Date());\r
-               // cal.setTime(slcExecution.getStartDate());\r
-               return "/slc/testruns/" + testRunDescriptor.getTestRunUuid()\r
+               return "/slc/testruns/" + testRunDescriptor.getSlcExecutionUuid()\r
                                + "/testrun";\r
        }\r
 \r
index c64139eaec131d964e563b4ec4a760c4a414a01b..135f10760e91c3a73917918cd6c066b82ad63c56 100644 (file)
@@ -45,8 +45,11 @@ public class SlcExecutionDaoJcr extends AbstractSlcJcrDao implements
                Calendar cal = new GregorianCalendar();
                cal.setTime(new Date());
                // cal.setTime(slcExecution.getStartDate());
-               return "/slc/processes/" + JcrUtils.hostAsPath(slcExecution.getHost())
-                               + '/' + JcrUtils.dateAsPath(cal) + "process";
+               String host = slcExecution.getHost();
+               if (host == null)
+                       host = "UNKOWNHOST";
+               return "/slc/processes/" + JcrUtils.hostAsPath(host) + '/'
+                               + JcrUtils.dateAsPath(cal) + "process";
        }
 
        public SlcExecution getSlcExecution(String uuid) {
index 6a9824dfb7cbdab0db64451b4fe057e6bf7213fc..6daf16641600bc89618e707c7b0d18057f328e35 100644 (file)
@@ -9,7 +9,10 @@ import java.util.TreeSet;
 \r
 import javax.jcr.Node;\r
 import javax.jcr.NodeIterator;\r
+import javax.jcr.RepositoryException;\r
+import javax.jcr.query.InvalidQueryException;\r
 import javax.jcr.query.Query;\r
+import javax.jcr.query.QueryManager;\r
 \r
 import org.apache.commons.logging.Log;\r
 import org.apache.commons.logging.LogFactory;\r
@@ -26,7 +29,7 @@ public class TreeTestResultCollectionDaoJcr extends AbstractSlcJcrDao implements
 \r
        // FIXME : we handle testResultCollection by adding a property called\r
        // "TestResultCollectionId "\r
-       final private String ttrColProp = "TestResultCollectionId";\r
+       final private String ttrColProp = "collectionId";\r
 \r
        private final static Log log = LogFactory\r
                        .getLog(TreeTestResultCollectionDaoJcr.class);\r
@@ -49,18 +52,11 @@ public class TreeTestResultCollectionDaoJcr extends AbstractSlcJcrDao implements
        public TreeTestResultCollection getTestResultCollection(String id) {\r
                TreeTestResultCollection res = new TreeTestResultCollection();\r
                res.setId(id);\r
-\r
-               // String queryString = "//*[@" + ttrColProp + "='" + id + "']";\r
-               // Query query = queryManager.createQuery(queryString, Query.XPATH);\r
-               // log.debug("retrieving all nodes of a col - " + queryString);\r
-               int i = 0;\r
                NodeIterator ni = resultNodesInCollection(id);\r
                while (ni.hasNext()) {\r
-                       i++;\r
                        res.getResults().add(\r
                                        (TreeTestResult) nodeMapper.load(ni.nextNode()));\r
                }\r
-               // log.debug(i + " nodes found");\r
                return res;\r
        }\r
 \r
@@ -75,15 +71,12 @@ public class TreeTestResultCollectionDaoJcr extends AbstractSlcJcrDao implements
        public void update(TreeTestResultCollection ttrCollection) {\r
                try {\r
                        log.debug("Update ");\r
-                       String queryString;\r
-                       Query query;\r
-                       Node curNode;\r
                        String colId = ttrCollection.getId();\r
                        // We add or update existing ones\r
                        for (TreeTestResult ttr : ttrCollection.getResults()) {\r
-                               queryString = "//*[@uuid='" + ttr.getUuid() + "']";\r
-                               query = queryManager.createQuery(queryString, Query.XPATH);\r
-                               curNode = JcrUtils.querySingleNode(query);\r
+                               String queryString = "//testresult[@uuid='" + ttr.getUuid()\r
+                                               + "']";\r
+                               Node curNode = singleNode(queryString, Query.XPATH);\r
                                if (curNode == null) {\r
                                        curNode = nodeMapper.save(getSession(), basePath(ttr), ttr);\r
                                        log.debug("New Node added");\r
@@ -97,14 +90,14 @@ public class TreeTestResultCollectionDaoJcr extends AbstractSlcJcrDao implements
                                JcrUtils.debug(curNode.getSession().getRootNode());\r
                        }\r
                        // We remove those who are not part of the collection anymore\r
-                       queryString = "//*[@" + ttrColProp + "='" + colId + "']";\r
-                       query = queryManager.createQuery(queryString, Query.XPATH);\r
+                       String queryString = "//*[@" + ttrColProp + "='" + colId + "']";\r
+                       Query query = queryManager.createQuery(queryString, Query.XPATH);\r
                        log.debug("Query :" + queryString);\r
                        NodeIterator ni = query.execute().getNodes();\r
                        int i = 0;\r
                        while (ni.hasNext()) {\r
                                log.debug("Node " + (++i));\r
-                               curNode = ni.nextNode();\r
+                               Node curNode = ni.nextNode();\r
                                String uuid = curNode.getProperty("uuid").getString();\r
                                boolean isPartOfTheSet = false;\r
                                for (TreeTestResult ttr : ttrCollection.getResults()) {\r
@@ -166,12 +159,10 @@ public class TreeTestResultCollectionDaoJcr extends AbstractSlcJcrDao implements
                        String queryString;\r
                        Node curNode;\r
                        String colId = ttrc.getId();\r
-                       queryString = "//*[@uuid='" + resultUuid + "']";\r
-                       Query query = queryManager.createQuery(queryString, Query.XPATH);\r
-                       curNode = JcrUtils.querySingleNode(query);\r
+                       queryString = "//testresult[@uuid='" + resultUuid + "']";\r
+                       curNode = singleNode(queryString, Query.XPATH);\r
                        if (curNode == null) {\r
-                               throw new SlcException("Cannot add TreeTestResult of Id "\r
-                                               + resultUuid + " to collection " + colId);\r
+                               throw new SlcException("Cannot find test result #" + resultUuid);\r
                        } else\r
                                curNode.setProperty(ttrColProp, colId);\r
                        getSession().save();\r
@@ -185,22 +176,16 @@ public class TreeTestResultCollectionDaoJcr extends AbstractSlcJcrDao implements
        public void removeResultFromCollection(final TreeTestResultCollection ttrc,\r
                        final String resultUuid) {\r
                try {\r
-                       log.debug("remove result");\r
                        String queryString;\r
                        Node curNode;\r
-                       String colId = ttrc.getId();\r
-                       queryString = "//*[@uuid='" + resultUuid + "']";\r
+                       queryString = "//testresult[@uuid='" + resultUuid + "' and "\r
+                                       + ttrColProp + "='" + ttrc.getId() + "']";\r
                        Query query = queryManager.createQuery(queryString, Query.XPATH);\r
                        curNode = JcrUtils.querySingleNode(query);\r
-                       log.debug("Query : " + queryString + " - Node retrieved "\r
-                                       + curNode.getPath());\r
                        if (curNode == null) {\r
-                               throw new SlcException("Cannot remove TreeTestResult of Id "\r
-                                               + resultUuid + " from collection " + colId);\r
+                               throw new SlcException("Cannot find test result #" + resultUuid);\r
                        } else {\r
                                curNode.getProperty(ttrColProp).remove();\r
-                               log.debug("Property removed : "\r
-                                               + curNode.getProperty(ttrColProp).getString());\r
                        }\r
                        getSession().save();\r
                } catch (Exception e) {\r
@@ -229,21 +214,6 @@ public class TreeTestResultCollectionDaoJcr extends AbstractSlcJcrDao implements
                }\r
 \r
                return list;\r
-               // throw new UnsupportedOperationException();\r
-               // List<ResultAttributes> list;\r
-               // if (collectionId == null)\r
-               // list = getHibernateTemplate().find(\r
-               // "select new org.argeo.slc.core.test.tree.ResultAttributes(ttr)"\r
-               // + " from TreeTestResult ttr");\r
-               // else\r
-               // list = getHibernateTemplate()\r
-               // .find(\r
-               // "select new org.argeo.slc.core.test.tree.ResultAttributes(ttr) "\r
-               // + " from TreeTestResult ttr, TreeTestResultCollection ttrc "\r
-               // + " where ttr in elements(ttrc.results) and ttrc.id=?",\r
-               // collectionId);\r
-               //\r
-               // return list;\r
        }\r
 \r
        public List<TreeTestResult> listResults(String collectionId,\r
@@ -298,10 +268,10 @@ public class TreeTestResultCollectionDaoJcr extends AbstractSlcJcrDao implements
                        String attributeValue) {\r
                String queryString;\r
                if (attributeKey != null)\r
-                       queryString = "//testResult[@" + attributeKey + "='"\r
+                       queryString = "//testresult[@" + attributeKey + "='"\r
                                        + attributeValue + "']";\r
                else\r
-                       queryString = "//testResult";\r
+                       queryString = "//testresult";\r
                return query(queryString);\r
        }\r
 \r
@@ -334,4 +304,14 @@ public class TreeTestResultCollectionDaoJcr extends AbstractSlcJcrDao implements
                }\r
        }\r
 \r
+       private Node singleNode(String query, String queryType) {\r
+               try {\r
+                       Query q = queryManager.createQuery(query, queryType);\r
+                       return JcrUtils.querySingleNode(q);\r
+               } catch (RepositoryException e) {\r
+                       throw new SlcException("Cannot retrieve single node with query "\r
+                                       + query, e);\r
+               }\r
+       }\r
+\r
 }\r
index df0a8f507747f4fc963c9eb7b368c0ed7ece13f4..71bdf529a02a41998a9f138fcb2ce6f96e988138 100644 (file)
@@ -208,14 +208,41 @@ public class TreeTestResultDaoJcr extends AbstractSlcJcrDao implements
                                        // We add the tags\r
                                        Map<String, String> tags = relatedElements.get(key)\r
                                                        .getTags();\r
+\r
                                        for (String tag : tags.keySet()) {\r
-                                               String cleanTag = JcrUtils\r
-                                                               .removeForbiddenCharacters(tag);\r
-                                               if (!cleanTag.equals(tag))\r
-                                                       log.warn("Tag '" + tag + "' persisted as '"\r
-                                                                       + cleanTag + "'");\r
-                                               curNode.setProperty(cleanTag, tags.get(tag));\r
+                                               NodeIterator tagIt = curNode.getNodes("tag");\r
+                                               Node tagNode = null;\r
+                                               while (tagIt.hasNext()) {\r
+                                                       Node n = tagIt.nextNode();\r
+                                                       if (n.getProperty("name").getString().equals(tag)) {\r
+                                                               tagNode = n;\r
+                                                       }\r
+                                               }\r
+\r
+                                               if (tagNode == null) {\r
+                                                       tagNode = curNode.addNode("tag");\r
+                                                       tagNode.setProperty("name", tag);\r
+                                               }\r
+\r
+                                               tagNode.setProperty("value", tags.get(tag));\r
+\r
+                                               // remove forbidden characters\r
+                                               // String cleanTag =\r
+                                               // JcrUtils.removeForbiddenCharacters(tag);\r
+                                               // if (!cleanTag.equals(tag))\r
+                                               // log.warn("Tag '" + tag + "' persisted as '" +\r
+                                               // cleanTag\r
+                                               // + "'");\r
+                                               // childNode.setProperty(cleanTag, tags.get(tag));\r
                                        }\r
+                                       // for (String tag : tags.keySet()) {\r
+                                       // String cleanTag = JcrUtils\r
+                                       // .removeForbiddenCharacters(tag);\r
+                                       // if (!cleanTag.equals(tag))\r
+                                       // log.warn("Tag '" + tag + "' persisted as '"\r
+                                       // + cleanTag + "'");\r
+                                       // curNode.setProperty(cleanTag, tags.get(tag));\r
+                                       // }\r
 \r
                                        // We set the class in order to be able to retrieve\r
                                        curNode.setProperty("class", StructureElement.class\r
index 471de7100879f918c8b8a6ffa93f16257a8889ff..162e5d2f7409d0fed388f30d240e9d480ecb41a1 100644 (file)
@@ -94,12 +94,28 @@ public class TreeTestResultNodeMapper extends BeanNodeMapper {
                        // We add the tags
                        Map<String, String> tags = elements.get(key).getTags();
                        for (String tag : tags.keySet()) {
+                               NodeIterator tagIt = childNode.getNodes("tag");
+                               Node tagNode = null;
+                               while (tagIt.hasNext()) {
+                                       Node n = tagIt.nextNode();
+                                       if (n.getProperty("name").getString().equals(tag)) {
+                                               tagNode = n;
+                                       }
+                               }
+
+                               if (tagNode == null) {
+                                       tagNode = childNode.addNode("tag");
+                                       tagNode.setProperty("name", tag);
+                               }
+
+                               tagNode.setProperty("value", tags.get(tag));
+
                                // remove forbidden characters
-                               String cleanTag = JcrUtils.removeForbiddenCharacters(tag);
-                               if (!cleanTag.equals(tag))
-                                       log.warn("Tag '" + tag + "' persisted as '" + cleanTag
-                                                       + "'");
-                               childNode.setProperty(cleanTag, tags.get(tag));
+                               // String cleanTag = JcrUtils.removeForbiddenCharacters(tag);
+                               // if (!cleanTag.equals(tag))
+                               // log.warn("Tag '" + tag + "' persisted as '" + cleanTag
+                               // + "'");
+                               // childNode.setProperty(cleanTag, tags.get(tag));
                        }
 
                        // We set the class in order to be able to retrieve
@@ -271,22 +287,29 @@ public class TreeTestResultNodeMapper extends BeanNodeMapper {
                        se.setLabel(curNode.getProperty("label").getString());
 
                        Map<String, String> tagMap = new TreeMap<String, String>();
-                       PropertyIterator tagIt = curNode.getProperties();
-                       tags: while (tagIt.hasNext()) {
-                               Property prop = tagIt.nextProperty();
-                               //log.debug("Handling property named : " + prop.getName());
-
-                               // TODO Define a rule to generalize it
-                               // Specific case. mainly uuid
-                               if ("uuid".equals(prop.getName())
-                                               || prop.getName().equals(getClassProperty())
-                                               || prop.getName().startsWith("jcr")) {
-                                       continue tags;
-                               }
+                       NodeIterator tagIt = node.getNodes("tag");
+                       while (tagIt.hasNext()) {
+                               Node tagNode = tagIt.nextNode();
+                               tagMap.put(tagNode.getProperty("name").getString(), tagNode
+                                               .getProperty("value").getString());
 
-                               // else it's an attribute, we retrieve it
-                               tagMap.put(prop.getName(), prop.getString());
                        }
+                       // PropertyIterator tagIt = curNode.getProperties();
+                       // tags: while (tagIt.hasNext()) {
+                       // Property prop = tagIt.nextProperty();
+                       // //log.debug("Handling property named : " + prop.getName());
+                       //
+                       // // TODO Define a rule to generalize it
+                       // // Specific case. mainly uuid
+                       // if ("uuid".equals(prop.getName())
+                       // || prop.getName().equals(getClassProperty())
+                       // || prop.getName().startsWith("jcr")) {
+                       // continue tags;
+                       // }
+                       //
+                       // // else it's an attribute, we retrieve it
+                       // tagMap.put(prop.getName(), prop.getString());
+                       // }
 
                        se.setTags(tagMap);
                        elements.put(tsp, se);
diff --git a/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/mvc/OpenSessionInViewJcrInterceptor.java b/runtime/org.argeo.slc.support.jcr/src/main/java/org/argeo/slc/jcr/mvc/OpenSessionInViewJcrInterceptor.java
new file mode 100644 (file)
index 0000000..0076f5f
--- /dev/null
@@ -0,0 +1,30 @@
+package org.argeo.slc.jcr.mvc;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.context.request.WebRequest;
+import org.springframework.web.context.request.WebRequestInterceptor;
+
+public class OpenSessionInViewJcrInterceptor implements WebRequestInterceptor {
+       private final static Log log = LogFactory
+                       .getLog(OpenSessionInViewJcrInterceptor.class);
+
+       public void preHandle(WebRequest request) throws Exception {
+               if (log.isDebugEnabled())
+                       log.debug("preHandle: " + request);
+       }
+
+       public void postHandle(WebRequest request, ModelMap model) throws Exception {
+               if (log.isDebugEnabled())
+                       log.debug("postHandle: " + request);
+       }
+
+       public void afterCompletion(WebRequest request, Exception ex)
+                       throws Exception {
+               if (log.isDebugEnabled())
+                       log.debug("afterCompletion: " + request);
+
+       }
+
+}
index c70a2a9a42ac560f62d4f2d3eb64fb29d7a2ba55..cfd99cd38136d6ae09091537607ef2830cf7548d 100644 (file)
@@ -57,7 +57,9 @@
        </bean>\r
 \r
        <bean id="argeo.jcr.repository.inMemory" class="org.argeo.server.jackrabbit.JackrabbitContainer">\r
-               <property name="homeDirectory" value="${java.io.tmpdir}/jackrabbit-slc-unit" />\r
+               <property name="homeDirectory"\r
+                       value="${java.io.tmpdir}/jackrabbit-slc-unit-${user.name}" />\r
+               <property name="inMemory" value="true" />\r
                <property name="configuration"\r
                        value="classpath:/org/argeo/server/jackrabbit/repository-inMemory.xml" />\r
        </bean>\r