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 */
017package org.apache.activemq.transport.logwriters;
018
019import java.io.IOException;
020
021import org.apache.activemq.command.BaseCommand;
022import org.apache.activemq.command.ConnectionInfo;
023import org.apache.activemq.command.Message;
024import org.apache.activemq.command.MessageAck;
025import org.apache.activemq.command.MessageDispatch;
026import org.apache.activemq.command.ProducerAck;
027import org.apache.activemq.command.ProducerId;
028import org.apache.activemq.command.WireFormatInfo;
029import org.apache.activemq.transport.LogWriter;
030import org.slf4j.Logger;
031
032/**
033 * Custom implementation of LogWriter interface.
034 * 
035 * @author David Martin Clavo david(dot)martin(dot)clavo(at)gmail.com
036 * 
037 */
038public class CustomLogWriter implements LogWriter {
039    
040    // doc comment inherited from LogWriter
041    public void initialMessage(Logger log) {
042        
043    }
044
045    // doc comment inherited from LogWriter
046    public void logRequest (Logger log, Object command) {
047        log.debug("$$ SENDREQ: " + CustomLogWriter.commandToString(command));
048    }
049    
050    // doc comment inherited from LogWriter
051    public void logResponse (Logger log, Object response) {
052        log.debug("$$ GOT_RESPONSE: "+response);
053    }
054    
055    // doc comment inherited from LogWriter
056    public void logAsyncRequest (Logger log, Object command) {
057        log.debug("$$ SENDING_ASNYC_REQUEST: "+command);
058    }
059    
060    // doc comment inherited from LogWriter
061    public void logOneWay (Logger log, Object command) {
062        log.debug("$$ SENDING: " + CustomLogWriter.commandToString(command));
063    }
064    
065    // doc comment inherited from LogWriter
066    public void logReceivedCommand (Logger log, Object command) {
067        log.debug("$$ RECEIVED: " + CustomLogWriter.commandToString(command));
068    }
069    
070    // doc comment inherited from LogWriter
071    public void logReceivedException (Logger log, IOException error) {
072        log.debug("$$ RECEIVED_EXCEPTION: "+error, error);
073    }
074    
075    /**
076     * Transforms a command into a String
077     * @param command An object (hopefully of the BaseCommand class or subclass)
078     * to be transformed into String.
079     * @return A String which will be written by the CustomLogWriter.
080     * If the object is not a BaseCommand, the String 
081     * "Unrecognized_object " + command.toString()
082     * will be returned.
083     */
084    private static String commandToString(Object command) {
085        StringBuilder sb = new StringBuilder();
086        
087        if (command instanceof BaseCommand) {
088
089            BaseCommand bc = (BaseCommand)command;
090            sb.append(command.getClass().getSimpleName());
091            sb.append(' ');
092            sb.append(bc.isResponseRequired() ? 'T' : 'F');
093            
094            
095            Message m = null;
096            
097            if (bc instanceof Message) {
098                m = (Message)bc;
099            }
100            if (bc instanceof MessageDispatch){
101                m = ((MessageDispatch)bc).getMessage();   
102            }
103                
104            if (m != null) {
105                sb.append(' ');
106                sb.append(m.getMessageId());
107                sb.append(',');
108                sb.append(m.getCommandId());
109                ProducerId pid = m.getProducerId();
110                long sid = pid.getSessionId();
111                sb.append(',');
112                sb.append(pid.getConnectionId());
113                sb.append(',');
114                sb.append(sid);
115                sb.append(',');
116                sb.append(pid.getValue());
117                sb.append(',');
118                sb.append(m.getCorrelationId());
119                sb.append(',');
120                sb.append(m.getType());
121            }
122            
123            if (bc instanceof MessageDispatch){
124                sb.append(" toConsumer:");
125                sb.append(((MessageDispatch)bc).getConsumerId());
126            }
127            
128            if (bc instanceof ProducerAck) {
129                sb.append(" ProducerId:");
130                sb.append(((ProducerAck)bc).getProducerId());
131            }
132            
133            if (bc instanceof MessageAck) {
134                MessageAck ma = (MessageAck)bc;
135                sb.append(" ConsumerID:");
136                sb.append(ma.getConsumerId());
137                sb.append(" ack:");
138                sb.append(ma.getFirstMessageId());
139                sb.append('-');
140                sb.append(ma.getLastMessageId());
141            }
142            
143            if (bc instanceof ConnectionInfo) {
144                ConnectionInfo ci = (ConnectionInfo)bc;
145                
146                sb.append(' ');
147                sb.append(ci.getConnectionId());
148            }
149            
150        } else if (command instanceof WireFormatInfo){
151            sb.append("WireFormatInfo");
152            
153        } else {
154            sb.append("Unrecognized_object ");
155            sb.append(command.toString());
156        }
157        
158        return sb.toString();
159    }
160
161}