/**
* 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.common;
import org.apache.log4j.Logger;
import org.dspace.content.*;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.CollectionService;
import org.dspace.content.service.CommunityService;
import org.dspace.content.service.ItemService;
import org.dspace.core.Context;
import org.dspace.rest.filter.ItemFilterSet;
import javax.servlet.ServletContext;
import javax.ws.rs.WebApplicationException;
import javax.xml.bind.annotation.XmlRootElement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
/**
* Retrieve items within a collection that match a specific set of Item Filters of interest
*
* @author Terry Brady, Georgetown University
*/
@XmlRootElement(name = "filtered-collection")
public class FilteredCollection extends DSpaceObject {
protected CommunityService communityService = ContentServiceFactory.getInstance().getCommunityService();
protected CollectionService collectionService = ContentServiceFactory.getInstance().getCollectionService();
protected ItemService itemService = ContentServiceFactory.getInstance().getItemService();
Logger log = Logger.getLogger(FilteredCollection.class);
//Relationships
private Community parentCommunity;
private Community topCommunity;
private List<Community> parentCommunityList = new ArrayList<Community>();
private List<Item> items = new ArrayList<Item>();
private List<ItemFilter> itemFilters = new ArrayList<ItemFilter>();
//Calculated
private Integer numberItems;
private Integer numberItemsProcessed;
public FilteredCollection(){}
/**
* Evaluate a collection against of set of Item Filters
* @param collection
* DSpace Collection to evaluate
* @param servletContext
* Context of the servlet container.
* @param filters
* String representing a list of filters
* @param expand
* String in which is what you want to add to returned instance
* of collection. Options are: "all", "parentCommunityList",
* "parentCommunity", "items", "license" and "logo". If you want
* to use multiple options, it must be separated by commas.
* @param context
* The relevant DSpace Context.
* @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.
* @throws SQLException
* An exception that provides information on a database access error or other errors.
* @throws WebApplicationException
* Runtime exception for applications.
*/
public FilteredCollection(org.dspace.content.Collection collection, ServletContext servletContext, String filters, String expand, Context context, Integer limit, Integer offset) throws SQLException, WebApplicationException{
super(collection, servletContext);
setup(collection, servletContext, expand, context, limit, offset, filters);
}
private void setup(org.dspace.content.Collection collection, ServletContext servletContext, String expand, Context context, Integer limit, Integer offset, String filters) throws SQLException{
List<String> expandFields = new ArrayList<String>();
if (expand != null) {
expandFields = Arrays.asList(expand.split(","));
}
if (expandFields.contains("parentCommunityList") || expandFields.contains("all")) {
List<org.dspace.content.Community> parentCommunities = communityService.getAllParents(context, collection);
List<Community> parentCommunityList = new ArrayList<Community>();
for(org.dspace.content.Community parentCommunity : parentCommunities) {
parentCommunityList.add(new Community(parentCommunity, servletContext, null, context));
}
this.setParentCommunityList(parentCommunityList);
} else {
this.addExpand("parentCommunityList");
}
if (expandFields.contains("parentCommunity") | expandFields.contains("all")) {
org.dspace.content.Community parentCommunity = collection.getCommunities().get(0);
this.setParentCommunity(new Community(parentCommunity, servletContext, null, context));
} else {
this.addExpand("parentCommunity");
}
if (expandFields.contains("topCommunity") | expandFields.contains("all")) {
List<org.dspace.content.Community> parentCommunities = communityService.getAllParents(context, collection);
if (parentCommunities.size() > 0) {
org.dspace.content.Community topCommunity = parentCommunities.get(parentCommunities.size()-1);
this.setTopCommunity(new Community(topCommunity, servletContext, null, context));
}
} else {
this.addExpand("topCommunity");
}
boolean reportItems = expandFields.contains("items") || expandFields.contains("all");
ItemFilterSet itemFilterSet = new ItemFilterSet(filters, reportItems);
this.setItemFilters(itemFilterSet.getItemFilters());
this.setNumberItemsProcessed(0);
if (itemFilters.size() > 0) {
Iterator<org.dspace.content.Item> childItems = itemService.findByCollection(context, collection, limit, offset);
int numProc = itemFilterSet.processSaveItems(context, servletContext, childItems, items, reportItems, expand);
this.setNumberItemsProcessed(numProc);
}
if (!expandFields.contains("all")) {
this.addExpand("all");
}
this.setNumberItems(itemService.countItems(context, collection));
}
public Integer getNumberItems() {
return numberItems;
}
public void setNumberItems(Integer numberItems) {
this.numberItems = numberItems;
}
public Integer getNumberItemsProcessed() {
return numberItemsProcessed;
}
public void setNumberItemsProcessed(Integer numberItemsProcessed) {
this.numberItemsProcessed = numberItemsProcessed;
}
public Community getParentCommunity() {
return parentCommunity;
}
public void setParentCommunity(Community parentCommunity) {
this.parentCommunity = parentCommunity;
}
public Community getTopCommunity() {
return topCommunity;
}
public void setTopCommunity(Community topCommunity) {
this.topCommunity = topCommunity;
}
public List<Item> getItems() {
return items;
}
public void setItems(List<Item> items) {
this.items = items;
}
public void setParentCommunityList(List<Community> parentCommunityList) {
this.parentCommunityList = parentCommunityList;
}
public List<Community> getParentCommunityList() {
return parentCommunityList;
}
public List<ItemFilter> getItemFilters() {
return itemFilters;
}
public void setItemFilters(List<ItemFilter> itemFilters) {
this.itemFilters = itemFilters;
}
}