view software/mpdl-services/mpiwg-mpdl-xml/src/de/mpg/mpiwg/berlin/mpdl/xml/tmp/XmlExamples.java @ 18:dc5e9fcb3fdc

Erstellung
author Josef Willenborg <jwillenborg@mpiwg-berlin.mpg.de>
date Wed, 09 Nov 2011 15:27:46 +0100
parents
children
line wrap: on
line source

package de.mpg.mpiwg.berlin.mpdl.xml.tmp;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Date;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

import com.sun.org.apache.xerces.internal.parsers.SAXParser;

import de.mpg.mpiwg.berlin.mpdl.exception.ApplicationException;
import de.mpg.mpiwg.berlin.mpdl.xml.transform.BasicTransformer;

import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.QName;
import net.sf.saxon.s9api.SaxonApiException;
import net.sf.saxon.s9api.Serializer;
import net.sf.saxon.s9api.XQueryCompiler;
import net.sf.saxon.s9api.XQueryEvaluator;
import net.sf.saxon.s9api.XQueryExecutable;
import net.sf.saxon.s9api.XdmAtomicValue;
import net.sf.saxon.s9api.XdmValue;
import net.sf.saxon.s9api.XsltCompiler;
import net.sf.saxon.s9api.XsltExecutable;
import net.sf.saxon.s9api.XsltTransformer;

public class XmlExamples {
  private XsltTransformer xsltTransformer;
  private Processor processor;
  private boolean saxonFast = false;
  
  public static void main(String[] args) {
    try {
      XmlExamples xmlUtil = new XmlExamples();
      xmlUtil.saxonFast = true;
      // xmlUtil.init();
      // xmlUtil.testXQuery();
      // xmlUtil.testGetFragment();
      xmlUtil.testMpdlTransformer();
      // xmlUtil.performanceTestGetFragment();
      // xmlUtil.performanceTestGetFragment("text/Goerz_2008.xml");
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  private void init() {
    try {
	    StreamSource xslStreamSource = new StreamSource("examples/getFragment.xsl");
      if (saxonFast) {
        xslStreamSource = new StreamSource("examples/getFragmentSaxonFast.xsl");
      }
  	  processor = new Processor(true); 
  	  XsltCompiler xsltCompiler = processor.newXsltCompiler();
  	  XsltExecutable xsltExecutable = xsltCompiler.compile(xslStreamSource);
      xsltTransformer = xsltExecutable.load();
  	} catch (SaxonApiException e) {
      e.printStackTrace();
  	}
  }
  
  private void testMpdlTransformer() {
    try {
      // String fragment = getFragment("examples/Benedetti_1585.xml", "pb", 300, "pb", 301);
      BasicTransformer mpdlTransformer = new BasicTransformer();
      String srcUrl = "http://mpdl-test.mpiwg-berlin.mpg.de:30030/mpdl/page-query-result.xql?document=/echo/la/Benedetti_1585.xml&mode=text&pn=13&export=pureXml";
      String xslUrl = "http://mpdl-test.mpiwg-berlin.mpg.de:30030/mpdl/presentation/pageHtml.xsl";
      String outputPropertiesStr = "method=xhtml media-type=text/html omit-xml-declaration=no indent=no encoding=utf-8";
      mpdlTransformer.transform(srcUrl, xslUrl, "", outputPropertiesStr);
      // xslUrl = "http://mpdl-test.mpiwg-berlin.mpg.de:30030/mpdl/presentation/pageXml.xsl";
      // mpdlTransformer.transformByTransformerFactory(srcUrl, xslUrl, "", outputPropertiesStr);
    } catch (ApplicationException e) {
      e.printStackTrace();
    }
  }
  
  private void testGetFragment() {
    getFragment("examples/Benedetti_1585.xml", "pb", 300, "pb", 302);
	  // getFragmentByJavax("examples/Benedetti_1585.xml", "pb", 300, "pb", 301);
  	/*
    getFragment("examples/Test_1789.xml", "pb", 1, "pb", 2);
    getFragment("examples/Goerz_2008.xml", "pb", 58, "pb", 59);
    getFragment("examples/Benedetti_1585.xml", "lb", 385, "lb", 387);
    getFragment("examples/Benedetti_1585.xml", "pb", 300, "pb", 302);
    getFragment("examples/Benedetti_1585.xml", "pb", 303, "pb", 304);
    getFragment("examples/Goerz_2008.xml", "pb", 58, "pb", 59);
    */
  }

  private void performanceTestGetFragment() {
    for (int i=1; i<=100; i++) {
      String fileName = "/Users/jwillenborg/java/eclipse-workspace/XmlUtil/examples/tmp/Test-" + i + ".xml";
      // String fileName = "examples/Test.xml";
      Date before = new Date();
      for (int j=300; j<=400; j++) {
        getFragment(fileName, "pb", j, "pb", j+1);
      }
      Date after = new Date();
      System.out.println(i+ ". Needed time: " + (after.getTime() - before.getTime()) + " ms");
    }
  }

  private void testXQuery() {
    // String xqueryStr = "declare namespace TEI='http://www.tei-c.org/ns/1.0'; //TEI:pb[@n=\"1\"]/following::*[. << //TEI:pb[@n=\"2\"]]";
    // String xqueryStr = "declare namespace TEI='http://www.tei-c.org/ns/1.0'; (//TEI:pb[@n=\"1\"]/following::*) intersect (//TEI:pb[@n=\"2\"]/preceding::*)";
    String xqueryStr = "declare namespace TEI='http://www.tei-c.org/ns/1.0'; //TEI:pb[@n=\"1\"]";
    xquery("examples/Goerz_2008.xml", xqueryStr);
  }

  private void xquery(String xmlFileName, String xqueryStr) {
  	try {
      StreamSource xmlDoc = new StreamSource(xmlFileName);
  	  XQueryCompiler xQueryCompiler = processor.newXQueryCompiler();
      XQueryExecutable xQueryExecutable = xQueryCompiler.compile(xqueryStr);
      Serializer serializer = new Serializer();
      serializer.setOutputWriter(new StringWriter());
      XQueryEvaluator xQueryEvaluator = xQueryExecutable.load();
      Date before = new Date();
      xQueryEvaluator.setSource(xmlDoc);
      XdmValue result = xQueryEvaluator.evaluate();
      // xQueryEvaluator.run(serializer);
      // System.out.println(serializer.getOutputDestination().toString());
      Date after = new Date();
      System.out.println("Needed time: " + (after.getTime() - before.getTime()) + " ms");
  	} catch (SaxonApiException e) {
      e.printStackTrace();
  	}
  }
  
  private String getFragment(String xmlFileName, String ms1Name, int ms1Pos, String ms2Name, int ms2Pos) {
    String pageFragment = null;
  	try {
      StreamSource xmlDoc = new StreamSource(new StringReader("<?xml version=\"1.0\"?><bla/>"));
      if (! saxonFast)
      	xmlDoc = new StreamSource(xmlFileName);
      Serializer serializer = new Serializer();
      serializer.setOutputWriter(new StringWriter());
      serializer.setOutputProperty(Serializer.Property.INDENT, "yes");
      xsltTransformer.setSource(xmlDoc);  // needs some time for bigger documents
      xsltTransformer.setDestination(serializer);
      QName xmlFileNameQName = new QName("xmlFileName");
      XdmValue xmlFileNameXdmValue = new XdmAtomicValue(xmlFileName);
      QName ms1NameQName = new QName("ms1Name");
      XdmValue ms1NameXdmValue = new XdmAtomicValue(ms1Name);
      QName ms1PositionQName = new QName("ms1Position");
      XdmValue ms1PositionXdmValue = new XdmAtomicValue(ms1Pos);
      QName ms2NameQName = new QName("ms2Name");
      XdmValue ms2NameXdmValue = new XdmAtomicValue(ms2Name);
      QName ms2PositionQName = new QName("ms2Position");
      XdmValue ms2PositionXdmValue = new XdmAtomicValue(ms2Pos);
      xsltTransformer.setParameter(xmlFileNameQName, xmlFileNameXdmValue);
      xsltTransformer.setParameter(ms1NameQName, ms1NameXdmValue);
      xsltTransformer.setParameter(ms1PositionQName, ms1PositionXdmValue);
      xsltTransformer.setParameter(ms2NameQName, ms2NameXdmValue);
      xsltTransformer.setParameter(ms2PositionQName, ms2PositionXdmValue);
      xsltTransformer.transform();  // needs some time for bigger documents
      pageFragment = serializer.getOutputDestination().toString();
  	} catch (SaxonApiException e) {
      e.printStackTrace();
  	}
    return pageFragment;
  }

  private void getFragmentByJavax(String xmlFileName, String ms1Name, int ms1Pos, String ms2Name, int ms2Pos) {
    try {
      StreamSource xslStreamSource = new StreamSource("examples/getFragment.xsl");
      Transformer transformer = TransformerFactory.newInstance().newTransformer(xslStreamSource);
      transformer.setOutputProperty(OutputKeys.INDENT, "yes");
      StreamResult result = new StreamResult(new StringWriter());
      StreamSource xmlStreamSource = new StreamSource(xmlFileName);
      transformer.setParameter("ms1Name", ms1Name);
      transformer.setParameter("ms1Position", new Integer(ms1Pos));
      transformer.setParameter("ms2Name", ms2Name);
      transformer.setParameter("ms2Position", new Integer(ms2Pos));
      transformer.transform(xmlStreamSource, result);
    } catch (TransformerConfigurationException e) {
      e.printStackTrace();
    } catch (TransformerException e) {
      e.printStackTrace();
    }
  }

  private void performanceTestGetFragment(String xmlFileName) {
	try {
	  // init
	  StreamSource xslStreamSource = new StreamSource("examples/getFragment.xsl");
	  Processor processor = new Processor(true); 
	  XsltCompiler xsltCompiler = processor.newXsltCompiler();
	  XsltExecutable xsltExecutable = xsltCompiler.compile(xslStreamSource);
      XsltTransformer xsltTransformer = xsltExecutable.load();
      StreamSource xmlDoc = new StreamSource(xmlFileName);
      Serializer serializer = new Serializer();
      serializer.setOutputWriter(new StringWriter());
      serializer.setOutputProperty(Serializer.Property.INDENT, "yes");
      xsltTransformer.setSource(xmlDoc);  // needs some time for bigger documents
      xsltTransformer.setDestination(serializer);
      for (int i=1; i<=100; i++) {
	      QName ms1NameQName = new QName("ms1Name");
	      XdmValue ms1NameXdmValue = new XdmAtomicValue("pb");
	      QName ms1PositionQName = new QName("ms1Position");
	      XdmValue ms1PositionXdmValue = new XdmAtomicValue(i);
	      QName ms2NameQName = new QName("ms2Name");
	      XdmValue ms2NameXdmValue = new XdmAtomicValue("pb");
	      QName ms2PositionQName = new QName("ms2Position");
	      XdmValue ms2PositionXdmValue = new XdmAtomicValue(i+1);
	      xsltTransformer.setParameter(ms1NameQName, ms1NameXdmValue);
	      xsltTransformer.setParameter(ms1PositionQName, ms1PositionXdmValue);
	      xsltTransformer.setParameter(ms2NameQName, ms2NameXdmValue);
	      xsltTransformer.setParameter(ms2PositionQName, ms2PositionXdmValue);
        Date before = new Date();
	      xsltTransformer.transform();  // needs some time for bigger documents
	      Date after = new Date();
	      System.out.println(i+ ". Needed time: " + (after.getTime() - before.getTime()) + " ms");
      }
  	} catch (SaxonApiException e) {
        e.printStackTrace();
  	}
  }

  private void getFragmentByContentHandler(String xmlFileName, String ms1Name, int ms1Pos, String ms2Name, int ms2Pos) {
    Date before = new Date();
    File inputFile = new File(xmlFileName);
    GetFragmentContentHandler getFragmentContentHandler = new GetFragmentContentHandler(ms1Name, ms1Pos, ms2Name, ms2Pos);
    try {
      XMLReader xmlParser = new SAXParser();
      xmlParser.setContentHandler(getFragmentContentHandler);
      InputStream inputStream = new FileInputStream(inputFile);
      BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
      InputSource input = new InputSource(bufferedInputStream);
      xmlParser.parse(input);
      bufferedInputStream.close();
      String fragment = getFragmentContentHandler.getFragment();
    } catch (SAXException e) {
      Date after = new Date();
      System.out.println(". Needed time: " + (after.getTime() - before.getTime()) + " ms");
      e.printStackTrace();
    } catch (IOException e) {
      Date after = new Date();
      System.out.println(". Needed time: " + (after.getTime() - before.getTime()) + " ms");
      e.printStackTrace();
    }
  }

}