Package org.cyclopsgroup.jmxterm.cmd

Source Code of org.cyclopsgroup.jmxterm.cmd.SetCommand

package org.cyclopsgroup.jmxterm.cmd;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.management.Attribute;
import javax.management.JMException;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanInfo;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;

import org.apache.commons.lang.Validate;
import org.cyclopsgroup.jcli.annotation.Argument;
import org.cyclopsgroup.jcli.annotation.Cli;
import org.cyclopsgroup.jcli.annotation.MultiValue;
import org.cyclopsgroup.jcli.annotation.Option;
import org.cyclopsgroup.jmxterm.Command;
import org.cyclopsgroup.jmxterm.Session;
import org.cyclopsgroup.jmxterm.SyntaxUtils;
import org.cyclopsgroup.jmxterm.utils.ValueFormat;

/**
* Command to set an attribute
*
* @author <a href="mailto:jiaqi.guo@gmail.com">Jiaqi Guo</a>
*/
@Cli( name = "set", description = "Set value of an MBean attribute" )
public class SetCommand
    extends Command
{
    private List<String> arguments = Collections.emptyList();

    private String bean;

    private String domain;

    /**
     * @inheritDoc
     */
    @Override
    protected List<String> doSuggestArgument()
        throws IOException, JMException
    {
        Session session = getSession();
        if ( session.getBean() != null )
        {
            MBeanServerConnection conn = getSession().getConnection().getServerConnection();
            MBeanInfo info = conn.getMBeanInfo( new ObjectName( session.getBean() ) );
            MBeanAttributeInfo[] attrs = info.getAttributes();
            List<String> attributeNames = new ArrayList<String>( attrs.length );
            for ( MBeanAttributeInfo attr : attrs )
            {
                attributeNames.add( attr.getName() );
            }
            return attributeNames;
        }
        return null;
    }

    /**
     * @inheritDoc
     */
    @Override
    protected List<String> doSuggestOption( String optionName )
        throws JMException
    {
        if ( optionName.equals( "d" ) )
        {
            return DomainsCommand.getCandidateDomains( getSession() );
        }
        else if ( optionName.equals( "b" ) )
        {
            return BeanCommand.getCandidateBeanNames( getSession() );
        }
        else
        {
            return null;
        }
    }

    /**
     * @inheritDoc
     */
    @Override
    public void execute()
        throws JMException, IOException
    {
        Validate.isTrue( arguments.size() >= 2, "At least two arguments are required" );
        Session session = getSession();
        String attributeName = arguments.get( 0 );

        String beanName = BeanCommand.getBeanName( bean, domain, session );
        ObjectName name = new ObjectName( beanName );

        MBeanServerConnection con = session.getConnection().getServerConnection();
        MBeanInfo beanInfo = con.getMBeanInfo( new ObjectName( beanName ) );
        MBeanAttributeInfo attributeInfo = null;
        for ( MBeanAttributeInfo i : beanInfo.getAttributes() )
        {
            if ( i.getName().equals( attributeName ) )
            {
                attributeInfo = i;
                break;
            }
        }
        if ( attributeInfo == null )
        {
            throw new IllegalArgumentException( "Attribute " + attributeName + " is not specified" );
        }
        if ( !attributeInfo.isWritable() )
        {
            throw new IllegalArgumentException( "Attribute " + attributeName + " is not writable" );
        }
        String inputValue = arguments.get( 1 );
        if ( inputValue != null )
        {
            inputValue = ValueFormat.parseValue( inputValue );
        }
        Object value = SyntaxUtils.parse( inputValue, attributeInfo.getType() );
        con.setAttribute( name, new Attribute( attributeName, value ) );
        session.output.printMessage( "Value of attribute " + attributeName + " is set to " + inputValue );
    }

    /**
     * @param arguments Argument list. The first argument is attribute name
     */
    @MultiValue( listType = ArrayList.class, minValues = 2 )
    @Argument( description = "name, value, value2..." )
    public final void setArguments( List<String> arguments )
    {
        Validate.notNull( arguments, "Arguments can't be NULL" );
        this.arguments = arguments;
    }

    /**
     * @param bean Bean where the attribute is
     */
    @Option( name = "b", longName = "bean", description = "MBean name where the attribute is. Optional if bean has been set" )
    public final void setBean( String bean )
    {
        this.bean = bean;
    }

    /**
     * @param domain Domain where the bean is
     */
    @Option( name = "d", longName = "domain", description = "Domain under which the bean is" )
    public final void setDomain( String domain )
    {
        this.domain = domain;
    }
}
TOP

Related Classes of org.cyclopsgroup.jmxterm.cmd.SetCommand

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.