// Path: java/src/de/westwing/printer/ninja/lib/chrome/message/MessageInterface.java
// public interface MessageInterface {
// 	
// 	public int getLength();
// 	
// 	public String getBody();
// 	
// 	public void setBody(String body);
// 	
// 	public void setId(int id);
// 	
// 	public int getId();
// }
// 
// Path: java/src/de/westwing/printer/ninja/lib/document/Base64Document.java
// public class Base64Document implements DocumentInterface {
// 
// 	protected String base64encodedContent;
// 
// 	protected byte[] decodedContent;
// 
// 	protected Decoder decoder;
// 	
// 	/**
// 	 * @param base64Encoded
// 	 */
// 	public Base64Document(String base64Encoded) {
// 		this.base64encodedContent = base64Encoded;
// 	}
// 
// 	/**
// 	 * @return Decoder
// 	 */
// 	public Decoder getDecoder() {
// 		if (null == this.decoder) {
// 			this.decoder = Base64.getDecoder();
// 		}
// 		
// 		return this.decoder;
// 	}
// 
// 	/**
// 	 * @param decoder
// 	 */
// 	public void setDecoder(Decoder decoder) {
// 		this.decoder = decoder;
// 	}
// 
// 	@Override
// 	public String toRawString() {
// 		try {
// 			return new String(this.toBytes(), "UTF-8");
// 		} catch (UnsupportedEncodingException ex) {
// 			return new String(this.toBytes());
// 		}
// 
// 	}
// 
// 	@Override
// 	public byte[] toBytes() {
// 		if (null == this.decodedContent) {
// 			this.decodedContent = this.getDecoder().decode(this.base64encodedContent);
// 		}
// 
// 		return this.decodedContent;
// 	}
// 
// 	@Override
// 	public ByteBuffer toByteBuffer() {
// 		return ByteBuffer.wrap(this.toBytes());
// 	}
// }
// 
// Path: java/src/de/westwing/printer/ninja/lib/document/ByteDocument.java
// public class ByteDocument implements DocumentInterface {
// 
// 	protected byte[] content;
// 
// 	public ByteDocument(byte[] documentData) {
// 		this.content = documentData;
// 	}
// 
// 	@Override
// 	public String toRawString() {
// 		try {
// 			return new String(this.toBytes(), "UTF-8");
// 		} catch (UnsupportedEncodingException ex) {
// 			return new String(this.toBytes());
// 		}
// 
// 	}
// 
// 	@Override
// 	public byte[] toBytes() {
// 		return this.content;
// 	}
// 
// 	@Override
// 	public ByteBuffer toByteBuffer() {
// 		return ByteBuffer.wrap(this.toBytes());
// 	}
// }
// 
// Path: java/src/de/westwing/printer/ninja/lib/document/DocumentInterface.java
// public interface DocumentInterface {
// 
// 	public String toRawString();
// 
// 	public byte[] toBytes();
// 
// 	public java.nio.ByteBuffer toByteBuffer();
// }


import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import org.json.JSONException;
import org.json.JSONObject;
import de.westwing.printer.ninja.lib.chrome.message.MessageInterface;
import de.westwing.printer.ninja.lib.document.Base64Document;
import de.westwing.printer.ninja.lib.document.ByteDocument;
import de.westwing.printer.ninja.lib.document.DocumentInterface;
			} catch (MalformedURLException $ex) {
				document = loadLocalFile(filePath);
			}
		} else {
			document = new Base64Document(json.getString("fileContent"));
		}
		
		JsonPrintMessage  printMessage = new JsonPrintMessage(message);
		printMessage.setPrinterName(printerName);
		printMessage.setPrinterType(printerType);
		printMessage.setDocument(document);
		
		if(json.has("requestId")) {
			printMessage.setRequestId(json.getString("requestId"));
		}
		return printMessage;
		
	}
	
	/**
	 * @param filePath
	 * @return A concrete DocumentInterface object.
	 * @throws IOException
	 */
	protected static DocumentInterface loadLocalFile(String filePath) throws IOException
	{
		DataInputStream dis = null;
		File file = null;
		byte[] fileContent = null;
		
// Path: java/src/de/westwing/printer/ninja/lib/chrome/message/MessageInterface.java
// public interface MessageInterface {
// 	
// 	public int getLength();
// 	
// 	public String getBody();
// 	
// 	public void setBody(String body);
// 	
// 	public void setId(int id);
// 	
// 	public int getId();
// }
// 
// Path: java/src/de/westwing/printer/ninja/lib/document/Base64Document.java
// public class Base64Document implements DocumentInterface {
// 
// 	protected String base64encodedContent;
// 
// 	protected byte[] decodedContent;
// 
// 	protected Decoder decoder;
// 	
// 	/**
// 	 * @param base64Encoded
// 	 */
// 	public Base64Document(String base64Encoded) {
// 		this.base64encodedContent = base64Encoded;
// 	}
// 
// 	/**
// 	 * @return Decoder
// 	 */
// 	public Decoder getDecoder() {
// 		if (null == this.decoder) {
// 			this.decoder = Base64.getDecoder();
// 		}
// 		
// 		return this.decoder;
// 	}
// 
// 	/**
// 	 * @param decoder
// 	 */
// 	public void setDecoder(Decoder decoder) {
// 		this.decoder = decoder;
// 	}
// 
// 	@Override
// 	public String toRawString() {
// 		try {
// 			return new String(this.toBytes(), "UTF-8");
// 		} catch (UnsupportedEncodingException ex) {
// 			return new String(this.toBytes());
// 		}
// 
// 	}
// 
// 	@Override
// 	public byte[] toBytes() {
// 		if (null == this.decodedContent) {
// 			this.decodedContent = this.getDecoder().decode(this.base64encodedContent);
// 		}
// 
// 		return this.decodedContent;
// 	}
// 
// 	@Override
// 	public ByteBuffer toByteBuffer() {
// 		return ByteBuffer.wrap(this.toBytes());
// 	}
// }
// 
// Path: java/src/de/westwing/printer/ninja/lib/document/ByteDocument.java
// public class ByteDocument implements DocumentInterface {
// 
// 	protected byte[] content;
// 
// 	public ByteDocument(byte[] documentData) {
// 		this.content = documentData;
// 	}
// 
// 	@Override
// 	public String toRawString() {
// 		try {
// 			return new String(this.toBytes(), "UTF-8");
// 		} catch (UnsupportedEncodingException ex) {
// 			return new String(this.toBytes());
// 		}
// 
// 	}
// 
// 	@Override
// 	public byte[] toBytes() {
// 		return this.content;
// 	}
// 
// 	@Override
// 	public ByteBuffer toByteBuffer() {
// 		return ByteBuffer.wrap(this.toBytes());
// 	}
// }
// 
// Path: java/src/de/westwing/printer/ninja/lib/document/DocumentInterface.java
// public interface DocumentInterface {
// 
// 	public String toRawString();
// 
// 	public byte[] toBytes();
// 
// 	public java.nio.ByteBuffer toByteBuffer();
// }


// Path: java/src/de/westwing/printer/ninja/lib/message/JsonMessageParser.java
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import org.json.JSONException;
import org.json.JSONObject;
import de.westwing.printer.ninja.lib.chrome.message.MessageInterface;
import de.westwing.printer.ninja.lib.document.Base64Document;
import de.westwing.printer.ninja.lib.document.ByteDocument;
import de.westwing.printer.ninja.lib.document.DocumentInterface;

			} catch (MalformedURLException $ex) {
				document = loadLocalFile(filePath);
			}
		} else {
			document = new Base64Document(json.getString("fileContent"));
		}
		
		JsonPrintMessage  printMessage = new JsonPrintMessage(message);
		printMessage.setPrinterName(printerName);
		printMessage.setPrinterType(printerType);
		printMessage.setDocument(document);
		
		if(json.has("requestId")) {
			printMessage.setRequestId(json.getString("requestId"));
		}
		return printMessage;
		
	}
	
	/**
	 * @param filePath
	 * @return A concrete DocumentInterface object.
	 * @throws IOException
	 */
	protected static DocumentInterface loadLocalFile(String filePath) throws IOException
	{
		DataInputStream dis = null;
		File file = null;
		byte[] fileContent = null;
		
		try {