blob: e2267babc85b1c1eb1e3d2b3e6b9b33717bcb7f5 [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.activemq.console.command;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import java.util.StringTokenizer;
import org.apache.activemq.console.util.JmxMBeansUtil;
public class QueryCommand extends AbstractJmxCommand {
// Predefined type=identifier query
private static final Properties PREDEFINED_OBJNAME_QUERY = new Properties();
static {
PREDEFINED_OBJNAME_QUERY.setProperty("Broker", "Type=Broker,BrokerName=%1,*");
PREDEFINED_OBJNAME_QUERY.setProperty("Connection", "Type=Connection,Connection=%1,*");
PREDEFINED_OBJNAME_QUERY.setProperty("Connector", "Type=Connector,ConnectorName=%1,*");
PREDEFINED_OBJNAME_QUERY.setProperty("NetworkConnector", "Type=NetworkConnector,BrokerName=%1,*");
PREDEFINED_OBJNAME_QUERY.setProperty("Queue", "Type=Queue,Destination=%1,*");
PREDEFINED_OBJNAME_QUERY.setProperty("Topic", "Type=Topic,Destination=%1,*");
};
protected String[] helpFile = new String[] {
"Task Usage: Main query [query-options]",
"Description: Display selected broker component's attributes and statistics.",
"",
"Query Options:",
" -Q<type>=<name> Add to the search list the specific object type matched",
" by the defined object identifier.",
" -xQ<type>=<name> Remove from the search list the specific object type",
" matched by the object identifier.",
" --objname <query> Add to the search list objects matched by the query similar",
" to the JMX object name format.",
" --xobjname <query> Remove from the search list objects matched by the query",
" similar to the JMX object name format.",
" --view <attr1>,<attr2>,... Select the specific attribute of the object to view.",
" By default all attributes will be displayed.",
" --jmxurl <url> Set the JMX URL to connect to.",
" --pid <pid> Set the pid to connect to (only on Sun JVM).",
" --jmxuser <user> Set the JMX user used for authenticating.",
" --jmxpassword <password> Set the JMX password used for authenticating.",
" --jmxlocal Use the local JMX server instead of a remote one.",
" --version Display the version information.",
" -h,-?,--help Display the query broker help information.",
"", "Examples:",
" query",
" - Print all the attributes of all registered objects queues, topics, connections, etc).",
"",
" query -QQueue=TEST.FOO",
" - Print all the attributes of the queue with destination name TEST.FOO.",
"",
" query -QTopic=*",
" - Print all the attributes of all registered topics.",
"",
" query --view EnqueueCount,DequeueCount",
" - Print the attributes EnqueueCount and DequeueCount of all registered objects.",
"",
" query -QTopic=* --view EnqueueCount,DequeueCount",
" - Print the attributes EnqueueCount and DequeueCount of all registered topics.",
"",
" query -QTopic=* -QQueue=* --view EnqueueCount,DequeueCount",
" - Print the attributes EnqueueCount and DequeueCount of all registered topics and",
" queues.",
"",
" query -QTopic=* -xQTopic=ActiveMQ.Advisory.*",
" - Print all attributes of all topics except those that has a name that begins",
" with \"ActiveMQ.Advisory\".",
"",
" query --objname Type=*Connect*,BrokerName=local* -xQNetworkConnector=*",
" - Print all attributes of all connectors, connections excluding network connectors",
" that belongs to the broker that begins with local.",
"",
" query -QQueue=* -xQQueue=????",
" - Print all attributes of all queues except those that are 4 letters long.",
"",
};
private final List<String> queryAddObjects = new ArrayList<String>(10);
private final List<String> querySubObjects = new ArrayList<String>(10);
private final Set queryViews = new HashSet(10);
/**
* Queries the mbeans registered in the specified JMX context
*
* @param tokens - command arguments
* @throws Exception
*/
protected void runTask(List<String> tokens) throws Exception {
try {
// Query for the mbeans to add
List addMBeans = JmxMBeansUtil.queryMBeans(createJmxConnection(), queryAddObjects, queryViews);
// Query for the mbeans to sub
if (querySubObjects.size() > 0) {
List subMBeans = JmxMBeansUtil.queryMBeans(createJmxConnection(), querySubObjects, queryViews);
addMBeans.removeAll(subMBeans);
}
context.printMBean(JmxMBeansUtil.filterMBeansView(addMBeans, queryViews));
} catch (Exception e) {
context.printException(new RuntimeException("Failed to execute query task. Reason: " + e));
throw new Exception(e);
}
}
/**
* Handle the -Q, -xQ, --objname, --xobjname, --view options.
*
* @param token - option token to handle
* @param tokens - succeeding command arguments
* @throws Exception
*/
protected void handleOption(String token, List<String> tokens) throws Exception {
// If token is a additive predefined query define option
if (token.startsWith("-Q")) {
String key = token.substring(2);
String value = "";
int pos = key.indexOf("=");
if (pos >= 0) {
value = key.substring(pos + 1);
key = key.substring(0, pos);
}
// If additive query
String predefQuery = PREDEFINED_OBJNAME_QUERY.getProperty(key);
if (predefQuery == null) {
context.printException(new IllegalArgumentException("Unknown query object type: " + key));
return;
}
String queryStr = JmxMBeansUtil.createQueryString(predefQuery, value);
StringTokenizer queryTokens = new StringTokenizer(queryStr, COMMAND_OPTION_DELIMETER);
while (queryTokens.hasMoreTokens()) {
queryAddObjects.add(queryTokens.nextToken());
}
} else if (token.startsWith("-xQ")) {
// If token is a substractive predefined query define option
String key = token.substring(3);
String value = "";
int pos = key.indexOf("=");
if (pos >= 0) {
value = key.substring(pos + 1);
key = key.substring(0, pos);
}
// If subtractive query
String predefQuery = PREDEFINED_OBJNAME_QUERY.getProperty(key);
if (predefQuery == null) {
context.printException(new IllegalArgumentException("Unknown query object type: " + key));
return;
}
String queryStr = JmxMBeansUtil.createQueryString(predefQuery, value);
StringTokenizer queryTokens = new StringTokenizer(queryStr, COMMAND_OPTION_DELIMETER);
while (queryTokens.hasMoreTokens()) {
querySubObjects.add(queryTokens.nextToken());
}
} else if (token.startsWith("--objname")) {
// If token is an additive object name query option
// If no object name query is specified, or next token is a new
// option
if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) {
context.printException(new IllegalArgumentException("Object name query not specified"));
return;
}
StringTokenizer queryTokens = new StringTokenizer((String)tokens.remove(0), COMMAND_OPTION_DELIMETER);
while (queryTokens.hasMoreTokens()) {
queryAddObjects.add(queryTokens.nextToken());
}
} else if (token.startsWith("--xobjname")) {
// If token is a substractive object name query option
// If no object name query is specified, or next token is a new
// option
if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) {
context.printException(new IllegalArgumentException("Object name query not specified"));
return;
}
StringTokenizer queryTokens = new StringTokenizer((String)tokens.remove(0), COMMAND_OPTION_DELIMETER);
while (queryTokens.hasMoreTokens()) {
querySubObjects.add(queryTokens.nextToken());
}
} else if (token.startsWith("--view")) {
// If token is a view option
// If no view specified, or next token is a new option
if (tokens.isEmpty() || ((String)tokens.get(0)).startsWith("-")) {
context.printException(new IllegalArgumentException("Attributes to view not specified"));
return;
}
// Add the attributes to view
Enumeration viewTokens = new StringTokenizer((String)tokens.remove(0), COMMAND_OPTION_DELIMETER);
while (viewTokens.hasMoreElements()) {
queryViews.add(viewTokens.nextElement());
}
} else {
// Let super class handle unknown option
super.handleOption(token, tokens);
}
}
/**
* Print the help messages for the browse command
*/
protected void printHelp() {
context.printHelp(helpFile);
}
}