Add webdav support
authorMathieu Baudier <mbaudier@argeo.org>
Fri, 30 Apr 2010 14:39:26 +0000 (14:39 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Fri, 30 Apr 2010 14:39:26 +0000 (14:39 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@3551 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

modules/server/org.argeo.slc.server.jackrabbit.derby/META-INF/MANIFEST.MF
modules/server/org.argeo.slc.server.jcr/META-INF/MANIFEST.MF
modules/server/org.argeo.slc.webapp.war/META-INF/MANIFEST.MF
modules/server/org.argeo.slc.webapp.war/WEB-INF/jcr-manager-servlet.xml [new file with mode: 0644]
modules/server/org.argeo.slc.webapp.war/WEB-INF/jcr-servlet.xml
modules/server/org.argeo.slc.webapp.war/WEB-INF/osgi.xml
modules/server/org.argeo.slc.webapp.war/WEB-INF/slc-service-servlet.xml
modules/server/org.argeo.slc.webapp.war/WEB-INF/web.xml
modules/server/org.argeo.slc.webapp.war/WEB-INF/webdav-config.xml [new file with mode: 0644]
modules/server/org.argeo.slc.webapp.war/WEB-INF/webdav-servlet.xml [new file with mode: 0644]
runtime/org.argeo.slc.unit/src/main/java/org/argeo/slc/unit/process/SlcExecutionTestUtils.java

index e6139580e2db48a9c156010cc5a92c2c0d18eba2..5e9a2d793e03731b1b3d45724f98bf9c43368c53 100644 (file)
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: Jackrabbit JCR Repository Derby
 Bundle-SymbolicName: org.argeo.slc.server.jackrabbit.derby
-Bundle-Version: 1.0.0.qualifier
+Bundle-Version: 0.12.2.SNAPSHOT
 Bundle-Vendor: Argeo
 Import-Package: javax.jcr;version="1.0.0",
  org.argeo.server.jackrabbit;version="0.1.3.SNAPSHOT-r3516"
index d50efa2887c7d63070fa845dd2297d3fdecb2723..82b5db341412eaf05db3816befd495ae25c0b46a 100644 (file)
@@ -4,7 +4,6 @@ Bundle-SymbolicName: org.argeo.slc.server.jcr
 Bundle-Name: Server JCR
 Import-Package: javax.jcr,
  org.argeo.jcr,
- org.argeo.server.jcr;specification-version="0.1.3.SNAPSHOT-r3478",
  org.argeo.server.jcr.mvc;specification-version="0.1.3.SNAPSHOT-r3478",
  org.argeo.slc.core.attachment,
  org.argeo.slc.core.execution,
index a530e54e155a957009220d93d26243ad6ee93719..43081fb717c34211f4015be06b33cd8e7ef3ce3d 100644 (file)
@@ -4,12 +4,14 @@ Bundle-Version: 0.12.2.SNAPSHOT
 Bundle-Name: SLC Webapp
 Web-ContextPath: org.argeo.slc.webapp
 Bundle-SymbolicName: org.argeo.slc.webapp
-Import-Package: net.sf.cglib.core,
+Import-Package: javax.jcr;specification-version="1.0.0",
+ net.sf.cglib.core,
  net.sf.cglib.proxy,
  net.sf.cglib.reflect,
  org.aopalliance.aop,
  org.argeo.security.mvc;specification-version="0.1.3.SNAPSHOT-r3402",
  org.argeo.server,
+ org.argeo.server.jackrabbit.webdav;specification-version="0.1.3.SNAPSHOT-r3543",
  org.argeo.server.jcr.mvc;specification-version="0.1.3.SNAPSHOT-r3478",
  org.argeo.server.json;specification-version="0.1.3.SNAPSHOT-r3371",
  org.argeo.server.mvc,
diff --git a/modules/server/org.argeo.slc.webapp.war/WEB-INF/jcr-manager-servlet.xml b/modules/server/org.argeo.slc.webapp.war/WEB-INF/jcr-manager-servlet.xml
new file mode 100644 (file)
index 0000000..aed571e
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
+       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
+       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
+
+       <context:component-scan base-package="org.argeo.server.jcr.mvc" />
+
+       <bean name="**" class="org.argeo.server.jcr.mvc.JcrManagerController">
+       </bean>
+
+       <bean id="viewResolver" class="org.argeo.server.mvc.SerializingViewResolver">
+               <property name="serializer" ref="serverMapper" />
+       </bean>
+
+       <bean id="serverMapper" class="org.argeo.server.json.JsonServerMapper">
+       </bean>
+
+       <bean class="org.argeo.server.mvc.DefaultHandlerExceptionResolver" />
+
+       <bean id="handlerMapping"
+               class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
+               <property name="interceptors">
+                       <list>
+                               <ref bean="osivInterceptor" />
+                       </list>
+               </property>
+       </bean>
+
+</beans>
\ No newline at end of file
index 58dd6aac9a3de9eaa2032f76170ae6b212a3b0a2..72c20c46faf0152adcab6b3a2b1dd09561109d83 100644 (file)
                <property name="serializer" ref="jsonSerializer" />
        </bean>
 
+       <bean name="500" class="org.argeo.server.mvc.SerializingView">
+               <property name="serializer" ref="jsonSerializer" />
+       </bean>
+
        <!-- Serializers -->
        <bean id="jsonSerializer" class="org.argeo.server.json.JsonServerSerializer" />
 
@@ -41,4 +45,7 @@
 
        <bean id="viewResolver"
                class="org.springframework.web.servlet.view.BeanNameViewResolver" />
+
+       <bean class="org.argeo.server.mvc.DefaultHandlerExceptionResolver" />
+
 </beans>
\ No newline at end of file
index ff56fc2723b74b4f67a5f1edab7d67a934853830..95ebcea88fb8b5117f6d74edd94e1693cb0eb050 100644 (file)
@@ -66,4 +66,8 @@
        <reference id="userDetailsService"\r
                interface="org.springframework.security.userdetails.UserDetailsService" />\r
 \r
+       <!-- Optional reference to JCR repository -->\r
+       <reference id="jcrRepository" interface="javax.jcr.Repository"\r
+               cardinality="0..1" />\r
+\r
 </beans:beans>
\ No newline at end of file
index 7b9ea8e86f2f119f1bae1f9a3f3c490cef523a7b..197ccb25ec1376871fb77fc111b62a400fab9bb8 100644 (file)
@@ -73,4 +73,7 @@
                        </bean>
                </property>
        </bean>
+
+       <bean class="org.argeo.server.mvc.DefaultHandlerExceptionResolver" />
+
 </beans>
\ No newline at end of file
index 06d6b4867777bc75cf765781236ff58f6548f425..8ffca90ac76f9467865d453a2f13517d1e28a84c 100644 (file)
                <url-pattern>*.jcr</url-pattern>
        </servlet-mapping>
 
+       <!-- WEBDAV servlet -->
+       <servlet>
+               <servlet-name>webdav</servlet-name>
+               <servlet-class>org.argeo.server.jackrabbit.webdav.ExtendedDispatcherServlet</servlet-class>
+               <init-param>
+                       <param-name>contextClass</param-name>
+                       <param-value>org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext</param-value>
+               </init-param>
+               <init-param>
+                       <param-name>dispatchOptionsRequest</param-name>
+                       <param-value>true</param-value>
+               </init-param>
+               <load-on-startup>1</load-on-startup>
+       </servlet>
+
+       <servlet-mapping>
+               <servlet-name>webdav</servlet-name>
+               <url-pattern>/default/*</url-pattern>
+       </servlet-mapping>
+
+       <!-- JCR-MANAGER servlet -->
+       <servlet>
+               <servlet-name>jcr-manager</servlet-name>
+               <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+               <init-param>
+                       <param-name>contextClass</param-name>
+                       <param-value>org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext</param-value>
+               </init-param>
+               <load-on-startup>1</load-on-startup>
+       </servlet>
+
+       <servlet-mapping>
+               <servlet-name>jcr-manager</servlet-name>
+               <url-pattern>/jcr-manager/*</url-pattern>
+       </servlet-mapping>
+
        <!-- General -->
        <context-param>
                <param-name>contextConfigLocation</param-name>
diff --git a/modules/server/org.argeo.slc.webapp.war/WEB-INF/webdav-config.xml b/modules/server/org.argeo.slc.webapp.war/WEB-INF/webdav-config.xml
new file mode 100644 (file)
index 0000000..f562d76
--- /dev/null
@@ -0,0 +1,197 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+   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 config [
+        <!ELEMENT config (iomanager , propertymanager, (collection | noncollection)? , filter?, mimetypeproperties?) >
+
+        <!ELEMENT iomanager (class, iohandler*) >
+        <!ELEMENT iohandler (class) >
+
+        <!ELEMENT propertymanager (class, propertyhandler*) >
+        <!ELEMENT propertyhandler (class) >
+
+        <!ELEMENT collection (nodetypes) >
+        <!ELEMENT noncollection (nodetypes) >
+
+        <!ELEMENT filter (class, namespaces?, nodetypes?) >
+
+        <!ELEMENT class >
+        <!ATTLIST class
+            name  CDATA #REQUIRED
+        >
+        <!ELEMENT namespaces (prefix | uri)* >
+        <!ELEMENT prefix (CDATA) >
+        <!ELEMENT uri (CDATA) >
+
+        <!ELEMENT nodetypes (nodetype)* >
+        <!ELEMENT nodetype (CDATA) >
+
+        <!ELEMENT mimetypeproperties (mimemapping*, defaultmimetype) >
+
+        <!ELEMENT mimemapping >
+        <!ATTLIST mimemapping
+            extension  CDATA #REQUIRED
+            mimetype  CDATA #REQUIRED
+        >
+
+        <!ELEMENT defaultmimetype (CDATA) >
+]>
+-->
+
+<config>
+    <!--
+     Defines the IOManager implementation that is responsible for passing
+     import/export request to the individual IO-handlers.
+    -->
+    <iomanager>
+        <!-- class element defines the manager to be used. The specified class
+             must implement the IOManager interface.
+             Note, that the handlers are being added and called in the order
+             they appear in the configuration.
+        -->
+        <class name="org.apache.jackrabbit.server.io.IOManagerImpl" />
+        <iohandler>
+            <class name="org.apache.jackrabbit.server.io.VersionHandler" />
+        </iohandler>
+        <iohandler>
+            <class name="org.apache.jackrabbit.server.io.VersionHistoryHandler" />
+        </iohandler>
+        <iohandler>
+            <class name="org.apache.jackrabbit.server.io.ZipHandler" />
+        </iohandler>
+        <iohandler>
+            <class name="org.apache.jackrabbit.server.io.XmlHandler" />
+        </iohandler>
+        <iohandler>
+            <class name="org.apache.jackrabbit.server.io.DirListingExportHandler" />
+        </iohandler>
+        <iohandler>
+            <class name="org.apache.jackrabbit.server.io.DefaultHandler" />
+        </iohandler>
+    </iomanager>
+    <!--
+     Example config for iomanager that populates its list of handlers with
+     default values. Therefore the 'iohandler' elements are omited.
+    -->
+    <!--
+    <iomanager>
+        <class name="org.apache.jackrabbit.server.io.DefaultIOManager" />
+    </iomanager>
+    -->
+    <!--
+     Defines the PropertyManager implementation that is responsible for export
+     and import of resource properties.
+    -->
+    <propertymanager>
+        <!-- class element defines the manager to be used. The specified class
+             must implement the PropertyManager interface.
+             Note, that the handlers are being added and called in the order
+             they appear in the configuration.
+        -->
+        <class name="org.apache.jackrabbit.server.io.PropertyManagerImpl" />
+        <propertyhandler>
+            <class name="org.apache.jackrabbit.server.io.VersionHandler" />
+        </propertyhandler>
+        <propertyhandler>
+            <class name="org.apache.jackrabbit.server.io.VersionHistoryHandler" />
+        </propertyhandler>
+        <propertyhandler>
+            <class name="org.apache.jackrabbit.server.io.ZipHandler" />
+        </propertyhandler>
+        <propertyhandler>
+            <class name="org.apache.jackrabbit.server.io.XmlHandler" />
+        </propertyhandler>
+        <propertyhandler>
+            <class name="org.apache.jackrabbit.server.io.DefaultHandler" />
+        </propertyhandler>
+    </propertymanager>
+    <!--
+     Define nodetypes, that should never by displayed as 'collection'
+    -->
+    <noncollection>
+        <nodetypes>
+            <nodetype>nt:file</nodetype>
+            <nodetype>nt:resource</nodetype>
+        </nodetypes>
+    </noncollection>
+    <!--
+     Example: Defines nodetypes, that should always be displayed as 'collection'.
+    -->
+    <!--
+    <collection>
+        <nodetypes>
+            <nodetype>nt:folder</nodetype>
+            <nodetype>rep:root</nodetype>
+        </nodetypes>
+    </collection>
+    -->
+    <!--
+     Filter that allows to prevent certain items from being displayed.
+     Please note, that this has an effect on PROPFIND calls only and does not
+     provide limited access to those items matching any of the filters.
+
+     However specifying a filter may cause problems with PUT or MKCOL if the
+     resource to be created is being filtered out, thus resulting in inconsistent
+     responses (e.g. PUT followed by PROPFIND on parent).
+     -->
+    <filter>
+        <!-- class element defines the resource filter to be used. The specified class
+             must implement the ItemFilter interface -->
+        <class name="org.apache.jackrabbit.webdav.simple.DefaultItemFilter" />
+        <!--
+         Nodetype names to be used to filter child nodes.
+         A child node can be filtered if the declaring nodetype of its definition
+         is one of the nodetype names specified in the nodetypes Element.
+         E.g. defining 'rep:root' as filtered nodetype whould result in jcr:system
+         being hidden but no other child node of the root node, since those
+         are defined by the nodetype nt:unstructered.
+        -->
+        <!--
+        <nodetypes>
+            <nodetype>rep:root</nodetype>
+        </nodetypes>
+        -->
+        <!--
+         Namespace prefixes or uris. Items having a name that matches any of the
+         entries will be filtered.
+        -->
+        <namespaces>
+            <prefix>rep</prefix>
+            <prefix>jcr</prefix>
+            <!--
+            <uri>internal</uri>
+            <uri>http://www.jcp.org/jcr/1.0</uri>
+            -->
+        </namespaces>
+    </filter>
+    
+    <!--
+     Optional 'mimetypeproperties' element.
+     It defines additional or replaces existing mappings for the MimeResolver
+     instance created by the ResourceConfig.
+     The default mappings are defined in org.apache.jackrabbit.server.io.mimetypes.properties.
+     If the default mime type defined by MimeResolver is 'application/octet-stream'.
+    -->
+    <!--
+    <mimetypeproperties>
+        <mimemapping extension="rtf" mimetype="application/rtf" />
+        <mimemapping extension="ott" mimetype="application/vnd.oasis.opendocument.text-template" />
+        <defaultmimetype>text/html</defaultmimetype>
+    </mimetypeproperties>
+    -->
+</config>
diff --git a/modules/server/org.argeo.slc.webapp.war/WEB-INF/webdav-servlet.xml b/modules/server/org.argeo.slc.webapp.war/WEB-INF/webdav-servlet.xml
new file mode 100644 (file)
index 0000000..4aa3181
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
+       xmlns:tx="http://www.springframework.org/schema/tx"
+       xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
+       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
+
+       <bean id="webdavServlet" class="org.argeo.server.jackrabbit.webdav.WebDavServlet">
+               <property name="repository" ref="jcrRepository" />
+               <property name="resourceConfiguration" value="osgibundle:/WEB-INF/webdav-config.xml" />
+       </bean>
+
+       <bean
+               class="org.springframework.web.servlet.handler.SimpleServletPostProcessor" />
+
+       <bean id="servletHandler"
+               class="org.springframework.web.servlet.handler.SimpleServletHandlerAdapter" />
+
+       <bean id="urlMapping"
+               class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
+               <property name="mappings">
+                       <props>
+                               <prop key="**">webdavServlet</prop>
+                       </props>
+               </property>
+       </bean>
+
+</beans>
\ No newline at end of file
index 2e9f38e3aed2a12d598d7246d48ba21f670bc82a..508db662c39fdc749454619f254d35332a7243fa 100644 (file)
@@ -68,8 +68,8 @@ public abstract class SlcExecutionTestUtils {
                }\r
 \r
                // FIXME: compare realized flows\r
-//             assertEquals(expected.getRealizedFlows().size(), reached\r
-//                             .getRealizedFlows().size());\r
+               // assertEquals(expected.getRealizedFlows().size(), reached\r
+               // .getRealizedFlows().size());\r
 \r
        }\r
 \r
@@ -79,6 +79,12 @@ public abstract class SlcExecutionTestUtils {
                assertEquals(expected.getUuid(), reached.getUuid());\r
                assertEquals(expected.getType(), reached.getType());\r
                assertDateSec(expected.getBegin(), reached.getBegin());\r
+               assertEquals(expected.getLogLines().size(), reached.getLogLines()\r
+                               .size());\r
+               for (int i = 0; i < expected.getLogLines().size(); i++) {\r
+                       assertEquals(expected.getLogLines().get(i), reached.getLogLines()\r
+                                       .get(i));\r
+               }\r
        }\r
 \r
        private SlcExecutionTestUtils() {\r