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