vmassol     01/06/18 05:43:14

  Modified:    cactus/src/ant/org/apache/commons/cactus/ant ResinRun.java
  Added:       cactus/src/ant/org/apache/commons/cactus/ant
                        AbstractServerRun.java
  Log:
  refactoring : abstracted out AbstractServerRun (thanks to Robert Leftwich for the 
idea and implementation) so that it can be used with several servlet engines (e.g. 
Resin and Enhydra)
  
  Revision  Changes    Path
  1.2       +23 -121   
jakarta-commons/cactus/src/ant/org/apache/commons/cactus/ant/ResinRun.java
  
  Index: ResinRun.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/cactus/src/ant/org/apache/commons/cactus/ant/ResinRun.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ResinRun.java     2001/04/09 11:52:34     1.1
  +++ ResinRun.java     2001/06/18 12:43:14     1.2
  @@ -61,133 +61,35 @@
   /**
    * Starts/stop Resin by setting up a listener socket.
    */
  -public class ResinRun extends Thread
  +public class ResinRun extends AbstractServerRun
   {
       private Object m_Server;
  -    private int m_Port = 7777;
   
  -    public static void main(String[] args)
  -    {
  -        ResinRun run = new ResinRun();
  -
  -        // Look for a -start or -stop flag
  -        boolean isStart = true;
  -        Vector newArgs = new Vector();
  -
  -        for (int i = 0; i < args.length; i++) {
  -            if (args[i].equalsIgnoreCase("-start")) {
  -                isStart = true;
  -            } else if (args[i].equalsIgnoreCase("-stop")) {
  -                isStart = false;
  -            } else if (args[i].equalsIgnoreCase("-port")) {
  -                run.m_Port = Integer.parseInt(args[i+1]);
  -                i++;
  -            } else {
  -                newArgs.add(args[i]);
  -            }
  -        }
  -
  -        if (isStart) {
  -            String[] strArgs = new String[0];
  -            run.startResin((String[])newArgs.toArray(strArgs));
  -        } else {
  -            run.stopResin();
  -        }
  -
  -    }
  -
  -    private void startResin(String[] args)
  -    {
  -        if (m_Server == null) {
  -            try  {
  -                Class resinClass = 
Class.forName("com.caucho.server.http.ResinServer");
  -                Constructor constructor = resinClass.getConstructor(new Class[] { 
args.getClass(), boolean.class });
  -                m_Server = constructor.newInstance(new Object[] { args, new 
Boolean(true) });
  -                Method initMethod = resinClass.getMethod("init", new Class[] { 
boolean.class });
  -                initMethod.invoke(m_Server, new Object[] { new Boolean(true) } );
  -            } catch (Exception e) {
  -                e.printStackTrace();
  -                throw new RuntimeException("Error starting Resin");
  -            }
  -        }
  -
  -        // Set up listener socket for listening to request to stop Resin
  -        new Thread(this).start();
  -    }
  -
  -    private void stopResin()
  -    {
  -        // Open socket connection
  -        Socket clientSocket = null;
  -
  -        try {
  -            clientSocket = new Socket("127.0.0.1", m_Port);
  -        } catch (Exception e) {
  -            e.printStackTrace();
  -            throw new RuntimeException("Error opening socket tp 127.0.0.1 on port 
[" + m_Port + "]");
  -        } finally {
  -            try {
  -                if (clientSocket != null) {
  -                    clientSocket.close();
  -                }
  -            } catch (IOException e) {
  -                throw new RuntimeException("Cannot close client socket");
  -            }
  -        }
  -    }
  +     public static void main(String[] args)
  +     {
  +         AbstractServerRun.doRun(new ResinRun(), args);
  +     }
   
  -    public void run()
  +     // function to actually start a Resin server
  +     protected void doStartServer(String[] args) throws Exception
       {
  -        ServerSocket serverSocket = setUpListenerSocket();
  -
  -        // Accept a client socket connection
  -        Socket clientSocket = null;
  -        try {
  -            clientSocket = serverSocket.accept();
  -        } catch (IOException e) {
  -            throw new RuntimeException("Error accepting connection for server 
socket [" + serverSocket + "]");
  -
  -        } finally {
  -            // Stop server socket
  -            try {
  -                serverSocket.close();
  -            } catch (IOException e) {
  -                throw new RuntimeException("Cannot close server socket [" + 
serverSocket + "]");
  -            }
  -        }
  -
  -        // Stop Resin server
  -        if (m_Server != null) {
  -            try {
  -                Method closeMethod = m_Server.getClass().getMethod("close", null);
  -                closeMethod.invoke(m_Server, null);
  -            } catch (Exception e) {
  -                e.printStackTrace();
  -                throw new RuntimeException("Cannot stop Resin server");
  -            }
  -        }
  +         if (m_Server == null) {
  +                     Class resinClass = 
Class.forName("com.caucho.server.http.ResinServer");
  +                     Constructor constructor = resinClass.getConstructor(new 
Class[] { args.getClass(), boolean.class});
  +                     m_Server = constructor.newInstance(new Object[] { args, new 
Boolean(true)});
  +                     Method initMethod = resinClass.getMethod("init", new Class[] { 
boolean.class});
  +                     initMethod.invoke(m_Server, new Object[] { new Boolean(true)} 
);
  +             }
  +     }
   
  -        // Stop server socket
  -        try {
  -            serverSocket.close();
  -        } catch (IOException e) {
  -            throw new RuntimeException("Cannot close server socket [" + 
serverSocket + "]");
  -        }
  -
  -    }
  -
  -    private ServerSocket setUpListenerSocket()
  +     // function to actually stop a Resin server
  +     protected void doStopServer() throws Exception
       {
  -        ServerSocket serverSocket = null;
  -
  -        try {
  -            serverSocket = new ServerSocket(m_Port);
  -        } catch (IOException e) {
  -            e.printStackTrace();
  -            throw new RuntimeException("Error setting up the Resin listener 
socket");
  -        }
  -
  -        return serverSocket;
  -    }
  +             // Stop Resin server
  +             if (m_Server != null) {
  +                     Method closeMethod = m_Server.getClass().getMethod("close", 
null);
  +                     closeMethod.invoke(m_Server, null);
  +             }
  +     }
   
   }
  
  
  
  1.1                  
jakarta-commons/cactus/src/ant/org/apache/commons/cactus/ant/AbstractServerRun.java
  
  Index: AbstractServerRun.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Ant", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  package org.apache.commons.cactus.ant;
  
  import java.net.*;
  import java.io.*;
  import java.util.*;
  import java.lang.reflect.*;
  
  /**
   * Abstract class for starting/stopping an application server
   * by setting up a listener socket.
   */
  public abstract class AbstractServerRun extends Thread
  {
        private int m_Port = 7777;
  
        protected static void doRun(AbstractServerRun run, String[] args)
        {
                // Look for a -start or -stop flag
                boolean isStart = true;
                Vector newArgs = new Vector();
  
                for (int i = 0; i < args.length; i++) {
                        if (args[i].equalsIgnoreCase("-start")) {
                                isStart = true;
                        } else if (args[i].equalsIgnoreCase("-stop")) {
                                isStart = false;
                        } else if (args[i].equalsIgnoreCase("-port")) {
                                run.m_Port = Integer.parseInt(args[i+1]);
                                i++;
                        } else {
                                newArgs.add(args[i]);
                        }
                }
  
                if (isStart) {
                        String[] strArgs = new String[0];
                        run.startServer((String[])newArgs.toArray(strArgs));
                } else {
                        run.stopServer();
                }
  
        }
  
        // abstract function to actually start the server
        abstract protected void doStartServer(String[] args) throws Exception;
  
        // abstract function to actually stop the server
        abstract protected void doStopServer() throws Exception;
  
        private void startServer(String[] args)
        {
                try {
                        doStartServer( args );
                } catch (Exception e) {
                        e.printStackTrace();
                        throw new RuntimeException("Error starting server");
                }
  
                // Set up listener socket for listening to request to stop server
                new Thread(this).start();
        }
  
        private void stopServer()
        {
                // Open socket connection
                Socket clientSocket = null;
  
                try {
                        clientSocket = new Socket("127.0.0.1", m_Port);
                } catch (Exception e) {
                        e.printStackTrace();
                        throw new RuntimeException("Error opening socket tp 127.0.0.1 
on port [" + m_Port + "]");
                } finally {
                        try {
                                if (clientSocket != null) {
                                        clientSocket.close();
                                }
                        } catch (IOException e) {
                                throw new RuntimeException("Cannot close client 
socket");
                        }
                }
        }
  
        public void run()
        {
                ServerSocket serverSocket = setUpListenerSocket();
  
                // Accept a client socket connection
                Socket clientSocket = null;
                try {
                        clientSocket = serverSocket.accept();
                } catch (IOException e) {
                        throw new RuntimeException("Error accepting connection for 
server socket [" + serverSocket + "]");
  
                } finally {
                        // Stop server socket
                        try {
                                serverSocket.close();
                        } catch (IOException e) {
                                throw new RuntimeException("Cannot close server socket 
[" + serverSocket + "]");
                        }
                }
  
                // Stop server
                try {
                        this.doStopServer();
                } catch (Exception e) {
                        e.printStackTrace();
                        throw new RuntimeException("Cannot stop server");
                }
  
                // Stop server socket
                try {
                        serverSocket.close();
                } catch (IOException e) {
                        throw new RuntimeException("Cannot close server socket [" + 
serverSocket + "]");
                }
  
        }
  
        private ServerSocket setUpListenerSocket()
        {
                ServerSocket serverSocket = null;
  
                try {
                        serverSocket = new ServerSocket(m_Port);
                } catch (IOException e) {
                        e.printStackTrace();
                        throw new RuntimeException("Error setting up the server 
listener socket");
                }
  
                return serverSocket;
        }
  
  }
  
  

Reply via email to