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    }