Hi Andreas,

Thanks for the pointer, however, I'd still like to make one clarification.
Do you mean here to internally maintain a DataHandler? or to output a
DataHandler from the XMLStreamReader?

If you mean the latter, what would the call to next return from the states
in [1]. And, if you mean the former, I'd like to know why is it necessary to
maintain a DataHandler when you already got the Map with the byte[]?

[1]
http://java.sun.com/javase/6/docs/api/javax/xml/stream/XMLStreamConstants.html

Regards,
Senaka

On Mon, Nov 10, 2008 at 10:34 PM, Andreas Veithen <[EMAIL PROTECTED]
> wrote:

> Senaka,
>
> I think for efficiency, it should be the other way round: The
> XMLStreamReader should produce a DataHandler, which is a thin layer on
> top of the byte[]. AXIOM will then convert to Base64 on demand. A look
> at OMStAXWrapper#getProperty might help to understand how this can be
> achieved.
>
> Andreas
>
> On Mon, Nov 10, 2008 at 16:26, Senaka Fernando <[EMAIL PROTECTED]>
> wrote:
> > Hi Andreas,
> >
> > I have added code to handle byte[] data as well, at [1]. As far as I
> > understood, normally Axiom will store data as text, unless a DataHandler
> is
> > created and attached to a tree, and the DataHandler can be extracted from
> > the text (the DataHandler is created on-demand). For this to happen the
> text
> > must be Base64 encoded. This is the same procedure that takes place when
> the
> > Axis2 engine receives a XML payload having binary content embedded as
> Base64
> > encoded text. Also, since I'm dealing with an XMLStreamReader, I believe
> > that this approach sounds logical. WDYT?
> >
> > I have also moved the char[] based code to use Strings as suggested.
> >
> > [1]
> >
> http://sci-flex.googlecode.com/svn/sci-flex/trunk/java/axiom/src/main/java/org/apache/axiom/om/util/WrappedMapNodeStreamReader.java
> >
> > Regards,
> > Senaka
> >
> > On Mon, Nov 10, 2008 at 12:22 AM, Senaka Fernando <[EMAIL PROTECTED]
> >wrote:
> >
> >> Hi Andreas,
> >>
> >> I did some modifications to the source and committed it minutes ago. My
> >> previous post to the thread shows a sample output. Seems that your last
> post
> >> and my last post were sent almost at the same time. :-).. So in addition
> to
> >> what I've said in the previous post, i have added some comments to this
> >> post, inline.
> >>
> >> On Mon, Nov 10, 2008 at 12:06 AM, Andreas Veithen <
> >> [EMAIL PROTECTED]> wrote:
> >>
> >>> Senaka,
> >>>
> >>> I didn't execute the code yet, but I did a quick review and it looks
> >>> already very good. I would like to make the following comments to
> >>> improve this still further:
> >>>
> >>
> >> Thanks, and I will add some tests for this code, shortly. I tweaked the
> >> present test source to observe the sample output, which I have not
> >> committed.
> >>
> >>>
> >>> * In WrappedTextNodeStreamReader, the character data is returned in
> >>> chunks in order to avoid loading the entire data into memory
> >>> (typically the data comes from a temporary file). I don't think that
> >>> this is necessary for the map values, and could even introduce
> >>> unnecessary overhead. They should simply be converted to a String and
> >>> returned as a single chunk. Getting rid of the java.io.Reader would
> >>> also simplify the code.
> >>
> >>
> >> Sounds logical. But, what made me go for this approach is that I assumed
> >> that at times a typical Map MIGHT have data that is too large to fit in
> >> memory. WDYT?
> >>
> >>>
> >>> * The right way to represent a byte[] value is to produce a
> >>> DataHandler (which is equivalent to having the binary data encoded as
> >>> Base64). Note that this is not directly supported by the StAX API, but
> >>> rather an extension introduced by AXIOM to handle binary data
> >>> efficiently. Please have a look at
> >>> StAXBuilder#createOMText(OMContainer, int) to see how this magic
> >>> works.
> >>
> >>
> >> Thanks for the pointer,  I will try to add this logic as well.
> >>
> >>>
> >>> * For the moment the key of a map entry is represented using a "key"
> >>> attribute but also used for the element name. I guess this is a
> >>> mistake. Since a map key is not necessarily a valid XML element name,
> >>> I think we should prefer the representation using an attribute.
> >>
> >>
> >> I corrected this. Now, element names are "value", and the key is an
> >> attribute. The logic limits Map keys to types that can be represented as
> >> Strings, and an exception is thrown if it is of any other type.
> >>
> >> Regards,
> >> Senaka
> >>
> >>>
> >>> Regards,
> >>>
> >>> Andreas
> >>>
> >>> On Sun, Nov 9, 2008 at 11:40, Senaka Fernando <[EMAIL PROTECTED]>
> >>> wrote:
> >>> > Andreas,
> >>> >
> >>> > I did go through your suggested implementation, and [1]'s what I'm
> >>> planning
> >>> > to do. Please do let me know whether I've made the correct choices.
> As
> >>> of
> >>> > now, the getElementText() method is perhaps not quite correct and I
> have
> >>> not
> >>> > yet added a mechanism to represent a byte[].
> >>> >
> >>> > [1]
> >>> >
> >>>
> http://sci-flex.googlecode.com/svn/sci-flex/trunk/java/axiom/src/main/java/org/apache/axiom/om/util/WrappedMapNodeStreamReader.java
> >>> >
> >>> > Regards,
> >>> > Senaka
> >>> >
> >>> > On Sat, Nov 8, 2008 at 1:36 AM, Sanjiva Weerawarana
> >>> > <[EMAIL PROTECTED]>wrote:
> >>> >
> >>> >> +1 Andreas. This should be written so that the OM is created IFF XML
> >>> >> navigation is done. Otherwise the map message should remain in Java
> and
> >>> then
> >>> >> just get piped thru - that's critical for Synapse performance.
> >>> >>
> >>> >> Sanjiva.
> >>> >>
> >>> >>
> >>> >> Andreas Veithen wrote:
> >>> >>
> >>> >>> Senaka,
> >>> >>>
> >>> >>> The AXIOM tree is built twice because of the following piece of
> code:
> >>> >>>
> >>> >>>    public XMLStreamReader getReader() throws XMLStreamException {
> >>> >>>        return getUnderlyingElement().getXMLStreamReader();
> >>> >>>    }
> >>> >>>
> >>> >>> The getUnderlyingElement method will build an AXIOM tree
> representing
> >>> >>> the Map(Message), but when the OMSourcedElement is expanded, AXIOM
> >>> >>> will build another tree based on the events pulled from the
> >>> >>> XMLStreamReader. There are two options then:
> >>> >>>
> >>> >>> 1. One considers that in the vast majority of cases, the content
> will
> >>> >>> be accessed anyway. Then it would make more sense to construct the
> >>> >>> AXIOM tree directly when the message is received (i.e. no need for
> an
> >>> >>> OMSourcedElement).
> >>> >>> 2. Don't build an AXIOM tree inside the OMDataSource but construct
> an
> >>> >>> XMLStreamReader implementation that returns the sequence of StAX
> >>> >>> events corresponding to the desired XML representation.
> >>> >>>
> >>> >>> I used the technique behind option 2 in the following piece of
> code:
> >>> >>>
> >>> >>>
> >>> >>>
> >>>
> http://svn.apache.org/repos/asf/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/util/WrappedTextNodeStreamReader.java
> >>> >>>
> >>> >>> The XMLStreamReader implementation shown in this link is used to
> >>> >>> transform character data (provided by a java.io.Reader) into an
> >>> >>> OMSourcedElement that wraps this data, i.e. the resulting tree
> would
> >>> >>> be an element with a text node as child. That doesn't sound very
> >>> >>> useful at first glance, but in case of very long character data, it
> >>> >>> allows to stream the data almost directly from the source to the
> >>> >>> destination without ever building the OMText nodes (which would
> >>> >>> consume a large amount of memory).
> >>> >>>
> >>> >>> Given that reading the data source is non destructive, option 2 has
> >>> >>> the advantage that the AXIOM tree
> >>> >>> * will be built exactly once if somebody queries the child OMNodes;
> >>> >>> * will not be built at all when somebody serializes the content
> into a
> >>> >>> byte stream.
> >>> >>>
> >>> >>> While this is the optimal solution, it is also much more difficult
> to
> >>> >>> implement. It is certainly an interesting challenge to do that.
> >>> >>>
> >>> >>> Finally, for the type problem, it is indeed sufficient to add a
> "type"
> >>> >>> attribute to the element that represents the key-value pair:
> >>> >>>
> >>> >>> <price type="double">12.456</price>
> >>> >>>
> >>> >>> Andreas
> >>> >>>
> >>> >>> On Thu, Oct 30, 2008 at 10:34, Senaka Fernando <
> [EMAIL PROTECTED]>
> >>> >>> wrote:
> >>> >>>
> >>> >>>> Hi Andreas,
> >>> >>>> I agree with your observations here. Also, I would like to
> understand
> >>> >>>> what
> >>> >>>> you mean by "it will build the AXIOM tree twice when the content
> >>> >>>> is accessed", can this be corrected? As far as Map Messages found
> in
> >>> the
> >>> >>>> jms
> >>> >>>> transport are concerned, the key is of type string, and the value
> is
> >>> a
> >>> >>>> primitive java type, I believe that a slight modification option 2
> >>> >>>> discussed
> >>> >>>> here should work. WDYT?
> >>> >>>>
> >>> >>>> Regards,
> >>> >>>> Senaka
> >>> >>>>
> >>> >>>> On Thu, Oct 30, 2008 at 2:10 AM, Andreas Veithen
> >>> >>>> <[EMAIL PROTECTED]>wrote:
> >>> >>>>
> >>> >>>>  Having alternative strategies that map between MapMessages and
> XML
> >>> >>>>> might be interesting, but to start with we should have at least
> one
> >>> >>>>> implementation that meets all of the following requirements:
> >>> >>>>>
> >>> >>>>> 1. Highly optimized and having the least possible overhead (even
> if
> >>> >>>>> the AXIOM tree is build).
> >>> >>>>> 2. The XML representation must be simple so that it can be easily
> >>> used
> >>> >>>>> with XSLT and XPath.
> >>> >>>>> 3. The mapping must be two way and lossless. That is important if
> >>> you
> >>> >>>>> want to switch from JMS to another protocol and then back again
> to
> >>> >>>>> JMS.
> >>> >>>>>
> >>> >>>>> In my opinion, the XMLEncoder based solution doesn't satisfy the
> >>> first
> >>> >>>>> two requirements, but will meet the last one.
> >>> >>>>>
> >>> >>>>> The other implementation you propose
> >>> >>>>> - partially satisfies requirement 1 (partially because - as far
> as I
> >>> >>>>> can see - it will build the AXIOM tree twice when the content is
> >>> >>>>> accessed);
> >>> >>>>> - satisfies requirement 2;
> >>> >>>>> - doesn't satisfy requirement 3 because it looses information
> about
> >>> >>>>> the property types, i.e. you will not be able to recreate an
> >>> >>>>> equivalent MapMessage from the XML representation.
> >>> >>>>>
> >>> >>>>> Andreas
> >>> >>>>>
> >>> >>>>>
> >>> >>>>> On Tue, Oct 28, 2008 at 04:44, Senaka Fernando <
> [EMAIL PROTECTED]
> >>> >
> >>> >>>>> wrote:
> >>> >>>>>
> >>> >>>>>> Hi Andreas,
> >>> >>>>>>
> >>> >>>>>> The scenario here was to have an implementation that will
> support
> >>> Map
> >>> >>>>>> Messages "as well as" hierarchical Maps, and any generic use of
> >>> Maps
> >>> >>>>>> with
> >>> >>>>>> OM. And as you have mentioned here Map Messages can only have
> >>> primitive
> >>> >>>>>> types on it. Therefore, in theory MapMessage support would only
> >>> require
> >>> >>>>>> a
> >>> >>>>>> subset of provisions made by this implementation.
> >>> >>>>>>
> >>> >>>>>> Also, if you have tried the implementation I have at the moment,
> it
> >>> >>>>>>
> >>> >>>>> supports
> >>> >>>>>
> >>> >>>>>> alternative strategies (so you may use whatever type of
> serializer
> >>> you
> >>> >>>>>> want).
> >>> >>>>>>
> >>> >>>>>> Regards,
> >>> >>>>>> Senaka
> >>> >>>>>>
> >>> >>>>>> On Tue, Oct 28, 2008 at 5:34 AM, Andreas Veithen
> >>> >>>>>> <[EMAIL PROTECTED]>wrote:
> >>> >>>>>>
> >>> >>>>>>  Senaka,
> >>> >>>>>>>
> >>> >>>>>>> How does your question actually relate to the MapMessage
> support
> >>> you
> >>> >>>>>>> are working on? AFAIK MapMessages can't contain arbitrary Java
> >>> >>>>>>> objects.
> >>> >>>>>>>
> >>> >>>>>>> Andreas
> >>> >>>>>>>
> >>> >>>>>>> On Sun, Oct 26, 2008 at 22:19, Senaka Fernando <
> >>> [EMAIL PROTECTED]>
> >>> >>>>>>> wrote:
> >>> >>>>>>>
> >>> >>>>>>>> Hi Andreas,
> >>> >>>>>>>>
> >>> >>>>>>>> Here you go:
> >>> >>>>>>>>
> >>> >>>>>>>> <map>
> >>> >>>>>>>> <java version="1.6.0_06" class="java.beans.XMLDecoder">
> >>> >>>>>>>>  <object class="java.util.TreeMap">
> >>> >>>>>>>>  <void method="put">
> >>> >>>>>>>>  <string>KeyStr</string>
> >>> >>>>>>>>  <string>five</string>
> >>> >>>>>>>>  </void>
> >>> >>>>>>>>  <void method="put">
> >>> >>>>>>>>  <string>Test</string>
> >>> >>>>>>>>  <float>5.5</float>
> >>> >>>>>>>>  </void>
> >>> >>>>>>>>  <void method="put">
> >>> >>>>>>>>  <string>SomeKey</string>
> >>> >>>>>>>>  <int>5</int>
> >>> >>>>>>>>  </void>
> >>> >>>>>>>>  <void method="put">
> >>> >>>>>>>>  <string>nested</string>
> >>> >>>>>>>>  <object class="java.util.TreeMap">
> >>> >>>>>>>>   <void method="put">
> >>> >>>>>>>>    <string>me</string>
> >>> >>>>>>>>    <float>2.0</float>
> >>> >>>>>>>>   </void>
> >>> >>>>>>>>   <void method="put">
> >>> >>>>>>>>    <string>more</string>
> >>> >>>>>>>>    <int>100</int>
> >>> >>>>>>>>   </void>
> >>> >>>>>>>>   <void method="put">
> >>> >>>>>>>>    <string>moreNested</string>
> >>> >>>>>>>>    <object class="java.util.TreeMap">
> >>> >>>>>>>>     <void method="put">
> >>> >>>>>>>>      <string>String</string>
> >>> >>>>>>>>      <string>ten</string>
> >>> >>>>>>>>     </void>
> >>> >>>>>>>>    </object>
> >>> >>>>>>>>   </void>
> >>> >>>>>>>>  </object>
> >>> >>>>>>>>  </void>
> >>> >>>>>>>>  </object>
> >>> >>>>>>>> </java>
> >>> >>>>>>>> </map>
> >>> >>>>>>>>
> >>> >>>>>>>> This is the serialization for a TreeMap having {<KeyStr,
> five>,
> >>> >>>>>>>> <Test,
> >>> >>>>>>>>
> >>> >>>>>>> 5.5>,
> >>> >>>>>>>
> >>> >>>>>>>> <someKey, 5>, <nested, {<me, 2.0>, <more, 100>, <moreNested,
> >>> >>>>>>>> {<String,
> >>> >>>>>>>> ten>}>}>}
> >>> >>>>>>>>
> >>> >>>>>>>> Regards,
> >>> >>>>>>>> Senaka
> >>> >>>>>>>>
> >>> >>>>>>>> On Mon, Oct 27, 2008 at 1:52 AM, Andreas Veithen
> >>> >>>>>>>> <[EMAIL PROTECTED]>wrote:
> >>> >>>>>>>>
> >>> >>>>>>>>  Senaka,
> >>> >>>>>>>>>
> >>> >>>>>>>>> Just a quick question: what does the serialization of a Map
> >>> looks
> >>> >>>>>>>>>
> >>> >>>>>>>> like
> >>> >>>>>
> >>> >>>>>>  with XMLEncoder?
> >>> >>>>>>>>>
> >>> >>>>>>>>> Andreas
> >>> >>>>>>>>>
> >>> >>>>>>>>> On Sat, Oct 25, 2008 at 20:01, Senaka Fernando <
> >>> [EMAIL PROTECTED]
> >>> >>>>>>>>> >
> >>> >>>>>>>>> wrote:
> >>> >>>>>>>>>
> >>> >>>>>>>>>> Hi all,
> >>> >>>>>>>>>>
> >>> >>>>>>>>>> I'm working on a mechanism to attach a java.util.Map onto an
> >>> Axiom
> >>> >>>>>>>>>>
> >>> >>>>>>>>> Tree.
> >>> >>>>>>>
> >>> >>>>>>>> So
> >>> >>>>>>>>>
> >>> >>>>>>>>>> far, I have been able to attach the java.util.Map onto the
> OM
> >>> Tree
> >>> >>>>>>>>>>
> >>> >>>>>>>>> with
> >>> >>>>>>>
> >>> >>>>>>>> the
> >>> >>>>>>>>>
> >>> >>>>>>>>>> help of a specialized data source I have created. This
> >>> >>>>>>>>>>
> >>> >>>>>>>>> implementation
> >>> >>>>>
> >>> >>>>>>  features on-demand building of the XML payload and I believe
> the
> >>> >>>>>>>>>>
> >>> >>>>>>>>> broader
> >>> >>>>>>>
> >>> >>>>>>>>  usefulness of this would be to serve as a mechanism to store
> a
> >>> >>>>>>>>>>
> >>> >>>>>>>>> java.util.Map
> >>> >>>>>>>>>
> >>> >>>>>>>>>> as a part of the OM Tree and perform XML operations (ex:-
> >>> XPath) to
> >>> >>>>>>>>>>
> >>> >>>>>>>>> extract
> >>> >>>>>>>>>
> >>> >>>>>>>>>> data if needed. However, there can be situations where one
> >>> would
> >>> >>>>>>>>>>
> >>> >>>>>>>>> require
> >>> >>>>>>>
> >>> >>>>>>>> to
> >>> >>>>>>>>>
> >>> >>>>>>>>>> serialize the internal Map payload and obtain an XML
> >>> >>>>>>>>>>
> >>> >>>>>>>>> representation.
> >>> >>>>>
> >>> >>>>>> This
> >>> >>>>>>>
> >>> >>>>>>>>  can be achieved either through a custom serializer or through
> a
> >>> >>>>>>>>>>
> >>> >>>>>>>>> built-in
> >>> >>>>>>>
> >>> >>>>>>>>  serializer that will convert the Map into an XML
> representation.
> >>> I
> >>> >>>>>>>>>>
> >>> >>>>>>>>> have
> >>> >>>>>>>
> >>> >>>>>>>> as
> >>> >>>>>>>>>
> >>> >>>>>>>>>> of present added two serializers to the implementation.
> >>> >>>>>>>>>>
> >>> >>>>>>>>>> 1. A simple serializer i I wrote that can handle primitive
> >>> types,
> >>> >>>>>>>>>>
> >>> >>>>>>>>> and
> >>> >>>>>
> >>> >>>>>>  Maps
> >>> >>>>>>>>>
> >>> >>>>>>>>>> (supports hierarchical maps)
> >>> >>>>>>>>>> 2. The Java XML encoder/decoder for beans
> java.beans.XMLEncoder
> >>> /
> >>> >>>>>>>>>> java.beans.XMLDecoder (Apache Harmony has an implementation
> of
> >>> this
> >>> >>>>>>>>>>
> >>> >>>>>>>>> if
> >>> >>>>>
> >>> >>>>>>  you
> >>> >>>>>>>>>
> >>> >>>>>>>>>> are interested in digging deeper into what happens, [1],
> [2])
> >>> >>>>>>>>>>
> >>> >>>>>>>>>> Now, after having a word with Paul on this setup I decided
> to
> >>> make
> >>> >>>>>>>>>>
> >>> >>>>>>>>> this
> >>> >>>>>>>
> >>> >>>>>>>>  implementation more generic, and capable of supporting any
> type
> >>> of
> >>> >>>>>>>>>>
> >>> >>>>>>>>> object
> >>> >>>>>>>
> >>> >>>>>>>>  attached to the Map, which eventually drops the 1st
> >>> implementation
> >>> >>>>>>>>>>
> >>> >>>>>>>>> above.
> >>> >>>>>>>
> >>> >>>>>>>>  The second works fine, but, is a highly Java specific way of
> >>> doing
> >>> >>>>>>>>>>
> >>> >>>>>>>>> things
> >>> >>>>>>>
> >>> >>>>>>>>  (but there is another point here, java.util.Map is Java
> anyway
> >>> so
> >>> >>>>>>>>>>
> >>> >>>>>>>>> this
> >>> >>>>>
> >>> >>>>>>  might
> >>> >>>>>>>>>
> >>> >>>>>>>>>> not be an issue) and make no sense in a non-Java context,
> and
> >>> can
> >>> >>>>>>>>>>
> >>> >>>>>>>>> also
> >>> >>>>>
> >>> >>>>>> be
> >>> >>>>>>>
> >>> >>>>>>>>  memory consuming and inefficient.
> >>> >>>>>>>>>>
> >>> >>>>>>>>>> I have investigated the possibility to make use of,
> >>> >>>>>>>>>>
> >>> >>>>>>>>>> 3. org.apache.axis2.databinding.utils.BeanUtil
> >>> >>>>>>>>>>  - This is a sample source code portion that i used,
> >>> >>>>>>>>>>
> >>> >>>>>>>>>>       XMLStreamReader xtr = BeanUtil.getPullParser(map);
> >>> >>>>>>>>>>       StAXOMBuilder builder = new StAXOMBuilder(xtr);
> >>> >>>>>>>>>>       OMElement ele = builder.getDocumentElement();
> >>> >>>>>>>>>>
> >>> >>>>>>>>>>  However, for some reason this doesn't work and I run into
> an
> >>> NPE.
> >>> >>>>>>>>>>
> >>> >>>>>>>>>> org.apache.axiom.om.OMException:
> java.lang.NullPointerException
> >>> >>>>>>>>>>       at
> >>> >>>>>>>>>>
> >>> >>>>>>>>>>
> >>>
> org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:251)
> >>> >>>>>
> >>> >>>>>>        at
> >>> >>>>>>>>>>
> >>> >>>>>>>>>>
> >>>
> org.apache.axiom.om.impl.llom.OMDocumentImpl.getOMDocumentElement(OMDocumentImpl.java:132)
> >>> >>>>>
> >>> >>>>>>        at
> >>> >>>>>>>>>>
> >>> >>>>>>>>>>
> >>>
> org.apache.axiom.om.impl.builder.StAXOMBuilder.getDocumentElement(StAXOMBuilder.java:526)
> >>> >>>>>
> >>> >>>>>>        at my.package.MyClass.myMethod(MyClass.java:127)
> >>> >>>>>>>>>> Caused by: java.lang.NullPointerException
> >>> >>>>>>>>>>       at
> >>> >>>>>>>>>>
> >>> >>>>>>>>>>
> >>>
> org.apache.axiom.om.impl.builder.StAXOMBuilder.endElement(StAXOMBuilder.java:508)
> >>> >>>>>
> >>> >>>>>>        at
> >>> >>>>>>>>>>
> >>> >>>>>>>>>>
> >>>
> org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:222)
> >>> >>>>>
> >>> >>>>>>        ... 35 more
> >>> >>>>>>>>>>
> >>> >>>>>>>>>>  I spoke to Chinthaka on this matter, and was told that
> there
> >>> >>>>>>>>>>
> >>> >>>>>>>>> might
> >>> >>>>>
> >>> >>>>>> be
> >>> >>>>>>>
> >>> >>>>>>>> an
> >>> >>>>>>>>>
> >>> >>>>>>>>>> assumption that the BeanUtil can only handle Bean Classes,
> or
> >>> >>>>>>>>>>
> >>> >>>>>>>>> Classes
> >>> >>>>>
> >>> >>>>>>  that
> >>> >>>>>>>>>
> >>> >>>>>>>>>> are not Maps, which might have lead to this situation. I
> >>> believe it
> >>> >>>>>>>>>>
> >>> >>>>>>>>> wont
> >>> >>>>>>>
> >>> >>>>>>>> be
> >>> >>>>>>>>>
> >>> >>>>>>>>>> easy to fix these issues. This is the rationale: I might be
> >>> able to
> >>> >>>>>>>>>>
> >>> >>>>>>>>> get
> >>> >>>>>>>
> >>> >>>>>>>> this
> >>> >>>>>>>>>
> >>> >>>>>>>>>> to work for java.util.Map, but the whole idea is to make use
> of
> >>> it
> >>> >>>>>>>>>>
> >>> >>>>>>>>> to
> >>> >>>>>
> >>> >>>>>>  serialize any type of object, where I can't anticipate the
> >>> >>>>>>>>>>
> >>> >>>>>>>>> stability.
> >>> >>>>>
> >>> >>>>>>  4. PayloadHelper in Apache Synapse
> >>> >>>>>>>>>>  This is a robust implementation that will work for
> primitive
> >>> Maps
> >>> >>>>>>>>>>
> >>> >>>>>>>>> (based
> >>> >>>>>>>
> >>> >>>>>>>>  on org.apache.synapse.util.SimpleMap) like option 1. above.
> >>> >>>>>>>>>>
> >>> >>>>>>>>> However,
> >>> >>>>>
> >>> >>>>>> it
> >>> >>>>>>>
> >>> >>>>>>>>  lacks some aspects.
> >>> >>>>>>>>>>   a. It is still a part of Synapse and needs to be ported to
> >>> Axiom
> >>> >>>>>>>>>>
> >>> >>>>>>>>> (this
> >>> >>>>>>>
> >>> >>>>>>>>  is do-able as the system has clear and loosely coupled
> >>> interfaces).
> >>> >>>>>>>>>>   b. It is an extension of HashMap and thus will not work
> with
> >>> >>>>>>>>>>
> >>> >>>>>>>>> other
> >>> >>>>>
> >>> >>>>>> Map
> >>> >>>>>>>
> >>> >>>>>>>>  types, such as TreeMap which can be an issue when element
> >>> ordering
> >>> >>>>>>>>>>
> >>> >>>>>>>>> comes
> >>> >>>>>>>
> >>> >>>>>>>>  into play.
> >>> >>>>>>>>>>   c. It wont support Hierarchical Maps (please correct me if
> I
> >>> >>>>>>>>>>
> >>> >>>>>>>>> made a
> >>> >>>>>
> >>> >>>>>>  mistake here).
> >>> >>>>>>>>>>   d. It still doesn't serve the purpose of supporting more
> >>> generic
> >>> >>>>>>>>>>
> >>> >>>>>>>>> Maps
> >>> >>>>>>>
> >>> >>>>>>>>  with any types of objects in it.
> >>> >>>>>>>>>>
> >>> >>>>>>>>>> 5. A serialization/de-serialization mechanism found in Axis1
> >>> seems
> >>> >>>>>>>>>> interesting as well.
> >>> >>>>>>>>>>   - test/soap12/TestDeser.java, test/soap12/TestSer.java
> >>> explains
> >>> >>>>>>>>>>
> >>> >>>>>>>>> this
> >>> >>>>>>>
> >>> >>>>>>>>  fact.
> >>> >>>>>>>>>>
> >>> >>>>>>>>>> In here, we have several advantages
> >>> >>>>>>>>>>   a. Uniform representation of any primitive type as well as
> >>> >>>>>>>>>>
> >>> >>>>>>>>> complex
> >>> >>>>>
> >>> >>>>>>  types
> >>> >>>>>>>>>
> >>> >>>>>>>>>> as composites of primitive types
> >>> >>>>>>>>>>   b. Good performance
> >>> >>>>>>>>>>   c. Ability to nest
> >>> >>>>>>>>>>   d. Highly customizable
> >>> >>>>>>>>>>
> >>> >>>>>>>>>> But, there are disadvantages
> >>> >>>>>>>>>>   a. This scheme is not capable of storing information about
> >>> the
> >>> >>>>>>>>>> underlying object unless it being explicitly told. Thus,
> unless
> >>> we
> >>> >>>>>>>>>>
> >>> >>>>>>>>> know
> >>> >>>>>>>
> >>> >>>>>>>> what
> >>> >>>>>>>>>
> >>> >>>>>>>>>> is going on, the Vector class or an extension of a Vector
> class
> >>> is
> >>> >>>>>>>>>> represented in the very same way. This is not the case in
> the
> >>> java
> >>> >>>>>>>>>> serializer mechanism as object type information is
> >>> automatically
> >>> >>>>>>>>>>
> >>> >>>>>>>>> encoded.
> >>> >>>>>>>
> >>> >>>>>>>>    b. Assume that we came up with a modification to this
> scheme
> >>> >>>>>>>>>>
> >>> >>>>>>>>> that
> >>> >>>>>
> >>> >>>>>>  makes
> >>> >>>>>>>>>
> >>> >>>>>>>>>> it possible to encode object types, still the implementor
> will
> >>> have
> >>> >>>>>>>>>>
> >>> >>>>>>>>> to
> >>> >>>>>
> >>> >>>>>>  perhaps write his own Type Table for a type that we did not
> >>> >>>>>>>>>>
> >>> >>>>>>>>> anticipate.
> >>> >>>>>>>
> >>> >>>>>>>>    c. Implementation can be complicated as the complexity of
> the
> >>> >>>>>>>>>>
> >>> >>>>>>>>> types
> >>> >>>>>
> >>> >>>>>> of
> >>> >>>>>>>
> >>> >>>>>>>>  objects representable increases
> >>> >>>>>>>>>>   d. Additional maintenance overhead
> >>> >>>>>>>>>>
> >>> >>>>>>>>>> Therefore, each scheme seem to have pros and cons, and are
> not
> >>> >>>>>>>>>>
> >>> >>>>>>>>> perfectly
> >>> >>>>>>>
> >>> >>>>>>>>  fitting in. IMHO, the Java serializer might be the best
> scheme
> >>> if
> >>> >>>>>>>>>>
> >>> >>>>>>>>> we
> >>> >>>>>
> >>> >>>>>> are
> >>> >>>>>>>
> >>> >>>>>>>> to
> >>> >>>>>>>>>
> >>> >>>>>>>>>> consider a single scheme. However, modifications to a
> certain
> >>> >>>>>>>>>>
> >>> >>>>>>>>> scheme
> >>> >>>>>
> >>> >>>>>> to
> >>> >>>>>>>
> >>> >>>>>>>> have
> >>> >>>>>>>>>
> >>> >>>>>>>>>> a combination of schemes to yield a useful result can prove
> to
> >>> be
> >>> >>>>>>>>>> advantages. Also, I might have missed some other
> possibilities.
> >>> >>>>>>>>>>
> >>> >>>>>>>>> Your
> >>> >>>>>
> >>> >>>>>>  input
> >>> >>>>>>>>>
> >>> >>>>>>>>>> is highly appreciated, and will serve as means for the
> approach
> >>> I
> >>> >>>>>>>>>>
> >>> >>>>>>>>> should
> >>> >>>>>>>
> >>> >>>>>>>> be
> >>> >>>>>>>>>
> >>> >>>>>>>>>> taking.
> >>> >>>>>>>>>>
> >>> >>>>>>>>>> The current implementation is not as yet a part of Axiom and
> is
> >>> >>>>>>>>>>
> >>> >>>>>>>>> available
> >>> >>>>>>>
> >>> >>>>>>>>  at, [3]. The source includes a maven build system, and please
> >>> note
> >>> >>>>>>>>>>
> >>> >>>>>>>>> that
> >>> >>>>>>>
> >>> >>>>>>>> if
> >>> >>>>>>>>>
> >>> >>>>>>>>>> you may run into some test failures due to an issue in the
> >>> Axiom
> >>> >>>>>>>>>>
> >>> >>>>>>>>> forceExpand
> >>> >>>>>>>>>
> >>> >>>>>>>>>> logic. I'm looking forward to have this fixed on the Axiom
> >>> trunk.
> >>> >>>>>>>>>>
> >>> >>>>>>>>>> [1]
> >>> >>>>>>>>>>
> >>> >>>>>>>>>>
> >>> >>>>>
> >>>
> http://svn.apache.org/repos/asf/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/XMLEncoder.java
> >>> >>>>>
> >>> >>>>>>  [2]
> >>> >>>>>>>>>>
> >>> >>>>>>>>>>
> >>> >>>>>
> >>>
> http://svn.apache.org/repos/asf/harmony/enhanced/classlib/trunk/modules/beans/src/main/java/java/beans/XMLDeccoder.java
> >>> >>>>>
> >>> >>>>>>  [3]
> http://sci-flex.googlecode.com/svn/sci-flex/trunk/java/axiom
> >>> >>>>>>>>>>
> >>> >>>>>>>>>> Thanks,
> >>> >>>>>>>>>> Senaka
> >>> >>>>>>>>>>
> >>> >>>>>>>>>>
> >>> >>
> >>> >> --
> >>> >> Sanjiva Weerawarana, Ph.D.
> >>> >> Founder & Director; Lanka Software Foundation;
> >>> http://www.opensource.lk/
> >>> >> Founder, Chairman & CEO; WSO2, Inc.; http://www.wso2.com/
> >>> >> Member; Apache Software Foundation; http://www.apache.org/
> >>> >> Visiting Lecturer; University of Moratuwa;
> http://www.cse.mrt.ac.lk/
> >>> >>
> >>> >> Blog: http://sanjiva.weerawarana.org/
> >>> >>
> >>> >
> >>>
> >>
> >>
> >
>

Reply via email to