You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by Ni...@hydro.qc.ca on 2004/09/13 17:22:41 UTC

RE : better castor serializer

Hello :)
 
It is not really an error. The schema is totaly valid, but the lack of
namespace sharing between the castor serializer and the axis serializer can
lead to this kind of ns redefinition:
 
<ns1:Envelope xmlns:cim="http://any.ci <http://datasets.cim.integ.te.com>
m.namespace">
 <ns1:Body>
  <data xmlns:cim="http://any.ci <http://datasets.cim.integ.te.com/>
m.namespace">
      ...
 
you will remark that namespace cim is re-defined without reason.
 
At first, I changed the castor serializer to add namespace definition to the
castor serializer, but it was too "patchy" for me...
 
Then I came to the solution I presented I my mail: Delegating the castor
serializer via the Axis serializer.
 
Cheers,
 
Fabien
 
 
 

 
 
 
 
 

Fabien Nisol

Conseiller
Grand Montréal
CGI 
Tél: +1 514 289 2211 (4611)

 

-----Message d'origine-----
De : Tysnes Are Thobias [mailto:are.tysnes@edb.com] 
Envoyé : 13 septembre, 2004 02:19
À : 'Nisol.Fabien@hydro.qc.ca'
Objet : RE: better castor serializer


Good Morning Nisol (at least here in Norway :-)
 
I'm happe to read this post.. wonder if you have any examples in what's
wrong
with Castor serializer !? Is the Response not valid according to the
WSDL/Schema ?
 
We are using Axis + Castor but I haven't noticed any errors yet (lack of
knowledge
I suppose.. hehe.. :-)
 
Cheers,
Are T. Tysnes
 
 

-----Original Message-----
From: Nisol.Fabien@hydro.qc.ca [mailto:Nisol.Fabien@hydro.qc.ca] 
Sent: 10. september 2004 18:52
To: axis-dev@ws.apache.org
Subject: better castor serializer



Hello fellow developers ...
 
There is a slight problems using castor serializer in its current form.
 
The marshaller is totaly decoupled from the soap context, and thus don't
know current enveloppe namespace aliases.
This leads to the fact that castor does not use correct aliases ...
 
here is modified code, using a ContentHandler instead of a StringWriter
serialization :
 
 
Hope It'll help :)
 
1) the Serializer:
 
/*
 * The Apache Software License, Version 1.1
 *
 *
 * Copyright (c) 2002 The Apache Software Foundation.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/
<http://www.apache.org/> )."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Axis" and "Apache Software Foundation" must
 *    not be used to endorse or promote products derived from this
 *    software without prior written permission. For written
 *    permission, please contact apache@apache.org
<ma...@apache.org> .
 *
 * 5. Products derived from this software may not be called "Apache",
 *    nor may "Apache" appear in their name, without prior written
 *    permission of the Apache Software Foundation.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/ <http://www.apache.org/> >.
 */
 
package org.apache.axis.encoding.ser.castor;
 
import org.apache.axis.Constants;
import org.apache.axis.components.logger.LogFactory;
import org.apache.axis.encoding.SerializationContext;
import org.apache.axis.encoding.Serializer;
import org.apache.axis.utils.Messages;
import org.apache.axis.wsdl.fromJava.Types;
import org.apache.commons.logging.Log;
import org.exolab.castor.xml.MarshalException;
import org.exolab.castor.xml.Marshaller;
import org.exolab.castor.xml.ValidationException;
import org.w3c.dom.Element;
import org.xml.sax.Attributes;
 
import javax.xml.namespace.QName;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Iterator;
import org.apache.axis.message.MessageElement;
 
/**
 * Castor serializer
 * @author Olivier Brand (olivier.brand@vodafone.com
<ma...@vodafone.com> )
 * @author Steve Loughran
 * @version 1.0
 *
 */
public class CastorSerializer implements Serializer {
 
    protected static Log log =
            LogFactory.getLog(CastorSerializer.class.getName());
 
    /**
     * Serialize a Castor object.
     * @param name
     * @param attributes
     * @param value     this must be a castor object for marshalling
     * @param context
     * @throws IOException for XML schema noncompliance, bad object type,
and any IO
     * trouble.
     */
    public void serialize(
            QName name,
            Attributes attributes,
            Object value,
            SerializationContext context)
            throws IOException {
                
 
        try {
 
            AxisContentHandler hand=new AxisContentHandler(context);
            Marshaller marshaller =new Marshaller(hand);
 
            // Don't include the DOCTYPE, otherwise an exception occurs due
to
            //2 DOCTYPE defined in the document. The XML fragment is
included in
            //an XML document containing already a DOCTYPE
            marshaller.setMarshalAsDocument(false);
            marshaller.setRootElement(name.getLocalPart());
            
            // Marshall the Castor object into context
            marshaller.marshal(value);
 
        } catch (MarshalException me) {
            log.error(Messages.getMessage("castorMarshalException00"), me);
            throw new
IOException(Messages.getMessage("castorMarshalException00")
                    + me.getLocalizedMessage());
        } catch (ValidationException ve) {
            log.error(Messages.getMessage("castorValidationException00"),
ve);
            throw new
IOException(Messages.getMessage("castorValidationException00")
                    + ve.getLocalizedMessage());
        } finally {
            
        }
    }
 
    public String getMechanismType() {
        return Constants.AXIS_SAX;
    }
 
    /**
     * Return XML schema for the specified type, suitable for insertion into
     * the &lt;types&gt; element of a WSDL document, or underneath an
     * &lt;element&gt; or &lt;attribute&gt; declaration.
     *
     * @param javaType the Java Class we're writing out schema for
     * @param types the Java2WSDL Types object which holds the context
     *              for the WSDL being generated.
     * @return a type element containing a schema simpleType/complexType
     * @see org.apache.axis.wsdl.fromJava.Types
     */
    public Element writeSchema(Class javaType, Types types) throws Exception
{
        return null;
    }
}

2) and the ContentHandler
 

/*
 * The Apache Software License, Version 1.1
 *
 *
 * Copyright (c) 2002 The Apache Software Foundation.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/
<http://www.apache.org/> )."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Axis" and "Apache Software Foundation" must
 *    not be used to endorse or promote products derived from this
 *    software without prior written permission. For written
 *    permission, please contact apache@apache.org
<ma...@apache.org> .
 *
 * 5. Products derived from this software may not be called "Apache",
 *    nor may "Apache" appear in their name, without prior written
 *    permission of the Apache Software Foundation.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/ <http://www.apache.org/> >.
 */
package org.apache.axis.encoding.ser.castor;
 
import java.io.IOException;
import javax.xml.namespace.QName;
import org.apache.axis.encoding.SerializationContext;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
 
/**
 * Content Handler that wraps all calls into a SerializationContext
 *
 * @author Fabien Nisol (fabien.nisol@advalvas.be
<ma...@advalvas.be> )
 * @version 1.0
 */
public class AxisContentHandler extends DefaultHandler {
    
    private SerializationContext context;
    
    static 
    {
        // castor 0.9.5.2 does need this variable to be set.
        // @todo remove this code when unnecessary
        if(System.getProperty("org.xml.sax.parser")==null)
 
System.setProperty("org.xml.sax.parser","org.apache.xerces.parsers.SAXParser
");
    }
    
    /** Constructeur pour la classe AxisContentHandler */
    public AxisContentHandler(SerializationContext context) {
        super();
        setContext(context);
    }
    
    /** Getter for property context.
     * @return Value of property context.
     *
     */
    public org.apache.axis.encoding.SerializationContext getContext() {
        return context;
    }
    
    /** Setter for property context.
     * @param context New value of property context.
     *
     */
    public void setContext(org.apache.axis.encoding.SerializationContext
context) {
        this.context = context;
    }
    
    public void startElement(String uri, String localName, String qName,
org.xml.sax.Attributes attributes) throws org.xml.sax.SAXException {
        try {
            context.startElement(new QName(uri,localName),attributes);
        } catch (IOException ioe) {
            throw new SAXException(ioe);
        }
    }   
    
    public void endElement(String uri, String localName, String qName)
throws org.xml.sax.SAXException {
        try {
            context.endElement();
        } catch (IOException ioe) {
            throw new SAXException(ioe);
        }
    }
    
    public void characters(char[] ch, int start, int length) throws
org.xml.sax.SAXException {
        try {
            context.writeChars(ch,start,length);
        } catch (IOException ioe) {
            throw new SAXException(ioe);
        }
    }
    
}