/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.activemq.artemis.protocol.amqp.converter.jms;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import java.util.Collections;
import java.util.Enumeration;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.jms.client.ActiveMQDestination;
import org.apache.activemq.artemis.reader.MessageUtil;
import static org.apache.activemq.artemis.api.core.FilterConstants.NATIVE_MESSAGE_ID;
import static org.apache.activemq.artemis.api.core.Message.BYTES_TYPE;
import static org.apache.activemq.artemis.api.core.Message.MAP_TYPE;
import static org.apache.activemq.artemis.api.core.Message.OBJECT_TYPE;
import static org.apache.activemq.artemis.api.core.Message.STREAM_TYPE;
import static org.apache.activemq.artemis.api.core.Message.TEXT_TYPE;
public class ServerJMSMessage implements Message {
protected final ICoreMessage message;
private ActiveMQBuffer readBodyBuffer;
public ServerJMSMessage(ICoreMessage message) {
this.message = message;
}
public static ServerJMSMessage wrapCoreMessage(ICoreMessage wrapped) {
switch (wrapped.getType()) {
case STREAM_TYPE:
return new ServerJMSStreamMessage(wrapped);
case BYTES_TYPE:
return new ServerJMSBytesMessage(wrapped);
case MAP_TYPE:
return new ServerJMSMapMessage(wrapped);
case TEXT_TYPE:
return new ServerJMSTextMessage(wrapped);
case OBJECT_TYPE:
return new ServerJMSObjectMessage(wrapped);
default:
return new ServerJMSMessage(wrapped);
}
}
public ICoreMessage getInnerMessage() {
return message;
}
/**
* When reading we use a protected copy so multi-threads can work fine
*/
protected ActiveMQBuffer getReadBodyBuffer() {
if (readBodyBuffer == null) {
// to avoid clashes between multiple threads
readBodyBuffer = message.getReadOnlyBodyBuffer();
}
return readBodyBuffer;
}
/**
* When writing on the conversion we use the buffer directly
*/
protected ActiveMQBuffer getWriteBodyBuffer() {
readBodyBuffer = null; // it invalidates this buffer if anything is written
return message.getBodyBuffer();
}
@Override
public final String getJMSMessageID() throws JMSException {
if (message.containsProperty(NATIVE_MESSAGE_ID)) {
return getStringProperty(NATIVE_MESSAGE_ID);
}
return null;
}
@Override
public final void setJMSMessageID(String id) throws JMSException {
if (id != null) {
message.putStringProperty(NATIVE_MESSAGE_ID, id);
}
}
@Override
public final long getJMSTimestamp() throws JMSException {
return message.getTimestamp();
}
@Override
public final void setJMSTimestamp(long timestamp) throws JMSException {
message.setTimestamp(timestamp);
}
@Override
public final byte[] getJMSCorrelationIDAsBytes() throws JMSException {
return MessageUtil.getJMSCorrelationIDAsBytes(message);
}
@Override
public final void setJMSCorrelationIDAsBytes(byte[] correlationID) throws JMSException {
try {
MessageUtil.setJMSCorrelationIDAsBytes(message, correlationID);
} catch (ActiveMQException e) {
throw new JMSException(e.getMessage());
}
}
@Override
public final String getJMSCorrelationID() throws JMSException {
return MessageUtil.getJMSCorrelationID(message);
}
@Override
public final void setJMSCorrelationID(String correlationID) throws JMSException {
MessageUtil.setJMSCorrelationID(message, correlationID);
}
@Override
public final Destination getJMSReplyTo() throws JMSException {
SimpleString reply = MessageUtil.getJMSReplyTo(message);
if (reply != null) {
return new ServerDestination(reply.toString());
} else {
return null;
}
}
@Override
public final void setJMSReplyTo(Destination replyTo) throws JMSException {
MessageUtil.setJMSReplyTo(message, replyTo == null ? null : ((ActiveMQDestination) replyTo).getSimpleAddress());
}
@Override
public final Destination getJMSDestination() throws JMSException {
SimpleString sdest = message.getAddressSimpleString();
if (sdest == null) {
return null;
} else {
return new ServerDestination(sdest.toString());
}
}
@Override
public final void setJMSDestination(Destination destination) throws JMSException {
if (destination == null) {
message.setAddress((SimpleString)null);
} else {
message.setAddress(((ActiveMQDestination) destination).getSimpleAddress());
}
}
@Override
public final int getJMSDeliveryMode() throws JMSException {
return message.isDurable() ? DeliveryMode.PERSISTENT : DeliveryMode.NON_PERSISTENT;
}
@Override
public final void setJMSDeliveryMode(int deliveryMode) throws JMSException {
if (deliveryMode == DeliveryMode.PERSISTENT) {
message.setDurable(true);
} else if (deliveryMode == DeliveryMode.NON_PERSISTENT) {
message.setDurable(false);
} else {
throw new JMSException("Invalid mode " + deliveryMode);
}
}
@Override
public final boolean getJMSRedelivered() throws JMSException {
return false;
}
@Override
public final void setJMSRedelivered(boolean redelivered) throws JMSException {
// no op
}
@Override
public final String getJMSType() throws JMSException {
return MessageUtil.getJMSType(message);
}
@Override
public final void setJMSType(String type) throws JMSException {
MessageUtil.setJMSType(message, type);
}
@Override
public final long getJMSExpiration() throws JMSException {
return message.getExpiration();
}
@Override
public final void setJMSExpiration(long expiration) throws JMSException {
message.setExpiration(expiration);
}
@Override
public final long getJMSDeliveryTime() throws JMSException {
// no op
return 0;
}
@Override
public final void setJMSDeliveryTime(long deliveryTime) throws JMSException {
// no op
}
@Override
public final int getJMSPriority() throws JMSException {
return message.getPriority();
}
@Override
public final void setJMSPriority(int priority) throws JMSException {
message.setPriority((byte) priority);
}
@Override
public final void clearProperties() throws JMSException {
MessageUtil.clearProperties(message);
}
@Override
public final boolean propertyExists(String name) throws JMSException {
return MessageUtil.propertyExists(message, name);
}
@Override
public final boolean getBooleanProperty(String name) throws JMSException {
return message.getBooleanProperty(name);
}
@Override
public final byte getByteProperty(String name) throws JMSException {
return message.getByteProperty(name);
}
@Override
public final short getShortProperty(String name) throws JMSException {
return message.getShortProperty(name);
}
@Override
public final int getIntProperty(String name) throws JMSException {
return message.getIntProperty(name);
}
@Override
public final long getLongProperty(String name) throws JMSException {
return message.getLongProperty(name);
}
@Override
public final float getFloatProperty(String name) throws JMSException {
return message.getFloatProperty(name);
}
@Override
public final double getDoubleProperty(String name) throws JMSException {
return message.getDoubleProperty(name);
}
@Override
public final String getStringProperty(String name) throws JMSException {
return message.getStringProperty(name);
}
@Override
public final Object getObjectProperty(String name) throws JMSException {
Object val = message.getObjectProperty(name);
if (val instanceof SimpleString) {
val = ((SimpleString) val).toString();
}
return val;
}
@Override
public final Enumeration getPropertyNames() throws JMSException {
return Collections.enumeration(MessageUtil.getPropertyNames(message));
}
@Override
public final void setBooleanProperty(String name, boolean value) throws JMSException {
message.putBooleanProperty(name, value);
}
@Override
public final void setByteProperty(String name, byte value) throws JMSException {
message.putByteProperty(name, value);
}
@Override
public final void setShortProperty(String name, short value) throws JMSException {
message.putShortProperty(name, value);
}
@Override
public final void setIntProperty(String name, int value) throws JMSException {
message.putIntProperty(name, value);
}
@Override
public final void setLongProperty(String name, long value) throws JMSException {
message.putLongProperty(name, value);
}
@Override
public final void setFloatProperty(String name, float value) throws JMSException {
message.putFloatProperty(name, value);
}
@Override
public final void setDoubleProperty(String name, double value) throws JMSException {
message.putDoubleProperty(name, value);
}
@Override
public final void setStringProperty(String name, String value) throws JMSException {
message.putStringProperty(name, value);
}
@Override
public final void setObjectProperty(String name, Object value) throws JMSException {
message.putObjectProperty(name, value);
}
@Override
public final void acknowledge() throws JMSException {
// no op
}
@Override
public void clearBody() throws JMSException {
message.getBodyBuffer().clear();
}
@Override
public final <T> T getBody(Class<T> c) throws JMSException {
// no op.. jms2 not used on the conversion
return null;
}
/**
* Encode the body into the internal message
*/
public void encode() throws Exception {
message.getBodyBuffer().resetReaderIndex();
}
public void decode() throws Exception {
message.getBodyBuffer().resetReaderIndex();
}
@Override
public final boolean isBodyAssignableTo(Class c) throws JMSException {
// no op.. jms2 not used on the conversion
return false;
}
}