blob: 806e161bbc002a8899883a0a74776b9ab8df3d38 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*
*/
package org.apache.qpid.tools.messagestore.commands;
import org.apache.qpid.AMQException;
import org.apache.qpid.framing.AMQShortString;
import org.apache.qpid.framing.BasicContentHeaderProperties;
import org.apache.qpid.framing.FieldTable;
import org.apache.qpid.framing.abstraction.MessagePublishInfo;
import org.apache.qpid.server.message.AMQMessage;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.queue.QueueEntry;
import org.apache.qpid.server.message.ServerMessage;
import org.apache.qpid.tools.messagestore.MessageStoreTool;
import org.apache.qpid.tools.utils.Console;
import java.util.LinkedList;
import java.util.List;
public class Show extends AbstractCommand
{
protected boolean _amqHeaders = false;
protected boolean _routing = false;
protected boolean _msgHeaders = false;
public Show(MessageStoreTool tool)
{
super(tool);
}
public String help()
{
return "Shows the messages headers.";
}
public String usage()
{
return getCommand() + " [show=[all],[msgheaders],[amqheaders],[routing]] [id=<msgid e.g. 1,2,4-10>]";
}
public String getCommand()
{
return "show";
}
public void execute(String... args)
{
assert args.length > 0;
assert args[0].equals(getCommand());
if (args.length < 2)
{
parseArgs("all");
}
else
{
parseArgs(args);
}
performShow();
}
protected void parseArgs(String... args)
{
List<Long> msgids = null;
if (args.length >= 2)
{
for (String arg : args)
{
if (arg.startsWith("show="))
{
_msgHeaders = arg.contains("msgheaders") || arg.contains("all");
_amqHeaders = arg.contains("amqheaders") || arg.contains("all");
_routing = arg.contains("routing") || arg.contains("all");
}
if (arg.startsWith("id="))
{
_tool.getState().setMessages(msgids);
}
}//for args
}// if args > 2
}
protected void performShow()
{
if (_tool.getState().getVhost() == null)
{
_console.println("No Virtualhost selected. 'DuSelect' a Virtualhost first.");
return;
}
AMQQueue _queue = _tool.getState().getQueue();
List<Long> msgids = _tool.getState().getMessages();
if (_queue != null)
{
List<QueueEntry> messages = _queue.getMessagesOnTheQueue();
if (messages == null || messages.size() == 0)
{
_console.println("No messages on queue");
return;
}
List<List> data = createMessageData(msgids, messages, _amqHeaders, _routing, _msgHeaders);
if (data != null)
{
_console.printMap(null, data);
}
else
{
String message = "No data to display.";
if (msgids != null)
{
message += " Is message selection correct? " + _tool.getState().printMessages();
}
_console.println(message);
}
}
else
{
_console.println("No Queue specified to show.");
}
}
/**
* Create the list data for display from the messages.
*
* @param msgids The list of message ids to display
* @param messages A list of messages to format and display.
* @param showHeaders should the header info be shown
* @param showRouting show the routing info be shown
* @param showMessageHeaders show the msg headers be shown
* @return the formated data lists for printing
*/
protected List<List> createMessageData(List<Long> msgids, List<QueueEntry> messages, boolean showHeaders, boolean showRouting,
boolean showMessageHeaders)
{
// Currenly exposed message properties
// //Printing the content Body
// msg.getContentBodyIterator();
// //Print the Headers
// ((BasicContentHeaderProperties)msg.getContentHeaderBody().properties).getAppId();
// ((BasicContentHeaderProperties)msg.getContentHeaderBody().properties).getAppIdAsString();
// ((BasicContentHeaderProperties)msg.getContentHeaderBody().properties).getClusterId();
// ((BasicContentHeaderProperties)msg.getContentHeaderBody().properties).getContentType();
// ((BasicContentHeaderProperties)msg.getContentHeaderBody().properties).getCorrelationId();
// ((BasicContentHeaderProperties)msg.getContentHeaderBody().properties).getDeliveryMode();
// ((BasicContentHeaderProperties)msg.getContentHeaderBody().properties).getEncoding();
// ((BasicContentHeaderProperties)msg.getContentHeaderBody().properties).getExpiration();
// ((BasicContentHeaderProperties)msg.getContentHeaderBody().properties).getHeaders();
// ((BasicContentHeaderProperties)msg.getContentHeaderBody().properties).getMessageNumber();
// ((BasicContentHeaderProperties)msg.getContentHeaderBody().properties).getPriority();
// ((BasicContentHeaderProperties)msg.getContentHeaderBody().properties).getPropertyFlags();
// ((BasicContentHeaderProperties)msg.getContentHeaderBody().properties).getReplyTo();
// ((BasicContentHeaderProperties)msg.getContentHeaderBody().properties).getTimestamp();
// ((BasicContentHeaderProperties)msg.getContentHeaderBody().properties).getType();
// ((BasicContentHeaderProperties)msg.getContentHeaderBody().properties).getUserId();
//
// //Print out all the property names
// ((BasicContentHeaderProperties)msg.getContentHeaderBody().properties).getHeaders().getPropertyNames();
//
// msg.getMessageNumber();
// msg.getSize();
// msg.getArrivalTime();
// msg.getDeliveredSubscription();
// msg.getDeliveredToConsumer();
// msg.getMessageHandle();
// msg.getMessageNumber();
// msg.getMessagePublishInfo();
// msg.getPublisher();
// msg.getStoreContext();
// msg.isAllContentReceived();
// msg.isPersistent();
// msg.isRedelivered();
// msg.isRejectedBy();
// msg.isTaken();
//Header setup
List<List> data = new LinkedList<List>();
List<String> id = new LinkedList<String>();
data.add(id);
id.add(Columns.ID.name());
id.add(Console.ROW_DIVIDER);
List<String> exchange = new LinkedList<String>();
List<String> routingkey = new LinkedList<String>();
List<String> immediate = new LinkedList<String>();
List<String> mandatory = new LinkedList<String>();
if (showRouting)
{
data.add(exchange);
exchange.add(Columns.Exchange.name());
exchange.add(Console.ROW_DIVIDER);
data.add(routingkey);
routingkey.add(Columns.RoutingKey.name());
routingkey.add(Console.ROW_DIVIDER);
data.add(immediate);
immediate.add(Columns.isImmediate.name());
immediate.add(Console.ROW_DIVIDER);
data.add(mandatory);
mandatory.add(Columns.isMandatory.name());
mandatory.add(Console.ROW_DIVIDER);
}
List<String> size = new LinkedList<String>();
List<String> appid = new LinkedList<String>();
List<String> clusterid = new LinkedList<String>();
List<String> contenttype = new LinkedList<String>();
List<String> correlationid = new LinkedList<String>();
List<String> deliverymode = new LinkedList<String>();
List<String> encoding = new LinkedList<String>();
List<String> arrival = new LinkedList<String>();
List<String> expiration = new LinkedList<String>();
List<String> priority = new LinkedList<String>();
List<String> propertyflag = new LinkedList<String>();
List<String> replyto = new LinkedList<String>();
List<String> timestamp = new LinkedList<String>();
List<String> type = new LinkedList<String>();
List<String> userid = new LinkedList<String>();
List<String> ispersitent = new LinkedList<String>();
List<String> isredelivered = new LinkedList<String>();
List<String> isdelivered = new LinkedList<String>();
data.add(size);
size.add(Columns.Size.name());
size.add(Console.ROW_DIVIDER);
if (showHeaders)
{
data.add(ispersitent);
ispersitent.add(Columns.isPersistent.name());
ispersitent.add(Console.ROW_DIVIDER);
data.add(isredelivered);
isredelivered.add(Columns.isRedelivered.name());
isredelivered.add(Console.ROW_DIVIDER);
data.add(isdelivered);
isdelivered.add(Columns.isDelivered.name());
isdelivered.add(Console.ROW_DIVIDER);
data.add(appid);
appid.add(Columns.App_ID.name());
appid.add(Console.ROW_DIVIDER);
data.add(clusterid);
clusterid.add(Columns.Cluster_ID.name());
clusterid.add(Console.ROW_DIVIDER);
data.add(contenttype);
contenttype.add(Columns.Content_Type.name());
contenttype.add(Console.ROW_DIVIDER);
data.add(correlationid);
correlationid.add(Columns.Correlation_ID.name());
correlationid.add(Console.ROW_DIVIDER);
data.add(deliverymode);
deliverymode.add(Columns.Delivery_Mode.name());
deliverymode.add(Console.ROW_DIVIDER);
data.add(encoding);
encoding.add(Columns.Encoding.name());
encoding.add(Console.ROW_DIVIDER);
data.add(arrival);
expiration.add(Columns.Arrival.name());
expiration.add(Console.ROW_DIVIDER);
data.add(expiration);
expiration.add(Columns.Expiration.name());
expiration.add(Console.ROW_DIVIDER);
data.add(priority);
priority.add(Columns.Priority.name());
priority.add(Console.ROW_DIVIDER);
data.add(propertyflag);
propertyflag.add(Columns.Property_Flag.name());
propertyflag.add(Console.ROW_DIVIDER);
data.add(replyto);
replyto.add(Columns.ReplyTo.name());
replyto.add(Console.ROW_DIVIDER);
data.add(timestamp);
timestamp.add(Columns.Timestamp.name());
timestamp.add(Console.ROW_DIVIDER);
data.add(type);
type.add(Columns.Type.name());
type.add(Console.ROW_DIVIDER);
data.add(userid);
userid.add(Columns.UserID.name());
userid.add(Console.ROW_DIVIDER);
}
List<String> msgHeaders = new LinkedList<String>();
if (showMessageHeaders)
{
data.add(msgHeaders);
msgHeaders.add(Columns.MsgHeaders.name());
msgHeaders.add(Console.ROW_DIVIDER);
}
//Add create the table of data
for (QueueEntry entry : messages)
{
ServerMessage msg = entry.getMessage();
if (!includeMsg(msg, msgids))
{
continue;
}
id.add(msg.getMessageNumber().toString());
size.add("" + msg.getSize());
arrival.add("" + msg.getArrivalTime());
ispersitent.add(msg.isPersistent() ? "true" : "false");
isredelivered.add(entry.isRedelivered() ? "true" : "false");
isdelivered.add(entry.getDeliveredToConsumer() ? "true" : "false");
// msg.getMessageHandle();
BasicContentHeaderProperties headers = null;
try
{
if(msg instanceof AMQMessage)
{
headers = ((BasicContentHeaderProperties) ((AMQMessage)msg).getContentHeaderBody().getProperties());
}
}
catch (AMQException e)
{
//ignore
// commandError("Unable to read properties for message: " + e.getMessage(), null);
}
if (headers != null)
{
String appidS = headers.getAppIdAsString();
appid.add(appidS == null ? "null" : appidS);
String clusterS = headers.getClusterIdAsString();
clusterid.add(clusterS == null ? "null" : clusterS);
String contentS = headers.getContentTypeAsString();
contenttype.add(contentS == null ? "null" : contentS);
String correlationS = headers.getCorrelationIdAsString();
correlationid.add(correlationS == null ? "null" : correlationS);
deliverymode.add("" + headers.getDeliveryMode());
AMQShortString encodeSS = headers.getEncoding();
encoding.add(encodeSS == null ? "null" : encodeSS.toString());
expiration.add("" + headers.getExpiration());
FieldTable headerFT = headers.getHeaders();
msgHeaders.add(headerFT == null ? "none" : "" + headerFT.toString());
priority.add("" + headers.getPriority());
propertyflag.add("" + headers.getPropertyFlags());
AMQShortString replytoSS = headers.getReplyTo();
replyto.add(replytoSS == null ? "null" : replytoSS.toString());
timestamp.add("" + headers.getTimestamp());
AMQShortString typeSS = headers.getType();
type.add(typeSS == null ? "null" : typeSS.toString());
AMQShortString useridSS = headers.getUserId();
userid.add(useridSS == null ? "null" : useridSS.toString());
MessagePublishInfo info = null;
try
{
if(msg instanceof AMQMessage)
{
info = ((AMQMessage)msg).getMessagePublishInfo();
}
}
catch (AMQException e)
{
//ignore
}
if (info != null)
{
AMQShortString exchangeSS = info.getExchange();
exchange.add(exchangeSS == null ? "null" : exchangeSS.toString());
AMQShortString routingkeySS = info.getRoutingKey();
routingkey.add(routingkeySS == null ? "null" : routingkeySS.toString());
immediate.add(info.isImmediate() ? "true" : "false");
mandatory.add(info.isMandatory() ? "true" : "false");
}
// msg.getPublisher(); -- only used in clustering
// msg.getStoreContext();
// msg.isAllContentReceived();
}// if headers!=null
// need to access internal map and do lookups.
// msg.isTaken();
// msg.getDeliveredSubscription();
// msg.isRejectedBy();
}
// if id only had the header and the divider in it then we have no data to display
if (id.size() == 2)
{
return null;
}
return data;
}
protected boolean includeMsg(ServerMessage msg, List<Long> msgids)
{
if (msgids == null)
{
return true;
}
Long msgid = msg.getMessageNumber();
boolean found = false;
if (msgids != null)
{
//check msgid is in msgids
for (Long l : msgids)
{
if (l.equals(msgid))
{
found = true;
break;
}
}
}
return found;
}
public enum Columns
{
ID,
Size,
Exchange,
RoutingKey,
isImmediate,
isMandatory,
isPersistent,
isRedelivered,
isDelivered,
App_ID,
Cluster_ID,
Content_Type,
Correlation_ID,
Delivery_Mode,
Encoding,
Arrival,
Expiration,
Priority,
Property_Flag,
ReplyTo,
Timestamp,
Type,
UserID,
MsgHeaders
}
}