Support delivery mode with PERSISTENT and only guarantee 'at-least-once', and 
add some tests


Project: 
http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/commit/fb50854e
Tree: 
http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/tree/fb50854e
Diff: 
http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/diff/fb50854e

Branch: refs/heads/jms-dev-1.1.0
Commit: fb50854e29dd27fc43c918720f3f085663ce30ba
Parents: e0802f0
Author: zhangke <[email protected]>
Authored: Mon Feb 27 23:22:59 2017 +0800
Committer: zhangke <[email protected]>
Committed: Mon Feb 27 23:22:59 2017 +0800

----------------------------------------------------------------------
 .../rocketmq/jms/DeliverMessageService.java     |   4 +-
 .../rocketmq/jms/RocketMQConnectionFactory.java |   6 +-
 .../apache/rocketmq/jms/RocketMQProducer.java   |  27 ++-
 .../UnsupportDeliveryModelException.java        |  27 +++
 .../rocketmq/jms/hook/SendMessageHook.java      |  24 ++
 .../rocketmq/jms/msg/AbstractJMSMessage.java    |  32 +--
 .../rocketmq/jms/msg/JMSBytesMessage.java       |  13 +-
 .../apache/rocketmq/jms/msg/JMSMapMessage.java  |  40 ++--
 .../jms/support/DirectTypeConverter.java        |  75 -------
 .../apache/rocketmq/jms/support/JmsHelper.java  |  61 -----
 .../apache/rocketmq/jms/support/JmsUtils.java   |  52 +++++
 .../rocketmq/jms/support/ObjectTypeCast.java    |  75 +++++++
 .../rocketmq/jms/support/PrimitiveTypeCast.java | 220 +++++++++++++++++++
 .../jms/support/PrimitiveTypeConverter.java     | 194 ----------------
 .../rocketmq/jms/hook/SendMessageHookTest.java  |  94 ++++++++
 .../rocketmq/jms/msg/JMSBytesMessageTest.java   |   1 -
 .../jms/support/DirectTypeConverterTest.java    |  12 +-
 .../jms/support/PrimitiveTypeConvertTest.java   |  90 ++++----
 18 files changed, 618 insertions(+), 429 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/fb50854e/core/src/main/java/org/apache/rocketmq/jms/DeliverMessageService.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/rocketmq/jms/DeliverMessageService.java 
b/core/src/main/java/org/apache/rocketmq/jms/DeliverMessageService.java
index bcfc680..0ff5c73 100644
--- a/core/src/main/java/org/apache/rocketmq/jms/DeliverMessageService.java
+++ b/core/src/main/java/org/apache/rocketmq/jms/DeliverMessageService.java
@@ -39,7 +39,7 @@ import org.apache.rocketmq.common.ServiceThread;
 import org.apache.rocketmq.common.message.MessageExt;
 import org.apache.rocketmq.common.message.MessageQueue;
 import org.apache.rocketmq.jms.msg.convert.RMQ2JMSMessageConvert;
-import org.apache.rocketmq.jms.support.JmsHelper;
+import org.apache.rocketmq.jms.support.JmsUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -81,7 +81,7 @@ public class DeliverMessageService extends ServiceThread {
         this.destination = destination;
         this.consumerGroup = consumerGroup;
 
-        this.topicName = JmsHelper.getTopicName(destination);
+        this.topicName = JmsUtils.getTopicName(destination);
 
         createAndStartRocketMQPullConsumer();
 

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/fb50854e/core/src/main/java/org/apache/rocketmq/jms/RocketMQConnectionFactory.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/rocketmq/jms/RocketMQConnectionFactory.java 
b/core/src/main/java/org/apache/rocketmq/jms/RocketMQConnectionFactory.java
index c00338c..501a37d 100644
--- a/core/src/main/java/org/apache/rocketmq/jms/RocketMQConnectionFactory.java
+++ b/core/src/main/java/org/apache/rocketmq/jms/RocketMQConnectionFactory.java
@@ -22,7 +22,7 @@ import javax.jms.Connection;
 import javax.jms.ConnectionFactory;
 import javax.jms.JMSContext;
 import javax.jms.JMSException;
-import org.apache.rocketmq.jms.support.JmsHelper;
+import org.apache.rocketmq.jms.support.JmsUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -51,7 +51,7 @@ public class RocketMQConnectionFactory implements 
ConnectionFactory {
 
     public RocketMQConnectionFactory(String nameServerAddress) {
         this.nameServerAddress = nameServerAddress;
-        this.clientId = JmsHelper.uuid();
+        this.clientId = JmsUtils.uuid();
     }
 
     public RocketMQConnectionFactory(String nameServerAddress, String 
clientId) {
@@ -79,7 +79,7 @@ public class RocketMQConnectionFactory implements 
ConnectionFactory {
     }
 
     private Connection createRocketMQConnection(String userName, String 
password) throws JMSException {
-        final String instanceName = JmsHelper.uuid();
+        final String instanceName = JmsUtils.uuid();
         RocketMQConnection connection = new 
RocketMQConnection(this.nameServerAddress, this.clientId, instanceName);
 
         log.info("Create a connection 
successfully[instanceName:{},clientIdentifier:{},userName:{}", instanceName, 
clientId, userName);

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/fb50854e/core/src/main/java/org/apache/rocketmq/jms/RocketMQProducer.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/rocketmq/jms/RocketMQProducer.java 
b/core/src/main/java/org/apache/rocketmq/jms/RocketMQProducer.java
index 64f7438..83b760a 100644
--- a/core/src/main/java/org/apache/rocketmq/jms/RocketMQProducer.java
+++ b/core/src/main/java/org/apache/rocketmq/jms/RocketMQProducer.java
@@ -30,6 +30,7 @@ import org.apache.rocketmq.client.producer.DefaultMQProducer;
 import org.apache.rocketmq.client.producer.SendResult;
 import org.apache.rocketmq.client.producer.SendStatus;
 import org.apache.rocketmq.common.message.MessageExt;
+import org.apache.rocketmq.jms.exception.UnsupportDeliveryModelException;
 import org.apache.rocketmq.jms.hook.SendMessageHook;
 import org.apache.rocketmq.jms.msg.AbstractJMSMessage;
 import org.apache.rocketmq.jms.msg.convert.JMS2RMQMessageConvert;
@@ -42,13 +43,13 @@ import static 
org.apache.rocketmq.jms.msg.enums.JMSHeaderEnum.JMS_DELIVERY_MODE_
 import static 
org.apache.rocketmq.jms.msg.enums.JMSHeaderEnum.JMS_DELIVERY_TIME_DEFAULT_VALUE;
 import static 
org.apache.rocketmq.jms.msg.enums.JMSHeaderEnum.JMS_PRIORITY_DEFAULT_VALUE;
 import static 
org.apache.rocketmq.jms.msg.enums.JMSHeaderEnum.JMS_TIME_TO_LIVE_DEFAULT_VALUE;
-import static 
org.apache.rocketmq.jms.support.DirectTypeConverter.convert2Object;
+import static org.apache.rocketmq.jms.support.ObjectTypeCast.cast2Object;
 
 public class RocketMQProducer implements MessageProducer {
 
     private static final Logger log = 
LoggerFactory.getLogger(RocketMQProducer.class);
     private RocketMQSession session;
-    private final DefaultMQProducer rocketMQProducer;
+    private DefaultMQProducer rocketMQProducer;
     private Destination destination;
 
     private boolean disableMessageID;
@@ -60,6 +61,9 @@ public class RocketMQProducer implements MessageProducer {
 
     private SendMessageHook sendMessageHook;
 
+    public RocketMQProducer() {
+    }
+
     public RocketMQProducer(RocketMQSession session, Destination destination) {
         this.session = session;
         this.destination = destination;
@@ -100,7 +104,7 @@ public class RocketMQProducer implements MessageProducer {
 
     @Override
     public void setDeliveryMode(int deliveryMode) throws JMSException {
-        this.deliveryMode = deliveryMode;
+        throw new UnsupportDeliveryModelException();
     }
 
     @Override
@@ -202,7 +206,7 @@ public class RocketMQProducer implements MessageProducer {
     }
 
     private MessageExt createRocketMQMessage(Message jmsMsg) throws 
JMSException {
-        AbstractJMSMessage abstractJMSMessage = convert2Object(jmsMsg, 
AbstractJMSMessage.class);
+        AbstractJMSMessage abstractJMSMessage = cast2Object(jmsMsg, 
AbstractJMSMessage.class);
         try {
             return JMS2RMQMessageConvert.convert(abstractJMSMessage);
         }
@@ -239,4 +243,19 @@ public class RocketMQProducer implements MessageProducer {
         sendAsync(rmqMsg, completionListener);
     }
 
+    public void setSession(RocketMQSession session) {
+        this.session = session;
+    }
+
+    public void setRocketMQProducer(DefaultMQProducer rocketMQProducer) {
+        this.rocketMQProducer = rocketMQProducer;
+    }
+
+    public void setDestination(Destination destination) {
+        this.destination = destination;
+    }
+
+    public void setSendMessageHook(SendMessageHook sendMessageHook) {
+        this.sendMessageHook = sendMessageHook;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/fb50854e/core/src/main/java/org/apache/rocketmq/jms/exception/UnsupportDeliveryModelException.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/rocketmq/jms/exception/UnsupportDeliveryModelException.java
 
b/core/src/main/java/org/apache/rocketmq/jms/exception/UnsupportDeliveryModelException.java
new file mode 100644
index 0000000..903b75f
--- /dev/null
+++ 
b/core/src/main/java/org/apache/rocketmq/jms/exception/UnsupportDeliveryModelException.java
@@ -0,0 +1,27 @@
+/*
+ * 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.rocketmq.jms.exception;
+
+import javax.jms.JMSRuntimeException;
+
+public class UnsupportDeliveryModelException extends JMSRuntimeException {
+
+    public UnsupportDeliveryModelException() {
+        super("Only support PERSISTENT model, and guarantee at-least-once");
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/fb50854e/core/src/main/java/org/apache/rocketmq/jms/hook/SendMessageHook.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/rocketmq/jms/hook/SendMessageHook.java 
b/core/src/main/java/org/apache/rocketmq/jms/hook/SendMessageHook.java
index e11c9fb..fcd0579 100644
--- a/core/src/main/java/org/apache/rocketmq/jms/hook/SendMessageHook.java
+++ b/core/src/main/java/org/apache/rocketmq/jms/hook/SendMessageHook.java
@@ -22,6 +22,8 @@ import javax.jms.Destination;
 import javax.jms.JMSException;
 import javax.jms.Message;
 import org.apache.rocketmq.jms.RocketMQProducer;
+import org.apache.rocketmq.jms.exception.UnsupportDeliveryModelException;
+import org.apache.rocketmq.jms.msg.enums.JMSHeaderEnum;
 
 import static org.apache.rocketmq.jms.Constant.MESSAGE_ID_PREFIX;
 
@@ -32,12 +34,24 @@ public class SendMessageHook {
 
     private RocketMQProducer producer;
 
+    public SendMessageHook() {
+    }
+
     public SendMessageHook(RocketMQProducer producer) {
         this.producer = producer;
     }
 
     public void before(Message message, Destination destination, int 
deliveryMode, int priority,
         long timeToLive) throws JMSException {
+
+        validate(deliveryMode);
+
+        setHeader(message, destination, deliveryMode, priority, timeToLive);
+
+    }
+
+    private void setHeader(Message message, Destination destination, int 
deliveryMode, int priority,
+        long timeToLive) throws JMSException {
         // destination
         message.setJMSDestination(destination);
 
@@ -68,4 +82,14 @@ public class SendMessageHook {
             message.setJMSTimestamp(System.currentTimeMillis());
         }
     }
+
+    private void validate(int deliveryMode) {
+        if (deliveryMode != JMSHeaderEnum.JMS_DELIVERY_MODE_DEFAULT_VALUE) {
+            throw new UnsupportDeliveryModelException();
+        }
+    }
+
+    public void setProducer(RocketMQProducer producer) {
+        this.producer = producer;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/fb50854e/core/src/main/java/org/apache/rocketmq/jms/msg/AbstractJMSMessage.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/rocketmq/jms/msg/AbstractJMSMessage.java 
b/core/src/main/java/org/apache/rocketmq/jms/msg/AbstractJMSMessage.java
index 226c51b..fecff14 100644
--- a/core/src/main/java/org/apache/rocketmq/jms/msg/AbstractJMSMessage.java
+++ b/core/src/main/java/org/apache/rocketmq/jms/msg/AbstractJMSMessage.java
@@ -45,11 +45,11 @@ import static 
org.apache.rocketmq.jms.msg.enums.JMSHeaderEnum.JMS_EXPIRATION_DEF
 import static 
org.apache.rocketmq.jms.msg.enums.JMSHeaderEnum.JMS_PRIORITY_DEFAULT_VALUE;
 import static 
org.apache.rocketmq.jms.msg.enums.JMSHeaderEnum.JMS_REDELIVERED_DEFAULT_VALUE;
 import static 
org.apache.rocketmq.jms.msg.enums.JMSHeaderEnum.JMS_TIMESTAMP_DEFAULT_VALUE;
-import static 
org.apache.rocketmq.jms.support.DirectTypeConverter.convert2Boolean;
-import static 
org.apache.rocketmq.jms.support.DirectTypeConverter.convert2Integer;
-import static org.apache.rocketmq.jms.support.DirectTypeConverter.convert2Long;
-import static 
org.apache.rocketmq.jms.support.DirectTypeConverter.convert2Object;
-import static 
org.apache.rocketmq.jms.support.DirectTypeConverter.convert2String;
+import static org.apache.rocketmq.jms.support.ObjectTypeCast.cast2Boolean;
+import static org.apache.rocketmq.jms.support.ObjectTypeCast.cast2Integer;
+import static org.apache.rocketmq.jms.support.ObjectTypeCast.cast2Long;
+import static org.apache.rocketmq.jms.support.ObjectTypeCast.cast2Object;
+import static org.apache.rocketmq.jms.support.ObjectTypeCast.cast2String;
 
 public abstract class AbstractJMSMessage implements javax.jms.Message {
 
@@ -60,7 +60,7 @@ public abstract class AbstractJMSMessage implements 
javax.jms.Message {
 
     @Override
     public String getJMSMessageID() {
-        return convert2String(headers.get(JMSMessageID));
+        return cast2String(headers.get(JMSMessageID));
     }
 
     @Override
@@ -71,7 +71,7 @@ public abstract class AbstractJMSMessage implements 
javax.jms.Message {
     @Override
     public long getJMSTimestamp() {
         if (headers.containsKey(JMSTimestamp)) {
-            return convert2Long(headers.get(JMSTimestamp));
+            return cast2Long(headers.get(JMSTimestamp));
         }
         return JMS_TIMESTAMP_DEFAULT_VALUE;
     }
@@ -103,7 +103,7 @@ public abstract class AbstractJMSMessage implements 
javax.jms.Message {
 
     @Override
     public String getJMSCorrelationID() {
-        return convert2String(headers.get(JMSCorrelationID));
+        return cast2String(headers.get(JMSCorrelationID));
     }
 
     @Override
@@ -113,7 +113,7 @@ public abstract class AbstractJMSMessage implements 
javax.jms.Message {
 
     @Override
     public Destination getJMSReplyTo() {
-        return convert2Object(headers.get(JMSReplyTo), Destination.class);
+        return cast2Object(headers.get(JMSReplyTo), Destination.class);
     }
 
     @Override
@@ -128,7 +128,7 @@ public abstract class AbstractJMSMessage implements 
javax.jms.Message {
 
     @Override
     public Destination getJMSDestination() {
-        return convert2Object(headers.get(JMSDestination), Destination.class);
+        return cast2Object(headers.get(JMSDestination), Destination.class);
     }
 
     @Override
@@ -144,7 +144,7 @@ public abstract class AbstractJMSMessage implements 
javax.jms.Message {
     @Override
     public int getJMSDeliveryMode() {
         if (headers.containsKey(JMSDeliveryMode)) {
-            return convert2Integer(headers.get(JMSDeliveryMode));
+            return cast2Integer(headers.get(JMSDeliveryMode));
         }
         return JMS_DELIVERY_MODE_DEFAULT_VALUE;
     }
@@ -157,7 +157,7 @@ public abstract class AbstractJMSMessage implements 
javax.jms.Message {
     @Override
     public boolean getJMSRedelivered() {
         if (headers.containsKey(JMSRedelivered)) {
-            return convert2Boolean(headers.get(JMSRedelivered));
+            return cast2Boolean(headers.get(JMSRedelivered));
         }
         return JMS_REDELIVERED_DEFAULT_VALUE;
     }
@@ -169,7 +169,7 @@ public abstract class AbstractJMSMessage implements 
javax.jms.Message {
 
     @Override
     public String getJMSType() {
-        return convert2String(headers.get(JMSType));
+        return cast2String(headers.get(JMSType));
     }
 
     @Override
@@ -184,7 +184,7 @@ public abstract class AbstractJMSMessage implements 
javax.jms.Message {
     @Override
     public long getJMSExpiration() {
         if (headers.containsKey(JMSExpiration)) {
-            return convert2Long(headers.get(JMSExpiration));
+            return cast2Long(headers.get(JMSExpiration));
         }
         return JMS_EXPIRATION_DEFAULT_VALUE;
     }
@@ -197,7 +197,7 @@ public abstract class AbstractJMSMessage implements 
javax.jms.Message {
     @Override
     public int getJMSPriority() {
         if (headers.containsKey(JMSPriority)) {
-            return convert2Integer(headers.get(JMSPriority));
+            return cast2Integer(headers.get(JMSPriority));
         }
         return JMS_PRIORITY_DEFAULT_VALUE;
     }
@@ -210,7 +210,7 @@ public abstract class AbstractJMSMessage implements 
javax.jms.Message {
     @Override
     public long getJMSDeliveryTime() throws JMSException {
         if (headers.containsKey(JMSDeliveryTime)) {
-            return convert2Long(headers.get(JMSDeliveryTime));
+            return cast2Long(headers.get(JMSDeliveryTime));
         }
         return JMS_DELIVERY_TIME_DEFAULT_VALUE;
     }

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/fb50854e/core/src/main/java/org/apache/rocketmq/jms/msg/JMSBytesMessage.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/rocketmq/jms/msg/JMSBytesMessage.java 
b/core/src/main/java/org/apache/rocketmq/jms/msg/JMSBytesMessage.java
index 169088c..a409118 100644
--- a/core/src/main/java/org/apache/rocketmq/jms/msg/JMSBytesMessage.java
+++ b/core/src/main/java/org/apache/rocketmq/jms/msg/JMSBytesMessage.java
@@ -30,7 +30,7 @@ import javax.jms.MessageEOFException;
 import javax.jms.MessageFormatException;
 import javax.jms.MessageNotReadableException;
 import javax.jms.MessageNotWriteableException;
-import org.apache.rocketmq.jms.support.JmsHelper;
+import org.apache.rocketmq.jms.support.PrimitiveTypeCast;
 
 import static java.lang.String.format;
 
@@ -429,7 +429,16 @@ public class JMSBytesMessage extends AbstractJMSMessage 
implements javax.jms.Byt
         checkIsWriteOnly();
         initializeWriteIfNecessary();
 
-        JmsHelper.handleUnSupportedException();
+        if (!PrimitiveTypeCast.isPrimitiveType(value)) {
+            throw new JMSException("Object must be primitive type");
+        }
+
+        try {
+            dataAsOutput.writeBytes(String.valueOf(value));
+        }
+        catch (IOException e) {
+            throw handleOutputException(e);
+        }
     }
 
     public void reset() throws JMSException {

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/fb50854e/core/src/main/java/org/apache/rocketmq/jms/msg/JMSMapMessage.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/rocketmq/jms/msg/JMSMapMessage.java 
b/core/src/main/java/org/apache/rocketmq/jms/msg/JMSMapMessage.java
index d10247f..dddfb58 100644
--- a/core/src/main/java/org/apache/rocketmq/jms/msg/JMSMapMessage.java
+++ b/core/src/main/java/org/apache/rocketmq/jms/msg/JMSMapMessage.java
@@ -29,16 +29,16 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.rocketmq.jms.msg.serialize.MapSerialize;
 
 import static java.lang.String.format;
-import static 
org.apache.rocketmq.jms.support.PrimitiveTypeConverter.convert2Boolean;
-import static 
org.apache.rocketmq.jms.support.PrimitiveTypeConverter.convert2Byte;
-import static 
org.apache.rocketmq.jms.support.PrimitiveTypeConverter.convert2ByteArray;
-import static 
org.apache.rocketmq.jms.support.PrimitiveTypeConverter.convert2Char;
-import static 
org.apache.rocketmq.jms.support.PrimitiveTypeConverter.convert2Double;
-import static 
org.apache.rocketmq.jms.support.PrimitiveTypeConverter.convert2Float;
-import static 
org.apache.rocketmq.jms.support.PrimitiveTypeConverter.convert2Int;
-import static 
org.apache.rocketmq.jms.support.PrimitiveTypeConverter.convert2Long;
-import static 
org.apache.rocketmq.jms.support.PrimitiveTypeConverter.convert2Short;
-import static 
org.apache.rocketmq.jms.support.PrimitiveTypeConverter.convert2String;
+import static org.apache.rocketmq.jms.support.PrimitiveTypeCast.cast2Boolean;
+import static org.apache.rocketmq.jms.support.PrimitiveTypeCast.cast2Byte;
+import static org.apache.rocketmq.jms.support.PrimitiveTypeCast.cast2ByteArray;
+import static org.apache.rocketmq.jms.support.PrimitiveTypeCast.cast2Char;
+import static org.apache.rocketmq.jms.support.PrimitiveTypeCast.cast2Double;
+import static org.apache.rocketmq.jms.support.PrimitiveTypeCast.cast2Float;
+import static org.apache.rocketmq.jms.support.PrimitiveTypeCast.cast2Int;
+import static org.apache.rocketmq.jms.support.PrimitiveTypeCast.cast2Long;
+import static org.apache.rocketmq.jms.support.PrimitiveTypeCast.cast2Short;
+import static org.apache.rocketmq.jms.support.PrimitiveTypeCast.cast2String;
 
 /**
  * Message can only be accessed by a thread at a time.
@@ -76,7 +76,7 @@ public class JMSMapMessage extends AbstractJMSMessage 
implements MapMessage {
     @Override public boolean getBoolean(String name) throws JMSException {
         checkName(name);
 
-        return convert2Boolean(map.get(name));
+        return cast2Boolean(map.get(name));
     }
 
     private void checkName(String name) throws JMSException {
@@ -88,55 +88,55 @@ public class JMSMapMessage extends AbstractJMSMessage 
implements MapMessage {
     @Override public byte getByte(String name) throws JMSException {
         checkName(name);
 
-        return convert2Byte(map.get(name));
+        return cast2Byte(map.get(name));
     }
 
     @Override public short getShort(String name) throws JMSException {
         checkName(name);
 
-        return convert2Short(map.get(name));
+        return cast2Short(map.get(name));
     }
 
     @Override public char getChar(String name) throws JMSException {
         checkName(name);
 
-        return convert2Char(map.get(name));
+        return cast2Char(map.get(name));
     }
 
     @Override public int getInt(String name) throws JMSException {
         checkName(name);
 
-        return convert2Int(map.get(name));
+        return cast2Int(map.get(name));
     }
 
     @Override public long getLong(String name) throws JMSException {
         checkName(name);
 
-        return convert2Long(map.get(name));
+        return cast2Long(map.get(name));
     }
 
     @Override public float getFloat(String name) throws JMSException {
         checkName(name);
 
-        return convert2Float(map.get(name));
+        return cast2Float(map.get(name));
     }
 
     @Override public double getDouble(String name) throws JMSException {
         checkName(name);
 
-        return convert2Double(map.get(name));
+        return cast2Double(map.get(name));
     }
 
     @Override public String getString(String name) throws JMSException {
         checkName(name);
 
-        return convert2String(map.get(name));
+        return cast2String(map.get(name));
     }
 
     @Override public byte[] getBytes(String name) throws JMSException {
         checkName(name);
 
-        return convert2ByteArray(map.get(name));
+        return cast2ByteArray(map.get(name));
     }
 
     @Override public Object getObject(String name) throws JMSException {

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/fb50854e/core/src/main/java/org/apache/rocketmq/jms/support/DirectTypeConverter.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/rocketmq/jms/support/DirectTypeConverter.java 
b/core/src/main/java/org/apache/rocketmq/jms/support/DirectTypeConverter.java
deleted file mode 100644
index eb4c967..0000000
--- 
a/core/src/main/java/org/apache/rocketmq/jms/support/DirectTypeConverter.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * 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.rocketmq.jms.support;
-
-/**
- * Converter that convert object directly, which means Integer can only be
- * converted to Integer,rather than Integer and Long.
- */
-public class DirectTypeConverter {
-
-    public static String convert2String(Object obj) {
-        if (obj == null) {
-            return null;
-        }
-        if (String.class.isInstance(obj)) {
-            return (String) obj;
-        }
-        throw new ClassCastException("To converted object is " + 
obj.getClass() + ", not String.class");
-    }
-
-    public static Long convert2Long(Object obj) {
-        if (obj == null) {
-            return null;
-        }
-        if (Long.class.isInstance(obj)) {
-            return (Long) obj;
-        }
-        throw new ClassCastException("To converted object is " + 
obj.getClass() + ", not Long.class");
-    }
-
-    public static Integer convert2Integer(Object obj) {
-        if (obj == null) {
-            return null;
-        }
-        if (Integer.class.isInstance(obj)) {
-            return (Integer) obj;
-        }
-        throw new ClassCastException("To converted object is " + 
obj.getClass() + ", not Integer.class");
-    }
-
-    public static Boolean convert2Boolean(Object obj) {
-        if (obj == null) {
-            return null;
-        }
-        if (Boolean.class.isInstance(obj)) {
-            return (Boolean) obj;
-        }
-        throw new ClassCastException("To converted object is " + 
obj.getClass() + ", not Boolean.class");
-    }
-
-    public static <T> T convert2Object(Object obj, Class<T> target) {
-        if (obj == null) {
-            return null;
-        }
-        if (target.isInstance(obj)) {
-            return (T) obj;
-        }
-        throw new ClassCastException("To converted object is " + 
obj.getClass() + ", not " + target.getSimpleName() + ".class");
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/fb50854e/core/src/main/java/org/apache/rocketmq/jms/support/JmsHelper.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/rocketmq/jms/support/JmsHelper.java 
b/core/src/main/java/org/apache/rocketmq/jms/support/JmsHelper.java
deleted file mode 100644
index 4648eb0..0000000
--- a/core/src/main/java/org/apache/rocketmq/jms/support/JmsHelper.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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.rocketmq.jms.support;
-
-import java.util.UUID;
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.JMSRuntimeException;
-import javax.jms.Queue;
-import javax.jms.Topic;
-
-public class JmsHelper {
-
-    public static final boolean SKIP_SET_EXCEPTION
-        = Boolean.parseBoolean(System.getProperty("skip.set.exception", 
"false"));
-
-    public static String getTopicName(Destination destination) {
-        try {
-            String topicName;
-            if (destination instanceof Topic) {
-                topicName = ((Topic) destination).getTopicName();
-            }
-            else if (destination instanceof Queue) {
-                topicName = ((Queue) destination).getQueueName();
-            }
-            else {
-                throw new JMSException(String.format("Unsupported Destination 
type:", destination.getClass()));
-            }
-            return topicName;
-        }
-        catch (JMSException e) {
-            throw new JMSRuntimeException(e.getMessage());
-        }
-    }
-
-    public static void handleUnSupportedException() {
-        if (!SKIP_SET_EXCEPTION) {
-            throw new UnsupportedOperationException("Operation unsupported! If 
you want to skip this Exception," +
-                " use '-Dskip.set.exception=true' in JVM options.");
-        }
-    }
-
-    public static String uuid() {
-        return UUID.randomUUID().toString();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/fb50854e/core/src/main/java/org/apache/rocketmq/jms/support/JmsUtils.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/rocketmq/jms/support/JmsUtils.java 
b/core/src/main/java/org/apache/rocketmq/jms/support/JmsUtils.java
new file mode 100644
index 0000000..af56544
--- /dev/null
+++ b/core/src/main/java/org/apache/rocketmq/jms/support/JmsUtils.java
@@ -0,0 +1,52 @@
+/*
+ * 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.rocketmq.jms.support;
+
+import java.util.UUID;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.JMSRuntimeException;
+import javax.jms.Queue;
+import javax.jms.Topic;
+
+public class JmsUtils {
+
+    public static String getTopicName(Destination destination) {
+        try {
+            String topicName;
+            if (destination instanceof Topic) {
+                topicName = ((Topic) destination).getTopicName();
+            }
+            else if (destination instanceof Queue) {
+                topicName = ((Queue) destination).getQueueName();
+            }
+            else {
+                throw new JMSException(String.format("Unsupported Destination 
type:", destination.getClass()));
+            }
+            return topicName;
+        }
+        catch (JMSException e) {
+            throw new JMSRuntimeException(e.getMessage());
+        }
+    }
+
+
+    public static String uuid() {
+        return UUID.randomUUID().toString();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/fb50854e/core/src/main/java/org/apache/rocketmq/jms/support/ObjectTypeCast.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/rocketmq/jms/support/ObjectTypeCast.java 
b/core/src/main/java/org/apache/rocketmq/jms/support/ObjectTypeCast.java
new file mode 100644
index 0000000..15d3190
--- /dev/null
+++ b/core/src/main/java/org/apache/rocketmq/jms/support/ObjectTypeCast.java
@@ -0,0 +1,75 @@
+/*
+ * 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.rocketmq.jms.support;
+
+/**
+ * Converter that convert object directly, which means Integer can only be
+ * converted to Integer,rather than Integer and Long.
+ */
+public class ObjectTypeCast {
+
+    public static String cast2String(Object obj) {
+        if (obj == null) {
+            return null;
+        }
+        if (String.class.isInstance(obj)) {
+            return (String) obj;
+        }
+        throw new ClassCastException("To converted object is " + 
obj.getClass() + ", not String.class");
+    }
+
+    public static Long cast2Long(Object obj) {
+        if (obj == null) {
+            return null;
+        }
+        if (Long.class.isInstance(obj)) {
+            return (Long) obj;
+        }
+        throw new ClassCastException("To converted object is " + 
obj.getClass() + ", not Long.class");
+    }
+
+    public static Integer cast2Integer(Object obj) {
+        if (obj == null) {
+            return null;
+        }
+        if (Integer.class.isInstance(obj)) {
+            return (Integer) obj;
+        }
+        throw new ClassCastException("To converted object is " + 
obj.getClass() + ", not Integer.class");
+    }
+
+    public static Boolean cast2Boolean(Object obj) {
+        if (obj == null) {
+            return null;
+        }
+        if (Boolean.class.isInstance(obj)) {
+            return (Boolean) obj;
+        }
+        throw new ClassCastException("To converted object is " + 
obj.getClass() + ", not Boolean.class");
+    }
+
+    public static <T> T cast2Object(Object obj, Class<T> target) {
+        if (obj == null) {
+            return null;
+        }
+        if (target.isInstance(obj)) {
+            return (T) obj;
+        }
+        throw new ClassCastException("To converted object is " + 
obj.getClass() + ", not " + target.getSimpleName() + ".class");
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/fb50854e/core/src/main/java/org/apache/rocketmq/jms/support/PrimitiveTypeCast.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/rocketmq/jms/support/PrimitiveTypeCast.java 
b/core/src/main/java/org/apache/rocketmq/jms/support/PrimitiveTypeCast.java
new file mode 100644
index 0000000..c6cda19
--- /dev/null
+++ b/core/src/main/java/org/apache/rocketmq/jms/support/PrimitiveTypeCast.java
@@ -0,0 +1,220 @@
+/*
+ * 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.rocketmq.jms.support;
+
+import javax.jms.JMSException;
+import javax.jms.MapMessage;
+
+/**
+ * Primitive type converter, according to the conversion table in {@link 
MapMessage}.
+ */
+public class PrimitiveTypeCast {
+
+    /**
+     * Indicate if the parameter obj is primitive type.
+     *
+     * @param obj that to be check
+     * @return true if the obj is primitive type, otherwise return false
+     */
+    public static boolean isPrimitiveType(Object obj) {
+        if (obj == null) {
+            return false;
+        }
+        if (Boolean.class.isInstance(obj)
+            || Byte.class.isInstance(obj)
+            || Short.class.isInstance(obj)
+            || Character.class.isInstance(obj)
+            || Integer.class.isInstance(obj)
+            || Long.class.isInstance(obj)
+            || Float.class.isInstance(obj)
+            || Double.class.isInstance(obj)
+            || String.class.isInstance(obj)
+            || byte[].class.isInstance(obj)) {
+            return true;
+        }
+
+        return false;
+    }
+
+    public static boolean cast2Boolean(Object obj) throws JMSException {
+        if (obj == null) {
+            return Boolean.valueOf(null);
+        }
+
+        if (Boolean.class.isInstance(obj)) {
+            return (Boolean) obj;
+        }
+        if (String.class.isInstance(obj)) {
+            return Boolean.valueOf((String) obj);
+        }
+
+        throw new JMSException("Incorrect type[" + obj.getClass() + "] to 
convert");
+    }
+
+    public static byte cast2Byte(Object obj) throws JMSException {
+        if (obj == null) {
+            return Byte.valueOf(null);
+        }
+
+        if (Byte.class.isInstance(obj)) {
+            return (Byte) obj;
+        }
+        if (String.class.isInstance(obj)) {
+            return Byte.valueOf((String) obj);
+        }
+
+        throw new JMSException("Incorrect type[" + obj.getClass() + "] to 
convert");
+    }
+
+    public static short cast2Short(Object obj) throws JMSException {
+        if (obj == null) {
+            return Short.valueOf(null);
+        }
+
+        if (Byte.class.isInstance(obj)) {
+            return ((Byte) obj).shortValue();
+        }
+        if (Short.class.isInstance(obj)) {
+            return (Short) obj;
+        }
+        if (String.class.isInstance(obj)) {
+            return Short.valueOf((String) obj);
+        }
+
+        throw new JMSException("Incorrect type[" + obj.getClass() + "] to 
convert");
+    }
+
+    public static char cast2Char(Object obj) throws JMSException {
+        if (obj == null) {
+            throw new NullPointerException("Obj is required");
+        }
+
+        if (Character.class.isInstance(obj)) {
+            return (Character) obj;
+        }
+
+        throw new JMSException("Incorrect type[" + obj.getClass() + "] to 
convert");
+    }
+
+    public static int cast2Int(Object obj) throws JMSException {
+        if (obj == null) {
+            return Integer.valueOf(null);
+        }
+
+        if (Byte.class.isInstance(obj)) {
+            return ((Byte) obj).intValue();
+        }
+        if (Short.class.isInstance(obj)) {
+            return ((Short) obj).intValue();
+        }
+        if (Integer.class.isInstance(obj)) {
+            return (Integer) obj;
+        }
+        if (String.class.isInstance(obj)) {
+            return Integer.parseInt((String) obj);
+        }
+
+        throw new JMSException("Incorrect type[" + obj.getClass() + "] to 
convert");
+    }
+
+    public static long cast2Long(Object obj) throws JMSException {
+        if (obj == null) {
+            return Long.valueOf(null);
+        }
+
+        if (Byte.class.isInstance(obj)) {
+            return ((Byte) obj).longValue();
+        }
+        if (Short.class.isInstance(obj)) {
+            return ((Short) obj).longValue();
+        }
+        if (Integer.class.isInstance(obj)) {
+            return ((Integer) obj).longValue();
+        }
+        if (Long.class.isInstance(obj)) {
+            return (Long) obj;
+        }
+        if (String.class.isInstance(obj)) {
+            return Long.parseLong((String) obj);
+        }
+
+        throw new JMSException("Incorrect type[" + obj.getClass() + "] to 
convert");
+    }
+
+    public static float cast2Float(Object obj) throws JMSException {
+        if (obj == null) {
+            return Float.valueOf(null);
+        }
+
+        if (Float.class.isInstance(obj)) {
+            return (Float) obj;
+        }
+        if (String.class.isInstance(obj)) {
+            return Float.parseFloat((String) obj);
+        }
+
+        throw new JMSException("Incorrect type[" + obj.getClass() + "] to 
convert");
+    }
+
+    public static double cast2Double(Object obj) throws JMSException {
+        if (obj == null) {
+            return Double.valueOf(null);
+        }
+
+        if (Float.class.isInstance(obj)) {
+            return ((Float) obj).doubleValue();
+        }
+        if (Double.class.isInstance(obj)) {
+            return (Double) obj;
+        }
+        if (String.class.isInstance(obj)) {
+            return Double.parseDouble((String) obj);
+        }
+
+        throw new JMSException("Incorrect type[" + obj.getClass() + "] to 
convert");
+    }
+
+    public static String cast2String(Object obj) throws JMSException {
+        if (obj == null) {
+            return String.valueOf(null);
+        }
+
+        if (Boolean.class.isInstance(obj)
+            || Byte.class.isInstance(obj)
+            || Short.class.isInstance(obj)
+            || Character.class.isInstance(obj)
+            || Integer.class.isInstance(obj)
+            || Long.class.isInstance(obj)
+            || Float.class.isInstance(obj)
+            || Double.class.isInstance(obj)
+            || String.class.isInstance(obj)
+            ) {
+            return obj.toString();
+        }
+
+        throw new JMSException("Incorrect type[" + obj.getClass() + "] to 
convert");
+    }
+
+    public static byte[] cast2ByteArray(Object obj) throws JMSException {
+        if (obj instanceof byte[]) {
+            return (byte[]) obj;
+        }
+
+        throw new JMSException("Incorrect type[" + obj.getClass() + "] to 
convert");
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/fb50854e/core/src/main/java/org/apache/rocketmq/jms/support/PrimitiveTypeConverter.java
----------------------------------------------------------------------
diff --git 
a/core/src/main/java/org/apache/rocketmq/jms/support/PrimitiveTypeConverter.java
 
b/core/src/main/java/org/apache/rocketmq/jms/support/PrimitiveTypeConverter.java
deleted file mode 100644
index 6d51eee..0000000
--- 
a/core/src/main/java/org/apache/rocketmq/jms/support/PrimitiveTypeConverter.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * 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.rocketmq.jms.support;
-
-import javax.jms.JMSException;
-import javax.jms.MapMessage;
-
-/**
- * Primitive type converter, according to the conversion table in {@link 
MapMessage}.
- */
-public class PrimitiveTypeConverter {
-
-    public static boolean convert2Boolean(Object obj) throws JMSException {
-        if (obj == null) {
-            return Boolean.valueOf(null);
-        }
-
-        if (Boolean.class.isInstance(obj)) {
-            return (Boolean) obj;
-        }
-        if (String.class.isInstance(obj)) {
-            return Boolean.valueOf((String) obj);
-        }
-
-        throw new JMSException("Incorrect type[" + obj.getClass() + "] to 
convert");
-    }
-
-    public static byte convert2Byte(Object obj) throws JMSException {
-        if (obj == null) {
-            return Byte.valueOf(null);
-        }
-
-        if (Byte.class.isInstance(obj)) {
-            return (Byte) obj;
-        }
-        if (String.class.isInstance(obj)) {
-            return Byte.valueOf((String) obj);
-        }
-
-        throw new JMSException("Incorrect type[" + obj.getClass() + "] to 
convert");
-    }
-
-    public static short convert2Short(Object obj) throws JMSException {
-        if (obj == null) {
-            return Short.valueOf(null);
-        }
-
-        if (Byte.class.isInstance(obj)) {
-            return ((Byte) obj).shortValue();
-        }
-        if (Short.class.isInstance(obj)) {
-            return (Short) obj;
-        }
-        if (String.class.isInstance(obj)) {
-            return Short.valueOf((String) obj);
-        }
-
-        throw new JMSException("Incorrect type[" + obj.getClass() + "] to 
convert");
-    }
-
-    public static char convert2Char(Object obj) throws JMSException {
-        if (obj == null) {
-            throw new NullPointerException("Obj is required");
-        }
-
-        if (Character.class.isInstance(obj)) {
-            return (Character) obj;
-        }
-
-        throw new JMSException("Incorrect type[" + obj.getClass() + "] to 
convert");
-    }
-
-    public static int convert2Int(Object obj) throws JMSException {
-        if (obj == null) {
-            return Integer.valueOf(null);
-        }
-
-        if (Byte.class.isInstance(obj)) {
-            return ((Byte) obj).intValue();
-        }
-        if (Short.class.isInstance(obj)) {
-            return ((Short) obj).intValue();
-        }
-        if (Integer.class.isInstance(obj)) {
-            return (Integer) obj;
-        }
-        if (String.class.isInstance(obj)) {
-            return Integer.parseInt((String) obj);
-        }
-
-        throw new JMSException("Incorrect type[" + obj.getClass() + "] to 
convert");
-    }
-
-    public static long convert2Long(Object obj) throws JMSException {
-        if (obj == null) {
-            return Long.valueOf(null);
-        }
-
-        if (Byte.class.isInstance(obj)) {
-            return ((Byte) obj).longValue();
-        }
-        if (Short.class.isInstance(obj)) {
-            return ((Short) obj).longValue();
-        }
-        if (Integer.class.isInstance(obj)) {
-            return ((Integer) obj).longValue();
-        }
-        if (Long.class.isInstance(obj)) {
-            return (Long) obj;
-        }
-        if (String.class.isInstance(obj)) {
-            return Long.parseLong((String) obj);
-        }
-
-        throw new JMSException("Incorrect type[" + obj.getClass() + "] to 
convert");
-    }
-
-    public static float convert2Float(Object obj) throws JMSException {
-        if (obj == null) {
-            return Float.valueOf(null);
-        }
-
-        if (Float.class.isInstance(obj)) {
-            return (Float) obj;
-        }
-        if (String.class.isInstance(obj)) {
-            return Float.parseFloat((String) obj);
-        }
-
-        throw new JMSException("Incorrect type[" + obj.getClass() + "] to 
convert");
-    }
-
-    public static double convert2Double(Object obj) throws JMSException {
-        if (obj == null) {
-            return Double.valueOf(null);
-        }
-
-        if (Float.class.isInstance(obj)) {
-            return ((Float) obj).doubleValue();
-        }
-        if (Double.class.isInstance(obj)) {
-            return (Double) obj;
-        }
-        if (String.class.isInstance(obj)) {
-            return Double.parseDouble((String) obj);
-        }
-
-        throw new JMSException("Incorrect type[" + obj.getClass() + "] to 
convert");
-    }
-
-    public static String convert2String(Object obj) throws JMSException {
-        if (obj == null) {
-            return String.valueOf(null);
-        }
-
-        if (Boolean.class.isInstance(obj)
-            || Byte.class.isInstance(obj)
-            || Short.class.isInstance(obj)
-            || Character.class.isInstance(obj)
-            || Integer.class.isInstance(obj)
-            || Long.class.isInstance(obj)
-            || Float.class.isInstance(obj)
-            || Double.class.isInstance(obj)
-            || String.class.isInstance(obj)
-            ) {
-            return obj.toString();
-        }
-
-        throw new JMSException("Incorrect type[" + obj.getClass() + "] to 
convert");
-    }
-
-    public static byte[] convert2ByteArray(Object obj) throws JMSException {
-        if (obj instanceof byte[]) {
-            return (byte[]) obj;
-        }
-
-        throw new JMSException("Incorrect type[" + obj.getClass() + "] to 
convert");
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/fb50854e/core/src/test/java/org/apache/rocketmq/jms/hook/SendMessageHookTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/rocketmq/jms/hook/SendMessageHookTest.java 
b/core/src/test/java/org/apache/rocketmq/jms/hook/SendMessageHookTest.java
new file mode 100644
index 0000000..2d1afcc
--- /dev/null
+++ b/core/src/test/java/org/apache/rocketmq/jms/hook/SendMessageHookTest.java
@@ -0,0 +1,94 @@
+/*
+ * 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.rocketmq.jms.hook;
+
+import javax.jms.DeliveryMode;
+import javax.jms.Destination;
+import org.apache.rocketmq.jms.RocketMQProducer;
+import org.apache.rocketmq.jms.RocketMQTopic;
+import org.apache.rocketmq.jms.exception.UnsupportDeliveryModelException;
+import org.apache.rocketmq.jms.msg.JMSTextMessage;
+import org.apache.rocketmq.jms.msg.enums.JMSHeaderEnum;
+import org.junit.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsNot.not;
+import static org.hamcrest.core.IsNull.notNullValue;
+import static org.hamcrest.core.IsNull.nullValue;
+
+public class SendMessageHookTest {
+
+    @Test(expected = UnsupportDeliveryModelException.class)
+    public void testValidate() throws Exception {
+        final JMSTextMessage message = new JMSTextMessage("text");
+        final RocketMQTopic destination = new RocketMQTopic("destination");
+        final int deliveryMode = DeliveryMode.NON_PERSISTENT;
+        final int priority = 4;
+        final long timeToLive = 1000 * 100L;
+
+        SendMessageHook hook = new SendMessageHook();
+        hook.before(message, destination, deliveryMode, priority, timeToLive);
+    }
+
+    @Test
+    public void testSetHeader() throws Exception {
+        RocketMQProducer producer = new RocketMQProducer();
+        producer.setDeliveryDelay(0L);
+
+        final JMSTextMessage message = new JMSTextMessage("text");
+        final Destination destination = new RocketMQTopic("destination");
+        final int deliveryMode = DeliveryMode.PERSISTENT;
+        final int priority = 5;
+        long timeToLive = JMSHeaderEnum.JMS_TIME_TO_LIVE_DEFAULT_VALUE;
+        SendMessageHook hook = new SendMessageHook(producer);
+        hook.before(message, destination, deliveryMode, priority, timeToLive);
+
+        assertThat(message.getJMSDestination(), is(destination));
+        assertThat(message.getJMSDeliveryMode(), 
is(JMSHeaderEnum.JMS_DELIVERY_MODE_DEFAULT_VALUE));
+        assertThat(message.getJMSExpiration(), is(0L));
+        assertThat(message.getJMSDeliveryTime(), notNullValue());
+        assertThat(message.getJMSPriority(), is(5));
+        assertThat(message.getJMSMessageID(), notNullValue());
+        assertThat(message.getJMSTimestamp(), notNullValue());
+    }
+
+    /**
+     * Disable ID,timestamp, and set expired time
+     *
+     * @throws Exception
+     */
+    @Test
+    public void testSetHeader2() throws Exception {
+        RocketMQProducer producer = new RocketMQProducer();
+        producer.setDisableMessageID(true);
+        producer.setDisableMessageTimestamp(true);
+
+        final JMSTextMessage message = new JMSTextMessage("text");
+        final Destination destination = new RocketMQTopic("destination");
+        final int deliveryMode = DeliveryMode.PERSISTENT;
+        final int priority = 5;
+        final long timeToLive = 1000 * 100L;
+        SendMessageHook hook = new SendMessageHook(producer);
+        hook.before(message, destination, deliveryMode, priority, timeToLive);
+
+        assertThat(message.getJMSMessageID(), nullValue());
+        assertThat(message.getJMSTimestamp(), is(0L));
+        assertThat(message.getJMSExpiration(), not(is(0L)));
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/fb50854e/core/src/test/java/org/apache/rocketmq/jms/msg/JMSBytesMessageTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/rocketmq/jms/msg/JMSBytesMessageTest.java 
b/core/src/test/java/org/apache/rocketmq/jms/msg/JMSBytesMessageTest.java
index a56602c..20520f6 100644
--- a/core/src/test/java/org/apache/rocketmq/jms/msg/JMSBytesMessageTest.java
+++ b/core/src/test/java/org/apache/rocketmq/jms/msg/JMSBytesMessageTest.java
@@ -51,7 +51,6 @@ public class JMSBytesMessageTest {
         byte[] receiveValue = new byte[receiveData.length];
         msg.readBytes(receiveValue);
         assertThat(new String(receiveValue), is(new String(receiveData)));
-
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/fb50854e/core/src/test/java/org/apache/rocketmq/jms/support/DirectTypeConverterTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/rocketmq/jms/support/DirectTypeConverterTest.java
 
b/core/src/test/java/org/apache/rocketmq/jms/support/DirectTypeConverterTest.java
index 93b0d03..2ea70f0 100644
--- 
a/core/src/test/java/org/apache/rocketmq/jms/support/DirectTypeConverterTest.java
+++ 
b/core/src/test/java/org/apache/rocketmq/jms/support/DirectTypeConverterTest.java
@@ -26,27 +26,27 @@ public class DirectTypeConverterTest {
 
     @Test
     public void testConvert2String() throws Exception {
-        assertThat(DirectTypeConverter.convert2String("name"), is("name"));
+        assertThat(ObjectTypeCast.cast2String("name"), is("name"));
     }
 
     @Test
     public void testConvert2Long() throws Exception {
-        assertThat(DirectTypeConverter.convert2Long(100l), is(100l));
+        assertThat(ObjectTypeCast.cast2Long(100l), is(100l));
     }
 
     @Test
     public void testConvert2Integer() throws Exception {
-        assertThat(DirectTypeConverter.convert2Integer(100), is(100));
+        assertThat(ObjectTypeCast.cast2Integer(100), is(100));
     }
 
     @Test
     public void testConvert2Boolean() throws Exception {
-        assertThat(DirectTypeConverter.convert2Boolean(true), is(true));
+        assertThat(ObjectTypeCast.cast2Boolean(true), is(true));
     }
 
     @Test
     public void testConvert2Object() throws Exception {
-        final DirectTypeConverter obj = new DirectTypeConverter();
-        assertThat(DirectTypeConverter.convert2Object(obj, 
DirectTypeConverter.class), is(obj));
+        final ObjectTypeCast obj = new ObjectTypeCast();
+        assertThat(ObjectTypeCast.cast2Object(obj, ObjectTypeCast.class), 
is(obj));
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-externals/blob/fb50854e/core/src/test/java/org/apache/rocketmq/jms/support/PrimitiveTypeConvertTest.java
----------------------------------------------------------------------
diff --git 
a/core/src/test/java/org/apache/rocketmq/jms/support/PrimitiveTypeConvertTest.java
 
b/core/src/test/java/org/apache/rocketmq/jms/support/PrimitiveTypeConvertTest.java
index c6a3aad..e297b46 100644
--- 
a/core/src/test/java/org/apache/rocketmq/jms/support/PrimitiveTypeConvertTest.java
+++ 
b/core/src/test/java/org/apache/rocketmq/jms/support/PrimitiveTypeConvertTest.java
@@ -21,16 +21,16 @@ import java.util.Date;
 import javax.jms.JMSException;
 import org.junit.Test;
 
-import static 
org.apache.rocketmq.jms.support.PrimitiveTypeConverter.convert2Boolean;
-import static 
org.apache.rocketmq.jms.support.PrimitiveTypeConverter.convert2Byte;
-import static 
org.apache.rocketmq.jms.support.PrimitiveTypeConverter.convert2ByteArray;
-import static 
org.apache.rocketmq.jms.support.PrimitiveTypeConverter.convert2Char;
-import static 
org.apache.rocketmq.jms.support.PrimitiveTypeConverter.convert2Double;
-import static 
org.apache.rocketmq.jms.support.PrimitiveTypeConverter.convert2Float;
-import static 
org.apache.rocketmq.jms.support.PrimitiveTypeConverter.convert2Int;
-import static 
org.apache.rocketmq.jms.support.PrimitiveTypeConverter.convert2Long;
-import static 
org.apache.rocketmq.jms.support.PrimitiveTypeConverter.convert2Short;
-import static 
org.apache.rocketmq.jms.support.PrimitiveTypeConverter.convert2String;
+import static org.apache.rocketmq.jms.support.PrimitiveTypeCast.cast2Boolean;
+import static org.apache.rocketmq.jms.support.PrimitiveTypeCast.cast2Byte;
+import static org.apache.rocketmq.jms.support.PrimitiveTypeCast.cast2ByteArray;
+import static org.apache.rocketmq.jms.support.PrimitiveTypeCast.cast2Char;
+import static org.apache.rocketmq.jms.support.PrimitiveTypeCast.cast2Double;
+import static org.apache.rocketmq.jms.support.PrimitiveTypeCast.cast2Float;
+import static org.apache.rocketmq.jms.support.PrimitiveTypeCast.cast2Int;
+import static org.apache.rocketmq.jms.support.PrimitiveTypeCast.cast2Long;
+import static org.apache.rocketmq.jms.support.PrimitiveTypeCast.cast2Short;
+import static org.apache.rocketmq.jms.support.PrimitiveTypeCast.cast2String;
 import static org.hamcrest.core.Is.is;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
@@ -39,14 +39,14 @@ public class PrimitiveTypeConvertTest {
 
     @Test
     public void testConvert2Boolean() throws Exception {
-        assertThat(convert2Boolean(new Boolean(true)), is(true));
-        assertThat(convert2Boolean(null), is(false));
+        assertThat(cast2Boolean(new Boolean(true)), is(true));
+        assertThat(cast2Boolean(null), is(false));
 
-        assertThat(convert2Boolean("true"), is(true));
-        assertThat(convert2Boolean("hello"), is(false));
+        assertThat(cast2Boolean("true"), is(true));
+        assertThat(cast2Boolean("hello"), is(false));
 
         try {
-            convert2Boolean(new Date());
+            cast2Boolean(new Date());
             assertTrue(false);
         }
         catch (JMSException e) {
@@ -57,11 +57,11 @@ public class PrimitiveTypeConvertTest {
     @Test
     public void testConvert2Byte() throws Exception {
         final byte b = Byte.parseByte("101", 2);
-        assertThat(convert2Byte(b), is(b));
+        assertThat(cast2Byte(b), is(b));
 
-        assertThat(convert2Byte(new String("5")), is(b));
+        assertThat(cast2Byte(new String("5")), is(b));
         try {
-            assertThat(convert2Byte(null), is(b));
+            assertThat(cast2Byte(null), is(b));
             assertTrue(false);
         }
         catch (RuntimeException e) {
@@ -69,7 +69,7 @@ public class PrimitiveTypeConvertTest {
         }
 
         try {
-            convert2Byte("abc");
+            cast2Byte("abc");
             assertTrue(false);
         }
         catch (RuntimeException e) {
@@ -77,7 +77,7 @@ public class PrimitiveTypeConvertTest {
         }
 
         try {
-            convert2Byte(new Date());
+            cast2Byte(new Date());
             assertTrue(false);
         }
         catch (JMSException e) {
@@ -88,12 +88,12 @@ public class PrimitiveTypeConvertTest {
     @Test
     public void testConvert2Short() throws Exception {
         final Short s = new Short("12");
-        assertThat(convert2Short(s), is(s));
+        assertThat(cast2Short(s), is(s));
 
-        assertThat(convert2Short("3"), is(new Short("3")));
+        assertThat(cast2Short("3"), is(new Short("3")));
 
         try {
-            convert2Short(new Date());
+            cast2Short(new Date());
             assertTrue(false);
         }
         catch (JMSException e) {
@@ -104,10 +104,10 @@ public class PrimitiveTypeConvertTest {
     @Test
     public void testConvert2Char() throws Exception {
         final char c = 'a';
-        assertThat(convert2Char(c), is(c));
+        assertThat(cast2Char(c), is(c));
 
         try {
-            convert2Char("a");
+            cast2Char("a");
             assertTrue(false);
         }
         catch (JMSException e) {
@@ -117,13 +117,13 @@ public class PrimitiveTypeConvertTest {
 
     @Test
     public void testConvert2Int() throws Exception {
-        assertThat(convert2Int(12), is(12));
+        assertThat(cast2Int(12), is(12));
 
-        assertThat(convert2Int("12"), is(12));
-        assertThat(convert2Int(Byte.parseByte("11", 2)), is(3));
+        assertThat(cast2Int("12"), is(12));
+        assertThat(cast2Int(Byte.parseByte("11", 2)), is(3));
 
         try {
-            convert2Int(new Date());
+            cast2Int(new Date());
             assertTrue(false);
         }
         catch (JMSException e) {
@@ -133,12 +133,12 @@ public class PrimitiveTypeConvertTest {
 
     @Test
     public void testConvert2Long() throws Exception {
-        assertThat(convert2Long(12), is(12l));
+        assertThat(cast2Long(12), is(12l));
 
-        assertThat(convert2Long("12"), is(12l));
+        assertThat(cast2Long("12"), is(12l));
 
         try {
-            convert2Int(new Date());
+            cast2Int(new Date());
             assertTrue(false);
         }
         catch (JMSException e) {
@@ -148,12 +148,12 @@ public class PrimitiveTypeConvertTest {
 
     @Test
     public void testConvert2Float() throws Exception {
-        assertThat(convert2Float(12.00f), is(12f));
+        assertThat(cast2Float(12.00f), is(12f));
 
-        assertThat(convert2Float("12.00"), is(12f));
+        assertThat(cast2Float("12.00"), is(12f));
 
         try {
-            convert2Float(12);
+            cast2Float(12);
             assertTrue(false);
         }
         catch (JMSException e) {
@@ -163,13 +163,13 @@ public class PrimitiveTypeConvertTest {
 
     @Test
     public void testConvert2Double() throws Exception {
-        assertThat(convert2Double(12.00d), is(12d));
+        assertThat(cast2Double(12.00d), is(12d));
 
-        assertThat(convert2Double("12.00"), is(12d));
-        assertThat(convert2Double(12.00f), is(12d));
+        assertThat(cast2Double("12.00"), is(12d));
+        assertThat(cast2Double(12.00f), is(12d));
 
         try {
-            convert2Double(12);
+            cast2Double(12);
             assertTrue(false);
         }
         catch (JMSException e) {
@@ -179,13 +179,13 @@ public class PrimitiveTypeConvertTest {
 
     @Test
     public void testConvert2String() throws Exception {
-        assertThat(convert2String(12.00d), is("12.0"));
+        assertThat(cast2String(12.00d), is("12.0"));
 
-        assertThat(convert2String("12.00"), is("12.00"));
-        assertThat(convert2String(true), is("true"));
+        assertThat(cast2String("12.00"), is("12.00"));
+        assertThat(cast2String(true), is("true"));
 
         try {
-            convert2String(new Date());
+            cast2String(new Date());
             assertTrue(false);
         }
         catch (JMSException e) {
@@ -197,10 +197,10 @@ public class PrimitiveTypeConvertTest {
     public void testConvert2ByteArray() throws Exception {
         byte[] arr = new byte[] {Byte.parseByte("11", 2), 
Byte.parseByte("101", 2)};
 
-        assertThat(convert2ByteArray(arr), is(arr));
+        assertThat(cast2ByteArray(arr), is(arr));
 
         try {
-            convert2ByteArray("10");
+            cast2ByteArray("10");
             assertTrue(false);
         }
         catch (JMSException e) {

Reply via email to