/**
* 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.app.util.factory.UtilServiceFactory;
import org.dspace.app.util.service.MetadataExposureService;
import org.dspace.authorize.factory.AuthorizeServiceFactory;
import org.dspace.authorize.service.AuthorizeService;
import org.dspace.content.Bundle;
import org.dspace.content.MetadataField;
import org.dspace.content.MetadataValue;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.content.service.ItemService;
import org.dspace.core.Context;
import javax.servlet.ServletContext;
import javax.ws.rs.WebApplicationException;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Created with IntelliJ IDEA.
* User: peterdietz
* Date: 9/19/13
* Time: 4:50 PM
* To change this template use File | Settings | File Templates.
*/
@SuppressWarnings("deprecation")
@XmlRootElement(name = "item")
public class Item extends DSpaceObject {
protected ItemService itemService = ContentServiceFactory.getInstance().getItemService();
protected MetadataExposureService metadataExposureService = UtilServiceFactory.getInstance().getMetadataExposureService();
protected AuthorizeService authorizeService = AuthorizeServiceFactory.getInstance().getAuthorizeService();
Logger log = Logger.getLogger(Item.class);
String isArchived;
String isWithdrawn;
String lastModified;
Collection parentCollection;
List<Collection> parentCollectionList;
List<Community> parentCommunityList;
List<MetadataEntry> metadata;
List<Bitstream> bitstreams;
public Item(){}
public Item(org.dspace.content.Item item, ServletContext servletContext, String expand, Context context)
throws SQLException, WebApplicationException
{
super(item, servletContext);
setup(item, servletContext, expand, context);
}
private void setup(org.dspace.content.Item item, ServletContext servletContext, String expand, Context context)
throws SQLException
{
List<String> expandFields = new ArrayList<String>();
if (expand != null)
{
expandFields = Arrays.asList(expand.split(","));
}
if (expandFields.contains("metadata") || expandFields.contains("all"))
{
metadata = new ArrayList<MetadataEntry>();
List<MetadataValue> metadataValues = itemService.getMetadata(
item, org.dspace.content.Item.ANY, org.dspace.content.Item.ANY,
org.dspace.content.Item.ANY, org.dspace.content.Item.ANY);
for (MetadataValue metadataValue : metadataValues)
{
MetadataField metadataField = metadataValue.getMetadataField();
if (!metadataExposureService.isHidden(context,
metadataField.getMetadataSchema().getName(),
metadataField.getElement(),
metadataField.getQualifier()))
{
metadata.add(new MetadataEntry(metadataField.toString('.'),
metadataValue.getValue(), metadataValue.getLanguage()));
}
}
}
else
{
this.addExpand("metadata");
}
this.setArchived(Boolean.toString(item.isArchived()));
this.setWithdrawn(Boolean.toString(item.isWithdrawn()));
this.setLastModified(item.getLastModified().toString());
if (expandFields.contains("parentCollection") || expandFields.contains("all"))
{
if (item.getOwningCollection() != null)
{
this.parentCollection = new Collection(item.getOwningCollection(),
servletContext, null, context, null, null);
}
else
{
this.addExpand("parentCollection");
}
}
else
{
this.addExpand("parentCollection");
}
if (expandFields.contains("parentCollectionList") || expandFields.contains("all"))
{
this.parentCollectionList = new ArrayList<Collection>();
List<org.dspace.content.Collection> collections = item.getCollections();
for (org.dspace.content.Collection collection : collections)
{
this.parentCollectionList.add(new Collection(collection,
servletContext, null, context, null, null));
}
}
else
{
this.addExpand("parentCollectionList");
}
if (expandFields.contains("parentCommunityList") || expandFields.contains("all"))
{
this.parentCommunityList = new ArrayList<Community>();
List<org.dspace.content.Community> communities = itemService.getCommunities(context, item);
for (org.dspace.content.Community community : communities)
{
this.parentCommunityList.add(new Community(community, servletContext, null, context));
}
}
else
{
this.addExpand("parentCommunityList");
}
//TODO: paging - offset, limit
if (expandFields.contains("bitstreams") || expandFields.contains("all"))
{
bitstreams = new ArrayList<Bitstream>();
List<Bundle> bundles = item.getBundles();
for (Bundle bundle : bundles)
{
List<org.dspace.content.Bitstream> itemBitstreams = bundle.getBitstreams();
for (org.dspace.content.Bitstream itemBitstream : itemBitstreams)
{
if (authorizeService.authorizeActionBoolean(context, itemBitstream, org.dspace.core.Constants.READ))
{
bitstreams.add(new Bitstream(itemBitstream, servletContext, null, context));
}
}
}
}
else
{
this.addExpand("bitstreams");
}
if (!expandFields.contains("all"))
{
this.addExpand("all");
}
}
public String getArchived() {
return isArchived;
}
public void setArchived(String archived) {
isArchived = archived;
}
public String getWithdrawn() {
return isWithdrawn;
}
public void setWithdrawn(String withdrawn) {
isWithdrawn = withdrawn;
}
public String getLastModified() {
return lastModified;
}
public void setLastModified(String lastModified) {
this.lastModified = lastModified;
}
public Collection getParentCollection() {
return parentCollection;
}
public List<Collection> getParentCollectionList() {
return parentCollectionList;
}
public List<MetadataEntry> getMetadata() {
return metadata;
}
public List<Bitstream> getBitstreams() {
return bitstreams;
}
public List<Community> getParentCommunityList() {
return parentCommunityList;
}
public void setParentCollection(Collection parentCollection) {
this.parentCollection = parentCollection;
}
public void setParentCollectionList(List<Collection> parentCollectionList) {
this.parentCollectionList = parentCollectionList;
}
public void setParentCommunityList(List<Community> parentCommunityList) {
this.parentCommunityList = parentCommunityList;
}
@XmlElement(required = true)
public void setMetadata(List<MetadataEntry> metadata) {
this.metadata = metadata;
}
public void setBitstreams(List<Bitstream> bitstreams) {
this.bitstreams = bitstreams;
}
}