deploycontainer.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 433 行

JAVA
433
字号
/* * 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.deploy;import com.caucho.lifecycle.Lifecycle;import com.caucho.loader.Environment;import com.caucho.make.CachedDependency;import com.caucho.util.L10N;import com.caucho.vfs.Dependency;import javax.annotation.PostConstruct;import java.util.*;import java.util.logging.Logger;/** * A container of deploy objects. */public class DeployContainer<C extends DeployController>  extends CachedDependency  implements Dependency{  private static final L10N L = new L10N(DeployContainer.class);  private static final Logger log    = Logger.getLogger(DeployContainer.class.getName());  private final DeployListGenerator<C> _deployListGenerator    = new DeployListGenerator<C>(this);  private final ArrayList<C> _controllerList = new ArrayList<C>();  private final Lifecycle _lifecycle = new Lifecycle();  /**   * Creates the deploy container.   */  public DeployContainer()  {    setCheckInterval(Environment.getDependencyCheckInterval());  }    /**   * Adds a deploy generator.   */  public void add(DeployGenerator<C> generator)  {    Set<String> names = new TreeSet<String>();    generator.fillDeployedKeys(names);    _deployListGenerator.add(generator);    if (_lifecycle.isActive())      update(names);  }    /**   * Removes a deploy.   */  public void remove(DeployGenerator<C> generator)  {    Set<String> names = new TreeSet<String>();    generator.fillDeployedKeys(names);    _deployListGenerator.remove(generator);    if (_lifecycle.isActive())      update(names);  }  /**   * Returns true if the deployment has modified.   */  public boolean isModifiedImpl()  {    return _deployListGenerator.isModified();  }  /**   * Logs the reason for modification.   */  public boolean logModified(Logger log)  {    return _deployListGenerator.logModified(log);  }  /**   * Forces updates.   */  public void update()  {    _deployListGenerator.update();  }  /**   * Initialize the container.   */  @PostConstruct  public void init()  {    if (! _lifecycle.toInit())      return;  }  /**   * Start the container.   */  public void start()  {    init();    if (! _lifecycle.toActive())      return;    _deployListGenerator.start();    HashSet<String> keys = new LinkedHashSet<String>();    _deployListGenerator.fillDeployedKeys(keys);    for (String key : keys) {      startImpl(key);    }    ArrayList<C> controllerList;    synchronized (_controllerList) {      controllerList = new ArrayList<C>(_controllerList);      Collections.sort(controllerList, new StartupPriorityComparator());    }    for (int i = 0; i < controllerList.size(); i++) {      C controller = controllerList.get(i);      controller.startOnInit();    }  }  /**   * Returns the matching entry.   */  public C findController(String name)  {    C controller = findDeployedController(name);    if (controller != null)      return controller;    controller = generateController(name);    if (controller == null)      return null;    // server/10tm    else if (controller.isNameMatch(name)) {      return controller;    }    else {      return null;    }  }  /**   * Returns the deployed entries.   */  public ArrayList<C> getControllers()  {    ArrayList<C> list = new ArrayList<C>();    synchronized (_controllerList) {      list.addAll(_controllerList);    }    return list;  }  /**   * Updates all the names.   */  private void update(Set<String> names)  {    Iterator<String> iter = names.iterator();    while (iter.hasNext()) {      String name = iter.next();      update(name);    }  }  /**   * Callback from the DeployGenerator when the deployment changes.   * <code>update</code> is only called when a deployment is added   * or removed, e.g. with a new .war file.   *   * The entry handles its own internal changes, e.g. a modification to   * a web.xml file.   */  public C update(String name)  {    C newController = updateImpl(name);        if (_lifecycle.isActive() && newController != null)      newController.startOnInit();    return newController;  }  /**   * Callback from the DeployGenerator when the deployment changes.   * <code>update</code> is only called when a deployment is added   * or removed, e.g. with a new .war file.   *   * The entry handles its own internal changes, e.g. a modification to   * a web.xml file.   */  C updateImpl(String name)  {    C oldController = null;    synchronized (_controllerList) {      oldController = findDeployedController(name);            if (oldController != null)	_controllerList.remove(oldController);    }        if (oldController != null)      oldController.destroy();    // destroy must be before generate because of JMX unregistration          C newController = generateController(name);    return newController;  }  /**   * Starts a particular controller.   *   * @param name the domain-specified name matching the controller, e.g. the   *  hostname or the context-path.   */  private C startImpl(String name)  {    C oldController = null;    synchronized (_controllerList) {      oldController = findDeployedController(name);    }    if (oldController != null)      return oldController;          return generateController(name);  }  /**   * Called to explicitly remove an entry from the cache.   */  public void remove(String name)  {    C oldController = null;    synchronized (_controllerList) {      oldController = findDeployedController(name);      if (oldController != null)	_controllerList.remove(oldController);    }    if (oldController != null)      oldController.destroy();  }  /**   * Generates the controller.   */  private C generateController(String name)  {    // XXX: required for watchdog    /*    if (! _lifecycle.isActive())      return null;    */        C newController = _deployListGenerator.generateController(name);    // server/1h00,13g4    // generated controller might match the name, e.g.    // when webapps deploy has an overriding explicit <web-app>    if (newController == null)      return null;    // the new entry might already be generated by another thread    synchronized (_controllerList) {      C controller = findDeployedController(newController.getId());      if (controller != null)	return controller;      _controllerList.add(newController);    }        init(newController);    return newController;  }    private void init(C controller)  {    Thread thread = Thread.currentThread();    ClassLoader oldLoader = thread.getContextClassLoader();        try {      thread.setContextClassLoader(controller.getParentClassLoader());      controller.init();    } finally {      thread.setContextClassLoader(oldLoader);    }  }  /**   * Returns an already deployed entry.   */  private C findDeployedController(String name)  {    synchronized (_controllerList) {      for (int i = 0; i < _controllerList.size(); i++) {	C controller = _controllerList.get(i);	if (controller.isNameMatch(name)) {	  return controller;	}      }    }    return null;  }    /**   * Closes the stop.   */  public void stop()  {    if (! _lifecycle.toStop())      return;    ArrayList<C> controllers;    synchronized (_controllerList) {      controllers = new ArrayList<C>(_controllerList);      Collections.sort(controllers, new StartupPriorityComparator());    }    for (int i = controllers.size() - 1; i >= 0; i--)      controllers.get(i).stop();  }    /**   * Closes the deploys.   */  public void destroy()  {    stop();        if (! _lifecycle.toDestroy())      return;        _deployListGenerator.destroy();    ArrayList<C> controllerList;    synchronized (_controllerList) {      controllerList = new ArrayList<C>(_controllerList);      _controllerList.clear();      Collections.sort(controllerList, new StartupPriorityComparator());    }    for (int i = controllerList.size() - 1; i >= 0; i--) {      C controller = controllerList.get(i);      controller.destroy();    }  }  public String toString()  {    return "DeployContainer$" + System.identityHashCode(this) + "[]";  }  public class StartupPriorityComparator    implements Comparator<C>  {    public int compare(C a, C b)    {      if (a.getStartupPriority() == b.getStartupPriority())	return 0;      else if (a.getStartupPriority() < b.getStartupPriority())	return -1;      else	return 1;    }  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?