/*
* Copyright (c) 2001-2004 Ant-Contrib project. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.sf.antcontrib.antserver.client;
import java.io.*;
import java.net.Socket;
import java.net.SocketException;
import org.apache.tools.ant.Project;
import net.sf.antcontrib.antserver.Command;
import net.sf.antcontrib.antserver.Response;
import net.sf.antcontrib.antserver.Util;
import net.sf.antcontrib.antserver.commands.DisconnectCommand;
/****************************************************************************
* Place class description here.
*
* @author Matthew Inger
* @author
*
* @since
*
****************************************************************************/
public class Client
{
private String machine;
private int port;
private Project project;
public Client(Project project, String machine, int port)
{
super();
this.machine = machine;
this.port = port;
this.project = project;
}
private Socket socket;
private OutputStream os;
private InputStream is;
private ObjectOutputStream oos;
private ObjectInputStream ois;
private boolean connected;
public void connect()
throws IOException
{
project.log("Opening connection to " + machine + ":" + port,
Project.MSG_DEBUG);
try
{
socket = new Socket(machine, port);
socket.setKeepAlive(true);
project.log("Got connection to " + machine + ":" + port,
Project.MSG_DEBUG);
os = socket.getOutputStream();
is = socket.getInputStream();
oos = new ObjectOutputStream(os);
ois = new ObjectInputStream(is);
connected = true;
try
{
// Read the initial response object so that the
// object stream is initialized
ois.readObject();
}
catch (ClassNotFoundException e)
{
; // gulp
}
}
finally
{
// If we were unable to connect, close everything
if (!connected)
{
try
{
if (os != null)
os.close();
os = null;
oos = null;
}
catch (IOException e)
{
}
try
{
if (is != null)
is.close();
is = null;
ois = null;
}
catch (IOException e)
{
}
try
{
if (socket != null)
socket.close();
socket = null;
}
catch (IOException e)
{
}
}
}
}
public void shutdown()
{
try
{
if (os != null)
os.close();
}
catch (IOException e)
{
; // gulp
}
os = null;
oos = null;
try
{
if (is != null)
is.close();
}
catch (IOException e)
{
; // gulp
}
is = null;
ois = null;
try
{
socket.close();
}
catch (IOException e)
{
; // gulp
}
socket = null;
connected = false;
}
public void disconnect()
throws IOException
{
if (!connected)
return;
try {
oos.writeObject(DisconnectCommand.DISCONNECT_COMMAND);
try
{
// Read disconnect response
ois.readObject();
}
catch (ClassNotFoundException e)
{
; // gulp
}
shutdown();
}
catch (SocketException e) {
; // connection was closed
}
catch (EOFException e) {
; // connection was closed
}
}
public Response sendCommand(Command command)
throws IOException
{
project.log("Sending command: " + command,
Project.MSG_DEBUG);
oos.writeObject(command);
if (command.getContentLength() > 0)
{
Util.transferBytes(command.getContentStream(),
command.getContentLength(),
os,
true);
}
Response response = null;
try
{
// Read the response object
response = (Response) ois.readObject();
project.log("Received Response: " + response,
Project.MSG_DEBUG);
if (response.getContentLength() != 0)
{
command.respond(project,
response.getContentLength(),
is);
}
}
catch (ClassNotFoundException e)
{
; // gulp
}
return response;
}
}