You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by iv...@apache.org on 2002/07/22 03:40:48 UTC

cvs commit: xml-cocoon2/src/java/org/apache/cocoon/transformation CIncludeTransformer.java

ivelin      2002/07/21 18:40:47

  Modified:    src/java/org/apache/cocoon/transformation
                        CIncludeTransformer.java
  Log:
  applied patch by  Andy Oliver
  http://nagoya.apache.org/bugzilla/show_bug.cgi?id=10540
  
  Revision  Changes    Path
  1.8       +56 -4     xml-cocoon2/src/java/org/apache/cocoon/transformation/CIncludeTransformer.java
  
  Index: CIncludeTransformer.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/java/org/apache/cocoon/transformation/CIncludeTransformer.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- CIncludeTransformer.java	7 Jun 2002 13:15:10 -0000	1.7
  +++ CIncludeTransformer.java	22 Jul 2002 01:40:47 -0000	1.8
  @@ -50,14 +50,24 @@
   */
   package org.apache.cocoon.transformation;
   
  +import org.apache.avalon.framework.component.ComponentException; 
   import org.apache.avalon.framework.component.ComponentManager;
   import org.apache.avalon.framework.component.Composable;
   import org.apache.avalon.framework.parameters.Parameters;
   import org.apache.cocoon.ProcessingException;
  +import org.apache.cocoon.components.source.SourceUtil;
   import org.apache.cocoon.environment.SourceResolver;
   import org.apache.cocoon.xml.IncludeXMLConsumer;
  +import org.apache.avalon.excalibur.xml.Parser;
  +import org.apache.avalon.excalibur.xml.xpath.XPathProcessor;
   import org.apache.excalibur.source.Source;
   import org.apache.excalibur.source.SourceException;
  +import org.w3c.dom.Document;
  +import org.w3c.dom.Node;
  +import org.w3c.dom.NodeList;
  +import org.xml.sax.ContentHandler;
  +import org.xml.sax.ext.LexicalHandler;
  +import org.xml.sax.InputSource;
   import org.xml.sax.Attributes;
   import org.xml.sax.SAXException;
   import org.xml.sax.helpers.AttributesImpl;
  @@ -75,6 +85,7 @@
    * which surrounds the included content.
    *
    * @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a>
  + * @author <a href="mailto:acoliver@apache.org">Andrew C. Oliver</a>
    * @version CVS $Id$
    */
   public class CIncludeTransformer extends AbstractTransformer
  @@ -84,6 +95,7 @@
       public static final String CINCLUDE_INCLUDE_ELEMENT = "include";
       public static final String CINCLUDE_INCLUDE_ELEMENT_SRC_ATTRIBUTE = "src";
       public static final String CINCLUDE_INCLUDE_ELEMENT_ELEMENT_ATTRIBUTE = "element";
  +    public static final String CINCLUDE_INCLUDE_ELEMENT_SELECT_ATTRIBUTE = "select";
       public static final String CINCLUDE_INCLUDE_ELEMENT_NS_ATTRIBUTE = "ns";
       public static final String CINCLUDE_INCLUDE_ELEMENT_PREFIX_ATTRIBUTE = "prefix";
   
  @@ -93,6 +105,8 @@
       /** The current <code>ComponentManager</code>. */
       protected ComponentManager manager = null;
   
  +    private XPathProcessor processor = null;
  +
       /**
        * Setup the component.
        */
  @@ -107,6 +121,11 @@
        */
       public final void compose(final ComponentManager manager) {
           this.manager = manager;
  +        try {
  +            this.processor = (XPathProcessor)this.manager.lookup(XPathProcessor.ROLE);
  +        } catch (Exception e) {
  +            getLogger().error("cannot obtain XPathProcessor", e);
  +        }
       }
   
       /**
  @@ -125,6 +144,7 @@
   
               this.processCIncludeElement(attr.getValue("",CINCLUDE_INCLUDE_ELEMENT_SRC_ATTRIBUTE),
                                           attr.getValue("",CINCLUDE_INCLUDE_ELEMENT_ELEMENT_ATTRIBUTE),
  +                                        attr.getValue("",CINCLUDE_INCLUDE_ELEMENT_SELECT_ATTRIBUTE),
                                           attr.getValue("",CINCLUDE_INCLUDE_ELEMENT_NS_ATTRIBUTE),
                                           attr.getValue("",CINCLUDE_INCLUDE_ELEMENT_PREFIX_ATTRIBUTE));
   
  @@ -142,15 +162,17 @@
           super.endElement(uri, name, raw);
       }
   
  -    protected void processCIncludeElement(String src, String element, String ns, String prefix)
  +    protected void processCIncludeElement(String src, String element, String select, String ns, String prefix)
       throws SAXException {
   
           if (element == null) element="";
  +        if (select == null) select="";
           if (ns == null) ns="";
           if (prefix == null) prefix="";
   
           getLogger().debug("Processing CInclude element: src=" + src
                             + ", element=" + element
  +                          + ", select=" + select
                             + ", ns=" + ns
                             + ", prefix=" + prefix);
   
  @@ -168,9 +190,35 @@
           }
   
           Source source = null;
  +        Parser parser = null;
           try {
               source = this.sourceResolver.resolveURI(src);
  -            this.sourceResolver.toSAX(source, consumer);
  +
  +            if (!"".equals(select)) {
  +
  +                   
  +                    parser = (Parser)manager.lookup(Parser.ROLE);
  +
  +                    InputSource input = SourceUtil.getInputSource(source);
  +
  +                        String xpath = select;
  +                        getLogger().debug("XPath is "+xpath);
  +                        Document document = parser.parseDocument(input);
  +                        NodeList list = processor.selectNodeList(document,xpath);
  +                        int length = list.getLength();
  +                        for (int i=0; i<length; i++) {
  +                              consumer.includeNode((Node)list.item(i),
  +                                                   (ContentHandler)this,  
  +                                                   (LexicalHandler)this);
  +                        }
  +            } else {
  +                  // do nothing, will result in the inclusion of the whole
  +                  // document
  +            }
  +
  +               this.sourceResolver.toSAX(source, consumer);
  +
  +
           } catch (IOException e) {
               getLogger().error("CIncludeTransformer", e);
               throw new SAXException("CIncludeTransformer could not read resource", e);
  @@ -180,8 +228,12 @@
           } catch (ProcessingException e){
               getLogger().error("Could not stream input", e);
               throw new SAXException("Exception in CIncludeTransformer",e);
  +        } catch(ComponentException e) {
  +            getLogger().error("Error in processXIncludeElement", e);
  +            throw new SAXException(e);
           } finally {
  -            this.sourceResolver.release(source);
  +          this.manager.release(parser);
  +          this.sourceResolver.release(source);
           }
   
           if (!"".equals(element)) {
  
  
  

----------------------------------------------------------------------
In case of troubles, e-mail:     webmaster@xml.apache.org
To unsubscribe, e-mail:          cocoon-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: cocoon-cvs-help@xml.apache.org