]> git.aero2k.de Git - tmp/jakarta-migration.git/commitdiff
CSPACE-1071: Adding an example of how to create a custom Nuxeo EJB3/Remotable interfa...
authorRichard Millet <richard.millet@berkeley.edu>
Fri, 31 Dec 2010 20:24:31 +0000 (20:24 +0000)
committerRichard Millet <richard.millet@berkeley.edu>
Fri, 31 Dec 2010 20:24:31 +0000 (20:24 +0000)
52 files changed:
3rdparty/nuxeo/build.xml
3rdparty/nuxeo/nuxeo-platform-quote-api/.classpath [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote-api/.project [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote-api/.settings/org.maven.ide.eclipse.prefs [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote-api/build.xml [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote-api/pom.xml [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteConstants.java [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteConverter.java [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteEvents.java [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteManager.java [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteableDocument.java [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteableAdapterFactory.java [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteableDocumentAdapter.java [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/workflow/services/QuotesModerationService.java [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/workflow/utils/QuotesConstants.java [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/resources/META-INF/MANIFEST.MF [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/resources/OSGI-INF/QuoteableAdapter.xml [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/resources/OSGI-INF/deployment-fragment.xml [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/.classpath [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/.project [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/.settings/org.maven.ide.eclipse.prefs [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/LGPL.txt [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/build.xml [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/pom.xml [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/ejb/QuoteManagerBean.java [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/ejb/QuoteManagerLocal.java [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/ejb/QuotesModerationBean.java [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteConverterImpl.java [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteManagerImpl.java [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteSorter.java [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/listener/AbstractQuoteListener.java [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/listener/DocumentRemovedQuoteEventListener.java [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/listener/QuoteRemovedEventListener.java [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/service/QuoteService.java [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/service/QuoteServiceConfig.java [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/service/QuoteServiceHelper.java [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/META-INF/MANIFEST.MF [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/QuoteService.xml [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/deployment-fragment.xml [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/quote-listener-contrib.xml [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/quote-platform-contrib.xml [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/src/test/java/org/nuxeo/ecm/platform/comment/listener/test/SimpleListenerTest.java [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/src/test/resources/META-INF/MANIFEST.MF [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/src/test/resources/OSGI-INF/quote-jena-contrib.xml [new file with mode: 0644]
3rdparty/nuxeo/nuxeo-platform-quote/src/test/resources/log4j.properties [new file with mode: 0644]
3rdparty/nuxeo/pom.xml
pom.xml
services/account/.classpath
services/blob/3rdparty/nuxeo-platform-cs-blob/pom.xml
services/common/pom.xml
services/common/src/main/java/org/collectionspace/services/common/imaging/nuxeo/NuxeoImageUtils.java
services/pom.xml

index 694736bdd1136394864bd5d54d09a8658a6fe181..7bb24cf08392e838dad1621581918169d545e3e8 100644 (file)
             </fileset>\r
         </copy>\r
         <ant antfile="nuxeo-platform-collectionspace/build.xml" target="deploy" inheritall="false"/>\r
+               <ant antfile="nuxeo-platform-quote/build.xml" target="deploy" inheritall="false"/>\r
+               <ant antfile="nuxeo-platform-quote-api/build.xml" target="deploy" inheritall="false"/>\r
         <ant antfile="nuxeo-database-templates/build.xml" target="deploy" inheritall="false"/>\r
     </target>\r
 \r
     description="undeploy nuxeo client libs from ${jboss.server.cspace}">\r
         <delete dir="${jboss.server.cspace}/nuxeo-client"/>\r
         <ant antfile="nuxeo-platform-collectionspace/build.xml" target="undeploy" inheritall="false"/>\r
+               <ant antfile="nuxeo-platform-quote/build.xml" target="undeploy" inheritall="false"/>\r
+               <ant antfile="nuxeo-platform-quote-api/build.xml" target="undeploy" inheritall="false"/>\r
         <ant antfile="nuxeo-database-templates/build.xml" target="undeploy" inheritall="false"/>\r
     </target>\r
 \r
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/.classpath b/3rdparty/nuxeo/nuxeo-platform-quote-api/.classpath
new file mode 100644 (file)
index 0000000..199bbbb
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<classpath>\r
+       <classpathentry kind="src" output="target/classes" path="src/main/java"/>\r
+       <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/>\r
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>\r
+       <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>\r
+       <classpathentry kind="output" path="target/classes"/>\r
+</classpath>\r
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/.project b/3rdparty/nuxeo/nuxeo-platform-quote-api/.project
new file mode 100644 (file)
index 0000000..c80067b
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<projectDescription>\r
+       <name>org.collectionspace.services.3rdparty.nuxeo.quote-api</name>\r
+       <comment></comment>\r
+       <projects>\r
+       </projects>\r
+       <buildSpec>\r
+               <buildCommand>\r
+                       <name>org.eclipse.jdt.core.javabuilder</name>\r
+                       <arguments>\r
+                       </arguments>\r
+               </buildCommand>\r
+               <buildCommand>\r
+                       <name>org.maven.ide.eclipse.maven2Builder</name>\r
+                       <arguments>\r
+                       </arguments>\r
+               </buildCommand>\r
+       </buildSpec>\r
+       <natures>\r
+               <nature>org.eclipse.jdt.core.javanature</nature>\r
+               <nature>org.maven.ide.eclipse.maven2Nature</nature>\r
+       </natures>\r
+</projectDescription>\r
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/.settings/org.maven.ide.eclipse.prefs b/3rdparty/nuxeo/nuxeo-platform-quote-api/.settings/org.maven.ide.eclipse.prefs
new file mode 100644 (file)
index 0000000..28e57c9
--- /dev/null
@@ -0,0 +1,8 @@
+#Fri Dec 31 12:06:04 PST 2010\r
+activeProfiles=\r
+eclipse.preferences.version=1\r
+fullBuildGoals=process-test-resources\r
+resolveWorkspaceProjects=true\r
+resourceFilterGoals=process-resources resources\:testResources\r
+skipCompilerPlugin=false\r
+version=1\r
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/build.xml b/3rdparty/nuxeo/nuxeo-platform-quote-api/build.xml
new file mode 100644 (file)
index 0000000..20c78ba
--- /dev/null
@@ -0,0 +1,100 @@
+<project name="org.collectionspace.services.3rdparty.nuxeo.quote-api" default="package" basedir=".">
+  <description>
+    CollectionSpace Nuxeo Quote component type
+  </description>
+  <!-- set global properties for this build -->
+  <property name="services.trunk" value="../../.."/>
+  <!-- environment should be declared before reading build.properties -->
+  <property environment="env" />
+  <property file="${services.trunk}/build.properties" />
+  <property name="mvn.opts" value="" />
+  <property name="src" location="src"/>
+  <property name="build" location="build"/>
+  <property name="dist"  location="dist"/>
+
+  <property name="nuxeo.collectionspace.quote.jar"
+    value="org.collectionspace.services.3rdparty.nuxeo.quote-api-${cspace.release}.jar"/>
+
+  <property name="nuxeo.collectionspace.quote.jar.all"
+    value="org.collectionspace.services.3rdparty.nuxeo.quote-api-*.jar"/>
+  
+  <condition property="osfamily-unix">
+    <os family="unix" />
+  </condition>
+  <condition property="osfamily-windows">
+    <os family="windows" />
+  </condition>
+  
+  <target name="init" >
+    <!-- Create the time stamp -->
+    <tstamp/>
+    <!-- Create the build directory structure used by compile -->
+    <mkdir dir="${build}"/>
+  </target>
+  
+  <target name="package" depends="package-unix,package-windows"
+    description="Package CollectionSpace Services" />
+  <target name="package-unix" if="osfamily-unix">
+    <exec executable="mvn" failonerror="true">
+      <arg value="package" />
+      <arg value="-Dmaven.test.skip=true" />
+      <arg value="-f" />
+      <arg value="${basedir}/pom.xml" />
+      <arg value="-N" />
+      <arg value="${mvn.opts}" />
+    </exec>
+  </target>
+  <target name="package-windows" if="osfamily-windows">
+    <exec executable="cmd" failonerror="true">
+      <arg value="/c" />
+      <arg value="mvn.bat" />
+      <arg value="package" />
+      <arg value="-Dmaven.test.skip=true" />
+      <arg value="-f" />
+      <arg value="${basedir}/pom.xml" />
+      <arg value="-N" />
+      <arg value="${mvn.opts}" />
+    </exec>
+  </target>
+  
+  <target name="install" depends="install-unix,install-windows"
+    description="Install" />
+  <target name="install-unix" if="osfamily-unix">
+    <exec executable="mvn" failonerror="true">
+      <arg value="install" />
+      <arg value="-Dmaven.test.skip=true" />
+      <arg value="-f" />
+      <arg value="${basedir}/pom.xml" />
+      <arg value="-N" />
+      <arg value="${mvn.opts}" />
+    </exec>
+  </target>
+  <target name="install-windows" if="osfamily-windows">
+    <exec executable="cmd" failonerror="true">
+      <arg value="/c" />
+      <arg value="mvn.bat" />
+      <arg value="install" />
+      <arg value="-Dmaven.test.skip=true" />
+      <arg value="-f" />
+      <arg value="${basedir}/pom.xml" />
+      <arg value="-N" />
+      <arg value="${mvn.opts}" />
+    </exec>
+  </target>
+  
+  <target name="deploy" depends="install"
+    description="deploy collectionspace core doctype in ${jboss.server.nuxeo}">
+    <copy file="${basedir}/target/${nuxeo.collectionspace.quote.jar}"
+      todir="${jboss.deploy.nuxeo.plugins}"/>
+  </target>
+  
+  <target name="undeploy"
+    description="undeploy collectionspace Quote service from ${jboss.server.nuxeo}">
+    <delete>
+      <fileset dir="${jboss.deploy.nuxeo.plugins}">
+        <include name="${nuxeo.collectionspace.quote.jar.all}"/>
+      </fileset>
+    </delete>
+  </target>
+  
+</project>
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/pom.xml b/3rdparty/nuxeo/nuxeo-platform-quote-api/pom.xml
new file mode 100644 (file)
index 0000000..b6928f9
--- /dev/null
@@ -0,0 +1,44 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" \r
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">\r
+       <modelVersion>4.0.0</modelVersion>\r
+       <parent>\r
+               <groupId>org.collectionspace.services</groupId>\r
+               <artifactId>org.collectionspace.services.3rdparty.nuxeo</artifactId>\r
+               <version>1.1-SNAPSHOT</version>\r
+       </parent>\r
+\r
+       <groupId>org.collectionspace.services</groupId>\r
+       <artifactId>org.collectionspace.services.3rdparty.nuxeo.quote-api</artifactId>\r
+    <name>org.collectionspace.services.3rdparty.nuxeo.quote-api</name>\r
+    <description>\r
+               Nuxeo Enterprise Platform: CollectionSpace's Nuxeo Quote Service API.\r
+       </description>\r
+\r
+       <dependencies>\r
+               <dependency>\r
+                 <groupId>org.nuxeo.ecm.core</groupId>\r
+                 <artifactId>nuxeo-core-api</artifactId>\r
+                 <version>${nuxeo.core.version}</version>\r
+               </dependency>\r
+       </dependencies>\r
+\r
+    <build>\r
+        <plugins>\r
+            <plugin>\r
+                <groupId>org.apache.maven.plugins</groupId>\r
+                <artifactId>maven-jar-plugin</artifactId>\r
+                <configuration>\r
+                    <archive>\r
+                        <manifestFile> src/main/resources/META-INF/MANIFEST.MF </manifestFile>\r
+                        <manifestEntries>\r
+                            <Bundle-Version>${eclipseVersion}</Bundle-Version>\r
+                            <Bundle-ManifestVersion>2</Bundle-ManifestVersion>\r
+                        </manifestEntries>\r
+                    </archive>\r
+                </configuration>\r
+            </plugin>\r
+        </plugins>\r
+    </build>\r
+       \r
+</project>\r
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteConstants.java b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteConstants.java
new file mode 100644 (file)
index 0000000..df9dadd
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     Nuxeo - initial API and implementation
+ *
+ * $Id$
+ */
+
+package org.collectionspace.ecm.platform.quote.api;
+
+/**
+ * @author <a href="mailto:glefter@nuxeo.com">George Lefter</a>
+ *
+ */
+public final class QuoteConstants {
+
+    public static final String EVENT_COMMENT_CATEGORY = "commentCategory";
+
+    public static final String PARENT_COMMENT = "parentComment";
+
+    // FIXME This should be changed to COMMENT_DOCUMENT = "comment_document"
+    // (see NXP-2806)
+    public static final String COMMENT = "comment";
+
+    public static final String COMMENT_TEXT = "comment_text";
+
+    private QuoteConstants() {
+    }
+
+}
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteConverter.java b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteConverter.java
new file mode 100644 (file)
index 0000000..e5ea8b2
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     Nuxeo - initial API and implementation
+ *
+ * $Id$
+ */
+
+package org.collectionspace.ecm.platform.quote.api;
+
+import org.nuxeo.ecm.core.api.DocumentModel;
+
+/**
+ * @author <a href="mailto:glefter@nuxeo.com">George Lefter</a>
+ *
+ */
+public interface QuoteConverter {
+
+    /**
+     * Transforms the comment object into the document model.
+     */
+    void updateDocumentModel(DocumentModel docModel, DocumentModel comment);
+
+    /**
+     * Returns the type for comment document models.
+     */
+    String getDocumentType();
+
+}
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteEvents.java b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteEvents.java
new file mode 100644 (file)
index 0000000..c02f037
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     Nuxeo - initial API and implementation
+ *
+ * $Id$
+ */
+
+package org.collectionspace.ecm.platform.quote.api;
+
+/**
+ * @author <a href="mailto:glefter@nuxeo.com">George Lefter</a>
+ *
+ */
+public final class QuoteEvents {
+
+    public static final String COMMENT_ADDED = "commentAdded";
+
+    public static final String COMMENT_REMOVED = "commentRemoved";
+
+    // Constant utility class.
+    private QuoteEvents() {
+    }
+
+}
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteManager.java b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteManager.java
new file mode 100644 (file)
index 0000000..7d4dad5
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     Nuxeo - initial API and implementation
+ *
+ * $Id$
+ */
+
+package org.collectionspace.ecm.platform.quote.api;
+
+import java.util.List;
+
+import org.nuxeo.ecm.core.api.ClientException;
+import org.nuxeo.ecm.core.api.DocumentModel;
+
+/**
+ * @author <a href="mailto:glefter@nuxeo.com">George Lefter</a>
+ *
+ */
+public interface QuoteManager {
+
+    List<DocumentModel> getQuotes(DocumentModel docModel)
+            throws ClientException;
+
+    List<DocumentModel> getQuotes(DocumentModel docModel, DocumentModel parent)
+            throws ClientException;
+
+    /**
+     * @deprecated CommentManager cannot find the author if invoked remotely so
+     *             one should use {@link #createQuote(DocumentModel, String, String)}
+     */
+    @Deprecated
+    DocumentModel createQuote(DocumentModel docModel, String quote)
+            throws ClientException;
+
+    /**
+     * Creates a comment document model, filling its properties with given info
+     * and linking it to given document.
+     *
+     * @param docModel the document to comment
+     * @param comment the comment content
+     * @param author the comment author
+     * @return the comment document model.
+     * @throws ClientException
+     */
+    DocumentModel createQuote(DocumentModel docModel, String comment,
+            String author) throws ClientException;
+
+    DocumentModel createQuote(DocumentModel docModel, DocumentModel comment)
+            throws ClientException;
+
+    DocumentModel createQuote(DocumentModel docModel, DocumentModel parent,
+            DocumentModel child) throws ClientException;
+
+    void deleteQuote(DocumentModel docModel, DocumentModel comment)
+            throws ClientException;
+
+    /**
+     * Gets documents in relation with a particular comment.
+     *
+     * @param quote the comment
+     * @return the list of documents
+     * @throws ClientException
+     */
+    List<DocumentModel> getDocumentsForQuote(DocumentModel quote)
+            throws ClientException;
+
+    /**
+     * Creates a comment document model. It gives opportunity to save the comments in a
+     * specified location.
+     *
+     * @param docModel the document to comment
+     * @param quote the comment content
+     * @param path the location path
+     * @return the comment document model.
+     * @throws ClientException
+     */
+    DocumentModel createLocatedQuote(DocumentModel docModel,
+            DocumentModel quote, String path) throws ClientException;
+
+}
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteableDocument.java b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteableDocument.java
new file mode 100644 (file)
index 0000000..80e82dd
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     Nuxeo - initial API and implementation
+ *
+ * $Id$
+ */
+
+package org.collectionspace.ecm.platform.quote.api;
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.nuxeo.ecm.core.api.ClientException;
+import org.nuxeo.ecm.core.api.DocumentModel;
+
+/**
+ * @author <a href="mailto:glefter@nuxeo.com">George Lefter</a>
+ *
+ */
+public interface QuoteableDocument extends Serializable {
+
+    /**
+     * Returns all comments for this document.
+     *
+     * @return the list of comments
+     */
+    List<DocumentModel> getQuotes() throws ClientException;
+
+    /**
+     * Returns the comments for this document that are replied to a parent comment.
+     *
+     * @param parent the parent comment
+     * @return the comments for the parent comment
+     * @throws ClientException
+     */
+    List<DocumentModel> getQuotes(DocumentModel parent) throws ClientException;
+
+    /**
+     * Removes a comment from the document comment list.
+     *
+     * @param comment
+     */
+    void removeQuote(DocumentModel comment) throws ClientException;
+
+    /**
+     * Creates a new comment.
+     *
+     * @param comment
+     */
+    DocumentModel addQuote(DocumentModel comment) throws ClientException;
+
+    /**
+     * Creates a new comment as a reply to an existing comment.
+     *
+     * @param parent the parent comment, which must exist
+     * @param comment the comment to be added
+     * @throws ClientException
+     */
+    DocumentModel addQuote(DocumentModel parent, DocumentModel comment) throws ClientException;
+
+}
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteableAdapterFactory.java b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteableAdapterFactory.java
new file mode 100644 (file)
index 0000000..a771faa
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     Nuxeo - initial API and implementation
+ *
+ * $Id$
+ */
+
+package org.collectionspace.ecm.platform.quote.impl;
+
+import org.nuxeo.ecm.core.api.DocumentModel;
+import org.nuxeo.ecm.core.api.adapter.DocumentAdapterFactory;
+
+/**
+ * @author <a href="mailto:glefter@nuxeo.com">George Lefter</a>
+ *
+ */
+public class QuoteableAdapterFactory implements DocumentAdapterFactory {
+
+    public Object getAdapter(DocumentModel doc, Class itf) {
+        if (doc.hasFacet("Commentable")) {
+            return new QuoteableDocumentAdapter(doc);
+        } else {
+            // TODO: maybe throw an exception?
+            return null;
+        }
+    }
+
+}
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteableDocumentAdapter.java b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteableDocumentAdapter.java
new file mode 100644 (file)
index 0000000..9a8117d
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     Nuxeo - initial API and implementation
+ *
+ * $Id$
+ */
+
+package org.collectionspace.ecm.platform.quote.impl;
+
+import java.util.List;
+
+import org.nuxeo.ecm.core.api.ClientException;
+import org.nuxeo.ecm.core.api.DocumentModel;
+import org.collectionspace.ecm.platform.quote.api.QuoteManager;
+import org.collectionspace.ecm.platform.quote.api.QuoteableDocument;
+import org.nuxeo.runtime.api.Framework;
+
+/**
+ * @author <a href="mailto:glefter@nuxeo.com">George Lefter</a>
+ *
+ */
+public class QuoteableDocumentAdapter implements QuoteableDocument {
+
+    private static final long serialVersionUID = 2996381735762615450L;
+
+    final DocumentModel docModel;
+
+    public QuoteableDocumentAdapter(DocumentModel docModel) {
+        this.docModel = docModel;
+    }
+
+    private static QuoteManager getQuoteManager() {
+        try {
+            return Framework.getService(QuoteManager.class);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    @Override
+    public DocumentModel addQuote(DocumentModel comment) throws ClientException {
+        QuoteManager quoteManager = getQuoteManager();
+        return quoteManager.createQuote(docModel, comment);
+    }
+
+    @Deprecated
+    public DocumentModel addQuote(String comment) throws ClientException {
+        QuoteManager quoteManager = getQuoteManager();
+        return quoteManager.createQuote(docModel, comment);
+    }
+
+    @Override
+    public DocumentModel addQuote(DocumentModel parent, DocumentModel comment) throws ClientException {
+        QuoteManager quoteManager = getQuoteManager();
+        return quoteManager.createQuote(docModel, parent, comment);
+    }
+
+    @Override
+    public void removeQuote(DocumentModel comment) throws ClientException {
+        QuoteManager quoteManager = getQuoteManager();
+        quoteManager.deleteQuote(docModel, comment);
+    }
+
+    @Override
+    public List<DocumentModel> getQuotes() throws ClientException {
+        QuoteManager quoteManager = getQuoteManager();
+        return quoteManager.getQuotes(docModel);
+    }
+
+    @Override
+    public List<DocumentModel> getQuotes(DocumentModel parent) throws ClientException {
+        QuoteManager quoteManager = getQuoteManager();
+        return quoteManager.getQuotes(docModel, parent);
+    }
+
+}
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/workflow/services/QuotesModerationService.java b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/workflow/services/QuotesModerationService.java
new file mode 100644 (file)
index 0000000..78ed7b0
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * (C) Copyright 2009 Nuxeo SA (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     mcedica
+ */
+package org.collectionspace.ecm.platform.quote.workflow.services;
+
+import java.util.ArrayList;
+
+import org.nuxeo.ecm.core.api.ClientException;
+import org.nuxeo.ecm.core.api.CoreSession;
+import org.nuxeo.ecm.core.api.DocumentModel;
+
+public interface QuotesModerationService {
+
+    /**
+     * Starts the moderation process on given Comment posted on a documentModel.
+     *
+     * @param session the coreSession
+     * @param document the document were the comment is posted
+     * @param commentId the commentId
+     * @throws ClientException
+     */
+    void startModeration(CoreSession session, DocumentModel document,
+            String commentId, ArrayList<String> moderators)
+            throws ClientException;
+
+    /**
+     * Gets the moderation process for the given Comment posted on a documentModel.
+     *
+     * @param session the coreSession
+     * @param document the document were the comment is posted
+     * @param commentId the commentId
+     * @throws ClientException
+     */
+    /**
+    ProcessInstance getModerationProcess(JbpmService jbpmService,
+            CoreSession session, DocumentModel doc, String commentId)
+            throws ClientException;
+            **/
+
+    /**
+     * Approve the comment with the given commentId.
+     *
+     * @param session the coreSession
+     * @param document the document were the comment is posted
+     * @param commentId the commentId
+     * @throws ClientException
+     */
+    void approveQuote(CoreSession session, DocumentModel document,
+            String commentId) throws ClientException;
+
+    /**
+     * Reject the comment with the given commentId.
+     *
+     * @param session the coreSession
+     * @param document the document were the comment is posted
+     * @param commentId the commentId
+     * @throws ClientException
+     */
+    void rejectQuote(CoreSession session, DocumentModel document,
+            String commentId) throws ClientException;
+
+    /**
+     * Publish the given comment.
+     *
+     * @param session the coreSession
+     * @param comment the comment to publish
+     * @throws ClientException
+     */
+    void publishQuote(CoreSession session, DocumentModel comment)
+            throws ClientException;
+
+}
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/workflow/utils/QuotesConstants.java b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/workflow/utils/QuotesConstants.java
new file mode 100644 (file)
index 0000000..1cad1b8
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * (C) Copyright 2009 Nuxeo SA (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     mcedica
+ */
+package org.collectionspace.ecm.platform.quote.workflow.utils;
+
+/**
+ * Utility class used for registering constants.
+ */
+public final class QuotesConstants {
+
+    private QuotesConstants() {
+    }
+
+    /*
+     * Constants used for Comments
+     */
+    public static final String PERMISSION_COMMENT = "Comment";
+
+    public static final String PERMISSION_MODERATE = "Moderate";
+
+    public static final String PERMISSION_WRITE = "Write";
+
+    public static final String PERMISSION_MANAGE_EVERYTHING = "Everything";
+
+    public static final String TRANSITION_TO_PUBLISHED_STATE = "moderation_publish";
+
+    public static final String PUBLISHED_STATE = "moderation_published";
+
+    public static final String PENDING_STATE = "moderation_pending";
+
+    public static final String REJECT_STATE = "moderation_reject";
+
+    public static final String MODERATION_PROCESS = "comments_moderation";
+
+    public static final String COMMENT_ID = "commentId";
+
+    public static final String COMMENT_PUBLISHED = "commentPublished";
+
+    public static final String COMMENT_LIFECYCLE = "comment_moderation";
+
+    /**
+     * Schemas and fields.
+     */
+    public static final String COMMENT_CREATION_DATE = "comment:creationDate";
+    public static final String COMMENT_AUTHOR = "comment:author";
+    public static final String COMMENT_TEXT = "comment:text";
+}
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/resources/META-INF/MANIFEST.MF b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..f24d544
--- /dev/null
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 1
+Bundle-Name: CSpace Nuxeo Quote API project
+Bundle-SymbolicName: org.collectionspace.ecm.platform.quote.api;singleton=true
+Bundle-Vendor: Nuxeo
+Require-Bundle: org.nuxeo.ecm.core.api
+Nuxeo-Component: OSGI-INF/QuoteableAdapter.xml
+Export-Package: org.collectionspace.ecm.platform.quote.api
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/resources/OSGI-INF/QuoteableAdapter.xml b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/resources/OSGI-INF/QuoteableAdapter.xml
new file mode 100644 (file)
index 0000000..bdd3e42
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<component name="org.collectionspace.ecm.platform.quote.api.Adapter">
+
+  <documentation>
+    Defines CSpace Commentable document adapter
+  </documentation>
+
+  <!-- Commentable Document Adapter -->
+  <extension target="org.nuxeo.ecm.core.api.DocumentAdapterService" point="adapters">
+    <adapter class="org.collectionspace.ecm.platform.quote.api.QuoteableDocument"
+      factory="org.collectionspace.ecm.platform.quote.impl.QuoteableAdapterFactory" />
+  </extension>
+
+</component>
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/resources/OSGI-INF/deployment-fragment.xml b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/resources/OSGI-INF/deployment-fragment.xml
new file mode 100644 (file)
index 0000000..865552b
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<fragment>
+
+  <extension target="application#MODULE">
+    <module>
+      <java>${bundle.fileName}</java>
+    </module>
+  </extension>
+
+</fragment>
+
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/.classpath b/3rdparty/nuxeo/nuxeo-platform-quote/.classpath
new file mode 100644 (file)
index 0000000..425cd16
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<classpath>\r
+       <classpathentry kind="src" output="target/classes" path="src/main/java"/>\r
+       <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/>\r
+       <classpathentry kind="src" output="target/test-classes" path="src/test/java"/>\r
+       <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"/>\r
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>\r
+       <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>\r
+       <classpathentry kind="output" path="target/classes"/>\r
+</classpath>\r
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/.project b/3rdparty/nuxeo/nuxeo-platform-quote/.project
new file mode 100644 (file)
index 0000000..ea6dc85
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<projectDescription>\r
+       <name>org.collectionspace.services.3rdparty.nuxeo.quote</name>\r
+       <comment></comment>\r
+       <projects>\r
+       </projects>\r
+       <buildSpec>\r
+               <buildCommand>\r
+                       <name>org.eclipse.jdt.core.javabuilder</name>\r
+                       <arguments>\r
+                       </arguments>\r
+               </buildCommand>\r
+               <buildCommand>\r
+                       <name>org.maven.ide.eclipse.maven2Builder</name>\r
+                       <arguments>\r
+                       </arguments>\r
+               </buildCommand>\r
+       </buildSpec>\r
+       <natures>\r
+               <nature>org.eclipse.jdt.core.javanature</nature>\r
+               <nature>org.maven.ide.eclipse.maven2Nature</nature>\r
+       </natures>\r
+</projectDescription>\r
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/.settings/org.maven.ide.eclipse.prefs b/3rdparty/nuxeo/nuxeo-platform-quote/.settings/org.maven.ide.eclipse.prefs
new file mode 100644 (file)
index 0000000..73ad24b
--- /dev/null
@@ -0,0 +1,8 @@
+#Fri Dec 31 12:05:00 PST 2010\r
+activeProfiles=\r
+eclipse.preferences.version=1\r
+fullBuildGoals=process-test-resources\r
+resolveWorkspaceProjects=true\r
+resourceFilterGoals=process-resources resources\:testResources\r
+skipCompilerPlugin=false\r
+version=1\r
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/LGPL.txt b/3rdparty/nuxeo/nuxeo-platform-quote/LGPL.txt
new file mode 100644 (file)
index 0000000..cbee875
--- /dev/null
@@ -0,0 +1,504 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE\r
+                      Version 2.1, February 1999\r
+\r
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.\r
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+ Everyone is permitted to copy and distribute verbatim copies\r
+ of this license document, but changing it is not allowed.\r
+\r
+[This is the first released version of the Lesser GPL.  It also counts\r
+ as the successor of the GNU Library Public License, version 2, hence\r
+ the version number 2.1.]\r
+\r
+                           Preamble\r
+\r
+  The licenses for most software are designed to take away your\r
+freedom to share and change it.  By contrast, the GNU General Public\r
+Licenses are intended to guarantee your freedom to share and change\r
+free software--to make sure the software is free for all its users.\r
+\r
+  This license, the Lesser General Public License, applies to some\r
+specially designated software packages--typically libraries--of the\r
+Free Software Foundation and other authors who decide to use it.  You\r
+can use it too, but we suggest you first think carefully about whether\r
+this license or the ordinary General Public License is the better\r
+strategy to use in any particular case, based on the explanations below.\r
+\r
+  When we speak of free software, we are referring to freedom of use,\r
+not price.  Our General Public Licenses are designed to make sure that\r
+you have the freedom to distribute copies of free software (and charge\r
+for this service if you wish); that you receive source code or can get\r
+it if you want it; that you can change the software and use pieces of\r
+it in new free programs; and that you are informed that you can do\r
+these things.\r
+\r
+  To protect your rights, we need to make restrictions that forbid\r
+distributors to deny you these rights or to ask you to surrender these\r
+rights.  These restrictions translate to certain responsibilities for\r
+you if you distribute copies of the library or if you modify it.\r
+\r
+  For example, if you distribute copies of the library, whether gratis\r
+or for a fee, you must give the recipients all the rights that we gave\r
+you.  You must make sure that they, too, receive or can get the source\r
+code.  If you link other code with the library, you must provide\r
+complete object files to the recipients, so that they can relink them\r
+with the library after making changes to the library and recompiling\r
+it.  And you must show them these terms so they know their rights.\r
+\r
+  We protect your rights with a two-step method: (1) we copyright the\r
+library, and (2) we offer you this license, which gives you legal\r
+permission to copy, distribute and/or modify the library.\r
+\r
+  To protect each distributor, we want to make it very clear that\r
+there is no warranty for the free library.  Also, if the library is\r
+modified by someone else and passed on, the recipients should know\r
+that what they have is not the original version, so that the original\r
+author's reputation will not be affected by problems that might be\r
+introduced by others.\r
+\f\r
+  Finally, software patents pose a constant threat to the existence of\r
+any free program.  We wish to make sure that a company cannot\r
+effectively restrict the users of a free program by obtaining a\r
+restrictive license from a patent holder.  Therefore, we insist that\r
+any patent license obtained for a version of the library must be\r
+consistent with the full freedom of use specified in this license.\r
+\r
+  Most GNU software, including some libraries, is covered by the\r
+ordinary GNU General Public License.  This license, the GNU Lesser\r
+General Public License, applies to certain designated libraries, and\r
+is quite different from the ordinary General Public License.  We use\r
+this license for certain libraries in order to permit linking those\r
+libraries into non-free programs.\r
+\r
+  When a program is linked with a library, whether statically or using\r
+a shared library, the combination of the two is legally speaking a\r
+combined work, a derivative of the original library.  The ordinary\r
+General Public License therefore permits such linking only if the\r
+entire combination fits its criteria of freedom.  The Lesser General\r
+Public License permits more lax criteria for linking other code with\r
+the library.\r
+\r
+  We call this license the "Lesser" General Public License because it\r
+does Less to protect the user's freedom than the ordinary General\r
+Public License.  It also provides other free software developers Less\r
+of an advantage over competing non-free programs.  These disadvantages\r
+are the reason we use the ordinary General Public License for many\r
+libraries.  However, the Lesser license provides advantages in certain\r
+special circumstances.\r
+\r
+  For example, on rare occasions, there may be a special need to\r
+encourage the widest possible use of a certain library, so that it becomes\r
+a de-facto standard.  To achieve this, non-free programs must be\r
+allowed to use the library.  A more frequent case is that a free\r
+library does the same job as widely used non-free libraries.  In this\r
+case, there is little to gain by limiting the free library to free\r
+software only, so we use the Lesser General Public License.\r
+\r
+  In other cases, permission to use a particular library in non-free\r
+programs enables a greater number of people to use a large body of\r
+free software.  For example, permission to use the GNU C Library in\r
+non-free programs enables many more people to use the whole GNU\r
+operating system, as well as its variant, the GNU/Linux operating\r
+system.\r
+\r
+  Although the Lesser General Public License is Less protective of the\r
+users' freedom, it does ensure that the user of a program that is\r
+linked with the Library has the freedom and the wherewithal to run\r
+that program using a modified version of the Library.\r
+\r
+  The precise terms and conditions for copying, distribution and\r
+modification follow.  Pay close attention to the difference between a\r
+"work based on the library" and a "work that uses the library".  The\r
+former contains code derived from the library, whereas the latter must\r
+be combined with the library in order to run.\r
+\f\r
+                 GNU LESSER GENERAL PUBLIC LICENSE\r
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\r
+\r
+  0. This License Agreement applies to any software library or other\r
+program which contains a notice placed by the copyright holder or\r
+other authorized party saying it may be distributed under the terms of\r
+this Lesser General Public License (also called "this License").\r
+Each licensee is addressed as "you".\r
+\r
+  A "library" means a collection of software functions and/or data\r
+prepared so as to be conveniently linked with application programs\r
+(which use some of those functions and data) to form executables.\r
+\r
+  The "Library", below, refers to any such software library or work\r
+which has been distributed under these terms.  A "work based on the\r
+Library" means either the Library or any derivative work under\r
+copyright law: that is to say, a work containing the Library or a\r
+portion of it, either verbatim or with modifications and/or translated\r
+straightforwardly into another language.  (Hereinafter, translation is\r
+included without limitation in the term "modification".)\r
+\r
+  "Source code" for a work means the preferred form of the work for\r
+making modifications to it.  For a library, complete source code means\r
+all the source code for all modules it contains, plus any associated\r
+interface definition files, plus the scripts used to control compilation\r
+and installation of the library.\r
+\r
+  Activities other than copying, distribution and modification are not\r
+covered by this License; they are outside its scope.  The act of\r
+running a program using the Library is not restricted, and output from\r
+such a program is covered only if its contents constitute a work based\r
+on the Library (independent of the use of the Library in a tool for\r
+writing it).  Whether that is true depends on what the Library does\r
+and what the program that uses the Library does.\r
+  \r
+  1. You may copy and distribute verbatim copies of the Library's\r
+complete source code as you receive it, in any medium, provided that\r
+you conspicuously and appropriately publish on each copy an\r
+appropriate copyright notice and disclaimer of warranty; keep intact\r
+all the notices that refer to this License and to the absence of any\r
+warranty; and distribute a copy of this License along with the\r
+Library.\r
+\r
+  You may charge a fee for the physical act of transferring a copy,\r
+and you may at your option offer warranty protection in exchange for a\r
+fee.\r
+\f\r
+  2. You may modify your copy or copies of the Library or any portion\r
+of it, thus forming a work based on the Library, and copy and\r
+distribute such modifications or work under the terms of Section 1\r
+above, provided that you also meet all of these conditions:\r
+\r
+    a) The modified work must itself be a software library.\r
+\r
+    b) You must cause the files modified to carry prominent notices\r
+    stating that you changed the files and the date of any change.\r
+\r
+    c) You must cause the whole of the work to be licensed at no\r
+    charge to all third parties under the terms of this License.\r
+\r
+    d) If a facility in the modified Library refers to a function or a\r
+    table of data to be supplied by an application program that uses\r
+    the facility, other than as an argument passed when the facility\r
+    is invoked, then you must make a good faith effort to ensure that,\r
+    in the event an application does not supply such function or\r
+    table, the facility still operates, and performs whatever part of\r
+    its purpose remains meaningful.\r
+\r
+    (For example, a function in a library to compute square roots has\r
+    a purpose that is entirely well-defined independent of the\r
+    application.  Therefore, Subsection 2d requires that any\r
+    application-supplied function or table used by this function must\r
+    be optional: if the application does not supply it, the square\r
+    root function must still compute square roots.)\r
+\r
+These requirements apply to the modified work as a whole.  If\r
+identifiable sections of that work are not derived from the Library,\r
+and can be reasonably considered independent and separate works in\r
+themselves, then this License, and its terms, do not apply to those\r
+sections when you distribute them as separate works.  But when you\r
+distribute the same sections as part of a whole which is a work based\r
+on the Library, the distribution of the whole must be on the terms of\r
+this License, whose permissions for other licensees extend to the\r
+entire whole, and thus to each and every part regardless of who wrote\r
+it.\r
+\r
+Thus, it is not the intent of this section to claim rights or contest\r
+your rights to work written entirely by you; rather, the intent is to\r
+exercise the right to control the distribution of derivative or\r
+collective works based on the Library.\r
+\r
+In addition, mere aggregation of another work not based on the Library\r
+with the Library (or with a work based on the Library) on a volume of\r
+a storage or distribution medium does not bring the other work under\r
+the scope of this License.\r
+\r
+  3. You may opt to apply the terms of the ordinary GNU General Public\r
+License instead of this License to a given copy of the Library.  To do\r
+this, you must alter all the notices that refer to this License, so\r
+that they refer to the ordinary GNU General Public License, version 2,\r
+instead of to this License.  (If a newer version than version 2 of the\r
+ordinary GNU General Public License has appeared, then you can specify\r
+that version instead if you wish.)  Do not make any other change in\r
+these notices.\r
+\f\r
+  Once this change is made in a given copy, it is irreversible for\r
+that copy, so the ordinary GNU General Public License applies to all\r
+subsequent copies and derivative works made from that copy.\r
+\r
+  This option is useful when you wish to copy part of the code of\r
+the Library into a program that is not a library.\r
+\r
+  4. You may copy and distribute the Library (or a portion or\r
+derivative of it, under Section 2) in object code or executable form\r
+under the terms of Sections 1 and 2 above provided that you accompany\r
+it with the complete corresponding machine-readable source code, which\r
+must be distributed under the terms of Sections 1 and 2 above on a\r
+medium customarily used for software interchange.\r
+\r
+  If distribution of object code is made by offering access to copy\r
+from a designated place, then offering equivalent access to copy the\r
+source code from the same place satisfies the requirement to\r
+distribute the source code, even though third parties are not\r
+compelled to copy the source along with the object code.\r
+\r
+  5. A program that contains no derivative of any portion of the\r
+Library, but is designed to work with the Library by being compiled or\r
+linked with it, is called a "work that uses the Library".  Such a\r
+work, in isolation, is not a derivative work of the Library, and\r
+therefore falls outside the scope of this License.\r
+\r
+  However, linking a "work that uses the Library" with the Library\r
+creates an executable that is a derivative of the Library (because it\r
+contains portions of the Library), rather than a "work that uses the\r
+library".  The executable is therefore covered by this License.\r
+Section 6 states terms for distribution of such executables.\r
+\r
+  When a "work that uses the Library" uses material from a header file\r
+that is part of the Library, the object code for the work may be a\r
+derivative work of the Library even though the source code is not.\r
+Whether this is true is especially significant if the work can be\r
+linked without the Library, or if the work is itself a library.  The\r
+threshold for this to be true is not precisely defined by law.\r
+\r
+  If such an object file uses only numerical parameters, data\r
+structure layouts and accessors, and small macros and small inline\r
+functions (ten lines or less in length), then the use of the object\r
+file is unrestricted, regardless of whether it is legally a derivative\r
+work.  (Executables containing this object code plus portions of the\r
+Library will still fall under Section 6.)\r
+\r
+  Otherwise, if the work is a derivative of the Library, you may\r
+distribute the object code for the work under the terms of Section 6.\r
+Any executables containing that work also fall under Section 6,\r
+whether or not they are linked directly with the Library itself.\r
+\f\r
+  6. As an exception to the Sections above, you may also combine or\r
+link a "work that uses the Library" with the Library to produce a\r
+work containing portions of the Library, and distribute that work\r
+under terms of your choice, provided that the terms permit\r
+modification of the work for the customer's own use and reverse\r
+engineering for debugging such modifications.\r
+\r
+  You must give prominent notice with each copy of the work that the\r
+Library is used in it and that the Library and its use are covered by\r
+this License.  You must supply a copy of this License.  If the work\r
+during execution displays copyright notices, you must include the\r
+copyright notice for the Library among them, as well as a reference\r
+directing the user to the copy of this License.  Also, you must do one\r
+of these things:\r
+\r
+    a) Accompany the work with the complete corresponding\r
+    machine-readable source code for the Library including whatever\r
+    changes were used in the work (which must be distributed under\r
+    Sections 1 and 2 above); and, if the work is an executable linked\r
+    with the Library, with the complete machine-readable "work that\r
+    uses the Library", as object code and/or source code, so that the\r
+    user can modify the Library and then relink to produce a modified\r
+    executable containing the modified Library.  (It is understood\r
+    that the user who changes the contents of definitions files in the\r
+    Library will not necessarily be able to recompile the application\r
+    to use the modified definitions.)\r
+\r
+    b) Use a suitable shared library mechanism for linking with the\r
+    Library.  A suitable mechanism is one that (1) uses at run time a\r
+    copy of the library already present on the user's computer system,\r
+    rather than copying library functions into the executable, and (2)\r
+    will operate properly with a modified version of the library, if\r
+    the user installs one, as long as the modified version is\r
+    interface-compatible with the version that the work was made with.\r
+\r
+    c) Accompany the work with a written offer, valid for at\r
+    least three years, to give the same user the materials\r
+    specified in Subsection 6a, above, for a charge no more\r
+    than the cost of performing this distribution.\r
+\r
+    d) If distribution of the work is made by offering access to copy\r
+    from a designated place, offer equivalent access to copy the above\r
+    specified materials from the same place.\r
+\r
+    e) Verify that the user has already received a copy of these\r
+    materials or that you have already sent this user a copy.\r
+\r
+  For an executable, the required form of the "work that uses the\r
+Library" must include any data and utility programs needed for\r
+reproducing the executable from it.  However, as a special exception,\r
+the materials to be distributed need not include anything that is\r
+normally distributed (in either source or binary form) with the major\r
+components (compiler, kernel, and so on) of the operating system on\r
+which the executable runs, unless that component itself accompanies\r
+the executable.\r
+\r
+  It may happen that this requirement contradicts the license\r
+restrictions of other proprietary libraries that do not normally\r
+accompany the operating system.  Such a contradiction means you cannot\r
+use both them and the Library together in an executable that you\r
+distribute.\r
+\f\r
+  7. You may place library facilities that are a work based on the\r
+Library side-by-side in a single library together with other library\r
+facilities not covered by this License, and distribute such a combined\r
+library, provided that the separate distribution of the work based on\r
+the Library and of the other library facilities is otherwise\r
+permitted, and provided that you do these two things:\r
+\r
+    a) Accompany the combined library with a copy of the same work\r
+    based on the Library, uncombined with any other library\r
+    facilities.  This must be distributed under the terms of the\r
+    Sections above.\r
+\r
+    b) Give prominent notice with the combined library of the fact\r
+    that part of it is a work based on the Library, and explaining\r
+    where to find the accompanying uncombined form of the same work.\r
+\r
+  8. You may not copy, modify, sublicense, link with, or distribute\r
+the Library except as expressly provided under this License.  Any\r
+attempt otherwise to copy, modify, sublicense, link with, or\r
+distribute the Library is void, and will automatically terminate your\r
+rights under this License.  However, parties who have received copies,\r
+or rights, from you under this License will not have their licenses\r
+terminated so long as such parties remain in full compliance.\r
+\r
+  9. You are not required to accept this License, since you have not\r
+signed it.  However, nothing else grants you permission to modify or\r
+distribute the Library or its derivative works.  These actions are\r
+prohibited by law if you do not accept this License.  Therefore, by\r
+modifying or distributing the Library (or any work based on the\r
+Library), you indicate your acceptance of this License to do so, and\r
+all its terms and conditions for copying, distributing or modifying\r
+the Library or works based on it.\r
+\r
+  10. Each time you redistribute the Library (or any work based on the\r
+Library), the recipient automatically receives a license from the\r
+original licensor to copy, distribute, link with or modify the Library\r
+subject to these terms and conditions.  You may not impose any further\r
+restrictions on the recipients' exercise of the rights granted herein.\r
+You are not responsible for enforcing compliance by third parties with\r
+this License.\r
+\f\r
+  11. If, as a consequence of a court judgment or allegation of patent\r
+infringement or for any other reason (not limited to patent issues),\r
+conditions are imposed on you (whether by court order, agreement or\r
+otherwise) that contradict the conditions of this License, they do not\r
+excuse you from the conditions of this License.  If you cannot\r
+distribute so as to satisfy simultaneously your obligations under this\r
+License and any other pertinent obligations, then as a consequence you\r
+may not distribute the Library at all.  For example, if a patent\r
+license would not permit royalty-free redistribution of the Library by\r
+all those who receive copies directly or indirectly through you, then\r
+the only way you could satisfy both it and this License would be to\r
+refrain entirely from distribution of the Library.\r
+\r
+If any portion of this section is held invalid or unenforceable under any\r
+particular circumstance, the balance of the section is intended to apply,\r
+and the section as a whole is intended to apply in other circumstances.\r
+\r
+It is not the purpose of this section to induce you to infringe any\r
+patents or other property right claims or to contest validity of any\r
+such claims; this section has the sole purpose of protecting the\r
+integrity of the free software distribution system which is\r
+implemented by public license practices.  Many people have made\r
+generous contributions to the wide range of software distributed\r
+through that system in reliance on consistent application of that\r
+system; it is up to the author/donor to decide if he or she is willing\r
+to distribute software through any other system and a licensee cannot\r
+impose that choice.\r
+\r
+This section is intended to make thoroughly clear what is believed to\r
+be a consequence of the rest of this License.\r
+\r
+  12. If the distribution and/or use of the Library is restricted in\r
+certain countries either by patents or by copyrighted interfaces, the\r
+original copyright holder who places the Library under this License may add\r
+an explicit geographical distribution limitation excluding those countries,\r
+so that distribution is permitted only in or among countries not thus\r
+excluded.  In such case, this License incorporates the limitation as if\r
+written in the body of this License.\r
+\r
+  13. The Free Software Foundation may publish revised and/or new\r
+versions of the Lesser General Public License from time to time.\r
+Such new versions will be similar in spirit to the present version,\r
+but may differ in detail to address new problems or concerns.\r
+\r
+Each version is given a distinguishing version number.  If the Library\r
+specifies a version number of this License which applies to it and\r
+"any later version", you have the option of following the terms and\r
+conditions either of that version or of any later version published by\r
+the Free Software Foundation.  If the Library does not specify a\r
+license version number, you may choose any version ever published by\r
+the Free Software Foundation.\r
+\f\r
+  14. If you wish to incorporate parts of the Library into other free\r
+programs whose distribution conditions are incompatible with these,\r
+write to the author to ask for permission.  For software which is\r
+copyrighted by the Free Software Foundation, write to the Free\r
+Software Foundation; we sometimes make exceptions for this.  Our\r
+decision will be guided by the two goals of preserving the free status\r
+of all derivatives of our free software and of promoting the sharing\r
+and reuse of software generally.\r
+\r
+                           NO WARRANTY\r
+\r
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\r
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\r
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\r
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY\r
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\r
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\r
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\r
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\r
+\r
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\r
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\r
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\r
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\r
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\r
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\r
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\r
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\r
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\r
+DAMAGES.\r
+\r
+                    END OF TERMS AND CONDITIONS\r
+\f\r
+           How to Apply These Terms to Your New Libraries\r
+\r
+  If you develop a new library, and you want it to be of the greatest\r
+possible use to the public, we recommend making it free software that\r
+everyone can redistribute and change.  You can do so by permitting\r
+redistribution under these terms (or, alternatively, under the terms of the\r
+ordinary General Public License).\r
+\r
+  To apply these terms, attach the following notices to the library.  It is\r
+safest to attach them to the start of each source file to most effectively\r
+convey the exclusion of warranty; and each file should have at least the\r
+"copyright" line and a pointer to where the full notice is found.\r
+\r
+    <one line to give the library's name and a brief idea of what it does.>\r
+    Copyright (C) <year>  <name of author>\r
+\r
+    This library is free software; you can redistribute it and/or\r
+    modify it under the terms of the GNU Lesser General Public\r
+    License as published by the Free Software Foundation; either\r
+    version 2.1 of the License, or (at your option) any later version.\r
+\r
+    This library is distributed in the hope that it will be useful,\r
+    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+    Lesser General Public License for more details.\r
+\r
+    You should have received a copy of the GNU Lesser General Public\r
+    License along with this library; if not, write to the Free Software\r
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
+\r
+Also add information on how to contact you by electronic and paper mail.\r
+\r
+You should also get your employer (if you work as a programmer) or your\r
+school, if any, to sign a "copyright disclaimer" for the library, if\r
+necessary.  Here is a sample; alter the names:\r
+\r
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the\r
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\r
+\r
+  <signature of Ty Coon>, 1 April 1990\r
+  Ty Coon, President of Vice\r
+\r
+That's all there is to it!\r
+\r
+\r
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/build.xml b/3rdparty/nuxeo/nuxeo-platform-quote/build.xml
new file mode 100644 (file)
index 0000000..c67bcfd
--- /dev/null
@@ -0,0 +1,100 @@
+<project name="org.collectionspace.services.3rdparty.nuxeo.quote" default="package" basedir=".">
+  <description>
+    CollectionSpace Nuxeo Quote component type
+  </description>
+  <!-- set global properties for this build -->
+  <property name="services.trunk" value="../../.."/>
+  <!-- environment should be declared before reading build.properties -->
+  <property environment="env" />
+  <property file="${services.trunk}/build.properties" />
+  <property name="mvn.opts" value="" />
+  <property name="src" location="src"/>
+  <property name="build" location="build"/>
+  <property name="dist"  location="dist"/>
+
+  <property name="nuxeo.collectionspace.quote.jar"
+    value="org.collectionspace.services.3rdparty.nuxeo.quote-${cspace.release}.jar"/>
+
+  <property name="nuxeo.collectionspace.quote.jar.all"
+    value="org.collectionspace.services.3rdparty.nuxeo.quote-*.jar"/>
+  
+  <condition property="osfamily-unix">
+    <os family="unix" />
+  </condition>
+  <condition property="osfamily-windows">
+    <os family="windows" />
+  </condition>
+  
+  <target name="init" >
+    <!-- Create the time stamp -->
+    <tstamp/>
+    <!-- Create the build directory structure used by compile -->
+    <mkdir dir="${build}"/>
+  </target>
+  
+  <target name="package" depends="package-unix,package-windows"
+    description="Package CollectionSpace Services" />
+  <target name="package-unix" if="osfamily-unix">
+    <exec executable="mvn" failonerror="true">
+      <arg value="package" />
+      <arg value="-Dmaven.test.skip=true" />
+      <arg value="-f" />
+      <arg value="${basedir}/pom.xml" />
+      <arg value="-N" />
+      <arg value="${mvn.opts}" />
+    </exec>
+  </target>
+  <target name="package-windows" if="osfamily-windows">
+    <exec executable="cmd" failonerror="true">
+      <arg value="/c" />
+      <arg value="mvn.bat" />
+      <arg value="package" />
+      <arg value="-Dmaven.test.skip=true" />
+      <arg value="-f" />
+      <arg value="${basedir}/pom.xml" />
+      <arg value="-N" />
+      <arg value="${mvn.opts}" />
+    </exec>
+  </target>
+  
+  <target name="install" depends="install-unix,install-windows"
+    description="Install" />
+  <target name="install-unix" if="osfamily-unix">
+    <exec executable="mvn" failonerror="true">
+      <arg value="install" />
+      <arg value="-Dmaven.test.skip=true" />
+      <arg value="-f" />
+      <arg value="${basedir}/pom.xml" />
+      <arg value="-N" />
+      <arg value="${mvn.opts}" />
+    </exec>
+  </target>
+  <target name="install-windows" if="osfamily-windows">
+    <exec executable="cmd" failonerror="true">
+      <arg value="/c" />
+      <arg value="mvn.bat" />
+      <arg value="install" />
+      <arg value="-Dmaven.test.skip=true" />
+      <arg value="-f" />
+      <arg value="${basedir}/pom.xml" />
+      <arg value="-N" />
+      <arg value="${mvn.opts}" />
+    </exec>
+  </target>
+  
+  <target name="deploy" depends="install"
+    description="deploy collectionspace core doctype in ${jboss.server.nuxeo}">
+    <copy file="${basedir}/target/${nuxeo.collectionspace.quote.jar}"
+      todir="${jboss.deploy.nuxeo.plugins}"/>
+  </target>
+  
+  <target name="undeploy"
+    description="undeploy collectionspace Quote service from ${jboss.server.nuxeo}">
+    <delete>
+      <fileset dir="${jboss.deploy.nuxeo.plugins}">
+        <include name="${nuxeo.collectionspace.quote.jar.all}"/>
+      </fileset>
+    </delete>
+  </target>
+  
+</project>
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/pom.xml b/3rdparty/nuxeo/nuxeo-platform-quote/pom.xml
new file mode 100644 (file)
index 0000000..1e59245
--- /dev/null
@@ -0,0 +1,152 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">\r
+  <modelVersion>4.0.0</modelVersion>\r
+\r
+       <parent>\r
+               <groupId>org.collectionspace.services</groupId>\r
+               <artifactId>org.collectionspace.services.3rdparty.nuxeo</artifactId>\r
+               <version>1.1-SNAPSHOT</version>\r
+       </parent>\r
+\r
+  <groupId>org.collectionspace.services</groupId>\r
+  <artifactId>org.collectionspace.services.3rdparty.nuxeo.quote</artifactId>\r
+  <name>org.collectionspace.services.3rdparty.nuxeo.quote</name>\r
+  <description>\r
+       Nuxeo Enterprise Platform: CollectionSpace's Nuxeo Quote Service.\r
+  </description>\r
+\r
+  <dependencies>\r
+       <!--\r
+               CollectionSpace Dependencies\r
+       -->\r
+    <dependency>\r
+       <groupId>org.collectionspace.services</groupId>\r
+       <artifactId>org.collectionspace.services.3rdparty.nuxeo.quote-api</artifactId>\r
+    <version>${project.version}</version>\r
+    </dependency>\r
+       <!--\r
+               Nuxeo Dependencies\r
+       -->\r
+    <dependency>\r
+      <groupId>org.nuxeo.ecm.core</groupId>\r
+      <artifactId>nuxeo-core-api</artifactId>\r
+      <version>${nuxeo.core.version}</version>\r
+    </dependency>\r
+    <dependency>\r
+      <groupId>org.nuxeo.ecm.core</groupId>\r
+      <artifactId>nuxeo-core-event</artifactId>\r
+      <version>${nuxeo.core.version}</version>\r
+    </dependency>\r
+    <dependency>\r
+      <groupId>org.nuxeo.ecm.core</groupId>\r
+      <artifactId>nuxeo-core-schema</artifactId>\r
+      <version>${nuxeo.core.version}</version>\r
+    </dependency>\r
+    <dependency>\r
+      <groupId>org.nuxeo.ecm.platform</groupId>\r
+      <artifactId>nuxeo-platform-relations-api</artifactId>\r
+      <version>${nuxeo.platform.version}</version>\r
+    </dependency>\r
+    <dependency>\r
+      <groupId>org.nuxeo.ecm.platform</groupId>\r
+      <artifactId>nuxeo-platform-api</artifactId>\r
+      <version>${nuxeo.platform.version}</version>\r
+    </dependency>\r
+    <dependency>\r
+      <groupId>org.nuxeo.ecm.platform</groupId>\r
+      <artifactId>nuxeo-platform-usermanager-api</artifactId>\r
+      <version>${nuxeo.platform.version}</version>\r
+    </dependency>\r
+\r
+    <dependency>\r
+      <groupId>javax.ejb</groupId>\r
+      <artifactId>ejb-api</artifactId>\r
+    </dependency>\r
+    <dependency>\r
+      <groupId>javax.annotation</groupId>\r
+      <artifactId>jsr250-api</artifactId>\r
+    </dependency>\r
+    <dependency>\r
+      <groupId>jboss</groupId>\r
+      <artifactId>jboss-annotations-ejb3</artifactId>\r
+    </dependency>\r
+    <dependency>\r
+      <groupId>javax.jms</groupId>\r
+      <artifactId>jms</artifactId>\r
+    </dependency>\r
+    <dependency>\r
+      <groupId>jboss</groupId>\r
+      <artifactId>jboss-j2ee</artifactId>\r
+    </dependency>\r
+    \r
+    <dependency>\r
+        <groupId>commons-logging</groupId>\r
+        <artifactId>commons-logging</artifactId>\r
+        <version>1.1.1</version>\r
+    </dependency>\r
+    <dependency>\r
+        <groupId>log4j</groupId>\r
+        <artifactId>log4j</artifactId>\r
+        <version>1.2.14</version>\r
+        <scope>provided</scope>\r
+    </dependency>\r
+    \r
+\r
+    <!-- test dependencies -->\r
+    <dependency>\r
+      <groupId>javax.transaction</groupId>\r
+      <artifactId>jta</artifactId>\r
+      <scope>test</scope>\r
+    </dependency>\r
+    <dependency>\r
+      <groupId>org.nuxeo.ecm.core</groupId>\r
+      <artifactId>nuxeo-core-jcr-connector</artifactId>\r
+      <version>${nuxeo.core.version}</version>\r
+      <scope>test</scope>\r
+    </dependency>\r
+    <dependency>\r
+      <groupId>org.nuxeo.ecm.core</groupId>\r
+      <artifactId>nuxeo-core-jcr-connector-test</artifactId>\r
+      <version>${nuxeo.core.version}</version>\r
+      <scope>test</scope>\r
+    </dependency>\r
+    <dependency>\r
+      <groupId>org.nuxeo.ecm.platform</groupId>\r
+      <artifactId>nuxeo-platform-relations-core</artifactId>\r
+      <version>${nuxeo.platform.version}</version>\r
+      <scope>test</scope>\r
+    </dependency>\r
+    <dependency>\r
+      <groupId>org.nuxeo.ecm.platform</groupId>\r
+      <artifactId>nuxeo-platform-relations-jena-plugin</artifactId>\r
+      <version>${nuxeo.platform.version}</version>\r
+      <scope>test</scope>\r
+    </dependency>\r
+    <dependency>\r
+      <groupId>org.nuxeo.ecm.platform</groupId>\r
+      <artifactId>nuxeo-platform-comment-core</artifactId>\r
+      <version>${nuxeo.platform.version}</version>\r
+      <scope>test</scope>\r
+    </dependency>\r
+  </dependencies>\r
+  \r
+    <build>\r
+        <plugins>\r
+            <plugin>\r
+                <groupId>org.apache.maven.plugins</groupId>\r
+                <artifactId>maven-jar-plugin</artifactId>\r
+                <configuration>\r
+                    <archive>\r
+                        <manifestFile> src/main/resources/META-INF/MANIFEST.MF </manifestFile>\r
+                        <manifestEntries>\r
+                            <Bundle-Version>${eclipseVersion}</Bundle-Version>\r
+                            <Bundle-ManifestVersion>2</Bundle-ManifestVersion>\r
+                        </manifestEntries>\r
+                    </archive>\r
+                </configuration>\r
+            </plugin>\r
+        </plugins>\r
+    </build>\r
+  \r
+\r
+</project>\r
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/ejb/QuoteManagerBean.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/ejb/QuoteManagerBean.java
new file mode 100644 (file)
index 0000000..8270fa8
--- /dev/null
@@ -0,0 +1,174 @@
+/*
+ * (C) Copyright 2006-2007 Nuxeo SAS (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     Nuxeo - initial API and implementation
+ *
+ * $Id$
+ */
+
+package org.collectionspace.ecm.platform.quote.ejb;
+
+import java.util.List;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import javax.ejb.EJBContext;
+import javax.ejb.Local;
+import javax.ejb.Remote;
+import javax.ejb.Stateless;
+
+import org.nuxeo.ecm.core.api.ClientException;
+import org.nuxeo.ecm.core.api.ClientRuntimeException;
+import org.nuxeo.ecm.core.api.DocumentModel;
+
+import org.collectionspace.ecm.platform.quote.api.QuoteManager;
+import org.collectionspace.ecm.platform.quote.service.QuoteService;
+import org.collectionspace.ecm.platform.quote.service.QuoteServiceHelper;
+
+/**
+ * @author <a href="mailto:glefter@nuxeo.com">George Lefter</a>
+ *
+ */
+@Stateless
+@Remote(QuoteManager.class)
+@Local(QuoteManagerLocal.class)
+public class QuoteManagerBean implements QuoteManager {
+
+    @Resource
+    EJBContext context;
+
+    private QuoteManager quoteManager;
+
+    @PostConstruct
+    public void initialize() {
+        QuoteService quoteService = QuoteServiceHelper.getQuoteService();
+        quoteManager = quoteService.getQuoteManager();
+    }
+
+    public void cleanup() {}
+
+    public void remove() {}
+
+    @Override
+    public DocumentModel createQuote(DocumentModel docModel,
+            String quote) throws ClientException {
+        try {
+            String author = context.getCallerPrincipal().getName();
+            return quoteManager.createQuote(docModel, quote, author);
+        } catch (Throwable e) {
+            throw ClientException.wrap(e);
+        }
+    }
+
+    @Override
+    public DocumentModel createQuote(DocumentModel docModel,
+            String quote, String author) throws ClientException {
+        try {
+            return quoteManager.createQuote(docModel, quote, author);
+        } catch (Throwable e) {
+            throw ClientException.wrap(e);
+        }
+    }
+
+    private String updateAuthor(DocumentModel docModel) {
+        String author;
+        try {
+            author = (String) docModel.getProperty("comment", "author");
+        } catch (ClientException e) {
+            author = null;
+        }
+        if (author == null) {
+            author = context.getCallerPrincipal().getName();
+            try {
+                docModel.setProperty("comment", "author", author);
+            } catch (ClientException e) {
+                throw new ClientRuntimeException(e);
+            }
+        }
+        return author;
+    }
+
+    @Override
+    public DocumentModel createQuote(DocumentModel docModel,
+            DocumentModel quote) throws ClientException {
+        try {
+            updateAuthor(quote);
+            return quoteManager.createQuote(docModel, quote);
+        } catch (Throwable e) {
+            throw ClientException.wrap(e);
+        }
+    }
+
+    @Override
+    public void deleteQuote(DocumentModel docModel, DocumentModel quote)
+            throws ClientException {
+        try {
+            quoteManager.deleteQuote(docModel, quote);
+        } catch (Throwable e) {
+            throw ClientException.wrap(e);
+        }
+    }
+
+    @Override
+    public List<DocumentModel> getQuotes(DocumentModel docModel)
+            throws ClientException {
+        try {
+            return quoteManager.getQuotes(docModel);
+        } catch (Throwable e) {
+            throw ClientException.wrap(e);
+        }
+    }
+
+    @Override
+    public DocumentModel createQuote(DocumentModel docModel,
+            DocumentModel parent, DocumentModel child) throws ClientException {
+        try {
+            updateAuthor(child);
+            return quoteManager.createQuote(docModel, parent, child);
+        } catch (Throwable e) {
+            throw ClientException.wrap(e);
+        }
+    }
+
+    @Override
+    public List<DocumentModel> getQuotes(DocumentModel docModel,
+            DocumentModel parent) throws ClientException {
+        try {
+            return quoteManager.getQuotes(docModel, parent);
+        } catch (Throwable e) {
+            throw ClientException.wrap(e);
+        }
+    }
+
+    @Override
+    public List<DocumentModel> getDocumentsForQuote(DocumentModel commentDoc)
+            throws ClientException{
+        try {
+            return quoteManager.getDocumentsForQuote(commentDoc);
+        } catch (Throwable e) {
+            throw ClientException.wrap(e);
+        }
+    }
+
+    @Override
+    public DocumentModel createLocatedQuote(DocumentModel docModel,
+            DocumentModel comment, String path) throws ClientException {
+        try {
+            return quoteManager.createLocatedQuote(docModel, comment, path);
+        } catch (Throwable e) {
+            throw ClientException.wrap(e);
+        }
+    }
+
+}
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/ejb/QuoteManagerLocal.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/ejb/QuoteManagerLocal.java
new file mode 100644 (file)
index 0000000..e4c18c3
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     Nuxeo - initial API and implementation
+ *
+ * $Id$
+ */
+
+package org.collectionspace.ecm.platform.quote.ejb;
+
+import javax.ejb.Local;
+
+import org.collectionspace.ecm.platform.quote.api.QuoteManager;
+
+/**
+ * @author <a href="mailto:glefter@nuxeo.com">George Lefter</a>
+ *
+ */
+@Local
+public interface QuoteManagerLocal extends QuoteManager {
+
+}
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/ejb/QuotesModerationBean.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/ejb/QuotesModerationBean.java
new file mode 100644 (file)
index 0000000..3f8dae9
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * (C) Copyright 2006-2009 Nuxeo SAS (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     Nuxeo - initial API and implementation
+ *
+ * $Id$
+ */
+
+package org.collectionspace.ecm.platform.quote.ejb;
+
+import java.util.ArrayList;
+
+import javax.ejb.Local;
+import javax.ejb.Remote;
+import javax.ejb.Stateless;
+
+import org.nuxeo.ecm.core.api.ClientException;
+import org.nuxeo.ecm.core.api.CoreSession;
+import org.nuxeo.ecm.core.api.DocumentModel;
+import org.nuxeo.runtime.api.Framework;
+
+import org.collectionspace.ecm.platform.quote.workflow.services.QuotesModerationService;
+
+@Stateless
+@Remote(QuotesModerationService.class)
+@Local(QuotesModerationService.class)
+public class QuotesModerationBean implements QuotesModerationService {
+
+
+    protected QuotesModerationService getQuotesModerationService() {
+        return Framework.getLocalService(QuotesModerationService.class);
+    }
+
+
+    public void approveQuote(CoreSession session, DocumentModel document,
+            String commentID) throws ClientException {
+        getQuotesModerationService().approveQuote(session, document, commentID);
+    }
+
+    public void publishQuote(CoreSession session, DocumentModel comment)
+            throws ClientException {
+        getQuotesModerationService().publishQuote(session, comment);
+
+    }
+
+    public void rejectQuote(CoreSession session, DocumentModel document,
+            String commentID) throws ClientException {
+        getQuotesModerationService().rejectQuote(session, document, commentID);
+
+    }
+
+    public void startModeration(CoreSession session, DocumentModel document,
+            String commentID, ArrayList<String> moderators)
+            throws ClientException {
+        getQuotesModerationService().startModeration(session, document, commentID, moderators);
+
+    }
+
+}
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteConverterImpl.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteConverterImpl.java
new file mode 100644 (file)
index 0000000..f5243f5
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     Nuxeo - initial API and implementation
+ *
+ * $Id$
+ */
+
+package org.collectionspace.ecm.platform.quote.impl;
+
+import java.util.HashMap;
+import java.util.Set;
+
+import org.nuxeo.ecm.core.api.ClientException;
+import org.nuxeo.ecm.core.api.DataModel;
+import org.nuxeo.ecm.core.api.DataModelMap;
+import org.nuxeo.ecm.core.api.DocumentModel;
+
+import org.collectionspace.ecm.platform.quote.api.QuoteConverter;
+
+/**
+ * @author <a href="mailto:glefter@nuxeo.com">George Lefter</a>
+ *
+ */
+public class QuoteConverterImpl implements QuoteConverter {
+
+    /*protected String getSchema() {
+        return "comment";
+    }*/
+
+    /*protected Class getCommentClass() {
+        return CommentImpl.class;
+    }*/
+
+    public String getDocumentType() {
+        return "Comment";
+    }
+
+    /*public Comment getComment(DocumentModel docModel) throws ClientException {
+        CommentImpl comment;
+        try {
+            comment = (CommentImpl) getCommentClass().newInstance();
+            String schema = getSchema();
+
+            comment.setId(docModel.getId());
+            Map<String, Object> props = docModel.getProperties(schema);
+            comment.setAuthor((String) props.get("author"));
+
+            String content = (String) props.get("text");
+            if(content!=null) {
+                comment.setContent(content.trim());
+            }
+
+            Calendar cal = (Calendar) props.get("creationDate");
+            if (cal != null) {
+                comment.setCreationDate(cal.getTime());
+            }
+            Blob fileContent = (Blob)props.get("fileContent");
+            if(fileContent!=null) {
+                String filename = (String) props.get("filename");
+                if(filename!=null) {
+                    comment.setFileContent(fileContent);
+                    comment.setFilename(filename);
+                }
+
+            }
+        } catch (Exception e) {
+            throw new ClientException("failed to create comment", e);
+        }
+        return comment;
+    }*/
+
+    public void updateDocumentModel(DocumentModel docModel, DocumentModel comment) {
+
+        DataModelMap dataModelMap = comment.getDataModels();
+        Set<String> keys = dataModelMap.keySet();
+
+        for(String key : keys) {
+            DataModel dataModel = dataModelMap.get(key);
+            String schema = dataModel.getSchema();
+            try {
+                docModel.setProperties(schema, new HashMap<String, Object>(dataModel.getMap()));
+            } catch (ClientException e) {
+                continue;
+            }
+            /*if(docModel.hasSchema(schema)) {
+                docModel.setProperties(schema,dataModel.getMap());
+            }*/
+        }
+        /*docModel.setProperty(schema, "text", comment.getContent());
+        docModel.setProperty(schema, "creationDate", comment.getCreationDate());
+        docModel.setProperty(schema, "author", comment.getAuthor());
+        docModel.setProperty(schema, "fileContent", comment.getFileContent());
+        docModel.setProperty(schema, "filename", comment.getFilename());*/
+    }
+
+}
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteManagerImpl.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteManagerImpl.java
new file mode 100644 (file)
index 0000000..4deed9b
--- /dev/null
@@ -0,0 +1,639 @@
+/*
+ * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     Nuxeo - initial API and implementation
+ *
+ * $Id$
+ */
+
+package org.collectionspace.ecm.platform.quote.impl;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuxeo.common.utils.IdUtils;
+import org.nuxeo.ecm.core.api.ClientException;
+import org.nuxeo.ecm.core.api.ClientRuntimeException;
+import org.nuxeo.ecm.core.api.CoreInstance;
+import org.nuxeo.ecm.core.api.CoreSession;
+import org.nuxeo.ecm.core.api.DocumentModel;
+import org.nuxeo.ecm.core.api.DocumentRef;
+import org.nuxeo.ecm.core.api.NuxeoPrincipal;
+import org.nuxeo.ecm.core.api.PathRef;
+import org.nuxeo.ecm.core.api.repository.RepositoryManager;
+import org.nuxeo.ecm.core.api.security.ACE;
+import org.nuxeo.ecm.core.api.security.ACL;
+import org.nuxeo.ecm.core.api.security.ACP;
+import org.nuxeo.ecm.core.api.security.SecurityConstants;
+import org.nuxeo.ecm.core.api.security.impl.ACLImpl;
+import org.nuxeo.ecm.core.api.security.impl.ACPImpl;
+import org.nuxeo.ecm.core.event.Event;
+import org.nuxeo.ecm.core.event.EventProducer;
+import org.nuxeo.ecm.core.event.impl.DocumentEventContext;
+import org.nuxeo.ecm.platform.relations.api.RelationManager;
+import org.nuxeo.ecm.platform.relations.api.Resource;
+import org.nuxeo.ecm.platform.relations.api.ResourceAdapter;
+import org.nuxeo.ecm.platform.relations.api.Statement;
+import org.nuxeo.ecm.platform.relations.api.impl.QNameResourceImpl;
+import org.nuxeo.ecm.platform.relations.api.impl.ResourceImpl;
+import org.nuxeo.ecm.platform.relations.api.impl.StatementImpl;
+import org.nuxeo.ecm.platform.usermanager.UserManager;
+import org.nuxeo.runtime.api.Framework;
+
+import org.collectionspace.ecm.platform.quote.api.QuoteConstants;
+import org.collectionspace.ecm.platform.quote.api.QuoteConverter;
+import org.collectionspace.ecm.platform.quote.api.QuoteEvents;
+import org.collectionspace.ecm.platform.quote.api.QuoteManager;
+import org.collectionspace.ecm.platform.quote.service.QuoteServiceConfig;
+
+/**
+ * @author <a href="mailto:glefter@nuxeo.com">George Lefter</a>
+ *
+ */
+public class QuoteManagerImpl implements QuoteManager {
+
+    private static final Log log = LogFactory.getLog(QuoteManagerImpl.class);
+
+    final SimpleDateFormat timeFormat = new SimpleDateFormat("dd-HHmmss.S");
+
+    final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM");
+
+    final QuoteServiceConfig config;
+
+    final QuoteConverter quoteConverter;
+
+    public static final  String COMMENTS_DIRECTORY = "Comments";
+
+    public QuoteManagerImpl(QuoteServiceConfig config) {
+        if (config == null) {
+               config = new QuoteServiceConfig();
+               config.quoteConverterClassName = QuoteConverterImpl.class.getName();
+               config.graphName = "documentQuotes";
+               config.commentNamespace = "http://www.collectionspace.org/quotes/uid";
+               config.documentNamespace = "http://www.collectionspace.org/document/uid";
+               config.predicateNamespace = "http://www.nuxeo.org/predicates/isQuoteFor";
+        }
+        this.config = config;
+               quoteConverter = config.getQuoteConverter();
+    }
+
+    protected CoreSession openCoreSession(String repositoryName)
+            throws ClientException {
+        try {
+            RepositoryManager repoMgr = Framework.getService(RepositoryManager.class);
+            return repoMgr.getRepository(repositoryName).open();
+        } catch (Exception e) {
+            throw new ClientException(e);
+        }
+    }
+
+    protected void closeCoreSession(LoginContext loginContext,
+            CoreSession session) throws ClientException {
+        if (loginContext != null) {
+            try {
+                loginContext.logout();
+            } catch (LoginException e) {
+                throw new ClientException(e);
+            }
+        }
+        if (session != null) {
+            CoreInstance.getInstance().close(session);
+        }
+    }
+
+    private static RelationManager getRelationManager() throws Exception {
+        return Framework.getService(RelationManager.class);
+    }
+
+    public List<DocumentModel> getQuotes(DocumentModel docModel)
+            throws ClientException {
+        RelationManager relationManager;
+        Map<String, Serializable> ctxMap = new HashMap<String, Serializable>();
+        ctxMap.put(ResourceAdapter.CORE_SESSION_ID_CONTEXT_KEY, docModel.getSessionId());
+        try {
+            relationManager = getRelationManager();
+        } catch (Exception e) {
+            throw new ClientException(e);
+        }
+        Resource docResource = relationManager.getResource(
+                config.documentNamespace, docModel, ctxMap);
+        if (docResource == null) {
+            throw new ClientException(
+                    "Could not adapt document model to relation resource ; "
+                            + "check the service relation adapters configuration");
+        }
+
+        // FIXME AT: why no filter on the predicate?
+        Statement pattern = new StatementImpl(null, null, docResource);
+        List<Statement> statementList = relationManager.getStatements(
+                config.graphName, pattern);
+        // XXX AT: BBB for when repository name was not included in the resource
+        // uri
+        Resource oldDocResource = new QNameResourceImpl(
+                config.documentNamespace, docModel.getId());
+        Statement oldPattern = new StatementImpl(null, null, oldDocResource);
+        statementList.addAll(relationManager.getStatements(config.graphName,
+                oldPattern));
+
+        List<DocumentModel> commentList = new ArrayList<DocumentModel>();
+        for (Statement stmt : statementList) {
+            QNameResourceImpl subject = (QNameResourceImpl) stmt.getSubject();
+
+            DocumentModel commentDocModel = null;
+            try {
+                commentDocModel = (DocumentModel) relationManager.getResourceRepresentation(
+                        config.commentNamespace, subject, ctxMap);
+            } catch (Exception e) {
+                log.error("failed to retrieve commentDocModel from relations");
+            }
+            if (commentDocModel == null) {
+                // XXX AT: maybe user cannot see the comment
+                log.warn("Could not adapt comment relation subject to a document "
+                        + "model; check the service relation adapters configuration");
+                continue;
+            }
+            commentList.add(commentDocModel);
+        }
+
+        QuoteSorter sorter = new QuoteSorter(true);
+        Collections.sort(commentList, sorter);
+
+        return commentList;
+    }
+
+    public DocumentModel createQuote(DocumentModel docModel, String comment,
+            String author) throws ClientException {
+        LoginContext loginContext = null;
+        CoreSession session = null;
+        try {
+            loginContext = Framework.login();
+            session = openCoreSession(docModel.getRepositoryName());
+
+            DocumentModel commentDM = session.createDocumentModel("Comment");
+            commentDM.setProperty("comment", "text", comment);
+            commentDM.setProperty("comment", "author", author);
+            commentDM.setProperty("comment", "creationDate",
+                    Calendar.getInstance());
+            commentDM = internalCreateQuote(session, docModel, commentDM, null);
+            session.save();
+
+            return commentDM;
+        } catch (Exception e) {
+            throw new ClientException(e);
+        } finally {
+            closeCoreSession(loginContext, session);
+        }
+    }
+
+    public DocumentModel createQuote(DocumentModel docModel, String quote)
+            throws ClientException {
+        String author = getCurrentUser(docModel);
+        return createQuote(docModel, quote, author);
+    }
+
+    /**
+     * If the author property on comment is not set, retrieve the author name
+     * from the session
+     *
+     * @param docModel The document model that holds the session id
+     * @param comment The comment to update
+     * @throws ClientException
+     */
+    private static String updateAuthor(DocumentModel docModel,
+            DocumentModel comment) throws ClientException {
+        // update the author if not set
+        String author = (String) comment.getProperty("comment", "author");
+        if (author == null) {
+            log.debug("deprecated use of createComment: the client should set the author property on document");
+            author = getCurrentUser(docModel);
+            comment.setProperty("comment", "author", author);
+        }
+        return author;
+    }
+
+    public DocumentModel createQuote(DocumentModel docModel,
+            DocumentModel comment) throws ClientException {
+        LoginContext loginContext = null;
+        CoreSession session = null;
+        try {
+            loginContext = Framework.login();
+            session = openCoreSession(docModel.getRepositoryName());
+            DocumentModel doc = internalCreateQuote(session, docModel, comment, null);
+            session.save();
+            return doc;
+        } catch (Exception e) {
+            throw new ClientException(e);
+        } finally {
+            closeCoreSession(loginContext, session);
+        }
+    }
+
+    protected DocumentModel internalCreateQuote(CoreSession session,
+            DocumentModel docModel, DocumentModel comment, String path)
+            throws ClientException {
+        String author = updateAuthor(docModel, comment);
+        DocumentModel createdComment;
+
+        try {
+            createdComment = createQuoteDocModel(session, docModel, comment, path);
+
+            RelationManager relationManager = getRelationManager();
+            List<Statement> statementList = new ArrayList<Statement>();
+
+            Resource commentRes = relationManager.getResource(
+                    config.commentNamespace, createdComment, null);
+
+            Resource documentRes = relationManager.getResource(
+                    config.documentNamespace, docModel, null);
+
+            if (commentRes == null || documentRes == null) {
+                throw new ClientException(
+                        "Could not adapt document model to relation resource ; "
+                                + "check the service relation adapters configuration");
+            }
+
+            Resource predicateRes = new ResourceImpl(config.predicateNamespace);
+
+            Statement stmt = new StatementImpl(commentRes, predicateRes,
+                    documentRes);
+            statementList.add(stmt);
+            relationManager.add(config.graphName, statementList);
+        } catch (Exception e) {
+            throw new ClientException("failed to create comment", e);
+        }
+
+        NuxeoPrincipal principal = null;
+        try {
+            UserManager userManager = Framework.getService(UserManager.class);
+            principal = userManager.getPrincipal(author);
+        } catch (Exception e) {
+            log.error("Error building principal for notification", e);
+        }
+        notifyEvent(session, docModel, QuoteEvents.COMMENT_ADDED, null,
+                createdComment, principal);
+
+        return createdComment;
+    }
+
+    private DocumentModel createQuoteDocModel(CoreSession mySession,
+            DocumentModel docModel, DocumentModel comment, String path)
+            throws ClientException {
+
+        String domainPath;
+        updateAuthor(docModel, comment);
+
+        String[] pathList = getQuotePathList(comment);
+
+        if (path == null) {
+            domainPath = docModel.getPath().segment(0);
+        } else {
+            domainPath = path;
+        }
+        if (mySession == null) {
+            return null;
+        }
+
+        // TODO GR upgrade this code. It can't work if current user
+        // doesn't have admin rights
+
+        DocumentModel parent = mySession.getDocument(new PathRef(domainPath));
+        for (String name : pathList) {
+            boolean found = false;
+            String pathStr = parent.getPathAsString();
+            if (name.equals(COMMENTS_DIRECTORY)) {
+                List<DocumentModel> children = mySession.getChildren(new PathRef(pathStr),
+                        "HiddenFolder");
+                for (DocumentModel documentModel : children) {
+                    if (documentModel.getTitle().equals(COMMENTS_DIRECTORY)) {
+                        found = true;
+                        parent = documentModel;
+                        break;
+                    }
+                }
+            } else {
+                DocumentRef ref = new PathRef(pathStr, name);
+                if (mySession.exists(ref)) {
+                    parent = mySession.getDocument(ref);
+                    found = true;
+                }
+
+            }
+            if (!found) {
+                DocumentModel dm = mySession.createDocumentModel(pathStr, name,
+                        "HiddenFolder");
+                dm.setProperty("dublincore", "title", name);
+                dm.setProperty("dublincore", "description", "");
+                dm.setProperty("dublincore", "created", Calendar.getInstance());
+                dm = mySession.createDocument(dm);
+                setFolderPermissions(dm);
+                parent = dm;
+            }
+        }
+
+        String pathStr = parent.getPathAsString();
+        String commentName = getQuoteName(docModel, comment);
+        QuoteConverter converter = config.getQuoteConverter();
+        DocumentModel commentDocModel = mySession.createDocumentModel(pathStr,
+                IdUtils.generateId(commentName), comment.getType());
+        converter.updateDocumentModel(commentDocModel, comment);
+        commentDocModel.setProperty("dublincore", "title", commentName);
+        commentDocModel = mySession.createDocument(commentDocModel);
+        setQuotePermissions(commentDocModel);
+        log.debug("created comment with id=" + commentDocModel.getId());
+
+        return commentDocModel;
+    }
+
+    private static void notifyEvent(CoreSession session, DocumentModel docModel, String eventType,
+            DocumentModel parent, DocumentModel child, NuxeoPrincipal principal)
+            throws ClientException {
+
+        DocumentEventContext ctx = new DocumentEventContext(session, principal, docModel);
+        Map<String, Serializable> props = new HashMap<String, Serializable>();
+        if (parent != null) {
+            props.put(QuoteConstants.PARENT_COMMENT, parent);
+        }
+        props.put(QuoteConstants.COMMENT, child);
+        props.put(QuoteConstants.COMMENT_TEXT, (String) child.getProperty(
+                "comment", "text"));
+        props.put("category", QuoteConstants.EVENT_COMMENT_CATEGORY);
+        ctx.setProperties(props);
+        Event event = ctx.newEvent(eventType);
+
+        try {
+            EventProducer evtProducer = Framework.getService(EventProducer.class);
+            evtProducer.fireEvent(event);
+        } catch (Exception e) {
+            log.error("Error while send message", e);
+        }
+        // send also a synchronous Seam message so the CommentManagerActionBean
+        // can rebuild its list
+        // Events.instance().raiseEvent(eventType, docModel);
+    }
+
+    private static void setFolderPermissions(DocumentModel dm) {
+        ACP acp = new ACPImpl();
+        ACE grantAddChildren = new ACE("members",
+                SecurityConstants.ADD_CHILDREN, true);
+        ACE grantRemoveChildren = new ACE("members",
+                SecurityConstants.REMOVE_CHILDREN, true);
+        ACE grantRemove = new ACE("members", SecurityConstants.REMOVE, true);
+        ACL acl = new ACLImpl();
+        acl.setACEs(new ACE[] { grantAddChildren, grantRemoveChildren,
+                grantRemove });
+        acp.addACL(acl);
+        try {
+            dm.setACP(acp, true);
+        } catch (ClientException e) {
+            throw new ClientRuntimeException(e);
+        }
+    }
+
+    private static void setQuotePermissions(DocumentModel dm) {
+        ACP acp = new ACPImpl();
+        ACE grantRead = new ACE(SecurityConstants.EVERYONE,
+                SecurityConstants.READ, true);
+        ACE grantRemove = new ACE("members", SecurityConstants.REMOVE, true);
+        ACL acl = new ACLImpl();
+        acl.setACEs(new ACE[] { grantRead, grantRemove });
+        acp.addACL(acl);
+        try {
+            dm.setACP(acp, true);
+        } catch (ClientException e) {
+            throw new ClientRuntimeException(e);
+        }
+    }
+
+    private String[] getQuotePathList(DocumentModel comment) {
+        String[] pathList = new String[2];
+        pathList[0] = COMMENTS_DIRECTORY;
+
+        pathList[1] = dateFormat.format(getQuoteTimeStamp(comment));
+        return pathList;
+    }
+
+    private static CoreSession getUserSession(String sid) {
+        return CoreInstance.getInstance().getSession(sid);
+    }
+
+    /**
+     * @deprecated if the caller is remote, we cannot obtain the session
+     */
+    @Deprecated
+    private static String getCurrentUser(DocumentModel target)
+            throws ClientException {
+        String sid = target.getSessionId();
+        CoreSession userSession = getUserSession(sid);
+        if (userSession == null) {
+            throw new ClientException(
+                    "userSession is null, do not invoke this method when the user is not local");
+        }
+        return userSession.getPrincipal().getName();
+    }
+
+    private String getQuoteName(DocumentModel target, DocumentModel comment)
+            throws ClientException {
+        String author = (String) comment.getProperty("comment", "author");
+        if (author == null) {
+            author = getCurrentUser(target);
+        }
+        Date creationDate = getQuoteTimeStamp(comment);
+        return "COMMENT-" + author + '-'
+                + timeFormat.format(creationDate.getTime());
+    }
+
+    private static Date getQuoteTimeStamp(DocumentModel comment) {
+        Calendar creationDate;
+        try {
+            creationDate = (Calendar) comment.getProperty("dublincore",
+                    "created");
+        } catch (ClientException e) {
+            creationDate = null;
+        }
+        if (creationDate == null) {
+            creationDate = Calendar.getInstance();
+        }
+        return creationDate.getTime();
+    }
+
+    public void deleteQuote(DocumentModel docModel, DocumentModel comment)
+            throws ClientException {
+        LoginContext loginContext = null;
+        CoreSession session = null;
+        try {
+            loginContext = Framework.login();
+            session = openCoreSession(docModel.getRepositoryName());
+
+            if (session == null) {
+                throw new ClientException(
+                        "Unable to acess repository for comment: "
+                                + comment.getId());
+            }
+            DocumentRef ref = comment.getRef();
+            if (!session.exists(ref)) {
+                throw new ClientException("Comment Document does not exist: "
+                        + comment.getId());
+            }
+
+            NuxeoPrincipal author = getAuthor(comment);
+            session.removeDocument(ref);
+
+            notifyEvent(session, docModel, QuoteEvents.COMMENT_REMOVED, null, comment,
+                    author);
+
+            session.save();
+
+        } catch (Throwable e) {
+            log.error("failed to delete comment", e);
+            throw new ClientException("failed to delete comment", e);
+        } finally {
+            closeCoreSession(loginContext, session);
+        }
+    }
+
+    public DocumentModel createQuote(DocumentModel docModel,
+            DocumentModel parent, DocumentModel child) throws ClientException {
+        LoginContext loginContext = null;
+        CoreSession session = null;
+        try {
+            loginContext = Framework.login();
+            session = openCoreSession(docModel.getRepositoryName());
+
+            String author = updateAuthor(docModel, child);
+            DocumentModel parentDocModel = session.getDocument(parent.getRef());
+            DocumentModel newComment = internalCreateQuote(session, parentDocModel,
+                    child, null);
+
+            UserManager userManager = Framework.getService(UserManager.class);
+            NuxeoPrincipal principal = userManager.getPrincipal(author);
+            notifyEvent(session, docModel, QuoteEvents.COMMENT_ADDED, parent,
+                    newComment, principal);
+
+            session.save();
+            return newComment;
+
+        } catch (Exception e) {
+            throw new ClientException(e);
+        } finally {
+            closeCoreSession(loginContext, session);
+        }
+    }
+
+    private static NuxeoPrincipal getAuthor(DocumentModel docModel) {
+        try {
+            String[] contributors = (String[]) docModel.getProperty(
+                    "dublincore", "contributors");
+            UserManager userManager = Framework.getService(UserManager.class);
+            return userManager.getPrincipal(contributors[0]);
+        } catch (Exception e) {
+            log.error("Error building principal for comment author", e);
+            return null;
+        }
+    }
+
+    public List<DocumentModel> getQuotes(DocumentModel docModel,
+            DocumentModel parent) throws ClientException {
+        try {
+            //loginContext = Framework.login();
+            //session = openCoreSession(docModel.getRepositoryName());
+            //DocumentModel parentDocModel = session.getDocument(parent.getRef());
+            return getQuotes(parent);
+        } catch (Exception e) {
+            throw new ClientException(e);
+        }
+    }
+
+    public List<DocumentModel> getDocumentsForQuote(DocumentModel comment)
+            throws ClientException {
+        RelationManager relationManager;
+        Map<String, Serializable> ctxMap = new HashMap<String, Serializable>();
+        ctxMap.put(ResourceAdapter.CORE_SESSION_ID_CONTEXT_KEY, comment.getSessionId());
+        try {
+            relationManager = getRelationManager();
+        } catch (Exception e) {
+            throw new ClientException(e);
+        }
+        Resource commentResource = relationManager.getResource(
+                config.commentNamespace, comment, ctxMap);
+        if (commentResource == null) {
+            throw new ClientException(
+                    "Could not adapt document model to relation resource ; "
+                            + "check the service relation adapters configuration");
+        }
+        Resource predicate = new ResourceImpl(config.predicateNamespace);
+        Statement pattern = new StatementImpl(commentResource, predicate, null);
+
+        List<Statement> statementList = relationManager.getStatements(
+                config.graphName, pattern);
+        // XXX AT: BBB for when repository name was not included in the resource
+        // uri
+        Resource oldDocResource = new QNameResourceImpl(
+                config.commentNamespace, comment.getId());
+        Statement oldPattern = new StatementImpl(oldDocResource, predicate, null);
+        statementList.addAll(relationManager.getStatements(config.graphName,
+                oldPattern));
+
+        List<DocumentModel> docList = new ArrayList<DocumentModel>();
+        for (Statement stmt : statementList) {
+            QNameResourceImpl subject = (QNameResourceImpl) stmt.getObject();
+            DocumentModel docModel = null;
+            try {
+                docModel = (DocumentModel) relationManager.getResourceRepresentation(
+                        config.documentNamespace, subject, ctxMap);
+            } catch (Exception e) {
+                log.error("failed to retrieve documents from relations");
+            }
+            if (docModel == null) {
+                log.warn("Could not adapt comment relation subject to a document "
+                        + "model; check the service relation adapters configuration");
+                continue;
+            }
+            docList.add(docModel);
+        }
+        return docList;
+
+    }
+    public DocumentModel createLocatedQuote(DocumentModel docModel,
+            DocumentModel comment, String path) throws ClientException {
+        LoginContext loginContext = null;
+        CoreSession session = null;
+        DocumentModel createdComment;
+        try {
+            loginContext = Framework.login();
+            session = openCoreSession(docModel.getRepositoryName());
+            createdComment = internalCreateQuote(session, docModel, comment, path);
+            session.save();
+        } catch (Exception e) {
+            throw new ClientException(e);
+        } finally {
+            closeCoreSession(loginContext, session);
+        }
+
+        return createdComment;
+    }
+
+}
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteSorter.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteSorter.java
new file mode 100644 (file)
index 0000000..acfb653
--- /dev/null
@@ -0,0 +1,50 @@
+package org.collectionspace.ecm.platform.quote.impl;
+
+import java.util.Calendar;
+
+import org.nuxeo.ecm.core.api.DocumentModel;
+import org.nuxeo.ecm.core.api.Sorter;
+
+public class QuoteSorter implements Sorter {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+
+    private boolean asc = true;
+
+    public QuoteSorter(boolean asc) {
+        this.asc = asc;
+    }
+
+    public int compare(DocumentModel doc1, DocumentModel doc2) {
+
+         if (doc1 == null && doc2 == null) {
+             return 0;
+         } else if (doc1 == null) {
+             return asc ? -1 : 1;
+         } else if (doc2 == null) {
+             return asc ? 1 : -1;
+         }
+
+        int cmp=0;
+        try {
+            Calendar created1 = doc1.getProperty("dc:created").getValue(Calendar.class);
+            Calendar created2 = doc2.getProperty("dc:created").getValue(Calendar.class);
+
+            if (created1 == null && created2 == null) {
+                return 0;
+            } else if (created1 == null) {
+                return asc ? -1 : 1;
+            } else if (created2 == null) {
+                return asc ? 1 : -1;
+            }
+            cmp = created1.compareTo(created2);
+        }
+        catch (Exception e) {
+        }
+        return asc ? cmp : -cmp;
+    }
+
+}
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/listener/AbstractQuoteListener.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/listener/AbstractQuoteListener.java
new file mode 100644 (file)
index 0000000..32e056c
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * (C) Copyright 2006-2009 Nuxeo SAS (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     Nuxeo - initial API and implementation
+ *
+ * $Id$
+ */
+
+package org.collectionspace.ecm.platform.quote.listener;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuxeo.ecm.core.api.CoreSession;
+import org.nuxeo.ecm.core.api.DocumentModel;
+import org.nuxeo.ecm.core.api.event.DocumentEventTypes;
+import org.nuxeo.ecm.core.event.Event;
+import org.nuxeo.ecm.core.event.EventBundle;
+import org.nuxeo.ecm.core.event.EventContext;
+import org.nuxeo.ecm.core.event.impl.DocumentEventContext;
+import org.nuxeo.ecm.platform.relations.api.RelationManager;
+import org.nuxeo.runtime.api.Framework;
+
+import org.collectionspace.ecm.platform.quote.service.QuoteServiceConfig;
+import org.collectionspace.ecm.platform.quote.service.QuoteServiceHelper;
+
+public abstract class AbstractQuoteListener {
+
+     private static final Log log = LogFactory.getLog(AbstractQuoteListener.class);
+
+        public void handleEvent(EventBundle events) {
+            for (Event event : events) {
+                handleEvent(event);
+            }
+        }
+
+        public void handleEvent(Event event) {
+            if (DocumentEventTypes.DOCUMENT_REMOVED.equals(event.getName())) {
+                EventContext ctx = event.getContext();
+                if (ctx instanceof DocumentEventContext) {
+                    DocumentEventContext docCtx = (DocumentEventContext) ctx;
+                    DocumentModel doc = docCtx.getSourceDocument();
+                    CoreSession coreSession = docCtx.getCoreSession();
+                    QuoteServiceConfig config = QuoteServiceHelper.getQuoteService().getConfig();
+                    try {
+                        RelationManager relationManager = Framework.getService(RelationManager.class);
+                        doProcess(coreSession, relationManager, config, doc);
+                    }
+                    catch (Exception e) {
+                        log.error("Error during message processing", e);
+                    }
+                    return;
+                }
+            }
+        }
+
+        protected abstract void doProcess(CoreSession coreSession,
+            RelationManager relationManager, QuoteServiceConfig config,
+            DocumentModel docMessage) throws Exception;
+
+}
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/listener/DocumentRemovedQuoteEventListener.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/listener/DocumentRemovedQuoteEventListener.java
new file mode 100644 (file)
index 0000000..a7977bd
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * (C) Copyright 2006-2009 Nuxeo SAS (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     Nuxeo - initial API and implementation
+ *
+ * $Id$
+ */
+
+package org.collectionspace.ecm.platform.quote.listener;
+
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuxeo.ecm.core.api.ClientException;
+import org.nuxeo.ecm.core.api.CoreSession;
+import org.nuxeo.ecm.core.api.DocumentModel;
+import org.nuxeo.ecm.core.event.PostCommitEventListener;
+import org.collectionspace.ecm.platform.quote.service.QuoteServiceConfig;
+import org.nuxeo.ecm.platform.relations.api.QNameResource;
+import org.nuxeo.ecm.platform.relations.api.RelationManager;
+import org.nuxeo.ecm.platform.relations.api.Resource;
+import org.nuxeo.ecm.platform.relations.api.Statement;
+import org.nuxeo.ecm.platform.relations.api.impl.StatementImpl;
+
+public class DocumentRemovedQuoteEventListener extends
+        AbstractQuoteListener implements PostCommitEventListener {
+
+    private static final Log log = LogFactory.getLog(DocumentRemovedQuoteEventListener.class);
+
+    @Override
+    protected void doProcess(CoreSession coreSession,
+            RelationManager relationManager, QuoteServiceConfig config,
+            DocumentModel docMessage) throws Exception {
+        log.debug("Processing relations cleanup on Document removal");
+        onDocumentRemoved(coreSession, relationManager, config, docMessage);
+    }
+
+    private static void onDocumentRemoved(CoreSession coreSession,
+            RelationManager relationManager, QuoteServiceConfig config,
+            DocumentModel docMessage) throws ClientException {
+
+        Resource documentRes = relationManager.getResource(
+                config.documentNamespace, docMessage, null);
+        if (documentRes == null) {
+            log.error("Could not adapt document model to relation resource ; "
+                    + "check the service relation adapters configuration");
+            return;
+        }
+        Statement pattern = new StatementImpl(null, null, documentRes);
+        List<Statement> statementList = relationManager.getStatements(
+                config.graphName, pattern);
+
+        // remove comments
+        for (Statement stmt : statementList) {
+            QNameResource resource = (QNameResource) stmt.getSubject();
+            String commentId = resource.getLocalName();
+            DocumentModel docModel = (DocumentModel) relationManager.getResourceRepresentation(
+                    config.commentNamespace, resource, null);
+
+            if (docModel != null) {
+                try {
+                    coreSession.removeDocument(docModel.getRef());
+                    log.debug("quote removal succeded for id: " + commentId);
+                } catch (Exception e) {
+                    log.error("quote removal failed", e);
+                }
+            } else {
+                log.warn("quote/comment not found: id=" + commentId);
+            }
+        }
+        coreSession.save();
+        // remove relations
+        relationManager.remove(config.graphName, statementList);
+    }
+
+}
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/listener/QuoteRemovedEventListener.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/listener/QuoteRemovedEventListener.java
new file mode 100644 (file)
index 0000000..171acde
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+ * (C) Copyright 2006-2009 Nuxeo SAS (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     Nuxeo - initial API and implementation
+ *
+ * $Id$
+ */
+
+package org.collectionspace.ecm.platform.quote.listener;
+
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuxeo.ecm.core.api.ClientException;
+import org.nuxeo.ecm.core.api.CoreSession;
+import org.nuxeo.ecm.core.api.DocumentModel;
+import org.nuxeo.ecm.core.event.EventListener;
+import org.nuxeo.ecm.platform.relations.api.RelationManager;
+import org.nuxeo.ecm.platform.relations.api.Resource;
+import org.nuxeo.ecm.platform.relations.api.Statement;
+import org.nuxeo.ecm.platform.relations.api.impl.StatementImpl;
+
+import org.collectionspace.ecm.platform.quote.service.QuoteServiceConfig;
+
+public class QuoteRemovedEventListener extends AbstractQuoteListener
+        implements EventListener {
+
+    private static final Log log = LogFactory.getLog(QuoteRemovedEventListener.class);
+
+    @Override
+    protected void doProcess(CoreSession coreSession,
+            RelationManager relationManager, QuoteServiceConfig config,
+            DocumentModel docMessage) throws Exception {
+        log.debug("Processing relations cleanup on Comment removal");
+        String typeName = docMessage.getType();
+        if ("Comment".equals(typeName) || "Post".equals(typeName)) {
+            onQuoteRemoved(relationManager, config, docMessage);
+        }
+    }
+
+    private static void onQuoteRemoved(RelationManager relationManager,
+            QuoteServiceConfig config, DocumentModel docModel)
+            throws ClientException {
+        Resource quoteRes = relationManager.getResource(
+                config.commentNamespace, docModel, null);
+        if (quoteRes == null) {
+            log.warn("Could not adapt document model to relation resource; "
+                    + "check the service relation adapters configuration");
+            return;
+        }
+        Statement pattern = new StatementImpl(quoteRes, null, null);
+        List<Statement> statementList = relationManager.getStatements(
+                config.graphName, pattern);
+        relationManager.remove(config.graphName, statementList);
+    }
+
+}
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/service/QuoteService.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/service/QuoteService.java
new file mode 100644 (file)
index 0000000..4030da1
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     Nuxeo - initial API and implementation
+ *
+ * $Id$
+ */
+
+package org.collectionspace.ecm.platform.quote.service;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.nuxeo.runtime.model.ComponentInstance;
+import org.nuxeo.runtime.model.DefaultComponent;
+
+import org.collectionspace.ecm.platform.quote.api.QuoteManager;
+import org.collectionspace.ecm.platform.quote.impl.QuoteManagerImpl;
+
+/**
+ * @author <a href="mailto:glefter@nuxeo.com">George Lefter</a>
+ *
+ */
+public class QuoteService extends DefaultComponent {
+
+    public static final String ID = "org.collectionspace.ecm.platform.quote.service.QuoteService";
+
+    public static final String VERSIONING_EXTENSION_POINT_RULES = "rules";
+
+    private static final Log log = LogFactory.getLog(QuoteService.class);
+
+    private QuoteManager quoteManager;
+
+    private QuoteServiceConfig config;
+
+    @Override
+    public void registerContribution(Object contribution,
+            String extensionPoint, ComponentInstance contributor) {
+        if ("config".equals(extensionPoint)) {
+            config = (QuoteServiceConfig) contribution;
+            log.debug("registered service config: " + config);
+        } else {
+            log.warn("unknown extension point: " + extensionPoint);
+        }
+    }
+
+    @Override
+    public void unregisterContribution(Object contribution,
+            String extensionPoint, ComponentInstance contributor) {
+        // do nothing
+    }
+
+    public QuoteManager getQuoteManager() {
+        log.debug("getQuoteManager");
+        if (quoteManager == null) {
+            quoteManager = new QuoteManagerImpl(config);
+        }
+        return quoteManager;
+    }
+
+    public QuoteServiceConfig getConfig() {
+        return config;
+    }
+
+    @Override
+    public <T> T getAdapter(Class<T> adapter) {
+        if (adapter == QuoteManager.class) {
+            return adapter.cast(getQuoteManager());
+        }
+        return null;
+    }
+
+}
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/service/QuoteServiceConfig.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/service/QuoteServiceConfig.java
new file mode 100644 (file)
index 0000000..3ce7bdc
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     Nuxeo - initial API and implementation
+ *
+ * $Id$
+ */
+
+package org.collectionspace.ecm.platform.quote.service;
+
+import org.nuxeo.common.xmap.annotation.XNode;
+import org.nuxeo.common.xmap.annotation.XObject;
+import org.collectionspace.ecm.platform.quote.api.QuoteConverter;
+
+/**
+ * @author <a href="mailto:glefter@nuxeo.com">George Lefter</a>
+ *
+ */
+@XObject("config")
+public class QuoteServiceConfig {
+
+    // These instance variables are accessed directly from other classes in
+    // other packages.
+
+    @XNode("converterClass")
+    // public Class commentConverterClass;
+    public String quoteConverterClassName;
+
+    @XNode("graphName")
+    public String graphName;
+
+    @XNode("commentNamespace")
+    public String commentNamespace;
+
+    @XNode("predicateNamespace")
+    public String predicateNamespace;
+
+    @XNode("documentNamespace")
+    public String documentNamespace;
+
+    public QuoteConverter getQuoteConverter() {
+        try {
+            Class quoteConverterClass = Class.forName(quoteConverterClassName);
+            return (QuoteConverter) quoteConverterClass.newInstance();
+        } catch (Exception e) {
+               e.printStackTrace();
+            throw new RuntimeException("Failed to create quote/comment converter", e);
+        }
+    }
+
+}
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/service/QuoteServiceHelper.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/service/QuoteServiceHelper.java
new file mode 100644 (file)
index 0000000..6bd3d94
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     Nuxeo - initial API and implementation
+ *
+ * $Id$
+ */
+
+package org.collectionspace.ecm.platform.quote.service;
+
+import org.nuxeo.runtime.api.Framework;
+
+/**
+ * @author <a href="mailto:glefter@nuxeo.com">George Lefter</a>
+ *
+ */
+public final class QuoteServiceHelper {
+
+    // This is a utility class.
+    private QuoteServiceHelper() {}
+
+    public static QuoteService getQuoteService() {
+        return (QuoteService) Framework.getRuntime().getComponent(
+                QuoteService.ID);
+    }
+
+}
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/META-INF/MANIFEST.MF b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..e5f4795
--- /dev/null
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 1
+Bundle-Name: CSpace Nuxeo Quote project
+Bundle-SymbolicName: org.collectionspace.ecm.platform.quote;singleton=true
+Bundle-Vendor: Nuxeo
+Bundle-Category: web,stateful
+Nuxeo-Component: OSGI-INF/QuoteService.xml,
+  OSGI-INF/quote-platform-contrib.xml,
+  OSGI-INF/QuoteService.xml,
+  OSGI-INF/quote-listener-contrib.xml
+Eclipse-LazyStart: true
+Require-Bundle: org.nuxeo.ecm.core.event, 
+ org.nuxeo.ecm.relations.api,
+ org.collectionspace.ecm.platform.quote.api
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/QuoteService.xml b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/QuoteService.xml
new file mode 100644 (file)
index 0000000..9521ea2
--- /dev/null
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<component name="org.collectionspace.ecm.platform.quote.service.QuoteService">
+  <documentation>
+    This component gives the user the possibility to add quotes to documents.
+  </documentation>
+
+  <implementation class="org.collectionspace.ecm.platform.quote.service.QuoteService"/>
+
+  <service>
+    <provide interface="org.collectionspace.ecm.platform.quote.api.QuoteManager"/>
+  </service>
+
+  <extension-point name="config">
+    <documentation>
+      This extension can be used to configure the Quote Service
+    </documentation>
+    <object class="org.collectionspace.ecm.platform.quote.service.QuoteServiceConfig"/>
+  </extension-point>
+  
+  
+  <extension target="org.collectionspace.ecm.platform.quote.service.QuoteService"
+    point="config">
+    <config>
+      <converterClass>
+        org.collectionspace.ecm.platform.quote.impl.QuoteConverterImpl
+      </converterClass>
+      <graphName>documentComments</graphName>
+      <!-- XXX AT: these namespaces should have an ending slash -->
+      <commentNamespace>http://www.nuxeo.org/comments/uid</commentNamespace>
+      <documentNamespace>http://www.nuxeo.org/document/uid</documentNamespace>
+      <predicateNamespace>
+        http://www.nuxeo.org/predicates/isCommentFor
+      </predicateNamespace>
+    </config>
+  </extension>  
+
+</component>
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/deployment-fragment.xml b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/deployment-fragment.xml
new file mode 100644 (file)
index 0000000..865552b
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<fragment>
+
+  <extension target="application#MODULE">
+    <module>
+      <java>${bundle.fileName}</java>
+    </module>
+  </extension>
+
+</fragment>
+
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/quote-listener-contrib.xml b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/quote-listener-contrib.xml
new file mode 100644 (file)
index 0000000..a902bdd
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<component name="org.collectionspace.ecm.platform.quote.service.listener" version="1.0">
+  <extension target="org.nuxeo.ecm.core.event.EventServiceComponent" point="listener">
+
+    <listener name="quoteListener" async="false" postCommit="true" class="org.collectionspace.ecm.platform.quote.listener.QuoteRemovedEventListener">
+    </listener>
+
+    <listener name="docRemovedQuoteListener" async="true" postCommit="true" class="org.collectionspace.ecm.platform.quote.listener.DocumentRemovedQuoteEventListener">
+    </listener>
+
+  </extension>
+</component>
\ No newline at end of file
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/quote-platform-contrib.xml b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/quote-platform-contrib.xml
new file mode 100644 (file)
index 0000000..8689b85
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component
+    name="org.collectionspace.ecm.platform.quote.service.binding.contrib">
+
+  <require>org.collectionspace.ecm.platform.quote.service.QuoteService</require>
+
+  <extension target="org.nuxeo.runtime.api.ServiceManagement"
+      point="services">
+    <documentation>Define the Quote bean as a platform service.</documentation>
+    <service class="org.collectionspace.ecm.platform.quote.api.QuoteManager" group="platform/quotes">
+      <locator>%QuoteManagerBean</locator>
+    </service>
+
+    <service class="org.collectionspace.ecm.platform.quote.workflow.services.QuotesModerationService" group="platform/quotes">
+      <locator>%QuotesModerationBean</locator>
+    </service>
+  </extension>
+
+</component>
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/test/java/org/nuxeo/ecm/platform/comment/listener/test/SimpleListenerTest.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/test/java/org/nuxeo/ecm/platform/comment/listener/test/SimpleListenerTest.java
new file mode 100644 (file)
index 0000000..57796aa
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * (C) Copyright 2006-2009 Nuxeo SAS (http://nuxeo.com/) and contributors.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the GNU Lesser General Public License
+ * (LGPL) version 2.1 which accompanies this distribution, and is available at
+ * http://www.gnu.org/licenses/lgpl.html
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * Contributors:
+ *     Nuxeo - initial API and implementation
+ *
+ * $Id$
+ */
+
+package org.nuxeo.ecm.platform.comment.listener.test;
+
+import java.util.List;
+
+import org.nuxeo.ecm.core.api.DocumentModel;
+import org.nuxeo.ecm.core.event.EventService;
+import org.nuxeo.ecm.core.event.jms.AsyncProcessorConfig;
+import org.nuxeo.ecm.core.repository.jcr.testing.RepositoryOSGITestCase;
+import org.nuxeo.ecm.platform.relations.api.RelationManager;
+import org.nuxeo.ecm.platform.relations.api.Statement;
+import org.nuxeo.runtime.api.Framework;
+
+import org.collectionspace.ecm.platform.quote.api.QuoteableDocument;
+import org.collectionspace.ecm.platform.quote.service.QuoteService;
+import org.collectionspace.ecm.platform.quote.service.QuoteServiceHelper;
+
+public class SimpleListenerTest extends RepositoryOSGITestCase {
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        deployBundle("org.nuxeo.ecm.relations.api");
+        deployBundle("org.nuxeo.ecm.relations");
+        deployBundle("org.nuxeo.ecm.relations.jena");
+        //
+        // CollectionSpace
+        //
+        deployBundle("org.collectionspace.ecm.platform.quote.api");
+        // deployBundle("org.nuxeo.ecm.platform.comment");
+        deployBundle("org.nuxeo.ecm.platform.comment.core");
+
+        deployContrib("org.collectionspace.ecm.platform.quote",
+                "OSGI-INF/QuoteService.xml");
+        deployContrib("org.collectionspace.ecm.platform.quote",
+                "OSGI-INF/quote-listener-contrib.xml");
+        deployContrib("org.collectionspace.ecm.platform.quote.tests",
+                "OSGI-INF/quote-jena-contrib.xml");
+
+        openRepository();
+    }
+
+    protected int getCommentGrahNodesNumber() throws Exception {
+        RelationManager rm = Framework.getService(RelationManager.class);
+
+        List<Statement> statementList = rm.getStatements("documentComments");
+        return statementList.size();
+    }
+
+    protected DocumentModel doCreateADocWithComments() throws Exception {
+
+        DocumentModel domain = getCoreSession().createDocumentModel("Folder");
+        domain.setProperty("dublincore", "title", "Domain");
+        domain.setPathInfo("/", "domain");
+        domain = getCoreSession().createDocument(domain);
+
+        DocumentModel doc = getCoreSession().createDocumentModel("File");
+
+        doc.setProperty("dublincore", "title", "MonTitre");
+        doc.setPathInfo("/domain/", "TestFile");
+
+        doc = getCoreSession().createDocument(doc);
+        getCoreSession().save();
+        AsyncProcessorConfig.setForceJMSUsage(false);
+
+        // Create a first commentary
+        QuoteableDocument cDoc = doc.getAdapter(QuoteableDocument.class);
+        DocumentModel comment = getCoreSession().createDocumentModel("Comment");
+        comment.setProperty("comment", "text", "This is my comment");
+        comment = cDoc.addQuote(comment);
+
+        // Create a second commentary
+        DocumentModel comment2 = getCoreSession().createDocumentModel("Comment");
+        comment2.setProperty("comment", "text", "This is another  comment");
+        comment2 = cDoc.addQuote(comment);
+        return doc;
+    }
+
+    protected void waitForAsyncExec() {
+        Framework.getLocalService(EventService.class).waitForAsyncCompletion();
+    }
+
+    /*
+     * Disabled until we have time to fix this test.
+    public void testDocumentRemovedCommentEventListener() throws Exception {
+        DocumentModel doc = doCreateADocWithComments();
+        assertNotNull(doc);
+
+        int nbLinks = getCommentGrahNodesNumber();
+        assertTrue(nbLinks > 0);
+
+        // Suppression the documents
+        getCoreSession().removeDocument(doc.getRef());
+        getCoreSession().save();
+
+        // wait for the listener to be called
+        waitForAsyncExec();
+
+        // Did all the relations have been deleted?
+        nbLinks = getCommentGrahNodesNumber();
+        assertEquals(0, nbLinks);
+    }
+     */
+    
+    /*
+     * Disabled until we have time to fix this test.
+    public void testCommentRemovedEventListener() throws Exception {
+        DocumentModel doc = doCreateADocWithComments();
+        assertNotNull(doc);
+
+        int nbLinks = getCommentGrahNodesNumber();
+        assertEquals(2, nbLinks);
+
+        // Get the comments
+        QuoteService commentService = QuoteServiceHelper.getQuoteService();
+        List<DocumentModel> comments = commentService.getQuoteManager().getQuotes(
+                doc);
+
+        // Delete the first comment
+        getCoreSession().removeDocument(comments.get(0).getRef());
+        // Check that the first relation has been deleted
+        nbLinks = getCommentGrahNodesNumber();
+        assertEquals(1, nbLinks);
+
+        // Delete the second comment
+        getCoreSession().removeDocument(comments.get(1).getRef());
+        // Check that the second relation has been deleted
+        nbLinks = getCommentGrahNodesNumber();
+        assertEquals(0, nbLinks);
+    }
+    */
+    
+    public void testDoNothing() {
+       // Do nothing
+    }
+}
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/test/resources/META-INF/MANIFEST.MF b/3rdparty/nuxeo/nuxeo-platform-quote/src/test/resources/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..dbdfdf8
--- /dev/null
@@ -0,0 +1,5 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 1
+Bundle-Name: Nuxeo Quote project
+Bundle-SymbolicName: org.collectionspace.ecm.platform.quote.tests;singleton=true
+Bundle-Vendor: Nuxeo
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/test/resources/OSGI-INF/quote-jena-contrib.xml b/3rdparty/nuxeo/nuxeo-platform-quote/src/test/resources/OSGI-INF/quote-jena-contrib.xml
new file mode 100644 (file)
index 0000000..ebc7f03
--- /dev/null
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<component name="test.quote.contribs">
+
+  <extension target="org.collectionspace.ecm.platform.quote.service.QuoteService"
+      point="config">
+    <config>
+      <converterClass>
+        org.collectionspace.ecm.platform.quote.impl.QuoteConverterImpl
+      </converterClass>
+      <graphName>documentComments</graphName>
+      <!-- XXX AT: these namespaces should have an ending slash -->
+      <commentNamespace>http://www.nuxeo.org/comments/uid</commentNamespace>
+      <documentNamespace>http://www.nuxeo.org/document/uid</documentNamespace>
+      <predicateNamespace>
+        http://www.nuxeo.org/predicates/isCommentFor
+      </predicateNamespace>
+    </config>
+  </extension>
+
+  <!-- relation adapters -->
+  <extension target="org.nuxeo.ecm.platform.relations.services.RelationService"
+      point="resourceadapters">
+    <!-- XXX AT: this namespace should have an ending slash -->
+    <adapter namespace="http://www.nuxeo.org/comments/uid"
+        class="org.nuxeo.ecm.platform.relations.adapters.DocumentModelResourceAdapter"/>
+    <!-- XXX AT: this namespace should have an ending slash so that it can be
+        the standard adapter already registered -->
+    <adapter namespace="http://www.nuxeo.org/document/uid"
+        class="org.nuxeo.ecm.platform.relations.adapters.DocumentModelResourceAdapter"/>
+  </extension>
+
+  <!-- relation graph -->
+  <extension target="org.nuxeo.ecm.platform.relations.services.RelationService"
+      point="graphs">
+    <graph name="documentComments" type="jena">
+      <namespaces>
+        <namespace name="comment">http://www.nuxeo.org/comments/uid</namespace>
+        <namespace name="isCommentFor">
+          http://www.nuxeo.org/predicates/isCommentFor
+        </namespace>
+        <namespace name="document">http://www.nuxeo.org/document/uid</namespace>
+      </namespaces>
+    </graph>
+  </extension>
+
+</component>
diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/test/resources/log4j.properties b/3rdparty/nuxeo/nuxeo-platform-quote/src/test/resources/log4j.properties
new file mode 100644 (file)
index 0000000..bcd2a4c
--- /dev/null
@@ -0,0 +1,4 @@
+log4j.rootLogger=WARN, CONSOLE
+log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
+log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
+log4j.appender.CONSOLE.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%C{1}] %m%n
index ac5ae688c5875259f12012d836d467a331f9aa8c..2794ee7fae00653f5b186a45e77cbc1b412443e4 100644 (file)
@@ -15,6 +15,8 @@
 \r
     <modules>\r
         <module>nuxeo-platform-collectionspace</module>\r
+               <module>nuxeo-platform-quote-api</module>\r
+               <module>nuxeo-platform-quote</module>\r
     </modules>\r
 \r
     <dependencies>\r
diff --git a/pom.xml b/pom.xml
index c0bcec3feabb83f8472c10f5bdec1012fbf84905..5487836f8d6bef72ff057956917e5bbe41ed3025 100644 (file)
--- a/pom.xml
+++ b/pom.xml
                 <artifactId>slf4j-log4j12</artifactId>\r
                 <version>1.5.8</version>\r
             </dependency>\r
+      <dependency>\r
+        <groupId>javax.ejb</groupId>\r
+        <artifactId>ejb</artifactId>\r
+        <version>${jboss.ejb.version}</version>\r
+        <scope>provided</scope>\r
+      </dependency>\r
+      <dependency>\r
+        <groupId>javax.annotation</groupId>\r
+        <artifactId>jsr250-api</artifactId>\r
+        <version>1.0</version>\r
+        <scope>provided</scope>\r
+      </dependency>\r
+      <dependency>\r
+        <groupId>javax.jms</groupId>\r
+        <artifactId>jms</artifactId>\r
+        <version>1.1</version>\r
+        <scope>provided</scope>\r
+      </dependency>\r
+      <dependency>\r
+        <groupId>javax.transaction</groupId>\r
+        <artifactId>jta</artifactId>\r
+        <version>1.1</version>\r
+        <scope>provided</scope>\r
+      </dependency>\r
+      <dependency>\r
+        <groupId>jboss</groupId>\r
+        <artifactId>jboss-annotations-ejb3</artifactId>\r
+        <version>3.0-RC8</version>\r
+        <scope>provided</scope>\r
+      </dependency>\r
+      <dependency>\r
+        <groupId>jboss</groupId>\r
+        <artifactId>jboss-j2ee</artifactId>\r
+        <version>${jboss.version}</version>\r
+        <scope>provided</scope>\r
+      </dependency>\r
+      <dependency>\r
+        <groupId>javax.ejb</groupId>\r
+        <artifactId>ejb-api</artifactId>\r
+        <version>3.0</version>\r
+        <scope>provided</scope>\r
+      </dependency>\r
 <!--            <dependency>\r
                 <groupId>net.java.dev.jaxb2-commons</groupId>\r
                 <artifactId>jaxb-fluent-api</artifactId>\r
index 046988541367fd64d33e579a0fffd089df36a9b2..d7501e2c414b1a2ce2d6897a7845b083f8d5a48f 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <classpath>\r
-       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>\r
        <classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>\r
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>\r
        <classpathentry kind="output" path="target/classes"/>\r
 </classpath>\r
index 2c033e38755c260dabcc6990da799aa0221aaf97..5526c7561c57bb5b22b5f9c181c245967b93ceed 100644 (file)
@@ -1,14 +1,13 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-
-    <parent>
-        <groupId>org.collectionspace.services</groupId>
-        <artifactId>org.collectionspace.services.blob.3rdparty</artifactId>
-        <version>1.1-SNAPSHOT</version>
-    </parent>
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.collectionspace.services</groupId>
+               <artifactId>org.collectionspace.services.blob.3rdparty</artifactId>
+               <version>1.1-SNAPSHOT</version>
+       </parent>
     
-    <modelVersion>4.0.0</modelVersion>
     <groupId>org.collectionspace.services</groupId>
     <artifactId>org.collectionspace.services.blob.3rdparty.nuxeo</artifactId>
     <name>services.blob.3rdparty.nuxeo</name>
index 48325b21ce0bb8260d87103a28b1bac177801c2f..64b3e3367f252484f50afccb29b45e2d5b6ba9bb 100644 (file)
     <dependencies>\r
 \r
         <!-- CollectionSpace dependencies -->\r
+        <dependency>\r
+                       <groupId>org.collectionspace.services</groupId>\r
+                       <artifactId>org.collectionspace.services.3rdparty.nuxeo.quote-api</artifactId>        \r
+            <version>${project.version}</version>\r
+        </dependency>\r
         <dependency>\r
             <groupId>org.collectionspace.services</groupId>\r
             <artifactId>org.collectionspace.services.jaxb</artifactId>\r
            <dependency>\r
              <groupId>org.nuxeo.ecm.platform</groupId>\r
              <artifactId>nuxeo-platform-filemanager-api</artifactId>\r
-             <version>${nuxeo.platform.version}</version>\r
+                 <version>${nuxeo.platform.version}</version>        \r
            </dependency>\r
         <dependency>\r
             <groupId>org.nuxeo.common</groupId>\r
index 38e35d17079c463610f90cc9b23099c346534674..d7ba33682666581e47bbc432affdd07b585c6fd1 100644 (file)
@@ -116,6 +116,8 @@ import org.collectionspace.services.blob.BlobsCommonList;
 import org.collectionspace.services.blob.BlobsCommonList.BlobListItem;\r
 import org.collectionspace.services.common.blob.BlobOutput;\r
 \r
+import org.collectionspace.ecm.platform.quote.api.QuoteManager;\r
+\r
 // TODO: Auto-generated Javadoc\r
 /**\r
  * The Class NuxeoImageUtils.\r
@@ -208,6 +210,17 @@ public class NuxeoImageUtils {
                IdRef documentRef = new IdRef(repositoryId);\r
                DocumentModel documentModel = repoSession.getDocument(documentRef);             \r
                DocumentBlobHolder docBlobHolder = (DocumentBlobHolder)documentModel.getAdapter(BlobHolder.class);\r
+               //\r
+               //\r
+               try {\r
+                       QuoteManager quoteManager = (QuoteManager)Framework.getService(QuoteManager.class);\r
+                       quoteManager.createQuote(documentModel, "Quoted - Comment" + System.currentTimeMillis(),\r
+                                       "Administrator");\r
+               } catch (Exception e) {\r
+                       e.printStackTrace();\r
+               }\r
+               //\r
+               //\r
                List<Blob> docBlobs = docBlobHolder.getBlobs();         \r
                List<BlobListItem> blobListItems = result.getBlobListItem();\r
                BlobListItem blobListItem = null;\r
index ad8e1db42c7fdbfeba7a0c2f6155f57892516f8e..c04fb9370475214d32c3f1d3811f998f7c890c33 100644 (file)
                 <artifactId>jaxb-impl</artifactId>
                 <version>2.1.9</version>
             </dependency>
-            <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>slf4j-api</artifactId>
-                <version>1.5.2</version>
-            </dependency>
-            <dependency>
-                <groupId>org.slf4j</groupId>
-                <artifactId>slf4j-log4j12</artifactId>
-                <version>1.5.2</version>
-            </dependency>
             <dependency>
                 <groupId>javax.persistence</groupId>
                 <artifactId>persistence-api</artifactId>