User: starksm
Date: 01/08/06 09:08:35
Modified: src/main/org/jboss/web WebServer.java WebService.java
WebServiceMBean.java
Log:
Allow for binding the listening port to a specific IP address.
Add host attribute for setting the host portion of the RMI codebase URL.
Revision Changes Path
1.12 +64 -27 jboss/src/main/org/jboss/web/WebServer.java
Index: WebServer.java
===================================================================
RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/web/WebServer.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- WebServer.java 2001/08/03 17:15:58 1.11
+++ WebServer.java 2001/08/06 16:08:35 1.12
@@ -14,9 +14,11 @@
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
+import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.Socket;
import java.net.ServerSocket;
+import java.net.UnknownHostException;
import java.net.URL;
import java.util.HashMap;
import java.util.Properties;
@@ -36,10 +38,11 @@
*
* @author <a href="mailto:[EMAIL PROTECTED]">Marc Fleury</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Scott Stark</a>.
- * @version $Revision: 1.11 $
+ * @version $Revision: 1.12 $
*
* Revisions:
*
+ * 20010806 scott.stark: Allow binding of listening port to a specific IP address
* 20010619 scott.stark: Use log4j JBossCategory to enable trace level msgs
* 20010618 scott.stark: Fixed extraction of mime-type from file extension in
getMimeType
* 20010627 scott.stark: Restore ability to download from the server classpath if
no loader key is found
@@ -53,7 +56,14 @@
// Attributes ----------------------------------------------------
private static JBossCategory category =
(JBossCategory)JBossCategory.getInstance(WebServer.class);
/** The port the web server listens on */
- private int port = 8080;
+ private int port = 8083;
+
+ /** The interface to bind to. This is useful for multi-homed hosts
+ that want control over which interfaces accept connections. */
+ private InetAddress bindAddress;
+ /** The serverSocket listen queue depth */
+ private int backlog = 50;
+
/** The map of class loaders registered with the web server */
private HashMap loaderMap = new HashMap();
/** The web server http listening socket */
@@ -70,6 +80,7 @@
private ThreadPool threadPool = new ThreadPool();
// Public --------------------------------------------------------
+
/** Set the http listening port
*/
public void setPort(int p)
@@ -84,6 +95,43 @@
return port;
}
+ public String getBindAddress()
+ {
+ String address = null;
+ if( bindAddress != null )
+ address = bindAddress.getHostAddress();
+ return address;
+ }
+ public void setBindAddress(String host)
+ {
+ try
+ {
+ if (host != null)
+ bindAddress = InetAddress.getByName(host);
+ }
+ catch(UnknownHostException e)
+ {
+ String msg = "Invalid host address specified: " + host;
+ category.error(msg, e);
+ }
+ }
+
+ /** Get the server sockets listen queue depth
+ @return the listen queue depth
+ */
+ public int getBacklog()
+ {
+ return backlog;
+ }
+ /** Set the server sockets listen queue depth
+ */
+ public void setBacklog(int backlog)
+ {
+ if( backlog <= 0 )
+ backlog = 50;
+ this.backlog = backlog;
+ }
+
public boolean getDownloadServerClasses()
{
return downloadServerClasses;
@@ -109,14 +157,12 @@
{
try
{
- server = null;
- server = new ServerSocket(getPort());
- debug("Started on port " + getPort());
+ server = new ServerSocket(port, backlog, bindAddress);
+ category.debug("Started server: "+server);
listen();
}
catch (IOException e)
{
- debug("Could not start on port " + getPort());
throw e;
}
}
@@ -167,7 +213,7 @@
e.printStackTrace();
}
}
- trace("Added ClassLoader: "+cl+" URL: "+loaderURL);
+ category.trace("Added ClassLoader: "+cl+" URL: "+loaderURL);
return loaderURL;
}
@@ -201,7 +247,7 @@
{
// If the server is not null meaning we were not stopped report the err
if( server != null )
- debug("DynaServer error: " + e.getMessage());
+ category.error("Failed to accept connection", e);
return;
}
@@ -221,8 +267,8 @@
int separator = rawPath.indexOf('/');
String filePath = rawPath.substring(separator+1);
String loaderKey = rawPath.substring(0, separator+1);
- trace("loaderKey = "+loaderKey);
- trace("filePath = "+filePath);
+ category.trace("loaderKey = "+loaderKey);
+ category.trace("filePath = "+filePath);
ClassLoader loader = (ClassLoader) loaderMap.get(loaderKey);
/* If we did not find a class loader check to see if the raw path
begins with className + '@' + cl.hashCode() + '/' by looking for
@@ -232,19 +278,19 @@
if( loader == null && rawPath.indexOf('@') < 0 )
{
filePath = rawPath;
- trace("No loader, reset filePath = "+filePath);
+ category.trace("No loader, reset filePath = "+filePath);
loader = Thread.currentThread().getContextClassLoader();
}
- trace("loader = "+loader);
+ category.trace("loader = "+loader);
byte[] bytes;
if( filePath.endsWith(".class") )
{
// A request for a class file
String className = filePath.substring(0,
filePath.length()-6).replace('/','.');
- trace("loading className = "+className);
+ category.trace("loading className = "+className);
Class clazz = loader.loadClass(className);
URL clazzUrl =
clazz.getProtectionDomain().getCodeSource().getLocation();
- trace("clazzUrl = "+clazzUrl);
+ category.trace("clazzUrl = "+clazzUrl);
if (clazzUrl.getFile().endsWith(".jar"))
clazzUrl = new URL("jar:"+clazzUrl+"!/"+filePath);
else
@@ -258,7 +304,7 @@
else // Resource
{
// Try getting resource
- trace("loading resource = "+filePath);
+ category.trace("loading resource = "+filePath);
URL resourceUrl = loader.getResource(filePath);
if (resourceUrl == null)
throw new FileNotFoundException("Resource not
found:"+filePath);
@@ -302,7 +348,7 @@
{
// eat exception (could log error to log file, but
// write out to stdout for now).
- debug("error writing response: " + ex.getMessage());
+ category.debug("error writing response: " + ex.getMessage());
ex.printStackTrace();
}
finally
@@ -331,15 +377,6 @@
return key;
}
- protected void trace(String msg)
- {
- category.trace(msg);
- }
- protected void debug(String msg)
- {
- category.debug(msg);
- }
-
protected void listen()
{
threadPool.run(this);
@@ -351,7 +388,7 @@
protected String getPath(BufferedReader in) throws IOException
{
String line = in.readLine();
- trace("raw request="+line);
+ category.trace("raw request="+line);
// Find the request path by parsing the 'REQUEST_TYPE filePath
HTTP_VERSION' string
int start = line.indexOf(' ')+1;
int end = line.indexOf(' ', start+1);
@@ -365,7 +402,7 @@
protected byte[] getBytes(URL url) throws IOException
{
InputStream in = new BufferedInputStream(url.openStream());
- debug("Retrieving "+url.toString());
+ category.debug("Retrieving "+url.toString());
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] tmp = new byte[1024];
int bytes;
1.9 +86 -24 jboss/src/main/org/jboss/web/WebService.java
Index: WebService.java
===================================================================
RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/web/WebService.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- WebService.java 2001/08/03 17:15:58 1.8
+++ WebService.java 2001/08/06 16:08:35 1.9
@@ -11,20 +11,20 @@
import java.io.IOException;
import java.net.URL;
import java.net.InetAddress;
+import java.net.UnknownHostException;
import java.util.Properties;
import java.util.Enumeration;
import javax.management.*;
-import org.jboss.logging.Log;
import org.jboss.util.ServiceMBeanSupport;
/** The WebService implementation. It configures a WebServer instance to
perform dynamic class and resource loading.
* @author <a href="mailto:[EMAIL PROTECTED]">Rickard �berg</a>.
- * @author <a href="mailto:[EMAIL PROTECTED]">Scott Stark</a>.
- * @version $Revision: 1.8 $
+ * @author <a href="mailto:[EMAIL PROTECTED]">Scott Stark</a>.
+ * @version $Revision: 1.9 $
*/
public class WebService
extends ServiceMBeanSupport
@@ -33,10 +33,9 @@
// Constants -----------------------------------------------------
// Attributes ----------------------------------------------------
- WebServer server;
-
- Log log = Log.createLog(this.getClass().getName() + "#" + getName());
-
+ private WebServer server;
+ private String host;
+
// Static --------------------------------------------------------
// Constructors --------------------------------------------------
@@ -57,12 +56,30 @@
String type = mimeTypes.getProperty(extension);
server.addMimeType(extension, type);
}
- } catch (IOException e)
+ }
+ catch (IOException e)
{
- e.printStackTrace(System.err);
+ category.error("Failed to load mime.types", e);
}
+ // Get the public host name
+ try
+ {
+ host = System.getProperty("java.rmi.server.hostname");
+ }
+ catch(SecurityException e)
+ {
+ }
+ try
+ {
+ if( host == null )
+ host = InetAddress.getLocalHost().getHostName();
+ }
+ catch(IOException e)
+ {
+ category.error("Failed to get localhost name", e);
+ }
}
-
+
// Public --------------------------------------------------------
public ObjectName getObjectName(MBeanServer server, ObjectName name)
throws javax.management.MalformedObjectNameException
@@ -76,30 +93,26 @@
}
/** Start the web server for dynamic downloading of classes and resources.
- This sets the system java.rmi.server.hostname property to the local hostname
- if it has not been set. The system java.rmi.server.codebase is also set to
- "http://"+java.rmi.server.hostname+":"+getPort()+"/" if the
- java.rmi.server.codebase has not been set.
+ The system java.rmi.server.codebase is also set to
+ "http://"+getHost()":"+getPort()+"/" if the property has not been set.
*/
public void startService()
throws Exception
{
+ // Start the WebServer running
server.start();
- // Set the rmi host and codebase if they are not already set
- String host = System.getProperty("java.rmi.server.hostname");
- if( host == null )
- host = InetAddress.getLocalHost().getHostName();
-
+ category.info("Started webserver with address: " + server.getBindAddress() +
" port: "+server.getPort());
+
+ // Set the rmi codebase if it is not already set
String codebase = System.getProperty("java.rmi.server.codebase");
if( codebase == null )
{
codebase = "http://"+host+":"+getPort()+"/";
System.setProperty("java.rmi.server.codebase", codebase);
}
- log.log("Codebase set to "+codebase);
- log.log("Started webserver on port "+server.getPort());
+ category.info("Codebase set to: "+codebase);
}
-
+
public void stopService()
{
server.stop();
@@ -114,7 +127,7 @@
{
server.removeClassLoader(cl);
}
-
+
public void setPort(int port)
{
server.setPort(port);
@@ -124,7 +137,56 @@
{
return server.getPort();
}
-
+
+ public void setHost(String host)
+ {
+ this.host = host;
+ }
+
+ public String getHost()
+ {
+ return host;
+ }
+
+ /** Get the specific address the WebService listens on.t
+ @return the interface name or IP address the WebService binds to.
+ */
+ public String getBindAddress()
+ {
+ return server.getBindAddress();
+ }
+ /** Set the specific address the WebService listens on. This can be used on
+ a multi-homed host for a ServerSocket that will only accept connect requests
+ to one of its addresses.
+ @param host, the interface name or IP address to bind. If host is null,
+ connections on any/all local addresses will be allowed.
+ */
+ public void setBindAddress(String host) throws UnknownHostException
+ {
+ server.setBindAddress(host);
+ }
+
+ /** Get the WebService listen queue backlog limit. The maximum queue length
+ for incoming connection indications (a request to connect) is set to the
+ backlog parameter. If a connection indication arrives when the queue is
+ full, the connection is refused.
+ @return the queue backlog limit.
+ */
+ public int getBacklog()
+ {
+ return server.getBacklog();
+ }
+ /** Set the WebService listen queue backlog limit. The maximum queue length
+ for incoming connection indications (a request to connect) is set to the
+ backlog parameter. If a connection indication arrives when the queue is
+ full, the connection is refused.
+ @param backlog, the queue backlog limit.
+ */
+ public void setBacklog(int backlog)
+ {
+ server.setBacklog(backlog);
+ }
+
/** A flag indicating if the server should attempt to download classes from
* thread context class loader when a request arrives that does not have a
* class loader key prefix.
1.7 +47 -6 jboss/src/main/org/jboss/web/WebServiceMBean.java
Index: WebServiceMBean.java
===================================================================
RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/web/WebServiceMBean.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- WebServiceMBean.java 2001/08/03 17:15:58 1.6
+++ WebServiceMBean.java 2001/08/06 16:08:35 1.7
@@ -6,15 +6,14 @@
*/
package org.jboss.web;
+import java.net.UnknownHostException;
import java.net.URL;
-/**
- * <description>
+/** An mbean for configuring the classloader web service.
*
- * @see <related>
* @author <a href="mailto:[EMAIL PROTECTED]">Rickard �berg</a>.
- * @author <a href="mailto:[EMAIL PROTECTED]">Scott Stark</a>.
- * @version $Revision: 1.6 $
+ * @author <a href="mailto:[EMAIL PROTECTED]">Scott Stark</a>.
+ * @version $Revision: 1.7 $
*/
public interface WebServiceMBean
extends org.jboss.util.ServiceMBean
@@ -27,9 +26,51 @@
public void removeClassLoader(ClassLoader cl);
+ /** Set the WebService listening port.
+ @param part, the listening port, 0 == Anonymous.
+ */
public void setPort(int port);
-
+ /** Get the WebService listening port.
+ @return the WebService listening port, 0 == Anonymous.
+ */
public int getPort();
+
+ /** Get the name of the public interface to use for the host portion of the
+ RMI codebase URL.
+ */
+ public String getHost();
+ /** Set the name of the public interface to use for the host portion of the
+ RMI codebase URL.
+ */
+ public void setHost(String host);
+
+ /** Get the specific address the WebService listens on.t
+ @return the interface name or IP address the WebService binds to.
+ */
+ public String getBindAddress();
+ /** Set the specific address the WebService listens on. This can be used on
+ a multi-homed host for a ServerSocket that will only accept connect requests
+ to one of its addresses.
+ @param host, the interface name or IP address to bind. If host is null,
+ connections on any/all local addresses will be allowed.
+ */
+ public void setBindAddress(String host) throws UnknownHostException;
+
+ /** Get the WebService listen queue backlog limit. The maximum queue length
+ for incoming connection indications (a request to connect) is set to the
+ backlog parameter. If a connection indication arrives when the queue is
+ full, the connection is refused.
+ @return the queue backlog limit.
+ */
+ public int getBacklog();
+ /** Set the WebService listen queue backlog limit. The maximum queue length
+ for incoming connection indications (a request to connect) is set to the
+ backlog parameter. If a connection indication arrives when the queue is
+ full, the connection is refused.
+ @param backlog, the queue backlog limit.
+ */
+ public void setBacklog(int backlog);
+
/** A flag indicating if the server should attempt to download classes from
thread context class loader when a request arrives that does not have a
class loader key prefix.
_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
http://lists.sourceforge.net/lists/listinfo/jboss-development