You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by cz...@apache.org on 2001/12/13 13:34:02 UTC

cvs commit: xml-cocoon2/src/org/apache/cocoon/sitemap ContentAggregator.java

cziegeler    01/12/13 04:34:02

  Modified:    src/org/apache/cocoon/sitemap Tag: cocoon_20_branch
                        ContentAggregator.java
  Log:
  Rewrote ContentAggregation. Fixed caching problems (now the elementname, prefix etc are used for the key, too) and hopefully fixed sax event handling.
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.5.2.17  +140 -136  xml-cocoon2/src/org/apache/cocoon/sitemap/ContentAggregator.java
  
  Index: ContentAggregator.java
  ===================================================================
  RCS file: /home/cvs/xml-cocoon2/src/org/apache/cocoon/sitemap/ContentAggregator.java,v
  retrieving revision 1.5.2.16
  retrieving revision 1.5.2.17
  diff -u -r1.5.2.16 -r1.5.2.17
  --- ContentAggregator.java	2001/11/09 12:20:45	1.5.2.16
  +++ ContentAggregator.java	2001/12/13 12:34:02	1.5.2.17
  @@ -33,99 +33,85 @@
   /**
    * @author <a href="mailto:giacomo@apache.org">Giacomo Pati</a>
    * @author <a href="mailto:cziegeler@apache.org">Carsten Ziegeler</a>
  - * @version CVS $Id: ContentAggregator.java,v 1.5.2.16 2001/11/09 12:20:45 cziegeler Exp $
  + * @version CVS $Id: ContentAggregator.java,v 1.5.2.17 2001/12/13 12:34:02 cziegeler Exp $
    */
   public class ContentAggregator
   extends ContentHandlerWrapper
   implements Generator, Cacheable, Recyclable {
   
       /** the root element of the aggregated content */
  -    protected String rootElement;
  +    protected Element rootElement;
   
  -    /** the namespace of the root element */
  -    protected String rootElementNS;
  -
  -    /** the namespace prefix of the root element */
  -    protected String rootElementNSPrefix;
  -
       /** the parts */
       protected ArrayList parts = new ArrayList();
  -
  -    /** The current <code>SourceResolver</code>. */
  -    protected SourceResolver resolver;
  -
  -    /** The current <code>Map</code> objectModel. */
  -    protected Map objectModel;
   
  -    /** The current <code>Parameters</code>. */
  -    protected Parameters parameters;
  +    /** Empty Attributes */
  +    private AttributesImpl emptyAttrs = new AttributesImpl();
   
  -    /** The source URI associated with the request or <b>null</b>. */
  -    protected String source;
  -
  -    /** Stacks namespaces during processing */
  -    private ArrayList currentNS = new ArrayList();
  -
  -    /** Stacks prefixes during processing */
  -    private ArrayList currentPrefix = new ArrayList();
  -
       /** Indicates the position in the stack of the root element of the aggregated content */
       private int rootElementIndex;
   
  +    /** The element used for the current part */
  +    protected Element currentElement;
  +
       /** This object holds the part parts :) */
  -    private class Part {
  +    protected final class Part {
           public String uri;
  -        public String element;
  -        public String namespace;
  -        public String prefix;
  +        public Element element;
           public Source source;
           boolean stripRootElement;
   
  -        public Part(String uri, String element, String namespace, String stripRoot, String prefix) {
  +        public Part(String uri, Element element, String stripRoot) {
               this.uri = uri;
               this.element = element;
  +            this.stripRootElement = (stripRoot.equals("yes") || stripRoot.equals("true"));
  +        }
  +    }
  +
  +    /** This object holds an element definition */
  +    protected final class Element {
  +        public String namespace;
  +        public String prefix;
  +        public String name;
  +
  +        public Element(String name, String namespace, String prefix) {
               this.namespace = namespace;
               this.prefix = prefix;
  -            if (this.prefix == null) this.prefix = "";
  -            if (stripRoot.equals("yes") || stripRoot.equals("true")) {
  -                this.stripRootElement = true;
  -            } else {
  -                this.stripRootElement = false;
  -            }
  +            this.name = name;
           }
       }
   
       /**
        * generates the content
        */
  -    public void generate() throws IOException, SAXException, ProcessingException {
  -        getLogger().debug("ContentAggregator: generating aggregated content");
  +    public void generate()
  +    throws IOException, SAXException, ProcessingException {
  +        if (this.getLogger().isDebugEnabled() == true) {
  +            getLogger().debug("ContentAggregator: generating aggregated content");
  +        }
           this.contentHandler.startDocument();
  -        this.startElem(this.rootElementNS, this.rootElementNSPrefix, this.rootElement);
  +        this.startElem(this.rootElement);
           try {
               for (int i = 0; i < this.parts.size(); i++) {
  -                Part part = (Part)this.parts.get(i);
  +                final Part part = (Part)this.parts.get(i);
                   this.rootElementIndex = (part.stripRootElement ? -1 : 0);
  -                String ns = part.namespace;
  -                String prefix = part.prefix;
  -                if (ns.equals("")) {
  -                    ns = this.getNS();
  -                    prefix = this.getPrefix();
  -                }
  -                if (!part.element.equals("")) {
  -                    this.startElem(ns, prefix, part.element);
  +                if (part.element != null) {
  +                    this.currentElement = part.element;
  +                    this.startElem(part.element);
  +                } else {
  +                    this.currentElement = this.rootElement;
                   }
   
                   try {
                       part.source.toSAX(this);
                   } finally {
  -                    if (!part.element.equals("")) {
  -                        this.endElem(prefix, part.element);
  +                    if (part.element != null) {
  +                        this.endElem(part.element);
                       }
                   }
               }
           } finally {
  -            this.endElem(this.rootElementNSPrefix, this.rootElement);
  +            this.endElem(this.rootElement);
               this.contentHandler.endDocument();
           }
           getLogger().debug("ContentAggregator: finished aggregating content");
  @@ -139,14 +125,31 @@
        */
       public long generateKey() {
           try {
  -            long key = 0;
  +            long key = HashUtil.hash("CA(" +
  +                                     this.rootElement.prefix +
  +                                     ':' +
  +                                     this.rootElement.name +
  +                                     '<' + this.rootElement.namespace + ">)");
               Source current;
               for (int i = 0; i < this.parts.size(); i++) {
  -                current = ((Part)this.parts.get(i)).source;
  +                final Part part = (Part)this.parts.get(i);
  +                current = part.source;
                   if (current.getLastModified() == 0) {
                           return 0;
                   } else {
  -                    key += HashUtil.hash(current.getSystemId());
  +                    if (part.element == null) {
  +                        key += HashUtil.hash("P=" +
  +                                         part.stripRootElement + ':' +
  +                                         current.getSystemId() + ';');
  +                    } else {
  +                        key += HashUtil.hash("P=" +
  +                                         part.element.prefix +
  +                                         ':' +
  +                                         part.element.name +
  +                                         '<' + part.element.namespace + ">:" +
  +                                         part.stripRootElement + ':' +
  +                                         current.getSystemId() + ';');
  +                    }
                   }
               }
               return key;
  @@ -181,18 +184,47 @@
           }
       }
   
  +    /**
  +     * Set the root element. Please make sure that the parameters are not null!
  +     */
       public void setRootElement(String element, String namespace, String prefix) {
  -        this.rootElement = element;
  -        this.rootElementNS = namespace;
  -        this.rootElementNSPrefix = prefix;
  -        if (prefix == null) this.rootElementNSPrefix = "";
  -        getLogger().debug("ContentAggregator: root element='" + element + "' ns='" + namespace + "' prefix='" + prefix + "'");
  +        this.rootElement = new Element(element,
  +                                       namespace,
  +                                       prefix);
  +        if (this.getLogger().isDebugEnabled() == true) {
  +            this.getLogger().debug("ContentAggregator: root element='" + element +
  +                                   "' ns='" + namespace + "' prefix='" + prefix + "'");
  +        }
       }
   
  -    public void addPart(String uri, String element, String namespace, String stripRootElement, String prefix) {
  -        this.parts.add(new Part(uri, element, namespace, stripRootElement, prefix));
  -        getLogger().debug("ContentAggregator: part uri='" + uri + "' element='" + element + "' ns='" + namespace +
  -            "' stripRootElement='" + stripRootElement + "' prefix='" + prefix + "'");
  +    /**
  +     * Add a part. Please make sure that the parameters are not null!
  +     */
  +    public void addPart(String uri,
  +                        String element,
  +                        String namespace,
  +                        String stripRootElement,
  +                        String prefix) {
  +        Element elem = null;
  +        if (!element.equals("")) {
  +            if (namespace.equals("")) {
  +                elem = new Element(element,
  +                                   this.rootElement.namespace,
  +                                   this.rootElement.prefix);
  +            } else {
  +                elem = new Element(element,
  +                                   namespace,
  +                                   prefix);
  +            }
  +        }
  +        this.parts.add(new Part(uri,
  +                                elem,
  +                                stripRootElement));
  +        if (this.getLogger().isDebugEnabled() == true) {
  +            this.getLogger().debug("ContentAggregator: part uri='" + uri +
  +                                   "' element='" + element + "' ns='" + namespace +
  +                                   "' stripRootElement='" + stripRootElement + "' prefix='" + prefix + "'");
  +        }
       }
   
       /**
  @@ -211,18 +243,11 @@
        */
       public void recycle() {
           super.recycle();
  -        this.resolver = null;
  -        this.objectModel = null;
  -        this.source = null;
  -        this.parameters = null;
           this.rootElement = null;
  -        this.rootElementNS = null;
  -        this.rootElementNSPrefix = null;
           for (Iterator i = this.parts.iterator(); i.hasNext();)
               ((Part)i.next()).source.recycle();
           this.parts.clear();
  -        this.currentNS.clear();
  -        this.currentPrefix.clear();
  +        this.currentElement = null;
       }
   
       /**
  @@ -231,59 +256,35 @@
        */
       public void setup(SourceResolver resolver, Map objectModel, String src, Parameters par)
       throws ProcessingException, SAXException, IOException {
  -            this.resolver = resolver;
  -            this.objectModel = objectModel;
  -            this.source = src;
  -            this.parameters = par;
  -
  -        Part current;
  +        // get the Source for each part
           for(int i=0; i<this.parts.size();i++) {
  -            current = (Part)this.parts.get(i);
  -            current.source = this.resolver.resolve(current.uri);
  +            final Part current = (Part)this.parts.get(i);
  +            current.source = resolver.resolve(current.uri);
           }
       }
  -
  -    private String pushNS(String ns, String prefix) {
  -        this.currentNS.add(ns);
  -        this.currentPrefix.add(prefix);
  -        return ns;
  -    }
  -
  -    private String popNS() {
  -        int last = currentNS.size() - 1;
  -        String ns = (String)currentNS.get(last);
  -        currentNS.remove(last);
  -        currentPrefix.remove(last);
  -        return ns;
  -    }
   
  -    private String getNS() {
  -        int last = currentNS.size() - 1;
  -        return (String)currentNS.get(last);
  -    }
  -
  -    private String getPrefix() {
  -        int last = currentPrefix.size() - 1;
  -        return (String)currentPrefix.get(last);
  -    }
  -
  -    private void startElem(String namespaceURI, String prefix, String name) throws SAXException {
  -        this.pushNS(namespaceURI, prefix);
  -        AttributesImpl attrs = new AttributesImpl();
  -        if (!namespaceURI.equals("")) {
  -            this.contentHandler.startPrefixMapping(prefix, namespaceURI);
  -            this.contentHandler.startElement(namespaceURI, name, prefix+':'+name, attrs);
  -        } else {
  -            this.contentHandler.startElement(namespaceURI, name, name, attrs);
  +    /**
  +     * Private method generating startElement event for the aggregated parts
  +     * and the root element
  +     */
  +    private void startElem(Element element)
  +    throws SAXException {
  +        final String qname = (element.prefix.equals("")) ? element.name : element.prefix + ':' + element.name;
  +        if (!element.namespace.equals("")) {
  +            this.contentHandler.startPrefixMapping(element.prefix, element.namespace);
           }
  +        this.contentHandler.startElement(element.namespace, element.name, qname, this.emptyAttrs);
       }
   
  -    private void endElem(String prefix, String name) throws SAXException {
  -        final String ns = this.popNS();
  -        final String qname = prefix.equals("") ? name : prefix+':'+name;
  -        this.contentHandler.endElement(ns, name, qname);
  -        if (ns != null && !ns.equals("")) {
  -            this.contentHandler.endPrefixMapping(prefix);
  +    /**
  +     * Private method generating endElement event for the aggregated parts
  +     * and the root element
  +     */
  +    private void endElem(Element element) throws SAXException {
  +        final String qname = (element.prefix.equals("")) ? element.name : element.prefix + ':' + element.name;
  +        this.contentHandler.endElement(element.namespace, element.name, qname);
  +        if (!element.namespace.equals("")) {
  +            this.contentHandler.endPrefixMapping(element.prefix);
           }
       }
   
  @@ -293,41 +294,44 @@
       public void startDocument() throws SAXException {
       }
   
  +    /**
  +     * Ignore start and end document events
  +     */
       public void endDocument() throws SAXException {
       }
   
  -    public void startElement(String namespaceURI, String localName, String qName, Attributes atts)
  +    /**
  +     * Override startElement() event to add namespace and prefix
  +     */
  +    public void startElement(String namespaceURI, String localName, String raw, Attributes atts)
       throws SAXException {
           this.rootElementIndex++;
           if (this.rootElementIndex == 0) {
               getLogger().debug("ContentAggregator: skipping root element start event.");
               return;
           }
  -        String ns = namespaceURI;
  -        if (ns == null || ns.equals("")) {
  -            ns = this.getNS();
  -            final String prefix = this.getPrefix();
  -            if (!prefix.equals("")) {
  -                qName = prefix + ':' + qName;
  -            }
  +        if (namespaceURI == null || namespaceURI.equals("")) {
  +            final String qname = this.currentElement.prefix.equals("") ? localName : this.currentElement.prefix + ':' + localName;
  +            this.contentHandler.startElement(this.currentElement.namespace, localName, qname, atts);
  +        } else {
  +            this.contentHandler.startElement(namespaceURI, localName, raw, atts);
           }
  -        this.contentHandler.startElement(ns, localName, qName, atts);
       }
   
  -    public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
  +    /**
  +     * Override startElement() event to add namespace and prefix
  +     */
  +    public void endElement(String namespaceURI, String localName, String raw) throws SAXException {
           this.rootElementIndex--;
           if (this.rootElementIndex == -1) {
  -            getLogger().debug("ContentAggregator: ignoring root element end event.");
  +            getLogger().debug("ContentAggregator: skipping root element end event.");
               return;
           }
  -        String ns = namespaceURI;
  -        if (ns == null || ns.equals("")) {
  -            ns = this.getNS();
  -            final String prefix = this.getPrefix();
  -            if (!prefix.equals("")) {
  -                qName = prefix + ':' + qName;
  -            }
  +        if (namespaceURI == null || namespaceURI.equals("")) {
  +            final String qname = this.currentElement.prefix.equals("") ? localName : this.currentElement.prefix + ':' + localName;
  +            this.contentHandler.endElement(this.currentElement.namespace, localName, qname);
  +        } else {
  +            this.contentHandler.endElement(namespaceURI, localName, raw);
           }
  -        this.contentHandler.endElement(ns, localName, qName);
       }
   }
  
  
  

----------------------------------------------------------------------
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