package com.ferrologic.openb2b;

import java.lang.*;
import java.io.*;
import java.net.*;
import java.text.*;
import java.util.*;

import javax.activation.*;
import javax.xml.transform.*;
import javax.xml.soap.*;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import org.xml.sax.InputSource;

import org.apache.xml.serializer.*;

import net.xmethods.www.*;

public class OpenB2BUtil {

        public static final void httpPostSubmit(Authenticator auth,
						URL url,
						ByteArrayOutputStream baos) {
	try{
	    Authenticator.setDefault (auth);

	    HttpURLConnection connection = (HttpURLConnection)url.openConnection();

	    connection.setUseCaches(false);

	    connection.setDoOutput(true);

	    connection.setRequestMethod("POST");

	    connection.setRequestProperty("Content-Type", "text/xml");

	    int length = baos.size();

	    connection.setRequestProperty("Content-Length", (new Integer(length)).toString());

	    connection.connect();

	    OutputStream out = connection.getOutputStream();

	    baos.writeTo(out);

	    int code = connection.getResponseCode();

	    connection.disconnect();

	    System.out.println("INFO: OpenB2BUtil.httpPostSubmit: Result " + code + " recieived...");
	}
	catch(Exception e) {
	    System.out.println("EXCEPTION: OpenB2BUtil.httpPostSubmit: " + e.getMessage());
	}
    }

    public static final String translateString(String selection, String message) {
	// Invoke translation webService
	String translated = "NOPE";
	
	try{
	    BabelFishService service = new BabelFishServiceLocator();
	    BabelFishPortType port = service.getBabelFishPort();
	
	    translated = port.babelFish(selection, message);

	    System.out.println("INFO: OpenB2BUtil.translateString: " + message + " -> " + translated );
	}
	catch(Exception e) {
	    System.out.println("EXCEPTION: OpenB2BUtil.translateString: " + e.getMessage());
	}

	return translated;
    }

    public static final String etitifyIsoString(String input) {
	String result = "";

	System.out.println("DEBUG: OpenB2BUtil.etitifyIsoString: " + input);

	for(int i = 0; i < input.length(); i++) {
	    char chr = input.charAt(i);
	    int charval = (int)chr;

	    if(charval >= 128) {
		result += ("&#" + charval + ";");
	    }
	    else {
		result += chr;
	    }
	}
	
	System.out.println("DEBUG: OpenB2BUtil.etitifyIsoString: " + result);

	return result;
    }

    public static final FileOutputStream createStampedFile(String path, String type, String ext) {
	FileOutputStream fos = null;

	try {
	    Date now = new Date();
	    SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd_kkmmssSSS");
	    StringBuffer sbuf = new StringBuffer("");
	    FieldPosition fpos = new FieldPosition(0);
	
	    sdf.format(now, sbuf, fpos);
	
	    fos = new FileOutputStream(path + "/" + sbuf.toString() + "_" + type + "." + ext);
	}
	catch(Exception e) {
	    System.out.println("EXCEPTION: OpenB2BUtil.createStampedFile: " + e.getMessage());
	}

	return fos;
    }

    public static final Document streamToDocument(InputStream is) throws Exception {
	Document doc = null;

	try {
	    InputSource in = new InputSource(is);
	
	    DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
	
	    dfactory.setNamespaceAware(true);
	
	    doc = dfactory.newDocumentBuilder().parse(in);
	}
	catch(Exception e) {
	    System.out.println("EXCEPTION: OpenB2BUtil.streamToDocument: " + e.getMessage());
	}

	return doc;
    }

    public static final void documentToStream(Document doc, OutputStream out) {
	try {
	    // Set up an identity transformer to use as serializer.
	    Transformer serializer = TransformerFactory.newInstance().newTransformer();
	
	    serializer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
	    // serializer.setOutputProperty(OutputKeys.METHOD, "html");

	    // Print input tree
	    serializer.transform(new DOMSource(doc), new StreamResult(new OutputStreamWriter(out)));
	}
	catch(Exception e) {
	    System.out.println("EXCEPTION: OpenB2BUtil.documentToStream: " + e.getMessage());
	}
    }
}
