From: Richard Millet Date: Tue, 8 May 2012 16:52:24 +0000 (-0700) Subject: CSPACE-5036: Added infrastructure for making CMIS queries and getting results. X-Git-Url: https://git.aero2k.de/?a=commitdiff_plain;h=ad21d7680a1f19b3b722905a78d51f9319d11e3d;p=tmp%2Fjakarta-migration.git CSPACE-5036: Added infrastructure for making CMIS queries and getting results. --- diff --git a/services/client/src/main/java/org/collectionspace/services/client/IQueryManager.java b/services/client/src/main/java/org/collectionspace/services/client/IQueryManager.java index ceac6ee94..a5a143f12 100644 --- a/services/client/src/main/java/org/collectionspace/services/client/IQueryManager.java +++ b/services/client/src/main/java/org/collectionspace/services/client/IQueryManager.java @@ -42,6 +42,11 @@ public interface IQueryManager { final static String SEARCH_TYPE_INVOCATION = "inv"; final static String SEARCH_QUALIFIER_AND = SEARCH_TERM_SEPARATOR + "AND" + SEARCH_TERM_SEPARATOR; final static String SEARCH_QUALIFIER_OR = SEARCH_TERM_SEPARATOR + "OR" + SEARCH_TERM_SEPARATOR; + // + // Query params for CMIS queries on the relationship (Relation) table. + // + final static String SEARCH_RELATED_TO_CSID_SUBJECT = "rt_sbj"; + final static String SEARCH_RELATED_TO_CSID_OBJECT = "rd_obj"; public void execQuery(String queryString); diff --git a/services/common/src/main/java/org/collectionspace/services/common/AbstractMultiPartCollectionSpaceResourceImpl.java b/services/common/src/main/java/org/collectionspace/services/common/AbstractMultiPartCollectionSpaceResourceImpl.java index 396525290..9334399d1 100644 --- a/services/common/src/main/java/org/collectionspace/services/common/AbstractMultiPartCollectionSpaceResourceImpl.java +++ b/services/common/src/main/java/org/collectionspace/services/common/AbstractMultiPartCollectionSpaceResourceImpl.java @@ -71,9 +71,6 @@ public abstract class AbstractMultiPartCollectionSpaceResourceImpl extends Abstr return MultipartServiceContextFactory.get(); } - - - @Override public DocumentHandler createDocumentHandler(ServiceContext ctx) throws Exception { return createDocumentHandler(ctx, ctx.getCommonPartLabel(), getCommonPartClass()); diff --git a/services/common/src/main/java/org/collectionspace/services/common/document/AbstractDocumentHandlerImpl.java b/services/common/src/main/java/org/collectionspace/services/common/document/AbstractDocumentHandlerImpl.java index f45e0e051..53e556bec 100644 --- a/services/common/src/main/java/org/collectionspace/services/common/document/AbstractDocumentHandlerImpl.java +++ b/services/common/src/main/java/org/collectionspace/services/common/document/AbstractDocumentHandlerImpl.java @@ -412,4 +412,15 @@ public abstract class AbstractDocumentHandlerImpl handler.validate(action, serviceContext); } } + + /** + * Creates the CMIS query from the service context. Each document handler is responsible for returning a valid CMIS query using the + * information in the current service context -which includes things like the query parameters, etc. + */ + public String getCMISQuery() { + // + // By default, return nothing. Child classes can override if they want. + // + return null; + } } diff --git a/services/common/src/main/java/org/collectionspace/services/common/document/DocumentHandler.java b/services/common/src/main/java/org/collectionspace/services/common/document/DocumentHandler.java index fde044675..33ef154e1 100644 --- a/services/common/src/main/java/org/collectionspace/services/common/document/DocumentHandler.java +++ b/services/common/src/main/java/org/collectionspace/services/common/document/DocumentHandler.java @@ -328,4 +328,10 @@ public interface DocumentHandler { * @return unqualified property */ public String getUnQProperty(String qProp); + + /** + * Creates the CMIS query from the service context. Each document handler is responsible for returning a valid CMIS query using the + * information in the current service context -which includes things like the query parameters, etc. + */ + public String getCMISQuery(); } diff --git a/services/common/src/main/java/org/collectionspace/services/common/storage/StorageClient.java b/services/common/src/main/java/org/collectionspace/services/common/storage/StorageClient.java index 56108ce28..8c72ed8fa 100644 --- a/services/common/src/main/java/org/collectionspace/services/common/storage/StorageClient.java +++ b/services/common/src/main/java/org/collectionspace/services/common/storage/StorageClient.java @@ -114,7 +114,7 @@ public interface StorageClient { * @throws DocumentException */ void getFiltered(ServiceContext ctx, DocumentHandler handler) throws DocumentNotFoundException, DocumentException; - + /** * update given entity in the persistence store * @param ctx service context under which this method is invoked 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 945509705..aad37e2e4 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 @@ -699,7 +699,7 @@ public class RepositoryJavaClientImpl implements RepositoryClient 0) || (queryContext.getDocFilter().getPageSize() > 0)) { + if (handler.getCMISQuery() != null) { + docList = getFilteredCMIS(ctx, handler, queryContext); + } else if ((queryContext.getDocFilter().getOffset() > 0) || (queryContext.getDocFilter().getPageSize() > 0)) { docList = repoSession.query(query, null, queryContext.getDocFilter().getPageSize(), queryContext.getDocFilter().getOffset(), true); } else { @@ -832,6 +798,53 @@ public class RepositoryJavaClientImpl implements RepositoryClient row : queryResult) { + logger.debug( + // "dc:title is: " + (String)row.get("dc:title") + "" + " Hierarchy Table ID is:" + row.get("cmis:objectId") + + " cmis:name is: " + row.get("cmis:name") + // + " nuxeo:lifecycleState is: " + + // row.get("nuxeo:lifecycleState") + ); + String nuxeoId = (String) row.get("cmis:objectId"); + DocumentModel docModel = NuxeoUtils.getDocumentModel(repoSession, nuxeoId); + result.add(docModel); + } + // + profiler.stop(); + + } catch (Exception e) { + if (logger.isDebugEnabled()) { + logger.debug("Caught exception ", e); + } + throw new DocumentException(e); + } finally { + if (repoSession != null) { + releaseRepositorySession(repoSession); + } + } + + return result; + } + private String logException(Exception e, String msg) { String result = null; diff --git a/services/common/src/main/java/org/collectionspace/services/nuxeo/util/NuxeoUtils.java b/services/common/src/main/java/org/collectionspace/services/nuxeo/util/NuxeoUtils.java index 6daadf926..3bdf85a34 100644 --- a/services/common/src/main/java/org/collectionspace/services/nuxeo/util/NuxeoUtils.java +++ b/services/common/src/main/java/org/collectionspace/services/nuxeo/util/NuxeoUtils.java @@ -372,6 +372,17 @@ public class NuxeoUtils { return query.toString(); } + static public final String buildCMISQuery(ServiceContext ctx, QueryContext queryContext) throws Exception { + StringBuilder query = new StringBuilder("SELECT * FROM "); + + /* + * This is a place holder for CMIS query creation -see buildNXQLQuery as a reference + */ + + return query.toString(); + } + + /** * Builds an NXQL SELECT query across multiple document types. * diff --git a/services/movement/service/src/main/java/org/collectionspace/services/movement/MovementResource.java b/services/movement/service/src/main/java/org/collectionspace/services/movement/MovementResource.java index 77faf3c3c..b6c31705c 100644 --- a/services/movement/service/src/main/java/org/collectionspace/services/movement/MovementResource.java +++ b/services/movement/service/src/main/java/org/collectionspace/services/movement/MovementResource.java @@ -23,14 +23,22 @@ */ package org.collectionspace.services.movement; +import org.collectionspace.services.client.IQueryManager; import org.collectionspace.services.client.MovementClient; +import org.collectionspace.services.client.PoxPayloadIn; +import org.collectionspace.services.client.PoxPayloadOut; import org.collectionspace.services.common.ResourceBase; +import org.collectionspace.services.common.ServiceMessages; +import org.collectionspace.services.common.context.ServiceContext; +import org.collectionspace.services.common.document.DocumentHandler; +import org.collectionspace.services.jaxb.AbstractCommonList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.ws.rs.Consumes; import javax.ws.rs.Path; import javax.ws.rs.Produces; +import javax.ws.rs.core.MultivaluedMap; /** * MovementResource.java @@ -60,5 +68,40 @@ public class MovementResource extends ResourceBase { public Class getCommonPartClass() { return MovementsCommon.class; } + + private boolean isSet(String key, MultivaluedMap queryParams) { + boolean result = false; + + String value = queryParams.getFirst(key); + result = value != null && !value.isEmpty(); + + return result; + } + + @Override + protected AbstractCommonList getList(MultivaluedMap queryParams) { + if (isSet(IQueryManager.SEARCH_RELATED_TO_CSID_SUBJECT, queryParams) == false) { + // + // It's not a "related to" query so we can use our normal call to getList and not our CMIS query + // + return super.getList(queryParams); + } else { + // + // We need to use CMIS query method since we'll be doing a join with the Relation table + // + try { + ServiceContext ctx = createServiceContext(queryParams); + DocumentHandler handler = createDocumentHandler(ctx); + String relationToCsid = queryParams.getFirst(IQueryManager.SEARCH_RELATED_TO_CSID_SUBJECT); + + getRepositoryClient(ctx).getFilteredCMIS(ctx, handler); + AbstractCommonList list = (AbstractCommonList) handler.getCommonPartList(); + return list; + } catch (Exception e) { + throw bigReThrow(e, ServiceMessages.LIST_FAILED); + } + } + } + } diff --git a/services/movement/service/src/main/java/org/collectionspace/services/movement/nuxeo/MovementDocumentModelHandler.java b/services/movement/service/src/main/java/org/collectionspace/services/movement/nuxeo/MovementDocumentModelHandler.java index 989d15e97..b21054511 100644 --- a/services/movement/service/src/main/java/org/collectionspace/services/movement/nuxeo/MovementDocumentModelHandler.java +++ b/services/movement/service/src/main/java/org/collectionspace/services/movement/nuxeo/MovementDocumentModelHandler.java @@ -23,8 +23,14 @@ */ package org.collectionspace.services.movement.nuxeo; +import javax.ws.rs.core.MultivaluedMap; + +import org.collectionspace.services.client.IQueryManager; +import org.collectionspace.services.movement.MovementResource; import org.collectionspace.services.movement.MovementsCommon; import org.collectionspace.services.nuxeo.client.java.DocHandlerBase; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * The Class MovementDocumentModelHandler. @@ -35,5 +41,38 @@ import org.collectionspace.services.nuxeo.client.java.DocHandlerBase; public class MovementDocumentModelHandler extends DocHandlerBase { + final Logger logger = LoggerFactory.getLogger(MovementDocumentModelHandler.class); + + /** + * Creates the CMIS query from the service context. Each document handler is responsible for returning a valid CMIS query using the + * information in the current service context -which includes things like the query parameters, etc. + */ + @Override + public String getCMISQuery() { + String result = null; + + String subjectCsid = (String)getServiceContext().getQueryParams().get(IQueryManager.SEARCH_RELATED_TO_CSID_SUBJECT); + + // + // For Debugging purposes only + // + String cmis_movement = System.getenv("CMIS_MOVEMENT"); + + if (cmis_movement != null && !cmis_movement.isEmpty()) { + result = cmis_movement; + } else { + result = "SELECT M.cmis:name, M.dc:title, R.dc:title, R.relations_common:subjectCsid " + + "FROM Movement M JOIN Relation R ON R.relations_common:objectCsid = M.cmis:name " + + "WHERE R.relations_common:subjectCsid = " + + "'" + subjectCsid + "'"; + } + + if (logger.isDebugEnabled() == true) { + logger.debug("The CMIS query for the Movement service is: " + result); + } + + return result; + } + }