You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by vg...@apache.org on 2003/11/23 18:06:05 UTC

cvs commit: cocoon-2.1/src/java/org/apache/cocoon/transformation/helpers MirrorRecorder.java

vgritsenko    2003/11/23 09:06:05

  Modified:    src/java/org/apache/cocoon/transformation/helpers
                        MirrorRecorder.java
  Log:
  SAX does not allow null namespace. Element name should not be null too.
  This fixes issues with <a href=""> in translations
  
  Revision  Changes    Path
  1.2       +41 -40    cocoon-2.1/src/java/org/apache/cocoon/transformation/helpers/MirrorRecorder.java
  
  Index: MirrorRecorder.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/java/org/apache/cocoon/transformation/helpers/MirrorRecorder.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- MirrorRecorder.java	9 Mar 2003 00:09:41 -0000	1.1
  +++ MirrorRecorder.java	23 Nov 2003 17:06:05 -0000	1.2
  @@ -64,6 +64,8 @@
   
   /**
    * Consume elements start/end and characters events and reproduce them.
  + * 
  + * WARNING: THIS CLASS DOES NOT WORK PROPERLY WITH NAMESPACES
    *
    * @author <a href="mailto:mattam@netcourrier.com">Matthieu Sozeau</a>
    * @version CVS $Id$
  @@ -75,7 +77,7 @@
       private ArrayList events;
   
       // Used for indexing (parameters)
  -    class NullEvent implements EventRecorder {
  +    static class NullEvent implements EventRecorder {
           private String s;
   
           public NullEvent(String s) {
  @@ -87,9 +89,8 @@
           }
   
           public void send(ContentHandler handler)
  -                throws SAXException
  -        { }
  -
  +        throws SAXException {
  +        }
   
           public Object clone() {
               return new NullEvent(s);
  @@ -100,42 +101,41 @@
           }
       }
   
  -    class StartEvent implements EventRecorder {
  -        protected String uri, name, raw;
  -        protected Attributes attr;
  +    static class StartEvent implements EventRecorder {
  +        private String uri, name, raw;
  +        private Attributes attr;
   
           public StartEvent(String namespace, String name, String raw,
  -                          Attributes attr)
  -        {
  +                          Attributes attr) {
               this.uri = namespace;
               this.name = name;
               this.raw = raw;
  -            this.attr = attr;
  +            this.attr = new AttributesImpl(attr);
           }
   
           public void send(ContentHandler handler)
  -                throws SAXException {
  +        throws SAXException {
               handler.startElement(uri, name, raw, attr);
           }
   
           public Object clone() {
  -            return new StartEvent(uri, name, raw, new AttributesImpl(attr));
  +            return new StartEvent(uri, name, raw, attr);
           }
   
           public String toString() {
               StringBuffer str = new StringBuffer("<" + raw);
  -            if(attr != null) {
  -                for(int i = 0; i < attr.getLength(); ++i)
  +            if (attr != null) {
  +                for(int i = 0; i < attr.getLength(); ++i) {
                       str.append(" " + attr.getQName(i) + "=\"" + attr.getValue(i) + "\"");
  +                }
               }
   
               return str.append(">").toString();
           }
       }
   
  -    class EndEvent implements EventRecorder
  -    {
  -        protected String uri, name, raw;
  +    static class EndEvent implements EventRecorder {
  +        private String uri, name, raw;
   
           public EndEvent(String namespace, String name, String raw) {
               this.uri = namespace;
  @@ -148,8 +148,7 @@
           }
   
           public void send(ContentHandler handler)
  -                throws SAXException
  -        {
  +        throws SAXException {
               handler.endElement(uri, name, raw);
           }
   
  @@ -158,26 +157,23 @@
           }
       }
   
  -    class CharacterEvent implements EventRecorder
  -    {
  +    static class CharacterEvent implements EventRecorder {
           private String ch;
   
           public CharacterEvent(char ary[], int start, int length) {
               ch = new String(ary, start, length);
           }
   
  -        public Object clone() {
  -            return new CharacterEvent(ch.toCharArray(), 0, ch.length());
  +        public CharacterEvent(String ch) {
  +            this.ch = ch;
           }
   
  -        public CharacterEvent(String str)
  -        {
  -            ch = str;
  +        public Object clone() {
  +            return new CharacterEvent(ch);
           }
   
           public void send(ContentHandler handler)
  -                throws SAXException
  -        {
  +        throws SAXException {
               handler.characters(ch.toCharArray(), 0, ch.length());
           }
   
  @@ -186,6 +182,7 @@
           }
       }
   
  +    
       public MirrorRecorder() {
           this.events = new ArrayList();
       }
  @@ -206,34 +203,38 @@
       }
   
       private void nodeToEvents(Node n) throws SAXException {
  -        Attributes attrs;
  -
           switch(n.getNodeType()) {
               case Node.ELEMENT_NODE:
  -                if(n.getAttributes() instanceof AttributeMap) {
  +                Attributes attrs;
  +                if(n.getAttributes() instanceof Attributes) {
  +                    attrs = (Attributes) n.getAttributes();
  +                } else {
                       NamedNodeMap map = n.getAttributes();
  -                    Node node;
                       attrs = new AttributesImpl();
   
                       for(int i = 0; i < map.getLength(); ++i) {
  -                        node = map.item(i);
  -                        ((AttributesImpl) attrs).addAttribute(node.getNamespaceURI(),
  -                                                              node.getLocalName(),
  +                        Node node = map.item(i);
  +                        final String ns = node.getNamespaceURI() == null? "" : node.getNamespaceURI();
  +                        final String ln = node.getLocalName() == null? node.getNodeName() : node.getLocalName();
  +                        ((AttributesImpl) attrs).addAttribute(ns,
  +                                                              ln,
                                                                 node.getNodeName(),
                                                                 "CDATA",
                                                                 node.getNodeValue());
                       }
  -                } else {
  -                    attrs = (Attributes) n.getAttributes();
                   }
  -                startElement(n.getNamespaceURI(), n.getNodeName(), n.getNodeName(), attrs);
  +
  +                final String ns = n.getNamespaceURI() == null? "" : n.getNamespaceURI();
  +                final String ln = n.getLocalName() == null? n.getNodeName() : n.getLocalName();
  +                startElement(ns, ln, n.getNodeName(), attrs);
                   if (n.hasChildNodes()) {
                       NodeList childs = n.getChildNodes();
                       for(int i = 0; i < childs.getLength(); ++i) {
                           nodeToEvents(childs.item(i));
                       }
                   }
  -                endElement(n.getNamespaceURI(), n.getNodeName(), n.getNodeName());
  +
  +                endElement(ns, ln, n.getNodeName());
                   break;
               case Node.CDATA_SECTION_NODE:
               case Node.TEXT_NODE: