package xtpipes; /* Xtpipes.java (2009-01-27-22:19) */ // import xtpipes.util.InputObject; // import xtpipes.util.FileInfo; import java.net.URLConnection; import java.io.*; import java.lang.reflect.*; import java.util.HashMap; import java.util.Stack; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.*; import org.w3c.dom.*; import org.xml.sax.*; import org.xml.sax.helpers.*; import java.net.URL; import java.lang.reflect.Constructor; import java.util.ArrayList; public class Xtpipes { private static HashMap map; private static boolean needScript; private static boolean returnDom; private static String result; static PrintWriter logWriter = new PrintWriter( System.err ); private static String inFile, inData; private static boolean exceptionErrs, messages; public static InputObject inputObject; private static String outFileName; private static PrintWriter outPrintWriter; private static boolean returnToFile = false; public static String scriptFile; private static String scriptMap; static String i_scriptDir; private static TransformerFactory fc; private static Transformer identityTransformer; private static SAXParserFactory saxFactory; private static DocumentBuilder domBuilder; private static Stack saxReaderStack; private static Method method; private static String rootName; static boolean trace; private static String [] ml2xml = null; static Class ml2xmlClassObj = null; public static String errMssg; public static void main(String args[]) throws Exception { map = new HashMap (); needScript = true; returnDom = false; result = null; inFile = null; inData = null; exceptionErrs = false; messages = false; outFileName = null; outPrintWriter = null; scriptFile = null; i_scriptDir = null; scriptMap = null; saxReaderStack = new Stack (); rootName = null; trace = false; mainMethod(args); } public static void xtpipes(String [] args, OutputStream out, PrintWriter log) throws Exception { map = new HashMap (); needScript = true; returnDom = false; result = null; inFile = null; inData = null; exceptionErrs = false; messages = false; outFileName = null; outPrintWriter = null; scriptFile = null; i_scriptDir = null; scriptMap = null; saxReaderStack = new Stack (); rootName = null; trace = false; outPrintWriter = new XtpipesPrintWriter( out, true ); logWriter = (log==null)? (new PrintWriter( System.err )) : log; mainMethod(args); outPrintWriter.flush(); } public static void xtpipes(String [] args, OutputStreamWriter out, PrintWriter log) throws Exception { map = new HashMap (); needScript = true; returnDom = false; result = null; inFile = null; inData = null; exceptionErrs = false; messages = false; outFileName = null; outPrintWriter = null; scriptFile = null; i_scriptDir = null; scriptMap = null; saxReaderStack = new Stack (); rootName = null; trace = false; outPrintWriter = new XtpipesPrintWriter( out ); logWriter = (log==null)? (new PrintWriter( System.err )) : log; mainMethod(args); outPrintWriter.flush(); } public static void xtpipes(String [] args, XtpipesPrintWriter out, PrintWriter log) throws Exception { map = new HashMap (); needScript = true; returnDom = false; result = null; inFile = null; inData = null; exceptionErrs = false; messages = false; outFileName = null; outPrintWriter = null; scriptFile = null; i_scriptDir = null; scriptMap = null; saxReaderStack = new Stack (); rootName = null; trace = false; outPrintWriter = out; logWriter = (log==null)? (new PrintWriter( System.err )) : log; mainMethod(args); outPrintWriter.flush(); } public static Document getDOM(String args[]) throws Exception { map = new HashMap (); needScript = true; returnDom = false; result = null; inFile = null; inData = null; exceptionErrs = false; messages = false; outFileName = null; outPrintWriter = null; scriptFile = null; i_scriptDir = null; scriptMap = null; saxReaderStack = new Stack (); rootName = null; trace = false; returnDom = true; mainMethod(args); Document dom = null; if( result == null ){ System.err.println( "--- xtpipes warning --- getDOM without from 4xt file: " + scriptFile ); } else { try{ byte [] bytes = result.getBytes("UTF-8"); InputStream is = new ByteArrayInputStream( bytes ); dom = domBuilder.parse (is); } catch ( org.xml.sax.SAXParseException e ){ if( Xtpipes.trace ){ Xtpipes.logWriter.println( "\n---------------------------------------------------\n" + result + "\n---------------------------------------------------\n" ); } String s = ""; for( int n=0; n [] argTypes = { }; Method m = ml2xmlClassObj.getMethod( "closeFiles", argTypes ); Object parmValues[] = new Object[0]; m.invoke( null, parmValues ); } } return dom; } public static Document getDOM(String s, String args[]) throws Exception { map = new HashMap (); needScript = true; returnDom = false; result = null; inFile = null; inData = null; exceptionErrs = false; messages = false; outFileName = null; outPrintWriter = null; scriptFile = null; i_scriptDir = null; scriptMap = null; saxReaderStack = new Stack (); rootName = null; trace = false; returnDom = true; inData = s; mainMethod(args); Document dom = null; if( result == null ){ System.err.println( "--- xtpipes warning --- getDOM without" + " from 4xt file: " + scriptFile ); } else { try{ byte [] bytes = result.getBytes("UTF-8"); InputStream is = new ByteArrayInputStream( bytes ); dom = domBuilder.parse (is); } catch ( org.xml.sax.SAXParseException e ){ instructionErr( null, "improper xml: " + e.getMessage() + "\n code starts with: " + result.substring(0, Math.min(100,result.length())) , 17 ); } catch ( Exception e ){ instructionErr( null, e.toString(), 6 ); } if( ml2xmlClassObj != null ){ Class [] argTypes = { }; Method m = ml2xmlClassObj.getMethod( "closeFiles", argTypes ); Object parmValues[] = new Object[0]; m.invoke( null, parmValues ); } } return dom; } public static Document getDOM(String args[], PrintWriter log) throws Exception { logWriter = (log==null)? new PrintWriter( System.err ) : log; return getDOM(args); } public static Document getDOM(String s, String args[], PrintWriter log) throws Exception { logWriter = (log==null)? (new PrintWriter( System.err )) : log; return getDOM(s, args); } private static void mainMethod(String args[]) throws Exception { try{ String xtpipes_call = " xtpipes (2009-01-27-22:19)" + "\n Command line options: " + "\n java xtpipes [-trace] [-help] [-m] [-E] [-s script_file]" + " [-S script_map]" + "\n [-i script_dir] [-o out_file] " + "\n [-x...ml2xml_arg...] " + "(-d in_data | in_file)" + "\n -m messages printing mode" + "\n -E error messages into exception calls" + "\n in_data XML data directly into the command line\n" ; boolean help=false; for( int n=0; n cls = Xtpipes.class; Class [] argTypes = { Node.class, String.class }; method = cls.getMethod( "execute", argTypes ); if( scriptMap != null ){ try{ String f = FileInfo.searchFile( scriptMap ); if( f == null ){ throw new java.io.FileNotFoundException( scriptMap ); } else { scriptMap = f; } XMLReader saxReader; if( saxReaderStack.empty() ){ SAXParser saxParser = saxFactory.newSAXParser(); saxReader = saxParser.getXMLReader(); saxReader.setEntityResolver(new org.xml.sax.EntityResolver() { public InputSource resolveEntity( String publicId, String systemId) { if( (new File(systemId)).exists() ){ return new org.xml.sax.InputSource( systemId ); } StringReader strReader = new StringReader(""); return new org.xml.sax.InputSource(strReader); } }); } else { saxReader = (XMLReader) saxReaderStack.pop(); } saxReader.setContentHandler( new DefaultHandler(){ private Stack condition = new Stack (); public void startDocument () { condition.push( new Boolean(true) ); } public void startElement(String ns, String sName, String qName, Attributes atts) { if( condition == null ){ return; } if( Xtpipes.trace ){ String s = "<" + qName + "\n"; for(int i=0; i"; Xtpipes.logWriter.println( s ); } condition.pop(); } } ); InputStream inputStream = (InputStream) (new File(scriptMap).toURI().toURL().openStream()); saxReader.parse( new InputSource(inputStream) ); saxReaderStack.push( saxReader ); } catch( java.io.FileNotFoundException e ){ instructionErr( null, "File not found: " + e.getMessage() + "; command line option -i", 33 ); } catch( Exception e ){ instructionErr( null, e.toString(), e.getStackTrace(), 27 ); } } if( scriptFile == null ){ scriptFile = "xtpipes-default.4xt"; } while( needScript ){ if( scriptFile == null ){ instructionErr( null, "Missing 4xt script file name", 32 ); } String f = FileInfo.searchFile( scriptFile ); if( f == null ){ throw new java.io.FileNotFoundException( scriptFile ); } else { scriptFile = f; } Document script = validatingDomBuilder.parse(scriptFile); if( trace ){ logWriter.println( "(" + scriptFile + ")" ); } execute( script.getFirstChild() ); } if( outFileName != null ){ outPrintWriter.close(); } Xtpipes.logWriter.flush(); } catch( org.xml.sax.SAXParseException e ){ String s = "Improper file " + scriptFile + ": " + e.getMessage(); instructionErr( null, s, 2 ); } catch( java.io.FileNotFoundException e ){ String s; if( scriptFile.equals( e.getMessage() ) ){ s = "Could not find file: " + scriptFile; } else { s = "Problem at script " + scriptFile + ": Could not find file " + e.getMessage(); } instructionErr( null, s, 3 ); } catch( Exception e ){ String s = "Problems at file: " + scriptFile + "\n " + e; instructionErr( null, s, 4 ); } } private static void execute( Node node ) throws Exception { while( node != null ){ if( node.getNodeType()==Node.ELEMENT_NODE ){ String instruction = node.getNodeName(); if( trace ){ logWriter.print( "[##] = xtpipes => " + instruction ); if( node.hasAttributes() ){ NamedNodeMap attributes = node.getAttributes(); for(int i=0; i < attributes.getLength(); i++ ){ Node attr = attributes.item(i); logWriter.print( " " + attr.getNodeName() + "=\"" + attr.getNodeValue() + "\"" ); } } logWriter.println(); logWriter.flush(); } if( instruction.equals( "xtpipes" ) ){ // String errMsg = ""; needScript = false; if( node.hasChildNodes() ){ if( outFileName != null ){ try { FileWriter fw = new FileWriter( outFileName ); outPrintWriter = new XtpipesPrintWriter( fw ); returnToFile = true; } catch(Exception e){ instructionErr( null, e.toString(), 12 ); } } if( node.hasAttributes() ){ Node attr = node.getAttributes() .getNamedItem( "signature" ); if ( (attr != null) && messages ) { logWriter.println( attr.getNodeValue() ); } attr = node.getAttributes() .getNamedItem( "preamble" ); if( (attr != null) && attr.getNodeValue().equals( "yes" ) ){ // BufferedReader br = null; try { String s; boolean front = true; rootName = "<" + ((rootName==null)? inputObject.getRoot() : rootName); if( inData == null ){ // FileReader fr = new FileReader(inFile); // BufferedReader in = new BufferedReader(fr); URLConnection connection = new URL(inFile).openConnection(); connection.setRequestProperty("User-Agent", "[" + System.getProperty("os.name") + " / " + System.getProperty("os.arch") + "]" + "[" + System.getProperty("java.version") + " - " + System.getProperty("java.vendor") + "]" ); InputStream inputStream = connection.getInputStream(); BufferedReader in = new BufferedReader ( new InputStreamReader ( inputStream ) ); while ( ((s = in.readLine()) != null) && front ) { int i = s.indexOf( rootName ); if( i > -1 ){ front = false; s = s.substring(0,i); } outPrintWriter.println(s); returnToFile = false; } in.close(); } else { int i = inData.indexOf( rootName ); if( i > -1 ){ front = false; s = inData.substring(0,i); } else { s = ""; } outPrintWriter.println(s); returnToFile = false; } } catch (Exception e) { System.err.println( "--- Error --- Couldn't copy preamble: " + e); } } } execute( node.getFirstChild() ); } else { if( inData == null ){ /* errMsg = "Searching in " + inFile + ": "; */ scriptFile = inputObject.getXtpipes(); rootName = inputObject.getRoot(); needScript = true; } else { scriptFile = inputObject.getXtpipes(); rootName = inputObject.getRoot(); needScript = true; } } } else if( instruction.equals( "set" ) ){ String name = node.getAttributes().getNamedItem( "name" ) .getNodeValue(); Node cdata = node.getFirstChild(); while( cdata.getNodeType() != Node.CDATA_SECTION_NODE ){ cdata = cdata.getNextSibling(); } String code = cdata.getNodeValue().trim(); map.put( name, (Object) code ); } else if( instruction.equals( "get" ) ){ try { String name = node.getAttributes() .getNamedItem( "name" ).getNodeValue(); String file = node.getAttributes() .getNamedItem( "file" ).getNodeValue(); StreamSource in = new StreamSource( new File(file) ); ByteArrayOutputStream baos = new ByteArrayOutputStream(); identityTransformer.transform( in, new StreamResult(baos) ); byte [] bytes = baos.toByteArray(); map.put( name, (Object) new String(bytes) ); } catch( Exception e ){ instructionErr( node, e.toString(), 14 ); } } else if( instruction.equals( "print" ) ){ String name = node.getAttributes() .getNamedItem( "name" ).getNodeValue(); String xml = (String) map.get(name); if( node.getAttributes().getNamedItem( "file" )==null ){ if( !Xtpipes.trace ){ logWriter.println( "[##] = xtpipes => print: " + scriptFile ); } logWriter.println( XtpipesUni.toUni(xml, "") ); } else { String file = node.getAttributes() .getNamedItem( "file" ).getNodeValue(); try{ FileWriter fw = new FileWriter( file ); XtpipesPrintWriter out = new XtpipesPrintWriter( fw ); out.println( xml ); out.close(); } catch(Exception e){ instructionErr( node, e.toString(),15 ); } } } else if( instruction.equals( "return" ) ){ String name = node.getAttributes() .getNamedItem( "name" ).getNodeValue(); result = (String) map.get(name); if( returnToFile ){ outPrintWriter.println(result); } } else if( instruction.equals( "if" ) ){ try{ String xml = node.getAttributes() .getNamedItem( "xml" ).getNodeValue(); String dtd = node.getAttributes() .getNamedItem( "dtd" ).getNodeValue(); // String root = node.getAttributes() // .getNamedItem( "root" ).getNodeValue(); String doc = "\n" + "\n" + (String) map.get(xml) ; byte [] bytes = doc.getBytes("UTF-8"); ByteArrayInputStream bais = new ByteArrayInputStream( bytes ); InputSource in = new InputSource( bais ); SAXParser saxParser = saxFactory.newSAXParser(); XMLReader xmlReader = saxParser.getXMLReader(); xmlReader.parse( in ); if( trace ){ logWriter.print( "--> true" ); } execute( node.getFirstChild() ); } catch ( Exception e ){ if( trace ){ logWriter.print( "--> true" ); } } } else if( instruction.equals( "xslt" ) ){ try{ Node xmlNode = node.getAttributes().getNamedItem( "xml" ); StreamSource inDoc = null; String xml; if( xmlNode == null ){ if( inData == null ){ inDoc = new StreamSource( new File(inFile) ); } else { byte [] bytes = inData.getBytes("UTF-8"); ByteArrayInputStream bais = new ByteArrayInputStream( bytes ); inDoc = new StreamSource( bais ); } } else { xml = xmlNode.getNodeValue(); String doc = (String) map.get(xml); if( doc!=null ){ byte [] bytes = doc.getBytes("UTF-8"); ByteArrayInputStream bais = new ByteArrayInputStream( bytes ); inDoc = new StreamSource( bais ); } } String xslt = node.getAttributes() .getNamedItem( "xsl" ).getNodeValue(); String templates = (String) map.get(xslt); byte [] bytes = templates.getBytes("UTF-8"); ByteArrayInputStream bais = new ByteArrayInputStream( bytes ); StreamSource inXslt = new StreamSource( bais ); Node nameNode = node.getAttributes().getNamedItem("name"); StreamResult outDoc; CharArrayWriter caos = null; if( nameNode == null ){ outDoc = new StreamResult(outPrintWriter); returnToFile = false; } else { caos = new CharArrayWriter(); outDoc = new StreamResult(caos); } errMssg = null; fc.setErrorListener( new ErrorListener() { public void warning(TransformerException e) throws TransformerException { showSpecifics(e); } public void error(TransformerException e) throws TransformerException { showSpecifics(e); } public void fatalError(TransformerException e) throws TransformerException { showSpecifics(e); } void showSpecifics(TransformerException e) throws TransformerException{ String err = e.getMessage() ; String loc = e.getLocationAsString(); if( loc != null ){ err = loc + ": " + err; } err = "XSL stylesheet problem: " + err; if( errMssg == null ){ errMssg = err; } throw new TransformerException(err); } } ); Transformer transformer = fc.newTransformer( inXslt ); transformer.setErrorListener( new ErrorListener() { public void warning(TransformerException e) throws TransformerException { showSpecifics(e); } public void error(TransformerException e) throws TransformerException { showSpecifics(e); } public void fatalError(TransformerException e) throws TransformerException { showSpecifics(e); } void showSpecifics(TransformerException e) throws TransformerException{ String err = e.getMessage() ; String loc = e.getLocationAsString(); if( loc != null ){ err = loc + ": " + err; } if( errMssg == null ){ errMssg = err; } err = "XML document prblem: " + err; throw new TransformerException(err); } } ); transformer.transform(inDoc, outDoc ); if( nameNode != null ){ String name = nameNode.getNodeValue(); char [] chars = caos.toCharArray() ; map.put( name, (Object) new String(chars) ); } } catch ( javax.xml.transform.TransformerException e ){ if( Xtpipes.trace ){ e.printStackTrace(); } instructionErr( node, e.getMessage() + ((errMssg==null)? "" : ("; " +errMssg)) , 37); } catch ( Exception e ){ if( Xtpipes.trace ){ e.printStackTrace(); } instructionErr( node, (errMssg==null)? e.toString() : e.toString() + "; " + errMssg , 16 ); } } else if( instruction.equals( "dom" ) ){ try{ Node xmlNode = node.getAttributes().getNamedItem( "xml" ); Document dom; if( xmlNode == null ){ if( inData == null ){ dom = domBuilder.parse( new File(inFile) ); } else { byte [] bytes = inData.getBytes("UTF-8"); InputStream is = new ByteArrayInputStream( bytes ); dom = domBuilder.parse (is);} } else { String xml = xmlNode.getNodeValue(); String doc = (String) map.get(xml); if( doc == null ){ instructionErr( node, "improper xml attribute value", 18 ); } byte [] bytes = doc.getBytes("UTF-8"); InputStream is = new ByteArrayInputStream( bytes ); dom = domBuilder.parse (is); } String className = node.getAttributes() .getNamedItem( "class" ).getNodeValue(); String methodName = node.getAttributes() .getNamedItem( "method" ).getNodeValue(); Class cls = Class.forName( className ); Class [] argTypes = { Node.class }; Method m = cls.getMethod( methodName, argTypes ); Object parmValues[] = new Object[1]; parmValues[0] = dom; m.invoke( null, parmValues ); Node nameNode = node.getAttributes().getNamedItem("name"); StreamResult outDoc; CharArrayWriter caos = null; if( nameNode == null ){ outDoc = new StreamResult(outPrintWriter); returnToFile = false; } else { caos = new CharArrayWriter(); outDoc = new StreamResult(caos); } cleanXmlns(dom); DOMSource domSource = new DOMSource(dom); try{ identityTransformer.transform( domSource, outDoc ); } catch ( javax.xml.transform.TransformerException e ){ String s = Xtpipes.trace? ( "\n------------------------ xml code ------------------------\n" + serialize( dom ) + "\n----------------------------------------------------------\n" ) : ""; instructionErr( node, e.getMessage() + s, 35 ); } if( nameNode != null ){ String name = nameNode.getNodeValue(); char [] chars = caos.toCharArray() ; String domString = new String(chars); Node dcl = node.getAttributes().getNamedItem( "dcl" ); if( ((dcl == null) || (dcl.getNodeValue().equals("no") )) && (domString.length() > 7) && domString.startsWith("") + 2 ); } map.put( name, (Object) domString ); } } catch ( NoSuchMethodException e ){ instructionErr( node, "could not find method: " + e.getMessage(), 18 ); } catch ( java.lang.reflect.InvocationTargetException e ){ if( Xtpipes.trace ){ e.printStackTrace(); } instructionErr( node, e.getCause().toString(), 36); } catch ( Exception e ){ if( Xtpipes.trace ){ e.printStackTrace(); } instructionErr( node, e.toString(), 20 ); } } else if( instruction.equals( "sax" ) ){ String errMsg = ""; try{ Node xmlNode = node.getAttributes().getNamedItem( "xml" ); InputSource inputSource=null; String xml = null; if( xmlNode == null ){ if( inData == null ){ xml = inFile; } else { byte [] bytes = inData.getBytes("UTF-8"); ByteArrayInputStream bais = new ByteArrayInputStream( bytes ); inputSource = new InputSource( bais ); } } else { xml = xmlNode.getNodeValue(); String doc = (String) map.get(xml); if( doc!=null ){ byte [] bytes = doc.getBytes("UTF-8"); ByteArrayInputStream bais = new ByteArrayInputStream( bytes ); inputSource = new InputSource( bais ); } } String [] className = node.getAttributes() .getNamedItem( "content-handler" ) .getNodeValue() .split(","); Class [] argTypes = { PrintWriter.class, HashMap.class, Method.class, PrintWriter.class, boolean.class }; Node nameNode = node.getAttributes().getNamedItem("name"); PrintWriter out; CharArrayWriter caos = null; if( nameNode == null ){ out = outPrintWriter; returnToFile = false; } else { caos = new CharArrayWriter(); out = new PrintWriter( caos ); } Object parmValues[] = new Object[5]; parmValues[0] = out; HashMap scripts = new HashMap (); Node script = node.getFirstChild(); while( script != null ){ if( script.getNodeType()==Node.ELEMENT_NODE ){ String element = script.getAttributes().getNamedItem( "element" ) .getNodeValue(); if( scripts.containsKey(element) ){ System.err.println( "--- Warning --- redfining script: " + element ); } scripts.put( element, (Object) script ); } script = script.getNextSibling(); } parmValues[1] = scripts; parmValues[2] = method; parmValues[3] = Xtpipes.logWriter; parmValues[4] = (Object) Xtpipes.trace; Class cls = Class.forName( className[0].trim() ); Constructor c = cls.getConstructor( argTypes ); Object ch = (Object) c.newInstance( parmValues ); XMLReader saxReader; if( saxReaderStack.empty() ){ SAXParser saxParser = saxFactory.newSAXParser(); saxReader = saxParser.getXMLReader(); saxReader.setEntityResolver(new org.xml.sax.EntityResolver() { public InputSource resolveEntity( String publicId, String systemId) { if( (new File(systemId)).exists() ){ return new org.xml.sax.InputSource( systemId ); } StringReader strReader = new StringReader(""); return new org.xml.sax.InputSource(strReader); } }); } else { saxReader = (XMLReader) saxReaderStack.pop(); } XMLReader reader = saxReader; for( int i=1; i [] argTyp = { String.class, String[].class }; Constructor con = ml2xmlClassObj.getConstructor( argTyp ); try{ if( Xtpipes.trace ){ String s = "Calling: ml2xml.Ml2xml(inputStream," + "new String[]{" ; for(int i=0; i < Xtpipes.ml2xml.length; i++){ s += ((i==0)? "\"" : ", \"") + Xtpipes.ml2xml[i] + "\""; } s += "})"; Xtpipes.logWriter.println( s ); } inputStream = (InputStream) con.newInstance( new Object[]{xml, ml2xml} ); } catch(java.lang.reflect.InvocationTargetException ite){ String s = "Problem at: ml2xml.Ml2xml(" + xml + "," + "new String[]{" ; for(int i=0; i < Xtpipes.ml2xml.length; i++){ s += ((i==0)? "\"" : ", \"") + Xtpipes.ml2xml[i] + "\""; } s += "})"; instructionErr( null, s + "; " + ite.getCause(), 38); } } saxReader.parse( new InputSource(inputStream) ); if( Xtpipes.ml2xml != null ){ Class [] argTyp = {}; Method m = ml2xmlClassObj . getMethod( "closeFiles", argTyp ); m.invoke( null, new Object[0] ); } } else { errMsg = "xtpipes sax parsing error"; saxReader.parse( inputSource ); } if( nameNode != null ){ String name = nameNode.getNodeValue(); char [] chars = caos.toCharArray() ; map.put( name, (Object) new String(chars) ); } saxReaderStack.push( reader ); } catch ( java.io.FileNotFoundException e ){ instructionErr( node, errMsg + "could not find file: " + e.getMessage(), 19 ); } catch ( ClassNotFoundException e ){ instructionErr( node, errMsg + " class not found: " + e.getMessage() + "\n classpath = " + System.getProperty("java.class.path") + " ---", 22 ); } catch ( java.lang.reflect.InvocationTargetException e ){ instructionErr( node, errMsg + ": " + e.getCause(), 23 ); } catch ( Exception e ){ Xtpipes.logWriter.flush(); e.printStackTrace(); instructionErr( node, errMsg + ": " + e.toString(), 29 ); } } else { instructionErr( node, "Improper instruction: " + instruction, 11 ); } } node = node.getNextSibling(); } } public static String execute( Node node, String xml ) throws Exception { String name = "."; String old = (String) map.get(name); map.put( name, (Object) xml ); execute( node.getFirstChild() ); String s = (String) map.get(name); if( old != null ){ map.put( name, (Object) old ); } return s; } private static void instructionErr( Node node, String e, int num ) throws Exception { String err = "--- xtpipes error " + num + " --- "; if( node != null ){ err += "At <" + node.getNodeName(); NamedNodeMap attr = node.getAttributes(); for(int i=0; i [] argTypes = { }; Method m = ml2xmlClassObj.getMethod( "closeFiles", argTypes ); Object parmValues[] = new Object[0]; m.invoke( null, parmValues ); } Xtpipes.logWriter.flush(); if( exceptionErrs ) { throw new Exception( err ); } else { System.err.println( err ); System.exit(1); } } private static void instructionErr( Node node, String e, StackTraceElement[] st, int num ) throws Exception { Xtpipes.logWriter.println( "--- xtpipes error " + num + " --- " + e ); for(int i=st.length-1; i>=0; i-- ){ Xtpipes.logWriter.println( st[i].toString() ); } instructionErr( node, e, num ); } static String serialize( Node root ){ if( root.getNodeType() == Node.TEXT_NODE) { return root.getNodeValue(); } if( root.getNodeType() == Node.ELEMENT_NODE) { String ser = ""; String tagName = root.getNodeName(); ser += "<" + tagName; NamedNodeMap attributes = root.getAttributes(); for(int i = 0; i < attributes.getLength(); i++) { Attr attribute = (Attr) attributes.item(i); ser += "\n" + attribute.getName() + "=\"" + attribute.getValue() + "\" "; } ser += "\n>"; NodeList children = root.getChildNodes(); if(children.getLength() > 0) { for(int i = 0; i < children.getLength(); i++) { ser += serialize(children.item(i)); } } ser += ""; return ser; } if( root.getNodeType() == Node.DOCUMENT_NODE) { String ser = ""; NodeList children = root.getChildNodes(); if(children.getLength() > 0) { for(int i = 0; i < children.getLength(); i++) { ser += serialize(children.item(i)); } } return ser; } if( root == null ){ return "null"; } return ""; } static ArrayList nsName, nsValue; static void cleanXmlns( Node root ){ if( root.getNodeType() == Node.ELEMENT_NODE) { int top = nsName.size(); ArrayList remove = new ArrayList(); NamedNodeMap attributes = root.getAttributes(); for(int i = 0; i < attributes.getLength(); i++) { Attr attribute = (Attr) attributes.item(i); String name = attribute.getName(); if( name.startsWith("xmlns") ){ if( (name.length() == 5) || (name.charAt(5) == ':') ){ String value = attribute.getValue(); boolean bool = false; for(int k=nsName.size(); k>0; ){ k--; if( ((String) nsName.get(k)) . equals(name) ){ bool = ((String) nsValue.get(k)) . equals(value); break; } } if( bool ){ remove.add(attribute); } else { nsName.add(name); nsValue.add(value); } } } } for(int i=remove.size(); i>0; ){ i--; ((Element) root).removeAttributeNode( (Attr) remove.get(i) ); } remove = null; NodeList children = root.getChildNodes(); if(children.getLength() > 0) { for(int i = 0; i < children.getLength(); i++) { cleanXmlns(children.item(i)); } } for(int i=nsName.size(); i>top; ){ i--; nsName.remove(i); nsValue.remove(i); } } else if( root.getNodeType() == Node.DOCUMENT_NODE) { nsName = new ArrayList(); nsValue = new ArrayList(); NodeList children = root.getChildNodes(); if(children.getLength() > 0) { for(int i = 0; i < children.getLength(); i++) { cleanXmlns(children.item(i)); } } nsName = null; nsValue = null; } } } class XtpipesEntityResolver implements org.xml.sax.EntityResolver { public InputSource resolveEntity(String publicID, String systemID) throws SAXException { if( Xtpipes.trace ){ Xtpipes.logWriter.println( "Resolving: publicID = \" " + publicID + "\" systemID = \"" + systemID + "\"" ); } String file = FileInfo.searchFile( systemID ); if( file != null ){ try{ file = new File(file).toURI().toURL().toString(); return new InputSource( file ); } catch( java.net.MalformedURLException mfe){ throw new SAXException( "--- xtpipes error 30 --- improper file name: " + file ); } } return null; } }