cocoon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Davanum Srinivas <d...@yahoo.com>
Subject Re: [Fwd: [C2 patch] Incorrect serialization to XML]
Date Tue, 18 Sep 2001 16:42:42 GMT
Joerg,

Applied the patch partially. Please take a look at the latest CVS and look for the string
"FIXME"
in 2 locations, If you uncomment the two lines of code after each FIXME, some of the samples
don't
work. They are garbled. Can you please test against a few browsers and then send us an update?

Thanks,
dims

--- Joerg Henne <j.henne@levigo.de> wrote:
> [This is a re-post of a pending patch.]
> 
> Joerg Henne wrote:
> > 
> > Hi,
> > 
> > the way I read the SAX specification, the qName (or raw name) of elements that
> > is passed to the callback methods is of purely informal character and does not
> > necessarily contain the full (raw) element name. However, C2's serialization
> > to XML results in the qName being used to name the output elements. This is
> > due to the missing or incomplete namespace support in the SerializerToXML from
> > Xalan which is used.
> > 
> > AbstractTextSerializer already contains code to work around Xalan problems, so
> > it could fix this problem as well, although fixing it comes at the cost of 2
> > hashtable lookups and string concatenations per element. If you agree that
> > this should be done, the following patch will do the job.
> > 
> > Joerg Henne> Index: AbstractTextSerializer.java
> ===================================================================
> RCS file:
> /home/cvspublic/xml-cocoon2/src/org/apache/cocoon/serialization/AbstractTextSerializer.java,v
> retrieving revision 1.3
> diff -u -r1.3 AbstractTextSerializer.java
> --- AbstractTextSerializer.java	2001/08/20 13:55:16	1.3
> +++ AbstractTextSerializer.java	2001/08/21 09:43:19
> @@ -26,6 +26,8 @@
>  import javax.xml.transform.sax.SAXTransformerFactory;
>  import java.util.ArrayList;
>  import java.util.List;
> +import java.util.Map;
> +import java.util.HashMap;
>  import java.util.Properties;
>  
>  /**
> @@ -58,6 +60,13 @@
>      private List uriList = new ArrayList();
>  
>      /**
> +     * Maps of URI<->prefix mappings. Used to work around a bug in the Xalan
> +     * serializer.
> +     */
> +    private Map uriToPrefixMap = new HashMap();
> +    private Map prefixToUriMap = new HashMap();
> +
> +    /**
>       * True if there has been some startPrefixMapping() for the coming element.
>       */
>      private boolean hasMappings = false;
> @@ -152,6 +161,8 @@
>       */
>      public void recycle() {
>          clearMappings();
> +        this.uriToPrefixMap.clear();
> +        this.prefixToUriMap.clear();
>          super.recycle();
>      }
>  
> @@ -176,10 +187,32 @@
>          this.prefixList.add(prefix);
>          this.uriList.add(uri);
>  
> +        // store mappings for xalan-bug-workaround.
> +        // append the prefix colon now, in order to save concatenations later.
> +        this.uriToPrefixMap.put(uri, prefix + ":");
> +        this.prefixToUriMap.put(prefix, uri);
> +        
>          super.startPrefixMapping(prefix, uri);
>      }
>  
>      /**
> +     * End the scope of a prefix-URI mapping:
> +     * remove entry from mapping tables.
> +     */
> +    public void endPrefixMapping(String prefix)
> +      throws SAXException {
> +        // remove mappings for xalan-bug-workaround.
> +        // Unfortunately, we're not passed the uri, but the prefix here,
> +        // so we need to maintain maps in both directions.
> +        if(this.prefixToUriMap.containsKey(prefix)) {
> +          this.uriToPrefixMap.remove((String) this.prefixToUriMap.get(prefix));
> +          this.prefixToUriMap.remove(prefix);
> +        }
> +        
> +        super.endPrefixMapping(prefix);
> +    }
> +
> +    /**
>       * Ensure all namespace declarations are present as <code>xmlns:</code>
attributes
>       * and add those needed before calling superclass. This is a workaround for a Xalan
bug
>       * (at least in version 2.0.1) : <code>org.apache.xalan.serialize.SerializerToXML</code>
> @@ -187,7 +220,11 @@
>       */
>      public void startElement(String eltUri, String eltLocalName, String eltQName, Attributes
> attrs)
>        throws SAXException {
> -
> +        
> +        // try to restore the qName. The map already contains the colon
> +        if(eltUri.length() != 0 && this.uriToPrefixMap.containsKey(eltUri) )
> +          eltQName = (String) this.uriToPrefixMap.get(eltUri) + eltLocalName;
> +        
>          if (this.hasMappings) {
>              // Add xmlns* attributes where needed
>  
> @@ -247,6 +284,19 @@
>              // Normal job
>              super.startElement(eltUri, eltLocalName, eltQName, attrs);
>          }
> +    }
> +
> +    /**
> +     * Receive notification of the end of an element.
> +     * Try to restore the element qName.
> +     */
> +    public void endElement(String eltUri, String eltLocalName, String eltQName)
> +    throws SAXException {
> +        // try to restore the qName. The map already contains the colon
> +        if(eltUri.length() != 0 && this.uriToPrefixMap.containsKey(eltUri) )
> +          eltQName = (String) this.uriToPrefixMap.get(eltUri) + eltLocalName;
> +        
> +        super.endElement(eltUri, eltLocalName, eltQName);
>      }
>  
>      private void clearMappings()
> 
> 
> > ---------------------------------------------------------------------
> To unsubscribe, e-mail: cocoon-dev-unsubscribe@xml.apache.org
> For additional commands, email: cocoon-dev-help@xml.apache.org


=====
Davanum Srinivas, JNI-FAQ Manager
http://www.jGuru.com/faq/JNI

__________________________________________________
Terrorist Attacks on U.S. - How can you help?
Donate cash, emergency relief information
http://dailynews.yahoo.com/fc/US/Emergency_Information/

---------------------------------------------------------------------
To unsubscribe, e-mail: cocoon-dev-unsubscribe@xml.apache.org
For additional commands, email: cocoon-dev-help@xml.apache.org


Mime
View raw message