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.beans.DesignMode;
021    import java.io.File;
022    import java.util.Enumeration;
023    import java.util.Map;
024    import javax.jms.Destination;
025    import javax.jms.JMSException;
026    import javax.jms.Message;
027    import javax.jms.Queue;
028    import javax.jms.TemporaryTopic;
029    import javax.jms.Topic;
030    import org.apache.camel.impl.DefaultMessage;
031    import org.apache.commons.logging.Log;
032    import org.apache.commons.logging.LogFactory;
033    
034    /**
035     * Represents a {@link org.apache.camel.Message} for working with JMS
036     *
037     * @version $Revision:520964 $
038     */
039    public class JmsMessage extends DefaultMessage {
040        private static final transient Log log = LogFactory.getLog(JmsMessage.class);
041        private Message jmsMessage;
042    
043        public JmsMessage() {
044        }
045    
046        public JmsMessage(Message jmsMessage) {
047            setJmsMessage(jmsMessage);
048        }
049    
050        @Override
051        public String toString() {
052            if (jmsMessage != null) {
053                return "JmsMessage: " + jmsMessage;
054            }
055            else {
056                return "JmsMessage: " + getBody();
057            }
058        }
059    
060           
061        /**
062         * Returns the underlying JMS message
063         *
064         * @return the underlying JMS message
065         */
066        public Message getJmsMessage() {
067            return jmsMessage;
068        }
069    
070        public void setJmsMessage(Message jmsMessage){
071            this.jmsMessage=jmsMessage;
072            try{
073                String id=getDestinationAsString(jmsMessage.getJMSDestination());
074                id+=getSanitizedString(jmsMessage.getJMSMessageID());
075                setMessageId(id);
076            }catch(JMSException e){
077                log.error("Failed to get message id from message "+jmsMessage,e);
078            }
079        }
080    
081        public Object getHeader(String name) {
082            Object answer = null;
083            if (jmsMessage != null) {
084                try {
085                    answer = jmsMessage.getObjectProperty(name);
086                }
087                catch (JMSException e) {
088                    throw new MessagePropertyAccessException(name, e);
089                }
090            }
091            if (answer == null) {
092                answer = super.getHeader(name);
093            }
094            return answer;
095        }
096    
097        @Override
098        public JmsMessage newInstance() {
099            return new JmsMessage();
100        }
101    
102        @Override
103        protected Object createBody() {
104            if (jmsMessage != null && getExchange() instanceof JmsExchange) {
105                JmsExchange exchange = (JmsExchange)getExchange();
106                return (exchange.getBinding().extractBodyFromJms(exchange, jmsMessage));
107            }
108            return null;
109        }
110    
111        @Override
112        protected void populateInitialHeaders(Map<String, Object> map) {
113            if (jmsMessage != null) {
114                Enumeration names;
115                try {
116                    names = jmsMessage.getPropertyNames();
117                }
118                catch (JMSException e) {
119                    throw new MessagePropertyNamesAccessException(e);
120                }
121                while (names.hasMoreElements()) {
122                    String name = names.nextElement().toString();
123                    try {
124                        Object value = jmsMessage.getObjectProperty(name);
125                        map.put(name, value);
126                    }
127                    catch (JMSException e) {
128                        throw new MessagePropertyAccessException(name, e);
129                    }
130                }
131            }
132        }
133        
134        private String getDestinationAsString(Destination destination) throws JMSException {
135            String result = "";
136            if (destination instanceof Topic) {
137                result += "topic" + File.separator + getSanitizedString(((Topic)destination).getTopicName());
138            }else {
139                result += "queue" + File.separator + getSanitizedString(((Queue)destination).getQueueName());
140            }
141            result += File.separator;
142            return result;
143        }
144        private String getSanitizedString(Object value) {
145            return value != null ? value.toString().replaceAll("[^a-zA-Z0-9\\.\\_\\-]", "_") : "";
146        }
147    }
148