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.processor.interceptor;
018
019 import java.io.Serializable;
020 import java.util.Date;
021
022 import org.apache.camel.Exchange;
023 import org.apache.camel.Message;
024 import org.apache.camel.model.ProcessorDefinition;
025 import org.apache.camel.spi.TraceableUnitOfWork;
026 import org.apache.camel.util.MessageHelper;
027
028 /**
029 * Default {@link TraceEventMessage}.
030 */
031 public final class DefaultTraceEventMessage implements Serializable, TraceEventMessage {
032
033 private Date timestamp;
034 private String fromEndpointUri;
035 private String previousNode;
036 private String toNode;
037 private String exchangeId;
038 private String shortExchangeId;
039 private String exchangePattern;
040 private String properties;
041 private String headers;
042 private String body;
043 private String bodyType;
044 private String outHeaders;
045 private String outBody;
046 private String outBodyType;
047 private String causedByException;
048
049 /**
050 * Creates a {@link DefaultTraceEventMessage} based on the given node it was traced while processing
051 * the current {@link Exchange}
052 *
053 * @param toNode the node where this trace is intercepted
054 * @param exchange the current {@link Exchange}
055 */
056 public DefaultTraceEventMessage(final Date timestamp, final ProcessorDefinition toNode, final Exchange exchange) {
057 Message in = exchange.getIn();
058
059 // need to use defensive copies to avoid Exchange altering after the point of interception
060 this.timestamp = timestamp;
061 this.fromEndpointUri = exchange.getFromEndpoint() != null ? exchange.getFromEndpoint().getEndpointUri() : null;
062 this.previousNode = extractPreviousNode(exchange);
063 this.toNode = extractNode(toNode);
064 this.exchangeId = exchange.getExchangeId();
065 this.shortExchangeId = extractShortExchangeId(exchange);
066 this.exchangePattern = exchange.getPattern().toString();
067 this.properties = exchange.getProperties().isEmpty() ? null : exchange.getProperties().toString();
068 this.headers = in.getHeaders().isEmpty() ? null : in.getHeaders().toString();
069 this.body = MessageHelper.extractBodyAsString(in);
070 this.bodyType = MessageHelper.getBodyTypeName(in);
071 if (exchange.hasOut()) {
072 Message out = exchange.getOut();
073 this.outHeaders = out.getHeaders().isEmpty() ? null : out.getHeaders().toString();
074 this.outBody = MessageHelper.extractBodyAsString(out);
075 this.outBodyType = MessageHelper.getBodyTypeName(out);
076 }
077 this.causedByException = exchange.getException() != null ? exchange.getException().toString() : null;
078 }
079
080 // Implementation
081 //---------------------------------------------------------------
082 private String extractNode(ProcessorDefinition node) {
083 return node.getShortName() + "(" + node.getLabel() + ")";
084 }
085
086 private String extractShortExchangeId(Exchange exchange) {
087 return exchange.getExchangeId().substring(exchange.getExchangeId().indexOf("/") + 1);
088 }
089
090 private String extractPreviousNode(Exchange exchange) {
091 if (exchange.getUnitOfWork() instanceof TraceableUnitOfWork) {
092 TraceableUnitOfWork tuow = (TraceableUnitOfWork) exchange.getUnitOfWork();
093 ProcessorDefinition last = tuow.getLastInterceptedNode();
094 return last != null ? extractNode(last) : null;
095 }
096 return null;
097 }
098
099 // Properties
100 //---------------------------------------------------------------
101
102 public Date getTimestamp() {
103 return timestamp;
104 }
105
106 public String getFromEndpointUri() {
107 return fromEndpointUri;
108 }
109
110 public String getPreviousNode() {
111 return previousNode;
112 }
113
114 public String getToNode() {
115 return toNode;
116 }
117
118 public String getExchangeId() {
119 return exchangeId;
120 }
121
122 public String getShortExchangeId() {
123 return shortExchangeId;
124 }
125
126 public String getExchangePattern() {
127 return exchangePattern;
128 }
129
130 public String getProperties() {
131 return properties;
132 }
133
134 public String getHeaders() {
135 return headers;
136 }
137
138 public String getBody() {
139 return body;
140 }
141
142 public String getBodyType() {
143 return bodyType;
144 }
145
146 public String getOutBody() {
147 return outBody;
148 }
149
150 public String getOutBodyType() {
151 return outBodyType;
152 }
153
154 public String getOutHeaders() {
155 return outHeaders;
156 }
157
158 public void setOutHeaders(String outHeaders) {
159 this.outHeaders = outHeaders;
160 }
161
162 public String getCausedByException() {
163 return causedByException;
164 }
165
166 public void setTimestamp(Date timestamp) {
167 this.timestamp = timestamp;
168 }
169
170 public void setFromEndpointUri(String fromEndpointUri) {
171 this.fromEndpointUri = fromEndpointUri;
172 }
173
174 public void setPreviousNode(String previousNode) {
175 this.previousNode = previousNode;
176 }
177
178 public void setToNode(String toNode) {
179 this.toNode = toNode;
180 }
181
182 public void setExchangeId(String exchangeId) {
183 this.exchangeId = exchangeId;
184 }
185
186 public void setShortExchangeId(String shortExchangeId) {
187 this.shortExchangeId = shortExchangeId;
188 }
189
190 public void setExchangePattern(String exchangePattern) {
191 this.exchangePattern = exchangePattern;
192 }
193
194 public void setProperties(String properties) {
195 this.properties = properties;
196 }
197
198 public void setHeaders(String headers) {
199 this.headers = headers;
200 }
201
202 public void setBody(String body) {
203 this.body = body;
204 }
205
206 public void setBodyType(String bodyType) {
207 this.bodyType = bodyType;
208 }
209
210 public void setOutBody(String outBody) {
211 this.outBody = outBody;
212 }
213
214 public void setOutBodyType(String outBodyType) {
215 this.outBodyType = outBodyType;
216 }
217
218 public void setCausedByException(String causedByException) {
219 this.causedByException = causedByException;
220 }
221
222 @Override
223 public String toString() {
224 return "TraceEventMessage[" + exchangeId + "] on node: " + toNode;
225 }
226 }