</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
--- /dev/null
+<?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
--- /dev/null
+<?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
--- /dev/null
+#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
--- /dev/null
+<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>
--- /dev/null
+<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
--- /dev/null
+/*
+ * (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() {
+ }
+
+}
--- /dev/null
+/*
+ * (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();
+
+}
--- /dev/null
+/*
+ * (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() {
+ }
+
+}
--- /dev/null
+/*
+ * (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;
+
+}
--- /dev/null
+/*
+ * (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;
+
+}
--- /dev/null
+/*
+ * (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;
+ }
+ }
+
+}
--- /dev/null
+/*
+ * (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);
+ }
+
+}
--- /dev/null
+/*
+ * (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;
+
+}
--- /dev/null
+/*
+ * (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";
+}
--- /dev/null
+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
--- /dev/null
+<?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>
--- /dev/null
+<?xml version="1.0"?>
+<fragment>
+
+ <extension target="application#MODULE">
+ <module>
+ <java>${bundle.fileName}</java>
+ </module>
+ </extension>
+
+</fragment>
+
--- /dev/null
+<?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
--- /dev/null
+<?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
--- /dev/null
+#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
--- /dev/null
+ 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
--- /dev/null
+<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>
--- /dev/null
+<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
--- /dev/null
+/*
+ * (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);
+ }
+ }
+
+}
--- /dev/null
+/*
+ * (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 {
+
+}
--- /dev/null
+/*
+ * (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);
+
+ }
+
+}
--- /dev/null
+/*
+ * (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());*/
+ }
+
+}
--- /dev/null
+/*
+ * (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;
+ }
+
+}
--- /dev/null
+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;
+ }
+
+}
--- /dev/null
+/*
+ * (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;
+
+}
--- /dev/null
+/*
+ * (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);
+ }
+
+}
--- /dev/null
+/*
+ * (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);
+ }
+
+}
--- /dev/null
+/*
+ * (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;
+ }
+
+}
--- /dev/null
+/*
+ * (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);
+ }
+ }
+
+}
--- /dev/null
+/*
+ * (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);
+ }
+
+}
--- /dev/null
+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
--- /dev/null
+<?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>
--- /dev/null
+<?xml version="1.0"?>
+<fragment>
+
+ <extension target="application#MODULE">
+ <module>
+ <java>${bundle.fileName}</java>
+ </module>
+ </extension>
+
+</fragment>
+
--- /dev/null
+<?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
--- /dev/null
+<?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>
--- /dev/null
+/*
+ * (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
+ }
+}
--- /dev/null
+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
--- /dev/null
+<?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>
--- /dev/null
+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
\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
<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
<?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
<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>
<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
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
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
<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>