/** * 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 java.sql.SQLException; import java.util.Date; import org.apache.log4j.Logger; import org.dspace.content.DSpaceObject; import org.dspace.core.Constants; import org.dspace.core.Context; import org.dspace.eperson.EPerson; import org.dspace.eperson.Group; import org.dspace.storage.rdbms.DatabaseManager; import org.dspace.storage.rdbms.TableRow; /** * Class representing a ResourcePolicy * * @author David Stuve * @version $Revision$ */ public class ResourcePolicy { /** log4j logger */ private static Logger log = Logger.getLogger(ResourcePolicy.class); /** Our context */ private Context myContext; /** The row in the table representing this object */ private TableRow myRow; /** * Construct an ResourcePolicy * * @param context * the context this object exists in * @param row * the corresponding row in the table */ ResourcePolicy(Context context, TableRow row) { myContext = context; myRow = row; } /** * Return true if this object equals obj, false otherwise. * * @param obj * @return true if ResourcePolicy objects are equal */ @Override public boolean equals(Object obj) { try { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final ResourcePolicy other = (ResourcePolicy) obj; if (this.getAction() != other.getAction()) { return false; } if (this.getEPerson() != other.getEPerson() && (this.getEPerson() == null || !this.getEPerson().equals(other.getEPerson()))) { return false; } if (this.getGroup() != other.getGroup() && (this.getGroup() == null || !this.getGroup().equals(other.getGroup()))) { return false; } if (this.getStartDate() != other.getStartDate() && (this.getStartDate() == null || !this.getStartDate().equals(other.getStartDate()))) { return false; } if (this.getEndDate() != other.getEndDate() && (this.getEndDate() == null || !this.getEndDate().equals(other.getEndDate()))) { return false; } return true; } catch (SQLException ex) { log.error("Error while comparing ResourcePolicy objects", ex); } return false; } /** * Return a hash code for this object. * * @return int hash of object */ @Override public int hashCode() { int hash = 7; try { hash = 19 * hash + this.getAction(); hash = 19 * hash + (this.getEPerson() != null? this.getEPerson().hashCode():0); hash = 19 * hash + (this.getGroup() != null? this.getGroup().hashCode():0); hash = 19 * hash + (this.getStartDate() != null? this.getStartDate().hashCode():0); hash = 19 * hash + (this.getEndDate() != null? this.getEndDate().hashCode():0); hash = 19 * hash + (this.getEPerson() != null? this.getEPerson().hashCode():0); } catch (SQLException ex) { log.error("Error generating hascode of ResourcePolicy", ex); } return hash; } /** * 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. */ public static ResourcePolicy find(Context context, int id) throws SQLException { TableRow row = DatabaseManager.find(context, "ResourcePolicy", id); if (row == null) { return null; } else { return new ResourcePolicy(context, row); } } /** * Create a new ResourcePolicy * * @param context * DSpace context object */ public static ResourcePolicy create(Context context) throws SQLException, AuthorizeException { // FIXME: Check authorisation // Create a table row TableRow row = DatabaseManager.create(context, "ResourcePolicy"); return new ResourcePolicy(context, row); } /** * Delete an ResourcePolicy * */ public void delete() throws SQLException { // FIXME: authorizations // Remove ourself DatabaseManager.delete(myContext, myRow); } /** * Get the e-person's internal identifier * * @return the internal identifier */ public int getID() { return myRow.getIntColumn("policy_id"); } /** * Get the type of the objects referred to by policy * * @return type of object/resource */ public int getResourceType() { return myRow.getIntColumn("resource_type_id"); } /** * set both type and id of resource referred to by policy * */ public void setResource(DSpaceObject o) { setResourceType(o.getType()); setResourceID(o.getID()); } /** * Set the type of the resource referred to by the policy * * @param mytype * type of the resource */ public void setResourceType(int mytype) { myRow.setColumn("resource_type_id", mytype); } /** * Get the ID of a resource pointed to by the policy (is null if policy * doesn't apply to a single resource.) * * @return resource_id */ public int getResourceID() { return myRow.getIntColumn("resource_id"); } /** * If the policy refers to a single resource, this is the ID of that * resource. * * @param myid id of resource (database primary key) */ public void setResourceID(int myid) { myRow.setColumn("resource_id", myid); } /** * @return get the action this policy authorizes */ public int getAction() { return myRow.getIntColumn("action_id"); } /** * @return action text or 'null' if action row empty */ public String getActionText() { int myAction = myRow.getIntColumn("action_id"); if (myAction == -1) { return "..."; } else { return Constants.actionText[myAction]; } } /** * set the action this policy authorizes * * @param myid action ID from <code>org.dspace.core.Constants</code> */ public void setAction(int myid) { myRow.setColumn("action_id", myid); } /** * @return eperson ID, or -1 if EPerson not set */ public int getEPersonID() { return myRow.getIntColumn("eperson_id"); } /** * get EPerson this policy relates to * * @return EPerson, or null */ public EPerson getEPerson() throws SQLException { int eid = myRow.getIntColumn("eperson_id"); if (eid == -1) { return null; } return EPerson.find(myContext, eid); } /** * assign an EPerson to this policy * * @param e EPerson */ public void setEPerson(EPerson e) { if (e != null) { myRow.setColumn("eperson_id", e.getID()); } else { myRow.setColumnNull("eperson_id"); } } /** * gets ID for Group referred to by this policy * * @return groupID, or -1 if no group set */ public int getGroupID() { return myRow.getIntColumn("epersongroup_id"); } /** * gets Group for this policy * * @return Group, or -1 if no group set */ public Group getGroup() throws SQLException { int gid = myRow.getIntColumn("epersongroup_id"); if (gid == -1) { return null; } else { return Group.find(myContext, gid); } } /** * set Group for this policy * * @param g group */ public void setGroup(Group g) { if (g != null) { myRow.setColumn("epersongroup_id", g.getID()); } else { myRow.setColumnNull("epersongroup_id"); } } /** * figures out if the date is valid for the policy * * @return true if policy has begun and hasn't expired yet (or no dates are * set) */ public boolean isDateValid() { Date sd = getStartDate(); Date ed = 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 } /** * Get the start date of the policy * * @return start date, or null if there is no start date set (probably most * common case) */ public java.util.Date getStartDate() { return myRow.getDateColumn("start_date"); } /** * Set the start date for the policy * * @param d * date, or null for no start date */ public void setStartDate(java.util.Date d) { myRow.setColumn("start_date", d); } /** * Get end date for the policy * * @return end date or null for no end date */ public java.util.Date getEndDate() { return myRow.getDateColumn("end_date"); } /** * Set end date for the policy * * @param d * end date, or null */ public void setEndDate(java.util.Date d) { myRow.setColumn("end_date", d); } /** * Update the ResourcePolicy */ public void update() throws SQLException { // FIXME: Check authorisation DatabaseManager.update(myContext, myRow); } }