You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by di...@apache.org on 2002/02/06 08:08:29 UTC

cvs commit: jakarta-commons/latka/src/java/org/apache/commons/latka/xml XMLPreprocessor.java

dion        02/02/05 23:08:29

  Modified:    latka/src/java/org/apache/commons/latka/xml
                        XMLPreprocessor.java
  Log:
  Reformatted, fixed javadoc, removed some unnecessary exceptions
  Added FIXME's for dubious bits
  
  Revision  Changes    Path
  1.17      +307 -295  jakarta-commons/latka/src/java/org/apache/commons/latka/xml/XMLPreprocessor.java
  
  Index: XMLPreprocessor.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/latka/src/java/org/apache/commons/latka/xml/XMLPreprocessor.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- XMLPreprocessor.java	5 Jan 2002 05:34:50 -0000	1.16
  +++ XMLPreprocessor.java	6 Feb 2002 07:08:29 -0000	1.17
  @@ -84,7 +84,6 @@
   
   import org.apache.commons.latka.LatkaProperties;
   import org.apache.commons.latka.Suite;
  -import org.apache.commons.latka.xml.LatkaVariableEntityResolver;
   
   import org.apache.log4j.Category;
   
  @@ -100,345 +99,358 @@
    * stream with Latka variables.
    * 
    * @author Morgan Delagrange
  + * @author dIon Gillard
    * @see org.apache.commons.latka.LatkaProperties
  + * @version $Id: XMLPreprocessor.java,v 1.17 2002/02/06 07:08:29 dion Exp $
    */
   public class XMLPreprocessor {
  +    // FIXME: format here should be all caps?
  +    /** Regular expression for variable name */
  +    protected static final String _variableExpr = "\\$\\{(.*?)\\}";
  +
  +    /** log4j Category for output to be logged to */
  +    protected static Category _log = 
  +        Category.getInstance(XMLPreprocessor.class);
   
  -  protected static final String _variableExpr = "\\$\\{(.*?)\\}";
  +    /** singleton used to preprocess */
  +    protected static XMLPreprocessor _processor = new XMLPreprocessor();
  +  
  +    /**
  +     * Private constructor to stop auto generation of public one
  +     */
  +    private XMLPreprocessor() {
  +    }
  +
  +    /**
  +     * Get an instance of this singleton class
  +     * 
  +     * @return an XML preprocessor object
  +     */
  +    public static XMLPreprocessor instance() {
  +        return _processor;
  +    }
  +
  +    /**
  +     * Processes a Suite, preparing it for the final XML 
  +     * processing.  In essence, this consists of finding
  +     * variables in the base XML document, looking for corresponding Latka
  +     * properties, and performing the substitutions.
  +     * This will only preprocess the base XML document;
  +     * the entities will be processed during the SAX parse
  +     * itself.  After running this method, it is guaranteed
  +     * that the preprocessed document will be stored in
  +     * Suite.getReader().
  +     * 
  +     * @param suite Latka suite to preprocess
  +     * @throws IOException thrown if the stream could not be read,
  +     *                   or if variables could not be substituted
  +     *
  +     * @see LatkaVariableEntityResolver#resolveEntity(String,String)
  +     * @see org.apache.commons.latka.Latka#runTests(Suite,LatkaEventInfo) 
  +     *      Latka.runTests(Suite,LatkaEventInfo)
  +     */
  +    public void preprocessXml(Suite suite) throws IOException {
  +
  +        // process the base document
  +        String processedString = null;
  +        if (suite.getReader() != null) {
  +            processedString = resolveVariables(
  +                stringFromReader(suite.getReader()));
  +        } else {
  +            processedString = resolveVariables(suite.getURL());
  +        }
  +        suite.setReader(new StringReader(processedString));
  +
  +        // entities will be processed during the SAX parse
  +    }  
   
  -  protected static Category _log =
  -    Category.getInstance(XMLPreprocessor.class);
  +    /**
  +     * Given an XML suite, find the names 
  +     * of all variables that must be set in the LatkaProperties.
  +     * Will use SAX to recurse through external entities.
  +     * 
  +     * @param suite A Latka suite
  +     * @throws IOException when variables can't be resolved or resources
  +     *         aren't accessible
  +     * @return Array of variables that must be set.  If no variables
  +     *         are present in the suite, a zero-length Set is
  +     *         returned.
  +     * @see org.apache.commons.latka.LatkaProperties
  +     */
  +    public Set findVariables(Suite suite) throws IOException {
  +
  +        // first, get variables for the base document
  +        String xml = null;
  +        if (suite.getReader() != null) {
  +            xml = stringFromReader(suite.getReader()).trim();
  +        } else {
  +            Reader reader = new InputStreamReader(suite
  +                                                  .getURL()
  +                                                  .openConnection()
  +                                                  .getInputStream());
  +            xml = stringFromReader(reader).trim();
  +        }
  +        // accumulate the sets from the Reader and all
  +        // external entities here
  +        Set set = getLocalVariables(xml);
  +
  +        // now that we have variables from the initial document,
  +        // perform a SAX parse to find additional variables
  +        // in external entities
  +        InputSource source = new InputSource(new StringReader(xml));
  +        if (suite.getURL() != null) {
  +            source.setSystemId(suite.getURL().toString());
  +        }
  +        set.addAll(getVariablesFromEntities(source));
   
  -  protected static XMLPreprocessor _processor = new XMLPreprocessor();
  +        return set;
   
  -  private XMLPreprocessor() {
  +    }
   
  -  }
  -
  -
  -  /**
  -   * Get an instance of this singleton class
  -   * 
  -   * @return an XML preprocessor object
  -   */
  -  public static XMLPreprocessor instance() {
  -    return _processor;
  -  }
  -
  -  /**
  -   * Processes a Suite, preparing it for the final XML 
  -   * processing.  In essence, this consists of finding
  -   * variables in the base XML document, looking for corresponding Latka
  -   * properties, and performing the substitutions.
  -   * This will only preprocess the base XML document;
  -   * the entities will be processed during the SAX parse
  -   * itself.  After running this method, it is guaranteed
  -   * that the preprocessed document will be stored in
  -   * Suite.getReader().
  -   * 
  -   * @param reader Latka suite to preprocess
  -   * @exception IOException
  -   *                   thrown if the stream could not be read,
  -   *                   or if variables could not be substituted
  -   *
  -   * @see LatkaVariableEntityResolver#resolveEntity(String,String)
  -   * @see org.apache.commons.latka.Latka#runTests(Suite,LatkaEventInfo) 
  -   *      Latka.runTests(Suite,LatkaEventInfo)
  -   */
  -  public void preprocessXml(Suite suite) throws IOException {
  -
  -    // process the base document
  -    String processedString = null;
  -    if (suite.getReader() != null) {
  -      processedString = resolveVariables(stringFromReader(suite.getReader()));
  -    } else {
  -      processedString = resolveVariables(suite.getURL());
  -    }
  -    suite.setReader(new StringReader(processedString));
  -
  -    // entities will be processed during the SAX parse
  -  }  
  -
  -  /**
  -   * Given an XML suite, find the names 
  -   * of all variables that must be set in the LatkaProperties.
  -   * Will use SAX to recurse through external entities.
  -   * 
  -   * @param reader A Latka suite
  -   * @return Array of variables that must be set.  If no variables
  -   *         are present in the suite, a zero-length Set is
  -   *         returned.
  -   * @see org.apache.commons.latka.LatkaProperties
  -   */
  -  public Set findVariables(Suite suite) 
  -  throws IOException {
  -
  -    // first, get variables for the base document
  -    String xml = null;
  -    if (suite.getReader() != null) {
  -      xml = stringFromReader(suite.getReader()).trim();
  -    } else {
  -      Reader reader = new InputStreamReader(suite.getURL().openConnection().getInputStream());
  -      xml = stringFromReader(reader).trim();
  -    }
  -    // accumulate the sets from the Reader and all
  -    // external entities here
  -    Set set = getLocalVariables(xml);
  -
  -    // now that we have variables from the initial document,
  -    // perform a SAX parse to find additional variables
  -    // in external entities
  -    InputSource source = new InputSource(new StringReader(xml));
  -    if (suite.getURL() != null) {
  -      source.setSystemId(suite.getURL().toString());
  -    }
  -    set.addAll(getVariablesFromEntities(source));
  -
  -    return set;
  -
  -  }
  -
  -  /**
  -   * @deprecated Spelling -- use {@link #getVariablesFromEntities} instead.
  -   */
  -  protected Set getVariablesFromEntites(InputSource inputSource) 
  -  throws IOException {
  -    return getVariablesFromEntities(inputSource);
  -  }
  -
  -  /**
  -   * This method uses a special SAX handler to recurse
  -   * through the entities of a Latka Suite, finding all
  -   * the variables that are referenced.
  -   * 
  -   * @param inputSource
  -   *               SAX InputSource containing the Latka Suite
  -   * @return Set of unique Latka variables references in the entities
  -   * @exception IOException
  -   *                   if any errors occur during the XML processing
  -   */
  -  protected Set getVariablesFromEntities(InputSource inputSource) 
  -  throws IOException {
  -    SAXParserFactory factory = SAXParserFactory.newInstance();
  -    factory.setNamespaceAware(true);
  +    /**
  +     * @param inputSource source of xml to use for resolution
  +     * @throws IOException when variables can't be resolved
  +     * @return a set of Latka variables
  +     * @deprecated Spelling -- use {@link #getVariablesFromEntities} instead.
  +     */
  +    protected Set getVariablesFromEntites(InputSource inputSource) 
  +        throws IOException {
  +        return getVariablesFromEntities(inputSource);
  +    }
  +
  +    /**
  +     * This method uses a special SAX handler to recurse
  +     * through the entities of a Latka Suite, finding all
  +     * the variables that are referenced.
  +     * 
  +     * @param inputSource SAX InputSource containing the Latka Suite
  +     * @return Set of unique Latka variables references in the entities
  +     * @throws IOException if any errors occur during the XML processing
  +     */
  +    protected Set getVariablesFromEntities(InputSource inputSource) 
  +        throws IOException {
  +        SAXParserFactory factory = SAXParserFactory.newInstance();
  +        factory.setNamespaceAware(true);
   
  -    FindVariablesHandler handler = 
  -      new FindVariablesHandler();
  +        FindVariablesHandler handler = new FindVariablesHandler();
       
  -    try {
  -      SAXParser parser = factory.newSAXParser();
  +        try {
  +            SAXParser parser = factory.newSAXParser();
         
  -      parser.parse(inputSource, handler);
  -    } catch (ParserConfigurationException e) {
  -      throw new IOException(e.toString());
  -    } catch (SAXException e) {
  -      throw new IOException(e.toString());
  -    }
  +            parser.parse(inputSource, handler);
  +        } catch (ParserConfigurationException e) {
  +            throw new IOException(e.toString());
  +        } catch (SAXException e) {
  +            throw new IOException(e.toString());
  +        }
   
  -    return handler.getVariables();
  -  }
  +        return handler.getVariables();
  +    }
     
  -  /**
  -   * 
  -   * @see #getLocalVariables(String)
  -   */
  -  protected Set getLocalVariables(Reader reader) throws IOException {
  -    String xmlString = stringFromReader(reader).trim();
  -    return getLocalVariables(xmlString);
  -  }
  -
  -  /**
  -   * Read the text and find the names of all variables 
  -   * that must be set in the LatkaProperties.  This method does not
  -   * recurse through entities like findVariables.
  -   * 
  -   * @param a Latka suite fragment
  -   * @return Set of variables used in this fragment.  If no variables
  -   *         are present in the suite, a zero-length Set is
  -   *         returned.
  -   * @see org.apache.commons.latka.LatkaProperties
  -   */
  -  protected Set getLocalVariables(String xmlString) throws IOException {
  +    /**
  +     * 
  +     * @see #getLocalVariables(String)
  +     */
  +    protected Set getLocalVariables(Reader reader) throws IOException {
  +        String xmlString = stringFromReader(reader).trim();
  +        return getLocalVariables(xmlString);
  +    }
  +
  +    /**
  +     * Read the text and find the names of all variables 
  +     * that must be set in the LatkaProperties.  This method does not
  +     * recurse through entities like findVariables.
  +     * 
  +     * @param xmlString a Latka suite fragment
  +     * @return Set of variables used in this fragment.  If no variables
  +     *         are present in the suite, a zero-length Set is
  +     *         returned.
  +     * @see org.apache.commons.latka.LatkaProperties
  +     */
  +    protected Set getLocalVariables(String xmlString) {
       
  -    xmlString = stripXmlComments(xmlString);
  -
  -    Set set = new TreeSet();
  +        xmlString = stripXmlComments(xmlString);
   
  -    try {
  -      RE r = new RE(_variableExpr);  // Compile expression
  +        Set set = new TreeSet();
   
  -      //scan the input string match by match
  -      int bufIndex = 0;
  +        try {
  +            RE r = new RE(_variableExpr);  // Compile expression
   
  -      while (r.match(xmlString, bufIndex)) {
  -        set.add(r.getParen(1));
  -        bufIndex = r.getParenEnd(0);
  -      }
  -    } catch (RESyntaxException e) {
  -      e.printStackTrace();
  -    }
  +            //scan the input string match by match
  +            int bufIndex = 0;
  +
  +            while (r.match(xmlString, bufIndex)) {
  +                set.add(r.getParen(1));
  +                bufIndex = r.getParenEnd(0);
  +            }
  +        } catch (RESyntaxException e) {
  +            // FIXME: should this really be swallowed?
  +            e.printStackTrace();
  +        }
   
  -    return set;
  +        return set;
   
  -  }
  +    }
   
  -  /**
  -   * @see #resolveVariables(String) 
  -   */
  -  protected String resolveVariables(URL url) throws IOException {
  -    Reader reader = new InputStreamReader(url.openConnection().getInputStream());
  -    return resolveVariables(stringFromReader(reader));
  -  }
  +    /**
  +     * @see #resolveVariables(String) 
  +     */
  +    protected String resolveVariables(URL url) throws IOException {
  +        Reader reader = new InputStreamReader(url.openConnection()
  +                                             .getInputStream());
  +        return resolveVariables(stringFromReader(reader));
  +    }
   
  -  /**
  -   * Given an XML suite, find the corresponding values
  -   * of all variables and write them into the stream.
  -   * 
  -   * @param xmlString XML String representing a Latka suite
  -   * @return XML String with all variables resolved
  -   * @exception IOException
  -   *                   Thrown if a Latka variables could not be resolved
  -   */
  -  protected String resolveVariables(String xmlString) throws IOException {
  +    /**
  +     * Given an XML suite, find the corresponding values
  +     * of all variables and write them into the stream.
  +     * 
  +     * @param xmlString XML String representing a Latka suite
  +     * @return XML String with all variables resolved
  +     * @throws IOException if a Latka variable could not be resolved
  +     */
  +    protected String resolveVariables(String xmlString) throws IOException {
   
  -    StringBuffer output = new StringBuffer();
  +        StringBuffer output = new StringBuffer();
   
  -    Properties props = LatkaProperties.getProperties();
  +        Properties props = LatkaProperties.getProperties();
   
  -    try {
  +        try {
         
  -      xmlString = stripXmlComments(xmlString);
  -
  -      // now, replace the remaining variables
  -      RE r = new RE(_variableExpr);  // Compile expression
  +            xmlString = stripXmlComments(xmlString);
   
  -      //scan the input string match by match, writing to the buffer
  -      int bufIndex = 0;
  +            // now, replace the remaining variables
  +            RE r = new RE(_variableExpr);  // Compile expression
   
  -      while (r.match(xmlString, bufIndex)) {
  -        // append everything to the beginning of the match
  -        output.append(xmlString.substring(bufIndex,r.getParenStart(0)));
  -        // move marker to the end of the match
  -        bufIndex = r.getParenEnd(0);
  +            //scan the input string match by match, writing to the buffer
  +            int bufIndex = 0;
   
  -        String prop = props.getProperty(r.getParen(1));
  -        if (prop == null) {
  -          throw new IOException("Property " + r.getParen(1) + " was not defined.");
  +            while (r.match(xmlString, bufIndex)) {
  +                // append everything to the beginning of the match
  +                output.append(xmlString.substring(bufIndex,
  +                                                  r.getParenStart(0)));
  +                // move marker to the end of the match
  +                bufIndex = r.getParenEnd(0);
  +
  +                String prop = props.getProperty(r.getParen(1));
  +                if (prop == null) {
  +                    throw new IOException("Property " + 
  +                                          r.getParen(1) + 
  +                                          " was not defined.");
  +                }
  +                // append the substituted value to the end of the output
  +                output.append(prop);
  +            }
  +
  +            // grab anything remaining that did not match
  +            output.append(xmlString.substring(bufIndex, xmlString.length()));
  +        } catch (RESyntaxException e) {
  +            // FIXME: Should this really be swallowed?
  +            e.printStackTrace();
           }
  -        // append the substituted value to the end of the output
  -        output.append(prop);
  -      }
  -
  -      // grab anything remaining that did not match
  -      output.append(xmlString.substring(bufIndex,xmlString.length()));
  -
  -    } catch (RESyntaxException e) {
  -      e.printStackTrace();
  -    }
  -
  -    String outputString = output.toString();
   
  +        String outputString = output.toString();
   
  -    return outputString;
  +        return outputString;
   
  -  }
  -
  -  /**
  -   * Given a Latka suite, resolve all the entites
  -   * (bot _not_ the Latka variables), and return one flattened
  -   * XML document.  This utility method is useful for
  -   * viewing an XML suite as a single document.
  -   * 
  -   * @param suite  a Latka suite
  -   * @return flattened XML
  -   * @exception IOException
  -   *                   if the Latka suite could not be transformed
  -   */
  -  public String identityTransform(Suite suite) throws IOException {
  -
  -    _log.debug("Setting up transform streams");
  -
  -    StreamSource source = new StreamSource();
  -    if (suite.getReader() != null) {
  -      _log.debug("Setting input reader");
  -      source.setReader(suite.getReader());
  -    }
  -    if (suite.getURL() != null) {
  -      _log.debug("Setting input URL");
  -      source.setSystemId(suite.getURL().toString());
       }
   
  -    StringWriter output = new StringWriter();
  -    StreamResult result = new StreamResult(output);
  +    /**
  +     * Given a Latka suite, resolve all the entites
  +     * (but _not_ the Latka variables), and return one flattened
  +     * XML document.  This utility method is useful for
  +     * viewing an XML suite as a single document.
  +     * 
  +     * @param suite  a Latka suite
  +     * @return flattened XML
  +     * @throws IOException if the Latka suite could not be transformed
  +     */
  +    public String identityTransform(Suite suite) throws IOException {
  +
  +        _log.debug("Setting up transform streams");
  +
  +        StreamSource source = new StreamSource();
  +        if (suite.getReader() != null) {
  +            _log.debug("Setting input reader");
  +            source.setReader(suite.getReader());
  +        }
  +        if (suite.getURL() != null) {
  +            _log.debug("Setting input URL");
  +            source.setSystemId(suite.getURL().toString());
  +        }
  +
  +        StringWriter output = new StringWriter();
  +        StreamResult result = new StreamResult(output);
   
  -    _log.debug("Performing transformation");
  +        _log.debug("Performing transformation");
   
  -    try {
  -      // we should be able to do identity transforms via TransformerFactory.newTransformer(),
  -      // but this seems broken in Xalan 2.1.0, so...
  -      ClassLoader loader = Thread.currentThread().getContextClassLoader();
  -      StreamSource xslSource = 
  -        new StreamSource(loader.getResourceAsStream("org.apache.commons.latka.identityTransform.xsl"));
  +        try {
  +            // we should be able to do identity transforms via 
  +            // TransformerFactory.newTransformer(), but this seems broken in 
  +            // Xalan 2.1.0, so...
  +            ClassLoader loader = Thread.currentThread().getContextClassLoader();
  +            StreamSource xslSource = new StreamSource(
  +                        loader.getResourceAsStream(
  +                            "org.apache.commons.latka.identityTransform.xsl"));
         
  -      Transformer transformer = TransformerFactory.newInstance().newTransformer(xslSource);
  -      transformer.transform(source,result);
  -    } catch (TransformerException e) {
  -      _log.error(e);
  -      throw new IOException(e.toString());
  -    }
  -
  -    if (_log.isDebugEnabled()) {
  -      _log.debug("Transformation output: \n" + output.toString());
  -    }
  +            Transformer transformer = TransformerFactory.newInstance()
  +                                        .newTransformer(xslSource);
  +            transformer.transform(source, result);
  +        } catch (TransformerException e) {
  +            _log.error(e);
  +            throw new IOException(e.toString());
  +        }
   
  -    return output.toString();
  +        if (_log.isDebugEnabled()) {
  +            _log.debug("Transformation output: \n" + output.toString());
  +        }
   
  -  }
  +        return output.toString();
   
  -  /**
  -   * Remove any comments from the XmlString
  -   * 
  -   * @param xmlString String with XML comments
  -   * @return String with no XML comments
  -   */
  -  protected String stripXmlComments(String xmlString) {
  -    try {
  -      //remove anything commented out
  -      RE removeComments = new RE("<!--.*?-->",RE.MATCH_SINGLELINE);
  -      xmlString = removeComments.subst(xmlString,"");
  -    } catch (RESyntaxException e) {
  -      e.printStackTrace();
       }
   
  -    return xmlString;
  -  }
  -
  -  /**
  -   * Place the contents of a Reader into a String.
  -   * 
  -   * @param reader text in a Reader
  -   * @return text stored as a String
  -   * @exception IOException
  -   *                   if the Reader could not be accessed
  -   */
  -  protected String stringFromReader(Reader reader) 
  -  throws IOException {
  -
  -    BufferedReader buffReader = new BufferedReader(reader);
  -
  -    StringBuffer buff = new StringBuffer();
  +    /**
  +     * Remove any comments from the XmlString
  +     * 
  +     * @param xmlString String with XML comments
  +     * @return String with no XML comments
  +     */
  +    protected String stripXmlComments(String xmlString) {
  +        try {
  +            //remove anything commented out
  +            RE removeComments = new RE("<!--.*?-->", RE.MATCH_SINGLELINE);
  +            xmlString = removeComments.subst(xmlString, "");
  +        } catch (RESyntaxException e) {
  +            // FIXME: Should this really be swallowed?
  +            e.printStackTrace();
  +        }
   
  -    String line = buffReader.readLine();
  -    while (line != null) {
  -      buff.append(line);
  -      buff.append("\n");
  -      line = buffReader.readLine();
  +        return xmlString;
       }
   
  -    reader.close();
  -
  -    return buff.toString();
  -  }
  +    /**
  +     * Place the contents of a Reader into a String.
  +     * 
  +     * @param reader text in a Reader
  +     * @return text stored as a String
  +     * @exception IOException if the Reader could not be accessed
  +     */
  +    protected String stringFromReader(Reader reader) throws IOException {
  +
  +        BufferedReader buffReader = new BufferedReader(reader);
  +
  +        StringBuffer buff = new StringBuffer();
  +
  +        // FIXME: Is this really the most efficient way to do it, per line?
  +        String line = buffReader.readLine();
  +        while (line != null) {
  +            buff.append(line);
  +            buff.append("\n");
  +            line = buffReader.readLine();
  +        }
   
  +        reader.close();
   
  +        return buff.toString();
  +    }
   }                         
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>