package org.cyclopsgroup.jmxterm; import java.io.IOException; import java.util.Map; import javax.management.remote.JMXServiceURL; import org.apache.commons.lang.Validate; import org.cyclopsgroup.jmxterm.io.CommandInput; import org.cyclopsgroup.jmxterm.io.CommandOutput; import org.cyclopsgroup.jmxterm.io.UnimplementedCommandInput; import org.cyclopsgroup.jmxterm.io.VerboseCommandOutput; import org.cyclopsgroup.jmxterm.io.VerboseCommandOutputConfig; import org.cyclopsgroup.jmxterm.io.VerboseLevel; /** * JMX communication context. This class exists for the whole lifecycle of a command execution. It is NOT thread safe. * The caller(CommandCenter) makes sure all calls are synchronized. * * @author <a href="mailto:jiaqi.guo@gmail.com">Jiaqi Guo</a> */ public abstract class Session implements VerboseCommandOutputConfig { private String bean; private boolean closed; private String domain; private final CommandInput input; /** * Public output field. TODO Reevaluate if this field should be public or exposed by a getter method */ public final CommandOutput output; private final JavaProcessManager processManager; private VerboseLevel verboseLevel = VerboseLevel.BRIEF; /** * @param output Output destination * @param input Command line input * @param processManager Process manager */ protected Session( CommandOutput output, CommandInput input, JavaProcessManager processManager ) { Validate.notNull( output, "Output can't be NULL" ); Validate.notNull( processManager, "Process manager can't be NULL" ); this.output = new VerboseCommandOutput( output, this ); this.input = input == null ? new UnimplementedCommandInput() : input; this.processManager = processManager; } /** * Close JMX terminal console. Supposedly, process terminates after this call */ public void close() { if ( closed ) { return; } closed = true; } /** * Connect to MBean server * * @param url URL to connect * @param env Environment variables * @throws IOException */ public abstract void connect( JMXServiceURL url, Map<String, Object> env ) throws IOException; /** * Close JMX connector * * @throws IOException Thrown when connection can't be closed */ public abstract void disconnect() throws IOException; /** * @return Current selected bean */ public final String getBean() { return bean; } /** * @return Current open JMX server connection */ public abstract Connection getConnection(); /** * @return Current domain */ public final String getDomain() { return domain; } /** * @return General input of command lines, which could be interactive environment, a file or piped input */ public final CommandInput getInput() { return input; } /** * @return Java process manager to load processes */ public JavaProcessManager getProcessManager() { return processManager; } /** * @inheritDoc */ public final VerboseLevel getVerboseLevel() { return verboseLevel; } /** * @return True if {@link #close()} has been called */ public final boolean isClosed() { return closed; } /** * @return True if there's a open connection to JMX server */ public abstract boolean isConnected(); /** * Set current selected bean * * @param bean Bean to select */ public final void setBean( String bean ) { this.bean = bean; } /** * Set current selected domain * * @param domain Domain to select */ public final void setDomain( String domain ) { Validate.notNull( domain, "domain can't be NULL" ); this.domain = domain; } /** * @param verboseLevel Level of verbose */ public final void setVerboseLevel( VerboseLevel verboseLevel ) { Validate.notNull( verboseLevel, "Verbose level can't be NULL" ); this.verboseLevel = verboseLevel; } /** * Set domain and bean to be NULL */ public void unsetDomain() { bean = null; domain = null; } }