blob: fe2a0f4cfcb444bb2d684f75eab7516e79473034 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2002-2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
*******************************************************************************/
package org.eclipse.wst.wsi.internal.core.monitor;
import java.net.Socket;
import java.util.Iterator;
import java.util.Vector;
import org.eclipse.wst.wsi.internal.core.WSIException;
import org.eclipse.wst.wsi.internal.core.log.MessageEntry;
import org.eclipse.wst.wsi.internal.core.log.MimeParts;
import org.eclipse.wst.wsi.internal.core.monitor.config.Redirect;
import org.eclipse.wst.wsi.internal.core.util.Utils;
/**
* A socket connection.
*
* @author Peter Brittenham (peterbr@us.ibm.com)
* @version 1.0.1
*/
public class SocketConnection extends Thread
{
protected Monitor monitor;
protected Redirect redirect;
protected Socket inSocket;
protected Socket outSocket;
protected String httpProxyHost = null;
protected int httpProxyPort;
protected SocketHandler requestSocketHandler = null;
protected SocketHandler responseSocketHandler = null;
private Vector listeners = new Vector(); // SS
/**
* Create socket connection.
* @param monitor a Monitor object.
* @param redirect a Redirect object.
* @param inSocket in socket.
*/
public SocketConnection(Monitor monitor, Redirect redirect, Socket inSocket)
{
this.monitor = monitor;
this.redirect = redirect;
this.inSocket = inSocket;
// Start processing the connection
start();
}
/**
* Process the socket connection.
*/
public void run()
{
// Get the HTTP proxy settings if there are any set (not used currently)
loadHttpProxySettings();
try
{
// Open the connection to the server
this.outSocket = new Socket(redirect.getToHost(), redirect.getToPort());
// Set the read timeout for the input socket
this.inSocket.setSoTimeout(redirect.getReadTimeoutSeconds() * 1000);
// Get the next conversation ID
int conversationId = monitor.getNextConversationId();
// Create the socket handlers which are used to send the data from
// the client to the server
requestSocketHandler =
new SocketHandler(
this,
MessageEntry.TYPE_REQUEST,
conversationId,
redirect.getToHost(),
this.inSocket,
this.outSocket,
redirect.getReadTimeoutSeconds());
responseSocketHandler =
new SocketHandler(
this,
MessageEntry.TYPE_RESPONSE,
conversationId,
redirect.getToHost(),
this.outSocket,
this.inSocket,
redirect.getReadTimeoutSeconds());
// Tell each socketHandler about the other one
requestSocketHandler.setPairedSocketHandler(responseSocketHandler);
responseSocketHandler.setPairedSocketHandler(requestSocketHandler);
}
catch (Exception e)
{
Monitor.staticPrintMessage(
"error04",
redirect.getToHost(),
"Monitor cannot connect to a redirect host:");
shutdown();
try
{
this.inSocket.close();
}
catch (Throwable t)
{
}
}
}
/**
* Log message.
* @param conversationID the coversation id.
* @param connectionType the connection type.
* @param timestamp the timestamp.
* @param senderHostAndPort the sender host and port.
* @param receiverHostAndPort the receiver host and port.
* @param messageBuffer the message.
* @param bom the BOM.
* @param encoding the encoding.
* @throws WSIException if there is a problem logging message.
*/
public void logMessage(
int conversationID,
String connectionType,
String timestamp,
String senderHostAndPort,
String receiverHostAndPort,
StringBuffer messageBuffer,
int bom,
String encoding)
throws WSIException
{
MessageEntry messageEntry = null;
// Create message entry
messageEntry =
createMessageEntry(
conversationID,
connectionType,
timestamp,
senderHostAndPort,
receiverHostAndPort,
messageBuffer.toString(),
bom,
encoding);
// DEBUG:
//debug("logMessage", " messageEntry: " + messageEntry);
// Add entry to the queue
monitor.getMessageEntryQueue().addMessageEntry(messageEntry);
}
/**
* Create a log entry from all of the data that was gathered.
*/
private MessageEntry createMessageEntry(
int conversationID,
String messageType,
String timestamp,
String senderHostAndPort,
String receiverHostAndPort,
String message,
int bom,
String encoding)
throws WSIException
{
// Create log entry object
MessageEntry messageEntry = monitor.getLog().createLogEntry();
// Set input information in log entry
// NOTE: The ID is set just before the log entry is written to the log file in LogEntryQueue
//logEntry.setId(id);
messageEntry.setConversationId(String.valueOf(conversationID));
messageEntry.setType(messageType);
messageEntry.setTimestamp(timestamp);
messageEntry.setSenderHostAndPort(senderHostAndPort);
messageEntry.setReceiverHostAndPort(receiverHostAndPort);
messageEntry.setEncoding(encoding);
// Get HTTP headers from full message
String httpHeaders = Utils.getHTTPHeaders(message);
messageEntry.setHTTPHeaders(httpHeaders);
if (Utils.isMultipartRelatedMessage(httpHeaders))
{
MimeParts mimeParts = Utils.parseMultipartRelatedMessage(message, httpHeaders, encoding);
if (mimeParts == null)
{
// problem creating Mimeparts -- treat it as simple SOAP message
String content = Utils.getContent(message);
messageEntry.setMessage(content);
messageEntry.setMimeContent(false);
}
else
{
messageEntry.setMimeParts(mimeParts);
messageEntry.setMimeContent(true);
}
}
else
{
// Get the message content
String content = Utils.getContent(message);
messageEntry.setMessage(content);
messageEntry.setMimeContent(false);
}
// Set the BOM, if there is one
if (bom != 0)
messageEntry.setBOM(bom);
return messageEntry;
}
/**
* Load HTTP proxy settings.
*/
public void loadHttpProxySettings()
{
// Get the HTTP proxy host setting
this.httpProxyHost = System.getProperty("http.proxyHost");
if (this.httpProxyHost != null && httpProxyHost.equals(""))
this.httpProxyHost = null;
// If there was an HTTP proxy host setting, then get the port
if (this.httpProxyHost != null)
{
String portString = System.getProperty("http.proxyPort");
// Set default to 80
if (portString == null || portString.equals(""))
this.httpProxyPort = 80;
else
httpProxyPort = Integer.parseInt(portString);
}
}
Monitor getMonitor()
{
return this.monitor;
}
synchronized void wakeUp()
{
fireConnectionClosed(); // SS
notifyAll();
}
/**
* Shutdown.
*/
public void shutdown()
{
if (this.requestSocketHandler != null)
this.requestSocketHandler.shutdown();
if (this.responseSocketHandler != null)
this.responseSocketHandler.shutdown();
}
// ==== SS start ====
/**
* Add connection event listener.
* @param listener event listener.
* @see #removeConnectionListener
*/
public void addConnectionListener(ConnectionListener listener)
{
listeners.add(listener);
}
/**
* Remove connection event listener.
* @param listener event listener.
* @see #addConnectionListener
*/
public void removeConnectionListener(ConnectionListener listener)
{
listeners.remove(listener);
}
/**
* Notify listeners on connection close.
*/
private void fireConnectionClosed()
{
for (Iterator i = listeners.iterator(); i.hasNext();)
{
ConnectionListener listener = (ConnectionListener) i.next();
listener.connectionClosed(this);
}
}
// ==== SS end ====
}