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=""Copyright © 2001 Apache Jakarta Project. All Rights Reserved.""/>
</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>