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