Hi Alan,

you can use the java Encoder/Decoders directly like this:

import org.apache.qpid.proton.codec.EncoderImpl;
import org.apache.qpid.proton.codec.DeccoderImpl;

...


        ByteBuffer buf = ByteBuffer.allocate(2048);

        DecoderImpl decoder = new DecoderImpl();
        EncoderImpl encoder = new EncoderImpl(buf, decoder);

        // write an array of 12 (false) booleans
        boolean[] o = new boolean[12];
        encoder.writeObject(o);

        // buf will now contain the encoded data, call flip() to move
position to 0,
        // limit end of encoded data
        buf.flip();


        // now read the encoded bytes

        decoder.setByteBuffer(buf);

        Object read = decoder.readObject();


...


Note that you need to set up both the encoder and the decoder even if
you only wish to use one (they are sort of co-dependent in a horrible
way that should be fixed some time).

There are defined types for all of the AMQP types... Described types
are a little more involved.. you can set the codec up to automatically
convert to the right Java class for a given described type.

-- Rob


On 15 February 2013 16:42, Alan Conway <acon...@redhat.com> wrote:
>
> On Fri, 2013-02-15 at 09:12 -0500, Rafael Schloming wrote:
> > On Thu, Feb 14, 2013 at 5:44 PM, Alan Conway <acon...@redhat.com> wrote:
> >
> > > I'm looking (in python first) to encode messages that contain all the
> > > different AMQP types. So far I was using the Data class to construct
> > > different AMQP data fragments. However I'd like to move towards using a
> > > map message as it's more widely decodable. So my question: how do I
> > > create a map message that contains specific AMQP types?  I.e. I want to
> > > differentiate between shorts, ints and longs, between symbols and
> > > strings etc. Just setting message.body = Data(...) does not work,
> > > message wants to have a python dict or list as a body.
> > >
> >
> > For the python binding I've defined the following classes to cover types
> > that python doesn't natively support:
> >
> > class UnmappedType
> > class ulong(long)
> > class timestamp(long)
> > class symbol(unicode)
> > class char(unicode)
> > class Described(object)
> > UNDESCRIBED = Constant("UNDESCRIBED")
> > class Array(object)
> >
> > So you should just be able to do:
> >
> > message.body = {u"ulong": ulong(1234), u"char": char(u"\u1234"),
> > u"timestamp": timestamp(12345678), u"described-string":
> > Described(symbol("url-descriptor"), u"http://blah";), u"array":
> > Array(UNDESCRIBED, Data.INT, 1, 2, 3, 4), u"described-array":
> > Array(symbol("url-descriptor"), u"http://blah1";, u"http://blah2";)}
> >
> > --Rafael
>
> I'm all good with the python binding. Now I'm trying to figure out what
> to do with Java (JNI and native), and soon with perl, php and ruby.
>
> For Java JNI I can use the Data object the same way I did in python, but
> Java native is a different story. In the jython test, all the codec test
> functions just throw unsupported-operation in the proton-j profile.
>
> proton_tests.codec.DataTest.testBinary .................................. skip
>   ProtonUnsupportedOperationException:
> org.apache.qpid.proton.ProtonUnsupportedOperationException
>
> So I'm not sure how/if I can express AMQP types in proton-j.
>
> Cheers,
> Alan.
>

Reply via email to