/*
GanttProject is an opensource project management tool.
Copyright (C) 2003-2011 GanttProject Team
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.math.BigDecimal;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import net.sourceforge.ganttproject.CustomPropertyDefinition;
import net.sourceforge.ganttproject.CustomPropertyManager;
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 org.xml.sax.Attributes;
import com.google.common.collect.ImmutableSet;
/** Class to parse the attribute of resources handler */
public class ResourceTagHandler extends AbstractTagHandler implements ParsingListener {
private final Set<String> TAGS = ImmutableSet.of("resource", "custom-property", "custom-property-definition", "rate");
private final CustomPropertyManager myCustomPropertyManager;
private HumanResource myCurrentResource;
private final HashMap<HumanResource, String> myLateResource2roleBinding = new HashMap<HumanResource, String>();
private final HumanResourceManager myResourceManager;
private final RoleManager myRoleManager;
public ResourceTagHandler(HumanResourceManager resourceManager, RoleManager roleManager,
CustomPropertyManager resourceCustomPropertyManager) {
super(null);
myResourceManager = resourceManager;
myCustomPropertyManager = resourceCustomPropertyManager;
// myResourceManager.clear(); //CleanUP the old stuff
myRoleManager = roleManager;
}
/**
* @see net.sourceforge.ganttproject.parser.TagHandler#endElement(String,
* String, String)
*/
@Override
public void endElement(String namespaceURI, String sName, String qName) {
if (!TAGS.contains(qName)) {
return;
}
setTagStarted(false);
}
/**
* @see net.sourceforge.ganttproject.parser.TagHandler#startElement(String,
* String, String, Attributes)
*/
@Override
public void startElement(String namespaceURI, String sName, String qName, Attributes attrs) {
if (!TAGS.contains(qName)) {
return;
}
setTagStarted(true);
if (qName.equals("resource")) {
loadResource(attrs);
}
if ("custom-property".equals(qName)) {
assert myCurrentResource != null;
loadCustomProperty(attrs);
}
if ("custom-property-definition".equals(qName)) {
loadCustomPropertyDefinition(attrs);
}
if ("rate".equals(qName)) {
loadRate(attrs);
}
}
private void loadRate(Attributes attrs) {
String name = attrs.getValue("name");
if (!"standard".equals(name)) {
return;
}
try {
BigDecimal value = new BigDecimal(attrs.getValue("value"));
myCurrentResource.setStandardPayRate(value);
} catch (NumberFormatException e) {
GPLogger.log(e);
}
}
private void loadCustomProperty(Attributes attrs) {
String id = attrs.getValue("definition-id");
String value = attrs.getValue("value");
List<CustomPropertyDefinition> definitions = myCustomPropertyManager.getDefinitions();
for (int i = 0; i < definitions.size(); i++) {
CustomPropertyDefinition nextDefinition = definitions.get(i);
if (id.equals(nextDefinition.getID())) {
myCurrentResource.addCustomProperty(nextDefinition, value);
break;
}
}
}
private void loadCustomPropertyDefinition(Attributes attrs) {
String id = attrs.getValue("id");
String name = attrs.getValue("name");
String type = attrs.getValue("type");
String defaultValue = attrs.getValue("default-value");
myCustomPropertyManager.createDefinition(id, type, name, defaultValue);
}
/** Las a resources */
private void loadResource(Attributes atts) {
final HumanResource hr;
try {
String id = atts.getValue("id");
if (id == null) {
hr = getResourceManager().newHumanResource();
hr.setName(atts.getValue("name"));
getResourceManager().add(hr);
} else {
hr = getResourceManager().create(atts.getValue("name"), Integer.parseInt(id));
}
myCurrentResource = hr;
} catch (NumberFormatException e) {
System.out.println("ERROR in parsing XML File id is not numeric: " + e.toString());
return;
}
hr.setMail(atts.getValue("contacts"));
hr.setPhone(atts.getValue("phone"));
try {
String roleID = atts.getValue("function");
myLateResource2roleBinding.put(hr, roleID);
// hr.setFunction(Integer.parseInt());
} catch (NumberFormatException e) {
System.out.println("ERROR in parsing XML File function id is not numeric: " + e.toString());
}
}
private HumanResourceManager getResourceManager() {
return myResourceManager;
}
// private GanttPeoplePanel myPeople;
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() {
// System.err.println("[ResourceTagHandler] parsingFinished():");
for (Iterator<Entry<HumanResource, String>> lateBindingEntries = myLateResource2roleBinding.entrySet().iterator(); lateBindingEntries.hasNext();) {
Map.Entry<HumanResource, String> nextEntry = lateBindingEntries.next();
String persistentID = nextEntry.getValue();
Role nextRole = findRole(persistentID);
if (nextRole != null) {
lateBindingEntries.remove();
nextEntry.getKey().setRole(nextRole);
}
}
if (!myLateResource2roleBinding.isEmpty()) {
System.err.println("[ResourceTagHandler] parsingFinished(): not found roles:\n" + myLateResource2roleBinding);
}
}
}