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.impl;
019    
020    import org.apache.camel.Exchange;
021    import org.apache.camel.Message;
022    import org.apache.camel.util.UuidGenerator;
023    
024    /**
025     * A base class for implementation inheritence providing the core {@link Message} body
026     * handling features but letting the derived class deal with headers.
027     *
028     * Unless a specific provider wishes to do something particularly clever with headers you probably
029     * want to just derive from {@link DefaultMessage}
030     *
031     * @version $Revision: 535124 $
032     */
033    public abstract class MessageSupport implements Message {
034        private static final UuidGenerator defaultIdGenerator = new UuidGenerator();
035        private Exchange exchange;
036        private Object body;
037        private String messageId = defaultIdGenerator.generateId();
038        
039    
040        public Object getBody() {
041            if (body == null) {
042                body = createBody();
043            }
044            return body;
045        }
046    
047        @SuppressWarnings({"unchecked"})
048        public <T> T getBody(Class<T> type) {
049            Exchange e = getExchange();
050            if (e != null) {
051                return e.getContext().getTypeConverter().convertTo(type, getBody());
052            }
053            return (T) getBody();
054        }
055    
056        public void setBody(Object body) {
057            this.body = body;
058        }
059    
060        public <T> void setBody(Object body, Class<T> type) {
061            Exchange e = getExchange();
062            if (e != null) {
063                T value = e.getContext().getTypeConverter().convertTo(type, body);
064                if (value != null) {
065                    body = value;
066                }
067            }
068            setBody(body);
069        }
070    
071        public Message copy() {
072            Message answer = newInstance();
073            answer.setMessageId(getMessageId());
074            answer.setBody(getBody());
075            answer.getHeaders().putAll(getHeaders());
076            return answer;
077        }
078    
079        public Exchange getExchange() {
080            return exchange;
081        }
082    
083        public void setExchange(Exchange exchange) {
084            this.exchange = exchange;
085        }
086    
087        /**
088         * Returns a new instance
089         *
090         * @return
091         */
092        public abstract Message newInstance();
093    
094    
095        /**
096         * A factory method to allow a provider to lazily create the message body for inbound messages from other sources
097         *
098         * @return the value of the message body or null if there is no value available
099         */
100        protected Object createBody() {
101            return null;
102        }
103    
104        
105        /**
106         * @return the messageId
107         */
108        public String getMessageId(){
109            return this.messageId;
110        }
111    
112        
113        /**
114         * @param messageId the messageId to set
115         */
116        public void setMessageId(String messageId){
117            this.messageId=messageId;
118        }
119    }