_existingProject = existingProject;
_localResourceMap = localResourceMap;
}
public Project deserializeProject(ProjectData projectData, final boolean subproject, final Session reindex, Map enterpriseResources,Closure loadResources,boolean updateDistribution) throws IOException, ClassNotFoundException {
DataFactoryUndoController undoController=new DataFactoryUndoController();
Project project=(Project)deserialize(projectData,reindex);
project.setUndoController(undoController);
project.setMaster(projectData.isMaster()); //not necessary
project.setLocal(projectData.isLocal());
project.setReadOnly(!projectData.canBeUsed());
project.setCreationDate(projectData.getCreationDate());
project.setLastModificationDate(projectData.getLastModificationDate());
//project.setExternalId(projectData.getExternalId());
boolean fixCorruption=false;
//IncrementalData incremental=new IncrementalData();
//calendar
// WorkCalendar calendar = project.getWorkCalendar();
// if (projectData.getCalendar()==null) {
// System.out.println("deserializing null project calendar");
// calendar= CalendarService.getInstance().getStandardBasedInstance(project);
// } else {
// calendar= (WorkingCalendar)deserializeCalendar(projectData.getCalendar());
// calendar.setDocument(project);
// CalendarService.getInstance().add(calendar);
// }
// CalendarService.getInstance().add((WorkingCalendar) calendar);
//calendar
//TODO this code only exists to guarantee that older projects wont crash when read 25/8/05
WorkCalendar calendar=project.getWorkCalendar();
if (calendar==null)
calendar = CalendarService.getInstance().getDefaultInstance();
project.setWorkCalendar(calendar); // needed for objects using
project.setExtraFields(projectData.getExtraFields());
project.setGroup(projectData.getGroup());
project.setDivision(projectData.getDivision());
project.setExpenseType(projectData.getExpenseType());
project.setProjectType(projectData.getProjectType());
project.setProjectStatus(projectData.getProjectStatus());
project.setAccessControlPolicy(projectData.getAccessControlPolicy());
project.postDeserialization();
//resources
final Map resourceNodeMap=new HashMap();
ResourcePool resourcePool = ResourcePoolFactory.getInstance().createResourcePool(project.getName(),undoController);
resourcePool.setMaster(project.isMaster());
resourcePool.setLocal(project.isLocal());
resourcePool.updateOutlineTypes();
Collection resources=projectData.getResources();
if (resources!=null)
//order by position parents don't matter
Collections.sort((List<ResourceData>)resources,new Comparator<ResourceData>(){
public int compare(ResourceData resource1, ResourceData resource2) {
if (resource1.getChildPosition()>resource2.getChildPosition()) return 1;
else return -1;
}
});
if (resources!=null)
for (Iterator i=resources.iterator();i.hasNext();){
ResourceData resourceData=(ResourceData)i.next();
ResourceImpl resource=deserializeResourceAndAddToPool(resourceData,resourcePool,reindex,enterpriseResources);
Resource origImpl = _localResourceMap.get(resourceData.getUniqueId());
//old code below
//resourceNodeMap.put(resourceData.getEnterpriseResource(),NodeFactory.getInstance().createNode(resource));
//replaced with change for DEF165936
resourceNodeMap.put(resourceData.getEnterpriseResource(),NodeFactory.getInstance().createNode(origImpl));
}
project.setResourcePool(resourcePool);
//resource outline
/* version with outline on project resource
* if (resources!=null){
for (Iterator i=resources.iterator();i.hasNext();){
ResourceData resourceData=(ResourceData)i.next();
ResourceData parentData=(ResourceData)resourceData.getParentResource();
Node node=(Node)resourceNodeMap.get(resourceData.getEnterpriseResource());
Node parentNode=(parentData==null)?
null:
((Node)resourceNodeMap.get(parentData.getEnterpriseResource()));
project.getResourcePool().addToDefaultOutline(parentNode,node,(int)resourceData.getChildPosition());
}
}*/
if (resources!=null){
for (Iterator i=resources.iterator();i.hasNext();){
ResourceData resourceData=(ResourceData)i.next();
EnterpriseResourceData enterpriseResourceData=resourceData.getEnterpriseResource();
EnterpriseResourceData parentData=enterpriseResourceData.getParentResource();
Node node=(Node)resourceNodeMap.get(enterpriseResourceData);
Node parentNode=(parentData==null)?
null:
((Node)resourceNodeMap.get(parentData));
project.getResourcePool().addToDefaultOutline(parentNode,node,(int)enterpriseResourceData.getChildPosition(),false);
((ResourceImpl)node.getImpl()).getGlobalResource().setResourcePool(project.getResourcePool());
}
project.getResourcePool().getResourceOutline().getHierarchy().cleanVoidChildren();
//renumber resources
project.getResourcePool().getResourceOutline().getHierarchy().visitAll(new Closure(){
int id=1;
public void execute(Object o) {
Node node=(Node)o;
if (node.getImpl() instanceof HasId){
HasId impl=(HasId)node.getImpl();
if (impl.getId()>0) impl.setId(id++); //if id=0 means id not used
}
}
});
}
if (loadResources!=null){
loadResources.execute(project);
resourceNodeMap.clear();
project.getResourcePool().getResourceOutline().getHierarchy().visitAll(new Closure(){
public void execute(Object o) {
Node node=(Node)o;
HasKey k=(HasKey)node.getImpl();
resourceNodeMap.put(k.getUniqueId(), node);
}
});
}
//tasks
Collection tasks=projectData.getTasks();
Map taskNodeMap=new HashMap();
long projectId = project.getUniqueId();
NormalTask task;
if (tasks!=null){
//order by position parents don't matter
Collections.sort((List<TaskData>)tasks,new Comparator<TaskData>(){
public int compare(TaskData task1, TaskData task2) {
if (!task1.isExternal() && task2.isExternal()) return -1; //keep external tasks at the end
else if (task1.isExternal() && !task2.isExternal()) return 1;
else if (task1.getChildPosition()>task2.getChildPosition()) return 1;
else return -1;
}
});
//Set<Long> initialTaskIds=new HashSet<Long>();
//project.setInitialTaskIds(initialTaskIds);
for (Iterator i=tasks.iterator();i.hasNext();){
task = null;
TaskData taskData=(TaskData)i.next();
// initialTaskIds.add(taskData.getUniqueId());
if (taskData.isDirty()) fixCorruption=true; //recovers errors
// if (Environment.isAddSummaryTask()&&taskData.getUniqueId()==Task.SUMMARY_UNIQUE_ID&&taskData.getSerialized()==null){ //claur
// System.out.println("Fixing null binary summary task");
// task = new NormalTask(project);
// task.setName(taskData.getName());
// task.setUniqueId(taskData.getUniqueId());
// }else
if (taskData.getSerialized()==null) {
if (taskData.isTimesheetCreated()) {
task = new NormalTask(project);
task.setName(taskData.getName());
System.out.println("made new task in serializer " + task + " parent " + taskData.getParentTask().getName());
} else {
continue; // void node
}
} else {
try {
task = (NormalTask)deserialize(taskData,reindex);
} catch (Exception e) {
if (taskData.isSubproject()){ //For migration
try {
task = (NormalTask) Class.forName(Messages.getMetaString("Subproject")).getConstructor(new Class[]{Project.class,Long.class}).newInstance(project,taskData.getSubprojectId());
} catch (Exception e1) {
e1.printStackTrace();
}
// task=new Subproject(project,taskData.getSubprojectId());
task.setUniqueId(taskData.getUniqueId());
task.setName(taskData.getName());
((SubProj)task).setSubprojectFieldValues(taskData.getSubprojectFieldValues());
}
else{
e.printStackTrace();
throw new IOException("Subproject:"+e);
}
}
}
taskNodeMap.put(taskData,NodeFactory.getInstance().createNode(task));
task.setProject(project);
project.initializeId(task);
project.add(task);
if (taskData.isExternal()) {
task.setExternal(true);
task.setProjectId(taskData.getProjectId());
task.setAllSchedulesToCurrentDates();
project.addExternalTask(task);
} else {
task.setOwningProject(project);
task.setProjectId(projectId);
}
if (taskData.isSubproject()) {
SubProj sub = (SubProj)task;
sub.setSubprojectUniqueId(taskData.getSubprojectId());
sub.setSubprojectFieldValues(taskData.getSubprojectFieldValues());
sub.setSchedulesFromSubprojectFieldValues();
}
// if (task.isRoot()){ //claur
// project.setSummaryTaskEnabled(true);
// }
WorkingCalendar cal=(WorkingCalendar) task.getWorkCalendar();
if (cal!=null){ // use global one
WorkingCalendar newCal = (WorkingCalendar) CalendarService.findBaseCalendar(cal.getName());
if (newCal != null && newCal != cal)
task.setWorkCalendar(newCal);
}
//project.addToDefaultOutline(null,);
//assignments
List assignments=new ArrayList();
// if (Environment.isNoPodServer()&&task.getPersistedAssignments()!=null){ //claur
// assignments.addAll(task.getPersistedAssignments());
// }
if (taskData.getAssignments()!=null) assignments.addAll(taskData.getAssignments());
if (assignments.size()>0)
for (Iterator j=assignments.iterator();j.hasNext();){
Object obj=j.next();
AssignmentData assignmentData=null;
// if (loadResources!=null&&obj instanceof PersistedAssignment){ //claur
// }else{
assignmentData=(AssignmentData)obj;
if (assignmentData.getSerialized() == null) { // timesheet created
System.out.println("==== no cached start found " + task.getName());
if (assignments.size()==1)
assignmentData.setResourceId(-1L);
else j.remove();
}
// }
}
if (assignments.size()>0)
for (Iterator j=assignments.iterator();j.hasNext();){
Object obj=j.next();
AssignmentData assignmentData=null;
Assignment assignment=null;
Resource resource;
boolean assigned=true;
int s;
// if (loadResources!=null&&obj instanceof PersistedAssignment){ //claur
// PersistedAssignment pa=(PersistedAssignment)obj;
// assignment=pa.getAssignment();
// s=pa.getSnapshot();
//
// long resId=pa.getResourceId();
// Node node=(Node)resourceNodeMap.get(resId);
// resource=node==null?ResourceImpl.getUnassignedInstance():(Resource)node.getImpl();
//
// if (resource==null) assigned=false;
// }else{
assignmentData=(AssignmentData)obj;
if (loadResources==null){
EnterpriseResourceData r=assignmentData.getResource();
if (r==null) assigned=false;
resource=(r==null)?ResourceImpl.getUnassignedInstance():(Resource)((Node)resourceNodeMap.get(r)).getImpl();
}else{
long resId=assignmentData.getResourceId();
Node node=(Node)resourceNodeMap.get(resId);
resource=node==null?ResourceImpl.getUnassignedInstance():(Resource)node.getImpl();
}
if (assignmentData.getSerialized() != null){
try {
assignment=(Assignment)deserialize(assignmentData,reindex);
} catch (Exception e) {
e.printStackTrace();
}
}
if (assignmentData.getSerialized() == null||(assignmentData.getSerialized() != null&&assignment==null)) { // timesheet created
assignment = Assignment.getInstance(task,resource, 1.0, 0);
if (assignment.getCachedStart() == null) { //doesn't occur filtered above
System.out.println("==== no cached start found " + task.getName());
} else {
task.setActualStart(assignment.getCachedStart().getTime());
task.setActualFinish(assignment.getCachedEnd().getTime());
}
}
assignment.setCachedStart(assignmentData.getCachedStart());
assignment.setCachedEnd(assignmentData.getCachedEnd());
assignment.setTimesheetStatus(assignmentData.getTimesheetStatus());
long lastUpdate = (assignmentData.getLastTimesheetUpdate() == null) ? 0 : assignmentData.getLastTimesheetUpdate().getTime();
assignment.setLastTimesheetUpdate(lastUpdate);
assignment.setWorkflowState(assignmentData.getWorkflowState());
s=assignmentData.getSnapshotId();
// }
assignment.getDetail().setTask(task);
assignment.getDetail().setResource(resource);
Object snapshotId=new Integer(s);
TaskSnapshot snapshot=(TaskSnapshot)task.getSnapshot(snapshotId);
//TODO was commented but needed for loading because task.getSnapshot(snapshotId)==null
//for snapshots other than CURRENT
if (snapshot==null){
snapshot=new TaskSnapshot();
snapshot.setCurrentSchedule(task.getCurrentSchedule());
task.setSnapshot(snapshotId,snapshot);
}
if (Snapshottable.TIMESHEET.equals(snapshotId)) {
assignment.setTimesheetAssignment(true);
}
//
snapshot.addAssignment(assignment);
if (assigned&&Snapshottable.CURRENT.equals(snapshotId)) resource.addAssignment(assignment);
if (assignmentData!=null) assignmentData.emtpy();
//incremental.addAssignment(assignmentData);
}
// task.setPersistedAssignments(null);
}
// the collection which holds a list of corresponding subproject tasks for projects which include this project
// note that their task names have been transformed to hold the name of the project
Collection referringSubprojectTaskData=projectData.getReferringSubprojectTasks();
if (tasks!=null&&referringSubprojectTaskData!=null){
ArrayList referringSubprojectTasks = new ArrayList(referringSubprojectTaskData.size());
project.setReferringSubprojectTasks(referringSubprojectTasks);
for (Iterator i=referringSubprojectTaskData.iterator();i.hasNext();){
TaskData taskData=(TaskData)i.next();
String projectName = taskData.getName(); // it was set to the referrig project name by synchronizer
task = null;
try {
task = (NormalTask)deserialize(taskData,reindex);
} catch (Exception e) {
if (taskData.isSubproject()){ //For migration
task=(NormalTask) project.getSubprojectHandler().createSubProj(taskData.getSubprojectId());
task.setUniqueId(taskData.getUniqueId());
task.setName(taskData.getName());
((SubProj)task).setSubprojectFieldValues(taskData.getSubprojectFieldValues());
}
else throw new IOException("Subproject:"+e);
}
task.setName(projectName);
task.setProjectId(taskData.getProjectId());
referringSubprojectTasks.add(task);
}
}
//dependencies
//Set<DependencyKey> initialLinkIds=null;
for (Iterator i=projectData.getTasks().iterator();i.hasNext();){
TaskData successorssorData=(TaskData)i.next();
if (successorssorData.getPredecessors()!=null){
final Task successor=(Task)((Node)taskNodeMap.get(successorssorData)).getImpl();
for (Iterator j=successorssorData.getPredecessors().iterator();j.hasNext();){
LinkData linkData=(LinkData)j.next();
// if (initialLinkIds==null){
// initialLinkIds=new HashSet<DependencyKey>();
// project.setInitialLinkIds(initialLinkIds);
// }
// initialLinkIds.add(new DependencyKey(linkData.getPredecessorId(),linkData.getSuccessorId()/*,externalId*/));
Dependency dependency=(Dependency)deserialize(linkData,reindex);
if (linkData.getPredecessor() == null) {
System.out.println("null pred - this shouldn't happen. skipping"); // todo treat it
continue;
}
final Task predecessor=(Task)((Node)taskNodeMap.get(linkData.getPredecessor())).getImpl();
connectDependency(dependency,predecessor,successor);
linkData.emtpy(); //why is this there?
}
}
}
}
//task outline
if (tasks!=null){
//add missing summary task
Node summaryNode=null;
// if (Environment.isAddSummaryTask()&&!project.isSummaryTaskEnabled() //needed for import, add other conditions? //claur
// && (tasks.size()==0||((TaskData)tasks.iterator().next()).getUniqueId()!=Task.SUMMARY_UNIQUE_ID)){
// NormalTask projityTask = project.newNormalTaskInstance(false);
// projityTask.setName(Messages.getString("Text.DefaultSummaryTaskName"));
// projityTask.setUniqueId(DataObject.SUMMARY_UNIQUE_ID);
// projityTask.setOwningProject(project);
// projityTask.setProjectId(project.getUniqueId());
// summaryNode = NodeFactory.getInstance().createNode(projityTask); // get a node for this task
// project.addToDefaultOutline(null,summaryNode);
// project.setSummaryTaskEnabled(true);
// }
Map<Long, Node> subprojectsMap=new HashMap<Long, Node>();
for (Iterator i=tasks.iterator();i.hasNext();){
TaskData taskData=(TaskData)i.next();
TaskData parentData=taskData.getParentTask();
// if (taskData.isTimesheetCreated())
// System.out.println("timesheet created parent is " + parentData == null ? null : parentData.getName());
Node node;
if (taskData.getSerialized()==null /*&& taskData.getUniqueId()!=Task.SUMMARY_UNIQUE_ID*/ &&!taskData.isTimesheetCreated()) //void node //claur
node=NodeFactory.getInstance().createVoidNode();
else node=(Node)taskNodeMap.get(taskData);
Node parentNode=null;
int position=-1;
if (taskData.isExternal()){
Node previous=subprojectsMap.get(taskData.getProjectId());
if (previous!=null) parentNode=(Node)previous.getParent();
if (parentNode!=null){
position=parentNode.getIndex(previous)+1;
if (parentNode.isRoot()) parentNode=null;
}
}
if (position==-1){
if (parentData==null&&summaryNode!=null)
parentNode=summaryNode;
else
parentNode=(parentData==null)?
null:
((Node)taskNodeMap.get(parentData));
position=(int)taskData.getChildPosition();
}
if (taskData.isTimesheetCreated())
System.out.println("new task " + node + "parent node is " + parentNode);
if (node.getImpl() instanceof SubProj){
SubProj sub=(SubProj)node.getImpl();
subprojectsMap.put(sub.getSubprojectUniqueId(), node);
}
project.addToDefaultOutline(parentNode,node,position,false);
taskData.emtpy();
//incremental.addTask(taskData);
}
//renumber tasks and save outline
project.getTaskOutline().getHierarchy().visitAll(new Closure(){
int id=1;
public void execute(Object o) {
Node node=(Node)o;
if (node.getImpl() instanceof HasId){ //renumber
HasId impl=(HasId)node.getImpl();
if (impl.getId()>0) impl.setId(id++); //if id=0 means id not used
}
// if (node.getImpl() instanceof Task){ //save outline
// Task t=(Task)node.getImpl();
// Node parent=(Node)node.getParent();
// if (parent==null||parent.isRoot()) t.setLastSavedParentId(-1L);
// else t.setLastSavedParentId(((Task)parent.getImpl()).getUniqueId());
// t.setLastSavedPosistion(parent.getIndex(node));
// }
//done in setAllTasksAsUnchangedFromPersisted
}
});
}
if (resources!=null)
for (Iterator i=resources.iterator();i.hasNext();){
ResourceData resourceData=(ResourceData)i.next();
EnterpriseResourceData enterpriseResourceData=resourceData.getEnterpriseResource();
resourceData.emtpy();
//incremental.addResource(resourceData);
enterpriseResourceData.emtpy();
//incremental.addEnterpriseResource(enterpriseResourceData);
}
((DefaultNodeModel)project.getTaskOutline()).setDataFactory(project);
project.initialize(subproject,updateDistribution&&!fixCorruption);
projectData.emtpy();
//incremental.setProject(projectData); //remove
(new DistributionConverter()).substractDistributionFromProject(project);
//distribution map
//project.updateDistributionMap();
if (fixCorruption) project.setForceNonIncremental(true);
if (project.getVersion()<1.2){
project.setForceNonIncrementalDistributions(true);
}
project.setVersion(Project.CURRENT_VERSION);
return project;
}