/*
* Copyright 2012 ClamShell-Cli.
*
* Licensed 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.clamshellcli.jmx;
import org.clamshellcli.api.Command;
import org.clamshellcli.api.Context;
import org.clamshellcli.api.IOConsole;
import org.clamshellcli.core.ShellException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.management.MBeanServerConnection;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
/**
* This Command lists the MBeans registered witht JMX MBean server. The
* command uses the pattern: parameter is used to provide one or more filter patterns
* used to generate the list. The setid: parameter will cause the list to
* cache the result and assign each entry a generated-identifier that can be
* used to refer to the MBean in other commands (see mbean command).
* <p>
* The List command format is:
*<pre>
* list [filter:<NamePatter> | ["pattern1","pattern2",...,patternN] label:<true|false>]"
*</pre>
* </p>
*
* @author vladimir.vivien
*/
public class ListCommand implements Command{
public static final String CMD_NAME = "list";
public static final String NAMESPACE = "jmx";
public static final String KEY_ARGS_FILTER = "filter";
public static final String KEY_ARGS_LABEL = "label";
public Command.Descriptor descriptor = null;
public Descriptor getDescriptor() {
return (descriptor != null ) ? descriptor : (
descriptor = new Command.Descriptor() {
public String getNamespace() {
return NAMESPACE;
}
public String getName() {
return CMD_NAME;
}
public String getDescription() {
return "Lists JMX MBeans.";
}
public String getUsage() {
return "list [filter:<NamePatterns> label:<true|false>]";
}
Map<String,String> args;
public Map<String, String> getArguments() {
if(args != null) return args;
args = new LinkedHashMap<String,String>();
args.put(KEY_ARGS_FILTER +":<NamePattern>", "An MBean object name pattern to filter list");
args.put(KEY_ARGS_FILTER +":[NamePatternList]", "One or more MBean object name patterns to filter list");
args.put(KEY_ARGS_LABEL +":<true|false>", "Assigns a label to beans to be used as identifiers");
return args;
}
}
);
}
public Object execute(Context ctx) {
IOConsole c = ctx.getIoConsole();
Map<String,Object> argsMap = (Map<String,Object>) ctx.getValue(Context.KEY_COMMAND_LINE_ARGS);
Map<String,ObjectInstance> mbeanMap = (Map<String,ObjectInstance>) ctx.getValue(Management.KEY_MBEANS_MAP);
// validate connection
Management.verifyServerConnection(ctx);
MBeanServerConnection server = (MBeanServerConnection)ctx.getValue(Management.KEY_JMX_MBEANSERVER);
Object patternParam = (argsMap != null) ? argsMap.get(KEY_ARGS_FILTER) : null;
Object labelParam = (argsMap != null) ? argsMap.get(KEY_ARGS_LABEL) : null;
Boolean setLabel = Boolean.FALSE;
if(labelParam instanceof String){
setLabel = Boolean.valueOf((String)labelParam);
}
if(labelParam instanceof Boolean){
setLabel = (Boolean)labelParam;
}
Set<ObjectInstance> objs = null;
try {
if (patternParam == null) {
c.writeOutput(String.format("%nMBean list [all]"));
objs = server.queryMBeans(null, null);
}else{
c.writeOutput(String.format("%nMBean list [%s]", patternParam));
if(patternParam instanceof String){
String pattern = (String) patternParam;
if(pattern.equals("*")){
objs = server.queryMBeans(null, null);
}else{
objs = server.queryMBeans(new ObjectName(pattern), null);
}
}
if(patternParam instanceof List){
List<String> patterns = (List<String>) patternParam;
objs = new HashSet<ObjectInstance>();
for(String pattern : patterns){
objs.addAll(server.queryMBeans(new ObjectName(pattern), null));
}
}
}
} catch (Exception ex) {
throw new ShellException(ex);
}
// print it all
long counter = 0;
for (ObjectInstance obj : objs) {
if (setLabel) {
String beanId = String.format("$%d", counter);
mbeanMap.put(beanId, obj);
c.writeOutput(getInstanceDesc(obj, true, beanId));
} else {
c.writeOutput(getInstanceDesc(obj, false, null));
}
counter++;
}
c.writeOutput(String.format("%n%n %d objects found.", counter));
c.writeOutput(String.format("%n%n"));
return null;
}
public void plug(Context plug) {
Map<String,ObjectInstance> mbeanMap = (Map<String,ObjectInstance>) plug.getValue(Management.KEY_MBEANS_MAP);
if(mbeanMap == null){
plug.putValue(Management.KEY_MBEANS_MAP, new HashMap<String,ObjectInstance>());
}
}
private String getInstanceDesc(ObjectInstance obj, boolean setId, String id) {
StringBuilder s = new StringBuilder();
if (setId) {
s.append(String.format(
"%n%5s[%s] %s",
" ",
id,
obj.getObjectName().getCanonicalName())
);
}else{
s.append(String.format(
"%n%5s %s",
" ",
obj.getObjectName().getCanonicalName())
);
}
return s.toString();
}
}