/**
* 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.authorize;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.log4j.Logger;
import org.dspace.authorize.dao.ResourcePolicyDAO;
import org.dspace.authorize.service.ResourcePolicyService;
import org.dspace.content.DSpaceObject;
import org.dspace.content.factory.ContentServiceFactory;
import org.dspace.core.Constants;
import org.dspace.core.Context;
import org.dspace.eperson.EPerson;
import org.dspace.eperson.Group;
import org.springframework.beans.factory.annotation.Autowired;
import java.sql.SQLException;
import java.util.*;
/**
* Service implementation for the ResourcePolicy object.
* This class is responsible for all business logic calls for the ResourcePolicy object and is autowired by spring.
* This class should never be accessed directly.
*
* @author kevinvandevelde at atmire.com
*/
public class ResourcePolicyServiceImpl implements ResourcePolicyService
{
/** log4j logger */
private static Logger log = Logger.getLogger(ResourcePolicyServiceImpl.class);
@Autowired(required = true)
protected ContentServiceFactory contentServiceFactory;
@Autowired(required = true)
protected ResourcePolicyDAO resourcePolicyDAO;
protected ResourcePolicyServiceImpl()
{
}
/**
* Get an ResourcePolicy from the database.
*
* @param context
* DSpace context object
* @param id
* ID of the ResourcePolicy
*
* @return the ResourcePolicy format, or null if the ID is invalid.
* @throws SQLException if database error
*/
@Override
public ResourcePolicy find(Context context, int id) throws SQLException
{
return resourcePolicyDAO.findByID(context, ResourcePolicy.class, id);
}
/**
* Create a new ResourcePolicy
*
* @param context
* DSpace context object
* @return ResourcePolicy
* @throws SQLException if database error
*/
@Override
public ResourcePolicy create(Context context) throws SQLException
{
// FIXME: Check authorisation
// Create a table row
ResourcePolicy resourcePolicy = resourcePolicyDAO.create(context, new ResourcePolicy());
return resourcePolicy;
}
@Override
public List<ResourcePolicy> find(Context c, DSpaceObject o) throws SQLException
{
return resourcePolicyDAO.findByDso(c, o);
}
@Override
public List<ResourcePolicy> find(Context c, DSpaceObject o, String type) throws SQLException
{
return resourcePolicyDAO.findByDsoAndType(c, o, type);
}
@Override
public List<ResourcePolicy> find(Context context, Group group) throws SQLException {
return resourcePolicyDAO.findByGroup(context, group);
}
@Override
public List<ResourcePolicy> find(Context c, DSpaceObject o, int actionId) throws SQLException
{
return resourcePolicyDAO.findByDSoAndAction(c, o, actionId);
}
@Override
public List<ResourcePolicy> find(Context c, DSpaceObject dso, Group group, int action) throws SQLException {
return resourcePolicyDAO.findByTypeGroupAction(c, dso, group, action);
}
@Override
public List<ResourcePolicy> find(Context c, EPerson e, List<Group> groups, int action, int type_id) throws SQLException{
return resourcePolicyDAO.findByEPersonGroupTypeIdAction(c, e, groups, action, type_id);
}
@Override
public List<ResourcePolicy> findByTypeGroupActionExceptId(Context context, DSpaceObject dso, Group group, int action, int notPolicyID)
throws SQLException
{
return resourcePolicyDAO.findByTypeGroupActionExceptId(context, dso, group, action, notPolicyID);
}
/**
* Delete an ResourcePolicy
*
* @param context context
* @param resourcePolicy resource policy
* @throws SQLException if database error
* @throws AuthorizeException if authorization error
*/
@Override
public void delete(Context context, ResourcePolicy resourcePolicy) throws SQLException, AuthorizeException {
// FIXME: authorizations
// Remove ourself
resourcePolicyDAO.delete(context, resourcePolicy);
context.turnOffAuthorisationSystem();
if(resourcePolicy.getdSpaceObject() != null)
{
//A policy for a DSpace Object has been modified, fire a modify event on the DSpace object
contentServiceFactory.getDSpaceObjectService(resourcePolicy.getdSpaceObject()).updateLastModified(context, resourcePolicy.getdSpaceObject());
}
context.restoreAuthSystemState();
}
/**
* @param resourcePolicy resource policy
* @return action text or 'null' if action row empty
*/
@Override
public String getActionText(ResourcePolicy resourcePolicy)
{
int myAction = resourcePolicy.getAction();
if (myAction == -1)
{
return "...";
}
else
{
return Constants.actionText[myAction];
}
}
/**
* figures out if the date is valid for the policy
*
* @param resourcePolicy resource policy
* @return true if policy has begun and hasn't expired yet (or no dates are
* set)
*/
@Override
public boolean isDateValid(ResourcePolicy resourcePolicy)
{
Date sd = resourcePolicy.getStartDate();
Date ed = resourcePolicy.getEndDate();
// if no dates set, return true (most common case)
if ((sd == null) && (ed == null))
{
return true;
}
// one is set, now need to do some date math
Date now = new Date();
// check start date first
if (sd != null && now.before(sd))
{
// start date is set, return false if we're before it
return false;
}
// now expiration date
if (ed != null && now.after(ed))
{
// end date is set, return false if we're after it
return false;
}
// if we made it this far, start < now < end
return true; // date must be okay
}
@Override
public ResourcePolicy clone(Context context, ResourcePolicy resourcePolicy) throws SQLException, AuthorizeException {
ResourcePolicy clone = create(context);
clone.setGroup(resourcePolicy.getGroup());
clone.setEPerson(resourcePolicy.getEPerson());
clone.setStartDate((Date) ObjectUtils.clone(resourcePolicy.getStartDate()));
clone.setEndDate((Date) ObjectUtils.clone(resourcePolicy.getEndDate()));
clone.setRpType((String) ObjectUtils.clone(resourcePolicy.getRpType()));
clone.setRpDescription((String) ObjectUtils.clone(resourcePolicy.getRpDescription()));
update(context, clone);
return clone;
}
@Override
public void removeAllPolicies(Context c, DSpaceObject o) throws SQLException, AuthorizeException {
resourcePolicyDAO.deleteByDso(c, o);
c.turnOffAuthorisationSystem();
contentServiceFactory.getDSpaceObjectService(o).updateLastModified(c, o);
c.restoreAuthSystemState();
}
@Override
public void removePolicies(Context c, DSpaceObject o, String type) throws SQLException, AuthorizeException {
resourcePolicyDAO.deleteByDsoAndType(c, o, type);
c.turnOffAuthorisationSystem();
contentServiceFactory.getDSpaceObjectService(o).updateLastModified(c, o);
c.restoreAuthSystemState();
}
@Override
public void removeDsoGroupPolicies(Context context, DSpaceObject dso, Group group) throws SQLException, AuthorizeException {
resourcePolicyDAO.deleteByDsoGroupPolicies(context, dso, group);
context.turnOffAuthorisationSystem();
contentServiceFactory.getDSpaceObjectService(dso).updateLastModified(context, dso);
context.restoreAuthSystemState();
}
@Override
public void removeDsoEPersonPolicies(Context context, DSpaceObject dso, EPerson ePerson) throws SQLException, AuthorizeException {
resourcePolicyDAO.deleteByDsoEPersonPolicies(context, dso, ePerson);
context.turnOffAuthorisationSystem();
contentServiceFactory.getDSpaceObjectService(dso).updateLastModified(context, dso);
context.restoreAuthSystemState();
}
@Override
public void removeGroupPolicies(Context c, Group group) throws SQLException {
resourcePolicyDAO.deleteByGroup(c, group);
}
@Override
public void removePolicies(Context c, DSpaceObject o, int actionId) throws SQLException, AuthorizeException {
if (actionId == -1)
{
removeAllPolicies(c, o);
}else{
resourcePolicyDAO.deleteByDsoAndAction(c, o, actionId);
c.turnOffAuthorisationSystem();
contentServiceFactory.getDSpaceObjectService(o).updateLastModified(c, o);
c.restoreAuthSystemState();
}
}
@Override
public void removeDsoAndTypeNotEqualsToPolicies(Context c, DSpaceObject o, String type) throws SQLException, AuthorizeException {
resourcePolicyDAO.deleteByDsoAndTypeNotEqualsTo(c, o, type);
c.turnOffAuthorisationSystem();
contentServiceFactory.getDSpaceObjectService(o).updateLastModified(c, o);
c.restoreAuthSystemState();
}
/**
* Update the ResourcePolicy
* @param context context
* @param resourcePolicy resource policy
* @throws SQLException if database error
* @throws AuthorizeException if authorization error
*/
@Override
public void update(Context context, ResourcePolicy resourcePolicy) throws SQLException, AuthorizeException {
update(context, Collections.singletonList(resourcePolicy));
}
/**
* Update the ResourcePolicies
*/
@Override
public void update(Context context, List<ResourcePolicy> resourcePolicies) throws SQLException, AuthorizeException {
if(CollectionUtils.isNotEmpty(resourcePolicies)) {
Set<DSpaceObject> relatedDSpaceObjects = new HashSet<>();
for (ResourcePolicy resourcePolicy : resourcePolicies) {
if (resourcePolicy.getdSpaceObject() != null) {
relatedDSpaceObjects.add(resourcePolicy.getdSpaceObject());
}
// FIXME: Check authorisation
resourcePolicyDAO.save(context, resourcePolicy);
}
//Update the last modified timestamp of all related DSpace Objects
context.turnOffAuthorisationSystem();
for (DSpaceObject dSpaceObject : relatedDSpaceObjects) {
//A policy for a DSpace Object has been modified, fire a modify event on the DSpace object
contentServiceFactory.getDSpaceObjectService(dSpaceObject).updateLastModified(context, dSpaceObject);
}
context.restoreAuthSystemState();
}
}
}