/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE and NOTICE files at the root of the source * tree and available online at * * http://www.dspace.org/license/ */ package org.dspace.rest; import org.apache.log4j.Logger; import org.dspace.authorize.factory.AuthorizeServiceFactory; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.CollectionService; import org.dspace.rest.common.FilteredCollection; import org.dspace.rest.exceptions.ContextException; import org.dspace.services.ConfigurationService; import org.dspace.services.factory.DSpaceServicesFactory; import org.dspace.usage.UsageEvent; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; /* * This class provides the items within a collection evaluated against a set of Item Filters. * * @author Terry Brady, Georgetown University */ @Path("/filtered-collections") public class FilteredCollectionsResource extends Resource { protected AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService(); protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService(); protected ConfigurationService configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); private static Logger log = Logger.getLogger(FilteredCollectionsResource.class); /** * Return array of all collections in DSpace. You can add more properties * through expand parameter. * * @param expand * String in which is what you want to add to returned instance * of collection. Options are: "all", "parentCommunityList", * "parentCommunity", "topCommunity", "items", "license" and "logo". * If you want to use multiple options, it must be separated by commas. * @param limit * Limit value for items in list in collection. Default value is * 100. * @param offset * Offset of start index in list of items of collection. Default * value is 0. * @param user_ip * User's IP address. * @param user_agent * User agent string (specifies browser used and its version). * @param filters * Comma separated list of Item Filters to use to evaluate against * the items in a collection * @param xforwardedfor * When accessed via a reverse proxy, the application sees the proxy's IP as the * source of the request. The proxy may be configured to add the * "X-Forwarded-For" HTTP header containing the original IP of the client * so that the reverse-proxied application can get the client's IP. * @param servletContext * Context of the servlet container. * @param headers * If you want to access the collections as the user logged into the * context. The value of the "rest-dspace-token" header must be set * to the token received from the login method response. * @param request * Servlet's HTTP request object. * @return Return array of collection, on which has logged user permission * to view. * @throws WebApplicationException * It is thrown when was problem with database reading * (SQLException) or problem with creating * context(ContextException). */ @GET @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) public org.dspace.rest.common.FilteredCollection[] getCollections(@QueryParam("expand") String expand, @QueryParam("limit") @DefaultValue("100") Integer limit, @QueryParam("offset") @DefaultValue("0") Integer offset, @QueryParam("userIP") String user_ip, @QueryParam("userAgent") String user_agent, @QueryParam("filters") @DefaultValue("is_item") String filters, @QueryParam("xforwardedfor") String xforwardedfor, @Context ServletContext servletContext, @Context HttpHeaders headers, @Context HttpServletRequest request) throws WebApplicationException { log.info("Reading all filtered collections.(offset=" + offset + ",limit=" + limit + ")"); org.dspace.core.Context context = null; List<FilteredCollection> collections = new ArrayList<FilteredCollection>(); try { context = createContext(); if (!configurationService.getBooleanProperty("rest.reporting-authenticate", true)) { context.turnOffAuthorisationSystem(); } if (!((limit != null) && (limit >= 0) && (offset != null) && (offset >= 0))) { log.warn("Paging was badly set."); limit = 100; offset = 0; } List<org.dspace.content.Collection> dspaceCollections = collectionService.findAll(context, limit, offset); for (org.dspace.content.Collection dspaceCollection : dspaceCollections) { if (authorizeService.authorizeActionBoolean(context, dspaceCollection, org.dspace.core.Constants.READ)) { FilteredCollection collection = new org.dspace.rest.common.FilteredCollection(dspaceCollection, servletContext, filters, expand, context, limit, offset); collections.add(collection); writeStats(dspaceCollection, UsageEvent.Action.VIEW, user_ip, user_agent, xforwardedfor, headers, request, context); } } context.complete(); } catch (SQLException e) { processException("Something went wrong while reading collections from database. Message: " + e, context); } catch (ContextException e) { processException("Something went wrong while reading collections, ContextError. Message: " + e.getMessage(), context); } finally { processFinally(context); } log.trace("All collections were successfully read."); return collections.toArray(new org.dspace.rest.common.FilteredCollection[0]); } /** * Return instance of collection with passed id. You can add more properties * through expand parameter. * * @param collection_id * Id of collection in DSpace. * @param expand * String in which is what you want to add to returned instance * of collection. Options are: "all", "parentCommunityList", * "parentCommunity", "topCommunity", "items", "license" and "logo". * If you want to use multiple options, it must be separated by commas. * @param limit * Limit value for items in list in collection. Default value is * 100. * @param offset * Offset of start index in list of items of collection. Default * value is 0. * @param user_ip * User's IP address. * @param user_agent * User agent string (specifies browser used and its version). * @param xforwardedfor * When accessed via a reverse proxy, the application sees the proxy's IP as the * source of the request. The proxy may be configured to add the * "X-Forwarded-For" HTTP header containing the original IP of the client * so that the reverse-proxied application can get the client's IP. * @param filters * Comma separated list of Item Filters to use to evaluate against * the items in a collection * @param headers * If you want to access the collection as the user logged into the * context. The value of the "rest-dspace-token" header must be set * to the token received from the login method response. * @param request * Servlet's HTTP request object. * @param servletContext * Context of the servlet container. * @return Return instance of collection. It can also return status code * NOT_FOUND(404) if id of collection is incorrect or status code * UNATHORIZED(401) if user has no permission to read collection. * @throws WebApplicationException * It is thrown when was problem with database reading * (SQLException) or problem with creating * context(ContextException). It is thrown by NOT_FOUND and * UNATHORIZED status codes, too. */ @GET @Path("/{collection_id}") @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) public org.dspace.rest.common.FilteredCollection getCollection(@PathParam("collection_id") String collection_id, @QueryParam("expand") String expand, @QueryParam("limit") @DefaultValue("1000") Integer limit, @QueryParam("offset") @DefaultValue("0") Integer offset, @QueryParam("userIP") String user_ip, @QueryParam("userAgent") String user_agent, @QueryParam("xforwardedfor") String xforwardedfor, @QueryParam("filters") @DefaultValue("is_item") String filters, @Context HttpHeaders headers, @Context HttpServletRequest request, @Context ServletContext servletContext) { org.dspace.core.Context context = null; FilteredCollection retColl = new org.dspace.rest.common.FilteredCollection(); try { context = createContext(); if (!configurationService.getBooleanProperty("rest.reporting-authenticate", true)) { context.turnOffAuthorisationSystem(); } org.dspace.content.Collection collection = collectionService.findByIdOrLegacyId(context, collection_id); if (authorizeService.authorizeActionBoolean(context, collection, org.dspace.core.Constants.READ)) { writeStats(collection, UsageEvent.Action.VIEW, user_ip, user_agent, xforwardedfor, headers, request, context); retColl = new org.dspace.rest.common.FilteredCollection( collection, servletContext, filters, expand, context, limit, offset); } else { throw new WebApplicationException(Response.Status.UNAUTHORIZED); } context.complete(); } catch (SQLException e) { processException(e.getMessage(), context); } catch (ContextException e) { processException(String.format("Could not read collection %d. %s", collection_id, e.getMessage()), context); } finally { processFinally(context); } return retColl; } }