    001    package ifs.example.tt;
    002
    003    import ifs.model.*;
    004    import java.util.*;
    005
    006    /**
    007     * Location (value, i.e., a single placement of the activity).
    008     * Location encodes a slot and a selection of resources.
    009     *
    010     * @author <a href="mailto:muller@ktiml.mff.cuni.cz">Tomáš Müller</a>
    011     * @version 1.0
    012     */
    013    public class Location extends Value {
    014        private int iSlot;
    015        private Resource[] iResources;
    016        private int iNrOfDiscouragedSlots = -1;
    017
    018        /**
    019         * Constructor.
    020         * @param activity parent activity
    021         * @param slot starting time
    022         * @param resources selection of resources
    023         */
    024        public Location(Activity activity, int slot, Resource[] resources) {
    025            super(activity);
    026            iSlot = slot;
    027            iResources = resources;
    028            iNrOfDiscouragedSlots = computeNrOfDiscouragedSlots();
    029        }
    030
    031        /**
    032         * Constructor. slot = nrHours * day + hour
    033         * @param activity parent activity
    034         * @param day day
    035         * @param hour starting hour
    036         * @param resources required resources
    037         */
    038        public Location(Activity activity, int day, int hour, Resource[] resources) {
    039            super(activity);
    040            iSlot = ((TimetableModel)activity.getModel()).getNrHours()*day + hour;
    041            iResources = resources;
    042            iNrOfDiscouragedSlots = computeNrOfDiscouragedSlots();
    043        }
    044
    045        /** Gets slot */
    046        public int getSlot() { return iSlot; }
    047        /** Gets selection of resources */
    048        public Resource[] getResources() { return iResources; }
    049        /** Gets given resource */
    050        public Resource getResource(int idx) { return iResources[idx]; }
    051        /** Returns true if the given resource is used by this location */
    052        public boolean containResource(Resource resource) {
    053            for (int i=0;i<iResources.length;i++)
    054                if (iResources[i].equals(resource)) return true;
    055            return false;
    056        }
    057
    058        /** Number of slots (over all resources) which are discouraged */
    059        public int getNrOfDiscouragedSlots() { return iNrOfDiscouragedSlots; }
    060        /** Int value (for optimization) -- getNrOfDiscouragedSlots() is returned */
    061        public int toInt() { return iNrOfDiscouragedSlots; }
    062        /** Computes number of discouraged slots (over all resources and the activity) */
    063        public int computeNrOfDiscouragedSlots() {
    064            Activity a = (Activity)variable();
    065            int ret = 0;
    066            for (int i=getSlot();i<getSlot()+a.getLength();i++) {
    067                if (a.isDiscouragedSlot(i)) ret++;
    068                for (int j=0;j<getResources().length;j++)
    069                    if (getResource(j).isDiscouragedSlot(i)) ret++;
    070            }
    071            return ret;
    072        }
    073        /**
    074         * Returns true if the location intersects with another location.
    075         * This means the same resource is used in the same time.
    076         */
    077        public boolean hasIntersection(Location location) {
    078            int s1 = getSlot();
    079            int l1 = ((Activity)variable()).getLength();
    080            int s2 = location.getSlot();
    081            int l2 = ((Activity)location.variable()).getLength();
    082            return !(s1+l1<=s2 || s2+l2<=s1);
    083        }
    084        /**
    085         * Returns true if the location is prohibited.
    086         * This means that the activity or a required resource has a time slot which is used by this location prohibited.
    087         */
    088        public boolean isProhibited() {
    089            Activity a = (Activity)variable();
    090            for (int i=getSlot();i<getSlot()+a.getLength();i++) {
    091                if (a.isProhibitedSlot(i)) return true;
    092                for (int j=0;j<getResources().length;j++)
    093                    if (getResource(j).isProhibitedSlot(i)) return true;
    094            }
    095            return false;
    096        }
    097
    098        public String getName() {
    099            StringBuffer sb = new StringBuffer(getSlot()+"/");
    100            for (int i=0;i<iResources.length;i++) {
    101                if (i>0) sb.append(",");
    102                sb.append(iResources[i].getName());
    103            }
    104            return sb.toString();
    105        }
    106    }