/**
 * WPCLConverter.java
 * Created Nov 11, 2007
 * Copyright (c) TANDBERG Television 2007
 */
package com.tandbergtv.workflow.message.util;

import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.xml.sax.InputSource;

import com.tandbergtv.workflow.message.IMessage;
import com.tandbergtv.workflow.message.MessageImpl;
import com.tandbergtv.workflow.message.StringPayload;
import com.tandbergtv.workflow.message.WorkflowMessage;

/**
 * Converts between WPCL and IMessages
 * 
 * @author Sahil Verma
 */
public class WPCLConverter {
	
	public WPCLConverter() {
	}
	
	/**
	 * Converts an IMessage into the equivalent WPCL
	 * 
	 * @param message
	 * @return
	 * @throws Exception
	 */
	public WorkflowMessage convert(IMessage message) throws Exception {
		return Unmarshaller.unmarshal(getDocument(message.getPayload().getContent()));
	}
	
	/**
	 * Converts a WPCL message into an IMessage
	 * 
	 * @param message
	 * @return
	 * @throws Exception
	 */
	public IMessage convert(WorkflowMessage message) throws Exception {
		Document document = Marshaller.newMarshaller().marshal(message);
		
		Transformer transformer = TransformerFactory.newInstance().newTransformer();
		StringWriter writer = new StringWriter();
		
		transformer.transform(new DOMSource(document.getDocumentElement()), new StreamResult(writer));
		
		return new MessageImpl(new StringPayload(writer.getBuffer().toString()));
	}
	
	/**
	 * Converts the specified string into a DOM document
	 * 
	 * @param content
	 * @return
	 * @throws Exception
	 */
	private Document getDocument(String content) throws Exception {
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		
		factory.setNamespaceAware(true);
		
		DocumentBuilder builder = factory.newDocumentBuilder();
		InputSource inputSource = new InputSource(new StringReader(content));
		
		return builder.parse(inputSource);
	}
}
