/* * Copyright (c) 1998-2011 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 java.util.ArrayList; import java.util.HashMap; import java.util.logging.Level; import java.util.logging.Logger; import javax.el.ELContext; import javax.el.ELResolver; import com.caucho.config.ConfigELContext; import com.caucho.config.ConfigException; import com.caucho.config.types.RawString; import com.caucho.el.EL; import com.caucho.el.MapVariableResolver; import com.caucho.env.deploy.DeployContainer; import com.caucho.env.deploy.DeployControllerType; import com.caucho.env.deploy.DeployMode; import com.caucho.env.deploy.ExpandDeployGenerator; import com.caucho.env.deploy.ExpandVersion; import com.caucho.vfs.Path; /** * The generator for the host deploy */ public class HostExpandDeployGenerator extends ExpandDeployGenerator<HostController> { private static final Logger log = Logger.getLogger(HostExpandDeployGenerator.class.getName()); private final HostExpandDeployGeneratorAdmin _admin = new HostExpandDeployGeneratorAdmin(this); private HostContainer _container; private ArrayList<HostConfig> _hostDefaults = new ArrayList<HostConfig>(); private String _hostName; /** * Creates the new host deploy. */ public HostExpandDeployGenerator(String id, DeployContainer<HostController> container, HostContainer hostContainer) { super(id, container, hostContainer.getRootDirectory()); _container = hostContainer; } /** * Gets the host container. */ public HostContainer getContainer() { return _container; } /** * Sets the host name. */ public void setHostName(RawString name) { _hostName = name.getValue(); } /** * Gets the host name. */ public String getHostName() { return _hostName; } /** * Sets true for a lazy-init. */ public void setLazyInit(boolean lazyInit) throws ConfigException { log.config("lazy-init is deprecated. Use <startup>lazy</startup> instead."); if (lazyInit) setStartupMode(DeployMode.LAZY); else setStartupMode(DeployMode.AUTOMATIC); } /** * Adds a default. */ public void addHostDefault(HostConfig config) { _hostDefaults.add(config); } @Override protected void initImpl() throws ConfigException { super.initImpl(); } @Override protected void startImpl() throws ConfigException { super.startImpl(); _admin.register(); } /** * Returns the log. */ protected Logger getLog() { return log; } /** * Returns the current array of application entries. */ @Override public HostController createController(ExpandVersion version) { String key = version.getKey(); /* // server/13g3 if (name.equals("")) return null; */ /* if (! isDeployedKey(name)) return null; */ Path rootDirectory = getExpandPath(key); String hostName = keyToName(key); String stage = _container.getServer().getStage(); String id = stage + "/host/" + key; String hostNamePattern = getHostName(); if (hostNamePattern != null && ! key.equals("default")) { HashMap<String,Object> varMap = new HashMap<String,Object>(); varMap.put("host", new HostRegexpVar(key)); ELResolver resolver = new MapVariableResolver(varMap); ELContext env = new ConfigELContext(resolver); hostName = EL.evalString(hostNamePattern, env); } HostController controller = new HostController(id, rootDirectory, hostName, _container); controller.setControllerType(DeployControllerType.DYNAMIC); Path jarPath = getArchivePath(key); controller.setArchivePath(jarPath); for (int i = 0; i < _hostDefaults.size(); i++) controller.addConfigDefault(_hostDefaults.get(i)); /* if (rootDirectory.isDirectory() && ! isValidDirectory(rootDirectory, name)) return null; else if (! rootDirectory.isDirectory() && ! jarPath.isFile()) return null; */ return controller; } /** * Adds configuration to the current controller */ @Override protected void mergeController(HostController controller, String key) { try { Path expandDirectory = getExpandDirectory(); Path rootDirectory = controller.getRootDirectory(); if (! expandDirectory.equals(rootDirectory.getParent())) { return; } super.mergeController(controller, key); controller.setStartupMode(getStartupMode()); for (int i = 0; i < _hostDefaults.size(); i++) controller.addConfigDefault(_hostDefaults.get(i)); } catch (ConfigException e) { log.warning(e.toString()); log.log(Level.FINER, e.toString(), e); controller.setConfigException(e); } catch (Throwable e) { log.log(Level.WARNING, e.toString(), e); controller.setConfigException(e); } } @Override public String nameToKey(String name) { if (name.isEmpty()) return "default"; else return name; } @Override public String keyToName(String key) { if (key.equals("default")) return ""; else return key; } @Override protected void destroyImpl() { _admin.unregister(); super.destroyImpl(); } public boolean equals(Object o) { if (o == null || ! getClass().equals(o.getClass())) return false; HostExpandDeployGenerator deploy = (HostExpandDeployGenerator) o; Path expandPath = getExpandDirectory(); Path deployExpandPath = deploy.getExpandDirectory(); if (expandPath != deployExpandPath && (expandPath == null || ! expandPath.equals(deployExpandPath))) return false; return true; } public String toString() { return getClass().getSimpleName() + "[" + getExpandDirectory() + "]"; } }