/*
* The contents of this file are subject to the terms
* of the Common Development and Distribution License
* (the "License"). You may not use this file except
* in compliance with the License.
*
* You can obtain a copy of the license at
* https://glassfish.dev.java.net/public/CDDLv1.0.html.
* See the License for the specific language governing
* permissions and limitations under the License.
*
* When distributing Covered Code, include this CDDL
* HEADER in each file and include the License file at
* https://glassfish.dev.java.net/public/CDDLv1.0.html.
*
* If applicable add the following below this CDDL HEADER,
* with the fields enclosed by brackets "[]" replaced with
* your own identifying information: Portions Copyright
* [year] [name of copyright owner]
*/
/*
* @(#)Link.java 1.9 05/02/06
*
* Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
*/
package com.sun.messaging.jmq.transport.httptunnel;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* This class provides a common mechanism for establishing / maintaining
* and consuming packets from a TCP connection.
*/
public abstract class Link extends Thread {
private static boolean DEBUG = Boolean.getBoolean("httptunnel.debug");
private boolean connected = false;
protected boolean done = false;
protected InputStream is = null;
protected OutputStream os = null;
private Logger logger = Logger.getLogger("Http Tunneling");
/**
* Establish the connection. This method blocks and keeps trying
* until a connection is established.
*/
protected abstract void createLink();
/**
* Consume a packet received over this connection.
*/
protected abstract void receivePacket(HttpTunnelPacket p);
/**
* Handle connection error.
*/
protected abstract void handleLinkDown();
/**
* Send a packet over this connection.
*/
public synchronized void sendPacket(HttpTunnelPacket p) {
if (DEBUG) {
log("Sending packet : " + p);
}
try {
p.writePacket(os);
} catch (Exception e) {
if (DEBUG) {
log(e);
}
linkDown();
}
}
protected void linkDown() {
try {
is.close();
os.close();
handleLinkDown();
} catch (Exception e) {
}
connected = false;
}
public void shutdown() {
done = true;
}
public void run() {
while (!done) {
try {
if (connected == false) {
createLink();
connected = true;
}
HttpTunnelPacket p = new HttpTunnelPacket();
p.readPacket(is);
receivePacket(p);
} catch (IllegalStateException e) {
if (DEBUG) {
log(e);
}
done = true;
} catch (Exception e) {
if (DEBUG) {
log(e);
}
linkDown();
}
}
}
protected void log(String msg) {
logger.log(Level.INFO, msg);
}
protected void log(Exception ex) {
logger.log(Level.INFO, "Http Tunneling", ex);
}
}
/*
* EOF
*/
|