/* * file: MpxCreate.java * author: Jon Iles * copyright: (c) Packwood Software 2002-2003 * date: 08/02/2003 */ /* * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by the * Free Software Foundation; either version 2.1 of the License, or (at your * option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ package net.sf.mpxj.sample; import java.text.SimpleDateFormat; import net.sf.mpxj.Duration; import net.sf.mpxj.ProjectCalendar; import net.sf.mpxj.ProjectFile; import net.sf.mpxj.ProjectProperties; import net.sf.mpxj.RelationType; import net.sf.mpxj.Resource; import net.sf.mpxj.ResourceAssignment; import net.sf.mpxj.Task; import net.sf.mpxj.TimeUnit; import net.sf.mpxj.common.NumberHelper; import net.sf.mpxj.mpx.MPXWriter; import net.sf.mpxj.mspdi.MSPDIWriter; import net.sf.mpxj.writer.ProjectWriter; /** * This example illustrates creation of an MPX or an MSPDI file from scratch. * The output type of the file generated by this class depends on the file * name extension supplied by the user. A .xml extension will generate an * MSPDI file, anything else will generate an MPX file. */ public class MpxjCreate { /** * Main method. * * @param args array of command line arguments */ public static void main(String[] args) { try { if (args.length != 1) { System.out.println("Usage: MpxCreate <output file name>"); } else { create(args[0]); } } catch (Exception ex) { ex.printStackTrace(System.out); } } /** * Creates a writer which will generate the required type of output file. * * @param filename file name * @return ProjectWriter instance */ private static ProjectWriter getWriter(String filename) { ProjectWriter result; String suffix; if (filename.length() < 4) { suffix = ".MPX"; } else { suffix = filename.substring(filename.length() - 4).toUpperCase(); } if (suffix.equals(".XML") == true) { result = new MSPDIWriter(); } else { result = new MPXWriter(); } return (result); } /** * This method creates a summary task, two sub-tasks and a milestone, * all with the appropriate constraints between them. The tasks are * assigned to two resources. Note that Microsoft Project is fussy * about the order in which things appear in the file. If you are going * to assign resources to tasks, the resources must appear in the * file before the tasks. * * @param filename output file name */ private static void create(String filename) throws Exception { // // Create a simple date format to allow us to // easily set date values. // SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy"); // // Create a ProjectFile instance // 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 properties 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. // ProjectProperties properties = file.getProjectProperties(); properties.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(NumberHelper.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(NumberHelper.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(NumberHelper.getDouble(100.0)); task5.setActualStart(df.parse("01/01/2003")); // // Write the file // ProjectWriter writer = getWriter(filename); writer.write(file, filename); } }