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