You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kp...@apache.org on 2013/10/22 00:05:07 UTC
svn commit: r1534394 [11/22] - in /qpid/branches/linearstore/qpid: ./ cpp/
cpp/bindings/qmf2/examples/python/ cpp/bindings/qmf2/python/
cpp/bindings/qpid/dotnet/ cpp/etc/ cpp/examples/ cpp/examples/messaging/
cpp/examples/qmf-agent/ cpp/include/qpid/ c...
Modified: qpid/branches/linearstore/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageImpl.java
URL: http://svn.apache.org/viewvc/qpid/branches/linearstore/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageImpl.java?rev=1534394&r1=1534393&r2=1534394&view=diff
==============================================================================
--- qpid/branches/linearstore/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageImpl.java (original)
+++ qpid/branches/linearstore/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageImpl.java Mon Oct 21 22:04:51 2013
@@ -1,1332 +1,1353 @@
-/*
- *
- * 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.qpid.amqp_1_0.jms.impl;
-
-import org.apache.qpid.amqp_1_0.jms.Message;
-import org.apache.qpid.amqp_1_0.messaging.MessageAttributes;
-import org.apache.qpid.amqp_1_0.type.Binary;
-import org.apache.qpid.amqp_1_0.type.Section;
-import org.apache.qpid.amqp_1_0.type.Symbol;
-import org.apache.qpid.amqp_1_0.type.UnsignedByte;
-import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
-import org.apache.qpid.amqp_1_0.type.UnsignedLong;
-import org.apache.qpid.amqp_1_0.type.UnsignedShort;
-import org.apache.qpid.amqp_1_0.type.messaging.ApplicationProperties;
-import org.apache.qpid.amqp_1_0.type.messaging.Footer;
-import org.apache.qpid.amqp_1_0.type.messaging.Header;
-import org.apache.qpid.amqp_1_0.type.messaging.MessageAnnotations;
-import org.apache.qpid.amqp_1_0.type.messaging.Properties;
-
-import javax.jms.DeliveryMode;
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.MessageFormatException;
-import javax.jms.MessageNotReadableException;
-import javax.jms.MessageNotWriteableException;
-import java.nio.charset.Charset;
-import java.util.*;
-
-public abstract class MessageImpl implements Message
-{
- static final Set<Class> _supportedClasses =
- new HashSet<Class>(Arrays.asList(Boolean.class, Byte.class, Short.class, Integer.class, Long.class,
- Float.class, Double.class, Character.class, String.class, byte[].class));
- static final Symbol JMS_TYPE = Symbol.valueOf("x-opt-jms-type");
- static final Symbol TO_TYPE = Symbol.valueOf("x-opt-to-type");
- static final Symbol REPLY_TO_TYPE = Symbol.valueOf("x-opt-reply-type");
-
- static final String QUEUE_ATTRIBUTE = "queue";
- static final String TOPIC_ATTRIBUTE = "topic";
- static final String TEMPORARY_ATTRIBUTE = "temporary";
-
- static final Set<String> JMS_QUEUE_ATTRIBUTES = set(QUEUE_ATTRIBUTE);
- static final Set<String> JMS_TOPIC_ATTRIBUTES = set(TOPIC_ATTRIBUTE);
- static final Set<String> JMS_TEMP_QUEUE_ATTRIBUTES = set(QUEUE_ATTRIBUTE, TEMPORARY_ATTRIBUTE);
- static final Set<String> JMS_TEMP_TOPIC_ATTRIBUTES = set(TOPIC_ATTRIBUTE, TEMPORARY_ATTRIBUTE);
-
- private Header _header;
- private Properties _properties;
- private ApplicationProperties _applicationProperties;
- private Footer _footer;
- private final SessionImpl _sessionImpl;
- private boolean _readOnly;
- private MessageAnnotations _messageAnnotations;
-
- private boolean _isFromQueue;
- private boolean _isFromTopic;
- private long _expiration;
-
- protected MessageImpl(Header header,
- MessageAnnotations messageAnnotations,
- Properties properties,
- ApplicationProperties appProperties,
- Footer footer,
- SessionImpl session)
- {
- _header = header == null ? new Header() : header;
- _properties = properties == null ? new Properties() : properties;
- _messageAnnotations = messageAnnotations == null ? new MessageAnnotations(new HashMap()) : messageAnnotations;
- _footer = footer == null ? new Footer(Collections.EMPTY_MAP) : footer;
- _applicationProperties = appProperties == null ? new ApplicationProperties(new HashMap()) : appProperties;
- _sessionImpl = session;
- }
-
- public String getJMSMessageID() throws JMSException
- {
- Object messageId = getMessageId();
-
- return messageId == null ? null : "ID:"+messageId.toString();
- }
-
- public void setJMSMessageID(String messageId) throws InvalidJMSMEssageIdException
- {
- if(messageId == null)
- {
- setMessageId(null);
- }
- else if(messageId.startsWith("ID:"))
- {
- setMessageId(messageId.substring(3));
- }
- else
- {
- throw new InvalidJMSMEssageIdException(messageId);
- }
- }
-
- public long getJMSTimestamp() throws JMSException
- {
- Date transmitTime = getTransmitTime();
- return transmitTime == null ? 0 : transmitTime.getTime();
- }
-
- public void setJMSTimestamp(long l) throws JMSException
- {
- setTransmitTime(new Date(l));
- if(_expiration != 0l)
- {
- setTtl(UnsignedInteger.valueOf(_expiration-getTransmitTime().getTime()));
- }
- }
-
- public byte[] getJMSCorrelationIDAsBytes() throws JMSException
- {
-
- Object o = getCorrelationId();
- if(o instanceof Binary)
- {
- Binary correlationIdBinary = (Binary) o;
- byte[] correlationId = new byte[correlationIdBinary.getLength()];
- correlationIdBinary.asByteBuffer().get(correlationId);
- return correlationId;
- }
- else
- {
- return o == null ? null : o.toString().getBytes();
- }
-
- }
-
- public void setJMSCorrelationIDAsBytes(byte[] correlationId) throws JMSException
- {
- if(correlationId == null)
- {
- setCorrelationId(null);
- }
- else
- {
- byte[] dup = new byte[correlationId.length];
- System.arraycopy(correlationId,0,dup,0,correlationId.length);
- setCorrelationId(new Binary(dup));
- }
- }
-
- public void setJMSCorrelationID(String s) throws JMSException
- {
- getProperties().setCorrelationId(s);
- }
-
- public String getJMSCorrelationID() throws JMSException
- {
- Object o = getProperties().getCorrelationId();
- if(o instanceof Binary)
- {
- Binary id = (Binary) o;
- return new String(id.getArray(), id.getArrayOffset(), id.getLength());
- }
- else
- {
- return o == null ? null : o.toString();
- }
- }
-
- public DestinationImpl getJMSReplyTo() throws JMSException
- {
- return toDestination(getReplyTo(), splitCommaSeparateSet((String) getMessageAnnotation(REPLY_TO_TYPE)));
- }
-
- public void setJMSReplyTo(Destination destination) throws NonAMQPDestinationException
- {
- if( destination==null )
- {
- setReplyTo(null);
- messageAnnotationMap().remove(REPLY_TO_TYPE);
- }
- else
- {
- DecodedDestination dd = toDecodedDestination(destination);
- setReplyTo(dd.getAddress());
- messageAnnotationMap().put(REPLY_TO_TYPE, join(",", dd.getAttributes()));
- }
- }
-
- public DestinationImpl getJMSDestination() throws JMSException
- {
- Set<String> type = splitCommaSeparateSet((String) getMessageAnnotation(TO_TYPE));
- if( type==null )
- {
- if( _isFromQueue )
- {
- type = JMS_QUEUE_ATTRIBUTES;
- }
- else if( _isFromTopic )
- {
- type = JMS_TOPIC_ATTRIBUTES;
- }
- }
- return toDestination(getTo(), type);
- }
-
- public void setJMSDestination(Destination destination) throws NonAMQPDestinationException
- {
- if( destination==null )
- {
- setTo(null);
- messageAnnotationMap().remove(TO_TYPE);
- }
- else
- {
- DecodedDestination dd = toDecodedDestination(destination);
- setTo(dd.getAddress());
- messageAnnotationMap().put(TO_TYPE, join(",", dd.getAttributes()));
- }
- }
-
- public int getJMSDeliveryMode() throws JMSException
- {
- if(Boolean.FALSE.equals(getDurable()))
- {
- return DeliveryMode.NON_PERSISTENT;
- }
- else
- {
- return DeliveryMode.PERSISTENT;
- }
- }
-
- public void setJMSDeliveryMode(int deliveryMode) throws JMSException
- {
- switch(deliveryMode)
- {
- case DeliveryMode.NON_PERSISTENT:
- setDurable(false);
- break;
- case DeliveryMode.PERSISTENT:
- setDurable(true);
- break;
- default:
- //TODO
- }
- }
-
- public boolean getJMSRedelivered()
- {
- UnsignedInteger failures = getDeliveryFailures();
- return failures != null && (failures.intValue() != 0);
- }
-
- public void setJMSRedelivered(boolean redelivered)
- {
- UnsignedInteger failures = getDeliveryFailures();
- if(redelivered)
- {
- if(failures == null || UnsignedInteger.ZERO.equals(failures))
- {
- setDeliveryFailures(UnsignedInteger.ONE);
- }
- }
- else
- {
- setDeliveryFailures(null);
- }
- }
-
- public String getJMSType() throws JMSException
- {
- final Object attrValue = getMessageAnnotation(JMS_TYPE);
- return attrValue instanceof String ? attrValue.toString() : null;
- }
-
- public void setJMSType(String s) throws JMSException
- {
- messageAnnotationMap().put(JMS_TYPE, s);
- }
-
- public long getJMSExpiration() throws JMSException
- {
- final UnsignedInteger ttl = getTtl();
- return ttl == null || ttl.longValue() == 0 ? 0 : getJMSTimestamp() + ttl.longValue();
- }
-
- public void setJMSExpiration(long l) throws JMSException
- {
- _expiration = l;
- if(l == 0)
- {
- setTtl(UnsignedInteger.ZERO);
- }
- else
- {
- if(getTransmitTime() == null)
- {
- setTransmitTime(new Date());
- }
- setTtl(UnsignedInteger.valueOf(l - getTransmitTime().getTime()));
- }
- }
-
- public int getJMSPriority() throws JMSException
- {
- UnsignedByte priority = getPriority();
- return priority == null ? DEFAULT_PRIORITY : priority.intValue();
- }
-
- public void setJMSPriority(int i) throws InvalidJMSPriorityException
- {
- if(i >= 0 && i <= 255)
- {
- setPriority(UnsignedByte.valueOf((byte)i));
- }
- else
- {
- throw new InvalidJMSPriorityException(i);
- }
- }
-
- public void clearProperties() throws JMSException
- {
- _applicationProperties.getValue().clear();
- }
-
- public boolean propertyExists(final String s) throws JMSException
- {
- return propertyExists((Object) s);
- }
-
- public boolean getBooleanProperty(final String s) throws JMSException
- {
- return getBooleanProperty((Object) s);
- }
-
- public byte getByteProperty(final String s) throws JMSException
- {
- return getByteProperty((Object)s);
- }
-
- public short getShortProperty(final String s) throws JMSException
- {
- return getShortProperty((Object)s);
- }
-
- public int getIntProperty(final String s) throws JMSException
- {
- return getIntProperty((Object)s);
- }
-
- public long getLongProperty(final String s) throws JMSException
- {
- return getLongProperty((Object)s);
- }
-
- public float getFloatProperty(final String s) throws JMSException
- {
- return getFloatProperty((Object)s);
- }
-
- public double getDoubleProperty(final String s) throws JMSException
- {
- return getDoubleProperty((Object)s);
- }
-
- public String getStringProperty(final String s) throws JMSException
- {
- return getStringProperty((Object)s);
- }
-
- public Object getObjectProperty(final String s) throws JMSException
- {
- return getObjectProperty((Object)s);
- }
-
- public boolean propertyExists(Object name) throws JMSException
- {
- return _applicationProperties.getValue().containsKey(name);
- }
-
- public boolean getBooleanProperty(Object name) throws JMSException
- {
-
- Object value = getProperty(name);
-
- if (value instanceof Boolean)
- {
- return ((Boolean) value).booleanValue();
- }
- else if ((value instanceof String) || (value == null))
- {
- return Boolean.valueOf((String) value);
- }
- else
- {
- throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
- + " cannot be converted to boolean.");
- }
- }
-
- public byte getByteProperty(Object name) throws JMSException
- {
- Object value = getProperty(name);
-
- if (value instanceof Byte)
- {
- return ((Byte) value).byteValue();
- }
- else if ((value instanceof String) || (value == null))
- {
- return Byte.valueOf((String) value).byteValue();
- }
- else
- {
- throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
- + " cannot be converted to byte.");
- }
- }
-
- public short getShortProperty(Object name) throws JMSException
- {
- Object value = getProperty(name);
-
- if (value instanceof Short)
- {
- return ((Short) value).shortValue();
- }
- else if (value instanceof Byte)
- {
- return ((Byte) value).shortValue();
- }
- else if ((value instanceof String) || (value == null))
- {
- return Short.valueOf((String) value).shortValue();
- }
- else
- {
- throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
- + " cannot be converted to short.");
- }
- }
-
- private Object getProperty(final Object name)
- {
- return _applicationProperties.getValue().get(name);
- }
-
- public int getIntProperty(Object name) throws JMSException
- {
- Object value = getProperty(name);
-
- if (value instanceof Integer)
- {
- return ((Integer) value).intValue();
- }
- else if (value instanceof Short)
- {
- return ((Short) value).intValue();
- }
- else if (value instanceof Byte)
- {
- return ((Byte) value).intValue();
- }
- else if ((value instanceof String) || (value == null))
- {
- return Integer.valueOf((String) value).intValue();
- }
- else
- {
- throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
- + " cannot be converted to int.");
- }
- }
-
- public long getLongProperty(Object name) throws JMSException
- {
- Object value = getProperty(name);
-
- if (value instanceof Long)
- {
- return ((Long) value).longValue();
- }
- else if (value instanceof Integer)
- {
- return ((Integer) value).longValue();
- }
-
- if (value instanceof Short)
- {
- return ((Short) value).longValue();
- }
-
- if (value instanceof Byte)
- {
- return ((Byte) value).longValue();
- }
- else if ((value instanceof String) || (value == null))
- {
- return Long.valueOf((String) value).longValue();
- }
- else
- {
- throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
- + " cannot be converted to long.");
- }
- }
-
- public float getFloatProperty(Object name) throws JMSException
- {
- Object value = getProperty(name);
-
- if (value instanceof Float)
- {
- return ((Float) value).floatValue();
- }
- else if ((value instanceof String) || (value == null))
- {
- return Float.valueOf((String) value).floatValue();
- }
- else
- {
- throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
- + " cannot be converted to float.");
- }
- }
-
- public double getDoubleProperty(Object name) throws JMSException
- {
- Object value = getProperty(name);
-
- if (value instanceof Double)
- {
- return ((Double) value).doubleValue();
- }
- else if (value instanceof Float)
- {
- return ((Float) value).doubleValue();
- }
- else if ((value instanceof String) || (value == null))
- {
- return Double.valueOf((String) value).doubleValue();
- }
- else
- {
- throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
- + " cannot be converted to double.");
- }
- }
-
- public String getStringProperty(Object name) throws JMSException
- {
- Object value = getProperty(name);
-
- if ((value instanceof String) || (value == null))
- {
- return (String) value;
- }
- else if (value instanceof byte[])
- {
- throw new MessageFormatException("Property " + name + " of type byte[] " + "cannot be converted to String.");
- }
- else
- {
- return value.toString();
- }
- }
-
- public Object getObjectProperty(Object name) throws JMSException
- {
- return getProperty(name);
- }
-
- public List<Object> getListProperty(final Object name) throws JMSException
- {
- Object value = getProperty(name);
- if(value instanceof List || value == null)
- {
- return (List<Object>)value;
- }
- else
- {
- throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
- + " cannot be converted to List.");
- }
- }
-
- public Map<Object, Object> getMapProperty(final Object name) throws JMSException
- {
- Object value = getProperty(name);
- if(value instanceof Map || value == null)
- {
- return (Map<Object,Object>)value;
- }
- else
- {
- throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
- + " cannot be converted to Map.");
- }
- }
-
- public UnsignedByte getUnsignedByteProperty(final Object name) throws JMSException
- {
- Object value = getProperty(name);
-
- if (value instanceof UnsignedByte)
- {
- return (UnsignedByte) value;
- }
- else if ((value instanceof String) || (value == null))
- {
- return UnsignedByte.valueOf((String) value);
- }
- else
- {
- throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
- + " cannot be converted to UnsignedByte.");
- }
- }
-
- public UnsignedShort getUnsignedShortProperty(final Object name) throws JMSException
- {
- Object value = getProperty(name);
-
- if (value instanceof UnsignedShort)
- {
- return (UnsignedShort) value;
- }
- else if (value instanceof UnsignedByte)
- {
- return UnsignedShort.valueOf(((UnsignedByte)value).shortValue());
- }
- else if ((value instanceof String) || (value == null))
- {
- return UnsignedShort.valueOf((String) value);
- }
- else
- {
- throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
- + " cannot be converted to UnsignedShort.");
- }
- }
-
- public UnsignedInteger getUnsignedIntProperty(final Object name) throws JMSException
- {
- Object value = getProperty(name);
-
- if (value instanceof UnsignedInteger)
- {
- return (UnsignedInteger) value;
- }
- else if (value instanceof UnsignedByte)
- {
- return UnsignedInteger.valueOf(((UnsignedByte)value).intValue());
- }
- else if (value instanceof UnsignedShort)
- {
- return UnsignedInteger.valueOf(((UnsignedShort)value).intValue());
- }
- else if ((value instanceof String) || (value == null))
- {
- return UnsignedInteger.valueOf((String) value);
- }
- else
- {
- throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
- + " cannot be converted to UnsignedShort.");
- }
- }
-
- public UnsignedLong getUnsignedLongProperty(final Object name) throws JMSException
- {
- Object value = getProperty(name);
-
- if (value instanceof UnsignedLong)
- {
- return (UnsignedLong) value;
- }
- else if (value instanceof UnsignedByte)
- {
- return UnsignedLong.valueOf(((UnsignedByte)value).longValue());
- }
- else if (value instanceof UnsignedShort)
- {
- return UnsignedLong.valueOf(((UnsignedShort)value).longValue());
- }
- else if (value instanceof UnsignedInteger)
- {
- return UnsignedLong.valueOf(((UnsignedInteger)value).longValue());
- }
- else if ((value instanceof String) || (value == null))
- {
- return UnsignedLong.valueOf((String) value);
- }
- else
- {
- throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
- + " cannot be converted to UnsignedShort.");
- }
- }
-
- public Enumeration getPropertyNames() throws JMSException
- {
- final Collection<String> names = new ArrayList<String>();
- for(Object key : _applicationProperties.getValue().keySet())
- {
- if(key instanceof String)
- {
- names.add((String)key);
- }
- }
- return Collections.enumeration(names);
- }
-
- public void setBooleanProperty(final String s, final boolean b) throws JMSException
- {
- checkWritable();
- checkPropertyName(s);
- setBooleanProperty((Object)s, b);
- }
-
- protected void checkPropertyName(CharSequence propertyName)
- {
- if (propertyName == null)
- {
- throw new IllegalArgumentException("Property name must not be null");
- }
- else if (propertyName.length() == 0)
- {
- throw new IllegalArgumentException("Property name must not be the empty string");
- }
-
- checkIdentiferFormat(propertyName);
- }
-
- protected void checkIdentiferFormat(CharSequence propertyName)
- {
-// JMS requirements 3.5.1 Property Names
-// Identifiers:
-// - An identifier is an unlimited-length character sequence that must begin
-// with a Java identifier start character; all following characters must be Java
-// identifier part characters. An identifier start character is any character for
-// which the method Character.isJavaIdentifierStart returns true. This includes
-// '_' and '$'. An identifier part character is any character for which the
-// method Character.isJavaIdentifierPart returns true.
-// - Identifiers cannot be the names NULL, TRUE, or FALSE.
-// Identifiers cannot be NOT, AND, OR, BETWEEN, LIKE, IN, IS, or
-// ESCAPE.
-// Identifiers are either header field references or property references. The
-// type of a property value in a message selector corresponds to the type
-// used to set the property. If a property that does not exist in a message is
-// referenced, its value is NULL. The semantics of evaluating NULL values
-// in a selector are described in Section 3.8.1.2, Null Values.
-// The conversions that apply to the get methods for properties do not
-// apply when a property is used in a message selector expression. For
-// example, suppose you set a property as a string value, as in the
-// following:
-// myMessage.setStringProperty("NumberOfOrders", "2")
-// The following expression in a message selector would evaluate to false,
-// because a string cannot be used in an arithmetic expression:
-// "NumberOfOrders > 1"
-// Identifiers are case sensitive.
-// Message header field references are restricted to JMSDeliveryMode,
-// JMSPriority, JMSMessageID, JMSTimestamp, JMSCorrelationID, and
-// JMSType. JMSMessageID, JMSCorrelationID, and JMSType values may be
-// null and if so are treated as a NULL value.
-
- // JMS start character
- if (!(Character.isJavaIdentifierStart(propertyName.charAt(0))))
- {
- throw new IllegalArgumentException("Identifier '" + propertyName + "' does not start with a valid JMS identifier start character");
- }
-
- // JMS part character
- int length = propertyName.length();
- for (int c = 1; c < length; c++)
- {
- if (!(Character.isJavaIdentifierPart(propertyName.charAt(c))))
- {
- throw new IllegalArgumentException("Identifier '" + propertyName + "' contains an invalid JMS identifier character");
- }
- }
-
- // JMS invalid names
- if ((propertyName.equals("NULL")
- || propertyName.equals("TRUE")
- || propertyName.equals("FALSE")
- || propertyName.equals("NOT")
- || propertyName.equals("AND")
- || propertyName.equals("OR")
- || propertyName.equals("BETWEEN")
- || propertyName.equals("LIKE")
- || propertyName.equals("IN")
- || propertyName.equals("IS")
- || propertyName.equals("ESCAPE")))
- {
- throw new IllegalArgumentException("Identifier '" + propertyName + "' is not allowed in JMS");
- }
-
- }
-
- public void setByteProperty(final String s, final byte b) throws JMSException
- {
- checkWritable();
- checkPropertyName(s);
-
- setByteProperty((Object)s, b);
- }
-
- public void setShortProperty(final String s, final short i) throws JMSException
- {
- checkWritable();
- checkPropertyName(s);
-
- setShortProperty((Object)s, i);
- }
-
- public void setIntProperty(final String s, final int i) throws JMSException
- {
- checkWritable();
- checkPropertyName(s);
-
- setIntProperty((Object)s, i);
- }
-
- public void setLongProperty(final String s, final long l) throws JMSException
- {
- checkWritable();
- checkPropertyName(s);
-
- setLongProperty((Object)s, l);
- }
-
- public void setFloatProperty(final String s, final float v) throws JMSException
- {
- checkWritable();
- checkPropertyName(s);
-
- setFloatProperty((Object) s, v);
- }
-
- public void setDoubleProperty(final String s, final double v) throws JMSException
- {
- checkWritable();
- checkPropertyName(s);
-
- setDoubleProperty((Object)s, v);
- }
-
- public void setStringProperty(final String s, final String s1) throws JMSException
- {
- checkWritable();
- checkPropertyName(s);
-
- setStringProperty((Object)s, s1);
- }
-
- public void setObjectProperty(final String s, final Object o) throws JMSException
- {
- checkWritable();
- checkPropertyName(s);
-
- if(o != null && (_supportedClasses.contains(o.getClass())))
- {
- setObjectProperty((Object)s, o);
- }
- else
- {
- throw new MessageFormatException("Cannot call setObjectProperty with a value of " + ((o == null) ? "null" : " class "+o.getClass().getName()) + ".");
- }
- }
-
- public void setBooleanProperty(Object name, boolean b) throws JMSException
- {
- _applicationProperties.getValue().put(name, b);
- }
-
- public void setByteProperty(Object name, byte b) throws JMSException
- {
- _applicationProperties.getValue().put(name, b);
- }
-
- public void setShortProperty(Object name, short i) throws JMSException
- {
- _applicationProperties.getValue().put(name, i);
- }
-
- public void setIntProperty(Object name, int i) throws JMSException
- {
- _applicationProperties.getValue().put(name, i);
- }
-
- public void setLongProperty(Object name, long l) throws JMSException
- {
- _applicationProperties.getValue().put(name, l);
- }
-
- public void setFloatProperty(Object name, float v) throws JMSException
- {
- _applicationProperties.getValue().put(name, v);
- }
-
- public void setDoubleProperty(Object name, double v) throws JMSException
- {
- _applicationProperties.getValue().put(name, v);
- }
-
- public void setStringProperty(Object name, String value) throws JMSException
- {
- _applicationProperties.getValue().put(name, value);
- }
-
- public void setObjectProperty(Object name, Object value) throws JMSException
- {
- _applicationProperties.getValue().put(name, value);
- }
-
- public void setListProperty(final Object name, final List<Object> list) throws JMSException
- {
- _applicationProperties.getValue().put(name, list);
- }
-
- public void setMapProperty(final Object name, final Map<Object, Object> map) throws JMSException
- {
- _applicationProperties.getValue().put(name, map);
- }
-
- public void setUnsignedByteProperty(final Object name, final UnsignedByte b) throws JMSException
- {
- _applicationProperties.getValue().put(name, b);
- }
-
- public void setUnsignedShortProperty(final Object name, final UnsignedShort s) throws JMSException
- {
- _applicationProperties.getValue().put(name, s);
- }
-
- public void setUnsignedIntProperty(final Object name, final UnsignedInteger i) throws JMSException
- {
- _applicationProperties.getValue().put(name, i);
- }
-
- public void setUnsignedLongProperty(final Object name, final UnsignedLong l) throws JMSException
- {
- _applicationProperties.getValue().put(name, l);
- }
-
- public UnsignedInteger getDeliveryFailures()
- {
- return _header.getDeliveryCount();
- }
-
- public void setDeliveryFailures(UnsignedInteger failures)
- {
- _header.setDeliveryCount(failures);
- }
-
- public MessageAttributes getHeaderMessageAttrs()
- {
- // TODO
- return null ; // _header.getMessageAttrs();
- }
-
- public void setHeaderMessageAttrs(final MessageAttributes messageAttrs)
- {
- // TODO
- }
-
- public MessageAttributes getHeaderDeliveryAttrs()
- {
- // TODO
- return null ; //_header.getDeliveryAttrs();
- }
-
- public void setHeaderDeliveryAttrs(final MessageAttributes deliveryAttrs)
- {
- //TODO
- }
-
- public Boolean getDurable()
- {
- return _header.getDurable();
- }
-
- public void setDurable(final Boolean durable)
- {
- _header.setDurable(durable);
- }
-
- public UnsignedByte getPriority()
- {
- return _header.getPriority();
- }
-
- public void setPriority(final UnsignedByte priority)
- {
- _header.setPriority(priority);
- }
-
- public Date getTransmitTime()
- {
- return _properties.getCreationTime();
- }
-
- public void setTransmitTime(final Date transmitTime)
- {
- _properties.setCreationTime(transmitTime);
- }
-
- public UnsignedInteger getTtl()
- {
- return _header.getTtl();
- }
-
- public void setTtl(final UnsignedInteger ttl)
- {
- _header.setTtl(ttl);
- }
-
- public UnsignedInteger getFormerAcquirers()
- {
- return _header.getDeliveryCount();
- }
-
- public void setFormerAcquirers(final UnsignedInteger formerAcquirers)
- {
- _header.setDeliveryCount(formerAcquirers);
- }
-
- public Object getMessageId()
- {
- return _properties.getMessageId();
- }
-
- public void setMessageId(final Object messageId)
- {
- _properties.setMessageId(messageId);
- }
-
- public Binary getUserId()
- {
- return _properties.getUserId();
- }
-
- public void setUserId(final Binary userId)
- {
- _properties.setUserId(userId);
- }
-
- public String getTo()
- {
- return _properties.getTo();
- }
-
- public void setTo(final String to)
- {
- _properties.setTo(to);
- }
-
- public String getSubject()
- {
- return _properties.getSubject();
- }
-
- public void setSubject(final String subject)
- {
- _properties.setSubject(subject);
- }
-
- public String getReplyTo()
- {
- return _properties.getReplyTo();
- }
-
- public void setReplyTo(final String replyTo)
- {
- _properties.setReplyTo(replyTo);
- }
-
- public Object getCorrelationId()
- {
- return _properties.getCorrelationId();
- }
-
- public void setCorrelationId(final Binary correlationId)
- {
- _properties.setCorrelationId(correlationId);
- }
-
- public Symbol getContentType()
- {
- return _properties.getContentType();
- }
-
- public void setContentType(final Symbol contentType)
- {
- _properties.setContentType(contentType);
- }
-
- public void acknowledge() throws JMSException
- {
- _sessionImpl.acknowledgeAll();
- }
-
- public void clearBody() throws JMSException
- {
- _readOnly = false;
- }
-
- protected boolean isReadOnly()
- {
- return _readOnly;
- }
-
- protected void checkReadable() throws MessageNotReadableException
- {
- if (!isReadOnly())
- {
- throw new MessageNotReadableException("You need to call reset() to make the message readable");
- }
- }
-
- protected void checkWritable() throws MessageNotWriteableException
- {
- if (isReadOnly())
- {
- throw new MessageNotWriteableException("You need to call clearBody() to make the message writable");
- }
- }
-
- public void setReadOnly()
- {
- _readOnly = true;
- }
-
- private static class InvalidJMSMEssageIdException extends JMSException
- {
- public InvalidJMSMEssageIdException(String messageId)
- {
- super("Invalid JMSMessageID: '" + messageId + "', JMSMessageID MUST start with 'ID:'");
- }
- }
-
- private class NonAMQPDestinationException extends JMSException
- {
- public NonAMQPDestinationException(Destination destination)
- {
- super("Destinations not a valid AMQP Destination, class of type: '"
- + destination.getClass().getName()
- + "', require '"
- + org.apache.qpid.amqp_1_0.jms.Destination.class.getName() + "'.");
- }
- }
-
- private class InvalidJMSPriorityException extends JMSException
- {
- public InvalidJMSPriorityException(int priority)
- {
- super("The provided priority: " + priority + " is not valid in AMQP, valid values are from 0 to 255");
- }
- }
-
- Header getHeader()
- {
- return _header;
- }
-
- Properties getProperties()
- {
- return _properties;
- }
-
-
- Footer getFooter()
- {
- return _footer;
- }
-
- MessageAnnotations getMessageAnnotations()
- {
- return _messageAnnotations;
- }
-
- public ApplicationProperties getApplicationProperties()
- {
- return _applicationProperties;
- }
-
- public void reset() throws JMSException
- {
- _readOnly = true;
- }
-
- void setFromQueue(final boolean fromQueue)
- {
- _isFromQueue = fromQueue;
- }
-
- void setFromTopic(final boolean fromTopic)
- {
- _isFromTopic = fromTopic;
- }
-
- abstract Collection<Section> getSections();
-
- DecodedDestination toDecodedDestination(Destination destination) throws NonAMQPDestinationException
- {
- if(destination == null)
- {
- return null;
- }
- if (destination instanceof DestinationImpl)
- {
- return _sessionImpl.getConnection().toDecodedDestination((DestinationImpl) destination);
- }
- throw new NonAMQPDestinationException(destination);
- }
-
- DestinationImpl toDestination(String address, Set<String> kind)
- {
- if( address == null )
- {
- return null;
- }
-
- // If destination prefixes are in play, we have to strip the the prefix, and we might
- // be able to infer the kind, if we don't know it yet.
- DecodedDestination decoded = _sessionImpl.getConnection().toDecodedDestination(address, kind);
- address = decoded.getAddress();
- kind = decoded.getAttributes();
-
- if( kind == null )
- {
- return DestinationImpl.valueOf(address);
- }
- if( kind.contains(QUEUE_ATTRIBUTE) )
- {
- if( kind.contains(TEMPORARY_ATTRIBUTE) )
- {
- return new TemporaryQueueImpl(address, null, _sessionImpl);
- }
- else
- {
- return QueueImpl.valueOf(address);
- }
- }
- else if ( kind.contains(TOPIC_ATTRIBUTE) )
- {
- if( kind.contains(TEMPORARY_ATTRIBUTE) )
- {
- return new TemporaryTopicImpl(address, null, _sessionImpl);
- }
- else
- {
- return TopicImpl.valueOf(address);
- }
- }
-
- return DestinationImpl.valueOf(address);
- }
-
- private Object getMessageAnnotation(Symbol key)
- {
- Map messageAttrs = _messageAnnotations == null ? null : _messageAnnotations.getValue();
- return messageAttrs == null ? null : messageAttrs.get(key);
- }
-
- private Map messageAnnotationMap()
- {
- Map messageAttrs = _messageAnnotations == null ? null : _messageAnnotations.getValue();
- if(messageAttrs == null)
- {
- messageAttrs = new HashMap();
- _messageAnnotations = new MessageAnnotations(messageAttrs);
- }
- return messageAttrs;
- }
-
- Set<String> splitCommaSeparateSet(String value)
- {
- if( value == null )
- {
- return null;
- }
- HashSet<String> rc = new HashSet<String>();
- for( String x: value.split("\\s*,\\s*") )
- {
- rc.add(x);
- }
- return rc;
- }
-
- private static Set<String> set(String ...args)
- {
- HashSet<String> s = new HashSet<String>();
- for (String arg : args)
- {
- s.add(arg);
- }
- return Collections.unmodifiableSet(s);
- }
-
- static final String join(String sep, Iterable items)
- {
- StringBuilder result = new StringBuilder();
-
- for (Object o : items)
- {
- if (result.length() > 0)
- {
- result.append(sep);
- }
- result.append(o.toString());
- }
-
- return result.toString();
- }
-
-}
+/*
+ *
+ * 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.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.Message;
+import org.apache.qpid.amqp_1_0.messaging.MessageAttributes;
+import org.apache.qpid.amqp_1_0.type.Binary;
+import org.apache.qpid.amqp_1_0.type.Section;
+import org.apache.qpid.amqp_1_0.type.Symbol;
+import org.apache.qpid.amqp_1_0.type.UnsignedByte;
+import org.apache.qpid.amqp_1_0.type.UnsignedInteger;
+import org.apache.qpid.amqp_1_0.type.UnsignedLong;
+import org.apache.qpid.amqp_1_0.type.UnsignedShort;
+import org.apache.qpid.amqp_1_0.type.messaging.ApplicationProperties;
+import org.apache.qpid.amqp_1_0.type.messaging.Footer;
+import org.apache.qpid.amqp_1_0.type.messaging.Header;
+import org.apache.qpid.amqp_1_0.type.messaging.MessageAnnotations;
+import org.apache.qpid.amqp_1_0.type.messaging.Properties;
+
+import javax.jms.DeliveryMode;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.MessageFormatException;
+import javax.jms.MessageNotReadableException;
+import javax.jms.MessageNotWriteableException;
+import java.util.*;
+
+public abstract class MessageImpl implements Message
+{
+ static final Set<Class> _supportedClasses =
+ new HashSet<Class>(Arrays.asList(Boolean.class, Byte.class, Short.class, Integer.class, Long.class,
+ Float.class, Double.class, Character.class, String.class, byte[].class));
+ static final Symbol JMS_TYPE = Symbol.valueOf("x-opt-jms-type");
+ static final Symbol TO_TYPE = Symbol.valueOf("x-opt-to-type");
+ static final Symbol REPLY_TO_TYPE = Symbol.valueOf("x-opt-reply-type");
+
+ static final String QUEUE_ATTRIBUTE = "queue";
+ static final String TOPIC_ATTRIBUTE = "topic";
+ static final String TEMPORARY_ATTRIBUTE = "temporary";
+
+ static final Set<String> JMS_QUEUE_ATTRIBUTES = set(QUEUE_ATTRIBUTE);
+ static final Set<String> JMS_TOPIC_ATTRIBUTES = set(TOPIC_ATTRIBUTE);
+ static final Set<String> JMS_TEMP_QUEUE_ATTRIBUTES = set(QUEUE_ATTRIBUTE, TEMPORARY_ATTRIBUTE);
+ static final Set<String> JMS_TEMP_TOPIC_ATTRIBUTES = set(TOPIC_ATTRIBUTE, TEMPORARY_ATTRIBUTE);
+
+ private static final String JMSXGROUP_ID = "JMSXGroupID";
+
+ private Header _header;
+ private Properties _properties;
+ private ApplicationProperties _applicationProperties;
+ private Footer _footer;
+ private final SessionImpl _sessionImpl;
+ private boolean _readOnly;
+ private MessageAnnotations _messageAnnotations;
+
+ private boolean _isFromQueue;
+ private boolean _isFromTopic;
+ private long _expiration;
+
+ protected MessageImpl(Header header,
+ MessageAnnotations messageAnnotations,
+ Properties properties,
+ ApplicationProperties appProperties,
+ Footer footer,
+ SessionImpl session)
+ {
+ _header = header == null ? new Header() : header;
+ _properties = properties == null ? new Properties() : properties;
+ _messageAnnotations = messageAnnotations == null ? new MessageAnnotations(new HashMap()) : messageAnnotations;
+ _footer = footer == null ? new Footer(Collections.EMPTY_MAP) : footer;
+ _applicationProperties = appProperties == null ? new ApplicationProperties(new HashMap()) : appProperties;
+ _sessionImpl = session;
+ }
+
+ public String getJMSMessageID() throws JMSException
+ {
+ Object messageId = getMessageId();
+
+ return messageId == null ? null : "ID:"+messageId.toString();
+ }
+
+ public void setJMSMessageID(String messageId) throws InvalidJMSMEssageIdException
+ {
+ if(messageId == null)
+ {
+ setMessageId(null);
+ }
+ else if(messageId.startsWith("ID:"))
+ {
+ setMessageId(messageId.substring(3));
+ }
+ else
+ {
+ throw new InvalidJMSMEssageIdException(messageId);
+ }
+ }
+
+ public long getJMSTimestamp() throws JMSException
+ {
+ Date transmitTime = getTransmitTime();
+ return transmitTime == null ? 0 : transmitTime.getTime();
+ }
+
+ public void setJMSTimestamp(long l) throws JMSException
+ {
+ setTransmitTime(new Date(l));
+ if(_expiration != 0l)
+ {
+ setTtl(UnsignedInteger.valueOf(_expiration-getTransmitTime().getTime()));
+ }
+ }
+
+ public byte[] getJMSCorrelationIDAsBytes() throws JMSException
+ {
+
+ Object o = getCorrelationId();
+ if(o instanceof Binary)
+ {
+ Binary correlationIdBinary = (Binary) o;
+ byte[] correlationId = new byte[correlationIdBinary.getLength()];
+ correlationIdBinary.asByteBuffer().get(correlationId);
+ return correlationId;
+ }
+ else
+ {
+ return o == null ? null : o.toString().getBytes();
+ }
+
+ }
+
+ public void setJMSCorrelationIDAsBytes(byte[] correlationId) throws JMSException
+ {
+ if(correlationId == null)
+ {
+ setCorrelationId(null);
+ }
+ else
+ {
+ byte[] dup = new byte[correlationId.length];
+ System.arraycopy(correlationId,0,dup,0,correlationId.length);
+ setCorrelationId(new Binary(dup));
+ }
+ }
+
+ public void setJMSCorrelationID(String s) throws JMSException
+ {
+ getProperties().setCorrelationId(s);
+ }
+
+ public String getJMSCorrelationID() throws JMSException
+ {
+ Object o = getProperties().getCorrelationId();
+ if(o instanceof Binary)
+ {
+ Binary id = (Binary) o;
+ return new String(id.getArray(), id.getArrayOffset(), id.getLength());
+ }
+ else
+ {
+ return o == null ? null : o.toString();
+ }
+ }
+
+ public DestinationImpl getJMSReplyTo() throws JMSException
+ {
+ return toDestination(getReplyTo(), splitCommaSeparateSet((String) getMessageAnnotation(REPLY_TO_TYPE)));
+ }
+
+ public void setJMSReplyTo(Destination destination) throws NonAMQPDestinationException
+ {
+ if( destination==null )
+ {
+ setReplyTo(null);
+ messageAnnotationMap().remove(REPLY_TO_TYPE);
+ }
+ else
+ {
+ DecodedDestination dd = toDecodedDestination(destination);
+ setReplyTo(dd.getAddress());
+ messageAnnotationMap().put(REPLY_TO_TYPE, join(",", dd.getAttributes()));
+ }
+ }
+
+ public DestinationImpl getJMSDestination() throws JMSException
+ {
+ Set<String> type = splitCommaSeparateSet((String) getMessageAnnotation(TO_TYPE));
+ if( type==null )
+ {
+ if( _isFromQueue )
+ {
+ type = JMS_QUEUE_ATTRIBUTES;
+ }
+ else if( _isFromTopic )
+ {
+ type = JMS_TOPIC_ATTRIBUTES;
+ }
+ }
+ return toDestination(getTo(), type);
+ }
+
+ public void setJMSDestination(Destination destination) throws NonAMQPDestinationException
+ {
+ if( destination==null )
+ {
+ setTo(null);
+ messageAnnotationMap().remove(TO_TYPE);
+ }
+ else
+ {
+ DecodedDestination dd = toDecodedDestination(destination);
+ setTo(dd.getAddress());
+ messageAnnotationMap().put(TO_TYPE, join(",", dd.getAttributes()));
+ }
+ }
+
+ public int getJMSDeliveryMode() throws JMSException
+ {
+ if(Boolean.FALSE.equals(getDurable()))
+ {
+ return DeliveryMode.NON_PERSISTENT;
+ }
+ else
+ {
+ return DeliveryMode.PERSISTENT;
+ }
+ }
+
+ public void setJMSDeliveryMode(int deliveryMode) throws JMSException
+ {
+ switch(deliveryMode)
+ {
+ case DeliveryMode.NON_PERSISTENT:
+ setDurable(false);
+ break;
+ case DeliveryMode.PERSISTENT:
+ setDurable(true);
+ break;
+ default:
+ //TODO
+ }
+ }
+
+ public boolean getJMSRedelivered()
+ {
+ UnsignedInteger failures = getDeliveryFailures();
+ return failures != null && (failures.intValue() != 0);
+ }
+
+ public void setJMSRedelivered(boolean redelivered)
+ {
+ UnsignedInteger failures = getDeliveryFailures();
+ if(redelivered)
+ {
+ if(failures == null || UnsignedInteger.ZERO.equals(failures))
+ {
+ setDeliveryFailures(UnsignedInteger.ONE);
+ }
+ }
+ else
+ {
+ setDeliveryFailures(null);
+ }
+ }
+
+ public String getJMSType() throws JMSException
+ {
+ final Object attrValue = getMessageAnnotation(JMS_TYPE);
+ return attrValue instanceof String ? attrValue.toString() : null;
+ }
+
+ public void setJMSType(String s) throws JMSException
+ {
+ messageAnnotationMap().put(JMS_TYPE, s);
+ }
+
+ public long getJMSExpiration() throws JMSException
+ {
+ final UnsignedInteger ttl = getTtl();
+ return ttl == null || ttl.longValue() == 0 ? 0 : getJMSTimestamp() + ttl.longValue();
+ }
+
+ public void setJMSExpiration(long l) throws JMSException
+ {
+ _expiration = l;
+ if(l == 0)
+ {
+ setTtl(UnsignedInteger.ZERO);
+ }
+ else
+ {
+ if(getTransmitTime() == null)
+ {
+ setTransmitTime(new Date());
+ }
+ setTtl(UnsignedInteger.valueOf(l - getTransmitTime().getTime()));
+ }
+ }
+
+ public int getJMSPriority() throws JMSException
+ {
+ UnsignedByte priority = getPriority();
+ return priority == null ? DEFAULT_PRIORITY : priority.intValue();
+ }
+
+ public void setJMSPriority(int i) throws InvalidJMSPriorityException
+ {
+ if(i >= 0 && i <= 255)
+ {
+ setPriority(UnsignedByte.valueOf((byte)i));
+ }
+ else
+ {
+ throw new InvalidJMSPriorityException(i);
+ }
+ }
+
+ public void clearProperties() throws JMSException
+ {
+ _applicationProperties.getValue().clear();
+ }
+
+ public boolean propertyExists(final String s) throws JMSException
+ {
+ return propertyExists((Object) s);
+ }
+
+ public boolean getBooleanProperty(final String s) throws JMSException
+ {
+ return getBooleanProperty((Object) s);
+ }
+
+ public byte getByteProperty(final String s) throws JMSException
+ {
+ return getByteProperty((Object)s);
+ }
+
+ public short getShortProperty(final String s) throws JMSException
+ {
+ return getShortProperty((Object)s);
+ }
+
+ public int getIntProperty(final String s) throws JMSException
+ {
+ return getIntProperty((Object)s);
+ }
+
+ public long getLongProperty(final String s) throws JMSException
+ {
+ return getLongProperty((Object)s);
+ }
+
+ public float getFloatProperty(final String s) throws JMSException
+ {
+ return getFloatProperty((Object)s);
+ }
+
+ public double getDoubleProperty(final String s) throws JMSException
+ {
+ return getDoubleProperty((Object)s);
+ }
+
+ public String getStringProperty(final String s) throws JMSException
+ {
+ return getStringProperty((Object)s);
+ }
+
+ public Object getObjectProperty(final String s) throws JMSException
+ {
+ return getObjectProperty((Object)s);
+ }
+
+ public boolean propertyExists(Object name) throws JMSException
+ {
+ return _applicationProperties.getValue().containsKey(name);
+ }
+
+ public boolean getBooleanProperty(Object name) throws JMSException
+ {
+
+ Object value = getProperty(name);
+
+ if (value instanceof Boolean)
+ {
+ return ((Boolean) value).booleanValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Boolean.valueOf((String) value);
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to boolean.");
+ }
+ }
+
+ public byte getByteProperty(Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof Byte)
+ {
+ return ((Byte) value).byteValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Byte.valueOf((String) value).byteValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to byte.");
+ }
+ }
+
+ public short getShortProperty(Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof Short)
+ {
+ return ((Short) value).shortValue();
+ }
+ else if (value instanceof Byte)
+ {
+ return ((Byte) value).shortValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Short.valueOf((String) value).shortValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to short.");
+ }
+ }
+
+ private Object getProperty(final Object name)
+ {
+ if(JMSXGROUP_ID.equals(name))
+ {
+ return _properties.getGroupId();
+ }
+ return _applicationProperties.getValue().get(name);
+ }
+
+ public int getIntProperty(Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof Integer)
+ {
+ return ((Integer) value).intValue();
+ }
+ else if (value instanceof Short)
+ {
+ return ((Short) value).intValue();
+ }
+ else if (value instanceof Byte)
+ {
+ return ((Byte) value).intValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Integer.valueOf((String) value).intValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to int.");
+ }
+ }
+
+ public long getLongProperty(Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof Long)
+ {
+ return ((Long) value).longValue();
+ }
+ else if (value instanceof Integer)
+ {
+ return ((Integer) value).longValue();
+ }
+
+ if (value instanceof Short)
+ {
+ return ((Short) value).longValue();
+ }
+
+ if (value instanceof Byte)
+ {
+ return ((Byte) value).longValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Long.valueOf((String) value).longValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to long.");
+ }
+ }
+
+ public float getFloatProperty(Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof Float)
+ {
+ return ((Float) value).floatValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Float.valueOf((String) value).floatValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to float.");
+ }
+ }
+
+ public double getDoubleProperty(Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof Double)
+ {
+ return ((Double) value).doubleValue();
+ }
+ else if (value instanceof Float)
+ {
+ return ((Float) value).doubleValue();
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return Double.valueOf((String) value).doubleValue();
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to double.");
+ }
+ }
+
+ public String getStringProperty(Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if ((value instanceof String) || (value == null))
+ {
+ return (String) value;
+ }
+ else if (value instanceof byte[])
+ {
+ throw new MessageFormatException("Property " + name + " of type byte[] " + "cannot be converted to String.");
+ }
+ else
+ {
+ return value.toString();
+ }
+ }
+
+ public Object getObjectProperty(Object name) throws JMSException
+ {
+ return getProperty(name);
+ }
+
+ public List<Object> getListProperty(final Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+ if(value instanceof List || value == null)
+ {
+ return (List<Object>)value;
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to List.");
+ }
+ }
+
+ public Map<Object, Object> getMapProperty(final Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+ if(value instanceof Map || value == null)
+ {
+ return (Map<Object,Object>)value;
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to Map.");
+ }
+ }
+
+ public UnsignedByte getUnsignedByteProperty(final Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof UnsignedByte)
+ {
+ return (UnsignedByte) value;
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return UnsignedByte.valueOf((String) value);
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to UnsignedByte.");
+ }
+ }
+
+ public UnsignedShort getUnsignedShortProperty(final Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof UnsignedShort)
+ {
+ return (UnsignedShort) value;
+ }
+ else if (value instanceof UnsignedByte)
+ {
+ return UnsignedShort.valueOf(((UnsignedByte)value).shortValue());
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return UnsignedShort.valueOf((String) value);
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to UnsignedShort.");
+ }
+ }
+
+ public UnsignedInteger getUnsignedIntProperty(final Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof UnsignedInteger)
+ {
+ return (UnsignedInteger) value;
+ }
+ else if (value instanceof UnsignedByte)
+ {
+ return UnsignedInteger.valueOf(((UnsignedByte)value).intValue());
+ }
+ else if (value instanceof UnsignedShort)
+ {
+ return UnsignedInteger.valueOf(((UnsignedShort)value).intValue());
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return UnsignedInteger.valueOf((String) value);
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to UnsignedShort.");
+ }
+ }
+
+ public UnsignedLong getUnsignedLongProperty(final Object name) throws JMSException
+ {
+ Object value = getProperty(name);
+
+ if (value instanceof UnsignedLong)
+ {
+ return (UnsignedLong) value;
+ }
+ else if (value instanceof UnsignedByte)
+ {
+ return UnsignedLong.valueOf(((UnsignedByte)value).longValue());
+ }
+ else if (value instanceof UnsignedShort)
+ {
+ return UnsignedLong.valueOf(((UnsignedShort)value).longValue());
+ }
+ else if (value instanceof UnsignedInteger)
+ {
+ return UnsignedLong.valueOf(((UnsignedInteger)value).longValue());
+ }
+ else if ((value instanceof String) || (value == null))
+ {
+ return UnsignedLong.valueOf((String) value);
+ }
+ else
+ {
+ throw new MessageFormatException("Property " + name + " of type " + value.getClass().getName()
+ + " cannot be converted to UnsignedShort.");
+ }
+ }
+
+ public Enumeration getPropertyNames() throws JMSException
+ {
+ final Collection<String> names = new ArrayList<String>();
+ for(Object key : _applicationProperties.getValue().keySet())
+ {
+ if(key instanceof String)
+ {
+ names.add((String)key);
+ }
+ }
+ if(_properties.getGroupId() != null)
+ {
+ names.add(JMSXGROUP_ID);
+ }
+ return Collections.enumeration(names);
+ }
+
+ public void setBooleanProperty(final String s, final boolean b) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+ setBooleanProperty((Object)s, b);
+ }
+
+ protected void checkPropertyName(CharSequence propertyName)
+ {
+ if (propertyName == null)
+ {
+ throw new IllegalArgumentException("Property name must not be null");
+ }
+ else if (propertyName.length() == 0)
+ {
+ throw new IllegalArgumentException("Property name must not be the empty string");
+ }
+
+ checkIdentiferFormat(propertyName);
+ }
+
+ protected void checkIdentiferFormat(CharSequence propertyName)
+ {
+// JMS requirements 3.5.1 Property Names
+// Identifiers:
+// - An identifier is an unlimited-length character sequence that must begin
+// with a Java identifier start character; all following characters must be Java
+// identifier part characters. An identifier start character is any character for
+// which the method Character.isJavaIdentifierStart returns true. This includes
+// '_' and '$'. An identifier part character is any character for which the
+// method Character.isJavaIdentifierPart returns true.
+// - Identifiers cannot be the names NULL, TRUE, or FALSE.
+// Identifiers cannot be NOT, AND, OR, BETWEEN, LIKE, IN, IS, or
+// ESCAPE.
+// Identifiers are either header field references or property references. The
+// type of a property value in a message selector corresponds to the type
+// used to set the property. If a property that does not exist in a message is
+// referenced, its value is NULL. The semantics of evaluating NULL values
+// in a selector are described in Section 3.8.1.2, Null Values.
+// The conversions that apply to the get methods for properties do not
+// apply when a property is used in a message selector expression. For
+// example, suppose you set a property as a string value, as in the
+// following:
+// myMessage.setStringProperty("NumberOfOrders", "2")
+// The following expression in a message selector would evaluate to false,
+// because a string cannot be used in an arithmetic expression:
+// "NumberOfOrders > 1"
+// Identifiers are case sensitive.
+// Message header field references are restricted to JMSDeliveryMode,
+// JMSPriority, JMSMessageID, JMSTimestamp, JMSCorrelationID, and
+// JMSType. JMSMessageID, JMSCorrelationID, and JMSType values may be
+// null and if so are treated as a NULL value.
+
+ // JMS start character
+ if (!(Character.isJavaIdentifierStart(propertyName.charAt(0))))
+ {
+ throw new IllegalArgumentException("Identifier '" + propertyName + "' does not start with a valid JMS identifier start character");
+ }
+
+ // JMS part character
+ int length = propertyName.length();
+ for (int c = 1; c < length; c++)
+ {
+ if (!(Character.isJavaIdentifierPart(propertyName.charAt(c))))
+ {
+ throw new IllegalArgumentException("Identifier '" + propertyName + "' contains an invalid JMS identifier character");
+ }
+ }
+
+ // JMS invalid names
+ if ((propertyName.equals("NULL")
+ || propertyName.equals("TRUE")
+ || propertyName.equals("FALSE")
+ || propertyName.equals("NOT")
+ || propertyName.equals("AND")
+ || propertyName.equals("OR")
+ || propertyName.equals("BETWEEN")
+ || propertyName.equals("LIKE")
+ || propertyName.equals("IN")
+ || propertyName.equals("IS")
+ || propertyName.equals("ESCAPE")))
+ {
+ throw new IllegalArgumentException("Identifier '" + propertyName + "' is not allowed in JMS");
+ }
+
+ }
+
+ public void setByteProperty(final String s, final byte b) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ setByteProperty((Object)s, b);
+ }
+
+ public void setShortProperty(final String s, final short i) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ setShortProperty((Object)s, i);
+ }
+
+ public void setIntProperty(final String s, final int i) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ setIntProperty((Object)s, i);
+ }
+
+ public void setLongProperty(final String s, final long l) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ setLongProperty((Object)s, l);
+ }
+
+ public void setFloatProperty(final String s, final float v) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ setFloatProperty((Object) s, v);
+ }
+
+ public void setDoubleProperty(final String s, final double v) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ setDoubleProperty((Object)s, v);
+ }
+
+ public void setStringProperty(final String s, final String s1) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ setStringProperty((Object)s, s1);
+ }
+
+ public void setObjectProperty(final String s, final Object o) throws JMSException
+ {
+ checkWritable();
+ checkPropertyName(s);
+
+ if(o != null && (_supportedClasses.contains(o.getClass())))
+ {
+ setObjectProperty((Object)s, o);
+ }
+ else
+ {
+ throw new MessageFormatException("Cannot call setObjectProperty with a value of " + ((o == null) ? "null" : " class "+o.getClass().getName()) + ".");
+ }
+ }
+
+ public void setBooleanProperty(Object name, boolean b)
+ {
+ setProperty(name, b);
+ }
+
+ public void setByteProperty(Object name, byte b)
+ {
+ setProperty(name, b);
+ }
+
+ public void setShortProperty(Object name, short i)
+ {
+ setProperty(name, i);
+ }
+
+ public void setIntProperty(Object name, int i)
+ {
+ setProperty(name, i);
+ }
+
+ public void setLongProperty(Object name, long l)
+ {
+ setProperty(name, l);
+ }
+
+ public void setFloatProperty(Object name, float v)
+ {
+ setProperty(name, v);
+ }
+
+ public void setDoubleProperty(Object name, double v)
+ {
+ setProperty(name, v);
+ }
+
+ public void setStringProperty(Object name, String value)
+ {
+ setProperty(name, value);
+ }
+
+ public void setObjectProperty(Object name, Object value)
+ {
+ setProperty(name, value);
+ }
+
+ private void setProperty(Object name, Object value)
+ {
+ if(JMSXGROUP_ID.equals(name))
+ {
+ _properties.setGroupId(value == null ? null : value.toString());
+ }
+ else
+ {
+ _applicationProperties.getValue().put(name, value);
+ }
+ }
+
+ public void setListProperty(final Object name, final List<Object> list)
+ {
+ setProperty(name, list);
+ }
+
+ public void setMapProperty(final Object name, final Map<Object, Object> map)
+ {
+ setProperty(name, map);
+ }
+
+ public void setUnsignedByteProperty(final Object name, final UnsignedByte b)
+ {
+ setProperty(name, b);
+ }
+
+ public void setUnsignedShortProperty(final Object name, final UnsignedShort s)
+ {
+ setProperty(name, s);
+ }
+
+ public void setUnsignedIntProperty(final Object name, final UnsignedInteger i)
+ {
+ setProperty(name, i);
+ }
+
+ public void setUnsignedLongProperty(final Object name, final UnsignedLong l)
+ {
+ setProperty(name, l);
+ }
+
+ public UnsignedInteger getDeliveryFailures()
+ {
+ return _header.getDeliveryCount();
+ }
+
+ public void setDeliveryFailures(UnsignedInteger failures)
+ {
+ _header.setDeliveryCount(failures);
+ }
+
+ public MessageAttributes getHeaderMessageAttrs()
+ {
+ // TODO
+ return null ; // _header.getMessageAttrs();
+ }
+
+ public void setHeaderMessageAttrs(final MessageAttributes messageAttrs)
+ {
+ // TODO
+ }
+
+ public MessageAttributes getHeaderDeliveryAttrs()
+ {
+ // TODO
+ return null ; //_header.getDeliveryAttrs();
+ }
+
+ public void setHeaderDeliveryAttrs(final MessageAttributes deliveryAttrs)
+ {
+ //TODO
+ }
+
+ public Boolean getDurable()
+ {
+ return _header.getDurable();
+ }
+
+ public void setDurable(final Boolean durable)
+ {
+ _header.setDurable(durable);
+ }
+
+ public UnsignedByte getPriority()
+ {
+ return _header.getPriority();
+ }
+
+ public void setPriority(final UnsignedByte priority)
+ {
+ _header.setPriority(priority);
+ }
+
+ public Date getTransmitTime()
+ {
+ return _properties.getCreationTime();
+ }
+
+ public void setTransmitTime(final Date transmitTime)
+ {
+ _properties.setCreationTime(transmitTime);
+ }
+
+ public UnsignedInteger getTtl()
+ {
+ return _header.getTtl();
+ }
+
+ public void setTtl(final UnsignedInteger ttl)
+ {
+ _header.setTtl(ttl);
+ }
+
+ public UnsignedInteger getFormerAcquirers()
+ {
+ return _header.getDeliveryCount();
+ }
+
+ public void setFormerAcquirers(final UnsignedInteger formerAcquirers)
+ {
+ _header.setDeliveryCount(formerAcquirers);
+ }
+
+ public Object getMessageId()
+ {
+ return _properties.getMessageId();
+ }
+
+ public void setMessageId(final Object messageId)
+ {
+ _properties.setMessageId(messageId);
+ }
+
+ public Binary getUserId()
+ {
+ return _properties.getUserId();
+ }
+
+ public void setUserId(final Binary userId)
+ {
+ _properties.setUserId(userId);
+ }
+
+ public String getTo()
+ {
+ return _properties.getTo();
+ }
+
+ public void setTo(final String to)
+ {
+ _properties.setTo(to);
+ }
+
+ public String getSubject()
+ {
+ return _properties.getSubject();
+ }
+
+ public void setSubject(final String subject)
+ {
+ _properties.setSubject(subject);
+ }
+
+ public String getReplyTo()
+ {
+ return _properties.getReplyTo();
+ }
+
+ public void setReplyTo(final String replyTo)
+ {
+ _properties.setReplyTo(replyTo);
+ }
+
+ public Object getCorrelationId()
+ {
+ return _properties.getCorrelationId();
+ }
+
+ public void setCorrelationId(final Binary correlationId)
+ {
+ _properties.setCorrelationId(correlationId);
+ }
+
+ public Symbol getContentType()
+ {
+ return _properties.getContentType();
+ }
+
+ public void setContentType(final Symbol contentType)
+ {
+ _properties.setContentType(contentType);
+ }
+
+ public void acknowledge() throws JMSException
+ {
+ _sessionImpl.acknowledgeAll();
+ }
+
+ public void clearBody() throws JMSException
+ {
+ _readOnly = false;
+ }
+
+ protected boolean isReadOnly()
+ {
+ return _readOnly;
+ }
+
+ protected void checkReadable() throws MessageNotReadableException
+ {
+ if (!isReadOnly())
+ {
+ throw new MessageNotReadableException("You need to call reset() to make the message readable");
+ }
+ }
+
+ protected void checkWritable() throws MessageNotWriteableException
+ {
+ if (isReadOnly())
+ {
+ throw new MessageNotWriteableException("You need to call clearBody() to make the message writable");
+ }
+ }
+
+ public void setReadOnly()
+ {
+ _readOnly = true;
+ }
+
+ private static class InvalidJMSMEssageIdException extends JMSException
+ {
+ public InvalidJMSMEssageIdException(String messageId)
+ {
+ super("Invalid JMSMessageID: '" + messageId + "', JMSMessageID MUST start with 'ID:'");
+ }
+ }
+
+ private class NonAMQPDestinationException extends JMSException
+ {
+ public NonAMQPDestinationException(Destination destination)
+ {
+ super("Destinations not a valid AMQP Destination, class of type: '"
+ + destination.getClass().getName()
+ + "', require '"
+ + org.apache.qpid.amqp_1_0.jms.Destination.class.getName() + "'.");
+ }
+ }
+
+ private class InvalidJMSPriorityException extends JMSException
+ {
+ public InvalidJMSPriorityException(int priority)
+ {
+ super("The provided priority: " + priority + " is not valid in AMQP, valid values are from 0 to 255");
+ }
+ }
+
+ Header getHeader()
+ {
+ return _header;
+ }
+
+ Properties getProperties()
+ {
+ return _properties;
+ }
+
+
+ Footer getFooter()
+ {
+ return _footer;
+ }
+
+ MessageAnnotations getMessageAnnotations()
+ {
+ return _messageAnnotations;
+ }
+
+ public ApplicationProperties getApplicationProperties()
+ {
+ return _applicationProperties;
+ }
+
+ public void reset() throws JMSException
+ {
+ _readOnly = true;
+ }
+
+ void setFromQueue(final boolean fromQueue)
+ {
+ _isFromQueue = fromQueue;
+ }
+
+ void setFromTopic(final boolean fromTopic)
+ {
+ _isFromTopic = fromTopic;
+ }
+
+ abstract Collection<Section> getSections();
+
+ DecodedDestination toDecodedDestination(Destination destination) throws NonAMQPDestinationException
+ {
+ if(destination == null)
+ {
+ return null;
+ }
+ if (destination instanceof DestinationImpl)
+ {
+ return _sessionImpl.getConnection().toDecodedDestination((DestinationImpl) destination);
+ }
+ throw new NonAMQPDestinationException(destination);
+ }
+
+ DestinationImpl toDestination(String address, Set<String> kind)
+ {
+ if( address == null )
+ {
+ return null;
+ }
+
+ // If destination prefixes are in play, we have to strip the the prefix, and we might
+ // be able to infer the kind, if we don't know it yet.
+ DecodedDestination decoded = _sessionImpl.getConnection().toDecodedDestination(address, kind);
+ address = decoded.getAddress();
+ kind = decoded.getAttributes();
+
+ if( kind == null )
+ {
+ return DestinationImpl.valueOf(address);
+ }
+ if( kind.contains(QUEUE_ATTRIBUTE) )
+ {
+ if( kind.contains(TEMPORARY_ATTRIBUTE) )
+ {
+ return new TemporaryQueueImpl(address, null, _sessionImpl);
+ }
+ else
+ {
+ return QueueImpl.valueOf(address);
+ }
+ }
+ else if ( kind.contains(TOPIC_ATTRIBUTE) )
+ {
+ if( kind.contains(TEMPORARY_ATTRIBUTE) )
+ {
+ return new TemporaryTopicImpl(address, null, _sessionImpl);
+ }
+ else
+ {
+ return TopicImpl.valueOf(address);
+ }
+ }
+
+ return DestinationImpl.valueOf(address);
+ }
+
+ private Object getMessageAnnotation(Symbol key)
+ {
+ Map messageAttrs = _messageAnnotations == null ? null : _messageAnnotations.getValue();
+ return messageAttrs == null ? null : messageAttrs.get(key);
+ }
+
+ private Map messageAnnotationMap()
+ {
+ Map messageAttrs = _messageAnnotations == null ? null : _messageAnnotations.getValue();
+ if(messageAttrs == null)
+ {
+ messageAttrs = new HashMap();
+ _messageAnnotations = new MessageAnnotations(messageAttrs);
+ }
+ return messageAttrs;
+ }
+
+ Set<String> splitCommaSeparateSet(String value)
+ {
+ if( value == null )
+ {
+ return null;
+ }
+ HashSet<String> rc = new HashSet<String>();
+ for( String x: value.split("\\s*,\\s*") )
+ {
+ rc.add(x);
+ }
+ return rc;
+ }
+
+ private static Set<String> set(String ...args)
+ {
+ HashSet<String> s = new HashSet<String>();
+ for (String arg : args)
+ {
+ s.add(arg);
+ }
+ return Collections.unmodifiableSet(s);
+ }
+
+ static final String join(String sep, Iterable items)
+ {
+ StringBuilder result = new StringBuilder();
+
+ for (Object o : items)
+ {
+ if (result.length() > 0)
+ {
+ result.append(sep);
+ }
+ result.append(o.toString());
+ }
+
+ return result.toString();
+ }
+
+}
Propchange: qpid/branches/linearstore/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/MessageImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org