host.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 655 行
JAVA
655 行
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * * Free Software Foundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */package com.caucho.server.host;import com.caucho.bam.*;import com.caucho.config.ConfigException;import com.caucho.config.SchemaBean;import com.caucho.hemp.broker.*;import com.caucho.lifecycle.Lifecycle;import com.caucho.loader.EnvironmentBean;import com.caucho.loader.EnvironmentClassLoader;import com.caucho.loader.EnvironmentLocal;import com.caucho.make.AlwaysModified;import com.caucho.management.server.HostMXBean;import com.caucho.server.cluster.Cluster;import com.caucho.server.cluster.Server;import com.caucho.server.deploy.EnvironmentDeployInstance;import com.caucho.server.dispatch.DispatchServer;import com.caucho.server.dispatch.ExceptionFilterChain;import com.caucho.server.dispatch.Invocation;import com.caucho.server.port.Port;import com.caucho.server.resin.*;import com.caucho.server.webapp.WebAppContainer;import com.caucho.util.L10N;import com.caucho.vfs.Dependency;import com.caucho.vfs.Path;import com.caucho.webbeans.manager.*;import java.net.*;import java.util.ArrayList;import java.util.logging.Level;import java.util.logging.Logger;import java.util.regex.*;/** * Resin's virtual host implementation. */public class Host extends WebAppContainer implements EnvironmentBean, Dependency, SchemaBean, EnvironmentDeployInstance{ private static final Logger log = Logger.getLogger(Host.class.getName()); private static final L10N L = new L10N(Host.class); private static EnvironmentLocal<Host> _hostLocal = new EnvironmentLocal<Host>("caucho.host"); private HostContainer _parent; // The Host entry private HostController _controller; // The canonical host name. The host name may include the port. private String _hostName = ""; // The canonical URL private String _url; private String _serverName = ""; private int _serverPort = 0; // The secure host private String _secureHostName; private boolean _isDefaultHost; // Alises private ArrayList<String> _aliasList = new ArrayList<String>(); private HempBroker _bamBroker; private Throwable _configException; private boolean _isRootDirSet; private boolean _isDocDirSet; private final Lifecycle _lifecycle; private String _configETag = null; /** * Creates the webApp with its environment loader. */ public Host(HostContainer parent, HostController controller, String hostName) { super(EnvironmentClassLoader.create("host:" + hostName)); try { _controller = controller; setParent(parent); setHostName(hostName); _hostLocal.set(this, getClassLoader()); } catch (Throwable e) { _configException = e; } finally { _lifecycle = new Lifecycle(log, toString(), Level.INFO); } } /** * Returns the local host. */ public static Host getLocal() { return _hostLocal.get(); } /** * Sets the canonical host name. */ private void setHostName(String name) throws ConfigException { _hostName = name; if (name.equals("")) _isDefaultHost = true; addHostAlias(name); getEnvironmentClassLoader().setId("host:" + name); // _jmxContext.put("J2EEServer", name); int p = name.indexOf("://"); if (p >= 0) name = name.substring(p + 3); _serverName = name; p = name.lastIndexOf(':'); if (p > 0) { _serverName = name.substring(0, p); boolean isPort = true; int port = 0; for (p++; p < name.length(); p++) { char ch = name.charAt(p); if ('0' <= ch && ch <= '9') port = 10 * port + ch - '0'; else isPort = false; } if (isPort) _serverPort = port; } } /** * Returns the entry name */ public String getName() { return _controller.getName(); } /** * Returns the canonical host name. The canonical host name may include * the port. */ public String getHostName() { return _hostName; } /** * Returns the host (as an webApp container) */ public Host getHost() { return this; } /** * Returns the secure host name. Used for redirects. */ public String getSecureHostName() { return _secureHostName; } /** * Sets the secure host name. Used for redirects. */ public void setSecureHostName(String secureHostName) { _secureHostName = secureHostName; } /** * Returns the bam broker. */ public BamBroker getBamBroker() { return _bamBroker; } /** * Returns the relax schema. */ public String getSchema() { return "com/caucho/server/host/host.rnc"; } /** * Returns the URL for the container. */ public String getURL() { if (_url != null) return _url; else if (_hostName == null || _hostName.equals("")) { Server server = getServer(); if (server == null) return ""; for (Port port : server.getPorts()) { if ("http".equals(port.getProtocolName())) { String address = port.getAddress(); if (address == null) address = "localhost"; return "http://" + address + ":" + port.getPort(); } } for (Port port : server.getPorts()) { if ("https".equals(port.getProtocolName())) { String address = port.getAddress(); if (address == null) address = "localhost"; return "https://" + address + ":" + port.getPort(); } } return ""; } else if (_hostName.startsWith("http:") || _hostName.startsWith("https:")) return _hostName; else return "http://" + _hostName; } /** * Adds an alias. */ public void addHostAlias(String name) { name = name.toLowerCase(); if (! _aliasList.contains(name)) _aliasList.add(name); if (name.equals("") || name.equals("*")) _isDefaultHost = true; _controller.addExtHostAlias(name); } /** * Gets the alias list. */ public ArrayList<String> getAliasList() { return _aliasList; } /** * Adds an alias. */ public void addHostAliasRegexp(String name) { name = name.trim(); Pattern pattern = Pattern.compile(name, Pattern.CASE_INSENSITIVE); _controller.addExtHostAliasRegexp(pattern); } /** * Returns true if matches the default host. */ public boolean isDefaultHost() { return _isDefaultHost; } /** * Sets the parent container. */ private void setParent(HostContainer parent) { _parent = parent; setDispatchServer(parent.getDispatchServer()); if (! _isRootDirSet) { setRootDirectory(parent.getRootDirectory()); _isRootDirSet = false; } } /** * Gets the environment class loader. */ public EnvironmentClassLoader getEnvironmentClassLoader() { return (EnvironmentClassLoader) getClassLoader(); } /** * Sets the root dir. */ public void setRootDirectory(Path rootDir) { super.setRootDirectory(rootDir); _isRootDirSet = true; if (! _isDocDirSet) { setDocumentDirectory(rootDir); _isDocDirSet = false; } } /** * Sets the doc dir. */ public void setDocumentDirectory(Path docDir) { super.setDocumentDirectory(docDir); _isDocDirSet = true; } /** * Sets the config exception. */ public void setConfigException(Throwable e) { if (e != null) { // XXX: _configException = e; getEnvironmentClassLoader().addDependency(AlwaysModified.create()); } } /** * Gets the config exception. */ public Throwable getConfigException() { return _configException; } /** * Returns the owning server. */ public Server getServer() { if (_parent != null) { DispatchServer server = _parent.getDispatchServer(); if (server instanceof Server) return (Server) server; } return null; } /** * Returns the current cluster. */ public Cluster getCluster() { Server server = getServer(); if (server != null) return server.getCluster(); else return null; } /** * Returns the config etag. */ public String getConfigETag() { return _configETag; } /** * Returns the config etag. */ public void setConfigETag(String etag) { _configETag = etag; } /** * Returns the admin. */ public HostMXBean getAdmin() { return _controller.getAdmin(); } /** * Starts the host. */ public void start() { if (! _lifecycle.toStarting()) return; if (getURL().equals("") && _parent != null) { _url = _parent.getURL(); } EnvironmentClassLoader loader; loader = getEnvironmentClassLoader(); loader.setId("host:" + getURL()); Thread thread = Thread.currentThread(); ClassLoader oldLoader = thread.getContextClassLoader(); try { thread.setContextClassLoader(loader); initBam(); super.start(); loader.start(); if (_parent != null) _parent.clearCache(); } finally { _lifecycle.toActive(); thread.setContextClassLoader(oldLoader); } } private void initBam() { if (Resin.getCurrent() == null) return; String hostName = _hostName; if ("".equals(hostName)) { try { hostName = InetAddress.getLocalHost().getCanonicalHostName(); } catch (Exception e) { throw ConfigException.create(e); } } _bamBroker = new HempBroker(hostName); HempBrokerManager brokerManager = HempBrokerManager.getCurrent(); if (brokerManager != null) brokerManager.addBroker(hostName, _bamBroker); for (String alias : _aliasList) { _bamBroker.addAlias(alias); if (brokerManager != null) brokerManager.addBroker(hostName, _bamBroker); } WebBeansContainer webBeans = WebBeansContainer.getCurrent(); webBeans.addSingleton(_bamBroker, "bamBroker"); } /** * Clears the cache */ public void clearCache() { super.clearCache(); setConfigETag(null); } /** * Builds the invocation for the host. */ public Invocation buildInvocation(Invocation invocation) throws Exception { invocation.setHostName(_serverName); invocation.setPort(_serverPort); Thread thread = Thread.currentThread(); ClassLoader oldLoader = thread.getContextClassLoader(); try { thread.setContextClassLoader(getClassLoader()); if (_configException == null) return super.buildInvocation(invocation); else { invocation.setFilterChain(new ExceptionFilterChain(_configException)); invocation.setDependency(AlwaysModified.create()); return invocation; } } finally { thread.setContextClassLoader(oldLoader); } } /** * Returns true if the host is modified. */ public boolean isModified() { return (isDestroyed() || getEnvironmentClassLoader().isModified()); } /** * Returns true if the host is modified. */ public boolean isModifiedNow() { return (isDestroyed() || getEnvironmentClassLoader().isModifiedNow()); } /** * Log the reason for modification. */ public boolean logModified(Logger log) { if (isDestroyed()) return true; else return getEnvironmentClassLoader().logModified(log); } /** * Returns true if the host deploy was an error */ public boolean isDeployError() { return _configException != null; } /** * Returns true if the host is idle */ public boolean isDeployIdle() { return false; } /** * Stops the host. */ public boolean stop() { Thread thread = Thread.currentThread(); ClassLoader oldLoader = thread.getContextClassLoader(); try { EnvironmentClassLoader envLoader = getEnvironmentClassLoader(); thread.setContextClassLoader(envLoader); if (! _lifecycle.toStopping()) return false; super.stop(); if (_bamBroker != null) _bamBroker.close(); envLoader.stop(); return true; } finally { _lifecycle.toStop(); thread.setContextClassLoader(oldLoader); } } /** * Closes the host. */ public void destroy() { stop(); if (isDestroyed()) return; Thread thread = Thread.currentThread(); ClassLoader oldLoader = thread.getContextClassLoader(); EnvironmentClassLoader classLoader = getEnvironmentClassLoader(); thread.setContextClassLoader(classLoader); try { super.destroy(); } finally { thread.setContextClassLoader(oldLoader); classLoader.destroy(); } } public String toString() { return getClass().getSimpleName() + "[" + getHostName() + "]"; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?