package gr.ntua.ivml.athena.xml.transform;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.List;
import javax.servlet.ServletContext;
import javax.xml.transform.stream.StreamSource;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.log4j.Logger;
import org.apache.struts2.util.ServletContextAware;
import net.sf.json.JSONObject;
import gr.ntua.ivml.athena.db.DB;
import gr.ntua.ivml.athena.persistent.DataUpload;
import gr.ntua.ivml.athena.persistent.XMLNode;
import gr.ntua.ivml.athena.util.Config;
import gr.ntua.ivml.athena.xml.SchemaValidator;
public class XMLNodeTransform{
//private ServletContext sc;
public JSONObject previewDataUploadTransformByMapping(DataUpload du, String mappings) {
List<XMLNode> list = du.getItemXpath().getNodes(0, 1);
if(list != null && !list.isEmpty()) {
XMLNode node = list.get(0);
return this.transformByMapping(du, node, mappings);
} else {
return new JSONObject().element("error", "Could not get xml nodes from dataupload");
}
}
public JSONObject transformByMapping(Long duid, Long nodeid, String mappings) {
DataUpload du = DB.getDataUploadDAO().getById(duid, false);
XMLNode node = DB.getXMLNodeDAO().getById(nodeid, false);
return this.transformByMapping(du, node, mappings);
}
public JSONObject transformByMapping(DataUpload du, XMLNode node, String mappings) {
JSONObject object = new JSONObject();
String error = null;
String input = "";
String xsl = "";
String output = "";
String eseXml="";
String lidovalidation="";
String esevalidation="";
StringWriter xmlWriter = new StringWriter();
//XMLNode treeNode= DB.getXMLNodeDAO().getDOMTree( node );
//treeNode.toXml(new PrintWriter(xmlWriter));
node.toXmlWrapped(new PrintWriter(xmlWriter));
//node.toXml(new PrintWriter(xmlWriter));
input = xmlWriter.toString();
input = input.replaceFirst("xmlns=\"[^\"]*\"", "");
input = XMLFormatter.format(input);
XSLTGenerator xslt = new XSLTGenerator();
XSLTransform t = new XSLTransform();
xslt.setItemLevel(du.getItemXpath().getXpathWithPrefix(true));
xslt.setTemplateMatch(node.getXpathHolder().getXpathWithPrefix(true));
//xslt.setNamespaces(node.getXpathHolder().getNamespaces(true));
xsl = xslt.generateFromString(mappings);
try {
xsl = XMLFormatter.format(xsl);
} catch(Exception e) {
}
try {
output = t.transform(input, xsl);
output = XMLFormatter.format(output);
//do ese and lido validations here
byte currentXMLBytes[] = output.getBytes();
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(currentXMLBytes);
StreamSource lidoXml = new StreamSource( byteArrayInputStream);
try{
SchemaValidator.validate(lidoXml, SchemaValidator.LIDO );
lidovalidation="Successfull LIDO 0.9 validation!";
} catch (Exception ex){
lidovalidation=ex.getMessage();
}
//now ese
StringBuilder eseContents = new StringBuilder();
String ese="";
try {
File eseFile = new File(Config.getRealPath(Config.get( "lido_to_ese_xsl")));
BufferedReader inputese = new BufferedReader(new FileReader(eseFile));
try {
String line = null;
while (( line = inputese.readLine()) != null){
eseContents.append(line);
eseContents.append(System.getProperty("line.separator"));
}
} finally {
inputese.close();
}
} catch (Exception ex){
ex.printStackTrace();
esevalidation="Ese output could not be built";
}
ese=eseContents.toString();
eseXml = t.transform(output, ese);
eseXml = XMLFormatter.format(eseXml);
if(eseXml.length()>0){
byte eseXMLBytes[] = eseXml.getBytes();
byteArrayInputStream = new ByteArrayInputStream(eseXMLBytes);
StreamSource eseXmlSrc = new StreamSource( byteArrayInputStream);
try{
SchemaValidator.validate(eseXmlSrc, SchemaValidator.ESE );
esevalidation="Successfull ESE validation!";
}
catch (Exception ex){
esevalidation=ex.getMessage();
}
}
} catch(Exception e) {
StringWriter result = new StringWriter();
PrintWriter printWriter = new PrintWriter(result);
e.printStackTrace(printWriter);
error = result.toString();
object = object.element("error", error);
}
input = StringEscapeUtils.escapeHtml(input);
xsl = StringEscapeUtils.escapeHtml(xsl);
output = StringEscapeUtils.escapeHtml(output);
object = object.element("input", input);
object = object.element("xsl", xsl);
object = object.element("output", output);
object = object.element("eseXml", eseXml);
object = object.element("lidovalidation", lidovalidation);
object = object.element("esevalidation", esevalidation);
return object;
}
}