/** * 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.Collection; import org.dspace.content.Community; import org.dspace.content.Site; import org.dspace.content.factory.ContentServiceFactory; import org.dspace.content.service.CommunityService; import org.dspace.content.service.SiteService; import org.dspace.rest.common.HierarchyCollection; import org.dspace.rest.common.HierarchyCommunity; import org.dspace.rest.common.HierarchySite; import org.dspace.services.ConfigurationService; import org.dspace.services.factory.DSpaceServicesFactory; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.HttpHeaders; import java.io.UnsupportedEncodingException; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; /* * This class retrieves the community hierarchy in an optimized format. * * @author Terry Brady, Georgetown University */ @Path("/hierarchy") @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) public class HierarchyResource extends Resource { private static Logger log = Logger.getLogger(HierarchyResource.class); protected SiteService siteService = ContentServiceFactory.getInstance().getSiteService(); protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService(); protected AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService(); protected ConfigurationService configurationService = DSpaceServicesFactory.getInstance().getConfigurationService(); /** * @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 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. * @return Return instance of collection. It can also return status code * NOT_FOUND(404) if id of collection is incorrect or status code * @throws UnsupportedEncodingException * The Character Encoding is not supported. * @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 @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) public HierarchySite getHierarchy( @QueryParam("userAgent") String user_agent, @QueryParam("xforwardedfor") String xforwardedfor, @Context HttpHeaders headers, @Context HttpServletRequest request) throws UnsupportedEncodingException, WebApplicationException { org.dspace.core.Context context = null; HierarchySite repo = new HierarchySite(); try { context = createContext(); if (!configurationService.getBooleanProperty("rest.hierarchy-authenticate", true)) { context.turnOffAuthorisationSystem(); } Site site = siteService.findSite(context); repo.setId(site.getID().toString()); repo.setName(site.getName()); repo.setHandle(site.getHandle()); List<Community> dspaceCommunities = communityService.findAllTop(context); processCommunity(context, repo, dspaceCommunities); } catch (Exception e) { processException(e.getMessage(), context); } finally { if (context != null) { try { context.complete(); } catch (SQLException e) { log.error(e.getMessage() + " occurred while trying to close"); } } } return repo; } private void processCommunity(org.dspace.core.Context context, HierarchyCommunity parent, List<Community> communities) throws SQLException { if (communities == null) { return; } if (communities.size() == 0) { return; } List<HierarchyCommunity> parentComms = new ArrayList<HierarchyCommunity>(); parent.setCommunities(parentComms); for(Community comm: communities) { if (!authorizeService.authorizeActionBoolean(context, comm, org.dspace.core.Constants.READ)) { continue; } HierarchyCommunity mycomm = new HierarchyCommunity(comm.getID().toString(), comm.getName(), comm.getHandle()); parentComms.add(mycomm); List<Collection> colls = comm.getCollections(); if (colls.size() > 0) { List<HierarchyCollection> myColls = new ArrayList<HierarchyCollection>(); mycomm.setCollections(myColls); for(Collection coll: colls) { if (!authorizeService.authorizeActionBoolean(context, coll, org.dspace.core.Constants.READ)) { continue; } HierarchyCollection mycoll = new HierarchyCollection(coll.getID().toString(), coll.getName(), coll.getHandle()); myColls.add(mycoll); } } processCommunity(context, mycomm, comm.getSubcommunities()); } } }