WebService.java |
/*************************************** * * * JBoss: The OpenSource J2EE WebOS * * * * Distributable under LGPL license. * * See terms of license at gnu.org. * * * ***************************************/ package org.jboss.web; import java.io.IOException; import java.net.InetAddress; import java.net.URL; import java.net.UnknownHostException; import java.util.Enumeration; import java.util.Properties; import javax.management.MBeanServer; import javax.management.ObjectName; import org.jboss.system.MissingAttributeException; import org.jboss.system.ServiceMBeanSupport; import org.jboss.system.server.ServerConfigUtil; import org.jboss.util.ThrowableHandler; import org.jboss.util.threadpool.BasicThreadPoolMBean; /** * The WebService implementation. It configures a WebServer instance to * perform dynamic class and resource loading. * * @jmx:mbean * extends="org.jboss.system.ServiceMBean" * name="jboss:service=WebService" * * @version <tt>$Revision: 1.20.2.1 $</tt> * @author <a href="mailto:rickard.oberg@telkel.com">Rickard �berg</a>. * @author <a href="mailto:Scott.Stark@jboss.org">Scott Stark</a>. * @author <a href="mailto:jason@planet57.com">Jason Dillon</a> */ public class WebService extends ServiceMBeanSupport implements WebServiceMBean { // // jason: WebService and WebServer classes should be merged into one // WebService only provides a thin layer of JMX which WebServer // can do just as well. // // Doing so will dramatically simplify this component. // // Rename to HTTPClassLoaderService to be clear that this is not // a fully functional web server. // /** * The web server instance which does the work. * * <p> * Note: This value shadows the MBeanServer server value * from ServiceMBeanSupport. */ private WebServer server = new WebServer(); /** * @jmx:managed-constructor */ public WebService() { super(); } /** * @jmx:managed-operation */ public URL addClassLoader(ClassLoader cl) { return server.addClassLoader(cl); } /** * @jmx:managed-operation */ public void removeClassLoader(ClassLoader cl) { server.removeClassLoader(cl); } /** * Set the WebService listening port. * * @jmx:managed-attribute * * @param port The listening port; 0 for anonymous */ public void setPort(int port) { server.setPort(port); } /** * Get the WebService listening port. * * @jmx:managed-attribute */ public int getPort() { return server.getPort(); } /** * Get the name of the interface to use for the host portion of the * RMI codebase URL. * * @jmx:managed-attribute */ public void setHost(final String hostname) { server.setBindAddress(hostname); } /** * Set the name of the interface to use for the host portion of the * RMI codebase URL. * * @jmx:managed-attribute */ public String getHost() { return server.getBindHostname(); } /** * Get the specific address the WebService listens on. * * @jmx:managed-attribute * * @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. * * @jmx:managed-attribute * * @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. * * @jmx:managed-attribute * * @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. * * @jmx:managed-attribute * * @param backlog, the queue backlog limit. */ public void setBacklog(int backlog) { server.setBacklog(backlog); } /** Set the thread pool used for the WebServer class loading. * @jmx:managed-attribute * */ public void setThreadPool(BasicThreadPoolMBean threadPool) { server.setThreadPool(threadPool); } /** * 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. * * @jmx:managed-attribute */ public boolean getDownloadServerClasses() { return server.getDownloadServerClasses(); } /** * @jmx:managed-attribute */ public void setDownloadServerClasses(boolean flag) { server.setDownloadServerClasses(flag); } protected ObjectName getObjectName(MBeanServer server, ObjectName name) throws javax.management.MalformedObjectNameException { return name == null ? OBJECT_NAME : name; } protected void createService() throws Exception { // Load the file mime.types into the mapping list Properties mimeTypes = new Properties(); try { mimeTypes.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("org/jboss/web/mime.types")); Enumeration keys = mimeTypes.keys(); while (keys.hasMoreElements()) { String extension = (String) keys.nextElement(); String type = mimeTypes.getProperty(extension); server.addMimeType(extension, type); } } catch (Exception e) { log.error("Failed to load org/jboss/web/mime.types; ignoring", e); } String hostname = server.getBindAddress(); // If not user specified hostname given, then try to determine what it should be if (hostname == null) { // First look for the rmi server name try { hostname = System.getProperty("java.rmi.server.hostname"); } catch (SecurityException e) { // ignore, but don't be silent ThrowableHandler.addWarning(e); } // else use the localhost name if (hostname == null) { try { hostname = InetAddress.getLocalHost().getHostName(); } catch (IOException e) { log.error("Failed to get localhost name; ignoring", e); } } if (hostname != null) { setHost(hostname); } } // Host must be set to continue (either by user or detection) String address = getHost(); if (address == null) throw new MissingAttributeException("Host"); // Set the rmi codebase if it is not already set String codebase = System.getProperty("java.rmi.server.codebase"); if (codebase == null) { address = ServerConfigUtil.fixRemoteAddress(address); codebase = "http://" + address + ":" + getPort() + "/"; System.setProperty("java.rmi.server.codebase", codebase); } log.info("Using RMI server codebase: " + codebase); } /** * Start the web server for dynamic downloading of classes and resources. * * <p> * The system <tt>java.rmi.server.codebase</tt> is also set to * <em>http://<host>:<port>/</em> if the property has not been set. */ protected void startService() throws Exception { // Start the WebServer running server.start(); log.debug("Started WebServer with address: " + server.getBindAddress() + ":" + getPort()); } protected void stopService() throws Exception { server.stop(); } }
WebService.java |