001    package ifs.example.tt;
002    
003    import ifs.model.*;
004    import ifs.util.*;
005    import java.util.*;
006    
007    /**
008     * Activity (variable).
009     * It encodes a name, length 
010     * 
011     * @author <a href="mailto:muller@ktiml.mff.cuni.cz">Tomáš Müller</a>
012     * @version 1.0
013     */
014    public class Activity extends Variable {
015        private static org.apache.log4j.Logger sLogger = org.apache.log4j.Logger.getLogger(Activity.class);
016        private int iLength = 1;
017        private String iActivityId = null;
018        private String iName = null;
019        private Vector iResorces = new FastVector();
020        private Set iProhibitedSlots = new HashSet();
021        private Set iDiscouragedSlots = new HashSet();
022        
023        public Activity(int length, String id, String name) {
024            super(null);
025            iLength = length;
026            iActivityId = id;
027            iName = name;
028        }
029        
030        public String getName() { return iName; }
031        public String getActivityId() { return iActivityId; }
032        
033        public int getLength() { return iLength; }
034        
035        public void addResourceGroup(Vector resources) {
036            for (Enumeration e=resources.elements();e.hasMoreElements();) {
037                ((Resource)e.nextElement()).addVariable(this);
038            }
039            iResorces.add(resources);
040        }
041        public void addResourceGroup(Resource[] resources) {
042            Vector rg = new FastVector(resources.length);
043            for (int i=0;i<resources.length;i++) {
044                rg.addElement(resources[i]);
045                resources[i].addVariable(this);
046            }
047            iResorces.add(rg);
048        }
049        public void addResourceGroup(Resource resource) {
050            Vector rg = new FastVector(1);
051            rg.addElement(resource);
052            iResorces.add(rg);
053            resource.addVariable(this);
054        }
055        public Vector getResourceGroup(int idx) {
056            return (Vector)iResorces.elementAt(idx);
057        }
058        public Vector getResourceGroups() {
059            return iResorces;
060        }
061        public Set getProhibitedSlots() { return iProhibitedSlots; }
062        public Set getDiscouragedSlots() { return iDiscouragedSlots; }
063        public void addProhibitedSlot(int day, int hour) {
064            iProhibitedSlots.add(new Integer(((TimetableModel)getModel()).getNrHours()*day+hour));
065        }
066        public void addDiscouragedSlot(int day, int hour) {
067            iDiscouragedSlots.add(new Integer(((TimetableModel)getModel()).getNrHours()*day+hour));
068        }
069        public boolean isProhibitedSlot(int day, int hour) {
070            return iProhibitedSlots.contains(new Integer(((TimetableModel)getModel()).getNrHours()*day+hour));
071        }
072        public boolean isDiscouragedSlot(int day, int hour) {
073            return iDiscouragedSlots.contains(new Integer(((TimetableModel)getModel()).getNrHours()*day+hour));
074        }
075        public void addProhibitedSlot(int slot) {
076            iProhibitedSlots.add(new Integer(slot));
077        }
078        public void addDiscouragedSlot(int slot) {
079            iDiscouragedSlots.add(new Integer(slot));
080        }
081        public boolean isProhibitedSlot(int slot) {
082            return iProhibitedSlots.contains(new Integer(slot));
083        }
084        public boolean isDiscouragedSlot(int slot) {
085            return iDiscouragedSlots.contains(new Integer(slot));
086        }
087        public boolean isProhibited(int day, int hour, int length) {
088            int slot = ((TimetableModel)getModel()).getNrHours()*day+hour;
089            for (int i=0;i<length;i++)
090                if (iProhibitedSlots.contains(new Integer(slot+i))) return true;
091            return false;
092        }
093        public void init() {
094            setValues(computeValues());
095        }
096        
097        private void addValues(Vector values, int day, int hour, int level, Resource[] resources) {
098            if (level==getResourceGroups().size()) {
099                values.addElement(new Location(this, day, hour, (Resource[])resources.clone()));
100                return;
101            }
102            Vector rg = (Vector)getResourceGroups().elementAt(level);
103            for (Enumeration f=rg.elements();f.hasMoreElements();) {
104                Resource r = (Resource)f.nextElement();
105                if (r.isProhibited(day, hour, getLength())) continue;
106                resources[level]=r;
107                addValues(values, day, hour, level+1, resources);
108            }
109        }
110        
111        public Vector computeValues() {
112            TimetableModel m = (TimetableModel)getModel();
113            Vector values = new FastVector();
114            Resource[] res = new Resource[getResourceGroups().size()];
115            for (int day=0;day<m.getNrDays();day++)
116                for (int hour=0;hour<=m.getNrHours()-getLength();hour++) {
117                    if (isProhibited(day,hour,getLength())) continue;
118                    addValues(values, day, hour, 0, res);
119                }
120            return values;
121        }
122    }