You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commons-dev@ws.apache.org by Amila Suriarachchi <am...@gmail.com> on 2007/07/24 14:36:51 UTC

ADBDataSource getReader() method implementation.

ADB databinding in axis2 uses the ADBDatasource to return the OMElement.

Currently ADBDatasource getReader and serialize methods are like this.

public abstract void serialize(XMLStreamWriter xmlWriter)
            throws XMLStreamException;

public XMLStreamReader getReader() throws XMLStreamException {
            return bean.getPullParser(parentQName);
}

When we want to serialize the xml stream directly to transport we use
serialize method and the getReader is used in building the OMElemnet.
Specially Rampart module always build the OMElement and hence call for
getReader() method.
The serialize method is worked fine and it is the well tested method in ADB
and the getReader method which uses the ADBXmlStremReader has some issue
regarding extension and binary handling.

To solve this problem I wrote OMElmentStreamWriter [1] which build the
OMElement from the writer.

So now the getReader method looks like this. It use the serialize method to
create the OMElement.

 public XMLStreamReader getReader() throws XMLStreamException {

        OMElementStreamWriter omElementStreamWriter = new
OMElementStreamWriter();
        serialize(omElementStreamWriter);
        return omElementStreamWriter.getOMElement().getXMLStreamReader();
    }

this method perfectly works except the following two problems.

1. It is bit in efficient
OMElementStreamWriter first creates the OMElement and then it is used to get
the reader and again buid the OMElement.
To solve that either we can introduce a method to OMDataSource to directly
return the OMElement or AXIOM it self can use the above writer to build the
OMElement using the serilize method.

2. problems with the MTOM
This writer is not aware mtom. so it always serialize it as base64binary.
To fix this problem we can test for this pirticular writer in ADB generated
code (using instanceof or using a property) and set the data handler
to the element using a special method.
So this way we can create an OMElement which has a datahandler object in it.

in ADB bean class
if (writer instanceof OMElementStreamWriter){
   (OMElementStreamWriter)writer).setDataHandler(dataHandler);
}

in OMElementStreamWriter
 public void setDataHandler(DataHandler dataHandler){
        OMText omText = omFactory.createOMText(dataHandler,true);
        currentOMElement.addChild(omText);
    }

would this solve our problem?

And can someone has a better knowledge with Axiom comment on these?
The main advantage ADB has from this is to use the well tested serialize
method and hence keep one method to serailize the bean.

thanks,
Amila.

[1]
https://svn.apache.org/repos/asf/webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/writer/OMElementStreamWriter.java


-- 
Amila Suriarachchi,
WSO2 Inc.

[Axis2][Axiom]Re: ADBDataSource getReader() method implementation.

Posted by Amila Suriarachchi <am...@gmail.com>.
hi,

I did the following to solve the second problem. I have already commited
this to trunk.

I created a new interface called MTOMAwareXMLStreamWriter which extends the
XMLStreamWriter and
have a special method called
 public void writeDataHandler(DataHandler dataHandler) throws
XMLStreamException;

to support mtom handling.

ADB is an mtom aware data binding. So now ADB takes the
MTOMAwareStreamWriter to serilize the adb beans. And if the variable type is
DataHandler it calls for the writeDataHandler method in the bean class and
the MTOMAwareStreamWriter implementation will handle it properly.

There are two MTOMAwareXMLStreamWriter implementation classes.
1. MTOMAwareXMLSerializer
this is used in the normal stream serialization and it has basically wrapped
the existing XMLStreamwriter and has implemented the writeDataHandler method
as follows.

public void writeDataHandler(DataHandler dataHandler) throws
XMLStreamException {
        OMTextImpl omText = new OMTextImpl(dataHandler,
OMAbstractFactory.getOMFactory());
        omText.internalSerializeAndConsume(this.xmlStreamWriter);
    }

So that it handle the mtom serailization correctly.

2. MTOMAwareOMBuilder
this will creates an OMElement using the writter and has implements the
writeDataHandler method as follows,

public void writeDataHandler(DataHandler dataHandler) throws
XMLStreamException {
        OMText omText = omFactory.createOMText(dataHandler, true);
        currentOMElement.addChild(omText);
    }

so that it sets the omText correctly.

And the ADBDataSource class is look like this,

   public void serialize(XMLStreamWriter xmlWriter) throws
XMLStreamException{
        MTOMAwareXMLStreamWriter mtomAwareXMLStreamWriter = new
MTOMAwareXMLSerializer(xmlWriter);
        serialize(mtomAwareXMLStreamWriter);
    }

    public abstract void serialize(MTOMAwareXMLStreamWriter xmlWriter)
throws XMLStreamException;

    public XMLStreamReader getReader() throws XMLStreamException {
        // since only ADBBeans related to elements can be serialized
        // we are safe in passing null here.
        MTOMAwareOMBuilder mtomAwareOMBuilder = new MTOMAwareOMBuilder();
        serialize(mtomAwareOMBuilder);
        return mtomAwareOMBuilder.getOMElement().getXMLStreamReader();
    }

This way we can build the OMElement using the existing serialize method and
I think this is an optimal solution than what we had. But still performance
problem is there and can be solve by using the either way I have proposed.
So can someone have better axiom knowledge help in this?

in this article ajith has describe how ADB supports the binary
http://wso2.org/library/236 (thanks ajith for writing this article which
help me a lot to understand this stuff)

So we can use the same technique to the Reader as well by defining a
MTOMAwareXMLStreamReader to ADB.
In this way we can introduce a much smoother interface to ADB and handle
Mtom specific code in MTOMAwareXMLStreamReader reader implementaion class.

thanks,
Amila.








On 7/24/07, Amila Suriarachchi <am...@gmail.com> wrote:
>
> ADB databinding in axis2 uses the ADBDatasource to return the OMElement.
>
> Currently ADBDatasource getReader and serialize methods are like this.
>
> public abstract void serialize(XMLStreamWriter xmlWriter)
>             throws XMLStreamException;
>
> public XMLStreamReader getReader() throws XMLStreamException {
>             return bean.getPullParser(parentQName);
> }
>
> When we want to serialize the xml stream directly to transport we use
> serialize method and the getReader is used in building the OMElemnet.
> Specially Rampart module always build the OMElement and hence call for
> getReader() method.
> The serialize method is worked fine and it is the well tested method in
> ADB and the getReader method which uses the ADBXmlStremReader has some issue
> regarding extension and binary handling.
>
> To solve this problem I wrote OMElmentStreamWriter [1] which build the
> OMElement from the writer.
>
> So now the getReader method looks like this. It use the serialize method
> to create the OMElement.
>
>  public XMLStreamReader getReader() throws XMLStreamException {
>
>         OMElementStreamWriter omElementStreamWriter = new
> OMElementStreamWriter();
>         serialize(omElementStreamWriter);
>         return omElementStreamWriter.getOMElement().getXMLStreamReader();
>     }
>
> this method perfectly works except the following two problems.
>
> 1. It is bit in efficient
> OMElementStreamWriter first creates the OMElement and then it is used to
> get the reader and again buid the OMElement.
> To solve that either we can introduce a method to OMDataSource to directly
> return the OMElement or AXIOM it self can use the above writer to build the
> OMElement using the serilize method.
>
> 2. problems with the MTOM
> This writer is not aware mtom. so it always serialize it as base64binary.
> To fix this problem we can test for this pirticular writer in ADB
> generated code (using instanceof or using a property) and set the data
> handler
> to the element using a special method.
> So this way we can create an OMElement which has a datahandler object in
> it.
>
> in ADB bean class
> if (writer instanceof OMElementStreamWriter){
>    (OMElementStreamWriter)writer).setDataHandler(dataHandler);
> }
>
> in OMElementStreamWriter
>  public void setDataHandler(DataHandler dataHandler){
>         OMText omText = omFactory.createOMText(dataHandler,true);
>         currentOMElement.addChild(omText);
>     }
>
> would this solve our problem?
>
> And can someone has a better knowledge with Axiom comment on these?
> The main advantage ADB has from this is to use the well tested serialize
> method and hence keep one method to serailize the bean.
>
> thanks,
> Amila.
>
> [1] https://svn.apache.org/repos/asf/webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/writer/OMElementStreamWriter.java
>
>
>
> --
> Amila Suriarachchi,
> WSO2 Inc.




-- 
Amila Suriarachchi,
WSO2 Inc.

[Axis2][Axiom]Re: ADBDataSource getReader() method implementation.

Posted by Amila Suriarachchi <am...@gmail.com>.
hi,

I did the following to solve the second problem. I have already commited
this to trunk.

I created a new interface called MTOMAwareXMLStreamWriter which extends the
XMLStreamWriter and
have a special method called
 public void writeDataHandler(DataHandler dataHandler) throws
XMLStreamException;

to support mtom handling.

ADB is an mtom aware data binding. So now ADB takes the
MTOMAwareStreamWriter to serilize the adb beans. And if the variable type is
DataHandler it calls for the writeDataHandler method in the bean class and
the MTOMAwareStreamWriter implementation will handle it properly.

There are two MTOMAwareXMLStreamWriter implementation classes.
1. MTOMAwareXMLSerializer
this is used in the normal stream serialization and it has basically wrapped
the existing XMLStreamwriter and has implemented the writeDataHandler method
as follows.

public void writeDataHandler(DataHandler dataHandler) throws
XMLStreamException {
        OMTextImpl omText = new OMTextImpl(dataHandler,
OMAbstractFactory.getOMFactory());
        omText.internalSerializeAndConsume(this.xmlStreamWriter);
    }

So that it handle the mtom serailization correctly.

2. MTOMAwareOMBuilder
this will creates an OMElement using the writter and has implements the
writeDataHandler method as follows,

public void writeDataHandler(DataHandler dataHandler) throws
XMLStreamException {
        OMText omText = omFactory.createOMText(dataHandler, true);
        currentOMElement.addChild(omText);
    }

so that it sets the omText correctly.

And the ADBDataSource class is look like this,

   public void serialize(XMLStreamWriter xmlWriter) throws
XMLStreamException{
        MTOMAwareXMLStreamWriter mtomAwareXMLStreamWriter = new
MTOMAwareXMLSerializer(xmlWriter);
        serialize(mtomAwareXMLStreamWriter);
    }

    public abstract void serialize(MTOMAwareXMLStreamWriter xmlWriter)
throws XMLStreamException;

    public XMLStreamReader getReader() throws XMLStreamException {
        // since only ADBBeans related to elements can be serialized
        // we are safe in passing null here.
        MTOMAwareOMBuilder mtomAwareOMBuilder = new MTOMAwareOMBuilder();
        serialize(mtomAwareOMBuilder);
        return mtomAwareOMBuilder.getOMElement().getXMLStreamReader();
    }

This way we can build the OMElement using the existing serialize method and
I think this is an optimal solution than what we had. But still performance
problem is there and can be solve by using the either way I have proposed.
So can someone have better axiom knowledge help in this?

in this article ajith has describe how ADB supports the binary
http://wso2.org/library/236 (thanks ajith for writing this article which
help me a lot to understand this stuff)

So we can use the same technique to the Reader as well by defining a
MTOMAwareXMLStreamReader to ADB.
In this way we can introduce a much smoother interface to ADB and handle
Mtom specific code in MTOMAwareXMLStreamReader reader implementaion class.

thanks,
Amila.








On 7/24/07, Amila Suriarachchi <am...@gmail.com> wrote:
>
> ADB databinding in axis2 uses the ADBDatasource to return the OMElement.
>
> Currently ADBDatasource getReader and serialize methods are like this.
>
> public abstract void serialize(XMLStreamWriter xmlWriter)
>             throws XMLStreamException;
>
> public XMLStreamReader getReader() throws XMLStreamException {
>             return bean.getPullParser(parentQName);
> }
>
> When we want to serialize the xml stream directly to transport we use
> serialize method and the getReader is used in building the OMElemnet.
> Specially Rampart module always build the OMElement and hence call for
> getReader() method.
> The serialize method is worked fine and it is the well tested method in
> ADB and the getReader method which uses the ADBXmlStremReader has some issue
> regarding extension and binary handling.
>
> To solve this problem I wrote OMElmentStreamWriter [1] which build the
> OMElement from the writer.
>
> So now the getReader method looks like this. It use the serialize method
> to create the OMElement.
>
>  public XMLStreamReader getReader() throws XMLStreamException {
>
>         OMElementStreamWriter omElementStreamWriter = new
> OMElementStreamWriter();
>         serialize(omElementStreamWriter);
>         return omElementStreamWriter.getOMElement().getXMLStreamReader();
>     }
>
> this method perfectly works except the following two problems.
>
> 1. It is bit in efficient
> OMElementStreamWriter first creates the OMElement and then it is used to
> get the reader and again buid the OMElement.
> To solve that either we can introduce a method to OMDataSource to directly
> return the OMElement or AXIOM it self can use the above writer to build the
> OMElement using the serilize method.
>
> 2. problems with the MTOM
> This writer is not aware mtom. so it always serialize it as base64binary.
> To fix this problem we can test for this pirticular writer in ADB
> generated code (using instanceof or using a property) and set the data
> handler
> to the element using a special method.
> So this way we can create an OMElement which has a datahandler object in
> it.
>
> in ADB bean class
> if (writer instanceof OMElementStreamWriter){
>    (OMElementStreamWriter)writer).setDataHandler(dataHandler);
> }
>
> in OMElementStreamWriter
>  public void setDataHandler(DataHandler dataHandler){
>         OMText omText = omFactory.createOMText(dataHandler,true);
>         currentOMElement.addChild(omText);
>     }
>
> would this solve our problem?
>
> And can someone has a better knowledge with Axiom comment on these?
> The main advantage ADB has from this is to use the well tested serialize
> method and hence keep one method to serailize the bean.
>
> thanks,
> Amila.
>
> [1] https://svn.apache.org/repos/asf/webservices/axis2/trunk/java/modules/adb/src/org/apache/axis2/databinding/utils/writer/OMElementStreamWriter.java
>
>
>
> --
> Amila Suriarachchi,
> WSO2 Inc.




-- 
Amila Suriarachchi,
WSO2 Inc.