You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by pi...@apache.org on 2001/07/19 04:45:33 UTC

cvs commit: jakarta-tomcat-connectors/webapp/java WarpConfigurationHandler.java WarpConnector.java

pier        01/07/18 19:45:33

  Modified:    webapp/java WarpConfigurationHandler.java WarpConnector.java
  Log:
  Added support for automatic host/application deployment.
  
  Revision  Changes    Path
  1.7       +130 -15   jakarta-tomcat-connectors/webapp/java/WarpConfigurationHandler.java
  
  Index: WarpConfigurationHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/webapp/java/WarpConfigurationHandler.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- WarpConfigurationHandler.java	2001/07/18 23:12:49	1.6
  +++ WarpConfigurationHandler.java	2001/07/19 02:45:33	1.7
  @@ -56,12 +56,16 @@
    * ========================================================================= */
   package org.apache.catalina.connector.warp;
   
  +import java.io.File;
   import java.io.IOException;
  -import java.io.InputStream;
  -import java.io.OutputStream;
  -import java.net.ServerSocket;
  -import java.net.Socket;
  +import java.net.URL;
   
  +import org.apache.catalina.Container;
  +import org.apache.catalina.Context;
  +import org.apache.catalina.Deployer;
  +import org.apache.catalina.Host;
  +import org.apache.catalina.core.StandardHost;
  +
   public class WarpConfigurationHandler {
   
       /* ==================================================================== */
  @@ -82,19 +86,130 @@
           packet.setType(Constants.TYPE_CONF_WELCOME);
           packet.writeUnsignedShort(Constants.VERS_MAJOR);
           packet.writeUnsignedShort(Constants.VERS_MINOR);
  -        packet.writeInteger(-1);
  +        packet.writeInteger(connection.getConnector().uniqueId);
           connection.send(packet);
  -        
  -        connection.recv(packet);
  -        String appl=packet.readString();
  -        String host=packet.readString();
  -        int port=packet.readUnsignedShort();
  -        String path=packet.readString();
  +
  +        // Loop for configuration packets
  +        while (true) {        
  +            connection.recv(packet);
  +            
  +            switch (packet.getType()) {
  +
  +                case Constants.TYPE_CONF_DEPLOY: {
  +                    String appl=packet.readString();
  +                    String host=packet.readString();
  +                    int port=packet.readUnsignedShort();
  +                    String path=packet.readString();
  +                    Context context=null;
  +                    packet.reset();
  +
  +                    if (Constants.DEBUG) 
  +                        logger.log("Deploying web application \""+appl+"\" "+
  +                                   "under <http://"+host+":"+port+path+">");
  +                    try {
  +                        context=deploy(connection,logger,appl,host,path);
  +                    } catch (Exception e) {
  +                        logger.log(e);
  +                    }
  +                    if (context==null) {
  +                        String msg="Error deploying web application \""+appl+
  +                                   "\" under <http://"+host+":"+port+path+">";
  +                        logger.log(msg);
  +                        packet.setType(Constants.TYPE_ERROR);
  +                        packet.writeString(msg);
  +                        connection.send(packet);
  +                    } else {
  +                        int k=connection.getConnector().applicationId(context);
  +                        packet.setType(Constants.TYPE_CONF_APPLIC);
  +                        packet.writeInteger(k);
  +                        packet.writeString(context.getDocBase());
  +                        connection.send(packet);
  +                        if (Constants.DEBUG)
  +                            logger.debug("Application \""+appl+"\" deployed "+
  +                                         "under <http://"+host+":"+port+path+
  +                                         "> with root="+context.getDocBase()+
  +                                         " ID="+k);
  +                    }
  +                    break;
  +                }
  +
  +                case Constants.TYPE_CONF_DONE: {
  +                    packet.reset();
  +                    packet.setType(Constants.TYPE_CONF_PROCEED);
  +                    connection.send(packet);
  +                    return(true);
  +                }
  +
  +                default: {
  +                    logger.log("Invalid packet with type "+packet.getType());
  +                    return(false);
  +                }
  +            }
  +        }        
  +    }
  +    
  +    /** Deploy a web application */
  +    private Context deploy(WarpConnection connection, WarpLogger logger,
  +                           String applName, String hostName, String applPath)
  +    throws IOException {
  +        synchronized (connection.getConnector()) {
  +
  +        Container container=connection.getConnector().getContainer();
  +
  +        Host host=(Host)container.findChild(hostName);
  +        if (host==null) {
  +            host=new StandardHost();
  +            host.setName(hostName);
  +            host.setParent(container);
  +            host.setAppBase(connection.getConnector().getAppBase());
  +            container.addChild(host);
  +            if (Constants.DEBUG)
  +                logger.debug("Created new host "+host.getName());
  +        } else if (Constants.DEBUG) {
  +            logger.debug("Reusing instance of Host \""+host.getName()+"\"");
  +        }
  +
  +        // TODO: Set up mapping mechanism for performance
           
  -        if (Constants.DEBUG)
  -            logger.debug("Deploying application \""+appl+"\" under \"http://"+
  -                         host+":"+port+path);
  +        if (applPath.endsWith("/"))
  +            applPath=applPath.substring(0,applPath.length()-1);
  +
  +        Context appl=(Context)host.findChild(applPath);
  +
  +        if (appl==null) {
   
  -        return(true);
  +            if (Constants.DEBUG)
  +                logger.debug("No application for \""+applPath+"\"");
  +
  +            Deployer deployer=(Deployer)host;
  +            File file=new File(host.getAppBase()+File.separator+applName);
  +            if (!file.isAbsolute()) {
  +                file=new File(System.getProperty("catalina.home"),
  +                              host.getAppBase()+File.separator+applName);
  +            }
  +
  +            if (!file.exists()) {
  +                logger.log("Cannot find \""+file.getPath()+"\" for appl. \""+
  +                           applName);
  +                return(null);
  +            }
  +
  +            String path=file.getCanonicalPath();
  +            URL url=new URL("file",null,path);
  +            if (path.toLowerCase().endsWith(".war"))
  +                url=new URL("jar:"+url.toString()+"!/");
  +
  +            if (Constants.DEBUG)
  +                logger.debug("Application URL \""+url.toString()+"\"");
  +
  +            deployer.install(applPath, url);
  +            return(deployer.findDeployedApp(applPath));
  +
  +        } else {
  +            if (Constants.DEBUG)
  +                logger.debug("Found application for \""+appl.getName()+"\"");
  +            return(appl);
  +        }
  +        }
       }
   }
  
  
  
  1.15      +42 -1     jakarta-tomcat-connectors/webapp/java/WarpConnector.java
  
  Index: WarpConnector.java
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/webapp/java/WarpConnector.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- WarpConnector.java	2001/07/18 23:12:49	1.14
  +++ WarpConnector.java	2001/07/19 02:45:33	1.15
  @@ -60,9 +60,12 @@
   import java.net.InetAddress;
   import java.net.ServerSocket;
   import java.net.Socket;
  +import java.util.Random;
  +import java.util.Vector;
   
   import org.apache.catalina.Connector;
   import org.apache.catalina.Container;
  +import org.apache.catalina.Context;
   import org.apache.catalina.Lifecycle;
   import org.apache.catalina.Lifecycle;
   import org.apache.catalina.LifecycleException;
  @@ -89,6 +92,10 @@
       private ServerSocket server=null;
       /** Our <code>WarpLogger</code>. */
       private WarpLogger logger=null;
  +    /** Our list of deployed web applications. */
  +    private Vector applications=new Vector();
  +    /** The unique ID of this connector instance. */
  +    protected int uniqueId=-1;
   
       /* -------------------------------------------------------------------- */
       /* Bean variables */
  @@ -113,6 +120,8 @@
       private int port=8008;
       /** The server socket backlog length. */
       private int acceptCount=10;
  +    /** The server appBase for hosts created via WARP. */
  +    private String appBase="webapps";
   
       /* -------------------------------------------------------------------- */
       /* Lifecycle variables */
  @@ -132,7 +141,9 @@
       public WarpConnector() {
           super();
           this.logger=new WarpLogger(this);
  -        if (Constants.DEBUG) logger.debug("Instance created");
  +        this.uniqueId=new Random().nextInt();
  +        if (Constants.DEBUG)
  +            logger.debug("Instance created (ID="+this.uniqueId+")");
       }
   
       /* ==================================================================== */
  @@ -353,6 +364,24 @@
           if (Constants.DEBUG) logger.debug("Setting acceptCount to "+count);
       }
   
  +    /**
  +     * Get the applications base directory for hosts created via WARP.
  +     */
  +    public String getAppBase() {
  +        return (this.appBase);
  +    }
  +
  +
  +    /**
  +     * Set the applications base directory for hosts created via WARP.
  +     *
  +     * @param appBase The appbase property.
  +     */
  +    public void setAppBase(String appbase) {
  +        this.appBase = appBase;
  +
  +        if (Constants.DEBUG) logger.debug("Setting appBase to "+appBase);
  +    }
   
       /* ==================================================================== */
       /* Lifecycle methods                                                    */
  @@ -419,6 +448,18 @@
       /* ==================================================================== */
       /* Public methods                                                       */
       /* ==================================================================== */
  +
  +    /**
  +     * Return the application ID for a given <code>Context</code>.
  +     */
  +    protected int applicationId(Context context) {
  +        int id=this.applications.indexOf(context);
  +        if (id==-1) {
  +            this.applications.add(context);
  +            id=this.applications.indexOf(context);
  +        }
  +        return(id);
  +    }
   
       /**
        * Create (or allocate) and return a Request object suitable for