package edu.northwestern.at.morphadorner.xgtagger; /* Please see the license information in the header below. */ /** XGTagger * * Copyright Ecole Nationale Superieure des Mines de Saint-Etienne * * Original authors: Aude Garnier and Xavier Tannier. * * Modifications by Philip R. "Pib" Burns at Northwestern University * for integration into MorphAdorner. * * Please DO NOT address questions about this modified version to the * original authors. * * This software is a computer program whose purpose is to provide * a generic interface to deal with and analyse any XML textual content. * * This software is governed by the CeCILL license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL * license as circulated by CEA, CNRS and INRIA at the following URL * "http://www.cecill.info". * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * In this respect, the user's attention is drawn to the risks associated * with loading, using, modifying and/or developing or reproducing the * software by the user in light of its specific status of free software, * that may mean that it is complicated to manipulate, and that also * therefore means that it is reserved for developers and experienced * professionals having in-depth computer knowledge. Users are therefore * encouraged to load and test the software's suitability as regards their * requirements in conditions enabling the security of their systems and/or * data to be ensured and, more generally, to use and operate it in the * same conditions as regards security. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL license and that you accept its terms. */ import java.io.*; import java.util.Properties; import java.util.Vector; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.stream.*; import javax.xml.transform.*; import javax.xml.transform.dom.*; import org.w3c.dom.*; import org.w3c.dom.ls.*; import java.util.regex.*; public class XGMisc { /** Allow use of LS 3.0 features for output. */ protected static boolean allowLS30 = true; /** Print a <code>Node</code> into a file. * * @param node The <code>Node</code> to print. * @param outputName The name out the output file. * * @return <code>-1</code> if the operation failed, * <code>1</code> otherwise. */ public static int printNodeToFile( Node node , String outputName ) throws IOException , FileNotFoundException { int result = -1; try { // Create builder DOM. DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); DOMImplementation domImpl = builder.getDOMImplementation(); if ( allowLS30 && domImpl.hasFeature( "LS" , "3.0" ) ) { // Create implementation. DOMImplementationLS domImplLS = ( (DOMImplementationLS)domImpl ); // Output. LSOutput lsOutput = domImplLS.createLSOutput(); // Serializer and output. LSSerializer lsSerializer = domImplLS.createLSSerializer(); lsSerializer.getDomConfig().setParameter( "xml-declaration" , false ); // lsSerializer.getDomConfig().setParameter( // "format-pretty-print" , true ); FileOutputStream fos = new FileOutputStream( outputName ); lsOutput.setByteStream( fos ); lsSerializer.write( node , lsOutput ); fos.close(); result = 1; } else { Transformer identityTransformer = TransformerFactory.newInstance().newTransformer(); Properties outputProps = new Properties(); outputProps.setProperty( "encoding" , "utf-8" ); outputProps.setProperty( "indent" , "yes" ); outputProps.setProperty( "omit-xml-declaration" , "yes" ); identityTransformer.setOutputProperties( outputProps ); DOMSource source = new DOMSource( node ); FileOutputStream fos = new FileOutputStream( outputName ); StreamResult streamResult = new StreamResult( fos ); identityTransformer.transform( source , streamResult ); fos.close(); result = 1; } } catch ( javax.xml.parsers.ParserConfigurationException e ) { } catch ( javax.xml.transform.TransformerConfigurationException e ) { } catch ( javax.xml.transform.TransformerException e ) { } return result; } /** Print a <code>Node</code> into a string. * * @param node the <code>Node</code> to print * @return XML string if operation succeeded, null otherwise. */ public static String printNodeToString( Node node ) throws IOException , FileNotFoundException { String result = null; try { // Create builder DOM. DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); DOMImplementation domImpl = builder.getDOMImplementation(); if ( allowLS30 && domImpl.hasFeature( "LS" , "3.0" ) ) { // Create implementation. DOMImplementationLS domImplLS = ( (DOMImplementationLS)domImpl ); // Output. LSOutput lsOutput = domImplLS.createLSOutput(); // Serializer and output. LSSerializer lsSerializer = domImplLS.createLSSerializer(); lsSerializer.getDomConfig().setParameter( "xml-declaration" , false ); // lsSerializer.getDomConfig().setParameter( // "format-pretty-print" , true ); ByteArrayOutputStream bos = new ByteArrayOutputStream(); lsOutput.setByteStream( bos ); lsSerializer.write( node , lsOutput ); bos.close(); result = bos.toString( "utf-8" ); } else { Transformer identityTransformer = TransformerFactory.newInstance().newTransformer(); Properties outputProps = new Properties(); outputProps.setProperty( "encoding" , "utf-8" ); outputProps.setProperty( "indent" , "yes" ); outputProps.setProperty( "omit-xml-declaration" , "yes" ); identityTransformer.setOutputProperties( outputProps ); DOMSource source = new DOMSource( node ); ByteArrayOutputStream bos = new ByteArrayOutputStream(); StreamResult streamResult = new StreamResult( bos ); identityTransformer.transform( source , streamResult ); bos.close(); result = bos.toString( "utf-8" ); } } catch ( javax.xml.parsers.ParserConfigurationException e ) { } catch ( javax.xml.transform.TransformerConfigurationException e ) { } catch ( javax.xml.transform.TransformerException e ) { } return result; } /** Returns a file from its name. Expands environment variables and * get canonical path. * * @param strFileName the initial file name * @return File */ public static File getFile( String strFileName ) throws IOException { Pattern p = Pattern.compile( "\\$([a-zA-Z_]+)" ); Matcher m = p.matcher( strFileName ); StringBuffer sb = new StringBuffer(); while ( m.find() ) { if ( System.getenv( m.group( 1 ) ) != null ) { m.appendReplacement( sb , System.getenv( m.group( 1 ) ) ); } else { m.appendReplacement( sb , "" ); } } m.appendTail( sb ); return new File( sb.toString() ); } /** Writes a text into a file. * * @param strText The text to write. * @param strFileName The URI of the file. * * @throws IOException If file cannot be written. */ public static void write( String strText , String strFileName ) throws IOException { OutputStreamWriter myFile = new OutputStreamWriter( new FileOutputStream( strFileName ) , "utf-8" ); BufferedWriter myBuffer = new BufferedWriter( myFile ); myBuffer.write( strText , 0 , strText.length() ); myBuffer.flush(); myBuffer.close(); myFile.close(); } }