/*
* Licensed Materials - Property of Perforce Software, Inc.
* © Copyright Perforce Software, Inc. 2014, 2021
* © Copyright IBM Corp. 2009, 2014
* © Copyright ILOG 1996, 2009
* All Rights Reserved.
*
* Note to U.S. Government Users Restricted Rights:
* The Software and Documentation were developed at private expense and
* are "Commercial Items" as that term is defined at 48 CFR 2.101,
* consisting of "Commercial Computer Software" and
* "Commercial Computer Software Documentation", as such terms are
* used in 48 CFR 12.212 or 48 CFR 227.7202-1 through 227.7202-4,
* as applicable.
*/
package shared.data;
import ilog.views.gantt.*;
import ilog.views.gantt.model.IlvDefaultGanttModel;
import ilog.views.util.time.IlvCalendarUtil;
import java.util.Calendar;
import java.util.Date;
public class SimpleEngineeringProject extends IlvDefaultGanttModel
{
protected IlvActivityFactory activityFactory;
protected IlvResourceFactory resourceFactory;
protected IlvConstraintFactory constraintFactory;
protected IlvReservationFactory reservationFactory;
protected Calendar calendar;
/**
* Creates a new data model using the specified data factories.
*/
public SimpleEngineeringProject(IlvActivityFactory activityFactory,
IlvResourceFactory resourceFactory,
IlvConstraintFactory constraintFactory,
IlvReservationFactory reservationFactory) {
this.activityFactory = activityFactory;
this.resourceFactory = resourceFactory;
this.constraintFactory = constraintFactory;
this.reservationFactory = reservationFactory;
init();
}
/**
* Creates a new data model using the data factories of the specified chart.
*/
public SimpleEngineeringProject(IlvHierarchyChart chart) {
this(chart.getActivityFactory(),
chart.getResourceFactory(),
chart.getConstraintFactory(),
chart.getReservationFactory());
}
/**
* Requests the activity factory to create an activity with the
* specified parameters.
* @param id The activity ID.
* @param name The activity name.
* @param start The start time of the activity.
* @param duration The duration of the activity.
* @return The new activity.
*/
protected IlvActivity createActivity(String id, String name, Date start,
IlvDuration duration) {
return createActivity(id, name, start, IlvTimeUtil.add(start, duration));
}
/**
* Requests the activity factory to create an activity with the
* specified parameters.
* @param id The activity ID.
* @param name The activity name.
* @param start The start time of the activity.
* @param end The end time of the activity.
* @return The new activity.
*/
protected IlvActivity createActivity(String id, String name,
Date start, Date end) {
// The activity factory will create an IlvActivity implementation of the
// desired class, but only its time interval will be initialized. All of
// the other activity properties will have default values that we must
// explicitly set.
IlvActivity activity =
activityFactory.createActivity(new IlvTimeInterval(start, end));
activity.setID(id);
activity.setName(name);
return activity;
}
/**
* Requests the activity factory to create an activity with the
* specified parameters.
* @param id The activity ID.
* @param name The activity name.
* @return The new activity.
*/
protected IlvActivity createActivity(String id, String name) {
return createActivity(id, name, new Date(), IlvDuration.ONE_DAY);
}
/**
* Requests the resource factory to create a resource with the
* specified parameters.
* @param id The resource ID.
* @param name The resource name.
* @return The new resource.
*/
protected IlvResource createResource(String id, String name) {
// The resource factory will create an IlvResource implementation of the
// desired class, but all of its properties will be set to default values.
// Therefore, we explicitly set the resource ID and name property.
IlvResource resource = resourceFactory.createResource();
resource.setID(id);
resource.setName(name);
return resource;
}
/**
* Requests the constraint factory to create a constraint between the
* specified activities.
* @param from The <em>from</em> activity.
* @param to The <em>to</em> activity.
* @param type The constraint type.
* @return The new constraint.
*/
protected IlvConstraint createConstraint(IlvActivity from, IlvActivity to,
IlvConstraintType type) {
IlvConstraint constraint =
constraintFactory.createConstraint(from, to, type);
return constraint;
}
/**
* Requests the reservation factory to create a reservation between
* the specified resource and activity.
* @param resource The resource.
* @param activity The activity.
* @return The new reservation.
*/
protected IlvReservation createReservation(IlvResource resource,
IlvActivity activity) {
IlvReservation reservation =
reservationFactory.createReservation(resource, activity);
return reservation;
}
/**
* Populates the data model with the project schedule.
*/
protected void init() {
calendar = Calendar.getInstance();
IlvCalendarUtil.dayFloor(calendar);
Date now = calendar.getTime();
// Create the example activities.
IlvActivity aRoot;
IlvActivity aGatherReqts;
IlvActivity aTalkToCusts;
IlvActivity aCustomrList;
IlvActivity aContactCust;
IlvActivity aWriteUpReqs;
IlvActivity a_ReviewReqs;
IlvActivity aMarktngSpec;
IlvActivity aDraftSpec_1;
IlvActivity aDraftSpec_2;
IlvActivity a_EngMktSpec;
IlvActivity aPrfOfConcpt;
IlvActivity aRoughDesign;
IlvActivity a__CADLayout;
IlvActivity a__Detailing;
IlvActivity aPrototypFab;
IlvActivity aOrderMaterl;
IlvActivity a__Machining;
IlvActivity aBurninTestg;
IlvActivity aPrepareDemo;
IlvActivity aDesignDevel;
IlvActivity aDevelPhase1;
IlvActivity aDevelPhase2;
IlvActivity aDevelPhase3;
IlvActivity a__DocAndPkg;
IlvActivity a_UserManual;
IlvActivity aInstallScpt;
IlvActivity aWebSiteUpdt;
Date startDate = now;
aRoot = createActivity("A-Root", "Project Summary");
setRootActivity(aRoot);
aGatherReqts = createActivity("A-1", "Gather Requirements");
addActivity(aGatherReqts, aRoot);
aTalkToCusts = createActivity("A-1.1", "Talk to customers");
addActivity(aTalkToCusts, aGatherReqts);
aCustomrList =
createActivity("A-1.1.1", "Compile customer list",
startDate,
add(startDate, Calendar.DAY_OF_YEAR, 2)); // 2 days
addActivity(aCustomrList, aTalkToCusts);
startDate = aCustomrList.getEndTime();
aContactCust =
createActivity("A-1.1.2", "Contact customers",
startDate,
add(startDate, Calendar.DAY_OF_YEAR, 8)); // 8 days
addActivity(aContactCust, aTalkToCusts);
startDate = aTalkToCusts.getEndTime();
aWriteUpReqs =
createActivity("A-1.2", "Write up requirements",
startDate,
add(startDate, Calendar.DAY_OF_YEAR, 3)); // 3 days
addActivity(aWriteUpReqs, aGatherReqts);
startDate = add(aWriteUpReqs.getEndTime(),
Calendar.DAY_OF_YEAR, -1); // -1 day
a_ReviewReqs =
createActivity("A-1.3", "Review requirements",
startDate,
add(startDate, Calendar.DAY_OF_YEAR, 5)); // 5 days
addActivity(a_ReviewReqs, aGatherReqts);
aMarktngSpec = createActivity("A-2", "Marketing Specification");
addActivity(aMarktngSpec, aRoot);
startDate = aGatherReqts.getEndTime();
aDraftSpec_1 =
createActivity("A-2.1", "First Draft Specification",
startDate,
add(startDate, Calendar.WEEK_OF_YEAR, 1)); // 1 week
addActivity(aDraftSpec_1, aMarktngSpec);
startDate = aDraftSpec_1.getEndTime();
aDraftSpec_2 =
createActivity("A-2.2", "Second Draft Specification",
startDate,
add(startDate, Calendar.DAY_OF_YEAR, 5)); // 5 days
addActivity(aDraftSpec_2, aMarktngSpec);
startDate = aMarktngSpec.getEndTime();
a_EngMktSpec =
createActivity("A-3", "Engineering Review",
startDate,
add(startDate, Calendar.DAY_OF_YEAR, 10)); // 10 days
addActivity(a_EngMktSpec, aRoot);
aPrfOfConcpt = createActivity("A-4", "Proof of Concept");
addActivity(aPrfOfConcpt, aRoot);
aRoughDesign = createActivity("A-4.1", "Rough Design");
addActivity(aRoughDesign, aPrfOfConcpt);
startDate = a_EngMktSpec.getEndTime();
a__CADLayout =
createActivity("A-4.1.1", "CAD Layout",
startDate,
add(startDate, Calendar.WEEK_OF_YEAR, 2)); // 2 weeks
addActivity(a__CADLayout, aRoughDesign);
startDate = add(a__CADLayout.getEndTime(),
Calendar.DAY_OF_YEAR, -3); // -3 days
a__Detailing =
createActivity("A-4.1.2", "Detailing",
startDate,
add(startDate, Calendar.DAY_OF_YEAR, 10)); // 10 days
addActivity(a__Detailing, aRoughDesign);
aPrototypFab = createActivity("A-4.2", "Fabricate Prototype");
addActivity(aPrototypFab, aPrfOfConcpt);
startDate = add(a__Detailing.getStartTime(),
Calendar.DAY_OF_YEAR, 5); // 5 days
aOrderMaterl =
createActivity("A-4.2.1", "Order Materials",
startDate,
add(startDate, Calendar.DAY_OF_YEAR, 8)); // 8 days
addActivity(aOrderMaterl, aPrototypFab);
startDate = aOrderMaterl.getEndTime();
a__Machining =
createActivity("A-4.2.2", "Machining",
startDate,
add(startDate, Calendar.WEEK_OF_YEAR, 2)); // 2 weeks
addActivity(a__Machining, aPrototypFab);
startDate = a__Machining.getEndTime();
aBurninTestg =
createActivity("A-4.3", "Burn-in Testing",
startDate,
add(startDate, Calendar.WEEK_OF_YEAR, 1)); // 1 week
addActivity(aBurninTestg, aPrfOfConcpt);
startDate = aBurninTestg.getEndTime();
aPrepareDemo =
createActivity("A-4.4", "Prepare Demo",
startDate,
add(startDate, Calendar.WEEK_OF_YEAR, 1)); // 1 week
addActivity(aPrepareDemo, aPrfOfConcpt);
aDesignDevel = createActivity("A-5", "Design and Development");
addActivity(aDesignDevel, aRoot);
startDate = aPrfOfConcpt.getEndTime();
aDevelPhase1 =
createActivity("A-5.1", "Phase I Development",
startDate,
add(startDate, Calendar.WEEK_OF_YEAR, 8)); // 8 weeks
addActivity(aDevelPhase1, aDesignDevel);
startDate = aDevelPhase1.getEndTime();
aDevelPhase2 =
createActivity("A-5.2", "Phase II Development",
startDate,
add(startDate, Calendar.WEEK_OF_YEAR, 6)); // 6 weeks
addActivity(aDevelPhase2, aDesignDevel);
startDate = aDevelPhase2.getEndTime();
aDevelPhase3 =
createActivity("A-5.3", "Phase III Development",
startDate,
add(startDate, Calendar.WEEK_OF_YEAR, 5)); // 5 weeks
addActivity(aDevelPhase3, aDesignDevel);
a__DocAndPkg = createActivity("A-6", "Packaging");
addActivity(a__DocAndPkg, aRoot);
a_UserManual = createActivity("A-6.1", "User Manual",
aDevelPhase2.getStartTime(),
aDevelPhase3.getEndTime());
addActivity(a_UserManual, a__DocAndPkg);
startDate = add(aDevelPhase3.getEndTime(), Calendar.WEEK_OF_YEAR, -2);
aInstallScpt =
createActivity("A-6.2", "Installation Procedures",
startDate,
add(startDate, Calendar.WEEK_OF_YEAR, 4)); // 4 weeks
addActivity(aInstallScpt, a__DocAndPkg);
startDate = aDevelPhase3.getEndTime();
aWebSiteUpdt =
createActivity("A-6.3", "Update WebSite",
startDate,
add(startDate, Calendar.WEEK_OF_YEAR, 2)); // 2 weeks
addActivity(aWebSiteUpdt, a__DocAndPkg);
// Create the schedule constraints.
addConstraint(createConstraint(aGatherReqts, aMarktngSpec,
IlvConstraintType.END_START));
addConstraint(createConstraint(aMarktngSpec, a_EngMktSpec,
IlvConstraintType.END_START));
addConstraint(createConstraint(a_EngMktSpec, aPrfOfConcpt,
IlvConstraintType.END_START));
addConstraint(createConstraint(aPrfOfConcpt, aDesignDevel,
IlvConstraintType.END_START));
addConstraint(createConstraint(aCustomrList, aContactCust,
IlvConstraintType.END_START));
addConstraint(createConstraint(aTalkToCusts, aWriteUpReqs,
IlvConstraintType.END_START));
addConstraint(createConstraint(aWriteUpReqs, a_ReviewReqs,
IlvConstraintType.END_START));
addConstraint(createConstraint(aDraftSpec_1, aDraftSpec_2,
IlvConstraintType.END_START));
addConstraint(createConstraint(a__CADLayout, a__Detailing,
IlvConstraintType.END_START));
addConstraint(createConstraint(a__Detailing, aOrderMaterl,
IlvConstraintType.START_START));
addConstraint(createConstraint(aOrderMaterl, a__Machining,
IlvConstraintType.END_START));
addConstraint(createConstraint(aDevelPhase1, aDevelPhase2,
IlvConstraintType.END_START));
addConstraint(createConstraint(aDevelPhase2, aDevelPhase3,
IlvConstraintType.END_START));
addConstraint(createConstraint(aDevelPhase2, a_UserManual,
IlvConstraintType.START_START));
// Create the schedule resources.
IlvResource rRoot;
IlvResource rMkting;
IlvResource rBMcDnd;
IlvResource rStvKnl;
IlvResource rMkSmth;
IlvResource rLDupnt;
IlvResource rRchDev;
IlvResource rLnDane;
IlvResource rJmHook;
IlvResource rSWashn;
IlvResource rGHoppr;
IlvResource rTMonhn;
IlvResource rDocmtn;
IlvResource rSyLadd;
IlvResource rBRobtn;
rRoot = createResource("JCOM", "JCompany Employees");
setRootResource(rRoot);
rMkting = createResource("MKT", "Marketing");
addResource(rMkting, rRoot);
rBMcDnd = createResource("BM", "Bill McDonald");
addResource(rBMcDnd, rMkting);
rStvKnl = createResource("SK", "Steve Knoll");
addResource(rStvKnl, rMkting);
rMkSmth = createResource("MS", "Michael Smith");
addResource(rMkSmth, rMkting);
rLDupnt = createResource("LP", "Luc Dupont");
addResource(rLDupnt, rMkting);
rRchDev = createResource("RND", "Research and Development");
addResource(rRchDev, rRoot);
rLnDane = createResource("LD", "Linus Dane");
addResource(rLnDane, rRchDev);
rJmHook = createResource("JH", "James Hook");
addResource(rJmHook, rRchDev);
rSWashn = createResource("SW", "Scott Washington");
addResource(rSWashn, rRchDev);
rGHoppr = createResource("GH", "Gill Hopper");
addResource(rGHoppr, rRchDev);
rTMonhn = createResource("TM", "Thomas Monahan");
addResource(rTMonhn, rRchDev);
rDocmtn = createResource("DOC", "Documentation");
addResource(rDocmtn, rRoot);
rSyLadd = createResource("SL", "Sandy Ladd");
addResource(rSyLadd, rDocmtn);
rBRobtn = createResource("BR", "Bob Robertson");
addResource(rBRobtn, rDocmtn);
// Create the schedule reservations.
addReservation(createReservation(rBMcDnd, aTalkToCusts));
addReservation(createReservation(rStvKnl, aCustomrList));
addReservation(createReservation(rMkSmth, aCustomrList));
addReservation(createReservation(rLDupnt, aCustomrList));
addReservation(createReservation(rStvKnl, aContactCust));
addReservation(createReservation(rLDupnt, aContactCust));
addReservation(createReservation(rMkSmth, aWriteUpReqs));
addReservation(createReservation(rBMcDnd, a_ReviewReqs));
addReservation(createReservation(rMkSmth, a_ReviewReqs));
addReservation(createReservation(rLnDane, a_ReviewReqs));
addReservation(createReservation(rMkSmth, aDraftSpec_1));
addReservation(createReservation(rLDupnt, aDraftSpec_1));
addReservation(createReservation(rLDupnt, aDraftSpec_2));
addReservation(createReservation(rBMcDnd, a_EngMktSpec));
addReservation(createReservation(rJmHook, a_EngMktSpec));
addReservation(createReservation(rGHoppr, a_EngMktSpec));
addReservation(createReservation(rLnDane, aPrfOfConcpt));
addReservation(createReservation(rSWashn, aRoughDesign));
addReservation(createReservation(rTMonhn, a__CADLayout));
addReservation(createReservation(rTMonhn, a__Detailing));
addReservation(createReservation(rGHoppr, a__Detailing));
addReservation(createReservation(rJmHook, aPrototypFab));
addReservation(createReservation(rTMonhn, aOrderMaterl));
addReservation(createReservation(rGHoppr, a__Machining));
addReservation(createReservation(rSWashn, aBurninTestg));
addReservation(createReservation(rTMonhn, aBurninTestg));
addReservation(createReservation(rGHoppr, aPrepareDemo));
addReservation(createReservation(rTMonhn, aPrepareDemo));
addReservation(createReservation(rLDupnt, aPrepareDemo));
addReservation(createReservation(rJmHook, aDesignDevel));
addReservation(createReservation(rLnDane, aDevelPhase1));
addReservation(createReservation(rLnDane, aDevelPhase2));
addReservation(createReservation(rSWashn, aDevelPhase2));
addReservation(createReservation(rSWashn, aDevelPhase3));
addReservation(createReservation(rTMonhn, aDevelPhase3));
addReservation(createReservation(rSyLadd, a_UserManual));
addReservation(createReservation(rBRobtn, a_UserManual));
addReservation(createReservation(rBRobtn, aInstallScpt));
addReservation(createReservation(rLnDane, aInstallScpt));
addReservation(createReservation(rSyLadd, aWebSiteUpdt));
addReservation(createReservation(rGHoppr, aWebSiteUpdt));
addReservation(createReservation(rMkSmth, aWebSiteUpdt));
}
private Date add(Date date, int field, int amount) {
calendar.setTime(date);
calendar.add(field, amount);
return calendar.getTime();
}
}