//
// Create an empty MPX or MSPDI file. The filename is passed to
// this method purely to allow it to determine the type of
// file to create.
//
ProjectFile file = new ProjectFile();
//
// Uncomment these lines to test the use of alternative
// delimiters and separators for MPX file output.
//
//file.setDelimiter(';');
//file.setDecimalSeparator(',');
//file.setThousandsSeparator('.');
//
// Add a default calendar called "Standard"
//
ProjectCalendar calendar = file.addDefaultBaseCalendar();
//
// Add a holiday to the calendar to demonstrate calendar exceptions
//
calendar.addCalendarException(df.parse("13/03/2006"), df.parse("13/03/2006"));
//
// Retrieve the project header and set the start date. Note Microsoft
// Project appears to reset all task dates relative to this date, so this
// date must match the start date of the earliest task for you to see
// the expected results. If this value is not set, it will default to
// today's date.
//
ProjectHeader header = file.getProjectHeader();
header.setStartDate(df.parse("01/01/2003"));
//
// Add resources
//
Resource resource1 = file.addResource();
resource1.setName("Resource1");
Resource resource2 = file.addResource();
resource2.setName("Resource2");
//
// This next line is not required, it is here simply to test the
// output file format when alternative separators and delimiters
// are used.
//
resource2.setMaxUnits(Double.valueOf(50.0));
//
// Create a summary task
//
Task task1 = file.addTask();
task1.setName("Summary Task");
//
// Create the first sub task
//
Task task2 = task1.addTask();
task2.setName("First Sub Task");
task2.setDuration(Duration.getInstance(10.5, TimeUnit.DAYS));
task2.setStart(df.parse("01/01/2003"));
//
// We'll set this task up as being 50% complete. If we have no resource
// assignments for this task, this is enough information for MS Project.
// If we do have resource assignments, the assignment record needs to
// contain the corresponding work and actual work fields set to the
// correct values in order for MS project to mark the task as complete
// or partially complete.
//
task2.setPercentageComplete(NumberUtility.getDouble(50.0));
task2.setActualStart(df.parse("01/01/2003"));
//
// Create the second sub task
//
Task task3 = task1.addTask();
task3.setName("Second Sub Task");
task3.setStart(df.parse("11/01/2003"));
task3.setDuration(Duration.getInstance(10, TimeUnit.DAYS));
//
// Link these two tasks
//
task3.addPredecessor(task2, RelationType.FINISH_START, null);
//
// Add a milestone
//
Task milestone1 = task1.addTask();
milestone1.setName("Milestone");
milestone1.setStart(df.parse("21/01/2003"));
milestone1.setDuration(Duration.getInstance(0, TimeUnit.DAYS));
milestone1.addPredecessor(task3, RelationType.FINISH_START, null);
//
// This final task has a percent complete value, but no
// resource assignments. This is an interesting case it it requires
// special processing to generate the MSPDI file correctly.
//
Task task4 = file.addTask();
task4.setName("Next Task");
task4.setDuration(Duration.getInstance(8, TimeUnit.DAYS));
task4.setStart(df.parse("01/01/2003"));
task4.setPercentageComplete(NumberUtility.getDouble(70.0));
task4.setActualStart(df.parse("01/01/2003"));
//
// Assign resources to tasks
//
ResourceAssignment assignment1 = task2.addResourceAssignment(resource1);
ResourceAssignment assignment2 = task3.addResourceAssignment(resource2);
//
// As the first task is partially complete, and we are adding
// a resource assignment, we must set the work and actual work
// fields in the assignment to appropriate values, or MS Project
// won't recognise the task as being complete or partially complete
//
assignment1.setWork(Duration.getInstance(80, TimeUnit.HOURS));
assignment1.setActualWork(Duration.getInstance(40, TimeUnit.HOURS));
//
// If we were just generating an MPX file, we would already have enough
// attributes set to create the file correctly. If we want to generate
// an MSPDI file, we must also set the assignment start dates and
// the remaining work attribute. The assignment start dates will normally
// be the same as the task start dates.
//
assignment1.setRemainingWork(Duration.getInstance(40, TimeUnit.HOURS));
assignment2.setRemainingWork(Duration.getInstance(80, TimeUnit.HOURS));
assignment1.setStart(df.parse("01/01/2003"));
assignment2.setStart(df.parse("11/01/2003"));
//
// Write a 100% complete task
//
Task task5 = file.addTask();
task5.setName("Last Task");
task5.setDuration(Duration.getInstance(3, TimeUnit.DAYS));
task5.setStart(df.parse("01/01/2003"));
task5.setPercentageComplete(NumberUtility.getDouble(100.0));
task5.setActualStart(df.parse("01/01/2003"));