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.servicemix.bean.pojos;
018
019 import java.util.Set;
020
021 import javax.jbi.messaging.MessageExchange;
022 import javax.jbi.messaging.MessagingException;
023 import javax.jbi.messaging.NormalizedMessage;
024 import javax.jbi.messaging.InOut;
025 import javax.jbi.messaging.ExchangeStatus;
026 import javax.xml.transform.TransformerException;
027 import javax.xml.transform.Source;
028 import javax.xml.transform.dom.DOMSource;
029
030 import org.w3c.dom.Node;
031
032 import org.apache.servicemix.bean.support.BeanSupport;
033 import org.apache.servicemix.jbi.listener.MessageExchangeListener;
034 import org.apache.servicemix.jbi.jaxp.SourceTransformer;
035 import org.apache.servicemix.common.util.MessageUtil;
036 import org.apache.commons.logging.Log;
037 import org.apache.commons.logging.LogFactory;
038
039 /**
040 * A simple tracing component which can be placed inside a pipeline
041 * to trace the message exchange though the component.
042 * If an InOut exchange is received by this component, it will log the
043 * input message and copy it to the output message.
044 *
045 * @version $Revision: 648504 $
046 */
047 public class LoggingPojo extends BeanSupport implements MessageExchangeListener {
048
049 private Log log = LogFactory.getLog(LoggingPojo.class);
050
051 private SourceTransformer sourceTransformer = new SourceTransformer();
052
053 private int maxMsgDisplaySize = 1500;
054
055 public Log getLog() {
056 return log;
057 }
058
059 public void setLog(Log log) {
060 this.log = log;
061 }
062
063 public SourceTransformer getSourceTransformer() {
064 return sourceTransformer;
065 }
066
067 public void setSourceTransformer(SourceTransformer sourceTransformer) {
068 this.sourceTransformer = sourceTransformer;
069 }
070
071 public int getMaxMsgDisplaySize() {
072 return maxMsgDisplaySize;
073 }
074
075 public void setMaxMsgDisplaySize(int maxMsgDisplaySize) {
076 this.maxMsgDisplaySize = maxMsgDisplaySize;
077 }
078
079 /**
080 * Intercepts the {@link MessageExchange} to output the message and its
081 * properties for debugging purposes.
082 *
083 * @param exchange A JBI {@link MessageExchange} between two endpoints
084 */
085 public void onMessageExchange(MessageExchange exchange) throws MessagingException {
086 if (exchange.getStatus() == ExchangeStatus.ACTIVE) {
087 // lets dump the incoming message
088 NormalizedMessage message = exchange.getMessage("in");
089 StringBuffer sb = new StringBuffer();
090 sb.append("[\n");
091 sb.append(" id: ").append(exchange.getExchangeId()).append('\n');
092 sb.append(" mep: ").append(exchange.getPattern()).append('\n');
093 sb.append(" status: ").append(exchange.getStatus()).append('\n');
094 sb.append(" role: ").append(exchange.getRole() == MessageExchange.Role.CONSUMER ? "consumer" : "provider").append('\n');
095 if (exchange.getInterfaceName() != null) {
096 sb.append(" interface: ").append(exchange.getInterfaceName()).append('\n');
097 }
098 if (exchange.getService() != null) {
099 sb.append(" service: ").append(exchange.getService()).append('\n');
100 }
101 if (exchange.getEndpoint() != null) {
102 sb.append(" endpoint: ").append(exchange.getEndpoint().getEndpointName()).append('\n');
103 }
104 if (exchange.getOperation() != null) {
105 sb.append(" operation: ").append(exchange.getOperation()).append('\n');
106 }
107 if (exchange.getPropertyNames().size() > 0) {
108 sb.append(" properties: [").append('\n');
109 for (String key : (Set<String>) exchange.getPropertyNames()) {
110 sb.append(" ").append(key).append(" = ");
111 Object contents = exchange.getProperty(key);
112 if (contents instanceof Source) {
113 try {
114 contents = sourceTransformer.toString((Source) contents);
115 } catch (Exception e) { }
116 }
117 sb.append(contents);
118 sb.append('\n');
119 }
120 sb.append(" ]").append('\n');
121 }
122 display(exchange, "in", sb);
123 log.info("Exchange received " + sb.toString());
124 if (exchange instanceof InOut) {
125 MessageUtil.transferInToOut(exchange, exchange);
126 send(exchange);
127 } else {
128 done(exchange);
129 }
130 }
131 }
132
133 private void display(MessageExchange exchange, String msg, StringBuffer sb) {
134 NormalizedMessage message = exchange.getMessage(msg);
135 if (message != null) {
136 sb.append(" ").append(msg).append(": [").append('\n');
137 sb.append(" content: ");
138 try {
139 if (message.getContent() != null) {
140 Node node = sourceTransformer.toDOMNode(message.getContent());
141 message.setContent(new DOMSource(node));
142 String str = sourceTransformer.toString(node);
143 if (str.length() > maxMsgDisplaySize) {
144 sb.append(str.substring(0, maxMsgDisplaySize)).append("...");
145 } else {
146 sb.append(str);
147 }
148 } else {
149 sb.append("null");
150 }
151 } catch (Exception e) {
152 sb.append("Unable to display: ").append(e);
153 }
154 sb.append('\n');
155 if (message.getAttachmentNames().size() > 0) {
156 sb.append(" attachments: [").append('\n');
157 for (String key : (Set<String>) message.getAttachmentNames()) {
158 sb.append(" ").append(key).append(" = ").append(message.getAttachment(key)).append('\n');
159 }
160 sb.append(" ]").append('\n');
161 }
162 if (message.getPropertyNames().size() > 0) {
163 sb.append(" properties: [").append('\n');
164 for (String key : (Set<String>) message.getPropertyNames()) {
165 sb.append(" ").append(key).append(" = ");
166 Object contents = message.getProperty(key);
167 if (contents instanceof Source) {
168 try {
169 contents = sourceTransformer.toString((Source) contents);
170 } catch (Exception e) { }
171 }
172 sb.append(contents);
173 sb.append('\n');
174 }
175 sb.append(" ]").append('\n');
176 }
177 sb.append(" ]").append('\n');
178 }
179 }
180
181 }