From eb110d84072a58b2cf6790de0b86c15873df49a2 Mon Sep 17 00:00:00 2001 From: Richard Millet Date: Mon, 21 Jan 2013 20:56:54 -0800 Subject: [PATCH] CSPACE-5564: Using Nuxeo's FileManager and Blob support for keeping track of published articles. --- .../CollectionSpaceJaxRsApplication.java | 2 +- services/article/client/pom.xml | 8 -- .../services/client/ArticleClient.java | 1 + .../src/main/resources/articles-common.xsd | 2 +- services/blob/service/pom.xml | 5 + .../services/blob/BlobResource.java | 86 ++++++++++--- .../blob/nuxeo/BlobDocumentModelHandler.java | 16 +-- .../services/client/PoxPayloadOut.java | 1 - services/common/pom.xml | 10 ++ .../common}/article/ArticleResource.java | 45 ++++++- .../services/common/article/ArticleUtil.java | 60 +++++++++ ...xeoImageUtils.java => NuxeoBlobUtils.java} | 119 ++++++++++++++++-- .../client/java/RepositoryJavaClientImpl.java | 1 - 13 files changed, 305 insertions(+), 51 deletions(-) rename services/{article/service/src/main/java/org/collectionspace/services => common/src/main/java/org/collectionspace/services/common}/article/ArticleResource.java (55%) create mode 100644 services/common/src/main/java/org/collectionspace/services/common/article/ArticleUtil.java rename services/common/src/main/java/org/collectionspace/services/common/imaging/nuxeo/{NuxeoImageUtils.java => NuxeoBlobUtils.java} (87%) diff --git a/services/JaxRsServiceProvider/src/main/java/org/collectionspace/services/jaxrs/CollectionSpaceJaxRsApplication.java b/services/JaxRsServiceProvider/src/main/java/org/collectionspace/services/jaxrs/CollectionSpaceJaxRsApplication.java index 33638e963..cfee42fc2 100644 --- a/services/JaxRsServiceProvider/src/main/java/org/collectionspace/services/jaxrs/CollectionSpaceJaxRsApplication.java +++ b/services/JaxRsServiceProvider/src/main/java/org/collectionspace/services/jaxrs/CollectionSpaceJaxRsApplication.java @@ -49,7 +49,6 @@ import org.collectionspace.services.contact.ContactResource; import org.collectionspace.services.vocabulary.VocabularyResource; import org.collectionspace.services.organization.OrgAuthorityResource; import org.collectionspace.services.person.PersonAuthorityResource; -import org.collectionspace.services.article.ArticleResource; //import org.collectionspace.services.query.QueryResource; @@ -66,6 +65,7 @@ import org.collectionspace.services.common.ResourceBase; import org.collectionspace.services.common.ResourceMap; import org.collectionspace.services.common.ResourceMapHolder; import org.collectionspace.services.common.ResourceMapImpl; +import org.collectionspace.services.common.article.ArticleResource; import org.collectionspace.services.common.relation.RelationResource; import org.collectionspace.services.common.security.SecurityInterceptor; diff --git a/services/article/client/pom.xml b/services/article/client/pom.xml index 056998ed3..53173d351 100644 --- a/services/article/client/pom.xml +++ b/services/article/client/pom.xml @@ -9,7 +9,6 @@ 4.0.0 - org.collectionspace.services org.collectionspace.services.article.client services.article.client @@ -31,12 +30,6 @@ org.collectionspace.services.jaxb ${project.version} - - org.collectionspace.services - org.collectionspace.services.common - true - ${project.version} - org.collectionspace.services org.collectionspace.services.client @@ -84,7 +77,6 @@ commons-httpclient commons-httpclient - 3.1 diff --git a/services/article/client/src/main/java/org/collectionspace/services/client/ArticleClient.java b/services/article/client/src/main/java/org/collectionspace/services/client/ArticleClient.java index 403ab93c2..a6c68eeba 100644 --- a/services/article/client/src/main/java/org/collectionspace/services/client/ArticleClient.java +++ b/services/article/client/src/main/java/org/collectionspace/services/client/ArticleClient.java @@ -30,6 +30,7 @@ public class ArticleClient extends AbstractCommonListPoxServiceClientImpl - + diff --git a/services/blob/service/pom.xml b/services/blob/service/pom.xml index bae788571..a660fc6a2 100644 --- a/services/blob/service/pom.xml +++ b/services/blob/service/pom.xml @@ -33,6 +33,11 @@ org.collectionspace.services.blob.client ${project.version} + + org.collectionspace.services + org.collectionspace.services.article.client + ${project.version} + diff --git a/services/blob/service/src/main/java/org/collectionspace/services/blob/BlobResource.java b/services/blob/service/src/main/java/org/collectionspace/services/blob/BlobResource.java index 091b3a6f4..125d1589d 100644 --- a/services/blob/service/src/main/java/org/collectionspace/services/blob/BlobResource.java +++ b/services/blob/service/src/main/java/org/collectionspace/services/blob/BlobResource.java @@ -23,24 +23,36 @@ */ package org.collectionspace.services.blob; +import org.collectionspace.services.article.ArticlesCommon; +import org.collectionspace.services.client.ArticleClient; import org.collectionspace.services.client.BlobClient; import org.collectionspace.services.client.PoxPayloadIn; import org.collectionspace.services.client.PoxPayloadOut; +import org.collectionspace.services.client.workflow.WorkflowClient; import org.collectionspace.services.common.FileUtils; import org.collectionspace.services.common.ResourceBase; import org.collectionspace.services.common.ResourceMap; +import org.collectionspace.services.common.ServiceMain; import org.collectionspace.services.common.ServiceMessages; +import org.collectionspace.services.common.article.ArticleResource; +import org.collectionspace.services.common.article.ArticleUtil; import org.collectionspace.services.common.blob.BlobInput; import org.collectionspace.services.common.blob.BlobUtil; import org.collectionspace.services.common.context.ServiceContext; +import org.collectionspace.services.common.imaging.nuxeo.NuxeoBlobUtils; import org.collectionspace.services.nuxeo.client.java.CommonList; +import org.collectionspace.services.workflow.WorkflowCommon; import org.jboss.resteasy.plugins.providers.multipart.InputPart; import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput; +import org.nuxeo.ecm.core.api.DocumentModel; +import org.nuxeo.ecm.core.api.DocumentRef; +import org.nuxeo.ecm.core.api.IdRef; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.POST; +import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @@ -50,11 +62,15 @@ import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriBuilder; import javax.ws.rs.core.Response.ResponseBuilder; import javax.ws.rs.core.UriInfo; + +import java.io.File; import java.io.InputStream; import java.util.List; import java.util.Map; +import java.util.UUID; //FIXME: REM - We should not have Nuxeo dependencies in our resource classes. @@ -110,11 +126,13 @@ public class BlobResource extends ResourceBase { return result; } - private InputStream getBlobContent(String csid, String derivativeTerm, StringBuffer outMimeType) throws WebApplicationException { + private InputStream getBlobContent(ServiceContext ctx, + String csid, + String derivativeTerm, + StringBuffer outMimeType) throws WebApplicationException { InputStream result = null; try { - ServiceContext ctx = createServiceContext(); BlobInput blobInput = BlobUtil.getBlobInput(ctx); blobInput.setDerivativeTerm(derivativeTerm); blobInput.setContentRequested(true); @@ -236,14 +254,46 @@ public class BlobResource extends ResourceBase { @Path("{csid}/content") public Response getBlobContent( @PathParam("csid") String csid) { Response result = null; - - StringBuffer mimeType = new StringBuffer(); - InputStream contentStream = getBlobContent(csid, null /*derivative term*/, mimeType /*will get set*/); - Response.ResponseBuilder responseBuilder = Response.ok(contentStream, mimeType.toString()); - - result = responseBuilder.build(); + ServiceContext ctx = null; + + try { + ctx = createServiceContext(); + + StringBuffer mimeType = new StringBuffer(); + InputStream contentStream = getBlobContent(ctx, csid, null /*derivative term*/, mimeType /*will get set*/); + + Response.ResponseBuilder responseBuilder = Response.ok(contentStream, mimeType.toString()); + result = responseBuilder.build(); + } catch (Exception e) { + throw bigReThrow(e, ServiceMessages.CREATE_FAILED); + } + return result; } + + /* + * Publish the blob content. + */ + @GET + @Path("{csid}/content/publish") + public Response publishBlobContent( + @Context ResourceMap resourceMap, + @Context UriInfo uriInfo, + @PathParam("csid") String csid) { + Response result = null; + ServiceContext ctx = null; + + try { + ctx = createServiceContext(); + StringBuffer mimeType = new StringBuffer(); + InputStream contentStream = getBlobContent(ctx, csid, null /*derivative term*/, mimeType /*will get set*/); + result = ArticleUtil.publishToRepository(resourceMap, uriInfo, this.getRepositoryClient(ctx), ctx, contentStream, csid); + } catch (Exception e) { + throw bigReThrow(e, ServiceMessages.PUT_FAILED); + } + + return result; + } @GET @Path("{csid}/derivatives/{derivativeTerm}/content") @@ -251,13 +301,21 @@ public class BlobResource extends ResourceBase { @PathParam("csid") String csid, @PathParam("derivativeTerm") String derivativeTerm) { Response result = null; + ServiceContext ctx = null; - StringBuffer mimeType = new StringBuffer(); - InputStream contentStream = getBlobContent(csid, derivativeTerm, mimeType); - Response.ResponseBuilder responseBuilder = Response.ok(contentStream, mimeType.toString()); - - result = responseBuilder.build(); - return result; + try { + ctx = createServiceContext(); + + StringBuffer mimeType = new StringBuffer(); + InputStream contentStream = getBlobContent(ctx, csid, derivativeTerm, mimeType); + Response.ResponseBuilder responseBuilder = Response.ok(contentStream, mimeType.toString()); + + result = responseBuilder.build(); + } catch (Exception e) { + throw bigReThrow(e, ServiceMessages.CREATE_FAILED); + } + + return result; } @GET diff --git a/services/blob/service/src/main/java/org/collectionspace/services/blob/nuxeo/BlobDocumentModelHandler.java b/services/blob/service/src/main/java/org/collectionspace/services/blob/nuxeo/BlobDocumentModelHandler.java index fc0ed020b..a99401895 100644 --- a/services/blob/service/src/main/java/org/collectionspace/services/blob/nuxeo/BlobDocumentModelHandler.java +++ b/services/blob/service/src/main/java/org/collectionspace/services/blob/nuxeo/BlobDocumentModelHandler.java @@ -35,7 +35,7 @@ import org.collectionspace.services.common.blob.BlobUtil; import org.collectionspace.services.common.context.ServiceContext; import org.collectionspace.services.common.document.DocumentUtils; import org.collectionspace.services.common.document.DocumentWrapper; -import org.collectionspace.services.common.imaging.nuxeo.NuxeoImageUtils; +import org.collectionspace.services.common.imaging.nuxeo.NuxeoBlobUtils; import org.collectionspace.services.config.service.ListResultField; import org.collectionspace.services.config.service.ObjectPartType; import org.collectionspace.services.jaxb.BlobJAXBSchema; @@ -148,7 +148,7 @@ extends DocHandlerBase { // if (blobInput.isDerivativeListRequested() == true) { List resultsFields = getListItemsArray(); - CommonList blobsCommonList = NuxeoImageUtils.getBlobDerivatives( //FIXME: REM - Need to replace "NuxeoImageUtils" with something more general like "BlobUtils" since we may support other blob types. + CommonList blobsCommonList = NuxeoBlobUtils.getBlobDerivatives( //FIXME: REM - Need to replace "NuxeoImageUtils" with something more general like "BlobUtils" since we may support other blob types. repoSession, blobRepositoryId, resultsFields, getDerivativePathBase(docModel)); // ctx.setProperty(BlobInput.BLOB_DERIVATIVE_LIST_KEY, blobsCommonList); blobInput.setDerivativeList(blobsCommonList); @@ -163,15 +163,15 @@ extends DocHandlerBase { // if (derivativeTerm != null || getContentFlag == true) { StringBuffer mimeTypeBuffer = new StringBuffer(); - BlobOutput blobOutput = NuxeoImageUtils.getBlobOutput(ctx, repoSession, + BlobOutput blobOutput = NuxeoBlobUtils.getBlobOutput(ctx, repoSession, blobRepositoryId, derivativeTerm, getContentFlag, mimeTypeBuffer); if (getContentFlag == true) { if (blobOutput != null) { blobInput.setContentStream(blobOutput.getBlobInputStream()); } else { // If we can't find the blob's content, we'll return a "missing document" image - blobInput.setContentStream(NuxeoImageUtils.getResource(NuxeoImageUtils.DOCUMENT_MISSING_PLACEHOLDER_IMAGE)); - mimeTypeBuffer.append(NuxeoImageUtils.MIME_JPEG); + blobInput.setContentStream(NuxeoBlobUtils.getResource(NuxeoBlobUtils.DOCUMENT_MISSING_PLACEHOLDER_IMAGE)); + mimeTypeBuffer.append(NuxeoBlobUtils.MIME_JPEG); } } @@ -194,8 +194,8 @@ extends DocHandlerBase { this.setCommonPartProperties(docModel, blobsCommon); // finish extracting the other parts by calling the parent } else { - extractMetadata(blobRepositoryId, NuxeoImageUtils.SCHEMA_IMAGE_METADATA); - extractMetadata(blobRepositoryId, NuxeoImageUtils.SCHEMA_IPTC); + extractMetadata(blobRepositoryId, NuxeoBlobUtils.SCHEMA_IMAGE_METADATA); + extractMetadata(blobRepositoryId, NuxeoBlobUtils.SCHEMA_IPTC); } // @@ -222,7 +222,7 @@ extends DocHandlerBase { DocumentModel documentModel = wrapDoc.getWrappedObject(); RepositoryInstance repoSession = this.getRepositorySession(); - BlobsCommon blobsCommon = NuxeoImageUtils.createBlobInRepository(ctx, repoSession, blobInput, purgeOriginal); + BlobsCommon blobsCommon = NuxeoBlobUtils.createBlobInRepository(ctx, repoSession, blobInput, purgeOriginal); blobInput.setBlobCsid(documentModel.getName()); //Assumption here is that the documentModel "name" field is storing a CSID PoxPayloadIn input = ctx.getInput(); diff --git a/services/client/src/main/java/org/collectionspace/services/client/PoxPayloadOut.java b/services/client/src/main/java/org/collectionspace/services/client/PoxPayloadOut.java index 1b9d08d23..eca3df2c7 100644 --- a/services/client/src/main/java/org/collectionspace/services/client/PoxPayloadOut.java +++ b/services/client/src/main/java/org/collectionspace/services/client/PoxPayloadOut.java @@ -6,7 +6,6 @@ import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; -import org.dom4j.io.SAXReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/services/common/pom.xml b/services/common/pom.xml index 531d9bfb8..284753867 100644 --- a/services/common/pom.xml +++ b/services/common/pom.xml @@ -38,6 +38,16 @@ org.collectionspace.services.relation.client ${project.version} + + org.collectionspace.services + org.collectionspace.services.article.client + ${project.version} + + + org.collectionspace.services + org.collectionspace.services.article.jaxb + ${project.version} + Starting call to Nuxeo to create the blob document."); // For example, see Nuxeo's DefaultPictureAdapter class for details + DocumentModel documentModel = getFileManagerService() + .createDocumentFromBlob(repoSession, inputStreamBlob, + blobLocation.getPathAsString(), true, + blobName); + logger.debug("Stop --> Finished calling Nuxeo to create the blob document."); + + result = createBlobsCommon(documentModel, inputStreamBlob); // Now create our metadata resource document + } catch (Exception e) { + result = null; + logger.error("Could not create new Nuxeo blob document.", e); //FIXME: REM - This should probably be re-throwing the exception? + } finally { + if (repoSessionCleanup == true) { + releaseRepositorySession(ctx, repositoryClient, repoSession); + } + } + + return result; + } + /** * Creates the picture. * @@ -800,7 +869,7 @@ public class NuxeoImageUtils { return result; } - + /** * Creates the image blob. * @@ -900,6 +969,32 @@ public class NuxeoImageUtils { return result; } + static public BlobOutput getBlobOutput(ServiceContext ctx, + RepositoryClient repositoryClient, + String repositoryId, + StringBuffer outMimeType) throws TransactionException { + BlobOutput result = null; + + boolean repoSessionCleanup = false; + RepositoryInstance repoSession = (RepositoryInstance)ctx.getCurrentRepositorySession(); + if (repoSession == null) { + repoSession = getRepositorySession(ctx, repositoryClient); + repoSessionCleanup = true; + } + + try { + result = getBlobOutput(ctx, repoSession, repositoryId, null, true, outMimeType); + } + + finally { + if (repoSessionCleanup == true) { + releaseRepositorySession(ctx, repositoryClient, repoSession); + } + } + + return result; + } + /** * Gets the image. * diff --git a/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/RepositoryJavaClientImpl.java b/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/RepositoryJavaClientImpl.java index 10f39f50b..2a0797a5b 100644 --- a/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/RepositoryJavaClientImpl.java +++ b/services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/RepositoryJavaClientImpl.java @@ -68,7 +68,6 @@ import org.nuxeo.runtime.transaction.TransactionRuntimeException; // import org.apache.chemistry.opencmis.commons.server.CallContext; import org.apache.chemistry.opencmis.server.impl.CallContextImpl; -import org.apache.chemistry.opencmis.server.support.query.CmisQlExtParser_CmisBaseGrammar.boolean_factor_return; import org.nuxeo.ecm.core.opencmis.impl.server.NuxeoCmisService; import org.nuxeo.ecm.core.opencmis.impl.server.NuxeoRepository; -- 2.47.3