Added the Project Properties attribute Relationship Lag Calendar and implemented read and write support for this for P6 schedules. (Contributed by Rohit Sinha).
Improve compatibility of PMXML files with P6 EPPM by moving the Schedule Options tag.
Ensure Baseline Projects in PMXML files include Schedule Options and Location Object ID.
Updates to improve compatibility with versions of Java after Java 8.
Ensure timestamps with fractional sections are read correctly from Phoenix PPX files (Based on a contribution by Rohit Sinha).
Improve handling of double quotes when reading and writing XER files.
To allow XER files written by MPXJ to be imported correctly by P6, ensure that they have a single top level WBS entry (Based on a contribution by Alex Matatov)
Ensure that ProjectProperties.getCustomProperties() returns an empty Map rather than returning null if no custom properties have been configured.
Ensure project calendars and project activity codes are nested within the project tag of PMXML files.
Fix an issue preventing native SQLite library from loading when using the .Net version of MPXJ on macOS.
Write schedule options to PMXML abd XER files.
Fix an arithmetic error in RateHelper when converting a rate from minutes to hours.
Introduced new methods to RateHelper accepting a TimeUnitDefaultsContainer argument rather than a ProjectFile for greater flexibility. Marked methods taking a ProjectFile argument as deprecated.
Ensure Early Finish and Late Finish are populated for Asta milestones and tasks.
Don't attempt to calculate total slack if start slack or finish slack are missing.
Ensure completed tasks are not marked as critical.
Improve handling of non-standard Boolean values in MPX files.
Improve Total Slack calculation for P6 projects.
Handle finish milestones with null actual start date for actual duration calculation when reading PMXML files (Contributed by Andrew Marks).
Ensure that the Fixed Cost attribute is rolled up from activities to WBS entries when reading P6 schedules.
Improve resource hierarchy handling.
Improve handling of external tasks read from MSPDI files.
Improve handling of resource assignments read from Asta PP files containing multiple baselines.
Improve filtering to ignore hammock tasks in Asta PP files and ensure that non-hammock items are not incorrectly ignored.
Improve handling of bars without additional linked data read from Asta PP files.
Ensure that invalid duplicate Unique ID values encountered when reading schedule data are renumbered to maintain uniqueness.
Improve reading certain FastTrack FTS files.
Roll up the expense item at completion values read from P6 schedules to the task Fixed Cost attribute.
NOTE: this is a major version release, breaking changes have been made to the MPXJ API as documented below.
Timestamps, dates, and times are now represented by java.time.LocalDateTime, java.time.LocalDate and java.time.LocalTime respectively, rather than java.util.Date as they were originally.
For .Net users, new ToDateTime and ToNullableDateTime extension methods have been provided to convert java.time.LocalDateTime, java.time.LocalDate, java.time.LocalTime to DateTime instances.
For .Net users, new ToJavaLocalDateTime, ToJavaLocalDate and ToJavaLocalTime extension methods have been provided to convert DateTime instances to java.time.LocalDateTime, java.time.LocalDate, and java.time.LocalTime.
The class net.sf.mpxj.Day has been replaced by java.time.DayOfWeek.
All code previously marked as deprecated has been removed.
Added support for reading and writing the Activity attribute "Expected Finish" for P6 schedules.
Improve accuracy of dates read from Synchro, Suretrak and Turboproject files.
By default ignore errors in individual records read from XER files. This matches P6's behavior when importing XER files. Use the PrimaveraXERFileReader.setIgnoreErrors method to change the behavior.
When writing an XER file, provide the necessary default values to allow non-P6 schedules to be successfully imported into P6.
Ensure multi-day exceptions are written to XER files correctly.
Ensure GanttProject exception dates are read correctly.
More closely match the Planner predecessor lag calculation.
Ensure that java.sql.Date values are correctly formatted when writing XER files.
When reading from a P6 database, check to ensure the location table is present before attemting to read locations.
Improve accuracy of calendar data read from certain Powerproject schedules.
Improve handling of unusual XER files with calendar time ranges expressed in 12-hour format.
Correctly parse midnight represented as 24:00:00 from MSPDI files written by certain non-Microsoft Project applications.
For MSPDI files produced by applications other than Microsoft Project which have an incorrectly nested calendar hierarchy, avoid pruning derived calendars which are referenced elsewhere in the hierarchy.
Improve read performance when working with large schedules.
Improve read and write performance of code handling resource calendars.
Updated to use sqlite-jdbc 22.214.171.124
Added the ability to read Subproject data embedded in MSPDI files.
Added the ability to read timephased baseline work and cost from MSPDI files.
Added the ability to write timephased baseline work and cost to MSPDI files.
Improve accuracy of timephased baseline work read from MPP files.
Ensure that non-recurring calendar exceptions take precedence over recurring calendar exceptions.
Avoid creating duplicate calendar exceptions when reading Asta PP files.
Added the Bar Name attribute to Task, which is accessed using the getBarName and setBarName methods. This is populated with the name of the bar to which a task belongs when reading an Asta Powerproject schedule.
When reading schedules from XER files and P6 databases, ensure durations without a value are returned as null rather than as a zero duration.
Added the "Resource Pool File" attribute to ProjectProperties, which represents the full path of the resource pool used by an MPP file. This attribute is accessible via the getResourcePoolFile and setResourcePoolFile methods.
Added the getResourcePoolObject method to allow the resource pool file to be located and read
Added support for reading the task attribute Subproject GUID from MPP files. This attribute can be accessed via the getSubprojectGUID and setSubprojectGUID methods.
Added support for the task attribute "External Project". When this attribute is true it indicates that the task represents a subproject. The attribute is accessed via the getExternalProject and setExternalProject methods.
When reading an MSPDI file with external task predecessors, MPXJ now attempts to recreate the placeholder external tasks which would be present if the equivalent MPP file was read.
External task predecessors are now represented when writing an MSPDI file.
Added the Task method getSubprojectObject which allows the caller to retrieve a ProjectFile instance representing the external project linked to a task.
Added the Task method expandSubproject. For task which represent an external project, this method automatically loads the external project and attaches the tasks it contains as children of the current task. This is analogous to the behavior in Microsoft Project where a subproject is expanded to reveal the tasks it contains.
Added the ProjectFile method expandSubprojects which identifies any tasks in the project which represent an external project and expands them, linking the tasks from the external project as children of the task in the parent project. Note that the method works recursively so multiple levels of external tasks will be expanded.
Updated to ensure that the internal_name attribute of a UserdefinedField is generated if not present.
Updated to avoid an exception when reading notebook topics from PMXML files.
Marked the Task method setSubprojectName as deprecated. Use the setSubProjectFile method instead.
Marked the Task method getSubprojectName as deprecated. Use getSubprojectFile instead.
Marked the Task method setExternalTaskProject as deprecated. Use the setSubprojectFile method instead.
Marked the Task method getExternalTaskProject as deprecated. Use the getSubprojectFile method instead.
Marked the ProjectFile method getSubProjects as deprecated. Use the subproject attributes on individual tasks instead.
Marked the Task methods getSubProject and setSubProject as deprecated. Use the subproject attributes instead.
Improve default values provided for P6 calendars with missing data.
Implement both "planned dates" and "current dates" strategies for populating P6 baselines.
Ensure the Project GUID is read from MPP files.
Improve accuracy of resource assignment Actual Start and Actual Finish dates when reading MPP files.
Avoid generating timephased data for zero duration tasks.
Improve preservation of custom timephased data start and end times.
Implemented PrimaveraXERFileWriter to allow MPXJ to write XER files.
Updated the ActivityCode class to ensure that both the scope Project ID and EPS ID can be represented when reading a P6 schedule. (Potentially breaking change if you were using this class).
Ensure secondary constraint date and type are written to PMXML files.
Ensure leveling priority is written to PMXML files.
Ensure WBS UDF values are written to PMXML files.
Ensure integer UDF values are read correctly from XER files and P6 databases.
Add methods to allow the project's default calendar unique ID to be set and retrieved.
Add method to allow a calendar's parent calendar unique ID to be retrieved.
Add method to allow a task's parent task unique ID to be retrieved.
Add methods to allow a resource assignment's role unique ID to be set and retrieved.
Add methods to allow a resource assignment's cost account unique ID to be set and retrieved.
Add method to allow a cost account's parent unique ID to be retrieved.
Add method to allow an expense item's cost account unique ID to be retrieved.
Add method to allow an expense item's category unique ID to be retrieved.
Added WorkContour.isDefault() method to allow "built in" resource curves/work contours to be distinguished from user defined curves.
Updated to retrieve the project's start date from Phoenix PPX files (Contributed by Rohit Sinha).
Provide access to notebook topics from P6 schedules via the ProjectFile.getNotesTopics() method.
Capture unique ID of Activity and WBS notes from P6 schedules.
Improve the calculation used to determine At Completion Duration of activities when reading XER files and P6 databases.
Improve representation of certain duration values written to MSPDI files.
Improve accuracy of certain work calculations where the specified time period does not start with a working day.
Fix an issue which caused negative timephased work values to be generated when reading certain MPP files.
Fix an issue reading XER files where the critical_drtn_hr_cnt field is expressed a decimal rather than an integer.
Fix an issue populating the WBS attribute for activities read from certain XER files.
The project property Critical Slack Limit is now represented as a Duration rather than as an Integer. (Potentially breaking change if you were using this property directly).
TaskType is now a simple enum with all Microsoft Project specific functionality moved into TaskTypeHelper. (Potentially breaking change if you were using the TaskType methods getInstance or getValue in your code)
When reading the task type from P6 schedule the mapping to the MPXJ TaskType enum has been updated to more closely match P6. The main changes are that the P6 type "Fixed Units" now maps to TaskType.FIXED_WORK and the "Fixed Duration & Units" type now maps to a new enumeration value TaskType.FIXED_DURATION_AND_UNITS.
Added support for reading project calendar exceptions from Phoenix schedules (based on a contribution by Rohit Sinha).
The Resource attribute Active now defaults to true if the schedule being read doesn't support or contain a value for this attribute.
Add support for reading and writing the Resource's Active flag for P6 schedules.
Add support for reading and writing the Resource's Default Units/Time value for P6 schedules.
Add support for reading and writing the Project's Critical Slack Limit value for P6 schedules.
Fixed an issue reading certain types of Enterprise Custom Fields containing date values.
Ensure activity code value parent can be set to null.
Improved existing .Net extension methods and added support for more types.
Added NuGet package icon
Simplified NuGet packaging
Write activity code definitions and activity code assignments to PMXML files.
Added support for "secure" and "max length" attributes to the ActivityCode class.
Added getChildCodes method to ActivityCode and ActivityCodeValue to make it easier to traverse activity code values hierarchically.
Added setDescription method to Step class to make it simpler to add a plan text description.
User defined fields read from P6, Asta and GanttProject schedules are now represented by instances of UserDefinedField. They will no longer be mapped to custom field instances.
Enterprise Custom Fields read from MPP and MSPDI files are now represented by instances of UserDefinedField.
When writing MSPDI files, UserDefinedField instances which were originally read from enterprise custom fields will be written to the MSPDI file as enterprise custom fields.
When writing MSPDI files, UserDefinedField instances which were from applications other than Microsoft Project will automatically be mapped to available custom fields.
When writing MPX files, UserDefinedField instances will automatically be mapped to available custom fields.
The UserDefinedField type implements the FieldType interface and so can be used with the FieldContainerget and set methods to work with the contents of the user defined fields.
The ProjectFile.getUserDefinedFields() method has been added to provide access to all user defined fields defined in the project.
The CustomFieldContainer returned by ProjectFile.getCustomFields() will contain entries for all UserDefinedField instances.
The various getFieldTypeByAlias and getFieldByAlias methods will retrieve user defined fields by name.
Added the convenience method ProjectFile.getPopulatedFields() to retrieve details of all populated fields across the project. This avoids the caller having to individually retrieve the populated fields from the tasks container, resource container and so on.
Updated the getPopulatedFields methods to return a Set of FieldType rather than a Set of TaskField, ResourceField etc.
The various getPopulatedFields methods will include instances of UserDefinedField in the returned collection if relevant.
All ENTERPRISE_CUSTOM_FIELDn values have been removed from the TaskField, ResourceField, AssignmentField and ProjectField enumerations.
The getEnterpriseCustomField and setEnterpriseCustomField methods have been removed from ProjectProperties, Task,ResourceandResourceAssignment`.
Project UDFs are now read from P6 schedules.
Project UDFs are now written to PMXML files.
All code previously marked as deprecated has been removed.
Updated to improve reading resource attributes from certain MPP14 files.
Updated to make resource curve definitions (work contours) available in the WorkContourContainer. This container is accessed using the ProjectFile.getWorkContours() method.
Improve accuracy when normalising timephased data.
Add support for reading activity steps from XER files, PMXML files and Primavera databases.
Add support for writing activity steps to PMXML files.
Updated PMXML schema to version 22.12.
Updated methods in the GanttBarCommonStyle and GanttBarStyle classes to use a FieldType instance rather than a TaskField instance to allow more flexibility. (Note: this may be a breaking change if you are currently using these classes.)
Optionally include some Microsoft Project layout data in JSON output.
Avoid writing invalid characters to PMXML, MSPDI and Planner XML files.
Improve handling of slack values for schedules which only contain a value for total slack.
Add support for reading constraint type and constraint date from Phoenix schedules (based on a contribution by Rohit Sinha).
Improve timephased data calculation when assignment has zero units.
Improve handling of very large duration values when reading and writing MSPDI files.
Ensure the Task attributes Active, Constraint Type, Task Mode, and Type always have a value.
Ensure the Resource attributes Type, Calculate Costs from Units, and Role always have a value.
Ensure the Resource Assignment attributes Calculate Costs from Units, Rate Index, and Rate Source always have a value.
Add version number constant to the Java source, accessible as MPXJ.VERSION.
Ensure that UDF values are read for WBS entries in PMXML files.
Avoid writing duplicate resource assignments to MPX files.
Fix CVE-2022-41954: Temporary File Information Disclosure Vulnerability (Contributed by Jonathan Leitschuh)
Handle missing default calendar when reading a PMXML file.
When reading an MPP file using a file name or File instance, ensure a more memory-efficient approach is used.
Improve reading certain FastTrack FTS files.
Improve generation of timephased data where working time ends at midnight.
Improve generation of timephased data for tasks with a calendar assigned.
Add support for reading a resource assignment's cost account from P6 schedules.
Add support for writing a resource assignment's cost account to PMXML files.
Read resource assignment custom field definitions present in MPP14 files.
Improve identification of deleted resources when reading MPP9 files.
Ensure tasks with task calendars in MPP files are handled correctly when generating timephased data.
Improve generation of timephased data for material resource assignments.
Improve accuracy of timephased data when reading certain MPP files.
Added the Resource Assignment attribute Calculate Costs From Units, and added read and write support for Primavera schedules.
Added the Resource attribute Calculate Costs From Units, and added read and write support for Primavera schedules.
Added the Resource and Role attribute Sequence Number, and added read and write support for Primavera schedules.
Added the WBS attribute Sequence Number, and added read and write support for Primavera schedules.
Ensure activity type is read from Phoenix schedules. (Contributed by Christopher John)
Deprecate the CostAccount method getSequence and replace with getSequenceNumber to improve naming consistency.
Deprecate the ExpenseCategory method getSequence and replace with getSequenceNumber to improve naming consistency.
Avoid possible ArrayIndexOutOfBoundsException when reading GUID values from MPP files (Contributed by Rohit Sinha).
Deprecated the Resource methods getParentID and setParentID. Replaced with getParentResourceUniqueID and setParentResourceUniqueID for clarity and consistency.
Added the Resource methods setParent and getParent.
Added the ChildResourceContainer interface and ResourceContainer.updateStructure method to ensure that resources can be accessed hierarchically when reading a schedule.
Added the ResourceAssignment methods getFieldByAlias and setFieldByAlias to simplify working with custom fields, and mkae the API consistent with existing methods on Task and Resource.
Added the TaskContainer methods getCustomFields and getFieldTypeByAlias to simplify access to task custom fields.
Added the ResourceContainer methods getCustomFields and getFieldTypeByAlias to simplify access to resource custom fields.
Added the ResourceAssignmentContainer methods getCustomFields and getFieldTypeByAlias to simplify access to resource assignment custom fields.
Added the getCustomFieldsByFieldTypeClass method to CustomFieldContainer to allow retrieval of custom field details by parent class.
Deprecated the CustomFieldContainer method getFieldByAlias to be replaced by getFieldTypeByAlias to provide a more consistent method name.
Don't attempt to write unknown extended attributes to MSPDI files.
Don't populate graphical indicator data if the graphical indicator is not enabled.
Don't set custom field aliases to empty strings.
Added the CustomFieldContainer method add.
Deprecated the CustomFieldContainer method getCustomField, which is replaced by the get method (which returns null if the field type is not configured) and the getOrCreate method (which will return an existing configuration or create a new one if the requested field does not yet have a configuration).
Add an option to import Phoenix schedules as a flat set of tasks with separate activity codes, rather than creating a hierarchy of tasks from the activity codes. Note the default is to disable this behavior so existing functionality is unchanged. (Contributed by Christopher John)
Add a setProperties method to reader classes to allow configuration to be supplied via a Properties instance rather than having to call setter methods. Properties passed to the UniversalProjectReader version of this method will be forwarded to the reader class UniversalProjectReader chooses to reader the supplied file. Properties for multiple reader classes can be included in the Properties instance, each reader class will ignore irrelevant properties.
Added the get method to Task, Resource, ResourceAssignment and ProjectProperties as a replacement for the getCurrentValue method. The new get method is paired with the existing set method to provide read and write access to attributes of these classes. This change is intended to improve the interfaces to these classes by making them more consistent, and thus easier to understand.
Deprecated the getCurrentValue method on the Task, Resource, ResourceAssignment and ProjectProperties classes. Use the new get method instead.
Add getter and setter methods for the Resource attributes Cost Center, Budget Cost, Budget Work, Baseline Budget Cost, Baseline Budget Work, Baseline Budget Cost 1-10, and Baseline Budget Work 1-10.
Add getter and setter methods for the Task attributes Response Pending, Scheduled Start, Scheduled Finish, Scheduled Duration, Budget Cost, Budget Work, Baseline Budget Cost, Baseline Budget Work, Baseline Budget Cost 1-10, and Baseline Budget Work 1-10.
Added support for the Resource Cost Centre attribute for MSPDI files.
Move MPP file-specific functionality for determining baseline values from the Task class into the MPP reader class.
Improve handling of the TaskMode attribute.
Don't set a Task's Critical attribute unless we have valid slack values.
Ensure ResourceAssignment calculated fields are returned correctly when using the getCurrentValue method.
Ensure ProjectProperties calculated fields are returned correctly when using the getCurrentValue method.
Updated to use jsoup 1.15.3
Ensure monthly and yearly recurrences are calculated correctly when the supplied start date is the same as the first recurrence date (Contributed by Rohit Sinha).
Add support for reading task calendars from Phoenix files (Contributed by Rohit Sinha).
Improve reliability of ProjectCleanUtility when using the replacement strategy.
Added the ResourceAssignment.getEffectiveRate method to allow the cost rate effective on a given date for a resource assignment to be calculated. For P6 schedules this will take account of the cost rate configuration included as part of the resource assignment.
For P6 schedules, the ResourceAssignment.getCostRateTable method now takes in account any cost rate configuration details from the resource assignment when determining which table to return.
A resource's Standard Rate, Overtime Rate and Cost per Use are now all derived from the resource's cost rate table, and not stored as attributes of the resource itself.
The resource methods setStandardRate, setOvertimeRate, and setCostPerUse have been deprecated. These attributes can now only be set or updated by modifying the resource's cost rate table.
When writing MPX files, only include attributes which have a non-empty, non-default value in at least one task or resource.
When writing MPX files, ensure attributes which have calculated values are used.
Add support for reading a resource assignment's rate type from P6 schedules. The rate type is accessed via the ResourceAssignment.getRateIndex method. The value returned by this method can be used to select the required rate using the CostRateTableEntry,getRate method.
Add support for writing a resource assignment's rate type to PMXML files.
Add support for reading a resource assignment's role from P6 schedules. The role is accessed via the ResourceAssignment.getRole and ResourceAssignment.setRole methods.
Add support for writing a resource assignment's role to PMXML files.
Add support for reading a resource assignment's override rate (Price / Unit) from P6 schedules. The rate is accessed via the ResourceAssignment.getOverrideRate and ResourceAssignment.setOverrideRate methods.
Add support for writing a resource assignment's override rate (Price / Unit) to PMXML files.
Add support for reading a resource assignment's rate source from P6 schedules. The rate source is accessed via the ResourceAssignment.getRateSource and ResourceAssignment.setRateSource methods.
Add support for writing a resource assignment's rate source to PMXML files.
When reading P6 schedules, all five cost rates for a resource are now available via the CostRateTableEntry.getRate method.
All five rates from each cost rate table entry can now be written to PMXML files.
When reading files written by Microsoft Project, resource rate values now use the same units as seen by the end user rather than defaulting to hours as was the case previously. (For example, if the user sees $8/day in the source application, you will receive a Rate instance of $8/day rather than $1/hr).
The values for a resource's standard rate, overtime rate, and cost per use attributes are now derived from the cost rate table. The values stored on the resource itself are only used if a cost rate table for the resource is not present.
The Resource methods getStandardRateUnits and getOvertimeRateUnits are deprecated. Use the getStandardRate and getOvertimeRate methods to retrieve a Rate instance which will include the units for these rates.
The Resource methods setStandardRateUnits and setOvertimeRateUnits are deprecated. Supply Rate instances to the setStandardRate and setOvertimeRate methods with the required units instead.
The CostRateTableEntry methods getStandardRateUnits and getOvertimeRateUnits are deprecated. Use the getStandardRate and getOvertimeRate methods to retrieve a Rate instance which will include the units for these rates.
Ensure rates are formatted "per hour" when writing MSPDI and PMXML files.
Include cost rate tables in JSON output.
Use Jackcess to read Asta MDB and Microsoft Project MPD files. This allows these file to be read on platforms other than Windows.
Improve support for reading correctly typed values for enterprise custom fields from MPP files.
Improve array index validation when reading GUID values from MPP files.
Ensure ProjectCleanUtility can load dictionary words from distribution jar.
Improve handling of calendars without days read from PMXML files.
Updated to use POI 5.2.2
Updated to use sqlite-jdbc 126.96.36.199
Updated to use jsoup 1.15.1
Added support for reading and writing the unique ID of P6 user defined fields via new getUniqueID and setUniqueID methods on `CustomField (based on a suggestion by Wes Lund).
Added support for reading and writing scope, scope ID, and sequence number attributes for activity codes (based on a suggestion by Wes Lund).
Added support for reading and writing sequence number and color attributes for activity code values (based on a suggestion by Wes Lund).
Added isWorking method to ProjectCalendarException to make it clearer how to determine if the exception changes the dates it is applied to into working or non-working days.
Improve reading task start from certain Planner files.
Improve reading predecessor lag values from Planner files.
Ensure calendar hierarchy is written correctly to Planner files.
Don't write null tasks to Planner files as Planner will not read files which contain them.
When writing Planner file, ignore constraint types which Planner can't represent.
Don't write emply predecessor lists to Planner files.
Improve handling of lag duration when writing Planner files.
Improve ProjectCalendar start date calculation when we have long runs of non-working days.
Performance enhancement for timephased data normalisation.
The ProjectCalendarWeek methods addCalendarHours(), attachHoursToDay, removeHoursFromDay have been removed. Use addCalendarHours(day), removeCalendarHours(day) instead. (Note: this will be a breaking change if you were using the original methods to create or modify a schedule)
The ProjectCalendar methods attachHoursToDay and removeHoursFromDay have been removed. Use the addCalendarHours and removeCalendarHours methods instead. (Note: this will be a breaking change if you were using the original methods to create or modify a schedule)
The class hierarchy for ProjectCalendarHours and ProjectCalendarException has been simplified, but there should be no impact for uses of these classes.
The ProjectCalendarHours class now implements the List interface. Methods in this class not part ofthe List interface have been deprecated in favour of the equivalent List methods.
Updated MPXWriter to ensure: calendar names are quoted if necessary, all calendars have names, all calendar names are unique.
Updated MPXReader to recognise wk as a valid time unit.
Updated MPXWriter, PrimaveraPMFileWriter, SDEFWriter and PlannerWriter to ensure any working weeks defined by a calendar are represented by exceptons.
Updated MSPDIWriter to ensure any working weeks defined by a calendar are represented in the "legacy" exception definition used by Microsoft Project prior to 2007.
Updated SDEFWriter to ensure: only relevant calendars are written, and derived calendars are flattened.
When reading Planner schedules MPXJ will no longer create an "artificial" resource calendar for each resource. Resources will be linked directly to the calendar used in the original schedule.
Add support for reading the P6 calendar type and personal calendar flag from P6 schedules.
Add support for writing the calendar type and personal calendar flag to PMXML files.
Updated the calendar class hierarchy: ProjectCalendar and ProjectCalendarWeek both now inherit from a new class ProjectCalendarDays. Note that ProjectCalendar is no longer a subclass of ProjectCalendarWeek.
The getHours and isWorkingDay methods have been moved up to ProjectCalendar from the ProjectCalendarWeek class.
The ProjectCalendar method copy has been deprecated, without replacement.
Added a getWork method to ProjectCalendar which calculates the amount of work given a Day instance.
Added removeWorkWeek and removeCalendarException methods to ProjectCalendar.
Recurring exceptions are now added to a ProjectCalendar using the addCalendarException method which takes a recurringData instance its argument.
The ProjectCalendarException method setRecurringData has been removed, recurring exceptions should be added using the addCalendarExcepton method described above. (Note: this will be a breaking change if you were creating recurring exceptions)
Remove getParent, setParent, and isDerived from ProjectCalendarWeek. (Note: this will be a breaking change if you were working with ProjectCalendarWeek directly).
The ProjectProperties methods getDefaultCalendarName() and setDefaultCalendarName() have been deprecated. Use getDefaultCalendar() and setDefaultCalendar() instead.
Ensure that percent complete values can be read from MSPDI files even if the values are decimals.
Improve handling of the default calendar when reading certain MSPDI files.
Improve reading certain Phoenix PPX files.
Improve reading certain FastTrack FTS files.
Improve formatting of time project properties when written to JSON.
Improve reading MPP files generated by Microsoft Project 16.0.15128.20158 and later versions.
General improvements to make calendar data read from different file formats more consistent.
When reading P6 and Powerproject schedules MPXJ will no longer create an "artificial" resource calendar for each resource. Resources will be linked directly to the calendars they use in the original schedule.
Update MPXWriter and MSPDIWriter to ensure that, when written, calendars are correctly structured in the form required by Microsoft Project.
JsonWriter now includes calendar data as part of its output.
The ProjectCalendar methods setMinutesPerDay, setMinutesPerWeek, setMinutesPerMonth and setMinutesPerYear have been deprecated, use setCalendarMinutesPerDay, setCalendarMinutesPerWeek, setCalendarMinutesPerMonth and setCalendarMinutesPerYear instead.
The ProjectCalendar method setResource has been deprecated and will not be replaced. Use the Resource method setCalendar or setCalendarUniqueID to link a calendar with a resource.
The ProjectCalendar method getResource has been deprecated. Use the getResources method instead to retrieve all resources linked with a calendar.
The Resource methods addResourceCalendar, setResourceCalendar, getResourceCalendar, setResourceCalendarUniqueID and getResourceCalendarUniqueID have been deprecated and replaced by addCalendar, setCalendar, getCalendar, setCalendarUniqueID and getCalendarUniqueID respectively.
Improvements to writing currency, rate and units amounts to MSPDI files.
When reading MPP and MSPDI files, calendar exceptions representing a single range of days, but defined as a recurring exception are converted to a range of days, removing the unnecessary recurring definition.
Added StructuredTextParser to replace original code handling calendar data, project properties and curve data read from XER files and Primavera databases. Can also be used to extract data from Primavera Layout Files (PLF).
Improve recognition of contoured resource assignments read from MPP files.
Improve retrieval of resource assignment confirmed, response pending, linked fields, and team status pending flags from certain MPP files.
Improve PMXML file compatibility with P6.
Strip any trailing invalid characters from text read from FTS files.
Ensure all tasks read from Powerproject and Project Commander have unique IDs.
Correct expansion of exceptions from a weekly recurring calendar exception.
Ensure that expanded calendar exceptions are written to file formats which do not support recurring exceptions.
Ensure that start and finish dates are set when reading milestones from GanttProject files.
Ensure Task.getActivityCodes() returns an empty list rather than null when no activity code values have been assigned.
Default to using ASCII when reading and writing SDEF files, as per the SDEF specification.
Provide methods to set and get the charset used when reading and writing SDEF files.
Added support for reading Code Library values (as Activity Codes) from Powerproject files.
Updated ProjectCleanUtility to provide a "replace" strategy alongside the original "redact" strategy.
Fix issue with null tasks from certain MPP files introduced in 10.0.2.
Improve identification of null tasks for certain MPP files.
Avoid false positives when detecting password protected MPP files.
Added support for .NET Core 3.1
Nuget packages now explicitly target .NET Framework 4.5 (net45) and .NET Core 3.1 (netcoreapp3.1)
Improve reliability when reading certain Phoenix files.
Ensure multiple trailing nul characters are stripped from text when reading schedules from a Primavera database.
Improve accuracy of identifying null tasks in certain MPP files.
Improve accuracy of identifying valid tasks in certain MPP files.
Ensure hierarchical outline code values are read correctly from MSPDI files.
Improve support for files produced by recent versions of FastTrack.
Added support for Phoenix 5 schedules.
Improve handling of null tasks read from MPP files.
Introduced the BaselineStrategy interface and implementing classes. (Note: this includes a breaking change if you were using the ProjectFile.setBaseline method and supplying a lambda. You will now need to implement a BaselineStrategy and set this in ProjectConfig before setting a baseline).
Improved accuracy of baseline attributes for Primavera schedules.
Add Sprint ID and Board Status ID attributes to task.
Introduce the TimeUnitDefaultsContainer to allow constants for time unit conversions to be obtained from both project properties and calendars.
Duration attributes are no longer returned as Duration instances by the ruby gem, they are now returned as floating point numbers. By default, durations are expressed in seconds. A new optional argument to MPXJ::Reader.read allows you to change the units used to express durations. (Note: this is a breaking change for users of the ruby gem)
Update JsonWriter to use a relevant calendar when converting durations.
Ensure default calendar is set correctly when reading XER and PMXML files, and P6 databases.
Use default hours per day/week/month/year when reading P6 XER files or databases if these values are not present.
Ensure that the minutes per day/week/month/year attributes are copied when a calendar is copied.
When reading P6 schedules, roll up calendar for WBS entries when child activities all share the same calendar.
Generate missing minutes per day/week/month/year for calendars read from P6 schedules.
Inherit minutes per day/week/month/year from base calendars (Note: minor method signature changes on ProjectProperties and ProjectCalendar).
Allow explicit values to be set for project minutes per week and minutes per year.
Fall back on defaults for project minutes per day/week/month/year attributes.
Add Planned Start and Scheduled Finish to project properties.
Add attribute_types method to Ruby classes.
Updated to use POI 5.0.0.
Corrected source of Must Finish By project property when reading XER files or P6 databases.
When reading PMXML files, ensure that the activity calendar is set before calculating slack.
Remove unused field TaskField.PARENT_TASK.
Ensure task Unique ID and task Parent Unique ID attributes are treated as mandatory when written to JSON.
Fix an issue with Ruby gem where a task's parent was not being retrieved correctly in some circumstances.
Add Must Finish By date to project properties.
Add support for the task attributes Longest Path, External Early Start and External Early Finish, and ensure they can be read from P6 schedules.
Rename ProjectFile.getStartDate() and ProjectFile.getFinishDate() methods for clarity. Original method names are marked as deprecated
Ensure that all activities in a PMXML file have a CalendarID attribute to ensure compatibility with older versions of P6.
Ensure that the user's selected progress period is used to set the project's status date attribute when reading Asta PP files.
Ensure that a task's Complete Through attribute is not advanced to the start of the next working day (the behaviour of Microsoft Project prior to 2007 was to report Complete Through as the start of the next working day. This change ensures MPXJ matches versions of Microsoft Project from 2007 onwards. Previous behaviour can be restored using the ProjectConfig.setCompleteThroughIsNextWorkStart() method).
Deprecate task getSplitCompleteDuration() and setSplitCompleteDuration() in favour of getCompleteThrough() and setCompleteThrough().
Improved the implementation of the TaskContainer.synchronizeTaskIDToHierarchy method.
Update jsoup to 1.14.2.
When applying a baseline using ProjectFile.setBaseline, gracefully handle duplicate task key values.
Handle missing values populating cost rate table from an MPP file.
Added support for reading baseline data from embedded baselines in PP files.
Correct resource assignment percent complete values read from PP files.
JsonWriter no longer writes attribute type information by default. (The original behaviour can be restored by calling setWriteAttributeTypes(true) on your JsonWriter instance).
The MPXJ Ruby Gem now generates explicit methods to access attributes rather than relying on "method_missing" to intercept and act on attribute access.
Don't write Assignment Task GUID, Assignment Resource GUID or Resource Calendar GUID to JSON.
Don't write a value for Assignment Work Contour to JSON if the contour is the default value (i.e. flat).
Don't write a value for Assignment Resource Request Type to JSON if the type is the default value (i.e. none).
Don't write a value for Task Earned Value Method to JSON if the method matches the project default.
Don't write a value for Task Type to JSON if the type matches the project default.
Stop writing a default value (-1) for Parent Task ID to JSON if the task does not have a parent.
Stop writing a default value (-1) for Task Calendar ID to JSON if the task does not have a calendar.
When reading resource assignments from an MPP file, don't record Project's internal representation of a null resource ID (-65535), record the resource ID explicitly as null.
For MPX and Planner files, don't write resource assignments for the "null" resource.
Handle missing status date when reading P6 schedules from XER files or database.
When reading MPP files, treat UUID's which are all zeros as null.
Deprecate the 10 Resource Outline Code get and set methods and replace with get and set methods which take an index argument.
Provide a helper method (PrimaveraHelper.baselineKey) to encapsulate key generation for setting Primavera baselines.
Read custom value lists for resource custom fields from MPP files (based on a suggestion by Markus Höger).
Added support for reading custom fields from Asta Powerproject files.
Ensure short data type values are written to JSON files as numeric values.
Ensure delay data type values are written to JSON files as duration values.
Don't write zero rates to JSON files.
Introduced a separator into rate values when written to a JSON file to make it clear that the value is a rate not a duration (for example: 5.00h is now 5.00/h).
When writing an enum value of a JSON file, ensure we write the original enum name rather than the value return by toString. This provides more meaningful output (Potentially breaking change if you use the Ruby gem or consume the JSON output directly. Affected attributes are project properties: currency symbol position, time format, date format, bar text date format, schedule from, mpx file version; resource attribute: type).
Ensure invalid cost rate table data is handled gracefully when reading from MSPDI files.
Handle missing data when reading MSPDI files (based on a contribution by Lord Helmchen).
Improve population of summary task names when reading from Powerproject PP files.
Correctly read hierarchical resource outline codes from MPP files (based on a suggestion by Markus Höger).
Preserve multiple assignments between an activity and a resource when reading P6 schedules.
Renamed WorkContour.isFlat to isContourFlat and WorkContour.isContoured to isContourManual.
Include an entry for 0% in the WorkContour curve definition.
Fix an issue where non working days were not being treated correctly in date calculations if they happen to still have time ranges attached.
Add support for reading roles from P6 databases, XER and PMXML files, and for writing roles to PMXML files. Roles are represented as resources. The new resource Boolean attribute "Role" is used to distinguish between Resource instances which represent resources and those which represent roles.
Add support for reading resource curves from P6 databases, XER and PMXML files, and for writing resource curves to PMXML files. The WorkContour enum is now a class, and instance of this class are used to represent resource curves. The curves are available via the work contour attribute of resource assignments.
Corrected the data type of the task physical percent complete attribute.
Improve handling of non-standard relationship type representations encountered in XER files and P6 databases.
Handle invalid baseline numbers when reading MSPDI files.
Improve custom field handling when reading GanttProject files.
Add launcher batch file and shell script.
Improve handling of calculated task attributes when writing a project to a different format.
Ensure that dates are rolled up to summary tasks when reading FastTrack files.
Improve support for Synchro 6.3 SP files.
Fix an issue reading resource rate information GanttProject files.
Fix an issue reading Planned Duration from P6 databases and XER files.
Ensure Duration and Actual Duration are populated for WBS entries when reading P6 schedules.
Fix issue with WBS ordering when writing PMXML files.
Improve Task critical flag calculation when reading PMXML files.
Improve support for Synchro 6.3 SP files.
Improve accuracy when reading subprojects from MPP files.
Add Remaining Late Start and Remaining Late Finish attributes to Task.
Add Critical Activity Type attribute to Project Properties
Read Remaining Early Start, Remaining Late Start, Remaining Early Finish and Remaining Late finish from and write to PMXML files.
Read Remaining Late Start and Remaining Late finish from P6 database and XER files.
Ensure that WBS entries without child activities are not marked as critical.
Don't attempt to set the critical flag when reading XER and PMXML files where the schedule is using "longest path" to determine critical activities. (MPXJ currently doesn't have enough information to be able to determine the correct value for the critical flag in this situation).
Ensure cost, duration, date and work attributes are rolled up to WBS entries for P6 schedules read from PMXML files, XER files and P6 databases.
Populate baseline cost, duration, finish, start and work when reading from XER files, PMXML files and P6 databases where the "Project Baseline" has been set to "Current Project".
Add methods to the ProjectFile class to attach a ProjectFile instance as a baseline. The baselines attached to the ProjectFile will be used to populate the relevant baseline attributes in the current schedule.
Added experimental support for writing baseline projects to PMXML files.
Added the Project GUID attribute.
When reading PMXML files, the list of projects returned by the readAll method will include any baseline projects present in the file.
When reading PMXML files which include the current baseline project, use this to populate the relevant baseline attributes in the main schedule.
The Project Unique ID property is now an integer rather than a string.
When reading Primavera schedules, populate the project properties Project ID and Baseline Project Unique ID.
Handle Primavera resource rates which don't have a start or finish date.
Handle MSPDI files with resource availability tables which don't have a start or finish date.
Ensure that the Activity ID field is populated consistently for WBS entries in PMXML files compared to the same schedule read from an XER file or P6 database.
Ensure duration of manually scheduled tasks in MPP files is represented correctly.
NOTE: this release introduces breaking changes!
All fields which are non-user defined, but were previously being returned by MPXJ as custom fields are now represented as explicit field types. Custom fields now only contain values for user-defined custom fields.
All code previously marked as deprecated has been removed.
When reading an XER file or a P6 database, some custom project property names have been updated. LagCalendar is now CalendarForSchedulingRelationshipLag, RetainedLogic is now WhenSchedulingProgressedActivitiesUseRetainedLogic, ProgressOverride is now WhenSchedulingProgressedActivitiesUseProgressOverride, IgnoreOtherProjectRelationships is now WhenSchedulingProgressedActivitiesUseProgressOverride, and StartToStartLagCalculationType is now ComputeStartToStartLagFromEarlyStart.
Updated PMXML schema to version 20.12.
Fix an issue where GUID values were not being read correctly from XER files and P6 databases.
Percent complete type is now available as a task attribute for P6 schedules from any source.
Ensure that percent complete values are stored in the appropriate attributes when reading P6 schedules. (NOTE: Previously the "reported" percent complete value was stored as the tasks "percent complete" attribute. Now this holds the schedule percent complete value, and the percent work complete and physical percent complete attributes are also populated. To determine which value should be reported for a task, see the "percent complete type" extended field attribute.)
Correctly handle default calendar when reading and writing PMXML files.
Update the sort order of WBS entries and activities in PMXML files to match the order exported by P6.
Match the way P6 exports the WBS code attribute for PMXML files.
Update the representation of Boolean values when writing PMXML files to match the form exported by P6.
Set the task type attribute when reading PMXML files.
Improve duration and actual duration calculations when reading XER files and P6 databases.
Fix an issue where resource assignment costs were not being read correctly from PMXML files.
Read and write the suspend date and resume date attributes for PMXML files.
General improvements to the SDEF writer.
Updated to rtfparserkit 1.16.0.
Don't write unused enterprise custom field definitions to MSPDI files. This ensures that MS Project will open these files correctly.
Notes in their original format (HTML from P6, RTF from MS Project) can now be retrieved via the getNotesObject method on Task, Resource, and ResourceAssignment. Plain text notes can still be retrieved via the getNotes method. If you were previously using the "preserve note formatting" flag to retrieve the original formated version of a note, you will now need to use the getNotesObject method.
Write WBS and Activity notes to PMXML files.
PMXML compatibility improvements to ensure files can be successfully imported into P6.
Previously when reading PMXML files, XER files, and P6 databases, a set of baseline attributes on tasks and assignments (including Start, Finish, Duration, Cost and Work) were being populated with planned values rather than baseline values. These baseline attributes are no longer being set. The values they previously contained are now available as custom fields.
Read activity notepad entries for XER, PMXML files and P6 databases.
Read schedule and leveling options from PMXML files and P6 databases.
Improve support for reading activity cost and work from PMXML files.
Fix CVE-2020-35460: zip slip vulnerability (with thanks to Sangeetha Rajesh S, ZOHO Corporation)
Updated PMXML schema to version 19.12.
Ensure that we always set the activity planned start and planned finish dates when writing a PMXML file.
Updated the getPopulatedFields methods to ignore fields with default values.
Made the Resource ID attribute available as a resource's TEXT1 custom field, with the alias "Resource ID" when reading PMXML and XER files, or from a P^ database. (Note that presently for XER files and P6 databases, the Resource ID value is also read into the initials attribute. This behaviour is deprecated and will be removed in the next major MPXJ release).
Populate the Resource ID with the value read from a P6 schedule when writing a PMXML file.
Ensure that the hours per day, week, month and year attributes are read from and written to PMXML files.
Fix an issue causing the hours per day calendar attribute to be read inaccurately from XER files and P6 databases.
Read assignment actual overtime cost and work attributes from PMXML files.
Update calculation of assignment work, cost and units attributes for PMXML files.
Added cost rate table support when reading from and writing to PMXML files.
Added a getPopulatedFields method to the TaskContainer, ResourceContainer and ResourceAssignmentContainer classes. This will retrieve the set of fields which are populated with a non-null value across the whole project for Tasks, Resources, and ResourceAssignments respectively.
Add START_ON, FINISH_ON constraint types. Deprecate MANDATORY_START, MANDATORY_FINISH constraint types. MANDATORY_START/FINISH are now represented as MUST_START/FINISH_ON. This change allows users to distinguish between START/FINISH_ON and the MANDATORY_* constraints when reading P6 schedules.
Improve handling of cost rate tables and availability tables when writing to an MSPDI file.
Handle P6 databases and XER files with user defined fields of type FT_FLOAT.
Align invalid XER record behaviour with P6.
Handle Planner files which don't contain an allocations tag.
Gracefully handle MPP files with missing view or table data.
Added support for "new tasks are manual" project property (Contributed by Rohit Sinha)
Improved support for reading and writing outline codes and extended attributes for MSPDI files (Based on a contribution by Dave McKay)
Improved handling of enterprise custom fields when reading MPP files
Update Primavera database and XER readers to avoid potential type conversion errors when the caller provides their own field mappings.
Improve handling of some MPP12 MPP file variants.
Avoid error when reading timephased data from certain MPP files.
Gracefully handle MPP files with missing view data.
Update junit to 4.13.1.
Minor updates to PlannerReader.
Add the "userDefined" attribute to the CustomField class to allow caller to determine if the field has been created by a user or MPXJ.
Add support for reading expense items, expense categories and cost accounts from XER files, PMXML files and Primavera databases.
Add support for writing expense items, expense categories and cost accounts to PMXML files.
Updated the XER file reader to ignore invalid records rather than reporting an error, matching the behaviour of P6
Updated the XER file reader to ensure that activity suspend and resume dates are read correctly.
Updated the XER file reader to ensure that if the reader returns the project selected by the caller when the caller supplies a value for project ID.
Updated PMXML reader to avoid user defined field collisions.
Updated PMXML reader to add setProjectID and listProjects methods.
Update the .net extension method ToIEnumerable to work with java.lang.Iterable rather than java.util.Collection
All readers, including the UniversalProjectReader, now support a readAll method. If a file or database contains more than one project the readAll method can be used to retrieve them all in one operation. If the file format doesn't support multiple schedules, readAll will just return a single schedule.
Add PrimaveraDatabaseFileReader to encapsulate access to SQLite Primavera databases.
Ensure that the summary flag is true for WBS items in Primavera schedules, even if they have no child activities.
Ensure that the critical flag is rolled up appropriately to WBS items when reading Primavera schedules.
Set export flag property when reading projects from a PMXML file.
Corrected data type of resource assignment Work Contour field.
Corrected data type of resource fields: BCWS, BCWP, ACWP, SV, CV, and Work Contour.
Corrected data type of task fields: CV, ACWP, VAC, CPI, EAC, SPI, TCPI, and Work Contour.
Fixed Issue 188: NullReferenceException with getTimephasedBaselineWork.
Fixed Issue 191: Outline number is null when opening Project 2003 MPP file.
Fixed Issue 192: Unable to parse note (unknown locale).
Fixed Issue 193: MPP9Reader marks all tasks after a null task as null.
Updated to fix an issue where the Task critical attribute was incorrectly calculated for some manually scheduled tasks.
Updated to fix an issue where the Task summary attribute was not set correctly when using certain methods to add or remove child tasks.
Updated to fix an issue where subprojects were not read correctly (Contributed by Gary McKenney).
Added support for resource assignment fields Baseline Cost 1-n, Baseline Work 1-n, Baseline Start 1-n, Baseline Finish 1-n, Start 1-n, Finish 1-n, Date 1-n, Duration 1-n, Cost 1-n, Text 1-n, Number 1-n, Flag 1-n, for MPP, MPD, and MSPDI files.
Added support for task suspend date, task resume date, and task code read from Primavera, and represented in MS Project custom fields Date1, Date2, and Text1 respectively.
Added support for retrieving the table associated with any view.
Updated to fix incorrect duration calculations where minutes per week were not being used (Contributed by Jonas Tampier).
Updated split task implementation to represent splits as DateRange instances rather than as hours.
Added .Net DLLs using IKVM.
Added support for reading timephased resource assignment data from MPP files.
Added support CurrencyCode, CreationDate, LastSaved and HyperlinkBase project header fields.
Added support for reading recurring task data from MPP files.
Added methods to MPXReader and MPXWriter to allow the caller to determine the supported locales.
Added Spanish locale (Contributed by Agustin Barto).
Added support for durations with percentage time lag (Contributed by Jonas Tampier).
Added support MSPDI file split tasks.
Updated to POI 3.0.2
Updated to address an out of memory exception raised when processing certain MPP12 files.
Updated to fix a problem caused by duplicate ID values in MPP12 files.
Updated to fix a problem with the subproject unique ID calculation (Contributed by Jari Niskala).
Fixed Issue 48: Import from Project 2007 ignores some tasks.
Fixed Issue 52: Crash on priority not set in MSPDI-file.
Fixed Issue 51: Resource start/finish dates with MSP 2007.
Fixed Issue 51: MS Project 2007: Calendar exceptions dates are wrong.
Added support for Enterprise task and resource fields.
Added support for Baseline task and resource fields.
Added support for extracting non-English (i.e. character set encoded) text from note fields.
Added support for Chinese MPX files (contributed by Felix Tian).
Added support for reading project start and end dates from all MPP file types (Bug #1827633).
Added support for password protected MPP9 files (Contributed by Jari Niskala)
Added support for calendar exceptions for MPP12 files (Contributed by Jari Niskala)
Added support for value lists and descriptions for custom fields (Contributed by Jari Niskala)
Added support for timescale formats (Contributed by Jari Niskala)
Added support for the project file path attribute (Contributed by Jari Niskala)
Added support for the ignore resource calendar attribute (Contributed by Jari Niskala)
Added support for the resource actual overtime work attribute (Contributed by Jari Niskala)
Added support for the resource material label attribute (Contributed by Jari Niskala)
Added support for the resource NT account attribute (Contributed by Jari Niskala)
Improved support for hyperlinks (Contributed by Jari Niskala)
Improved support for custom fields in MPP12 files (Contributed by Jari Niskala)
Migrated to Java 5
Updated to POI 3.0.1
Updated to JAXB 2.1.4
Changed company details from Tapster Rock to Packwood Software
Added support for reading MPD files via JDBC
Added support for reading Planner files
Added support for over allocated flag to all MPP file formats.
Added support for calculating duration variance from MPP files.
Added support for calculating start and finish variance from MPP files.
Added support for attribute change listeners for Task and Resource classes.
Added support for start slack, finish slack, free slack and total slack read from MPP files.
Added support for external tasks.
Added unique ID generation for calendars read from MPX files.
Added support for the status date property of the project.
Fixed a timezone related bug when handling dates for calendar exceptions (Contributed by Todd Brannam).
Fixed incorrect calculation of lag times for some MPP files.
Fixed missing predecessor tasks in certain rare MPP9 files.
Fixed incorrect MPX file AM/PM text setting in certain locales.
Fixed an ArrayIndexOutOfBoundsException.
Fixed a ClassCastException.
Fixed a zero length string error.
Fixed a duration rounding error when reading MSPDI files.
Fixed incorrect "as late as possible" constraint handling.
Incorrect late start date read from an MPP9 file.
Incorrect total slack calculation.
Added a default for the task constraint type attribute to prevent a possible NPE when writing an MSPDI file.
Added a default resource calendar name where the resource name is empty.
Updated the Column.getTitle method to take account of user defined column aliases.
Updated to add another condition to the test for deleted tasks in MPP8 files.
Updated to significantly improve the performance of writing MSPDI files.
Added support for split views.
Added support for graphical indicators.
Added a workaround for a bug in MS Project which is seen when calendar exceptions are exported to an MSPDI file. If the exception contained seconds and milliseconds, MS Project marked every day as being affected by the exception, not the day or range of days specified.
Updated to make date/time/number formats generic, and thus available to end users. For example, this allows users to format currencies in line with the settings in the project file.
Standardised on minutes per day and minutes per week, rather than hours per day and hours per week.
Provided additional time ranges for calendar exceptions.
Refactored Task and Resource to use TaskField and ResourceField to identify fields.
Updated to automatically generate WBS for tasks read from MPP files when no WBS information is present in the file.
Fixed a bug when reading MPP files where task finish dates appeared before the start date where a "start no later than" constraint was in use.
Fixed a bug which resulted in invalid MPX files being generated when a project either had no tasks, or it had no resources.
Fixed a long standing bug where the calendar records were being written into MPX files after they were referred to in the project summary record.
Fixed a bug where WBS and Outline Levels were not being auto generated correctly when an MPP file contained a project summary task.
Fixed a bug where split tasks were not being reported correctly.
Major API rewrite.
Added a flag called "expanded" to the Task class to represent whether a task in an MPP9 file is shown as expanded or collapsed by MS Project.
Fixed a bug in the relation code in MpxjQuery (contributed by Shlomo Swidler).
Modified MPXDateFormat, MPXTimeFormat and MPXCurrencyFormat to derive them from DateFormat and NumberFormat.
Added support for MPT files.
Fixed a bug which could case an NPE when reading certain MPP9 files.
Added support for the "marked" attribute for MPP9 files.
Added support for reading split task data from MPP9 files.
Added support for reading calculate multiple critical paths flag.
Fixed a bug which could case an array out of bounds exception in the Priority (contributed by Frank Illenberger).
Fixed bug #1346735 "Priorities of the tasks are exported incorrectly".
Added code to allow tasks, resources, resource assignments and calendars to be removed from the data structure.
Implemented Italian MPX file format translation (contributed by Elio Zoggia).
Cleaned up calendar usage.
Added support for retrieval of custom document summary fields from the project header (contributed by Wade Golden).
Updated to use checkstyle 4.0 and fixed warnings.
Rationalised duration conversions into a set of methods in the MPXDuration class.
Replaced various file format conversion utilities with the general purpose MpxjConvert utility.
Fixed an issue where tasks with a percent complete value, but no resource assignments, would not write correctly to an MSPDI file.
Added an accessor method for resource calendars.
Unique ID generation was not correct for tasks, resources and calendars if these entities were added to an existing project file.
Fixed a compatibility issue with POI3
Added an event listener to the project file to allow notifications of resources and tasks being read and written to and from a file.
Fixed a compiler warning when build with JDK5.
Fixed a bug where a project start date was not being set correctly in the project header.
Added support for reading the project header "calendar name", "schedule from" and "revision" values from MPP files.
Fixed split task support.
Enhanced TableFontStyle implementation.
Added support for reading all properties from an MPP9 file which define the visual appearance of the Gantt Chart view shown in Microsoft Project (development funding courtesy of Steelray).
Tidied up constructors. Added no-argument constructors to the MPPFile and MSPDIFile classes.
Fixed incorrect value in WorkGroup enumerated type.
Implemented the resource assignment work contour property (contributed by Wade Golden).
Implemented correct handling for MPX files using different character set encodings (suggested by Frank Illenberger).
Fixed task duration calculation when importing an MPP file with a "non-standard" hours-per-day setting (contributed by Wade Golden).
Updated to ensure that the MPX task fixed attribute, and the MPP/MSPDI task type attribute are correctly handled.
Updated to implement the remaining project header attributes supported by the MSPDI file format.
Updated to add support for reading the MPX 3.0 files generated by Primavera (courtesy of CapitalSoft).
Fixed incorrect assumptions about conversion of durations to hours when writing MPX files (contributed by Frank Illenberger).
Updated to calculate remaining work for resource assignments on import, to allow MSPDI export of this data to work correctly (contributed by Frank Illenberger).
Updated to add another condition to the test for deleted tasks in MPP8 files.
Updated to fix a problem with reading assignment data from MPP9 files.
Rationalised the location of the JUnit tests and the sample files.
Fixed a problem where the project start and end dates reported in the project header were incorrect.
Fixed an array out of bounds exception when reading an MPP9 file.
Updated to allow MPXCalendarHours to accept an arbitrary number of time periods.
Introduced the Day class to replace the use of arbitrary integers to represent days of the week.
Added the ability to query the task assignments for a resource using the Resource.getTaskAssignments() method.
Fixed a problem with number formats in MSPDI files.
Updated the MPP View class to extract the view type.
Updated to ensure that duration values read from an MSPDI file are converted into the appropriate duration units, rather than being left as hours as the durations are represented in the MSPDI file.
Implemented French MPX file format translation (contributed by Benoit Baranne).
Fixed a bug reading assignment work contour attribute.
Updated to make failure more graceful when a Microsoft Project 4.0 MPP file is encountered.
Fixed a bug where deleted constraints in an MPP9 file were not being ignored.
Updated to make replace the int relation type in the Relation class with instances of the RelationType class.
Updated to derive RelationList from AbstractList.
Added sample code to MpxjQuery to illustrate retrieval of information from Relation instances.
Updated MpqjQuery to parse MSPDI files as well as MPP and MPX files.
Added support for early start, early finish, late start, late finish to MPP files.
Updated MPP9 file support to handle start as late as possible constraints.
Added support for sub project file information in MPP9 files.
Fixed a bug where occasionally a task in MPP9 files were not being read.
Fixed a NegativeArrayIndexException thrown when reading certain MPP8 files.
Reduced the memory used by MPXJ by anything up to 60%, particularly when reading large MPP files.
Fixed a bug when reading MPX files where the field delimiter was not comma, and task relation lists contained more than one entry.
Updated to fix unreliable retrieval of project start and end dates from certain MPP files.
Fixed schedule from value in MSPDI files (contributed by Frank Illenberger).
Fixed a bug when reading durations in elapsed days from an MPP file.
Tasks can now have arbitrary priority values. These values are mapped to/from the fixed MPP8/MPX priority values where necessary.
Fixed a bug (again!) where deleted resource assignments in MPP9 files were still seen by MPXJ.
Updated to use class instances instead of primitives to represent some enumerated types.
Updated to implement support for reading and writing all of the basic Resource attributes found in MSPDI files.
Updated to implement support for reading and writing all of the basic Task attributes found in MSPDI files.
Updated to implement support for reading and writing all of the basic Project Header attributes from MPP8 and MPP9 files.
Made MSPDI file parsing more robust to allow it by default to cope with non-schema-compliant XML in the same manner as MS Project. Implemented a new compatibility flag to allow this behaviour to be disabled in favour of strict parsing.
Merged DateTimeSettings, CurrencySettings, and DefaultSettings into the ProjectHeader class. This change makes the project header data easier to use as it is in a single place. It also makes the entities used to describe a project consistent with the contents of the MPP and MSPDI file formats.
Fixed a bug where MPXJ was still using the default locale of the user's machine to create localised MPX files when a normal international MPX file was expected.
Fixed a bug where the incorrect record delimiter was being used in by the MPX RelationList class.
Fixed a bug where the method Task.getText21 was not retrieving the correct text value.
Fixed a bug where the task unique ID values were being truncated unnecessarily.
Fixed a bug where calendar exceptions were not testing the range of dates between the start and end date correctly.
Fixed a bug where the priority of a task was being escalated when converting between an MPP9 file and an MSPDI file.
Fixed a bug where a deadline was incorrectly being added to a task when importing data from an MPP9 file.
Fixed a bug where deleted resource assignments in MPP9 files were still seen by MPXJ.
Fixed a bug where MPXFile attributes were not being correctly copied by the copy constructor.
Fixed a rounding error in MPXCalendar.getDaysInRange (contributed by Wade Golden)
Updated to make MPXJ more robust in the face of unexpected offsets in MPP8 file format.
Updated support for password protected files to allow write reserved files to be read.
Updated to use the latest version of JAXB, as shipped in Sun's Java Web Services Developer Pack (JWSDP) version 1.4.
Updated the distribution to include the redistributable files from the JWSDP JAXB implementation. Users will no longer need to download JWSDP separately in order to make use of MPXJ's MSPDI functionality.
Updated to prevent empty notes records being added to tasks and resources when reading an MSPDI file.
Updated to improve accuracy when converting an MPP file to an MSPDI file.
Added support for blank task rows in MPP8 files.
Added support for blank resource rows in MPP8 files.
Added support for Portuguese MPX files.
Added support reading and writing extended attributes (apart from outline codes) for MSPDI files.
Added support for the Resource Type attribute.
Fixed a bug where task data was not being read correctly from very large MPP9 files.
Fixed a bug where certain MPP8 files were not read correctly when no constraint data is present.
Fixed a bug where certain MPP9 files were not read correctly.
Fixed a bug where MPP9 files containing invalid resource data were not read correctly.
Fixed a bug where MPXJ was using the default locale of the user's machine to create localised MPX files when a normal international MPX file was expected.
Fixed a bug where MPXJ not correctly handling embedded line breaks when reading and writing MPX files.
Removed arbitrary restrictions on the number of various entities, originally taken from the MPX specification.
Updated MPX documentation for Task.getFixed and Task.setFixed.
Updated MPP9 file code to improve handling invalid offset values.
Updated to remove leading and trailing spaces from MPX task field names before processing.
Updated to detect password protected files and raise a suitable exception.
Implemented an enhancement to improve file loading speed by an order of magnitude for files with a large number of tasks or resources (based on a contribution by Brian Leach).
Implemented support for Maven.
Updated MpxCreate utility to allow it to create both MPX and MSPDI files.
Added new JUnit test for confidential customer data.
Added support for the resource assignment remaining work attribute for MPP8, MPP9 and MSPDI files.
Fixed a bug where the task start date attribute was not always correct for MPP8 files.
Fixed a bug causing valid tasks to be incorrectly identified as being deleted in MPP8 files.
Fixed a bug causing an exception when reading certain MPP9 files.
Updated to allow localised MPX files to be written and read.
Implemented support for German MPX files.
Implemented generic mechanism for dealing with task field aliases.
Implemented task field alias read/write for MSPDI files.
Implemented task field alias read for MPP9 files.
Implemented resource field alias read/write for MSPDI files.
Implemented resource field alias read for MPP9 files.
Fixed a bug where alternative decimal delimiters and thousands separators were not being handled correctly when reading and writing MPX files.
Fixed a bug causing a null pointer exception when writing an MSPDI file.
Fixed a bug in MSPDI files where default values were being written incorrectly for some task attributes.
Fixed a bug with MSPDI file date handling in non GMT time zones.
Fixed a bug in processing calendar data where data block is not a multiple of 12 bytes
Fixed a bug processing tables where column data is null
Fixed checkstyle code warnings.
Fixed Eclipse code warnings.
Updated to include version 2.5 of the POI library.
Added support for task calendars.
Fixed a bug reading table data from certain MPP8 files
Updated MSPDI support to use the latest version of JAXB (from JWSDP-1.3)
Re-implemented base and resource calendars as a single MPXCalendar class
Updated support for base calendars and resource calendars for all file formats
Improved MPXException to print details of any nested exception when a stack trace is printed.
Removed unnecessary use of ByteArray.java
Added support for the following task fields: ActualOvertimeCost, ActualOvertimeWork, FixedCostAccrual, Hyperlink, HyperlinkAddress, HyperlinkSubAddress, LevelAssignments, LevelingCanSplit, LevelingDelay, PreleveledStart, PreleveledFinish, RemainingOvertimeCost, RemainingOvertimeWork.
Fixed a bug with writing MS Project compatible MSPDI XML files in non-GMT timezones.
Fixed a bug with writing MSPDI XML files in non-GMT timezones.
Fixed a bug causing an exception when zero length calendar names were present
Fixed a bug causing MPP8 flags to be read incorrectly. Note that flag 20 is still not read correctly.
Fixed a bug with the "Microsoft Project Compatible Output" flag for MSPDI files.
Fixed a bug reading task text 10.
Added new MPXFile.setIgnoreTextModel() method to allow MPXJ to ignore faulty text version of task or resource model records in MPX files.
Improved invalid MPX data error handling and reporting.
Added BaseCalendar.getDate method to allow end dates to be calculated based on a start date and a duration of working time.
Made MPXDateFormat implement java.io.Serializable to allow MPXDate to serialize correctly.
Updated the ant build file to allow MPXJ to be built without the components that depend on JAXB
Rationalised setDefaultStartTime and setDefaultEndTime methods
Added MppXml utility
Added support for querying view information held in MPP files.
Added support for querying table information held in MPP files. (NB This allows the user to retrieve column information, including user defined column names)
Added support for outlinecode1-10 fields in MPP9 files.
Added support for resource "available from" and "available to" fields.
Verified that MPXJ will read MPP files written by Microsoft Project 2003 (they are still MPP9 files).
Fixed a bug where a decimal point was being appended to the currency format even if no decimal digits were required.
Fixed a bug where special characters appearing in the currency symbol were not being quoted.
Fixed a bug that caused resource assignments to be incorrectly read from some MPP8 files.
Added a new write method to MPXFile allowing the user control over the character encoding used when writing an MPX file.
Fixed bug causing some extended boolean attributes to be read incorrectly.
Fixed bug causing MPP8 file task data to be read incorrectly under certain circumstances.
Updated calendar duration code to account for calendar exceptions.
Fixed a bug causing resource assignments to be duplicated in an MPX file created programmatically.
Fixed a bug causing an incorrect duration value to be read from an MPP9 file.
Fixed a bug causing invalid MPX files to be written in locales which don't use a period as the decimal separator.
Fixed a bug causing embedded quote and comma characters in task and resource notes to be handled incorrectly.
Added simple JUnit test to demonstrate iteration through relationships.
Added an example of programmatically creating a partially complete task to the MPXCreate.java example.
Added default values to the MPX project header.
Added support for reading the RemainingDuration field from an MPP9 file.
Updated predecessor and successor method documentation.
Updated Task.get/set ResourceInitials and Task.get/set ResourceNames method documentation.
Updated to extract the following fields from resource assignment data in MPP files which were previously not imported: ActualCost, ActualWork, Cost, Finish, Start, Units, Work.
Updated to extract the following fields from resource data in an MPP9 file which were previously not imported: Flag1-Flag20.
Added the method MPPFile.getFileType to allow the type of MPP file (MPP8: 98, MPP9: 2000,2002) to be determined.
Updated API to make classes final and constructors package access only where appropriate.
Updated to use of 6 byte long int fields for cost and work values for MPP8.
Fixed error in reading task fixed cost for MPP8.
Updated to extract the following fields from task data in an MPP8 file which were previously not imported: Contact, Cost1-Cost10, Date1-Date10, Duration1-Duration10, EffortDriven, Finish1-Finish10, Flag1-Flag20, HideBar, Milestone, Number1-Number20, Rollup, Start1-Start10, Text1-Text30, Type, WBS.
Updated to extract the following fields from resource data in an MPP8 file which were previously not imported: Code, Cost1-Cost10, Date1-Date10, Duration1-Duration10, EmailAddress, Finish1-Finish10, Number1-Number20, Start1-Start10, Text1-Text30
Added support for task and resource note fields in MPP8 files.
Added support for the OvertimeCost task attribute for all file formats.
Updated to extract calendar data from MPP8 files.
Updated resource notes to fix end of line handling problem.
Added functionality to read default settings and currency settings data from MPP files.
Implemented support for the Microsoft Project 98 file format.
Fixed a bug that prevented task and resource note text from being read.
Updated to remove a Java 1.4 dependency introduced in 0.0.12. Will now work with Java 1.3.
Updated to correct handling of carriage returns embedded in note fields.
Fixed incorrect handling of timezones and daylight saving time.
Fixed incorrect task structure generated from outline levels.
Updated to extract the notes fields from tasks and resources read from an MPP file.
Added the option to remove or preserve the RTF formatting from the note fields from an MPP file.
Updated to extract the following fields from task data in an MPP file which were previously not imported: Text11-Text30, Number6-Number20, Duration4-Duration10, Date1-Date10, Cost4-Cost10, Start6-Start10, Finish6-Finish10
Updated to extract the following fields from resource data in an MPP file which were previously not imported: Text6-Text30, Start1-Start10, Finish1-Finish10, Number1-Number20, Duration1-Duration10, Date1-Date10, Cost1-Cost10
Fixed error in format string used in one of the example files.
Fixed error where double byte characters were being read incorrectly.
Fixed error where deleted constraints were being resurrected when read from an MPP file.
Updated to extract the following fields from task data in an MPP file which were previously not imported: Flag11-Flag20, Rollup, HideBar, EffortDriven.
Corrected Actual Start and Actual End fields from MPP file.
Fixed bug where time values were being broken by daylight saving time in the user's default locale.
Updated to extract the following fields from task data in an MPP file which were previously not imported: Actual Work, Baseline Work, Cost Variance, Deadline, Remaining Work, Work.
Updated to extract the following fields from resource data in an MPP file which were previously not imported: Actual Cost, Actual Overtime Cost, Actual Work, Baseline Work, Cost, Cost Variance, Max Units, Overtime Cost, Overtime Rate, Overtime Work, Peak, Regular work, Remaining Cost, Remaining Overtime Cost, Remaining Work, Standard Rate, Work, Work Variance
Fixed bug when handling certain types of modified MPP file where resources have been updated.
Added sample MPP files for bugs to the JUnit tests.
Added support for summary flag import from MPP files.
Added automatic summary flag update when creating an MPX file programmatically.
Added new constructor to the MSPDIFile class to allow MSPDI files to be created from scratch.
Added support for estimated durations.
Fixed bug in handling certain types of modified MPP file where tasks have been updated.
Added the facility to auto generate outline numbers.