/* * Copyright 2003-2006 Rick Knowles <winstone-devel at lists sourceforge net> * Distributed under the terms of either: * - the common development and distribution license (CDDL), v1.0; or * - the GNU Lesser General Public License, v2.1 or later */ package winstone.cluster; import java.net.*; import java.io.*; import winstone.Logger; import winstone.WinstoneSession; /** * Contains all the logic for reading in sessions * * @author <a href="mailto:rick_knowles@hotmail.com">Rick Knowles</a> * @version $Id: ClusterSessionSearch.java,v 1.6 2006/03/24 17:24:18 rickknowles Exp $ */ public class ClusterSessionSearch implements Runnable { final int TIMEOUT = 2000; public static final byte SESSION_CHECK_TYPE = (byte) '1'; public static final String SESSION_NOT_FOUND = "NOTFOUND"; public static final String SESSION_FOUND = "FOUND"; public static final String SESSION_RECEIVED = "OK"; private boolean isFinished; // private boolean interrupted; private WinstoneSession result; private String searchWebAppHostname; private String searchWebAppPrefix; private String searchId; private String searchAddressPort; private int controlPort; /** * Sets up for a threaded search */ public ClusterSessionSearch(String webAppPrefix, String hostName, String sessionId, String ipPort, int controlPort) { this.isFinished = false; this.searchWebAppHostname = hostName; this.searchWebAppPrefix = webAppPrefix; // this.interrupted = false; this.searchId = sessionId; this.searchAddressPort = ipPort; this.result = null; this.controlPort = controlPort; // Start the search thread Thread searchThread = new Thread(this); searchThread.setDaemon(true); searchThread.start(); } /** * Actually implements the search */ public void run() { try { int colonPos = this.searchAddressPort.indexOf(':'); String ipAddress = this.searchAddressPort.substring(0, colonPos); String port = this.searchAddressPort.substring(colonPos + 1); Socket controlConnection = new Socket(ipAddress, Integer.parseInt(port)); controlConnection.setSoTimeout(TIMEOUT); OutputStream out = controlConnection.getOutputStream(); out.write(SESSION_CHECK_TYPE); out.flush(); ObjectOutputStream outControl = new ObjectOutputStream(out); outControl.writeInt(this.controlPort); outControl.writeUTF(this.searchId); outControl.writeUTF(this.searchWebAppHostname); outControl.writeUTF(this.searchWebAppPrefix); outControl.flush(); InputStream in = controlConnection.getInputStream(); ObjectInputStream inSession = new ObjectInputStream(in); String reply = inSession.readUTF(); if ((reply != null) && reply.equals(SESSION_FOUND)) { WinstoneSession session = (WinstoneSession) inSession .readObject(); outControl.writeUTF(SESSION_RECEIVED); this.result = session; } outControl.close(); inSession.close(); out.close(); in.close(); controlConnection.close(); } catch (Throwable err) { Logger.log(Logger.WARNING, SimpleCluster.CLUSTER_RESOURCES, "ClusterSessionSearch.Error", err); } this.isFinished = true; } public boolean isFinished() { return this.isFinished; } public WinstoneSession getResult() { return this.result; } public void destroy() { // this.interrupted = true; } public String getAddressPort() { return this.searchAddressPort; } }