/**
* 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.filter;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletContext;
import javax.ws.rs.WebApplicationException;
import org.apache.log4j.Logger;
import org.dspace.authorize.factory.AuthorizeServiceFactory;
import org.dspace.authorize.service.AuthorizeService;
import org.dspace.core.Context;
import org.dspace.rest.common.Item;
import org.dspace.rest.common.ItemFilter;
/**
* The set of Item Filter Use Cases to apply to a collection of items.
*
* @author Terry Brady, Georgetown University
*
*/
public class ItemFilterSet {
protected AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService();
static Logger log = Logger.getLogger(ItemFilterSet.class);
private List<ItemFilter> itemFilters;
private ItemFilter allFiltersFilter;
/**
* Construct a set of Item Filters identified by a list string.
*
* @param filterList
* Comma separated list of filter names to include.
* Use {@link org.dspace.rest.common.ItemFilter#ALL} to retrieve all filters.
* @param reportItems
* If true, return item details. If false, return only counts of items.
*/
public ItemFilterSet(String filterList, boolean reportItems) {
log.debug(String.format("Create ItemFilterSet: %s", filterList));
itemFilters = ItemFilter.getItemFilters(filterList, reportItems);
allFiltersFilter = ItemFilter.getAllFiltersFilter(itemFilters);
}
/**
* Get the special filter that represents the intersection of all items in the Item Filter Set.
* @return the special Item Filter that contains items that satisfied every other Item Filter in the Item Filter Set
*/
public ItemFilter getAllFiltersFilter() {
return allFiltersFilter;
}
/**
* Evaluate an item against the use cases in the Item Filter Set.
*
* If an item satisfies all items in the Item Filter Set, it should also ve added to the special all items filter.
*
* @param context
* Active DSpace Context
* @param item
* DSpace Object to evaluate
* @param restItem
* REST representation of the DSpace Object being evaluated
*/
public void testItem(Context context, org.dspace.content.Item item, Item restItem) {
boolean bAllTrue = true;
for(ItemFilter itemFilter: itemFilters) {
if (itemFilter.hasItemTest()) {
bAllTrue &= itemFilter.testItem(context, item, restItem);
}
}
if (bAllTrue && allFiltersFilter != null) {
allFiltersFilter.addItem(restItem);
}
}
/**
* Get all of the Item Filters initialized into the Item Filter Set
*
* @return a list of Item Filters initialized into the Item Filter Set
*/
public List<ItemFilter> getItemFilters() {
return itemFilters;
}
/**
* Evaluate a set of Items against the Item Filters in the Item Filter Set
* Current DSpace Context
*
* @param context
* Current DSpace Context
* @param servletContext
* Context of the servlet container.
* @param childItems
* Collection of Items to Evaluate
* @param save
* If true, save the details of each item that is evaluated
* @param expand
* List of item details to include in the results
* @return
* The number of items evaluated
* @throws WebApplicationException
* Runtime exception for applications.
* @throws SQLException
* An exception that provides information on a database access error or other errors.
*/
public int processSaveItems(Context context, ServletContext servletContext, Iterator<org.dspace.content.Item> childItems, boolean save, String expand) throws WebApplicationException, SQLException {
return processSaveItems(context, servletContext, childItems, new ArrayList<Item>(), save, expand);
}
/**
* Evaluate a set of Items against the Item Filters in the Item Filter Set
*
* @param context
* Current DSpace Context
* @param servletContext
* Context of the servlet container.
* @param childItems
* Collection of Items to Evaluate
* @param items
* List of items to contain saved results
* @param save
* If true, save the details of each item that is evaluated
* @param expand
* List of item details to include in the results
* @return
* The number of items evaluated
* @throws WebApplicationException
* Runtime exception for applications.
* @throws SQLException
* An exception that provides information on a database access error or other errors.
*/
public int processSaveItems(Context context, ServletContext servletContext, Iterator<org.dspace.content.Item> childItems, List<Item> items, boolean save, String expand) throws WebApplicationException, SQLException {
int count = 0;
while(childItems.hasNext()) {
count++;
org.dspace.content.Item item = childItems.next();
log.debug(item.getHandle() + " evaluate.");
if(authorizeService.authorizeActionBoolean(context, item, org.dspace.core.Constants.READ)) {
Item restItem = new Item(item, servletContext, expand, context);
if(save) {
items.add(restItem);
}
testItem(context, item, restItem);
} else {
log.debug(item.getHandle() + " not authorized - not included in result set.");
}
}
return count;
}
}