/** * 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.content; import org.apache.log4j.Logger; import org.dspace.authorize.AuthorizeException; import org.dspace.authorize.ResourcePolicy; import org.dspace.authorize.service.AuthorizeService; import org.dspace.content.dao.WorkspaceItemDAO; import org.dspace.content.service.CollectionService; import org.dspace.content.service.ItemService; import org.dspace.content.service.WorkspaceItemService; import org.dspace.core.Constants; import org.dspace.core.Context; import org.dspace.core.LogManager; import org.dspace.eperson.EPerson; import org.dspace.workflow.WorkflowItem; import org.dspace.workflow.WorkflowService; import org.springframework.beans.factory.annotation.Autowired; import java.io.IOException; import java.sql.SQLException; import java.util.List; import java.util.Map; /** * Service implementation for the WorkspaceItem object. * This class is responsible for all business logic calls for the WorkspaceItem object and is autowired by spring. * This class should never be accessed directly. * * @author kevinvandevelde at atmire.com */ public class WorkspaceItemServiceImpl implements WorkspaceItemService { private static final Logger log = Logger.getLogger(WorkspaceItemServiceImpl.class); @Autowired(required = true) protected WorkspaceItemDAO workspaceItemDAO; @Autowired(required = true) protected AuthorizeService authorizeService; @Autowired(required = true) protected CollectionService collectionService; @Autowired(required = true) protected ItemService itemService; @Autowired(required = true) protected WorkflowService workflowService; protected WorkspaceItemServiceImpl() { } @Override public WorkspaceItem find(Context context, int id) throws SQLException { WorkspaceItem workspaceItem = workspaceItemDAO.findByID(context, WorkspaceItem.class, id); if (workspaceItem == null) { if (log.isDebugEnabled()) { log.debug(LogManager.getHeader(context, "find_workspace_item", "not_found,workspace_item_id=" + id)); } } else { if (log.isDebugEnabled()) { log.debug(LogManager.getHeader(context, "find_workspace_item", "workspace_item_id=" + id)); } } return workspaceItem; } @Override public WorkspaceItem create(Context context, Collection collection, boolean template) throws AuthorizeException, SQLException { // Check the user has permission to ADD to the collection authorizeService.authorizeAction(context, collection, Constants.ADD); WorkspaceItem workspaceItem = workspaceItemDAO.create(context, new WorkspaceItem()); workspaceItem.setCollection(collection); // Create an item Item item = itemService.create(context, workspaceItem); item.setSubmitter(context.getCurrentUser()); // Now create the policies for the submitter and workflow // users to modify item and contents // contents = bitstreams, bundles // FIXME: icky hardcoded workflow steps workflowService.addInitialWorkspaceItemPolicies(context, workspaceItem); // read permission authorizeService.addPolicy(context, item, Constants.READ, item.getSubmitter(), ResourcePolicy.TYPE_SUBMISSION); // write permission authorizeService.addPolicy(context, item, Constants.WRITE, item.getSubmitter(), ResourcePolicy.TYPE_SUBMISSION); // add permission authorizeService.addPolicy(context, item, Constants.ADD, item.getSubmitter(), ResourcePolicy.TYPE_SUBMISSION); // remove contents permission authorizeService.addPolicy(context, item, Constants.REMOVE, item.getSubmitter(), ResourcePolicy.TYPE_SUBMISSION); // delete permission authorizeService.addPolicy(context, item, Constants.DELETE, item.getSubmitter(), ResourcePolicy.TYPE_SUBMISSION); // Copy template if appropriate Item templateItem = collection.getTemplateItem(); if (template && (templateItem != null)) { List<MetadataValue> md = itemService.getMetadata(templateItem, Item.ANY, Item.ANY, Item.ANY, Item.ANY); for (MetadataValue aMd : md) { MetadataField metadataField = aMd.getMetadataField(); MetadataSchema metadataSchema = metadataField.getMetadataSchema(); itemService.addMetadata(context, item, metadataSchema.getName(), metadataField.getElement(), metadataField.getQualifier(), aMd.getLanguage(), aMd.getValue()); } } itemService.update(context, item); workspaceItem.setItem(item); log.info(LogManager.getHeader(context, "create_workspace_item", "workspace_item_id=" + workspaceItem.getID() + "item_id=" + item.getID() + "collection_id=" + collection.getID())); return workspaceItem; } @Override public WorkspaceItem create(Context c, WorkflowItem workflowItem) throws SQLException, AuthorizeException { WorkspaceItem workspaceItem = workspaceItemDAO.create(c, new WorkspaceItem()); workspaceItem.setItem(workflowItem.getItem()); workspaceItem.setCollection(workflowItem.getCollection()); update(c, workspaceItem); return workspaceItem; } @Override public List<WorkspaceItem> findByEPerson(Context context, EPerson ep) throws SQLException { return workspaceItemDAO.findByEPerson(context, ep); } @Override public List<WorkspaceItem> findByCollection(Context context, Collection collection) throws SQLException { return workspaceItemDAO.findByCollection(context, collection); } @Override public WorkspaceItem findByItem(Context context, Item item) throws SQLException { return workspaceItemDAO.findByItem(context, item); } @Override public List<WorkspaceItem> findAllSupervisedItems(Context context) throws SQLException { return workspaceItemDAO.findWithSupervisedGroup(context); } @Override public List<WorkspaceItem> findSupervisedItemsByEPerson(Context context, EPerson ePerson) throws SQLException { return workspaceItemDAO.findBySupervisedGroupMember(context, ePerson); } @Override public List<WorkspaceItem> findAll(Context context) throws SQLException { return workspaceItemDAO.findAll(context); } @Override public void update(Context context, WorkspaceItem workspaceItem) throws SQLException, AuthorizeException { // Authorisation is checked by the item.update() method below log.info(LogManager.getHeader(context, "update_workspace_item", "workspace_item_id=" + workspaceItem.getID())); // Update the item itemService.update(context, workspaceItem.getItem()); // Update ourselves workspaceItemDAO.save(context, workspaceItem); } @Override public void deleteAll(Context context, WorkspaceItem workspaceItem) throws SQLException, AuthorizeException, IOException { /* * Authorisation is a special case. The submitter won't have REMOVE * permission on the collection, so our policy is this: Only the * original submitter or an administrator can delete a workspace item. */ Item item = workspaceItem.getItem(); if (!authorizeService.isAdmin(context) && ((context.getCurrentUser() == null) || (context .getCurrentUser().getID() != item.getSubmitter() .getID()))) { // Not an admit, not the submitter throw new AuthorizeException("Must be an administrator or the " + "original submitter to delete a workspace item"); } log.info(LogManager.getHeader(context, "delete_workspace_item", "workspace_item_id=" + workspaceItem.getID() + "item_id=" + item.getID() + "collection_id=" + workspaceItem.getCollection().getID())); // Need to delete the epersongroup2workspaceitem row first since it refers // to workspaceitem ID workspaceItem.getSupervisorGroups().clear(); // Need to delete the workspaceitem row first since it refers // to item ID workspaceItemDAO.delete(context, workspaceItem); // Delete item itemService.delete(context, item); } @Override public int countTotal(Context context) throws SQLException { return workspaceItemDAO.countRows(context); } @Override public List<Map.Entry<Integer, Long>> getStageReachedCounts(Context context) throws SQLException { return workspaceItemDAO.getStageReachedCounts(context); } @Override public void deleteWrapper(Context context, WorkspaceItem workspaceItem) throws SQLException, AuthorizeException { // Check authorisation. We check permissions on the enclosed item. Item item = workspaceItem.getItem(); authorizeService.authorizeAction(context, item, Constants.WRITE); log.info(LogManager.getHeader(context, "delete_workspace_item", "workspace_item_id=" + workspaceItem.getID() + "item_id=" + item.getID() + "collection_id=" + workspaceItem.getCollection().getID())); // deleteSubmitPermissions(); // Need to delete the workspaceitem row first since it refers // to item ID workspaceItem.getSupervisorGroups().clear(); workspaceItemDAO.delete(context, workspaceItem); } }