package org.jboss.as.test.integration.respawn; import org.jboss.as.controller.client.impl.AbstractModelControllerClient; import org.jboss.as.controller.descriptions.ModelDescriptionConstants; import org.jboss.as.protocol.ProtocolConnectionConfiguration; import org.jboss.as.protocol.ProtocolConnectionManager; import org.jboss.as.protocol.mgmt.FutureManagementChannel; import org.jboss.as.protocol.mgmt.ManagementChannelAssociation; import org.jboss.as.protocol.mgmt.ManagementChannelHandler; import org.jboss.dmr.ModelNode; import org.jboss.remoting3.Channel; import org.jboss.remoting3.Connection; import org.xnio.IoUtils; import org.xnio.OptionMap; import java.io.IOException; import java.util.concurrent.ExecutorService; /** * @author Emanuel Muckenhuber */ class TestControllerClient extends AbstractModelControllerClient { private final ManagementChannelHandler channelHandler; private final ProtocolConnectionManager connectionManager; private final ChannelStrategy channelStrategy = new ChannelStrategy(); TestControllerClient(final ProtocolConnectionConfiguration configuration, final ExecutorService executor) { connectionManager = ProtocolConnectionManager.create(configuration, channelStrategy); channelHandler = new ManagementChannelHandler(channelStrategy, executor, this); } @Override protected ManagementChannelAssociation getChannelAssociation() throws IOException { return channelHandler; } protected void connect() throws IOException { connectionManager.connect(); } protected ModelNode executeAwaitClosed(final ModelNode operation) throws IOException { final Channel channel = getChannelAssociation().getChannel(); final Connection connection = channel.getConnection(); final ModelNode result = execute(operation); if(! ModelDescriptionConstants.SUCCESS.equals(result.get(ModelDescriptionConstants.OUTCOME).asString())) { return result; } try { connection.awaitClosed(); } catch (InterruptedException e) { e.printStackTrace(); } return result; } @Override public void close() throws IOException { try { try { channelHandler.shutdown(); } finally { IoUtils.safeClose(channelStrategy); } } finally { channelHandler.shutdownNow(); } } private class ChannelStrategy extends FutureManagementChannel { @Override public void connectionOpened(final Connection connection) throws IOException { final Channel channel = openChannel(connection, "management", OptionMap.EMPTY); if(setChannel(channel)) { channel.receiveMessage(channelHandler.getReceiver()); channel.addCloseHandler(channelHandler); } else { channel.closeAsync(); } } @Override public void close() throws IOException { try { super.close(); } finally { connectionManager.shutdown(); } } } }