You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by do...@apache.org on 2002/08/05 14:17:07 UTC

cvs commit: jakarta-avalon-phoenix/src/java/org/apache/avalon/phoenix/components/embeddor ContainerKitEmbeddor.java

donaldp     2002/08/05 05:17:07

  Modified:    .        gump.xml
  Added:       src/java/org/apache/avalon/phoenix/components/embeddor
                        ContainerKitEmbeddor.java
  Log:
  Inherit log4j from xdoclet runtime.
  
  Revision  Changes    Path
  1.6       +0 -1      jakarta-avalon-phoenix/gump.xml
  
  Index: gump.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-phoenix/gump.xml,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- gump.xml	2 Aug 2002 15:46:11 -0000	1.5
  +++ gump.xml	5 Aug 2002 12:17:07 -0000	1.6
  @@ -40,7 +40,6 @@
       <depend project="rhino"/>
       <!-- depend project="xdoclet" inherit="jars"/ -->
       <depend project="xdoclet-ant14" runtime="true"/>
  -    <depend project="log4j" runtime="true"/>
       <depend project="jarv" runtime="true"/>
       <depend project="jakarta-site2" inherit="all" />
       <option project="jakarta-servletapi-4"/>
  
  
  
  1.1                  jakarta-avalon-phoenix/src/java/org/apache/avalon/phoenix/components/embeddor/ContainerKitEmbeddor.java
  
  Index: ContainerKitEmbeddor.java
  ===================================================================
  /*
   * Copyright (C) The Apache Software Foundation. All rights reserved.
   *
   * This software is published under the terms of the Apache Software License
   * version 1.1, a copy of which has been included with this distribution in
   * the LICENSE.txt file.
   */
  package org.apache.avalon.phoenix.components.embeddor;
  
  import java.io.File;
  import java.util.Date;
  import java.util.Observable;
  import java.util.Observer;
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.avalon.excalibur.io.ExtensionFileFilter;
  import org.apache.avalon.framework.activity.Disposable;
  import org.apache.avalon.framework.context.Context;
  import org.apache.avalon.framework.context.ContextException;
  import org.apache.avalon.framework.context.Contextualizable;
  import org.apache.avalon.framework.parameters.ParameterException;
  import org.apache.avalon.framework.parameters.Parameterizable;
  import org.apache.avalon.framework.parameters.Parameters;
  import org.apache.avalon.phoenix.Constants;
  import org.apache.avalon.phoenix.interfaces.Deployer;
  import org.apache.avalon.phoenix.interfaces.Embeddor;
  import org.apache.avalon.phoenix.interfaces.EmbeddorMBean;
  import org.apache.avalon.phoenix.interfaces.Kernel;
  import org.apache.avalon.phoenix.interfaces.SystemManager;
  import org.apache.excalibur.containerkit.kernel.SimpleServiceKernel;
  
  /**
   * This is the object that is interacted with to create, manage and
   * dispose of the kernel and related resources.
   *
   * @author <a href="mail@leosimons.com">Leo Simons</a>
   * @author <a href="peter@apache.org">Peter Donald</a>
   * @author <a href="bauer@denic.de">Joerg Bauer</a>
   */
  public class ContainerKitEmbeddor
      extends SimpleServiceKernel
      implements Embeddor, EmbeddorMBean, Contextualizable, Parameterizable, Disposable
  {
      private static final Resources REZ =
          ResourceManager.getPackageResources( ContainerKitEmbeddor.class );
      private static final String DEFAULT_APPS_PATH = "/apps";
      private EmbeddorObservable2 m_observable = new EmbeddorObservable2();
      private Parameters m_parameters;
      /**
       * Context passed to embeddor. See the contextualize() method
       * for details on what is stored in context.
       *
       * @see ContainerKitEmbeddor#contextualize(Context)
       */
      private Context m_context;
      private String m_phoenixHome;
      /**
       * If true, flag indicates that the Embeddor should continue running
       * even when there are no applications in kernel. Otherwise the
       * Embeddor will shutdown when it detects there is no longer any
       * applications running.
       */
      private boolean m_persistent;
      /**
       * Flag is set to true when the embeddor should  shut itself down.
       * It is set to true as a result of a call to shutdown() method.
       *
       * @see Embeddor#shutdown()
       */
      private boolean m_shutdown;
      /**
       * Time at which the embeddor was started.
       */
      private long m_startTime;
      /**
       * The default directory in which applications are deployed from.
       */
      private String m_appDir;
  
      /**
       * Pass the Context to the embeddor.
       * It is expected that the following will be entries in context;
       * <ul>
       *   <li><b>common.classloader</b>: ClassLoader shared betweeen
       *      container and applications</li>
       *   <li><b>container.classloader</b>: ClassLoader used to load
       *      container</li>
       * </ul>
       *
       * @param context
       * @throws ContextException
       */
      public void contextualize( final Context context )
          throws ContextException
      {
          m_context = context;
          try
          {
              final Observer observer = (Observer)context.get( Observer.class.getName() );
              m_observable.addObserver( observer );
          }
          catch( final ContextException ce )
          {
              final String message = REZ.getString( "embeddor.notice.no-restart" );
              getLogger().warn( message );
          }
      }
  
      /**
       * Set parameters for this component.
       * This must be called after contextualize() and before initialize()
       *
       * Make sure to provide all the neccessary information through
       * these parameters. All information it needs consists of strings.
       * There are two types of strings included in parameters. The first
       * type include parameters used to setup proeprties of the embeddor.
       * The second type include the implementation names of the components
       * that the Embeddor manages. For instance if you want to replace the
       * <code>ConfigurationRepository</code> with your own repository you
       * would pass in a parameter such as;</p>
       * <p>org.apache.avalon.phoenix.interfaces.ConfigurationRepository =
       * com.biz.MyCustomConfigurationRepository</p>
       *
       * <p>Of the other type of parameters, the following are supported by
       * the DefaultEmbeddor implementation of Embeddor. Note that some of
       * the embedded components may support other parameters.</p>
       * <ul>
       * <li><b>phoenix.home</b>, the home directory of phoenix. Defaults
       * to "..".</li>
       * <li><b>log-destination</b>, the file to save log
       * messages in. If omitted, ${phoenix.home}/logs/phoenix.log is used.</li>
       * <li><b>log-priority</b>, the priority at which log messages are filteres.
       * If omitted, then INFO will be default level used.</li>
       * <li><b>applications-directory</b>, the directory in which
       * the defaul applications to be loaded by the kernel are stored
       * (in .sar format). Defaults to ${phoenix.home}/apps</li>
       * </ul>
       *
       * @param parameters the Parameters for embeddor
       * @throws ParameterException if an error occurs
       */
      public synchronized void parameterize( final Parameters parameters )
          throws ParameterException
      {
          m_parameters = parameters;
          m_phoenixHome = m_parameters.getParameter( "phoenix.home", ".." );
          m_persistent = m_parameters.getParameterAsBoolean( "persistent", false );
          m_appDir = m_parameters.getParameter( "phoenix.apps.dir",
                                                m_phoenixHome + DEFAULT_APPS_PATH );
      }
  
      /**
       * Creates the core handlers - logger, deployer, Manager and
       * Kernel. Note that these are not set up properly until you have
       * called the <code>run()</code> method.
       */
      public void initialize()
          throws Exception
      {
          m_startTime = System.currentTimeMillis();
          try
          {
              super.initialize();
              registerComponents();
          }
          catch( final Exception e )
          {
              // whoops!
              final String message = REZ.getString( "embeddor.error.start.failed" );
              getLogger().fatalError( message, e );
              throw e;
          }
      }
  
      /**
       * This is the main method of the embeddor. It sets up the core
       * components, and then deploys the <code>Facilities</code>. These
       * are registered with the Kernel and the Manager. The same
       * happens for the <code>Applications</code>.
       * Now, the Kernel is taken through its lifecycle. When it is
       * finished, as well as all the applications running in it, it
       * is shut down, after which the PhoenixEmbeddor is as well.
       */
      public void execute()
          throws Exception
      {
          deployDefaultApplications();
  
          //  If the kernel is empty at this point, it is because the server was
          //  started without supplying any applications, display a message to
          //  give the user a clue as to why the server is shutting down
          //  immediately.
          if( emptyKernel() )
          {
              final String message = REZ.getString( "embeddor.error.start.no-apps" );
              getLogger().fatalError( message );
          }
          else
          {
              // loop until <code>Shutdown</code> is created.
              while( true )
              {
                  // wait() for shutdown() to take action...
                  if( m_shutdown
                      || (emptyKernel() && !m_persistent) )
                  {
                      // The server will shut itself down when all applications are disposed.
                      if( emptyKernel() )
                      {
                          final String message =
                              REZ.getString( "embeddor.shutdown.all-apps-disposed" );
                          getLogger().info( message );
                      }
                      break;
                  }
                  gotoSleep();
              }
          }
      }
  
      private boolean emptyKernel()
      {
          final Kernel kernel = getKernel();
          if( null != kernel )
          {
              final String[] names = kernel.getApplicationNames();
              return (0 == names.length);
          }
          else
          {
              //Consider the kernel empty
              //if it has been shutdown
              return true;
          }
      }
  
      private void gotoSleep()
      {
          try
          {
              synchronized( this )
              {
                  wait( 1000 );
              }
          }
          catch( final InterruptedException e )
          {
              //NOOP
          }
      }
  
      /**
       * Release all the resources associated with kernel.
       */
      public synchronized void dispose()
      {
          shutdown();
          try
          {
              unregisterComponents();
              super.dispose();
          }
          catch( final Exception e )
          {
              // whoops!
              final String message = REZ.getString( "embeddor.error.shutdown.failed" );
              getLogger().fatalError( message, e );
          }
  
          System.gc(); // make sure resources are released
      }
  
      /**
       * Request the Embeddor shutsdown.
       */
      public void shutdown()
      {
          m_shutdown = true;
          synchronized( this )
          {
              notifyAll();
          }
      }
  
      /**
       * Ask the embeddor to restart itself if this operation is supported.
       *
       * @throws UnsupportedOperationException if restart not supported
       */
      public void restart()
          throws UnsupportedOperationException
      {
          try
          {
              m_observable.change();
              m_observable.notifyObservers( "restart" );
          }
          catch( final Exception e )
          {
              throw new UnsupportedOperationException();
          }
      }
  
      /**
       * Get name by which the server is know.
       * Usually this defaults to "Phoenix" but the admin
       * may assign another name. This is useful when you
       * are managing a cluster of Phoenix servers.
       *
       * @return the name of server
       */
      public String getName()
      {
          return Constants.SOFTWARE;
      }
  
      /**
       * Get location of Phoenix installation
       *
       * @return the home directory of phoenix
       */
      public String getHomeDirectory()
      {
          return m_phoenixHome;
      }
  
      /**
       * Get the date at which this server started.
       *
       * @return the date at which this server started
       */
      public Date getStartTime()
      {
          return new Date( m_startTime );
      }
  
      /**
       * Retrieve the number of millisecond
       * the server has been up.
       *
       * @return the the number of millisecond the server has been up
       */
      public long getUpTimeInMillis()
      {
          return System.currentTimeMillis() - m_startTime;
      }
  
      /**
       * Retrieve a string identifying version of server.
       * Usually looks like "v4.0.1a".
       *
       * @return version string of server.
       */
      public String getVersion()
      {
          return Constants.VERSION;
      }
  
      /**
       * Get a string defining the build.
       * Possibly the date on which it was built, where it was built,
       * with what features it was built and so forth.
       *
       * @return the string describing build
       */
      public String getBuild()
      {
          return "(" + Constants.DATE + ")";
      }
  
      /**
       * The deployer is used to load the applications from the
       * default-apps-location specified in Parameters.
       * TODO: load facilities from .fars as well.
       *
       * @throws Exception if an error occurs
       */
      protected void deployDefaultApplications()
          throws Exception
      {
          //Name of optional application specified on CLI
          final String application =
              m_parameters.getParameter( "application-location", null );
          if( null != application )
          {
              final File file = new File( application );
              deployFile( file );
          }
          if( null != m_appDir )
          {
              final File directory = new File( m_appDir );
              final ExtensionFileFilter filter = new ExtensionFileFilter( ".sar" );
              final File[] files = directory.listFiles( filter );
              if( null != files )
              {
                  deployFiles( files );
              }
          }
      }
  
      private void deployFiles( final File[] files )
          throws Exception
      {
          for( int i = 0; i < files.length; i++ )
          {
              deployFile( files[ i ] );
          }
      }
  
      private void deployFile( final File file )
          throws Exception
      {
          final String filename = file.getName();
          int index = filename.lastIndexOf( '.' );
          if( -1 == index )
          {
              index = filename.length();
          }
          final String name = filename.substring( 0, index );
          final File canonicalFile = file.getCanonicalFile();
          deployFile( name, canonicalFile );
      }
  
      protected final synchronized void deployFile( final String name, final File file )
          throws Exception
      {
          final Deployer deployer = (Deployer)getComponent( Deployer.ROLE );
          deployer.deploy( name, file.toURL() );
      }
  
      private Parameters createChildParameters()
      {
          final Parameters parameters = new Parameters();
          parameters.merge( m_parameters );
          parameters.setParameter( "phoenix.apps.dir", m_appDir );
          return parameters;
      }
  
      /**
       * Register embeddor and it's components to {@link SystemManager}.
       */
      private void registerComponents()
          throws Exception
      {
          final SystemManager systemManager =
              (SystemManager)getComponent( SystemManager.ROLE );
  
          final SystemManager componentManager =
              systemManager.getSubContext( null, "component" );
  
          componentManager.register( ManagementRegistration.EMBEDDOR.getName(),
                                     this,
                                     ManagementRegistration.EMBEDDOR.getInterfaces() );
  
          for( int i = 0; i < m_entries.length; i++ )
          {
              final ManagementRegistration registration =
                  ManagementRegistration.getManagementInfoForRole( m_entries[ i ].getRole() );
              if( null != registration )
              {
                  componentManager.register( registration.getName(),
                                             m_entries[ i ].getObject(),
                                             registration.getInterfaces() );
              }
          }
      }
  
      /**
       * Unregister embeddor and it's components from <code>SystemManager</code>.
       */
      private void unregisterComponents()
          throws Exception
      {
          final SystemManager systemManager =
              (SystemManager)getComponent( SystemManager.ROLE );
  
          final SystemManager componentManager = systemManager.getSubContext( null, "component" );
  
          componentManager.unregister( ManagementRegistration.EMBEDDOR.getName() );
  
          for( int i = 0; i < m_entries.length; i++ )
          {
              final ManagementRegistration registration =
                  ManagementRegistration.getManagementInfoForRole( m_entries[ i ].getRole() );
              if( null != registration )
              {
                  componentManager.unregister( registration.getName() );
              }
          }
      }
  
      /**
       * Allow subclasses to get access to kernel.
       *
       * @return the Kernel
       */
      protected final Kernel getKernel()
      {
          return (Kernel)getComponent( Kernel.ROLE );
      }
  
      /**
       * Allow subclasses to get access to parameters.
       *
       * @return the Parameters
       */
      protected final Parameters getParameters()
      {
          return m_parameters;
      }
  }
  
  class EmbeddorObservable2
      extends Observable
  {
      public void change()
      {
          super.setChanged();
      }
  }
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>