/*
* JBoss, Home of Professional Open Source.
* Copyright 2010, Red Hat, Inc., and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.as.process.protocol;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadFactory;
import org.jboss.as.process.logging.ProcessLogger;
import org.jboss.as.process.protocol.Connection.ClosedCallback;
import org.wildfly.common.Assert;
import javax.net.SocketFactory;
/**
* A protocol client for management commands, which can also asynchronously receive protocol messages.
*
* @author <a href="mailto:david.lloyd@redhat.com">David M. Lloyd</a>
*/
public final class ProtocolClient {
private final ThreadFactory threadFactory;
private final SocketFactory socketFactory;
private final InetSocketAddress serverAddress;
private final MessageHandler messageHandler;
private final InetSocketAddress bindAddress;
private final int connectTimeout;
private final int readTimeout;
private final Executor readExecutor;
private final ClosedCallback callback;
public ProtocolClient(final Configuration configuration) {
threadFactory = configuration.getThreadFactory();
bindAddress = configuration.getBindAddress();
connectTimeout = configuration.getConnectTimeout();
socketFactory = configuration.getSocketFactory();
messageHandler = configuration.getMessageHandler();
serverAddress = configuration.getServerAddress();
readTimeout = configuration.getReadTimeout();
readExecutor = configuration.getReadExecutor();
callback = configuration.getClosedCallback();
Assert.checkNotNullParam("threadFactory", threadFactory);
Assert.checkNotNullParam("socketFactory", socketFactory);
Assert.checkNotNullParam("serverAddress", serverAddress);
Assert.checkNotNullParam("messageHandler", messageHandler);
Assert.checkNotNullParam("readExecutor", readExecutor);
}
public Connection connect() throws IOException {
ProcessLogger.PROTOCOL_CLIENT_LOGGER.tracef("Creating connection to %s", serverAddress);
final Socket socket = socketFactory.createSocket();
final ConnectionImpl connection = new ConnectionImpl(socket, messageHandler, readExecutor, callback);
final Thread thread = threadFactory.newThread(connection.getReadTask());
if (thread == null) {
throw ProcessLogger.ROOT_LOGGER.threadCreationRefused();
}
if (bindAddress != null) socket.bind(bindAddress);
if (readTimeout != 0) socket.setSoTimeout(readTimeout);
socket.connect(serverAddress, connectTimeout);
thread.setName("Read thread for " + serverAddress);
thread.start();
ProcessLogger.PROTOCOL_CLIENT_LOGGER.tracef("Connected to %s", serverAddress);
return connection;
}
public static final class Configuration {
private ThreadFactory threadFactory;
private SocketFactory socketFactory;
private InetSocketAddress serverAddress;
private MessageHandler messageHandler;
private InetSocketAddress bindAddress;
private Executor readExecutor;
private int connectTimeout = 0;
private int readTimeout = 0;
private ClosedCallback closedCallback;
public Configuration() {
}
public ThreadFactory getThreadFactory() {
return threadFactory;
}
public void setThreadFactory(final ThreadFactory threadFactory) {
this.threadFactory = threadFactory;
}
public SocketFactory getSocketFactory() {
return socketFactory;
}
public void setSocketFactory(final SocketFactory socketFactory) {
this.socketFactory = socketFactory;
}
public InetSocketAddress getServerAddress() {
return serverAddress;
}
public void setServerAddress(final InetSocketAddress serverAddress) {
this.serverAddress = serverAddress;
}
public MessageHandler getMessageHandler() {
return messageHandler;
}
public void setMessageHandler(final MessageHandler messageHandler) {
this.messageHandler = messageHandler;
}
public InetSocketAddress getBindAddress() {
return bindAddress;
}
public void setBindAddress(final InetSocketAddress bindAddress) {
this.bindAddress = bindAddress;
}
public Executor getReadExecutor() {
return readExecutor;
}
public void setReadExecutor(final Executor readExecutor) {
this.readExecutor = readExecutor;
}
public int getConnectTimeout() {
return connectTimeout;
}
public void setConnectTimeout(final int connectTimeout) {
this.connectTimeout = connectTimeout;
}
public int getReadTimeout() {
return readTimeout;
}
public void setReadTimeout(final int readTimeout) {
this.readTimeout = readTimeout;
}
public ClosedCallback getClosedCallback() {
return closedCallback;
}
public void setClosedCallback(ClosedCallback closedCallback) {
this.closedCallback = closedCallback;
}
}
}