001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.camel.component.jms;
018
019 import java.io.ByteArrayOutputStream;
020 import java.io.DataOutputStream;
021 import java.io.ObjectOutputStream;
022 import java.nio.ByteBuffer;
023 import java.util.Enumeration;
024
025 import javax.jms.BytesMessage;
026 import javax.jms.MapMessage;
027 import javax.jms.Message;
028 import javax.jms.MessageEOFException;
029 import javax.jms.ObjectMessage;
030 import javax.jms.StreamMessage;
031 import javax.jms.TextMessage;
032
033 import org.apache.camel.Converter;
034 import org.apache.camel.converter.NIOConverter;
035
036 /**
037 * Some simple payload conversions to I/O <a
038 * href="http://activemq.apache.org/camel/type-converter.html">Type Converters</a>
039 *
040 * @version $Revision: 533630 $
041 */
042
043 @Converter
044 public final class JmsIOConverter {
045
046 private JmsIOConverter() {
047 }
048
049 /**
050 * @param message
051 * @return a ByteBuffer
052 * @throws Exception
053 */
054 @Converter
055 public static ByteBuffer toByteBuffer(final Message message) throws Exception {
056
057 if (message instanceof TextMessage) {
058 final String text = ((TextMessage)message).getText();
059 return NIOConverter.toByteBuffer(text);
060 }
061 if (message instanceof BytesMessage) {
062 final BytesMessage bmsg = (BytesMessage)message;
063 final int len = (int)bmsg.getBodyLength();
064 final byte[] data = new byte[len];
065 bmsg.readBytes(data, len);
066 return NIOConverter.toByteBuffer(data);
067
068 }
069 if (message instanceof StreamMessage) {
070 final StreamMessage msg = (StreamMessage)message;
071 final ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
072 final DataOutputStream dataOut = new DataOutputStream(bytesOut);
073 try {
074 while (true) {
075 final Object obj = msg.readObject();
076 writeData(dataOut, obj);
077 }
078 } catch (MessageEOFException e) {
079 // we have no other way of knowing the end of the message
080 }
081 dataOut.close();
082 return NIOConverter.toByteBuffer(bytesOut.toByteArray());
083 }
084 if (message instanceof MapMessage) {
085 final MapMessage msg = (MapMessage)message;
086 final ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
087 final DataOutputStream dataOut = new DataOutputStream(bytesOut);
088 for (final Enumeration en = msg.getMapNames(); en.hasMoreElements();) {
089 final Object obj = msg.getObject(en.nextElement().toString());
090 writeData(dataOut, obj);
091 }
092 dataOut.close();
093 return NIOConverter.toByteBuffer(bytesOut.toByteArray());
094 }
095 if (message instanceof ObjectMessage) {
096 ObjectMessage objMessage = (ObjectMessage)message;
097 Object object = objMessage.getObject();
098 ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
099 ObjectOutputStream objectOut = new ObjectOutputStream(bytesOut);
100 objectOut.writeObject(object);
101 objectOut.close();
102 return NIOConverter.toByteBuffer(bytesOut.toByteArray());
103 }
104 return null;
105
106 }
107
108 private static void writeData(DataOutputStream dataOut, Object data) throws Exception {
109
110 if (data instanceof byte[]) {
111 dataOut.write((byte[])data);
112 } else if (data instanceof String) {
113 dataOut.writeUTF(data.toString());
114 } else if (data instanceof Double) {
115 dataOut.writeDouble(((Double)data).doubleValue());
116 } else if (data instanceof Float) {
117 dataOut.writeFloat(((Float)data).floatValue());
118 } else if (data instanceof Long) {
119 dataOut.writeLong(((Long)data).longValue());
120 } else if (data instanceof Integer) {
121 dataOut.writeInt(((Integer)data).intValue());
122 } else if (data instanceof Short) {
123 dataOut.writeShort(((Short)data).shortValue());
124 } else if (data instanceof Character) {
125 dataOut.writeChar(((Character)data).charValue());
126 } else if (data instanceof Byte) {
127 dataOut.writeByte(((Byte)data).byteValue());
128 } else if (data instanceof Boolean) {
129 dataOut.writeBoolean(((Boolean)data).booleanValue());
130 }
131
132 }
133 }