public Workflow fromXML(File xmlFile) throws ParserConfigurationException, SAXException, IOException, TransformerException, ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
		init();
		
		Document   doc        = XalanUtils.parseXml(xmlFile, false);
		Element    root       = doc.getDocumentElement();
		List<Node> actorNodes = XalanUtils.getNodesFromXPath(root, "/workflow/actor");
		
		Map<String, Actor> actorsMap = new HashMap<String, Actor>();
		for(Node actorNode : actorNodes){
			String         actorClassName = XalanUtils.getStringFromXPath(actorNode, "@class");
			String         actorName      = XalanUtils.getStringFromXPath(actorNode, "@name");
			Constructor<?> constructor    = Class.forName(actorClassName).getConstructor(Workflow.class);			
			Actor          actor          = null;
			
			try{
				actor = (Actor)constructor.newInstance(this);
			}
			catch(InvocationTargetException ite){
				die("Couldn't create actor '" + actorClassName + "' (" + actorClassName + ").  InvocationTargetException caught: '" + ite + "' (" + ite.getCause() + ").");
			}
			
			// Class<?> actorClass     = Class.forName(actorClassName);
			// Actor    actor          = (Actor)actorClass.newInstance(this);
			
			actorsMap.put(actorName, actor);
			
			List<Node> propertyNodes = XalanUtils.getNodesFromXPath(actorNode, "property");
			for(Node propertyNode : propertyNodes){
				String           propName = XalanUtils.getStringFromXPath(propertyNode, "@name");
				String           propVal  = XalanUtils.getStringFromXPath(propertyNode, ".");
				Property<String> prop     = new Property<String>(propName, propVal);
				actor.addProperty(prop);
			}
		}
		
		for(Node actorNode : actorNodes){
			String     actorName = XalanUtils.getStringFromXPath(actorNode, "@name");
			List<Node> providers = XalanUtils.getNodesFromXPath(actorNode, "provider");
			List<Node> consumers = XalanUtils.getNodesFromXPath(actorNode, "consumer");
			Actor      actor     = actorsMap.get(actorName);
			
			for(Node providerNode : providers){
				String providerName = XalanUtils.getStringFromXPath(providerNode, "@name");
				Actor  provider     = actorsMap.get(providerName);
				actor.addProvider(provider);
			}
			
			for(Node consumerNode : consumers){
				String consumerName = XalanUtils.getStringFromXPath(consumerNode, "@name");
				Actor  consumer     = actorsMap.get(consumerName);
				actor.addConsumer(consumer);
			}
		}
		
		for(String actorName : actorsMap.keySet()){
			addActor(actorsMap.get(actorName));
		}
		
		return this;
	}