/*
GanttProject is an opensource project management tool.
Copyright (C) 2002-2010 Alexandre Thomas, Dmitry Barashev
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 3
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package net.sourceforge.ganttproject.parser;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import net.sourceforge.ganttproject.GPLogger;
import net.sourceforge.ganttproject.resource.HumanResource;
import net.sourceforge.ganttproject.resource.HumanResourceManager;
import net.sourceforge.ganttproject.roles.Role;
import net.sourceforge.ganttproject.roles.RoleManager;
import net.sourceforge.ganttproject.roles.RolePersistentID;
import net.sourceforge.ganttproject.roles.RoleSet;
import net.sourceforge.ganttproject.task.ResourceAssignment;
import net.sourceforge.ganttproject.task.Task;
import net.sourceforge.ganttproject.task.TaskManager;
import org.xml.sax.Attributes;
/**
* @author bard
*/
public class AllocationTagHandler extends AbstractTagHandler implements ParsingListener {
private HumanResourceManager myResourceManager;
private TaskManager myTaskManager;
private RoleManager myRoleManager;
private final HashMap<ResourceAssignment, String> myLateAssigmnent2roleBinding = new HashMap<ResourceAssignment, String>();
public AllocationTagHandler(HumanResourceManager resourceMgr, TaskManager taskMgr, RoleManager roleMgr) {
super("allocation");
myResourceManager = resourceMgr;
myTaskManager = taskMgr;
myRoleManager = roleMgr;
}
@Override
protected boolean onStartElement(Attributes attrs) {
try {
loadAllocation(attrs);
return true;
} catch (FileFormatException e) {
GPLogger.log(e);
return false;
}
}
private void loadAllocation(Attributes attrs) throws FileFormatException {
int taskId = 0;
int resourceId = 0;
float load = 100;
boolean coordinator = false;
String taskIdAsString = attrs.getValue("task-id");
String resourceIdAsString = attrs.getValue("resource-id");
String loadAsString = attrs.getValue("load");
String coordinatorAsString = attrs.getValue("responsible");
String rolePersistendIDString = attrs.getValue("function");
if (taskIdAsString == null || resourceIdAsString == null) {
throw new FileFormatException("Failed to load <allocation> tag: task or resource identifier is missing");
}
try {
taskId = Integer.parseInt(taskIdAsString);
resourceId = Integer.parseInt(resourceIdAsString);
if (loadAsString != null) {
load = Float.parseFloat(loadAsString);
}
if (coordinatorAsString != null) {
coordinator = Boolean.valueOf(coordinatorAsString).booleanValue();
}
} catch (NumberFormatException e) {
throw new FileFormatException("Failed to load <allocation> tag: one of attribute values is invalid", e);
}
HumanResource human = getResourceManager().getById(resourceId);
if (human == null) {
throw new FileFormatException("Human resource with id=" + resourceId + " not found");
}
Task task = getTaskManager().getTask(taskId);
if (task == null) {
throw new FileFormatException("Task with id=" + taskId + " not found");
}
// TaskMutator mutator = task.createMutator();
// ResourceAssignment assignment = mutator.addResource(human);
// assignment.setLoad(load);
// mutator.commit();
ResourceAssignment assignment = task.getAssignmentCollection().addAssignment(human);
try {
if (rolePersistendIDString != null)
myLateAssigmnent2roleBinding.put(assignment, rolePersistendIDString);
} catch (NumberFormatException e) {
System.out.println("ERROR in parsing XML File function id is not numeric: " + e.toString());
}
assignment.setLoad(load);
assignment.setCoordinator(coordinator);
}
private HumanResourceManager getResourceManager() {
return myResourceManager;
}
private TaskManager getTaskManager() {
return myTaskManager;
}
private Role findRole(String persistentIDasString) {
RolePersistentID persistentID = new RolePersistentID(persistentIDasString);
String rolesetName = persistentID.getRoleSetID();
int roleID = persistentID.getRoleID();
RoleSet roleSet;
if (rolesetName == null) {
roleSet = myRoleManager.getProjectRoleSet();
if (roleSet.findRole(roleID) == null) {
if (roleID <= 10 && roleID > 2) {
roleSet = myRoleManager.getRoleSet(RoleSet.SOFTWARE_DEVELOPMENT);
roleSet.setEnabled(true);
} else if (roleID <= 2) {
roleSet = myRoleManager.getRoleSet(RoleSet.DEFAULT);
}
}
} else {
roleSet = myRoleManager.getRoleSet(rolesetName);
}
Role result = roleSet.findRole(roleID);
return result;
}
@Override
public void parsingStarted() {
}
@Override
public void parsingFinished() {
for (Iterator<Entry<ResourceAssignment, String>> lateBindingEntries = myLateAssigmnent2roleBinding.entrySet().iterator(); lateBindingEntries.hasNext();) {
Map.Entry<ResourceAssignment, String> nextEntry = lateBindingEntries.next();
String persistentID = nextEntry.getValue();
Role nextRole = findRole(persistentID);
if (nextRole != null) {
lateBindingEntries.remove();
nextEntry.getKey().setRoleForAssignment(nextRole);
}
}
if (!myLateAssigmnent2roleBinding.isEmpty()) {
System.err.println("[ResourceTagHandler] parsingFinished(): not found roles:\n" + myLateAssigmnent2roleBinding);
}
}
}