Search in sources :

Example 1 with Struct

use of org.apache.qpid.server.protocol.v0_10.transport.Struct in project qpid-broker-j by apache.

the class MessageFormat_0_10 method convertToMessageFormat.

// format: <int header count> <headers> <body>
@Override
public QpidByteBuffer convertToMessageFormat(final MessageTransferMessage message) {
    ServerEncoder encoder = new ServerEncoder(4096, true);
    Struct[] structs = message.getHeader().getStructs();
    encoder.writeInt32(structs.length);
    for (Struct struct : structs) {
        encoder.writeStruct32(struct);
    }
    try (QpidByteBuffer headerBuf = encoder.getBuffer();
        QpidByteBuffer content = message.getContent()) {
        return QpidByteBuffer.concatenate(headerBuf, content);
    }
}
Also used : QpidByteBuffer(org.apache.qpid.server.bytebuffer.QpidByteBuffer) Struct(org.apache.qpid.server.protocol.v0_10.transport.Struct)

Example 2 with Struct

use of org.apache.qpid.server.protocol.v0_10.transport.Struct in project qpid-broker-j by apache.

the class MessageFormat_0_10 method createMessage.

@Override
public MessageTransferMessage createMessage(final QpidByteBuffer payload, final MessageStore store, final Object connectionReference) {
    try {
        ServerDecoder serverDecoder = new ServerDecoder(payload);
        int headerCount = serverDecoder.readInt32();
        DeliveryProperties deliveryProperties = null;
        MessageProperties messageProperties = null;
        List<Struct> nonStandard = null;
        for (int i = 0; i < headerCount; i++) {
            final Struct struct = serverDecoder.readStruct32();
            switch(struct.getStructType()) {
                case DeliveryProperties.TYPE:
                    deliveryProperties = (DeliveryProperties) struct;
                    break;
                case MessageProperties.TYPE:
                    messageProperties = (MessageProperties) struct;
                    break;
                default:
                    if (nonStandard == null) {
                        nonStandard = new ArrayList<>();
                    }
                    nonStandard.add(struct);
            }
        }
        Header header = new Header(deliveryProperties, messageProperties, nonStandard);
        MessageMetaData_0_10 metaData = new MessageMetaData_0_10(header, payload.remaining(), System.currentTimeMillis());
        final MessageHandle<MessageMetaData_0_10> handle = store.addMessage(metaData);
        handle.addContent(payload);
        final StoredMessage<MessageMetaData_0_10> storedMessage = handle.allContentAdded();
        return new MessageTransferMessage(storedMessage, connectionReference);
    } catch (BufferUnderflowException e) {
        throw new ConnectionScopedRuntimeException("Error parsing AMQP 0-10 message format", e);
    }
}
Also used : DeliveryProperties(org.apache.qpid.server.protocol.v0_10.transport.DeliveryProperties) Struct(org.apache.qpid.server.protocol.v0_10.transport.Struct) Header(org.apache.qpid.server.protocol.v0_10.transport.Header) MessageProperties(org.apache.qpid.server.protocol.v0_10.transport.MessageProperties) ConnectionScopedRuntimeException(org.apache.qpid.server.util.ConnectionScopedRuntimeException) BufferUnderflowException(java.nio.BufferUnderflowException)

Example 3 with Struct

use of org.apache.qpid.server.protocol.v0_10.transport.Struct in project qpid-broker-j by apache.

the class MessageMetaData_0_10 method getStorableSize.

@Override
public int getStorableSize() {
    int len = 0;
    // arrival time
    len += 8;
    // body size
    len += 4;
    // headers length
    len += 4;
    if (_header != null) {
        if (_header.getDeliveryProperties() != null) {
            len += EncoderUtils.getStruct32Length(_header.getDeliveryProperties());
        }
        if (_header.getMessageProperties() != null) {
            len += EncoderUtils.getStruct32Length(_header.getMessageProperties());
        }
        if (_header.getNonStandardProperties() != null) {
            for (Struct header : _header.getNonStandardProperties()) {
                len += EncoderUtils.getStruct32Length(header);
            }
        }
    }
    return len;
}
Also used : Struct(org.apache.qpid.server.protocol.v0_10.transport.Struct)

Example 4 with Struct

use of org.apache.qpid.server.protocol.v0_10.transport.Struct in project qpid-broker-j by apache.

the class MessageMetaData_0_10 method encodeAsBuffer.

private QpidByteBuffer encodeAsBuffer() {
    ServerEncoder encoder = new ServerEncoder(ENCODER_SIZE, false);
    encoder.writeInt64(_messageHeader.getArrivalTime());
    encoder.writeInt32(_bodySize);
    int headersLength = 0;
    if (_header != null) {
        if (_header.getDeliveryProperties() != null) {
            headersLength++;
        }
        if (_header.getMessageProperties() != null) {
            headersLength++;
        }
        if (_header.getNonStandardProperties() != null) {
            headersLength += _header.getNonStandardProperties().size();
        }
    }
    encoder.writeInt32(headersLength);
    if (_header != null) {
        if (_header.getDeliveryProperties() != null) {
            encoder.writeStruct32(_header.getDeliveryProperties());
        }
        if (_header.getMessageProperties() != null) {
            encoder.writeStruct32(_header.getMessageProperties());
        }
        if (_header.getNonStandardProperties() != null) {
            for (Struct header : _header.getNonStandardProperties()) {
                encoder.writeStruct32(header);
            }
        }
    }
    QpidByteBuffer buf = encoder.getBuffer();
    encoder.close();
    return buf;
}
Also used : QpidByteBuffer(org.apache.qpid.server.bytebuffer.QpidByteBuffer) Struct(org.apache.qpid.server.protocol.v0_10.transport.Struct)

Example 5 with Struct

use of org.apache.qpid.server.protocol.v0_10.transport.Struct in project qpid-broker-j by apache.

the class Assembler method assemble.

private void assemble(Frame frame, ByteBuffer segment) {
    BBDecoder dec = _decoder.get();
    dec.init(segment);
    int channel = frame.getChannel();
    Method command;
    switch(frame.getType()) {
        case CONTROL:
            int controlType = dec.readUint16();
            Method control = Method.create(controlType);
            control.read(dec);
            emit(channel, control);
            break;
        case COMMAND:
            int commandType = dec.readUint16();
            // read in the session header, right now we don't use it
            int hdr = dec.readUint16();
            command = Method.create(commandType);
            command.setSync((0x0001 & hdr) != 0);
            command.read(dec);
            if (command.hasPayload() && !frame.isLastSegment()) {
                setIncompleteCommand(channel, command);
            } else {
                emit(channel, command);
            }
            break;
        case HEADER:
            command = getIncompleteCommand(channel);
            List<Struct> structs = null;
            DeliveryProperties deliveryProps = null;
            MessageProperties messageProps = null;
            while (dec.hasRemaining()) {
                Struct struct = dec.readStruct32();
                if (struct instanceof DeliveryProperties && deliveryProps == null) {
                    deliveryProps = (DeliveryProperties) struct;
                } else if (struct instanceof MessageProperties && messageProps == null) {
                    messageProps = (MessageProperties) struct;
                } else {
                    if (structs == null) {
                        structs = new ArrayList<>(2);
                    }
                    structs.add(struct);
                }
            }
            command.setHeader(new Header(deliveryProps, messageProps, structs));
            if (frame.isLastSegment()) {
                setIncompleteCommand(channel, null);
                emit(channel, command);
            }
            break;
        case BODY:
            command = getIncompleteCommand(channel);
            command.setBody(QpidByteBuffer.wrap(segment));
            setIncompleteCommand(channel, null);
            emit(channel, command);
            break;
        default:
            throw new IllegalStateException("unknown frame type: " + frame.getType());
    }
    dec.releaseBuffer();
}
Also used : ProtocolHeader(org.apache.qpid.server.protocol.v0_10.transport.ProtocolHeader) Header(org.apache.qpid.server.protocol.v0_10.transport.Header) MessageProperties(org.apache.qpid.server.protocol.v0_10.transport.MessageProperties) ArrayList(java.util.ArrayList) Method(org.apache.qpid.server.protocol.v0_10.transport.Method) DeliveryProperties(org.apache.qpid.server.protocol.v0_10.transport.DeliveryProperties) BBDecoder(org.apache.qpid.server.protocol.v0_10.transport.BBDecoder) Struct(org.apache.qpid.server.protocol.v0_10.transport.Struct)

Aggregations

Struct (org.apache.qpid.server.protocol.v0_10.transport.Struct)8 Header (org.apache.qpid.server.protocol.v0_10.transport.Header)5 QpidByteBuffer (org.apache.qpid.server.bytebuffer.QpidByteBuffer)4 ProtocolHeader (org.apache.qpid.server.protocol.v0_10.transport.ProtocolHeader)4 DeliveryProperties (org.apache.qpid.server.protocol.v0_10.transport.DeliveryProperties)3 MessageProperties (org.apache.qpid.server.protocol.v0_10.transport.MessageProperties)3 ArrayList (java.util.ArrayList)2 Method (org.apache.qpid.server.protocol.v0_10.transport.Method)2 BufferUnderflowException (java.nio.BufferUnderflowException)1 ByteBuffer (java.nio.ByteBuffer)1 BBDecoder (org.apache.qpid.server.protocol.v0_10.transport.BBDecoder)1 BBEncoder (org.apache.qpid.server.protocol.v0_10.transport.BBEncoder)1 ConnectionScopedRuntimeException (org.apache.qpid.server.util.ConnectionScopedRuntimeException)1