You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by co...@apache.org on 2001/11/25 08:34:01 UTC

cvs commit: jakarta-avalon-cornerstone/apps/overlord/src/manifest overlord.mf

colus       01/11/24 23:34:01

  Added:       apps/overlord README.txt build.xml
               apps/overlord/src/conf overlord-assembly.xml
                        overlord-config.xml overlord-environment.xml
               apps/overlord/src/java/org/apache/avalon/overlord
                        Collector.java CollectorTarget.java
                        GatheringServer.java Overlord.java Overlord.xinfo
                        Resources.properties TimeTriggerFactory.java
               apps/overlord/src/java/org/apache/avalon/overlord/collectors
                        Resources.properties SocketCollector.java
               apps/overlord/src/manifest overlord.mf
  Log:
  Added Overlord. The Collector Controller Server.
  
  Revision  Changes    Path
  1.1                  jakarta-avalon-cornerstone/apps/overlord/README.txt
  
  Index: README.txt
  ===================================================================
  Overlord
  ========
  
  Contents Gathering Server.
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/overlord/build.xml
  
  Index: build.xml
  ===================================================================
  <?xml version="1.0"?>
  
  <project default="main" basedir=".">
  
    <!--
      Give user a chance to override without editing this file
      (and without typing -D each time they compile it)
    -->
    <property file=".ant.properties"/>
    <property file="${user.home}/.ant.properties"/>
  
    <property name="name" value="overlord"/>
    <property name="Name" value="Overlord"/>
    <property name="version" value="0.0"/>
    <property name="year" value="2001"/>
  
    <property name="build.debug" value="on"/>
    <property name="build.optimize" value="off"/>
    <property name="build.deprecation" value="on"/>
  
    <!-- Set the installation variables for Cornerstone/Phoenix -->
    <property name="phoenix.home" value="../../../jakarta-avalon-phoenix/dist"/>
    <property name="install.dir" value="${phoenix.home}/apps"/>
  
    <!-- Set the properties for intermediate directory -->
    <property name="build.dir" value="build"/>
    <property name="build.lib" value="${build.dir}/lib"/>
    <property name="build.src" value="${build.dir}/src"/>
    <property name="build.classes" value="${build.dir}/classes"/>
    <property name="build.xdocs" value="${build.dir}/xdocs"/>
    <property name="build.context" value="${build.dir}/documentation"/>  
  
    <!-- Set the properties for source directories -->
    <property name="src.dir" value="src"/>
    <property name="java.dir" value="${src.dir}/java"/>
    <property name="manifest.dir" value="${src.dir}/manifest"/>
    <property name="conf.dir" value="${src.dir}/conf"/>
    <property name="tools.dir" value="../../../jakarta-avalon/tools"/>  
    <property name="docs.dir" value="docs"/>
    <property name="xdocs.dir" value="${src.dir}/xdocs"/>  
    <property name="context.dir" value="../../../jakarta-avalon/src/documentation"/>  
    <property name="junit.jar" value="${tools.dir}/lib/junit-3.7.jar"/>
    <property name="tools.jar" value="${java.home}/../lib/tools.jar"/>  
  
    <property name="dist.base" value="distributions"/>
  
    <path id="project.class.path">
      <pathelement path="${java.class.path}" />
      <pathelement location="xerces.jar2"/>  
      <pathelement path="${build.classes}" />
      <pathelement path="../../build/classes" />
  
      <fileset dir="../../lib">
        <include name="*.jar" />
      </fileset>
    </path>
  
    <path id="tools.class.path">
      <pathelement location="${junit.jar}"/>
      <pathelement location="${tools.jar}"/>
      <fileset dir="${tools.dir}/lib"/>
      <fileset dir="${tools.dir}/ext"/>
    </path>
  
    <taskdef name="sar" classname="org.apache.avalon.phoenix.tools.tasks.Sar">
      <classpath refid="project.class.path" />
    </taskdef>
  
    <!-- Help on usage -->
    <target name="help" depends="usage"/>
    <target name="usage">
      <echo message="Run ant -projecthelp to get a list of targets to run"/>
    </target>
  
    <!-- Compiles project -->
    <target name="compile">
    
      <ant antfile="build.xml" dir="../.." target="compile" inheritall="false"/>
  
      <mkdir dir="${build.classes}"/>
  
      <javac srcdir="${java.dir}"
             destdir="${build.classes}"
             debug="${build.debug}"
             optimize="${build.optimize}"
             deprecation="${build.deprecation}">
        <classpath refid="project.class.path" />
      </javac>
  
      <copy todir="${build.classes}">
        <fileset dir="${java.dir}">
          <exclude name="**/test/**"/>
          <exclude name="**/*.java"/>
        </fileset>
      </copy>
  
    </target>
  
    <!-- Jars up project -->
    <target name="jars" depends="compile">
  
      <mkdir dir="${build.lib}"/>
  
      <jar file="${build.lib}/overlord.jar"
           manifest="${manifest.dir}/overlord.mf">
        <fileset dir="${build.classes}">
          <include name="org/apache/avalon/overlord/**"/>
        </fileset>
        <fileset dir="${java.dir}">
          <include name="org/apache/avalon/overlord/**/*.properties"/>
          <include name="org/apache/avalon/overlord/**/*.xinfo"/>
        </fileset>
      </jar>
  
    </target>
  
    <target name="main" depends="sars" description="Default target to generate build products minus docs"/>
    <target name="all" depends="main,docs" description="Generate build products including docs"/>
   
    <target name="sars" depends="jars">
  
      <sar sarfile="${build.lib}/overlord.sar"
           config="${conf.dir}/overlord-config.xml"
           environment="${conf.dir}/overlord-environment.xml"
           assembly="${conf.dir}/overlord-assembly.xml" >
  
        <lib dir="${build.lib}/">
          <include name="*.jar"/>
        </lib>          
  
        <lib dir="../../build/lib">
          <include name="cornerstone.jar"/>
        </lib>
        
      </sar>
  
    </target>
  
    
    <!-- Performs unit tests -->
    <target name="check" depends="compile" description="Perform any built in tests">
    </target>
  
    <!-- Create the API documentation -->
    <target name="javadocs" description="Generates the Java Docs">
  
      <delete dir="${docs.dir}/api"/>
      <mkdir dir="${docs.dir}/api"/>
  
      <javadoc packagenames="org.apache.*"
               sourcepath="${java.dir}"
               destdir="${docs.dir}/api">
        <classpath refid="project.class.path" />
        <doclet name="com.sun.tools.doclets.standard.Standard">
         <param name="-author"/>
         <param name="-version"/>
         <param name="-doctitle" value="${Name}"/>
         <param name="-windowtitle" value="${Name} API"/>
         <param name="-bottom"
                value="&quot;Copyright &#169; 2001 Apache Jakarta Project. All Rights Reserved.&quot;"/>
        </doclet>
      </javadoc>
    </target>
  
    <!-- Prepares the documentation directory -->
    <target name="xdocs" description="Generates the Docs"/>
    <!-- cant get this working yet -->
    <target name="xdocs_alt" description="Generates the Docs">
  
      <mkdir dir="${build.context}"/>
      <mkdir dir="${build.xdocs}"/>
      <mkdir dir="${build.dir}/work"/>
  
      <!-- Base pointers for non-xdocs documentation. Override these 
           in .ant.properties to link to local docs -->
      <property name="avalon.base" value="http://jakarta.apache.org/avalon"/>
      <property name="framework.base" value="http://jakarta.apache.org/avalon/framework"/>
      <property name="phoenix.base" value="http://jakarta.apache.org/avalon/phoenix"/>
      <property name="cornerstone.base" value="http://jakarta.apache.org/avalon/cornerstone"/>
      <property name="logkit.base" value="http://jakarta.apache.org/avalon/logkit"/>
      <property name="testlet.base" value="http://jakarta.apache.org/avalon/testlet"/>
  
      <filter token="year" value="${year}"/>
      <filter token="AVALON_BASE" value="${avalon.base}"/>
      <filter token="FRAMEWORK_BASE" value="${framework.base}"/>
      <filter token="PHOENIX_BASE" value="${phoenix.base}"/>
      <filter token="CORNERSTONE_BASE" value="${cornerstone.base}"/>
      <filter token="LOGKIT_BASE" value="${logkit.base}"/>
      <filter token="TESTLET_BASE" value="${testlet.base}"/>
  
      <copy todir="${build.context}" filtering="on">
        <fileset dir="${context.dir}">
          <exclude name="resources/**"/>
          <exclude name="xdocs"/>
        </fileset>
      </copy>
  
      <copy todir="${build.context}/xdocs" filtering="on" overwrite="yes">
        <fileset dir="${xdocs.dir}"/>
      </copy>
  
      <copy todir="${build.context}/resources" filtering="off" overwrite="yes">
        <fileset dir="${context.dir}/resources"/>
        <fileset dir="${xdocs.dir}">
          <include name="**/images/**"/>
        </fileset>
      </copy>
  
      <delete>
        <fileset dir="${docs.dir}">
          <exclude name="api/**"/>
        </fileset>
      </delete>
      <mkdir dir="${docs.dir}"/>
  
      <java classname="org.apache.cocoon.Main" fork="true">
        <arg value="-c${build.context}/"/>
        <arg value="-d${docs.dir}"/>
        <arg value="-w${build.dir}/work"/>
        <arg value="-l${build.dir}/work/cocoon.log"/>
        <arg value="-uINFO"/>
        <arg value="-f${xdocs.dir}/cornerstone.uris"/>
        <classpath refid="tools.class.path"/>
      </java>
    </target>
  
    <target name="docs" depends="javadocs,xdocs"/>
  
  
    <!-- Completely build all dists -->
    <target name="dist" description="Generates the distribution">
  
      <property name="dist.name" value="${Name}-${version}"/>
  
      <mkdir dir="${dist.base}"/>
  
      <antcall target="bin-dist" inheritAll="false">
        <param name="bin.dist.dir" value="${dist.name}" />
      </antcall>
  
      <zip file="${dist.base}/${dist.name}-bin.zip"
           basedir="${dist.name}/.."
           includes="${dist.name}/**"/>
  
      <tar longfile="gnu" tarfile="${dist.base}/${dist.name}-bin.tar">
        <tarfileset dir="${dist.name}/.." username="avalon" group="avalon">
          <include name="${dist.name}/**"/>
        </tarfileset>
      </tar>
  
      <gzip zipfile="${dist.base}/${dist.name}-bin.tar.gz"
            src="${dist.base}/${dist.name}-bin.tar"/>
  
      <delete file="${dist.base}/${dist.name}-bin.tar"/>
      <delete dir="${dist.name}" />
  
      <antcall target="src-dist" inheritAll="false">
        <param name="src.dist.dir" value="${dist.name}" />
      </antcall>
  
      <zip file="${dist.base}/${dist.name}-src.zip"
           basedir="${dist.name}/.."
           includes="${dist.name}/**"/>
  
      <tar longfile="gnu" tarfile="${dist.base}/${dist.name}-src.tar" >
        <tarfileset dir="${dist.name}/.." mode="755" username="avalon" group="avalon">
          <include name="${dist.name}/build.sh"/>
        </tarfileset>
        <tarfileset dir="${dist.name}/.." username="avalon" group="avalon">
          <include name="${dist.name}/**"/>
          <exclude name="${dist.name}/build.sh"/>
        </tarfileset>
      </tar>
  
      <gzip zipfile="${dist.base}/${dist.name}-src.tar.gz"
            src="${dist.base}/${dist.name}-src.tar"/>
      <delete file="${dist.base}/${dist.name}-src.tar"/>
      <delete dir="${dist.name}" />
  
    </target>
  
    <!-- Creates all the .sar files -->  
    <target name="bin-dist" depends="all" >
  
      <!-- bin.dist.dir usually set before this target is called -->
      <property name="bin.dist.dir" value="dist"/>
      <property name="bin.dist.lib" value="${bin.dist.dir}/lib"/>
      <property name="bin.dist.docs" value="${bin.dist.dir}/docs"/>
  
      <mkdir dir="${bin.dist.docs}"/>
      <copy todir="${bin.dist.docs}">
        <fileset dir="${docs.dir}"/>
      </copy>
  
      <copy file="${build.lib}/overlord.sar" tofile="${bin.dist.dir}/overlord-${version}.sar"/>
  
      <chmod dir="${bin.dist.dir}" perm="go-rwx" />
    </target>
  
    <target name="src-dist" depends="docs">
      <!-- src.dist.dir has usually already been set -->
      <property name="src.dist.dir" value="dist-src"/>
      <property name="src.dist.src" value="${src.dist.dir}/src"/>
      <property name="src.dist.docs" value="${src.dist.dir}/docs"/>
  
      <mkdir dir="${src.dist.docs}"/>
  
      <copy todir="${src.dist.docs}">
        <fileset dir="${docs.dir}"/>
      </copy>
  
      <copy todir="${src.dist.src}">
        <fileset dir="${src.dir}"/>
      </copy>
      <fixcrlf srcdir="${src.dist.src}/java" includes="**/*.java" eol="lf"/>
  
      <chmod dir="${src.dist.dir}" perm="go-rwx" />
    </target>
  
    <target name="install" depends="main" description="Installs into Phoenix">
      <!-- <fail message="install.dir not specified." unless="install.dir"/> -->
      <echo message="Installing to ${install.dir}" />
      <delete dir="${install.dir}/overlord" />
      <copy file="${build.lib}/overlord.sar" todir="${install.dir}" />
    </target>
  
    <target name="uninstall" description="Uninstalls from Phoenix">
  
      <!-- <fail message="install.dir not specified." unless="install.dir"/> -->
      <delete dir="${install.dir}/overlord/" />
      <delete file="overlord.sar" dir="${install.dir}"/>
    </target>
  
    <target name="clean" description="Cleans up artifacts from build process">
      <delete dir="${build.dir}" />
      <delete>
        <fileset dir="." includes="**/*~" defaultexcludes="no"/>
      </delete>
    </target>
  
    <target name="distclean" depends="clean" description="Cleans up all generated files and directories">
      <delete dir="${docs.dir}" />
      <delete dir="${bin.dist.dir}" />
      <delete dir="${dist.base}" />
    </target>
  
  </project>
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/overlord/src/conf/overlord-assembly.xml
  
  Index: overlord-assembly.xml
  ===================================================================
  <?xml version="1.0"?>
  
  <assembly>
  
    <block class="org.apache.avalon.overlord.Overlord" name="overlord">
      <provide role="org.apache.avalon.cornerstone.services.scheduler.TimeScheduler"
        name="scheduler"/>
      <provide role="org.apache.avalon.cornerstone.services.sockets.SocketManager"
        name="sockets"/>
      <provide role="org.apache.avalon.cornerstone.services.datasource.DataSourceSelector"
        name="datasources"/>
    </block>
  
    <!--                                               -->
    <!-- Below this section are the cornerstone blocks -->
    <!--                                               -->
  
    <!-- The DataSource block -->
    <block class="org.apache.avalon.cornerstone.blocks.datasource.DefaultDataSourceSelector" 
      name="datasources" />
  
    <!-- The Packet Manager block -->
    <block class="org.apache.avalon.cornerstone.blocks.packet.DefaultPacketManager" 
      name="packet-manager">
      <provide role="org.apache.avalon.cornerstone.services.threads.ThreadManager"
        name="thread-manager"/>
    </block>
   
    <!-- The Connection Manager block -->
    <block class="org.apache.avalon.cornerstone.blocks.connection.DefaultConnectionManager" 
           name="connections">
      <provide role="org.apache.avalon.cornerstone.services.threads.ThreadManager"
        name="thread-manager"/>
    </block>
  
    <!-- The Socket Manager block -->
    <block class="org.apache.avalon.cornerstone.blocks.sockets.DefaultSocketManager"
      name="sockets" />
  
    <!-- The TimeScheduler block -->
    <block class="org.apache.avalon.cornerstone.blocks.scheduler.DefaultTimeScheduler"
      name="scheduler">
      <provide role="org.apache.avalon.cornerstone.services.threads.ThreadManager"
        name="thread-manager"/>
    </block>
  
    <!-- The Thread Manager block -->
    <block class="org.apache.avalon.cornerstone.blocks.threads.DefaultThreadManager"
      name="thread-manager" />
  
  </assembly>
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/overlord/src/conf/overlord-config.xml
  
  Index: overlord-config.xml
  ===================================================================
  <?xml version="1.0"?>
  
  <config>
  
    <overlord>
  
      <collectors>
        <!--
        <collector name="news"
          class="hts.rts.news.LGTNewsCollector"
          logger="lgt-news">
          <host>localhost</host>
          <port>25</port>
        </collector>
        <collector name="weather"
          class="hts.rts.news.LGTWeatherCollector"
          logger="lgt-weather">
          <host>localhost</host>
          <port>25</port>
        </collector>
        -->
      </collectors>
  
      <tasks>
        <!--
        <task name="news">
          <trigger class="Periodic">
            <offset>1000</offset>
            <period>10000</period>
          </trigger>
          <target>news</target>
        </task>
        <task name="weather">
          <trigger class="Periodic">
            <offset>1000</offset>
            <period>-1</period>
          </trigger>
          <target>weather</target>
        </task>
        -->
      </tasks>
  
    </overlord>
  
    <datasources>
      <data-sources>
        <!--data-source>
        </data-source--> 
      </data-sources>
    </datasources>
  
    <sockets>
        <server-sockets>
          <factory name="plain"
                   class="org.apache.avalon.cornerstone.blocks.sockets.DefaultServerSocketFactory" />
          <!--
          <factory name="ssl" 
                   class="org.apache.avalon.cornerstone.blocks.sockets.TLSServerSocketFactory">
            <keystore>
              <file>conf/keystore</file> 
              <password>secret</password> 
              <type>JKS</type> 
              <protocol>TLS</protocol> 
              <algorithm>SunX509</algorithm> 
              <authenticate-client>false</authenticate-client> 
            </keystore>
          </factory>
          -->
        </server-sockets>
  
        <client-sockets>
          <factory name="plain" 
                   class="org.apache.avalon.cornerstone.blocks.sockets.DefaultSocketFactory" />
        </client-sockets>
    </sockets>
  
    <thread-manager>
        <thread-group>
          <name>default</name>
  
          <!-- normal priority == 5, max-priority = 10 -->
          <priority>5</priority> 
  
          <!-- are threads deamon threads ? -->
          <is-daemon>false</is-daemon>
  
          <max-threads>40</max-threads>
          <!-- these are ignored at the moment but will be fixed in later revisions -->
          <min-threads>10</min-threads>
          <min-spare-threads>5</min-spare-threads>
        </thread-group>
    </thread-manager>
  </config>
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/overlord/src/conf/overlord-environment.xml
  
  Index: overlord-environment.xml
  ===================================================================
  <?xml version="1.0"?>
  <!--
                                  README!
  
      Basic config file that sets up context for server application.
  
  -->
  <server>
  
    <logs version="1.1">
      <factories>
        <factory type="block"
        class="org.apache.avalon.excalibur.logger.factory.FileTargetFactory"/>
      </factories>
  
      <categories>
        <category name="" log-level="DEBUG">
          <log-target id-ref="default"/>
        </category>
      </categories>
  
      <targets>
        <block id="default">
          <filename>${app.home}/logs/overlord.log</filename>
          <append>false</append>
          <format type="pattern"><![CDATA[ %{time} [%7.7{priority}] <<%{category}>>: %{message}\n%{throwable}]]></format>
        </block>
      </targets>
    </logs>
  
    <policy>
      <grant code-base="file:${app.home}${/}SAR-INF${/}lib${/}*">
        <permission class="java.security.AllPermission" />
      </grant>
    </policy>
  
  </server>
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/overlord/src/java/org/apache/avalon/overlord/Collector.java
  
  Index: Collector.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 file.
   */
  package org.apache.avalon.overlord;
  
  import org.apache.avalon.framework.activity.Executable;
  import org.apache.avalon.framework.component.Component;
  import org.apache.avalon.framework.configuration.Configurable;
  import org.apache.avalon.framework.thread.ThreadSafe;
  
  /**
   * Collect something and do process it like storing, notifing, and etc.
   *
   * @author <a href="mailto:colus@apache.org">Eung-ju Park</a>
   */
  public interface Collector
      extends Executable, ThreadSafe, Component
  {
      String ROLE = "org.apache.avalon.overlord.Collector";
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/overlord/src/java/org/apache/avalon/overlord/CollectorTarget.java
  
  Index: CollectorTarget.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 file.
   */
  package org.apache.avalon.overlord;
  
  import org.apache.avalon.cornerstone.services.scheduler.Target;
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.avalon.framework.logger.AbstractLogEnabled;
  
  /**
   * Collector wrapper for triggering.
   *
   * @author <a href="mailto:colus@apache.org">Eung-ju Park</a>
   */
  class CollectorTarget
      extends AbstractLogEnabled
      implements Target
  {
      private static final Resources REZ =
          ResourceManager.getPackageResources( CollectorTarget.class );
  
      private Collector   m_collector;
  
      public CollectorTarget( final Collector collector )
      {
          m_collector = collector;
      }
  
      public void targetTriggered( final String triggerName )
      {
          try
          {
              m_collector.execute();
  
              final String message = REZ.getString( "target.notice.execute",
                                                    triggerName  );
              getLogger().info( message );
          }
          catch ( final Exception e )
          {
              final String message = REZ.getString( "target.error.execute",
                                                    triggerName );
              getLogger().error( message, e );
          }
      }
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/overlord/src/java/org/apache/avalon/overlord/GatheringServer.java
  
  Index: GatheringServer.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 file.
   */
  package org.apache.avalon.overlord;
  
  /**
   * Collect anything you want. Manage serveral concrete collector.
   *
   * @author <a href="mailto:colus@apache.org">Eung-ju Park</a>
   */
  public interface GatheringServer
  {
      String ROLE = "org.apache.avalon.overlord.GatheringServer";
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/overlord/src/java/org/apache/avalon/overlord/Overlord.java
  
  Index: Overlord.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 file.
   */
  package org.apache.avalon.overlord;
  
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.Iterator;
  import java.util.List;
  import java.util.Map;
  import org.apache.avalon.framework.activity.Disposable;
  import org.apache.avalon.framework.activity.Initializable;
  import org.apache.avalon.framework.component.Component;
  import org.apache.avalon.framework.component.ComponentException;
  import org.apache.avalon.framework.component.ComponentManager;
  import org.apache.avalon.framework.component.Composable;
  import org.apache.avalon.framework.configuration.Configurable;
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
  import org.apache.avalon.framework.context.Context;
  import org.apache.avalon.framework.context.Contextualizable;
  import org.apache.avalon.framework.logger.AbstractLogEnabled;
  import org.apache.avalon.framework.logger.LogEnabled;
  import org.apache.avalon.framework.logger.Logger;
  import org.apache.avalon.excalibur.component.ComponentHandler;
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.avalon.phoenix.Block;
  import org.apache.avalon.phoenix.BlockContext;
  import org.apache.avalon.cornerstone.services.scheduler.TimeScheduler;
  import org.apache.avalon.cornerstone.services.scheduler.TimeTrigger;
  
  /**
   * Control the collectors.
   *
   * @author <a href="mailto:colus@apache.org">Eung-ju Park</a>
   */
  public class Overlord
      extends AbstractLogEnabled
      implements GatheringServer, Block, Contextualizable, Composable, Configurable, Initializable, Disposable
  {
      private static final Resources REZ = 
          ResourceManager.getPackageResources( Overlord.class );
  
      private BlockContext                m_context;
      private ComponentManager            m_componentManager;
      private Configuration               m_configuration;
      private TimeScheduler               m_scheduler;
      private Map                         m_collectors;
      private List                        m_tasks;
  
      public void contextualize( final Context context )
      {
          m_context = (BlockContext)context;
      }
  
      public void compose( final ComponentManager componentManager )
          throws ComponentException
      {
          m_componentManager = componentManager;
  
          m_scheduler =
              (TimeScheduler)m_componentManager.lookup( TimeScheduler.ROLE );
      }
  
      public void configure( final Configuration configuration )
          throws ConfigurationException
      {
          m_configuration = configuration;
      }
  
      private void initializeCollectors( final Configuration configuration )
          throws Exception
      {
          m_collectors = new HashMap();
  
          final Configuration[] confs = configuration.getChildren( "collector" );
          for ( int i = 0; i < confs.length; i++ )
          {
              final Configuration conf = confs[ i ];
              final String name = conf.getAttribute( "name" );
              final String clazz = conf.getAttribute( "class" );
  
              final Collector collector =
                  (Collector)Class.forName( clazz ).newInstance();
              setupComponent( collector,
                              getLogger().getChildLogger( name ),
                              m_context, m_componentManager, conf );
  
              m_collectors.put( name, collector );
  
              getLogger().info( REZ.getString( "overlord.notice.collector.add", name, clazz ) );
          }
      }
  
      private void initializeTasks( final Configuration configuration )
          throws Exception
      {
          m_tasks = new ArrayList();
  
          final Configuration[] taskConfs = configuration.getChildren( "task" );
          for ( int i = 0; i < taskConfs.length; i++ )
          {
              final Configuration conf = taskConfs[ i ];
              final String name = conf.getAttribute( "name" );
  
              final TimeTriggerFactory triggerFactory = new TimeTriggerFactory();
              final Configuration triggerConf = conf.getChild( "trigger" );
              final TimeTrigger trigger = triggerFactory.create( triggerConf );
  
              final String targetName = conf.getChild( "target" ).getValue();
  
              addTask( name, trigger, targetName );
          }
      }
  
      public void initialize()
          throws Exception
      {
          initializeCollectors( m_configuration.getChild( "collectors" ) );
          initializeTasks( m_configuration.getChild( "tasks" ) );
  
          getLogger().info( REZ.getString( "overlord.notice.ready" ) );
      }
  
      public void dispose()
      {
          disposeTasks();
          disposeCollectors();
      }
  
      private void disposeTasks()
      {
          final Iterator taskNames = m_tasks.iterator();
          while ( taskNames.hasNext() )
          {
              removeTask( (String)taskNames.next() );
          }
          m_tasks.clear();
          m_tasks = null;
      }
  
      private void disposeCollectors()
      {
          final Iterator collectorNames = m_collectors.keySet().iterator();
          while ( collectorNames.hasNext() )
          {
              final String name = (String)collectorNames.next();
              final Collector collector = (Collector)m_collectors.get( name );
              shutdownComponent( collector );
          }
          m_collectors.clear();
          m_collectors = null;
      }
  
      /**
       * Add task.
       *
       * @param taskName the name of task to add 
       * @param trigger trigger
       * @param collector collector to invoke
       */
      private void addTask( final String taskName, final TimeTrigger trigger,
                            final String collectorName )
      {
          if ( m_tasks.contains( taskName ) )
          {
              final String msg = REZ.getString( "overlord.error.task.exists",
                                                taskName );
              throw new IllegalArgumentException( msg );
          }
  
          final Collector collector =
              (Collector)m_collectors.get( collectorName );
          if ( null == collector )
          {
              final String message = REZ.getString( "overlord.error.collector.find", collectorName );
              throw new IllegalArgumentException( message );
          }
  
          final CollectorTarget target = new CollectorTarget( collector );
          setupLogger( target );
  
          m_scheduler.addTrigger( this + taskName, trigger, target );
          m_tasks.add( taskName );
  
          getLogger().info( REZ.getString( "overlord.notice.task.add", taskName ) );
      }
  
      /**
       * Remove task.
       *
       * @param taskName the name of task to remove
       */
      private void removeTask( final String taskName )
      {
          m_scheduler.removeTrigger( this + taskName );
          m_tasks.remove( taskName );
  
          getLogger().info( REZ.getString( "overlord.notice.task.remove", taskName ) );
      }
  
      private void setupComponent( final Component component,
                                   final Logger logger,
                                   final Context context,
                                   final ComponentManager componentManager, 
                                   final Configuration configuration )
          throws Exception
      {
          if ( component instanceof LogEnabled )
          {
              ((LogEnabled)component).enableLogging( logger );
          }
  
          if ( component instanceof Contextualizable )
          {
              ((Contextualizable)component).contextualize( context );
          }
  
          if ( component instanceof Composable )
          {
              ((Composable)component).compose( componentManager );
          }
  
          if ( component instanceof Configurable )
          {
              ((Configurable)component).configure( configuration );
          }
  
          if ( component instanceof Initializable )
          {
              ((Initializable)component).initialize();
          }
      }
  
      private void shutdownComponent( final Component component )
      {
          if ( component instanceof Disposable )
          {
              ((Disposable)component).dispose();
          }
      }
  
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/overlord/src/java/org/apache/avalon/overlord/Overlord.xinfo
  
  Index: Overlord.xinfo
  ===================================================================
  <?xml version="1.0"?> 
   
  <blockinfo> 
   
    <block>
      <version>1.0</version>
    </block>
  
    <!-- services that are offered by this block --> 
    <services> 
      <service name="org.apache.avalon.overlord.GatheringServer" version="1.0" />
    </services> 
  
    <dependencies>
      <dependency>
        <service name="org.apache.avalon.cornerstone.services.scheduler.TimeScheduler"
          version="1.0"/>
      </dependency>
      <dependency>
        <service name="org.apache.avalon.cornerstone.services.sockets.SocketManager"
          version="1.0"/>
      </dependency>
      <dependency>
        <service name="org.apache.avalon.cornerstone.services.datasource.DataSourceSelector"
          version="1.0"/>
      </dependency>
    </dependencies> 
  </blockinfo> 
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/overlord/src/java/org/apache/avalon/overlord/Resources.properties
  
  Index: Resources.properties
  ===================================================================
  overlord.notice.ready=Overload ready.
  overlord.notice.task.add=Adding Task {0}.
  overlord.notice.task.remove=Removing Task {0}.
  overlord.notice.collector.add=Adding Collector {0}({1}).
  overlord.notice.collector.dispose=Disposing Collector {0}.
  overlord.error.task.exists=Task {0} already exists.
  overlord.error.trigger.unknown=Unknown TimeTrigger class {0}.
  overlord.error.collector.dispose=Error disposing Task {0}.
  overlord.error.collector.find=Unable to find Collector named {0}.
  overlord.error.collector.execute=Error executing Collector {0}.
  
  target.notice.execute=Executing Task {0} successfully.
  target.error.execute=Error executing Task {0}.
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/overlord/src/java/org/apache/avalon/overlord/TimeTriggerFactory.java
  
  Index: TimeTriggerFactory.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 file.
   */
  package org.apache.avalon.overlord;
  
  import org.apache.avalon.cornerstone.services.scheduler.CronTimeTrigger;
  import org.apache.avalon.cornerstone.services.scheduler.PeriodicTimeTrigger;
  import org.apache.avalon.cornerstone.services.scheduler.TimeTrigger;
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  
  /**
   * Create TimeTriggers.
   *
   * @author <a href="mailto:colus@apache.org">Eung-ju Park</a>
   */
  public class TimeTriggerFactory
  {
      private static final Resources REZ =
          ResourceManager.getPackageResources( TimeTriggerFactory.class );
  
      public TimeTrigger create( final Configuration conf )
          throws ConfigurationException
      {
          final String clazz = conf.getAttribute( "class" );
  
          TimeTrigger trigger;
          if ( "Periodic".equals( clazz ) )
          {
              final int offset = conf.getChild( "offset", true )
                  .getValueAsInteger( 0 );
              final int period = conf.getChild( "period", true )
                  .getValueAsInteger( -1 );
  
              trigger = new PeriodicTimeTrigger( offset, period );
          }
          else if ( "Cron".equals( clazz ) )
          {
              final int minute = conf.getChild( "minute", true )
                  .getValueAsInteger( -1 );
              final int hour = conf.getChild( "hour", true )
                  .getValueAsInteger( -1 );
              final int day = conf.getChild( "day", true )
                  .getValueAsInteger( -1 );
              final int month = conf.getChild( "month", true )
                  .getValueAsInteger( -1 );
              final int year = conf.getChild( "year", true )
                  .getValueAsInteger( -1 );
              final boolean dayOfWeek = conf.getChild( "day", true )
                  .getAttributeAsBoolean( "week", false );
  
              trigger = new CronTimeTrigger( minute, hour,
                                             day, month, year, dayOfWeek );
          }
          else
          {
              final String msg = REZ.getString( "overlord.error.trigger.unknown",
                                                clazz );
              throw new ConfigurationException( msg );
          }
  
          return trigger;
      }
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/overlord/src/java/org/apache/avalon/overlord/collectors/Resources.properties
  
  Index: Resources.properties
  ===================================================================
  socket.notice.connect=Connection to {0} opened.
  socket.error.connect=Fail to open connection {0}.
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/overlord/src/java/org/apache/avalon/overlord/collectors/SocketCollector.java
  
  Index: SocketCollector.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 file.
   */
  package org.apache.avalon.overlord.collectors;
  
  import java.io.IOException;
  import java.net.InetAddress;
  import java.net.Socket;
  import org.apache.avalon.framework.activity.Disposable;
  import org.apache.avalon.framework.activity.Initializable;
  import org.apache.avalon.framework.component.ComponentException;
  import org.apache.avalon.framework.component.ComponentManager;
  import org.apache.avalon.framework.component.Composable;
  import org.apache.avalon.framework.configuration.Configurable;
  import org.apache.avalon.framework.configuration.Configuration;
  import org.apache.avalon.framework.configuration.ConfigurationException;
  import org.apache.avalon.framework.logger.AbstractLogEnabled;
  import org.apache.avalon.excalibur.i18n.Resources;
  import org.apache.avalon.excalibur.i18n.ResourceManager;
  import org.apache.avalon.cornerstone.services.sockets.SocketFactory;
  import org.apache.avalon.cornerstone.services.sockets.SocketManager;
  import org.apache.avalon.overlord.Collector;
  
  /**
   * Collector that use TCP/IP socket.
   *
   * @author <a href="mailto:colus@apache.org">Eung-ju Park</a>
   */
  public abstract class SocketCollector
      extends AbstractLogEnabled
      implements Composable, Configurable, Initializable, Collector
  {
      private static final Resources REZ =
          ResourceManager.getPackageResources( SocketCollector.class );
  
      private SocketManager       m_socketManager;
      private SocketFactory       m_socketFactory;
  
      private String              m_host;
      private int                 m_port;
      private String              m_socketType;
  
      public void compose( final ComponentManager componentManager )
          throws ComponentException
      {
          m_socketManager =
              (SocketManager)componentManager.lookup( SocketManager.ROLE );
      }
  
      public void configure( final Configuration configuration )
          throws ConfigurationException
      {
          final Configuration connConf = configuration.getChild( "connection" );
          m_host = connConf.getChild( "host" ).getValue();
          m_port = connConf.getChild( "port" ).getValueAsInteger();
          m_socketType = connConf.getChild( "socket-type", true ).getValue( "plain" );
      }
  
      public void initialize()
          throws Exception
      {
          m_socketFactory = m_socketManager.getSocketFactory( m_socketType );
      }
  
      protected Socket connect()
          throws IOException
      {
          Socket socket;
  
          try
          {
              final InetAddress address = InetAddress.getByName( m_host );
              socket = m_socketFactory.createSocket( address, m_port );
  
              final String message = REZ.getString( "socket.notice.connect",
                                                    m_host + ":" + m_port );
              getLogger().info( message );
          }
          catch ( final IOException ie )
          {
              final String message = REZ.getString( "socket.error.connect",
                                                    m_host + ":" + m_port );
              getLogger().error( message, ie );
              throw ie;
          }
  
          return socket;
      }
  }
  
  
  
  1.1                  jakarta-avalon-cornerstone/apps/overlord/src/manifest/overlord.mf
  
  Index: overlord.mf
  ===================================================================
  Manifest-Version: 1.0
  Created-By: Jakarta Apache Avalon/Cornerstone Project
  
  Name: org/apache/avalon/overlord/Overlord.class
  Avalon-Block: true
  
  
  
  

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