package org.exist.xquery.dbxlink;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
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;

public class ShootXQuery {
	private static String getQueryFromFile(String filename) throws FileNotFoundException, IOException {
		File f = new File(filename);
		FileReader freader = new FileReader(f);
		StringBuffer stringBuf = new StringBuffer();
		char[] charbuf = new char[1024];
		int len = 0;
		while ((len = freader.read(charbuf)) > 0) {
			stringBuf.append(charbuf, 0, len);
		}

		String nonEncoded = stringBuf.toString().replaceAll("\\s+", " ").replace("+", "%2b");
		System.out.println("query = "+nonEncoded);
		String preEncoded = URLEncoder.encode(nonEncoded,"UTF-8");
		return preEncoded;//.replace("+", "%20");
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		if(args.length != 2) {
			System.err
					.println("usage: ShootXQuery host queryfile. \n"
							+ "Example: ShootXQuery http://linxis02.ifi.informatik.uni-goettingen.de:8080/exist/servlet/db/LinXIS/countries.xml query.xq");
			System.exit(1);
		}
		try {
			String host = args[0];
			String queryfile = args[1];
			String linxisFlag = "&_linxis=yes";
			String howMany = "&_howmany=10000";
			String linkbase = "&_linkbase=yes";
			String wrap = "&_wrap=yes";
			String query = "_query=" + getQueryFromFile(queryfile);
			URL url = new URL(host + "?" + query + linxisFlag + howMany + linkbase + wrap);
			HttpURLConnection con = (HttpURLConnection) url.openConnection();
			con.setRequestMethod("GET");
			con.setDoInput(true);
			con.setRequestProperty("content-type", "text/xml");
			long startingTime = System.currentTimeMillis();
			System.out.println("starting time:" + startingTime);
			con.connect();

			// parse and return result
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			factory.setNamespaceAware(true);
			factory.setValidating(false);
			Document doc = null;
			InputStream s = con.getInputStream();
			doc = factory.newDocumentBuilder().parse(s);

			con.disconnect();
			TransformerFactory tFactory = TransformerFactory.newInstance();
			Transformer transformer = tFactory.newTransformer();
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			transformer.setOutputProperty(OutputKeys.METHOD, "xml");
			DOMSource source = new DOMSource(doc);
			StreamResult result = new StreamResult(System.out);
			transformer.transform(source, result);
			long finishTime = System.currentTimeMillis();
			System.out.println("finish time:" + finishTime + ", total time: " + (finishTime - startingTime) / 1000.0);				
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
}
