/** * */ package vroom.trsp.datamodel; import vroom.common.modeling.dataModel.Node; import vroom.common.modeling.dataModel.Request; import vroom.common.modeling.dataModel.attributes.AttributeWithIdSet; import vroom.common.modeling.dataModel.attributes.IReleaseDate; import vroom.common.modeling.dataModel.attributes.IRequestAttribute; import vroom.common.modeling.dataModel.attributes.ITimeWindow; import vroom.common.modeling.dataModel.attributes.RequestAttributeKey; import vroom.common.modeling.dataModel.attributes.AttributeWithIdSet.AttributeSetType; import vroom.common.utilities.IToShortString; import vroom.common.utilities.Utilities; import vroom.common.utilities.dataModel.IObjectWithID; /** * The Class <code>TRSPRequest</code> is a definition of a request for the TRSP. * <p> * Creation date: Feb 11, 2011 - 1:32:16 PM * * @author Victor Pillac, <a href="http://uniandes.edu.co">Universidad de Los Andes</a>-<a * href="http://copa.uniandes.edu.co">Copa</a> <a href="http://www.emn.fr">Ecole des Mines de Nantes</a>-<a * href="http://www.irccyn.ec-nantes.fr/irccyn/d/en/equipes/Slp">SLP</a> * @version 2.0 */ public class TRSPRequest extends Request implements IObjectWithID, ITRSPNode, IToShortString { private final int mID; private final Node mNode; private final AttributeWithIdSet mSkillSet; private final AttributeWithIdSet mToolSet; private final int[] mSpareReq; private final ITimeWindow mTW; private final double mServiceTime; private double mReleaseDate = -1; private double mArrivalTime; /** * Creates a new <code>TRSPRequest</code> * * @param id * the request id * @param node * the associated node * @param skills * the set of skills required to service this request * @param tools * the set of tools required to service this request * @param spare * the demand for each of the spare part types * @param tw * the time window for this request * @param serviceTime * the service time for this request */ public TRSPRequest(int id, Node node, int[] skills, int[] tools, int[] spare, ITimeWindow tw, double serviceTime) { super(id, node); mID = id; mNode = node; mSkillSet = new AttributeWithIdSet(AttributeSetType.Requirement, skills); mToolSet = new AttributeWithIdSet(AttributeSetType.Requirement, tools); mSpareReq = spare; mTW = tw; mServiceTime = serviceTime; mArrivalTime = Double.NaN; } /** * Getter for <code>iD</code> * * @return the iD */ @Override public int getID() { return mID; } /** * Getter for <code>node</code> * * @return the node */ @Override public Node getNode() { return mNode; } /** * Getter for the skill set. * * @return the skill set associated with this request */ public AttributeWithIdSet getSkillSet() { return mSkillSet; } /** * Getter for the tool set. * * @return the tool set associated with this request */ public AttributeWithIdSet getToolSet() { return mToolSet; } /** * Gets the time window. * * @return the time window */ @Override public ITimeWindow getTimeWindow() { return mTW; } /** * Getter for the service time * * @return the time required to serve this request */ @Override public double getServiceTime() { return mServiceTime; } /** * Return the {@linkplain RequestAttributeKey#RELEASE_DATE release date} of this request * * @return the {@linkplain RequestAttributeKey#RELEASE_DATE release date} of this request */ public double getReleaseDate() { return mReleaseDate; } /** * Getter for the number of required spare parts * * @param type * the considered type of spare parts * @return the number of required spare parts of type <code>type</code> * @see #getDemand(int) */ public int getSparePartRequirement(int type) { return mSpareReq[type]; } /** * Returns an array containing the spare parts requirements * <p> * Note that the returned array is independent from the internal representation of the requirements * </p> * * @return an array containing the spare parts requirements * @see #getSparePartRequirements() */ public int[] getSparePartRequirements() { return mSpareReq; } @Override public IRequestAttribute setAttribute(RequestAttributeKey<?> attributeKey, IRequestAttribute value) { if (attributeKey == RequestAttributeKey.RELEASE_DATE) mReleaseDate = value != null ? ((IReleaseDate) value).doubleValue() : -1; return super.setAttribute(attributeKey, value); } @Override public double getArrivalTime() { if (Double.isNaN(mArrivalTime)) throw new IllegalStateException("ArrivalTime time is not defined for request " + mID); return mArrivalTime; } @Override public void setArrivalTime(double arrival) { mArrivalTime = arrival; } /* * (non-Javadoc) * @see vroom.common.modeling.dataModel.Vehicle#toString() */ @Override public String toString() { return String.format("%s loc:%s tw:%s s:%s sk:%s tl:%s sp:%s", getID(), getNode() .getLocation(), getTimeWindow(), getServiceTime(), getSkillSet().toString(), getToolSet().toString(), Utilities.toShortString(getSparePartRequirements())); } @Override public String toShortString() { return "" + getID(); } @Override public String getDescription() { return String.format("%s%-3s", getType().toShortString(), getID()); } @Override public NodeType getType() { return NodeType.REQUEST; } }