///*
//The contents of this file are subject to the Common Public Attribution License
//Version 1.0 (the "License"); you may not use this file except in compliance with
//the License. You may obtain a copy of the License at
//http://www.projity.com/license . The License is based on the Mozilla Public
//License Version 1.1 but Sections 14 and 15 have been added to cover use of
//software over a computer network and provide for limited attribution for the
//Original Developer. In addition, Exhibit A has been modified to be consistent
//with Exhibit B.
//
//Software distributed under the License is distributed on an "AS IS" basis,
//WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the
//specific language governing rights and limitations under the License. The
//Original Code is OpenProj. The Original Developer is the Initial Developer and
//is Projity, Inc. All portions of the code written by Projity are Copyright (c)
//2006, 2007. All Rights Reserved. Contributors Projity, Inc.
//
//Alternatively, the contents of this file may be used under the terms of the
//Projity End-User License Agreeement (the Projity License), in which case the
//provisions of the Projity License are applicable instead of those above. If you
//wish to allow use of your version of this file only under the terms of the
//Projity License and not to allow others to use your version of this file under
//the CPAL, indicate your decision by deleting the provisions above and replace
//them with the notice and other provisions required by the Projity License. If
//you do not delete the provisions above, a recipient may use your version of this
//file under either the CPAL or the Projity License.
//
//[NOTE: The text of this license may differ slightly from the text of the notices
//in Exhibits A and B of the license at http://www.projity.com/license. You should
//use the latest text at http://www.projity.com/license for your modifications.
//You may not remove this license text from the source files.]
//
//Attribution Information: Attribution Copyright Notice: Copyright � 2006, 2007
//Projity, Inc. Attribution Phrase (not exceeding 10 words): Powered by OpenProj,
//an open source solution from Projity. Attribution URL: http://www.projity.com
//Graphic Image as provided in the Covered Code as file: openproj_logo.png with
//alternatives listed on http://www.projity.com/logo
//
//Display of Attribution Information is required in Larger Works which are defined
//in the CPAL as a work which combines Covered Code or portions thereof with code
//not governed by the terms of the CPAL. However, in addition to the other notice
//obligations, all copies of the Covered Code in Executable and Source Code form
//distributed must, as a form of attribution of the original author, include on
//each user interface screen the "OpenProj" logo visible to all users. The
//OpenProj logo should be located horizontally aligned with the menu bar and left
//justified on the top left of the screen adjacent to the File menu. The logo
//must be at least 100 x 25 pixels. When users click on the "OpenProj" logo it
//must direct them back to http://www.projity.com.
//*/
//
//package com.projity.server.data.mspdi;
//
//import java.io.InputStream;
//import java.util.Calendar;
//import java.util.Date;
//import java.util.HashMap;
//import java.util.Iterator;
//import java.util.List;
//import java.util.Map;
//
//import net.sf.mpxj.Duration;
//import net.sf.mpxj.MPXJException;
//import net.sf.mpxj.ProjectFile;
//import net.sf.mpxj.Resource;
//import net.sf.mpxj.ResourceAssignment;
//import net.sf.mpxj.SplitTaskFactory;
//import net.sf.mpxj.TimeUnit;
//import net.sf.mpxj.TimephasedWorkNormaliser;
//import net.sf.mpxj.mspdi.MSPDIReader;
//import net.sf.mpxj.mspdi.schema.Project;
//import net.sf.mpxj.mspdi.schema.TimephasedDataType;
//
//import com.projity.contrib.util.Log;
//import com.projity.contrib.util.LogFactory;
//import com.projity.pm.assignment.Assignment;
//import com.projity.pm.calendar.WorkCalendar;
//import com.projity.pm.resource.EnterpriseResource;
//
///**
// * This class is used to represent a Microsoft Project Data Interchange (MSPDI)
// * XML file. This implementation allows the file to be read, and the data it
// * contains exported as a set of MPX objects. These objects can be interrogated
// * to retrieve any required data, or stored as an MPX file.
// */
//public class ModifiedMSPDIReader extends MSPDIReader {
// //static Log logg=LogFactory.getLog(ModifiedMSPDIFile.class);
// /**
// * This constructor allows a new MSPDI file to be created from scratch.
// */
// public ModifiedMSPDIReader() {
// super();
// }
//
// public ProjectFile read (InputStream stream) throws MPXJException {
//// return super.read(stream);
// Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
//// ProjectFile pf = readSax(stream);
// ProjectFile pf = super.read(stream); //claur Sax is now used in mxpj
//// processPreds();
// return pf;
// }
//
//
// private Resource unassignedResource() {
// // add the unassigned resource
// if (UNASSIGNED == null) {
// UNASSIGNED = m_projectFile.addResource();
// UNASSIGNED.setUniqueID(EnterpriseResource.UNASSIGNED_ID);
// }
// return UNASSIGNED;
//
// }
// protected void readResources(Project project, HashMap calendarMap) {
// super.readResources(project,calendarMap);
// unassignedResource();
//
// }
//
//
//
// // Projity specific stuff below
//
// static Log log = LogFactory.getLog(ModifiedMSPDIReader.class);
// protected com.projity.pm.task.Project projityProject;
// protected Map projityTaskMap = new HashMap();
// protected Map projityAssignmentMap = new HashMap();
// protected Map projitySnapshotIdMap = new HashMap();
// private static Resource UNASSIGNED = null;
//
//
// public void setProjityProject(com.projity.pm.task.Project projityProject) {
// this.projityProject = projityProject;
// }
//
// public void putProjityTaskMap(Object mpx, Object projity) {
// projityTaskMap.put(mpx, projity);
// }
//
// public void putProjityAssignmentMap(Object mpx, Object projity) {
// projityAssignmentMap.put(mpx, projity);
// }
//
// public void putProjitySnapshotIdMap(Object mpx, Object projity) {
// projitySnapshotIdMap.put(mpx, projity);
// }
//
//
// /**
// * overloads default behavior to return the "unassigned" resource
// */
// public Resource getResourceByUniqueID(int id) {
// Resource r;
// if (id == EnterpriseResource.UNASSIGNED_ID)
// r = unassignedResource();
// else
// r = m_projectFile.getResourceByUniqueID(id);
// return r;
//
// }
//
// public static void readAssignmentBaselinesAndTimephased(Assignment projityAssignment, List timePhasedList) {
// Iterator i = timePhasedList.iterator();
// TimephasedService service = TimephasedService.getInstance();
//
//// boolean isPodServer = !Environment.isNoPodServer(); //claur
//// if (isPodServer){
// while (i.hasNext()) {
// service.readTimephased(projityAssignment, (TimephasedDataType) i.next());
// }
//// } else {
//// // JGao - 9/16/2009 Added logic to combine all time phased data on the same day
//// // This way, the contour on pod is set correctly without worring about the calendar differences
//// TimephasedDataType tempData = null;
//// while (i.hasNext()) {
//// TimephasedDataType currentData = (TimephasedDataType) i.next();
//// if (tempData == null){
//// tempData = new TimephasedDataType();
//// CloneTimephasedData( currentData, tempData );
//// if (i.hasNext())
//// continue;
////
//// } else {
//// boolean dataCombined = CombineTimephasedDataIfOnSameDay( tempData, currentData );
//// if (dataCombined && i.hasNext())
//// continue;
//// }
////
//// service.readTimephased( projityAssignment, tempData );
////
//// tempData = null;
//// tempData = new TimephasedDataType();
//// CloneTimephasedData( currentData, tempData );
//// if (!i.hasNext()){
//// service.readTimephased( projityAssignment, tempData );
//// }
//// }
//// }
// projityAssignment.makeFlatIfPossible(); // don't use a contour if it's
// // really flat
// }
//
// private static void CloneTimephasedData(TimephasedDataType from, TimephasedDataType to){
// to.setType( from.getType() );
// to.setUID( from.getUID() );
// to.setUnit( from.getUnit() );
//// // Set time to 12 midnight
//// Calendar newCalendarValue = Calendar.getInstance();
//// newCalendarValue.setTimeInMillis( DateTime.dayFloor( DateTime.gmt(from.getStart().getTime())) );
// to.setStart( (Calendar) from.getStart().clone() );
//// newCalendarValue = Calendar.getInstance();
//// newCalendarValue.setTimeInMillis( DateTime.dayFloor( DateTime.gmt(from.getFinish().getTime())) );
// to.setFinish( (Calendar) from.getStart().clone() );
// to.getFinish().add( Calendar.DAY_OF_MONTH, 1 );
// to.setValue( from.getValue() );
// }
//
// private static boolean CombineTimephasedDataIfOnSameDay( TimephasedDataType original, TimephasedDataType newData ){
// boolean dataCombined = false;
// Date newStart = newData.getStart().getTime();
// Date newFinish = newData.getFinish().getTime();
// Date originalStart = original.getStart().getTime();
// Date originalFinish = original.getFinish().getTime();
// if (newStart.after(originalStart) && newFinish.before(originalFinish)){
// long sumValue = XsdDuration.millis( original.getValue() ) + XsdDuration.millis( newData.getValue() );
// Duration combined = Duration.getInstance( sumValue / WorkCalendar.MILLIS_IN_MINUTE, TimeUnit.MINUTES );
// original.setValue( new XsdDuration(combined).toString() );
// dataCombined = true;
// }
//
// return dataCombined;
// }
//
//
//
// /**
// * This method extracts data for a single assignment from an MSPDI file.
// *
// * @param assignment
// * Assignment data
// */
// public ResourceAssignment readAssignment(Project.Assignments.Assignment assignment, SplitTaskFactory splitFactory, TimephasedWorkNormaliser normaliser) { //claur
// ResourceAssignment mpx = super.readAssignment(assignment,splitFactory,normaliser);
// if (mpx != null)
// putTimephasedList(mpx, assignment.getTimephasedData()); // so as to extract timephased data later on
// return mpx;
// }
// protected Map<ResourceAssignment,List<TimephasedDataType>> timephasedMap = new HashMap<ResourceAssignment,List<TimephasedDataType>>();
// public void putTimephasedList(ResourceAssignment mpx, List<TimephasedDataType> timephasedList) { //claur
// if (mpx == null || timephasedList == null)
// return;
// timephasedMap.put(mpx, timephasedList);
// }
//
// public List<TimephasedDataType> getTimephasedList(ResourceAssignment mpx) {
// return (List<TimephasedDataType>) timephasedMap.get(mpx);
// }
//
//}