From 26b8729f51a776aff27dab5508ec43d31e2370b0 Mon Sep 17 00:00:00 2001 From: Richard Millet Date: Fri, 31 Dec 2010 20:24:31 +0000 Subject: [PATCH] CSPACE-1071: Adding an example of how to create a custom Nuxeo EJB3/Remotable interface and service. We'll need this functionality not only to resolve issues like CSPACE-1071, but also many other current and future issues -like searches on complex types, efficient media handling, etc. --- 3rdparty/nuxeo/build.xml | 4 + .../nuxeo/nuxeo-platform-quote-api/.classpath | 8 + .../nuxeo/nuxeo-platform-quote-api/.project | 23 + .../.settings/org.maven.ide.eclipse.prefs | 8 + .../nuxeo/nuxeo-platform-quote-api/build.xml | 100 +++ .../nuxeo/nuxeo-platform-quote-api/pom.xml | 44 ++ .../platform/quote/api/QuoteConstants.java | 41 ++ .../platform/quote/api/QuoteConverter.java | 40 ++ .../ecm/platform/quote/api/QuoteEvents.java | 36 + .../ecm/platform/quote/api/QuoteManager.java | 92 +++ .../platform/quote/api/QuoteableDocument.java | 73 ++ .../quote/impl/QuoteableAdapterFactory.java | 40 ++ .../quote/impl/QuoteableDocumentAdapter.java | 88 +++ .../services/QuotesModerationService.java | 85 +++ .../quote/workflow/utils/QuotesConstants.java | 60 ++ .../src/main/resources/META-INF/MANIFEST.MF | 8 + .../resources/OSGI-INF/QuoteableAdapter.xml | 14 + .../OSGI-INF/deployment-fragment.xml | 11 + .../nuxeo/nuxeo-platform-quote/.classpath | 10 + 3rdparty/nuxeo/nuxeo-platform-quote/.project | 23 + .../.settings/org.maven.ide.eclipse.prefs | 8 + 3rdparty/nuxeo/nuxeo-platform-quote/LGPL.txt | 504 ++++++++++++++ 3rdparty/nuxeo/nuxeo-platform-quote/build.xml | 100 +++ 3rdparty/nuxeo/nuxeo-platform-quote/pom.xml | 152 +++++ .../platform/quote/ejb/QuoteManagerBean.java | 174 +++++ .../platform/quote/ejb/QuoteManagerLocal.java | 33 + .../quote/ejb/QuotesModerationBean.java | 70 ++ .../quote/impl/QuoteConverterImpl.java | 108 +++ .../platform/quote/impl/QuoteManagerImpl.java | 639 ++++++++++++++++++ .../ecm/platform/quote/impl/QuoteSorter.java | 50 ++ .../quote/listener/AbstractQuoteListener.java | 71 ++ .../DocumentRemovedQuoteEventListener.java | 88 +++ .../listener/QuoteRemovedEventListener.java | 69 ++ .../platform/quote/service/QuoteService.java | 83 +++ .../quote/service/QuoteServiceConfig.java | 62 ++ .../quote/service/QuoteServiceHelper.java | 38 ++ .../src/main/resources/META-INF/MANIFEST.MF | 14 + .../main/resources/OSGI-INF/QuoteService.xml | 37 + .../OSGI-INF/deployment-fragment.xml | 11 + .../OSGI-INF/quote-listener-contrib.xml | 12 + .../OSGI-INF/quote-platform-contrib.xml | 19 + .../listener/test/SimpleListenerTest.java | 154 +++++ .../src/test/resources/META-INF/MANIFEST.MF | 5 + .../resources/OSGI-INF/quote-jena-contrib.xml | 46 ++ .../src/test/resources/log4j.properties | 4 + 3rdparty/nuxeo/pom.xml | 2 + pom.xml | 42 ++ services/account/.classpath | 2 +- .../3rdparty/nuxeo-platform-cs-blob/pom.xml | 13 +- services/common/pom.xml | 7 +- .../common/imaging/nuxeo/NuxeoImageUtils.java | 13 + services/pom.xml | 10 - 52 files changed, 3429 insertions(+), 19 deletions(-) create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote-api/.classpath create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote-api/.project create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote-api/.settings/org.maven.ide.eclipse.prefs create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote-api/build.xml create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote-api/pom.xml create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteConstants.java create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteConverter.java create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteEvents.java create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteManager.java create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteableDocument.java create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteableAdapterFactory.java create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteableDocumentAdapter.java create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/workflow/services/QuotesModerationService.java create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/workflow/utils/QuotesConstants.java create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/resources/META-INF/MANIFEST.MF create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/resources/OSGI-INF/QuoteableAdapter.xml create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/resources/OSGI-INF/deployment-fragment.xml create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/.classpath create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/.project create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/.settings/org.maven.ide.eclipse.prefs create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/LGPL.txt create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/build.xml create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/pom.xml create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/ejb/QuoteManagerBean.java create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/ejb/QuoteManagerLocal.java create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/ejb/QuotesModerationBean.java create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteConverterImpl.java create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteManagerImpl.java create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteSorter.java create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/listener/AbstractQuoteListener.java create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/listener/DocumentRemovedQuoteEventListener.java create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/listener/QuoteRemovedEventListener.java create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/service/QuoteService.java create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/service/QuoteServiceConfig.java create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/service/QuoteServiceHelper.java create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/META-INF/MANIFEST.MF create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/QuoteService.xml create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/deployment-fragment.xml create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/quote-listener-contrib.xml create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/quote-platform-contrib.xml create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/src/test/java/org/nuxeo/ecm/platform/comment/listener/test/SimpleListenerTest.java create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/src/test/resources/META-INF/MANIFEST.MF create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/src/test/resources/OSGI-INF/quote-jena-contrib.xml create mode 100644 3rdparty/nuxeo/nuxeo-platform-quote/src/test/resources/log4j.properties diff --git a/3rdparty/nuxeo/build.xml b/3rdparty/nuxeo/build.xml index 694736bdd..7bb24cf08 100644 --- a/3rdparty/nuxeo/build.xml +++ b/3rdparty/nuxeo/build.xml @@ -124,6 +124,8 @@ + + @@ -131,6 +133,8 @@ description="undeploy nuxeo client libs from ${jboss.server.cspace}"> + + diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/.classpath b/3rdparty/nuxeo/nuxeo-platform-quote-api/.classpath new file mode 100644 index 000000000..199bbbbdb --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote-api/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/.project b/3rdparty/nuxeo/nuxeo-platform-quote-api/.project new file mode 100644 index 000000000..c80067bb1 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote-api/.project @@ -0,0 +1,23 @@ + + + org.collectionspace.services.3rdparty.nuxeo.quote-api + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/.settings/org.maven.ide.eclipse.prefs b/3rdparty/nuxeo/nuxeo-platform-quote-api/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 000000000..28e57c92e --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote-api/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,8 @@ +#Fri Dec 31 12:06:04 PST 2010 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=false +version=1 diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/build.xml b/3rdparty/nuxeo/nuxeo-platform-quote-api/build.xml new file mode 100644 index 000000000..20c78bacc --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote-api/build.xml @@ -0,0 +1,100 @@ + + + CollectionSpace Nuxeo Quote component type + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/pom.xml b/3rdparty/nuxeo/nuxeo-platform-quote-api/pom.xml new file mode 100644 index 000000000..b6928f94c --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote-api/pom.xml @@ -0,0 +1,44 @@ + + 4.0.0 + + org.collectionspace.services + org.collectionspace.services.3rdparty.nuxeo + 1.1-SNAPSHOT + + + org.collectionspace.services + org.collectionspace.services.3rdparty.nuxeo.quote-api + org.collectionspace.services.3rdparty.nuxeo.quote-api + + Nuxeo Enterprise Platform: CollectionSpace's Nuxeo Quote Service API. + + + + + org.nuxeo.ecm.core + nuxeo-core-api + ${nuxeo.core.version} + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + src/main/resources/META-INF/MANIFEST.MF + + ${eclipseVersion} + 2 + + + + + + + + diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteConstants.java b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteConstants.java new file mode 100644 index 000000000..df9daddd6 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteConstants.java @@ -0,0 +1,41 @@ +/* + * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser General Public License + * (LGPL) version 2.1 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * Contributors: + * Nuxeo - initial API and implementation + * + * $Id$ + */ + +package org.collectionspace.ecm.platform.quote.api; + +/** + * @author George Lefter + * + */ +public final class QuoteConstants { + + public static final String EVENT_COMMENT_CATEGORY = "commentCategory"; + + public static final String PARENT_COMMENT = "parentComment"; + + // FIXME This should be changed to COMMENT_DOCUMENT = "comment_document" + // (see NXP-2806) + public static final String COMMENT = "comment"; + + public static final String COMMENT_TEXT = "comment_text"; + + private QuoteConstants() { + } + +} diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteConverter.java b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteConverter.java new file mode 100644 index 000000000..e5ea8b217 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteConverter.java @@ -0,0 +1,40 @@ +/* + * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser General Public License + * (LGPL) version 2.1 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * Contributors: + * Nuxeo - initial API and implementation + * + * $Id$ + */ + +package org.collectionspace.ecm.platform.quote.api; + +import org.nuxeo.ecm.core.api.DocumentModel; + +/** + * @author George Lefter + * + */ +public interface QuoteConverter { + + /** + * Transforms the comment object into the document model. + */ + void updateDocumentModel(DocumentModel docModel, DocumentModel comment); + + /** + * Returns the type for comment document models. + */ + String getDocumentType(); + +} diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteEvents.java b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteEvents.java new file mode 100644 index 000000000..c02f037d9 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteEvents.java @@ -0,0 +1,36 @@ +/* + * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser General Public License + * (LGPL) version 2.1 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * Contributors: + * Nuxeo - initial API and implementation + * + * $Id$ + */ + +package org.collectionspace.ecm.platform.quote.api; + +/** + * @author George Lefter + * + */ +public final class QuoteEvents { + + public static final String COMMENT_ADDED = "commentAdded"; + + public static final String COMMENT_REMOVED = "commentRemoved"; + + // Constant utility class. + private QuoteEvents() { + } + +} diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteManager.java b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteManager.java new file mode 100644 index 000000000..7d4dad5f6 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteManager.java @@ -0,0 +1,92 @@ +/* + * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser General Public License + * (LGPL) version 2.1 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * Contributors: + * Nuxeo - initial API and implementation + * + * $Id$ + */ + +package org.collectionspace.ecm.platform.quote.api; + +import java.util.List; + +import org.nuxeo.ecm.core.api.ClientException; +import org.nuxeo.ecm.core.api.DocumentModel; + +/** + * @author George Lefter + * + */ +public interface QuoteManager { + + List getQuotes(DocumentModel docModel) + throws ClientException; + + List 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 getDocumentsForQuote(DocumentModel quote) + throws ClientException; + + /** + * Creates a comment document model. It gives opportunity to save the comments in a + * specified location. + * + * @param docModel the document to comment + * @param quote the comment content + * @param path the location path + * @return the comment document model. + * @throws ClientException + */ + DocumentModel createLocatedQuote(DocumentModel docModel, + DocumentModel quote, String path) throws ClientException; + +} diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteableDocument.java b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteableDocument.java new file mode 100644 index 000000000..80e82ddd3 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/api/QuoteableDocument.java @@ -0,0 +1,73 @@ +/* + * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser General Public License + * (LGPL) version 2.1 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * Contributors: + * Nuxeo - initial API and implementation + * + * $Id$ + */ + +package org.collectionspace.ecm.platform.quote.api; + +import java.io.Serializable; +import java.util.List; + +import org.nuxeo.ecm.core.api.ClientException; +import org.nuxeo.ecm.core.api.DocumentModel; + +/** + * @author George Lefter + * + */ +public interface QuoteableDocument extends Serializable { + + /** + * Returns all comments for this document. + * + * @return the list of comments + */ + List 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 getQuotes(DocumentModel parent) throws ClientException; + + /** + * Removes a comment from the document comment list. + * + * @param comment + */ + void removeQuote(DocumentModel comment) throws ClientException; + + /** + * Creates a new comment. + * + * @param comment + */ + DocumentModel addQuote(DocumentModel comment) throws ClientException; + + /** + * Creates a new comment as a reply to an existing comment. + * + * @param parent the parent comment, which must exist + * @param comment the comment to be added + * @throws ClientException + */ + DocumentModel addQuote(DocumentModel parent, DocumentModel comment) throws ClientException; + +} diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteableAdapterFactory.java b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteableAdapterFactory.java new file mode 100644 index 000000000..a771faa15 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteableAdapterFactory.java @@ -0,0 +1,40 @@ +/* + * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser General Public License + * (LGPL) version 2.1 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * Contributors: + * Nuxeo - initial API and implementation + * + * $Id$ + */ + +package org.collectionspace.ecm.platform.quote.impl; + +import org.nuxeo.ecm.core.api.DocumentModel; +import org.nuxeo.ecm.core.api.adapter.DocumentAdapterFactory; + +/** + * @author George Lefter + * + */ +public class QuoteableAdapterFactory implements DocumentAdapterFactory { + + public Object getAdapter(DocumentModel doc, Class itf) { + if (doc.hasFacet("Commentable")) { + return new QuoteableDocumentAdapter(doc); + } else { + // TODO: maybe throw an exception? + return null; + } + } + +} diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteableDocumentAdapter.java b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteableDocumentAdapter.java new file mode 100644 index 000000000..9a8117d28 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteableDocumentAdapter.java @@ -0,0 +1,88 @@ +/* + * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser General Public License + * (LGPL) version 2.1 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * Contributors: + * Nuxeo - initial API and implementation + * + * $Id$ + */ + +package org.collectionspace.ecm.platform.quote.impl; + +import java.util.List; + +import org.nuxeo.ecm.core.api.ClientException; +import org.nuxeo.ecm.core.api.DocumentModel; +import org.collectionspace.ecm.platform.quote.api.QuoteManager; +import org.collectionspace.ecm.platform.quote.api.QuoteableDocument; +import org.nuxeo.runtime.api.Framework; + +/** + * @author George Lefter + * + */ +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 getQuotes() throws ClientException { + QuoteManager quoteManager = getQuoteManager(); + return quoteManager.getQuotes(docModel); + } + + @Override + public List getQuotes(DocumentModel parent) throws ClientException { + QuoteManager quoteManager = getQuoteManager(); + return quoteManager.getQuotes(docModel, parent); + } + +} diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/workflow/services/QuotesModerationService.java b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/workflow/services/QuotesModerationService.java new file mode 100644 index 000000000..78ed7b0ee --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/workflow/services/QuotesModerationService.java @@ -0,0 +1,85 @@ +/* + * (C) Copyright 2009 Nuxeo SA (http://nuxeo.com/) and contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser General Public License + * (LGPL) version 2.1 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * Contributors: + * mcedica + */ +package org.collectionspace.ecm.platform.quote.workflow.services; + +import java.util.ArrayList; + +import org.nuxeo.ecm.core.api.ClientException; +import org.nuxeo.ecm.core.api.CoreSession; +import org.nuxeo.ecm.core.api.DocumentModel; + +public interface QuotesModerationService { + + /** + * Starts the moderation process on given Comment posted on a documentModel. + * + * @param session the coreSession + * @param document the document were the comment is posted + * @param commentId the commentId + * @throws ClientException + */ + void startModeration(CoreSession session, DocumentModel document, + String commentId, ArrayList moderators) + throws ClientException; + + /** + * Gets the moderation process for the given Comment posted on a documentModel. + * + * @param session the coreSession + * @param document the document were the comment is posted + * @param commentId the commentId + * @throws ClientException + */ + /** + ProcessInstance getModerationProcess(JbpmService jbpmService, + CoreSession session, DocumentModel doc, String commentId) + throws ClientException; + **/ + + /** + * Approve the comment with the given commentId. + * + * @param session the coreSession + * @param document the document were the comment is posted + * @param commentId the commentId + * @throws ClientException + */ + void approveQuote(CoreSession session, DocumentModel document, + String commentId) throws ClientException; + + /** + * Reject the comment with the given commentId. + * + * @param session the coreSession + * @param document the document were the comment is posted + * @param commentId the commentId + * @throws ClientException + */ + void rejectQuote(CoreSession session, DocumentModel document, + String commentId) throws ClientException; + + /** + * Publish the given comment. + * + * @param session the coreSession + * @param comment the comment to publish + * @throws ClientException + */ + void publishQuote(CoreSession session, DocumentModel comment) + throws ClientException; + +} diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/workflow/utils/QuotesConstants.java b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/workflow/utils/QuotesConstants.java new file mode 100644 index 000000000..1cad1b824 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/java/org/collectionspace/ecm/platform/quote/workflow/utils/QuotesConstants.java @@ -0,0 +1,60 @@ +/* + * (C) Copyright 2009 Nuxeo SA (http://nuxeo.com/) and contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser General Public License + * (LGPL) version 2.1 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * Contributors: + * mcedica + */ +package org.collectionspace.ecm.platform.quote.workflow.utils; + +/** + * Utility class used for registering constants. + */ +public final class QuotesConstants { + + private QuotesConstants() { + } + + /* + * Constants used for Comments + */ + public static final String PERMISSION_COMMENT = "Comment"; + + public static final String PERMISSION_MODERATE = "Moderate"; + + public static final String PERMISSION_WRITE = "Write"; + + public static final String PERMISSION_MANAGE_EVERYTHING = "Everything"; + + public static final String TRANSITION_TO_PUBLISHED_STATE = "moderation_publish"; + + public static final String PUBLISHED_STATE = "moderation_published"; + + public static final String PENDING_STATE = "moderation_pending"; + + public static final String REJECT_STATE = "moderation_reject"; + + public static final String MODERATION_PROCESS = "comments_moderation"; + + public static final String COMMENT_ID = "commentId"; + + public static final String COMMENT_PUBLISHED = "commentPublished"; + + public static final String COMMENT_LIFECYCLE = "comment_moderation"; + + /** + * Schemas and fields. + */ + public static final String COMMENT_CREATION_DATE = "comment:creationDate"; + public static final String COMMENT_AUTHOR = "comment:author"; + public static final String COMMENT_TEXT = "comment:text"; +} diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/resources/META-INF/MANIFEST.MF b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/resources/META-INF/MANIFEST.MF new file mode 100644 index 000000000..f24d544ec --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/resources/META-INF/MANIFEST.MF @@ -0,0 +1,8 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 1 +Bundle-Name: CSpace Nuxeo Quote API project +Bundle-SymbolicName: org.collectionspace.ecm.platform.quote.api;singleton=true +Bundle-Vendor: Nuxeo +Require-Bundle: org.nuxeo.ecm.core.api +Nuxeo-Component: OSGI-INF/QuoteableAdapter.xml +Export-Package: org.collectionspace.ecm.platform.quote.api diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/resources/OSGI-INF/QuoteableAdapter.xml b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/resources/OSGI-INF/QuoteableAdapter.xml new file mode 100644 index 000000000..bdd3e42b2 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/resources/OSGI-INF/QuoteableAdapter.xml @@ -0,0 +1,14 @@ + + + + + Defines CSpace Commentable document adapter + + + + + + + + diff --git a/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/resources/OSGI-INF/deployment-fragment.xml b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/resources/OSGI-INF/deployment-fragment.xml new file mode 100644 index 000000000..865552bce --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote-api/src/main/resources/OSGI-INF/deployment-fragment.xml @@ -0,0 +1,11 @@ + + + + + + ${bundle.fileName} + + + + + diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/.classpath b/3rdparty/nuxeo/nuxeo-platform-quote/.classpath new file mode 100644 index 000000000..425cd1620 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/.classpath @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/.project b/3rdparty/nuxeo/nuxeo-platform-quote/.project new file mode 100644 index 000000000..ea6dc85be --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/.project @@ -0,0 +1,23 @@ + + + org.collectionspace.services.3rdparty.nuxeo.quote + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.maven.ide.eclipse.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.maven.ide.eclipse.maven2Nature + + diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/.settings/org.maven.ide.eclipse.prefs b/3rdparty/nuxeo/nuxeo-platform-quote/.settings/org.maven.ide.eclipse.prefs new file mode 100644 index 000000000..73ad24b8a --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/.settings/org.maven.ide.eclipse.prefs @@ -0,0 +1,8 @@ +#Fri Dec 31 12:05:00 PST 2010 +activeProfiles= +eclipse.preferences.version=1 +fullBuildGoals=process-test-resources +resolveWorkspaceProjects=true +resourceFilterGoals=process-resources resources\:testResources +skipCompilerPlugin=false +version=1 diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/LGPL.txt b/3rdparty/nuxeo/nuxeo-platform-quote/LGPL.txt new file mode 100644 index 000000000..cbee875ba --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/LGPL.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + 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. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/build.xml b/3rdparty/nuxeo/nuxeo-platform-quote/build.xml new file mode 100644 index 000000000..c67bcfd9a --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/build.xml @@ -0,0 +1,100 @@ + + + CollectionSpace Nuxeo Quote component type + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/pom.xml b/3rdparty/nuxeo/nuxeo-platform-quote/pom.xml new file mode 100644 index 000000000..1e59245c9 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/pom.xml @@ -0,0 +1,152 @@ + + 4.0.0 + + + org.collectionspace.services + org.collectionspace.services.3rdparty.nuxeo + 1.1-SNAPSHOT + + + org.collectionspace.services + org.collectionspace.services.3rdparty.nuxeo.quote + org.collectionspace.services.3rdparty.nuxeo.quote + + Nuxeo Enterprise Platform: CollectionSpace's Nuxeo Quote Service. + + + + + + org.collectionspace.services + org.collectionspace.services.3rdparty.nuxeo.quote-api + ${project.version} + + + + org.nuxeo.ecm.core + nuxeo-core-api + ${nuxeo.core.version} + + + org.nuxeo.ecm.core + nuxeo-core-event + ${nuxeo.core.version} + + + org.nuxeo.ecm.core + nuxeo-core-schema + ${nuxeo.core.version} + + + org.nuxeo.ecm.platform + nuxeo-platform-relations-api + ${nuxeo.platform.version} + + + org.nuxeo.ecm.platform + nuxeo-platform-api + ${nuxeo.platform.version} + + + org.nuxeo.ecm.platform + nuxeo-platform-usermanager-api + ${nuxeo.platform.version} + + + + javax.ejb + ejb-api + + + javax.annotation + jsr250-api + + + jboss + jboss-annotations-ejb3 + + + javax.jms + jms + + + jboss + jboss-j2ee + + + + commons-logging + commons-logging + 1.1.1 + + + log4j + log4j + 1.2.14 + provided + + + + + + javax.transaction + jta + test + + + org.nuxeo.ecm.core + nuxeo-core-jcr-connector + ${nuxeo.core.version} + test + + + org.nuxeo.ecm.core + nuxeo-core-jcr-connector-test + ${nuxeo.core.version} + test + + + org.nuxeo.ecm.platform + nuxeo-platform-relations-core + ${nuxeo.platform.version} + test + + + org.nuxeo.ecm.platform + nuxeo-platform-relations-jena-plugin + ${nuxeo.platform.version} + test + + + org.nuxeo.ecm.platform + nuxeo-platform-comment-core + ${nuxeo.platform.version} + test + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + src/main/resources/META-INF/MANIFEST.MF + + ${eclipseVersion} + 2 + + + + + + + + + diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/ejb/QuoteManagerBean.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/ejb/QuoteManagerBean.java new file mode 100644 index 000000000..8270fa83f --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/ejb/QuoteManagerBean.java @@ -0,0 +1,174 @@ +/* + * (C) Copyright 2006-2007 Nuxeo SAS (http://nuxeo.com/) and contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser General Public License + * (LGPL) version 2.1 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * Contributors: + * Nuxeo - initial API and implementation + * + * $Id$ + */ + +package org.collectionspace.ecm.platform.quote.ejb; + +import java.util.List; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import javax.ejb.EJBContext; +import javax.ejb.Local; +import javax.ejb.Remote; +import javax.ejb.Stateless; + +import org.nuxeo.ecm.core.api.ClientException; +import org.nuxeo.ecm.core.api.ClientRuntimeException; +import org.nuxeo.ecm.core.api.DocumentModel; + +import org.collectionspace.ecm.platform.quote.api.QuoteManager; +import org.collectionspace.ecm.platform.quote.service.QuoteService; +import org.collectionspace.ecm.platform.quote.service.QuoteServiceHelper; + +/** + * @author George Lefter + * + */ +@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 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 getQuotes(DocumentModel docModel, + DocumentModel parent) throws ClientException { + try { + return quoteManager.getQuotes(docModel, parent); + } catch (Throwable e) { + throw ClientException.wrap(e); + } + } + + @Override + public List getDocumentsForQuote(DocumentModel commentDoc) + throws ClientException{ + try { + return quoteManager.getDocumentsForQuote(commentDoc); + } catch (Throwable e) { + throw ClientException.wrap(e); + } + } + + @Override + public DocumentModel createLocatedQuote(DocumentModel docModel, + DocumentModel comment, String path) throws ClientException { + try { + return quoteManager.createLocatedQuote(docModel, comment, path); + } catch (Throwable e) { + throw ClientException.wrap(e); + } + } + +} diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/ejb/QuoteManagerLocal.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/ejb/QuoteManagerLocal.java new file mode 100644 index 000000000..e4c18c307 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/ejb/QuoteManagerLocal.java @@ -0,0 +1,33 @@ +/* + * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser General Public License + * (LGPL) version 2.1 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * Contributors: + * Nuxeo - initial API and implementation + * + * $Id$ + */ + +package org.collectionspace.ecm.platform.quote.ejb; + +import javax.ejb.Local; + +import org.collectionspace.ecm.platform.quote.api.QuoteManager; + +/** + * @author George Lefter + * + */ +@Local +public interface QuoteManagerLocal extends QuoteManager { + +} diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/ejb/QuotesModerationBean.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/ejb/QuotesModerationBean.java new file mode 100644 index 000000000..3f8dae9d1 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/ejb/QuotesModerationBean.java @@ -0,0 +1,70 @@ +/* + * (C) Copyright 2006-2009 Nuxeo SAS (http://nuxeo.com/) and contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser General Public License + * (LGPL) version 2.1 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * Contributors: + * Nuxeo - initial API and implementation + * + * $Id$ + */ + +package org.collectionspace.ecm.platform.quote.ejb; + +import java.util.ArrayList; + +import javax.ejb.Local; +import javax.ejb.Remote; +import javax.ejb.Stateless; + +import org.nuxeo.ecm.core.api.ClientException; +import org.nuxeo.ecm.core.api.CoreSession; +import org.nuxeo.ecm.core.api.DocumentModel; +import org.nuxeo.runtime.api.Framework; + +import org.collectionspace.ecm.platform.quote.workflow.services.QuotesModerationService; + +@Stateless +@Remote(QuotesModerationService.class) +@Local(QuotesModerationService.class) +public class QuotesModerationBean implements QuotesModerationService { + + + protected QuotesModerationService getQuotesModerationService() { + return Framework.getLocalService(QuotesModerationService.class); + } + + + public void approveQuote(CoreSession session, DocumentModel document, + String commentID) throws ClientException { + getQuotesModerationService().approveQuote(session, document, commentID); + } + + public void publishQuote(CoreSession session, DocumentModel comment) + throws ClientException { + getQuotesModerationService().publishQuote(session, comment); + + } + + public void rejectQuote(CoreSession session, DocumentModel document, + String commentID) throws ClientException { + getQuotesModerationService().rejectQuote(session, document, commentID); + + } + + public void startModeration(CoreSession session, DocumentModel document, + String commentID, ArrayList moderators) + throws ClientException { + getQuotesModerationService().startModeration(session, document, commentID, moderators); + + } + +} diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteConverterImpl.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteConverterImpl.java new file mode 100644 index 000000000..f5243f575 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteConverterImpl.java @@ -0,0 +1,108 @@ +/* + * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser General Public License + * (LGPL) version 2.1 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * Contributors: + * Nuxeo - initial API and implementation + * + * $Id$ + */ + +package org.collectionspace.ecm.platform.quote.impl; + +import java.util.HashMap; +import java.util.Set; + +import org.nuxeo.ecm.core.api.ClientException; +import org.nuxeo.ecm.core.api.DataModel; +import org.nuxeo.ecm.core.api.DataModelMap; +import org.nuxeo.ecm.core.api.DocumentModel; + +import org.collectionspace.ecm.platform.quote.api.QuoteConverter; + +/** + * @author George Lefter + * + */ +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 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 keys = dataModelMap.keySet(); + + for(String key : keys) { + DataModel dataModel = dataModelMap.get(key); + String schema = dataModel.getSchema(); + try { + docModel.setProperties(schema, new HashMap(dataModel.getMap())); + } catch (ClientException e) { + continue; + } + /*if(docModel.hasSchema(schema)) { + docModel.setProperties(schema,dataModel.getMap()); + }*/ + } + /*docModel.setProperty(schema, "text", comment.getContent()); + docModel.setProperty(schema, "creationDate", comment.getCreationDate()); + docModel.setProperty(schema, "author", comment.getAuthor()); + docModel.setProperty(schema, "fileContent", comment.getFileContent()); + docModel.setProperty(schema, "filename", comment.getFilename());*/ + } + +} diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteManagerImpl.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteManagerImpl.java new file mode 100644 index 000000000..4deed9bc1 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteManagerImpl.java @@ -0,0 +1,639 @@ +/* + * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser General Public License + * (LGPL) version 2.1 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * Contributors: + * Nuxeo - initial API and implementation + * + * $Id$ + */ + +package org.collectionspace.ecm.platform.quote.impl; + +import java.io.Serializable; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.security.auth.login.LoginContext; +import javax.security.auth.login.LoginException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuxeo.common.utils.IdUtils; +import org.nuxeo.ecm.core.api.ClientException; +import org.nuxeo.ecm.core.api.ClientRuntimeException; +import org.nuxeo.ecm.core.api.CoreInstance; +import org.nuxeo.ecm.core.api.CoreSession; +import org.nuxeo.ecm.core.api.DocumentModel; +import org.nuxeo.ecm.core.api.DocumentRef; +import org.nuxeo.ecm.core.api.NuxeoPrincipal; +import org.nuxeo.ecm.core.api.PathRef; +import org.nuxeo.ecm.core.api.repository.RepositoryManager; +import org.nuxeo.ecm.core.api.security.ACE; +import org.nuxeo.ecm.core.api.security.ACL; +import org.nuxeo.ecm.core.api.security.ACP; +import org.nuxeo.ecm.core.api.security.SecurityConstants; +import org.nuxeo.ecm.core.api.security.impl.ACLImpl; +import org.nuxeo.ecm.core.api.security.impl.ACPImpl; +import org.nuxeo.ecm.core.event.Event; +import org.nuxeo.ecm.core.event.EventProducer; +import org.nuxeo.ecm.core.event.impl.DocumentEventContext; +import org.nuxeo.ecm.platform.relations.api.RelationManager; +import org.nuxeo.ecm.platform.relations.api.Resource; +import org.nuxeo.ecm.platform.relations.api.ResourceAdapter; +import org.nuxeo.ecm.platform.relations.api.Statement; +import org.nuxeo.ecm.platform.relations.api.impl.QNameResourceImpl; +import org.nuxeo.ecm.platform.relations.api.impl.ResourceImpl; +import org.nuxeo.ecm.platform.relations.api.impl.StatementImpl; +import org.nuxeo.ecm.platform.usermanager.UserManager; +import org.nuxeo.runtime.api.Framework; + +import org.collectionspace.ecm.platform.quote.api.QuoteConstants; +import org.collectionspace.ecm.platform.quote.api.QuoteConverter; +import org.collectionspace.ecm.platform.quote.api.QuoteEvents; +import org.collectionspace.ecm.platform.quote.api.QuoteManager; +import org.collectionspace.ecm.platform.quote.service.QuoteServiceConfig; + +/** + * @author George Lefter + * + */ +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 getQuotes(DocumentModel docModel) + throws ClientException { + RelationManager relationManager; + Map ctxMap = new HashMap(); + 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 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 commentList = new ArrayList(); + 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 statementList = new ArrayList(); + + 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 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 props = new HashMap(); + 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 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 getDocumentsForQuote(DocumentModel comment) + throws ClientException { + RelationManager relationManager; + Map ctxMap = new HashMap(); + 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 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 docList = new ArrayList(); + for (Statement stmt : statementList) { + QNameResourceImpl subject = (QNameResourceImpl) stmt.getObject(); + DocumentModel docModel = null; + try { + docModel = (DocumentModel) relationManager.getResourceRepresentation( + config.documentNamespace, subject, ctxMap); + } catch (Exception e) { + log.error("failed to retrieve documents from relations"); + } + if (docModel == null) { + log.warn("Could not adapt comment relation subject to a document " + + "model; check the service relation adapters configuration"); + continue; + } + docList.add(docModel); + } + return docList; + + } + public DocumentModel createLocatedQuote(DocumentModel docModel, + DocumentModel comment, String path) throws ClientException { + LoginContext loginContext = null; + CoreSession session = null; + DocumentModel createdComment; + try { + loginContext = Framework.login(); + session = openCoreSession(docModel.getRepositoryName()); + createdComment = internalCreateQuote(session, docModel, comment, path); + session.save(); + } catch (Exception e) { + throw new ClientException(e); + } finally { + closeCoreSession(loginContext, session); + } + + return createdComment; + } + +} diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteSorter.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteSorter.java new file mode 100644 index 000000000..acfb65376 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/impl/QuoteSorter.java @@ -0,0 +1,50 @@ +package org.collectionspace.ecm.platform.quote.impl; + +import java.util.Calendar; + +import org.nuxeo.ecm.core.api.DocumentModel; +import org.nuxeo.ecm.core.api.Sorter; + +public class QuoteSorter implements Sorter { + + /** + * + */ + private static final long serialVersionUID = 1L; + + private boolean asc = true; + + public QuoteSorter(boolean asc) { + this.asc = asc; + } + + public int compare(DocumentModel doc1, DocumentModel doc2) { + + if (doc1 == null && doc2 == null) { + return 0; + } else if (doc1 == null) { + return asc ? -1 : 1; + } else if (doc2 == null) { + return asc ? 1 : -1; + } + + int cmp=0; + try { + Calendar created1 = doc1.getProperty("dc:created").getValue(Calendar.class); + Calendar created2 = doc2.getProperty("dc:created").getValue(Calendar.class); + + if (created1 == null && created2 == null) { + return 0; + } else if (created1 == null) { + return asc ? -1 : 1; + } else if (created2 == null) { + return asc ? 1 : -1; + } + cmp = created1.compareTo(created2); + } + catch (Exception e) { + } + return asc ? cmp : -cmp; + } + +} diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/listener/AbstractQuoteListener.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/listener/AbstractQuoteListener.java new file mode 100644 index 000000000..32e056c4c --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/listener/AbstractQuoteListener.java @@ -0,0 +1,71 @@ +/* + * (C) Copyright 2006-2009 Nuxeo SAS (http://nuxeo.com/) and contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser General Public License + * (LGPL) version 2.1 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * Contributors: + * Nuxeo - initial API and implementation + * + * $Id$ + */ + +package org.collectionspace.ecm.platform.quote.listener; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuxeo.ecm.core.api.CoreSession; +import org.nuxeo.ecm.core.api.DocumentModel; +import org.nuxeo.ecm.core.api.event.DocumentEventTypes; +import org.nuxeo.ecm.core.event.Event; +import org.nuxeo.ecm.core.event.EventBundle; +import org.nuxeo.ecm.core.event.EventContext; +import org.nuxeo.ecm.core.event.impl.DocumentEventContext; +import org.nuxeo.ecm.platform.relations.api.RelationManager; +import org.nuxeo.runtime.api.Framework; + +import org.collectionspace.ecm.platform.quote.service.QuoteServiceConfig; +import org.collectionspace.ecm.platform.quote.service.QuoteServiceHelper; + +public abstract class AbstractQuoteListener { + + private static final Log log = LogFactory.getLog(AbstractQuoteListener.class); + + public void handleEvent(EventBundle events) { + for (Event event : events) { + handleEvent(event); + } + } + + public void handleEvent(Event event) { + if (DocumentEventTypes.DOCUMENT_REMOVED.equals(event.getName())) { + EventContext ctx = event.getContext(); + if (ctx instanceof DocumentEventContext) { + DocumentEventContext docCtx = (DocumentEventContext) ctx; + DocumentModel doc = docCtx.getSourceDocument(); + CoreSession coreSession = docCtx.getCoreSession(); + QuoteServiceConfig config = QuoteServiceHelper.getQuoteService().getConfig(); + try { + RelationManager relationManager = Framework.getService(RelationManager.class); + doProcess(coreSession, relationManager, config, doc); + } + catch (Exception e) { + log.error("Error during message processing", e); + } + return; + } + } + } + + protected abstract void doProcess(CoreSession coreSession, + RelationManager relationManager, QuoteServiceConfig config, + DocumentModel docMessage) throws Exception; + +} diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/listener/DocumentRemovedQuoteEventListener.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/listener/DocumentRemovedQuoteEventListener.java new file mode 100644 index 000000000..a7977bd08 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/listener/DocumentRemovedQuoteEventListener.java @@ -0,0 +1,88 @@ +/* + * (C) Copyright 2006-2009 Nuxeo SAS (http://nuxeo.com/) and contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser General Public License + * (LGPL) version 2.1 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * Contributors: + * Nuxeo - initial API and implementation + * + * $Id$ + */ + +package org.collectionspace.ecm.platform.quote.listener; + +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuxeo.ecm.core.api.ClientException; +import org.nuxeo.ecm.core.api.CoreSession; +import org.nuxeo.ecm.core.api.DocumentModel; +import org.nuxeo.ecm.core.event.PostCommitEventListener; +import org.collectionspace.ecm.platform.quote.service.QuoteServiceConfig; +import org.nuxeo.ecm.platform.relations.api.QNameResource; +import org.nuxeo.ecm.platform.relations.api.RelationManager; +import org.nuxeo.ecm.platform.relations.api.Resource; +import org.nuxeo.ecm.platform.relations.api.Statement; +import org.nuxeo.ecm.platform.relations.api.impl.StatementImpl; + +public class DocumentRemovedQuoteEventListener extends + AbstractQuoteListener implements PostCommitEventListener { + + private static final Log log = LogFactory.getLog(DocumentRemovedQuoteEventListener.class); + + @Override + protected void doProcess(CoreSession coreSession, + RelationManager relationManager, QuoteServiceConfig config, + DocumentModel docMessage) throws Exception { + log.debug("Processing relations cleanup on Document removal"); + onDocumentRemoved(coreSession, relationManager, config, docMessage); + } + + private static void onDocumentRemoved(CoreSession coreSession, + RelationManager relationManager, QuoteServiceConfig config, + DocumentModel docMessage) throws ClientException { + + Resource documentRes = relationManager.getResource( + config.documentNamespace, docMessage, null); + if (documentRes == null) { + log.error("Could not adapt document model to relation resource ; " + + "check the service relation adapters configuration"); + return; + } + Statement pattern = new StatementImpl(null, null, documentRes); + List statementList = relationManager.getStatements( + config.graphName, pattern); + + // remove comments + for (Statement stmt : statementList) { + QNameResource resource = (QNameResource) stmt.getSubject(); + String commentId = resource.getLocalName(); + DocumentModel docModel = (DocumentModel) relationManager.getResourceRepresentation( + config.commentNamespace, resource, null); + + if (docModel != null) { + try { + coreSession.removeDocument(docModel.getRef()); + log.debug("quote removal succeded for id: " + commentId); + } catch (Exception e) { + log.error("quote removal failed", e); + } + } else { + log.warn("quote/comment not found: id=" + commentId); + } + } + coreSession.save(); + // remove relations + relationManager.remove(config.graphName, statementList); + } + +} diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/listener/QuoteRemovedEventListener.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/listener/QuoteRemovedEventListener.java new file mode 100644 index 000000000..171acde82 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/listener/QuoteRemovedEventListener.java @@ -0,0 +1,69 @@ +/* + * (C) Copyright 2006-2009 Nuxeo SAS (http://nuxeo.com/) and contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser General Public License + * (LGPL) version 2.1 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * Contributors: + * Nuxeo - initial API and implementation + * + * $Id$ + */ + +package org.collectionspace.ecm.platform.quote.listener; + +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuxeo.ecm.core.api.ClientException; +import org.nuxeo.ecm.core.api.CoreSession; +import org.nuxeo.ecm.core.api.DocumentModel; +import org.nuxeo.ecm.core.event.EventListener; +import org.nuxeo.ecm.platform.relations.api.RelationManager; +import org.nuxeo.ecm.platform.relations.api.Resource; +import org.nuxeo.ecm.platform.relations.api.Statement; +import org.nuxeo.ecm.platform.relations.api.impl.StatementImpl; + +import org.collectionspace.ecm.platform.quote.service.QuoteServiceConfig; + +public class QuoteRemovedEventListener extends AbstractQuoteListener + implements EventListener { + + private static final Log log = LogFactory.getLog(QuoteRemovedEventListener.class); + + @Override + protected void doProcess(CoreSession coreSession, + RelationManager relationManager, QuoteServiceConfig config, + DocumentModel docMessage) throws Exception { + log.debug("Processing relations cleanup on Comment removal"); + String typeName = docMessage.getType(); + if ("Comment".equals(typeName) || "Post".equals(typeName)) { + onQuoteRemoved(relationManager, config, docMessage); + } + } + + private static void onQuoteRemoved(RelationManager relationManager, + QuoteServiceConfig config, DocumentModel docModel) + throws ClientException { + Resource quoteRes = relationManager.getResource( + config.commentNamespace, docModel, null); + if (quoteRes == null) { + log.warn("Could not adapt document model to relation resource; " + + "check the service relation adapters configuration"); + return; + } + Statement pattern = new StatementImpl(quoteRes, null, null); + List statementList = relationManager.getStatements( + config.graphName, pattern); + relationManager.remove(config.graphName, statementList); + } + +} diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/service/QuoteService.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/service/QuoteService.java new file mode 100644 index 000000000..4030da17e --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/service/QuoteService.java @@ -0,0 +1,83 @@ +/* + * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser General Public License + * (LGPL) version 2.1 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * Contributors: + * Nuxeo - initial API and implementation + * + * $Id$ + */ + +package org.collectionspace.ecm.platform.quote.service; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuxeo.runtime.model.ComponentInstance; +import org.nuxeo.runtime.model.DefaultComponent; + +import org.collectionspace.ecm.platform.quote.api.QuoteManager; +import org.collectionspace.ecm.platform.quote.impl.QuoteManagerImpl; + +/** + * @author George Lefter + * + */ +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 getAdapter(Class adapter) { + if (adapter == QuoteManager.class) { + return adapter.cast(getQuoteManager()); + } + return null; + } + +} diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/service/QuoteServiceConfig.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/service/QuoteServiceConfig.java new file mode 100644 index 000000000..3ce7bdcc9 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/service/QuoteServiceConfig.java @@ -0,0 +1,62 @@ +/* + * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser General Public License + * (LGPL) version 2.1 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * Contributors: + * Nuxeo - initial API and implementation + * + * $Id$ + */ + +package org.collectionspace.ecm.platform.quote.service; + +import org.nuxeo.common.xmap.annotation.XNode; +import org.nuxeo.common.xmap.annotation.XObject; +import org.collectionspace.ecm.platform.quote.api.QuoteConverter; + +/** + * @author George Lefter + * + */ +@XObject("config") +public class QuoteServiceConfig { + + // These instance variables are accessed directly from other classes in + // other packages. + + @XNode("converterClass") + // public Class commentConverterClass; + public String quoteConverterClassName; + + @XNode("graphName") + public String graphName; + + @XNode("commentNamespace") + public String commentNamespace; + + @XNode("predicateNamespace") + public String predicateNamespace; + + @XNode("documentNamespace") + public String documentNamespace; + + public QuoteConverter getQuoteConverter() { + try { + Class quoteConverterClass = Class.forName(quoteConverterClassName); + return (QuoteConverter) quoteConverterClass.newInstance(); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("Failed to create quote/comment converter", e); + } + } + +} diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/service/QuoteServiceHelper.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/service/QuoteServiceHelper.java new file mode 100644 index 000000000..6bd3d94e9 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/java/org/collectionspace/ecm/platform/quote/service/QuoteServiceHelper.java @@ -0,0 +1,38 @@ +/* + * (C) Copyright 2007 Nuxeo SAS (http://nuxeo.com/) and contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser General Public License + * (LGPL) version 2.1 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * Contributors: + * Nuxeo - initial API and implementation + * + * $Id$ + */ + +package org.collectionspace.ecm.platform.quote.service; + +import org.nuxeo.runtime.api.Framework; + +/** + * @author George Lefter + * + */ +public final class QuoteServiceHelper { + + // This is a utility class. + private QuoteServiceHelper() {} + + public static QuoteService getQuoteService() { + return (QuoteService) Framework.getRuntime().getComponent( + QuoteService.ID); + } + +} diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/META-INF/MANIFEST.MF b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/META-INF/MANIFEST.MF new file mode 100644 index 000000000..e5f47953b --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/META-INF/MANIFEST.MF @@ -0,0 +1,14 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 1 +Bundle-Name: CSpace Nuxeo Quote project +Bundle-SymbolicName: org.collectionspace.ecm.platform.quote;singleton=true +Bundle-Vendor: Nuxeo +Bundle-Category: web,stateful +Nuxeo-Component: OSGI-INF/QuoteService.xml, + OSGI-INF/quote-platform-contrib.xml, + OSGI-INF/QuoteService.xml, + OSGI-INF/quote-listener-contrib.xml +Eclipse-LazyStart: true +Require-Bundle: org.nuxeo.ecm.core.event, + org.nuxeo.ecm.relations.api, + org.collectionspace.ecm.platform.quote.api diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/QuoteService.xml b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/QuoteService.xml new file mode 100644 index 000000000..9521ea2f1 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/QuoteService.xml @@ -0,0 +1,37 @@ + + + + This component gives the user the possibility to add quotes to documents. + + + + + + + + + + + This extension can be used to configure the Quote Service + + + + + + + + + org.collectionspace.ecm.platform.quote.impl.QuoteConverterImpl + + documentComments + + http://www.nuxeo.org/comments/uid + http://www.nuxeo.org/document/uid + + http://www.nuxeo.org/predicates/isCommentFor + + + + + diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/deployment-fragment.xml b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/deployment-fragment.xml new file mode 100644 index 000000000..865552bce --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/deployment-fragment.xml @@ -0,0 +1,11 @@ + + + + + + ${bundle.fileName} + + + + + diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/quote-listener-contrib.xml b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/quote-listener-contrib.xml new file mode 100644 index 000000000..a902bddd3 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/quote-listener-contrib.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/quote-platform-contrib.xml b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/quote-platform-contrib.xml new file mode 100644 index 000000000..8689b8537 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/src/main/resources/OSGI-INF/quote-platform-contrib.xml @@ -0,0 +1,19 @@ + + + + org.collectionspace.ecm.platform.quote.service.QuoteService + + + Define the Quote bean as a platform service. + + %QuoteManagerBean + + + + %QuotesModerationBean + + + + diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/test/java/org/nuxeo/ecm/platform/comment/listener/test/SimpleListenerTest.java b/3rdparty/nuxeo/nuxeo-platform-quote/src/test/java/org/nuxeo/ecm/platform/comment/listener/test/SimpleListenerTest.java new file mode 100644 index 000000000..57796aae4 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/src/test/java/org/nuxeo/ecm/platform/comment/listener/test/SimpleListenerTest.java @@ -0,0 +1,154 @@ +/* + * (C) Copyright 2006-2009 Nuxeo SAS (http://nuxeo.com/) and contributors. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser General Public License + * (LGPL) version 2.1 which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl.html + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * Contributors: + * Nuxeo - initial API and implementation + * + * $Id$ + */ + +package org.nuxeo.ecm.platform.comment.listener.test; + +import java.util.List; + +import org.nuxeo.ecm.core.api.DocumentModel; +import org.nuxeo.ecm.core.event.EventService; +import org.nuxeo.ecm.core.event.jms.AsyncProcessorConfig; +import org.nuxeo.ecm.core.repository.jcr.testing.RepositoryOSGITestCase; +import org.nuxeo.ecm.platform.relations.api.RelationManager; +import org.nuxeo.ecm.platform.relations.api.Statement; +import org.nuxeo.runtime.api.Framework; + +import org.collectionspace.ecm.platform.quote.api.QuoteableDocument; +import org.collectionspace.ecm.platform.quote.service.QuoteService; +import org.collectionspace.ecm.platform.quote.service.QuoteServiceHelper; + +public class SimpleListenerTest extends RepositoryOSGITestCase { + + @Override + public void setUp() throws Exception { + super.setUp(); + deployBundle("org.nuxeo.ecm.relations.api"); + deployBundle("org.nuxeo.ecm.relations"); + deployBundle("org.nuxeo.ecm.relations.jena"); + // + // CollectionSpace + // + deployBundle("org.collectionspace.ecm.platform.quote.api"); + // deployBundle("org.nuxeo.ecm.platform.comment"); + deployBundle("org.nuxeo.ecm.platform.comment.core"); + + deployContrib("org.collectionspace.ecm.platform.quote", + "OSGI-INF/QuoteService.xml"); + deployContrib("org.collectionspace.ecm.platform.quote", + "OSGI-INF/quote-listener-contrib.xml"); + deployContrib("org.collectionspace.ecm.platform.quote.tests", + "OSGI-INF/quote-jena-contrib.xml"); + + openRepository(); + } + + protected int getCommentGrahNodesNumber() throws Exception { + RelationManager rm = Framework.getService(RelationManager.class); + + List 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 comments = commentService.getQuoteManager().getQuotes( + doc); + + // Delete the first comment + getCoreSession().removeDocument(comments.get(0).getRef()); + // Check that the first relation has been deleted + nbLinks = getCommentGrahNodesNumber(); + assertEquals(1, nbLinks); + + // Delete the second comment + getCoreSession().removeDocument(comments.get(1).getRef()); + // Check that the second relation has been deleted + nbLinks = getCommentGrahNodesNumber(); + assertEquals(0, nbLinks); + } + */ + + public void testDoNothing() { + // Do nothing + } +} diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/test/resources/META-INF/MANIFEST.MF b/3rdparty/nuxeo/nuxeo-platform-quote/src/test/resources/META-INF/MANIFEST.MF new file mode 100644 index 000000000..dbdfdf8e2 --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/src/test/resources/META-INF/MANIFEST.MF @@ -0,0 +1,5 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 1 +Bundle-Name: Nuxeo Quote project +Bundle-SymbolicName: org.collectionspace.ecm.platform.quote.tests;singleton=true +Bundle-Vendor: Nuxeo diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/test/resources/OSGI-INF/quote-jena-contrib.xml b/3rdparty/nuxeo/nuxeo-platform-quote/src/test/resources/OSGI-INF/quote-jena-contrib.xml new file mode 100644 index 000000000..ebc7f032d --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/src/test/resources/OSGI-INF/quote-jena-contrib.xml @@ -0,0 +1,46 @@ + + + + + + + org.collectionspace.ecm.platform.quote.impl.QuoteConverterImpl + + documentComments + + http://www.nuxeo.org/comments/uid + http://www.nuxeo.org/document/uid + + http://www.nuxeo.org/predicates/isCommentFor + + + + + + + + + + + + + + + + + http://www.nuxeo.org/comments/uid + + http://www.nuxeo.org/predicates/isCommentFor + + http://www.nuxeo.org/document/uid + + + + + diff --git a/3rdparty/nuxeo/nuxeo-platform-quote/src/test/resources/log4j.properties b/3rdparty/nuxeo/nuxeo-platform-quote/src/test/resources/log4j.properties new file mode 100644 index 000000000..bcd2a4c9a --- /dev/null +++ b/3rdparty/nuxeo/nuxeo-platform-quote/src/test/resources/log4j.properties @@ -0,0 +1,4 @@ +log4j.rootLogger=WARN, CONSOLE +log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender +log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout +log4j.appender.CONSOLE.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%C{1}] %m%n diff --git a/3rdparty/nuxeo/pom.xml b/3rdparty/nuxeo/pom.xml index ac5ae688c..2794ee7fa 100644 --- a/3rdparty/nuxeo/pom.xml +++ b/3rdparty/nuxeo/pom.xml @@ -15,6 +15,8 @@ nuxeo-platform-collectionspace + nuxeo-platform-quote-api + nuxeo-platform-quote diff --git a/pom.xml b/pom.xml index c0bcec3fe..5487836f8 100644 --- a/pom.xml +++ b/pom.xml @@ -293,6 +293,48 @@ slf4j-log4j12 1.5.8 + + javax.ejb + ejb + ${jboss.ejb.version} + provided + + + javax.annotation + jsr250-api + 1.0 + provided + + + javax.jms + jms + 1.1 + provided + + + javax.transaction + jta + 1.1 + provided + + + jboss + jboss-annotations-ejb3 + 3.0-RC8 + provided + + + jboss + jboss-j2ee + ${jboss.version} + provided + + + javax.ejb + ejb-api + 3.0 + provided + + + org.collectionspace.services + org.collectionspace.services.3rdparty.nuxeo.quote-api + ${project.version} + org.collectionspace.services org.collectionspace.services.jaxb @@ -194,7 +199,7 @@ org.nuxeo.ecm.platform nuxeo-platform-filemanager-api - ${nuxeo.platform.version} + ${nuxeo.platform.version} org.nuxeo.common diff --git a/services/common/src/main/java/org/collectionspace/services/common/imaging/nuxeo/NuxeoImageUtils.java b/services/common/src/main/java/org/collectionspace/services/common/imaging/nuxeo/NuxeoImageUtils.java index 38e35d170..d7ba33682 100644 --- a/services/common/src/main/java/org/collectionspace/services/common/imaging/nuxeo/NuxeoImageUtils.java +++ b/services/common/src/main/java/org/collectionspace/services/common/imaging/nuxeo/NuxeoImageUtils.java @@ -116,6 +116,8 @@ import org.collectionspace.services.blob.BlobsCommonList; import org.collectionspace.services.blob.BlobsCommonList.BlobListItem; import org.collectionspace.services.common.blob.BlobOutput; +import org.collectionspace.ecm.platform.quote.api.QuoteManager; + // TODO: Auto-generated Javadoc /** * The Class NuxeoImageUtils. @@ -208,6 +210,17 @@ public class NuxeoImageUtils { IdRef documentRef = new IdRef(repositoryId); DocumentModel documentModel = repoSession.getDocument(documentRef); DocumentBlobHolder docBlobHolder = (DocumentBlobHolder)documentModel.getAdapter(BlobHolder.class); + // + // + try { + QuoteManager quoteManager = (QuoteManager)Framework.getService(QuoteManager.class); + quoteManager.createQuote(documentModel, "Quoted - Comment" + System.currentTimeMillis(), + "Administrator"); + } catch (Exception e) { + e.printStackTrace(); + } + // + // List docBlobs = docBlobHolder.getBlobs(); List blobListItems = result.getBlobListItem(); BlobListItem blobListItem = null; diff --git a/services/pom.xml b/services/pom.xml index ad8e1db42..c04fb9370 100644 --- a/services/pom.xml +++ b/services/pom.xml @@ -302,16 +302,6 @@ jaxb-impl 2.1.9 - - org.slf4j - slf4j-api - 1.5.2 - - - org.slf4j - slf4j-log4j12 - 1.5.2 - javax.persistence persistence-api -- 2.47.3