entappclient.java

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

JAVA
640
字号
/* * 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.e_app;import com.caucho.config.Config;import com.caucho.config.ConfigException;import com.caucho.config.types.EjbRef;import com.caucho.ejb.AbstractStubLoader;import com.caucho.ejb.EJBClientInterface;import com.caucho.java.WorkDir;import com.caucho.lifecycle.Lifecycle;import com.caucho.loader.Environment;import com.caucho.loader.EnvironmentBean;import com.caucho.loader.EnvironmentClassLoader;import com.caucho.log.Log;import com.caucho.naming.Jndi;import com.caucho.server.deploy.DeployInstance;import com.caucho.util.Alarm;import com.caucho.util.L10N;import com.caucho.vfs.Depend;import com.caucho.vfs.JarPath;import com.caucho.vfs.Path;import com.caucho.vfs.Vfs;import javax.annotation.PostConstruct;import javax.naming.InitialContext;import javax.rmi.PortableRemoteObject;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.HashMap;import java.util.Hashtable;import java.util.jar.Manifest;import java.util.logging.Level;import java.util.logging.Logger;/** * An enterprise application (ear) */public class EntAppClient implements DeployInstance, EnvironmentBean {  /* implements EnvironmentBean, EnvironmentListener, AlarmListener */  static final L10N L = new L10N(EntAppClient.class);  static final Logger log = Log.open(EntAppClient.class);  private EnvironmentClassLoader _loader;  private String _name;  private Path _rootDir;  private Path _archivePath;  private String _mainClass;  private String _prefix = "";  private AppClientDeployController _entry;  private AbstractStubLoader _stubLoader;  private ApplicationConfig _config;  private JarPath _clientJar;    private EJBClientInterface _ejbClient;    private AppClientConfig _appClientConfig;  private ArrayList<EjbLink> _links = new ArrayList<EjbLink>();  private HashMap<String,EjbRef> _ejbRefMap = new HashMap<String,EjbRef>();  private Throwable _configException;  private Alarm _alarm;  private final Lifecycle _lifecycle;  private static void log(String message)  {    System.out.println(EntAppClient.class.getSimpleName() + ": " + message);  }  /**   * Creates the application.   */  EntAppClient(AppClientDeployController entry, String name)  {    _entry = entry;    _name = name;    ClassLoader parentLoader = Thread.currentThread().getContextClassLoader();    String id = getClass().getSimpleName() + "[" + name + "]";    _loader = EnvironmentClassLoader.create(parentLoader, id);    //_loader.setOwner(this);    _lifecycle = new Lifecycle(log, toString(), Level.INFO);    if (entry.getArchivePath() != null)      Environment.addDependency(new Depend(entry.getArchivePath()), _loader);    // _alarm = new Alarm(this);  }  /**   * Sets the name.   */  public void setName(String name)  {    _name = name;    _loader.setId("EntAppClient[" + name + "]");  }  /**   * Gets the name.   */  public String getName()  {    return _name;  }  /**   * Returns the ejb client.   */  public EJBClientInterface getEJBClient()    throws ClassNotFoundException,	   InstantiationException,	   IllegalAccessException  {    if (_ejbClient == null) {      Class cl = Class.forName("com.caucho.iiop.IiopClient");      _ejbClient = (EJBClientInterface) cl.newInstance();    }    return _ejbClient;  }  /**   * Sets the root directory.   */  public void setRootDirectory(Path rootDir)  {    _rootDir = rootDir;  }  /**   * Sets the root directory.   */  public Path getRootDirectory()  {    return _rootDir;  }  /**   * Sets the archive path   */  public void setArchivePath(Path archivePath)  {    _archivePath = archivePath;  }  /**   * Sets the description.   */  public void setDescription(String description)  {  }  /**   * Sets the display-name.   */  public void setDisplayName(String displayName)  {  }    /**   * Adds a module.   */  public Module createModule()  {    return new Module();  }  /**   * Adds an ejb-reference.   */  public void addEjbRef(EjbRef ejbRef)  {    _ejbRefMap.put(ejbRef.getEjbRefName(), ejbRef);    addIiopStub(ejbRef.getHome());    addIiopStub(ejbRef.getRemote());  }  private void addIiopStub(Class stubClass)  {    if (stubClass == null)      return;    try {      if (_stubLoader == null) {	Class iiopClass = Class.forName("com.caucho.iiop.IiopStubLoader");	_stubLoader = (AbstractStubLoader) iiopClass.newInstance();	_stubLoader.setPath(WorkDir.getLocalWorkDir());	_loader.addLoader(_stubLoader);      }      _stubLoader.addStubClass(stubClass.getName());    } catch (Throwable e) {      e.printStackTrace();            log.info(e.toString());    }  }  /**   * Gets an ejb home.   */  Class getEjbHome(String ejbName)    throws ConfigException  {    EjbRef ref = _ejbRefMap.get(ejbName);        if (ref != null)      return ref.getHome();    else      return null;  }  /**   * Sets the main class.   */  public void setMainClass(String mainClass)  {    _mainClass = mainClass;  }  /**   * Returns the class loader.   */  public EnvironmentClassLoader getClassLoader()  {    return _loader;  }  /**   * Sets the class loader.   */  public void setEnvironmentClassLoader(EnvironmentClassLoader loader)  {    _loader = loader;  }  /**   * Sets the config exception.   */  public void setConfigException(Throwable e)  {    _configException = e;  }  /**   * Gets the config exception.   */  public Throwable getConfigException()  {    return _configException;  }  /**   * Adds an EjbLink.   */  public EjbLink createEjbLink()  {    EjbLink link = new EjbLink();    _links.add(link);    return link;  }  /**   * Adds an EjbLink.   */  public SecurityRole createSecurityRole()  {    return new SecurityRole();  }  /**   * Stub for the xsi:schemaLocation tag.   */  public void setSchemaLocation(String s)  {  }  /**   * Stub for the version tag.   */  public void setVersion(String s)  {  }  /**   * Initialize the client.   */  @PostConstruct  public void init()  {    log("INIT: " + _links);    if (! _lifecycle.toInit())      return;    Thread thread = Thread.currentThread();    ClassLoader oldLoader = thread.getContextClassLoader();    try {      thread.setContextClassLoader(_loader);      Path rootDir = getRootDirectory();      Vfs.setPwd(rootDir);      Path workDir = getRootDirectory().lookup("META-INF/work");      _loader.addJar(workDir);      WorkDir.setLocalWorkDir(workDir);      for (EjbLink link : _links) {	link.deploy();      }      // configApplication();    } catch (Throwable e) {      e.printStackTrace();      log.log(Level.WARNING, e.toString(), e);      _configException = e;    } finally {      thread.setContextClassLoader(oldLoader);    }  }  private void configResinBinding()    throws Exception  {    Path rootDir = getRootDirectory();    Path xml = rootDir.lookup("META-INF/resin-client.xml");    if (! xml.canRead())      return;    // AppClientBinding binding = new AppClientBinding(this);    // builder.setCompactSchema("com/caucho/server/e_app/app-client.rnc");    new Config().configure(this, xml);  }  /**   * Return true for modified.   */  public boolean isModified()  {    return false;  }  /**   * Return true for modified.   */  public boolean isModifiedNow()  {    return false;  }  /**   * Log the reason for modification.   */  public boolean logModified(Logger log)  {    return false;  }  /**   * Return true is the deployment had an error.   */  public boolean isDeployError()  {    return _configException != null;  }  /**   * Return true is the deployment is idle   */  public boolean isDeployIdle()  {    return false;  }  /**   * Start the client.   */  public void start()  {    init();    if (! _lifecycle.toActive())      return;  }  /**   * Execute the main class.   */  public void main(String []args)    throws Throwable  {    if (_mainClass == null)      throw new IllegalStateException(L.l("main() method require a main class"));    main(_mainClass, args);  }  /**   * Execute the main class.   */  public void main(String mainClassName, String []args)    throws Throwable  {    start();    log("MAIN: " + mainClassName);    log("C: " + System.getProperty("java.class.path"));    if (_configException != null)      throw _configException;    if (! _lifecycle.isActive())      throw new IllegalStateException(L.l("{0} is not active.",					  this));    Thread thread = Thread.currentThread();    ClassLoader oldLoader = thread.getContextClassLoader();    try {      thread.setContextClassLoader(_loader);      Class mainClass = Class.forName(mainClassName, false, _loader);      log("MAIN:");      Method main = mainClass.getMethod("main",					new Class[] { String[].class });      try {	Class cl = Class.forName("com.sun.ts.lib.implementation.sun.common.SunRIURL", false, _loader);	log("CL: " + cl);      } catch (Throwable e) {	e.printStackTrace();      }      main.invoke(null, new Object[] { args});    } finally {      thread.setContextClassLoader(oldLoader);    }  }  /**   * Destroys the client.   */  public void destroy()  {    if (! _lifecycle.toDestroy())      return;  }  public String toString()  {    return "EntAppClient[" + getName() + "]";  }  public class EjbLink {    private String _ejbName;    private String _jndiName;    private Class _api;    public void setEjbName(String ejbName)      throws ConfigException    {      _ejbName = ejbName;    }    public void setJndiName(String jndiName)    {      _jndiName = jndiName;    }    public void deploy()      throws Exception    {      log("LINK: " + _jndiName + " " + _ejbName);      String orbHost = System.getProperty("org.omg.CORBA.ORBInitialHost");      String orbPort = System.getProperty("org.omg.CORBA.ORBInitialPort");      Hashtable env = new Hashtable();      env.put("java.naming.factory.initial",	      "com.sun.jndi.cosnaming.CNCtxFactory");      env.put("java.naming.provider.url", "iiop://" + orbHost + ":" + orbPort);      javax.naming.Context ic = new InitialContext(env);      Object ior = ic.lookup(_jndiName);            _api = getEjbHome(_ejbName);      if (_api == null)	throw new ConfigException(L.l("'{0}' is an unknown ejb name.",				      _ejbName));            Object value = PortableRemoteObject.narrow(ior, _api);      log("VALUE: " + value + " " + value.getClass() + " " + _api);      Jndi.rebindDeepShort(_ejbName, value);    }  }  public class SecurityRole {    public void setId(String id)    {    }    public void addDescription(String description)    {    }    public void setRoleName(String roleName)    {    }    public void setRoleLink(String roleLink)    {    }  }  public class Module {    /**     * Sets the module id.     */    public void setId(String id)    {    }        /**     * Creates a new web module.     */    public void addWeb(WebModule web)      throws Exception    {    }        /**     * Adds a new ejb module.     */    public void addEjb(Path path)      throws Exception    {      getClassLoader().addJar(path);      getEJBClient().addEJBJar(path);      getEJBClient().initEJBs();    }        /**     * Adds a new java module.     */    public void addJava(Path path)      throws Exception    {      if (! path.canRead())	throw new ConfigException(L.l("<java> module {0} must be a valid path.",				      path));            getClassLoader().addJar(path);	      _clientJar = JarPath.create(path);      Manifest manifest = _clientJar.getManifest();      String mainClass = manifest.getMainAttributes().getValue("Main-Class");      setMainClass(mainClass);      Path appClient = _clientJar.lookup("META-INF/application-client.xml");      if (appClient.canRead())	new Config().configureBean(EntAppClient.this, appClient);    }        /**     * Adds a new connector     */    public void addConnector(String path)    {    }        /**     * Adds a new alt-dd module.     */    public void addAltDD(String path)    {    }  }}

⌨️ 快捷键说明

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