bruno       2003/06/07 14:17:36

  Modified:    src/java/org/apache/cocoon/transformation
                        XIncludeTransformer.java
  Log:
  various fixes
  
  Revision  Changes    Path
  1.5       +30 -29    
cocoon-2.1/src/java/org/apache/cocoon/transformation/XIncludeTransformer.java
  
  Index: XIncludeTransformer.java
  ===================================================================
  RCS file: 
/home/cvs/cocoon-2.1/src/java/org/apache/cocoon/transformation/XIncludeTransformer.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- XIncludeTransformer.java  23 May 2003 13:06:33 -0000      1.4
  +++ XIncludeTransformer.java  7 Jun 2003 21:17:36 -0000       1.5
  @@ -50,8 +50,6 @@
   */
   package org.apache.cocoon.transformation;
   
  -import org.apache.avalon.framework.component.Component;
  -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;
  @@ -72,7 +70,6 @@
   import org.apache.cocoon.xml.XMLConsumer;
   import org.apache.excalibur.source.Source;
   import org.apache.excalibur.source.SourceException;
  -import org.apache.excalibur.xml.sax.SAXParser;
   import org.xml.sax.*;
   import org.xml.sax.ext.LexicalHandler;
   
  @@ -107,8 +104,9 @@
       public void setup(SourceResolver resolver, Map objectModel, String source, 
Parameters parameters)
               throws ProcessingException, SAXException, IOException {
           this.resolver = resolver;
  -        this.xIncludePipe = new XIncludePipe(null);
  +        this.xIncludePipe = new XIncludePipe();
           this.xIncludePipe.enableLogging(getLogger());
  +        this.xIncludePipe.init(null);
           super.setConsumer(xIncludePipe);
       }
   
  @@ -142,7 +140,7 @@
        */
       private class XIncludePipe extends AbstractXMLPipe {
           /** Helper class to keep track of xml:base attributes */
  -        private XMLBaseSupport xmlBaseSupport = new XMLBaseSupport();
  +        private XMLBaseSupport xmlBaseSupport;
           /** Element nesting level when inside an xi:include element. */
           private int xIncludeLevel = 0;
           /** Should the content of the fallback element be inserted when it is 
encountered? */
  @@ -163,8 +161,9 @@
           private String href;
           private XIncludePipe parent;
   
  -        public XIncludePipe(String uri) {
  +        public void init(String uri) {
               this.href = uri;
  +            this.xmlBaseSupport = new XMLBaseSupport(resolver, getLogger());
           }
   
           public void setParent(XIncludePipe parent) {
  @@ -219,6 +218,8 @@
           public void endElement(String uri, String name, String raw) throws 
SAXException {
               if (xIncludeLevel > 0 && fallbackLevel < 1) {
                   xIncludeLevel--;
  +                if (xIncludeLevel == 0)
  +                    xmlBaseSupport.endElement(uri, name, raw);
                   if (xIncludeLevel == 0 && useFallback) {
                       // an error was encountered but a fallback element was not 
found: throw the error now
                       useFallback = false;
  @@ -351,16 +352,26 @@
               }
   
               Source url = null;
  -            String suffix;
  +            String suffix = "";
               try {
  -                int index = href.indexOf('#');
  -                if (index < 0) {
  -                    url = resolver.resolveURI(xmlBaseSupport.makeAbsolute(href));
  -                    suffix = "";
  -                } else {
  -                    url = 
resolver.resolveURI(xmlBaseSupport.makeAbsolute(href.substring(0, index)));
  -                    suffix = href.substring(index+1);
  +                int fragmentIdentifierPos = href.indexOf('#');
  +                if (fragmentIdentifierPos != -1) {
  +                    suffix = href.substring(fragmentIdentifierPos + 1);
  +                    href = href.substring(0, fragmentIdentifierPos);
                   }
  +
  +                // an empty href is a reference to the current document -- this can 
be different than the current base
  +                if (href.equals("")) {
  +                    if (this.href == null)
  +                        throw new SAXException("XIncludeTransformer: encountered 
empty href (= href pointing to the current document) but the location of the current 
document is unkown.");
  +                    int fragmentIdentifierPos2 = this.href.indexOf('#');
  +                    if (fragmentIdentifierPos2 != -1)
  +                        href = this.href.substring(0, fragmentIdentifierPos2);
  +                    else
  +                        href = this.href;
  +                }
  +
  +                url = resolver.resolveURI(xmlBaseSupport.makeAbsolute(href));
                   if (getLogger().isDebugEnabled()) {
                       getLogger().debug("URL: " + url.getURI() + "\nSuffix: " + 
suffix);
                   }
  @@ -383,8 +394,9 @@
                           reader.close();
                       }
                   } else if (parse.equals("xml")) {
  -                    XIncludePipe subPipe = new XIncludePipe(canonicURI);
  +                    XIncludePipe subPipe = new XIncludePipe();
                       subPipe.enableLogging(getLogger());
  +                    subPipe.init(canonicURI);
                       subPipe.setConsumer(xmlConsumer);
                       subPipe.setParent(this);
   
  @@ -396,22 +408,14 @@
                               XPointerContext context = new XPointerContext(suffix, 
url, subPipe, getLogger(), manager);
                               xpointer.process(context);
                           } else {
  -                            SAXParser parser = null;
  -                            try {
  -                                parser = (SAXParser)manager.lookup(SAXParser.ROLE);
  -                                IncludeXMLConsumer xinclude_handler = new 
IncludeXMLConsumer(subPipe);
  -                                InputSource input = SourceUtil.getInputSource(url);
  -                                parser.parse(input, xinclude_handler);
  -                            } finally {
  -                                manager.release((Component)parser);
  -                            }
  +                            SourceUtil.toSAX(url, new IncludeXMLConsumer(subPipe));
                           }
                           // restore locator on the consumer
                           if (locator != null)
                               xmlConsumer.setDocumentLocator(locator);
                       } catch (ResourceNotFoundException e) {
                           useFallback = true;
  -                        fallBackException = e;
  +                        fallBackException = new CascadingException("Resouce not 
found: " + url.getURI());
                           getLogger().error("xIncluded resource not found: " + 
url.getURI(), e);
                       } catch (ParseException e) {
                           // this exception is thrown in case of an invalid xpointer 
expression
  @@ -433,9 +437,6 @@
                           useFallback = true;
                           fallBackException = e;
                           getLogger().error("Error processing an xInclude, will try 
to use fallback.", e);
  -                    } catch(ComponentException e) {
  -                        getLogger().error("Error in processXIncludeElement", e);
  -                        throw new SAXException(e);
                       }
                   }
               } catch (SourceException se) {
  
  
  

Reply via email to