package org.cyclopsgroup.jmxterm.cc; import java.io.IOException; import java.util.Map; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; import org.apache.commons.lang.Validate; import org.cyclopsgroup.jmxterm.Connection; import org.cyclopsgroup.jmxterm.JavaProcessManager; import org.cyclopsgroup.jmxterm.Session; import org.cyclopsgroup.jmxterm.io.CommandInput; import org.cyclopsgroup.jmxterm.io.CommandOutput; /** * Implementation of {@link Session} which keeps a {@link ConnectionImpl} * * @author <a href="mailto:jiaqi.guo@gmail.com">Jiaqi Guo</a> */ class SessionImpl extends Session { private ConnectionImpl connection; /** * @param output Output result * @param input Command line input * @param jpm Java process manager */ SessionImpl( CommandOutput output, CommandInput input, JavaProcessManager jpm ) { super( output, input, jpm ); } /** * @inheritDoc */ @Override public void connect( JMXServiceURL url, Map<String, Object> env ) throws IOException { Validate.notNull( url, "URL can't be NULL" ); if ( connection != null ) { throw new IllegalStateException( "Session is already opened" ); } JMXConnector connector = doConnect( url, env ); connection = new ConnectionImpl( connector, url ); } /** * @inheritDoc */ @Override public void disconnect() throws IOException { if ( connection == null ) { return; } try { connection.close(); } finally { connection = null; } } /** * Connect to MBean server * * @param url MBean server URL * @param env A map of environment * @return Connector that holds connection to MBean server * @throws IOException Network errors */ protected JMXConnector doConnect( JMXServiceURL url, Map<String, Object> env ) throws IOException { return JMXConnectorFactory.connect( url, env ); } /** * @inheritDoc */ @Override public Connection getConnection() { if ( connection == null ) { throw new IllegalStateException( "Connection isn't open yet. Run open command to open a connection" ); } return connection; } /** * @inheritDoc */ @Override public boolean isConnected() { return connection != null; } }