From: Richard Millet Date: Mon, 21 Dec 2009 18:00:25 +0000 (+0000) Subject: CSPACE-682: CSPACE-683: Keyword search support for Acquisitions and Intakes. X-Git-Url: https://git.aero2k.de/?a=commitdiff_plain;h=3e47dc7cc7b07ee66901405b6abdf002c926b3a4;p=tmp%2Fjakarta-migration.git CSPACE-682: CSPACE-683: Keyword search support for Acquisitions and Intakes. --- diff --git a/services/acquisition/service/src/main/java/org/collectionspace/services/acquisition/AcquisitionResource.java b/services/acquisition/service/src/main/java/org/collectionspace/services/acquisition/AcquisitionResource.java index aa722c1b6..cfc53eedd 100644 --- a/services/acquisition/service/src/main/java/org/collectionspace/services/acquisition/AcquisitionResource.java +++ b/services/acquisition/service/src/main/java/org/collectionspace/services/acquisition/AcquisitionResource.java @@ -31,6 +31,7 @@ import javax.ws.rs.DELETE; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.PathParam; +import javax.ws.rs.QueryParam; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; @@ -38,12 +39,16 @@ import javax.ws.rs.core.UriBuilder; import javax.ws.rs.core.UriInfo; import org.collectionspace.services.acquisition.nuxeo.AcquisitionHandlerFactory; +import org.collectionspace.services.acquisition.AcquisitionsCommonList; import org.collectionspace.services.common.AbstractCollectionSpaceResource; import org.collectionspace.services.common.context.MultipartServiceContext; import org.collectionspace.services.common.context.MultipartServiceContextFactory; import org.collectionspace.services.common.context.ServiceContext; +import org.collectionspace.services.common.document.DocumentFilter; import org.collectionspace.services.common.document.DocumentNotFoundException; import org.collectionspace.services.common.document.DocumentHandler; +import org.collectionspace.services.common.query.IQueryManager; +import org.collectionspace.services.common.query.QueryManager; import org.collectionspace.services.common.security.UnauthorizedException; import org.jboss.resteasy.plugins.providers.multipart.MultipartInput; import org.jboss.resteasy.plugins.providers.multipart.MultipartOutput; @@ -261,6 +266,45 @@ public class AcquisitionResource Response.Status.INTERNAL_SERVER_ERROR).entity("Delete failed").type("text/plain").build(); throw new WebApplicationException(response); } - } + + @GET + @Path("/search") + @Produces("application/xml") + public AcquisitionsCommonList keywordsSearchAcquisitions(@Context UriInfo ui, + @QueryParam (IQueryManager.SEARCH_TYPE_KEYWORDS) String keywords) { + AcquisitionsCommonList acquisitionObjectList = new AcquisitionsCommonList(); + try { + ServiceContext ctx = MultipartServiceContextFactory.get().createServiceContext(null, getServiceName()); + DocumentHandler handler = createDocumentHandler(ctx); + + // perform a keyword search + if (keywords != null && !keywords.isEmpty()) { + String whereClause = QueryManager.createWhereClauseFromKeywords(keywords); + DocumentFilter documentFilter = handler.getDocumentFilter(); + documentFilter.setWhereClause(whereClause); + if (logger.isDebugEnabled()) { + logger.debug("The WHERE clause is: " + documentFilter.getWhereClause()); + } + getRepositoryClient(ctx).getFiltered(ctx, handler); + } else { + getRepositoryClient(ctx).getAll(ctx, handler); + } + acquisitionObjectList = (AcquisitionsCommonList) handler.getCommonPartList(); + + } catch (UnauthorizedException ue) { + Response response = Response.status( + Response.Status.UNAUTHORIZED).entity("Index failed reason " + ue.getErrorReason()).type("text/plain").build(); + throw new WebApplicationException(response); + } catch (Exception e) { + if (logger.isDebugEnabled()) { + logger.debug("Caught exception in search for Acquisitions", e); + } + Response response = Response.status( + Response.Status.INTERNAL_SERVER_ERROR).entity("Index failed").type("text/plain").build(); + throw new WebApplicationException(response); + } + return acquisitionObjectList; + } + } diff --git a/services/collectionobject/service/src/main/java/org/collectionspace/services/collectionobject/CollectionObjectResource.java b/services/collectionobject/service/src/main/java/org/collectionspace/services/collectionobject/CollectionObjectResource.java index 21b412ae6..f5b76e18a 100644 --- a/services/collectionobject/service/src/main/java/org/collectionspace/services/collectionobject/CollectionObjectResource.java +++ b/services/collectionobject/service/src/main/java/org/collectionspace/services/collectionobject/CollectionObjectResource.java @@ -43,6 +43,7 @@ import java.util.HashMap; import java.util.StringTokenizer; import org.collectionspace.services.common.query.QueryManager; +import org.collectionspace.services.common.query.IQueryManager; import org.collectionspace.services.collectionobject.nuxeo.CollectionObjectHandlerFactory; import org.collectionspace.services.common.AbstractCollectionSpaceResource; import org.collectionspace.services.common.context.MultipartServiceContext; @@ -66,11 +67,6 @@ public class CollectionObjectResource final private String serviceName = "collectionobjects"; final Logger logger = LoggerFactory.getLogger(CollectionObjectResource.class); - final private static String SEARCH_TYPE_KEYWORDS = "keywords"; - final private static String ECM_FULLTEXT_LIKE = "ecm:fulltext LIKE "; - final private static String SEARCH_QUALIFIER_AND = "AND"; - final private static String SEARCH_QUALIFIER_OR = "OR"; - final private static String SEARCH_TERM_SEPARATOR = " "; @Override public String getServiceName() { @@ -272,7 +268,7 @@ public class CollectionObjectResource @Path("/search") @Produces("application/xml") public CollectionobjectsCommonList keywordsSearchCollectionObjects(@Context UriInfo ui, - @QueryParam (SEARCH_TYPE_KEYWORDS) String keywords) { + @QueryParam (IQueryManager.SEARCH_TYPE_KEYWORDS) String keywords) { CollectionobjectsCommonList collectionObjectList = new CollectionobjectsCommonList(); try { ServiceContext ctx = MultipartServiceContextFactory.get().createServiceContext(null, getServiceName()); diff --git a/services/common/src/main/java/org/collectionspace/services/common/query/IQueryManager.java b/services/common/src/main/java/org/collectionspace/services/common/query/IQueryManager.java index d83d7a4a0..017d2aac0 100644 --- a/services/common/src/main/java/org/collectionspace/services/common/query/IQueryManager.java +++ b/services/common/src/main/java/org/collectionspace/services/common/query/IQueryManager.java @@ -28,6 +28,7 @@ package org.collectionspace.services.common.query; public interface IQueryManager { + final static String SEARCH_TYPE_KEYWORDS = "keywords"; final static String ECM_FULLTEXT_LIKE = "ecm:fulltext LIKE "; final static String SEARCH_QUALIFIER_AND = "AND"; final static String SEARCH_QUALIFIER_OR = "OR"; diff --git a/services/intake/service/src/main/java/org/collectionspace/services/intake/IntakeResource.java b/services/intake/service/src/main/java/org/collectionspace/services/intake/IntakeResource.java index f05003f0c..b41f13b03 100644 --- a/services/intake/service/src/main/java/org/collectionspace/services/intake/IntakeResource.java +++ b/services/intake/service/src/main/java/org/collectionspace/services/intake/IntakeResource.java @@ -31,14 +31,15 @@ import javax.ws.rs.DELETE; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.PathParam; +import javax.ws.rs.QueryParam; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Context; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriBuilder; import javax.ws.rs.core.UriInfo; +import org.collectionspace.services.intake.IntakesCommonList; import org.collectionspace.services.common.AbstractCollectionSpaceResource; -import org.collectionspace.services.intake.IntakesCommonList.*; import org.collectionspace.services.intake.nuxeo.IntakeHandlerFactory; import org.collectionspace.services.common.ClientType; @@ -46,8 +47,11 @@ import org.collectionspace.services.common.ServiceMain; import org.collectionspace.services.common.context.MultipartServiceContext; import org.collectionspace.services.common.context.MultipartServiceContextFactory; import org.collectionspace.services.common.context.ServiceContext; +import org.collectionspace.services.common.document.DocumentFilter; import org.collectionspace.services.common.document.DocumentNotFoundException; import org.collectionspace.services.common.document.DocumentHandler; +import org.collectionspace.services.common.query.IQueryManager; +import org.collectionspace.services.common.query.QueryManager; import org.collectionspace.services.common.security.UnauthorizedException; import org.jboss.resteasy.plugins.providers.multipart.MultipartInput; import org.jboss.resteasy.plugins.providers.multipart.MultipartOutput; @@ -262,6 +266,45 @@ public class IntakeResource extends AbstractCollectionSpaceResource { Response.Status.INTERNAL_SERVER_ERROR).entity("Delete failed").type("text/plain").build(); throw new WebApplicationException(response); } - } + + @GET + @Path("/search") + @Produces("application/xml") + public IntakesCommonList keywordsSearchIntakes(@Context UriInfo ui, + @QueryParam (IQueryManager.SEARCH_TYPE_KEYWORDS) String keywords) { + IntakesCommonList intakesObjectList = new IntakesCommonList(); + try { + ServiceContext ctx = MultipartServiceContextFactory.get().createServiceContext(null, getServiceName()); + DocumentHandler handler = createDocumentHandler(ctx); + + // perform a keyword search + if (keywords != null && !keywords.isEmpty()) { + String whereClause = QueryManager.createWhereClauseFromKeywords(keywords); + DocumentFilter documentFilter = handler.getDocumentFilter(); + documentFilter.setWhereClause(whereClause); + if (logger.isDebugEnabled()) { + logger.debug("The WHERE clause is: " + documentFilter.getWhereClause()); + } + getRepositoryClient(ctx).getFiltered(ctx, handler); + } else { + getRepositoryClient(ctx).getAll(ctx, handler); + } + intakesObjectList = (IntakesCommonList) handler.getCommonPartList(); + + } catch (UnauthorizedException ue) { + Response response = Response.status( + Response.Status.UNAUTHORIZED).entity("Index failed reason " + ue.getErrorReason()).type("text/plain").build(); + throw new WebApplicationException(response); + } catch (Exception e) { + if (logger.isDebugEnabled()) { + logger.debug("Caught exception in search for Intakes", e); + } + Response response = Response.status( + Response.Status.INTERNAL_SERVER_ERROR).entity("Index failed").type("text/plain").build(); + throw new WebApplicationException(response); + } + return intakesObjectList; + } + }