Search in sources :

Example 1 with BBDecoder

use of org.apache.qpid.transport.codec.BBDecoder in project qpid by apache.

the class AMQPMessage method getList.

/**
     * JMS QMF returns amqp/list types as a BytesMessage this method decodes that into a java.util.List
     * <p>
     * Taken from Gordon Sim's initial JMS QMF Example using the BBDecoder
     * <p>
     * Trivia: This block of code from Gordon Sim is the seed that spawned the whole of this Java QMF2 API
     * implementation - cheers Gordon.
     *
     * @param message amqp/list encoded JMS Message
     * @return a java.util.List decoded from Message
     */
@SuppressWarnings("unchecked")
public static <T> List<T> getList(final Message message) throws JMSException {
    if (message == null) {
        throw new MessageFormatException("Attempting to do AMQPMessage.getList() on null Message");
    } else if (message instanceof BytesMessage) {
        BytesMessage msg = (BytesMessage) message;
        //only handles responses up to 2^31-1 bytes long
        byte[] data = new byte[(int) msg.getBodyLength()];
        msg.readBytes(data);
        BBDecoder decoder = new BBDecoder();
        decoder.init(ByteBuffer.wrap(data));
        return (List<T>) decoder.readList();
    } else if (message instanceof MapMessage) {
        /*
             * In Qpid version 0.20 instead of exposing amqp/list as a BytesMessage as above rather it is exposed
             * as a MapMessage!!??? the Object Keys are the indices into the List. We create a java.util.List
             * out of this by iterating through the getMapNames() Enumeration and copying the Objects into the List.
             * This amount of copying doesn't feel healthy and we can't even work out the capacity for the List
             * a priori, but I'm not sure of a better way at present. I can't say I much like how amqp/list or indeed
             * amqp/map are currently encoded. I'd *much* prefer to see them exposed as JMS ObjectMessage.
             */
        MapMessage msg = (MapMessage) message;
        // Initial capacity of 50, can we better estimate this?
        List resultList = new ArrayList(50);
        for (Enumeration e = msg.getMapNames(); e.hasMoreElements(); ) {
            String key = (String) e.nextElement();
            resultList.add(msg.getObject(key));
        }
        return resultList;
    } else {
        return null;
    }
}
Also used : MessageFormatException(javax.jms.MessageFormatException) Enumeration(java.util.Enumeration) MapMessage(javax.jms.MapMessage) ArrayList(java.util.ArrayList) BytesMessage(javax.jms.BytesMessage) ArrayList(java.util.ArrayList) List(java.util.List) BBDecoder(org.apache.qpid.transport.codec.BBDecoder)

Aggregations

ArrayList (java.util.ArrayList)1 Enumeration (java.util.Enumeration)1 List (java.util.List)1 BytesMessage (javax.jms.BytesMessage)1 MapMessage (javax.jms.MapMessage)1 MessageFormatException (javax.jms.MessageFormatException)1 BBDecoder (org.apache.qpid.transport.codec.BBDecoder)1