Changeset 25423


Ignore:
Timestamp:
2012-04-19T14:58:44+12:00 (12 years ago)
Author:
ak19
Message:

Better error reporting during transformations. Extended the TransformErrorListener to store the XSLT upon construction and print it out (besides the exception message) upon exception.

Location:
main/trunk/greenstone3/src/java/org/greenstone/gsdl3
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • main/trunk/greenstone3/src/java/org/greenstone/gsdl3/core/TransformingReceptionist.java

    r25301 r25423  
    618618
    619619            Transformer preProcessor = transformerFactory.newTransformer(new DOMSource(preprocessingXsl));
    620             preProcessor.setErrorListener(new XMLTransformer.TransformErrorListener());
     620            preProcessor.setErrorListener(new XMLTransformer.TransformErrorListener(preprocessingXsl));
    621621            DOMResult result = new DOMResult();
    622622            result.setNode(skinAndLibraryDoc);
     
    864864            transformer.transform(domSource, result);
    865865            content = writer.toString();
    866             System.out.println("Change the & to &Amp; for proper debug dispay");
     866            System.out.println("Change the & to &Amp; for proper debug display");
    867867            content = StringUtils.replace(content, "&", "&");
    868868            writer.flush();
  • main/trunk/greenstone3/src/java/org/greenstone/gsdl3/util/GSXML.java

    r25313 r25423  
    3131import javax.xml.transform.stream.StreamResult;
    3232import javax.xml.transform.dom.DOMSource;
     33import javax.xml.transform.OutputKeys;
    3334
    3435import java.util.Map;
     
    12341235    }
    12351236
    1236     public static void elementToLogAsString(Element e)
    1237     {
    1238         try
    1239         {
    1240             TransformerFactory tf = TransformerFactory.newInstance();
    1241             Transformer trans = tf.newTransformer();
    1242             StringWriter sw = new StringWriter();
    1243             trans.transform(new DOMSource(e), new StreamResult(sw));
    1244             System.err.println(sw.toString());
    1245         }
    1246         catch (Exception ex)
    1247         {
    1248             System.err.println("couldn't write " + e + " to log");
    1249         }
     1237    public static void elementToLogAsString(Element e, boolean indent)
     1238    {
     1239    String str = elementToString(e, indent);
     1240    System.err.println(str);
     1241    logger.error(str);
     1242    }
     1243
     1244    public static String elementToString(Element e, boolean indent)
     1245    {
     1246        String str = "**********START*************\n";
     1247        try {
     1248        TransformerFactory tf = TransformerFactory.newInstance();
     1249        Transformer trans = tf.newTransformer();
     1250        StringWriter sw = new StringWriter();
     1251        if(indent) {
     1252            trans.setOutputProperty(OutputKeys.INDENT, "yes");
     1253        } else {
     1254            trans.setOutputProperty(OutputKeys.INDENT, "no");
     1255        }
     1256        trans.transform(new DOMSource(e), new StreamResult(sw));
     1257        str += sw.toString();
     1258        }
     1259        catch (Exception ex) {
     1260        str += "Exception: couldn't write " + e + " to log";
     1261        }
     1262        finally {
     1263        str += "\n***********************\n";
     1264        return str;
     1265        }
    12501266    }
    12511267
  • main/trunk/greenstone3/src/java/org/greenstone/gsdl3/util/XMLTransformer.java

    r24472 r25423  
    4242import java.io.StringReader;
    4343import java.io.StringWriter;
     44import java.io.BufferedReader;
     45import java.io.FileReader;
    4446import java.io.File;
    4547import java.util.HashMap;
     
    116118        // Use the TransformerFactory to process the stylesheet Source and generate a Transformer.
    117119        Transformer transformer = this.t_factory.newTransformer(new StreamSource(stylesheet));
    118         transformer.setErrorListener(new TransformErrorListener());
     120        transformer.setErrorListener(new TransformErrorListener(stylesheet));
    119121
    120122        // Use the Transformer to transform an XML Source and send the output to a Result object.
     
    142144        // Use the TransformerFactory to process the stylesheet Source and generate a Transformer.
    143145        Transformer transformer = this.t_factory.newTransformer(new DOMSource(stylesheet));
    144         transformer.setErrorListener(new TransformErrorListener());
     146        transformer.setErrorListener(new TransformErrorListener(stylesheet));
    145147        if (parameters != null) {
    146148        Set params = parameters.entrySet();
     
    182184            Transformer transformer = this.t_factory.newTransformer(new DOMSource(stylesheet));
    183185            logger.info("XMLTransformer transformer is " + transformer);
    184             transformer.setErrorListener(new TransformErrorListener());
     186            transformer.setErrorListener(new TransformErrorListener(stylesheet));
    185187            if (parameters != null) {
    186188                Set params = parameters.entrySet();
     
    214216    try {
    215217        Transformer transformer = this.t_factory.newTransformer(new StreamSource(stylesheet));
    216         transformer.setErrorListener(new TransformErrorListener());
     218        transformer.setErrorListener(new TransformErrorListener(stylesheet));
    217219        DOMResult result = new DOMResult();
    218220        transformer.transform(new StreamSource(source), result);
     
    233235        try {
    234236            Transformer transformer = this.t_factory.newTransformer(new StreamSource(stylesheet));
    235             transformer.setErrorListener(new TransformErrorListener());
     237            transformer.setErrorListener(new TransformErrorListener(stylesheet));
    236238            DOMResult result = new DOMResult(docDocType);
    237239            transformer.transform(new StreamSource(source), result);
     
    320322    // be retrieved and be used to generate an xhtml error page.
    321323    static public class TransformErrorListener implements ErrorListener {
    322         protected String errorMessage = null;
    323    
    324         //  Receive notification of a recoverable error.
    325         public void error(TransformerException exception) {
    326             handleError("Error:\n", exception);
    327         }
    328         //   Receive notification of a non-recoverable error.
    329         public void fatalError(TransformerException exception) {
    330             handleError("Fatal Error:\n", exception);
    331         }
    332         // Receive notification of a warning.
    333         public void warning(TransformerException exception) {
    334             handleError("Warning:\n", exception);
    335         }
     324        protected String errorMessage = null;
     325        protected String stylesheet = null;
     326        protected String file = null;
     327       
     328        public TransformErrorListener(String xslt) {
     329        this.stylesheet = xslt;
     330        }
     331
     332        public TransformErrorListener(Document xslt) {
     333        //this.stylesheet = GSXML.xmlNodeToString(xslt);
     334        this.stylesheet = GSXML.elementToString(xslt.getDocumentElement(), true);
     335        }
     336
     337        public TransformErrorListener(File xslt) {
     338        stylesheet = "";       
     339        file = xslt.getAbsolutePath();
     340        String error = "Can't locate stylesheet file: " + xslt;
     341
     342        if(!xslt.exists()) {
     343            stylesheet = error;
     344            System.err.println("@@@@@@@ " + error);
     345            return;
     346        }
     347        try {
     348            BufferedReader in = new BufferedReader(new FileReader(xslt));
     349            String line = "";
     350            while((line = in.readLine()) != null) {
     351            stylesheet = stylesheet + line + "\n";
     352            }
     353            in.close();
     354            in = null;
     355        } catch(Exception e) {
     356            stylesheet = error;
     357            System.err.println("Exception reading file: " + xslt.getAbsolutePath());
     358            e.printStackTrace();
     359        }
     360        }
     361
     362        //  Receive notification of a recoverable error.
     363        public void error(TransformerException exception) {
     364        handleError("Error:\n", exception);
     365        }
     366        // Receive notification of a non-recoverable error.
     367        public void fatalError(TransformerException exception) {
     368        handleError("Fatal Error:\n", exception);
     369        }
     370        // Receive notification of a warning.
     371        public void warning(TransformerException exception) {
     372        handleError("Warning:\n", exception);
     373        }
    336374       
    337         public String toString(TransformerException e) {
    338             String location = e.getLocationAsString();
    339             if(location == null) {
    340                 return e.getMessage();
    341             }
    342             return e.getMessage() + "\n" + location;
    343         }
    344        
    345         // clears the errorPage variable after first call to this method
    346         public String getErrorMessage() {
    347             String errMsg = this.errorMessage;
    348             if(this.errorMessage != null) {
    349                 this.errorMessage = null;
    350             }
    351             return errMsg;
    352         }
    353        
    354         // sets the errorMessage member variable to the data stored in the exception
    355         // and writes the errorMessage to the logger and tomcat's System.err
    356         protected void handleError(String errorType, TransformerException exception) {
    357             this.errorMessage = errorType + toString(exception);
    358             System.err.println("\n****Error transforming xml:\n" + this.errorMessage + "\n****\n");
    359             logger.error(this.errorMessage);
    360         }
     375        public String toString(TransformerException e) {
     376        String msg = "Exception encountered was:\n\t";
     377        String location = e.getLocationAsString();
     378        if(location != null) {         
     379            msg = msg + "Location: " + location + "\n\t";
     380        }
     381
     382        return msg + "Message: " + e.getMessage();
     383        }
     384       
     385        // clears the errorPage variable after first call to this method
     386        public String getErrorMessage() {
     387        String errMsg = this.errorMessage;
     388        if(this.errorMessage != null) {
     389            this.errorMessage = null;
     390        }
     391        return errMsg;
     392        }
     393       
     394        // sets the errorMessage member variable to the data stored in the exception
     395        // and writes the errorMessage to the logger and tomcat's System.err
     396        protected void handleError(String errorType, TransformerException exception) {
     397        this.errorMessage = errorType + toString(exception);
     398        if(file != null) {
     399            this.errorMessage = this.errorMessage + "\nfilename: " + file;
     400        }
     401        this.errorMessage += "\nException CAUSE:\n" + exception.getCause();
     402        System.err.println("\n****Error transforming xml:\n" + this.errorMessage + "\n****\n");
     403        System.err.println("Stylesheet was:\n" + this.stylesheet + "\n\n");
     404        logger.error(this.errorMessage);
     405        }
    361406    }
    362407}
Note: See TracChangeset for help on using the changeset viewer.