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 org.apache.camel.Exchange; 021 022 import javax.jms.BytesMessage; 023 import javax.jms.JMSException; 024 import javax.jms.MapMessage; 025 import javax.jms.Message; 026 import javax.jms.ObjectMessage; 027 import javax.jms.Session; 028 import javax.jms.StreamMessage; 029 import javax.jms.TextMessage; 030 import java.io.Serializable; 031 import java.util.Enumeration; 032 import java.util.HashMap; 033 import java.util.Map; 034 import java.util.Set; 035 036 /** 037 * A Strategy used to convert between a Camel {@JmsExchange} and {@JmsMessage} to and from a 038 * JMS {@link Message} 039 * 040 * @version $Revision: 534145 $ 041 */ 042 public class JmsBinding { 043 /** 044 * Extracts the body from the JMS message 045 * 046 * @param exchange 047 * @param message 048 */ 049 public Object extractBodyFromJms(JmsExchange exchange, Message message) { 050 try { 051 if (message instanceof ObjectMessage) { 052 ObjectMessage objectMessage = (ObjectMessage) message; 053 return objectMessage.getObject(); 054 } 055 else if (message instanceof TextMessage) { 056 TextMessage textMessage = (TextMessage) message; 057 return textMessage.getText(); 058 } 059 else if (message instanceof MapMessage) { 060 return createMapFromMapMessage((MapMessage) message); 061 } 062 else if (message instanceof BytesMessage || message instanceof StreamMessage) { 063 // TODO we need a decoder to be able to process the message 064 return message; 065 } 066 else { 067 return null; 068 } 069 } 070 catch (JMSException e) { 071 throw new RuntimeJmsException("Failed to extract body due to: " + e + ". Message: " + message, e); 072 } 073 } 074 075 /** 076 * Creates a JMS message from the Camel exchange and message 077 * 078 * @param session the JMS session used to create the message 079 * @return a newly created JMS Message instance containing the 080 * @throws JMSException if the message could not be created 081 */ 082 public Message makeJmsMessage(Exchange exchange, Session session) throws JMSException { 083 Message answer = createJmsMessage(exchange.getIn().getBody(), session); 084 appendJmsProperties(answer, exchange, session); 085 return answer; 086 } 087 088 /** 089 * Appends the JMS headers from the Camel {@link JmsMessage} 090 */ 091 protected void appendJmsProperties(Message jmsMessage, Exchange exchange, Session session) throws JMSException { 092 org.apache.camel.Message in = exchange.getIn(); 093 Set<Map.Entry<String, Object>> entries = in.getHeaders().entrySet(); 094 for (Map.Entry<String, Object> entry : entries) { 095 String headerName = entry.getKey(); 096 Object headerValue = entry.getValue(); 097 if (shouldOutputHeader(in, headerName, headerValue)) { 098 jmsMessage.setObjectProperty(headerName, headerValue); 099 } 100 } 101 } 102 103 protected Message createJmsMessage(Object body, Session session) throws JMSException { 104 if (body instanceof String) { 105 return session.createTextMessage((String) body); 106 } 107 else if (body instanceof Serializable) { 108 return session.createObjectMessage((Serializable) body); 109 } 110 else { 111 return session.createMessage(); 112 } 113 } 114 115 /** 116 * Extracts a {@link Map} from a {@link MapMessage} 117 */ 118 public Map<String, Object> createMapFromMapMessage(MapMessage message) throws JMSException { 119 Map<String, Object> answer = new HashMap<String, Object>(); 120 Enumeration names = message.getPropertyNames(); 121 while (names.hasMoreElements()) { 122 String name = names.nextElement().toString(); 123 Object value = message.getObject(name); 124 answer.put(name, value); 125 } 126 return answer; 127 } 128 129 /** 130 * Strategy to allow filtering of headers which are put on the JMS message 131 */ 132 protected boolean shouldOutputHeader(org.apache.camel.Message camelMessage, String headerName, Object headerValue) { 133 return true; 134 } 135 }