You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by db...@apache.org on 2005/11/16 13:35:00 UTC

svn commit: r344993 - in /geronimo/gbuild/trunk: gbuild-agent-application/src/conf/ gbuild-agent/ gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/ gbuild-agent/src/main/resources/META-INF/plexus/ gbuild-agent/src/test/java/org/apache/geroni...

Author: dblevins
Date: Wed Nov 16 04:34:52 2005
New Revision: 344993

URL: http://svn.apache.org/viewcvs?rev=344993&view=rev
Log:
Major overhaul that cleans up extensibility and adds build producer and build results agent in the mix

Added:
    geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/AbstractContinuumAgentAction.java
      - copied, changed from r344296, geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/AbstractDistributedContinuumAction.java
    geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/AbstractContinuumBuildAgent.java
    geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildResultsContinuumAgent.java
    geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildResultsExtention.java
    geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildResultsExtentionManager.java
    geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/DefaultBuildResultsExtentionManager.java
    geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/NoSuchExtentionException.java
      - copied, changed from r344296, geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/NoSuchBuildAgentExtentionException.java
    geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/WriteIncludeFileExtention.java
Removed:
    geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/AbstractDistributedContinuumAction.java
    geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildTaskProducer.java
    geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/EchoPropertiesExtention.java
    geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/NoSuchBuildAgentExtentionException.java
Modified:
    geronimo/gbuild/trunk/gbuild-agent-application/src/conf/application.xml
    geronimo/gbuild/trunk/gbuild-agent/pom.xml
    geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildAgentExtentionManager.java
    geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/ContinuumBuildAgent.java
    geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/DefaultBuildAgentExtentionManager.java
    geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/DirectoryMonitor.java
    geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/DistrubutedBuildController.java
    geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/FileIncludeExtention.java
    geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/HeaderIncludeExtention.java
    geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/PropertiesBuildTaskProducer.java
    geronimo/gbuild/trunk/gbuild-agent/src/main/resources/META-INF/plexus/components.xml
    geronimo/gbuild/trunk/gbuild-agent/src/test/java/org/apache/geronimo/gbuild/agent/ContinuumBuildAgentTest.java
    geronimo/gbuild/trunk/gbuild-agent/src/test/java/org/apache/geronimo/gbuild/agent/MainTest.java

Modified: geronimo/gbuild/trunk/gbuild-agent-application/src/conf/application.xml
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent-application/src/conf/application.xml?rev=344993&r1=344992&r2=344993&view=diff
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent-application/src/conf/application.xml (original)
+++ geronimo/gbuild/trunk/gbuild-agent-application/src/conf/application.xml Wed Nov 16 04:34:52 2005
@@ -37,20 +37,6 @@
     </component>
 
     <component>
-      <role>org.apache.geronimo.gbuild.agent.BuildAgentExtention</role>
-      <role-hint>work-properties</role-hint>
-      <implementation>org.apache.geronimo.gbuild.agent.FileIncludeExtention</implementation>
-      <requirements>
-        <requirement>
-          <role>org.apache.maven.continuum.configuration.ConfigurationService</role>
-        </requirement>
-      </requirements>
-      <configuration>
-        <file-name-key>work-properties</file-name-key>
-      </configuration>
-    </component>
-
-    <component>
       <role>org.apache.maven.continuum.store.ContinuumStore</role>
       <role-hint>agent-store</role-hint>
       <implementation>org.apache.geronimo.gbuild.agent.ThreadContextContinuumStore</implementation>
@@ -61,7 +47,7 @@
       <!--<role-hint>agent-notifier</role-hint>-->
       <implementation>org.apache.geronimo.gbuild.agent.MockContinuumNotificationDispatcher</implementation>
     </component>
-    
+
     <!--
     | Logger manager
     -->

Modified: geronimo/gbuild/trunk/gbuild-agent/pom.xml
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/pom.xml?rev=344993&r1=344992&r2=344993&view=diff
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/pom.xml (original)
+++ geronimo/gbuild/trunk/gbuild-agent/pom.xml Wed Nov 16 04:34:52 2005
@@ -10,6 +10,13 @@
   <build>
     <plugins>
       <plugin>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.4</source>
+          <target>1.4</target>
+        </configuration>
+      </plugin>
+      <plugin>
         <groupId>org.codehaus.plexus</groupId>
         <artifactId>plexus-maven-plugin</artifactId>
         <version>1.1</version>

Copied: geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/AbstractContinuumAgentAction.java (from r344296, geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/AbstractDistributedContinuumAction.java)
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/AbstractContinuumAgentAction.java?p2=geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/AbstractContinuumAgentAction.java&p1=geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/AbstractDistributedContinuumAction.java&r1=344296&r2=344993&rev=344993&view=diff
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/AbstractDistributedContinuumAction.java (original)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/AbstractContinuumAgentAction.java Wed Nov 16 04:34:52 2005
@@ -17,15 +17,14 @@
 package org.apache.geronimo.gbuild.agent;
 
 import org.apache.maven.continuum.core.action.AbstractContinuumAction;
-import org.apache.maven.continuum.model.project.Project;
-import org.apache.maven.continuum.model.project.BuildDefinition;
+import org.apache.maven.continuum.store.ContinuumStore;
 
 import java.util.Map;
 
 /**
  * @version $Rev$ $Date$
  */
-public abstract class AbstractDistributedContinuumAction extends AbstractContinuumAction {
+public abstract class AbstractContinuumAgentAction extends AbstractContinuumAction {
 
     // ----------------------------------------------------------------------
     // Keys for the values that can be in the context
@@ -35,18 +34,89 @@
 
     public static final String KEY_BUILD_DEFINITION = "build-definition";
 
+    public static final String KEY_STORE = "store";
+
+    public static final String KEY_PROJECT_ID = "projectId";
+
+    public static final String KEY_BUILD_DEFINITION_ID = "buildDefinitionId";
+
+    public static final String KEY_TRIGGER = "trigger";
+
+    public static final String KEY_HOST_NAME = "hostName";
+
+    public static final String KEY_HOST_ADDRESS = "hostAddress";
+
+    public static final String KEY_CONTRIBUTOR = "contributor";
+
+    public static final String KEY_ADMIN_ADDRESS = "adminAddress";
+
+    public static final String KEY_OS_VERSION = "os.version";
+
+    public static final String KEY_OS_NAME = "os.name";
+
+    public static final String KEY_JAVA_VERSION = "java.version";
+
+    public static final String KEY_JAVA_VENDOR = "java.vendor";
+
     // ----------------------------------------------------------------------
     //
     // ----------------------------------------------------------------------
 
-    public static Project getProject( Map context )
-    {
-        return (Project) getObject( context, KEY_PROJECT_ID );
+    public static int getTrigger(Map context) {
+        return getInteger(context, KEY_TRIGGER);
+    }
+
+    public static int getBuildDefinitionId(Map context) {
+        return getInteger(context, KEY_BUILD_DEFINITION_ID);
+    }
+
+    public static int getProjectId(Map context) {
+        return getInteger(context, KEY_PROJECT_ID);
     }
 
-    public static BuildDefinition getBuildDefinition( Map context )
-    {
-        return (BuildDefinition) getObject( context, KEY_BUILD_DEFINITION_ID );
+    public static ContinuumStore getContinuumStore(Map context) {
+        return (ContinuumStore) getObject(context, KEY_STORE);
     }
+
+    protected static String getString(Map context, String key) {
+        return (String) getObject(context, key);
+    }
+
+    protected static String getString(Map context, String key, String defaultValue) {
+        return (String) getObject(context, key, defaultValue);
+    }
+
+    public static boolean getBoolean(Map context, String key) {
+        return ((Boolean) getObject(context, key)).booleanValue();
+    }
+
+    protected static int getInteger(Map context, String key) {
+        return ((Integer) getObject(context, key, null)).intValue();
+    }
+
+    protected static Object getObject(Map context, String key) {
+        if (!context.containsKey(key)) {
+            throw new RuntimeException("Missing key '" + key + "'.");
+        }
+
+        Object value = context.get(key);
+
+        if (value == null) {
+            throw new RuntimeException("Missing value for key '" + key + "'.");
+        }
+
+        return value;
+    }
+
+    protected static Object getObject(Map context, String key, Object defaultValue) {
+        Object value = context.get(key);
+
+        if (value == null) {
+            return defaultValue;
+        }
+
+        return value;
+    }
+
 
 }

Added: geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/AbstractContinuumBuildAgent.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/AbstractContinuumBuildAgent.java?rev=344993&view=auto
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/AbstractContinuumBuildAgent.java (added)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/AbstractContinuumBuildAgent.java Wed Nov 16 04:34:52 2005
@@ -0,0 +1,125 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.gbuild.agent;
+
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.Startable;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.StartingException;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.StoppingException;
+import org.activemq.ActiveMQConnectionFactory;
+
+import javax.jms.ExceptionListener;
+import javax.jms.Connection;
+import javax.jms.JMSException;
+import javax.jms.MessageConsumer;
+import javax.jms.Session;
+import javax.jms.Queue;
+import javax.jms.MessageProducer;
+import javax.jms.Topic;
+import javax.jms.DeliveryMode;
+import javax.jms.ObjectMessage;
+import javax.jms.Message;
+import java.util.Map;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public abstract class AbstractContinuumBuildAgent extends AbstractContinuumAgentAction implements BuildAgent, ExceptionListener, Startable {
+    /**
+     * @plexus.configuration
+     */
+    protected String coordinatorUrl;
+
+    protected boolean run;
+
+    protected Connection connection;
+
+    public synchronized void start() throws StartingException {
+        try {
+            connection = createConnection(coordinatorUrl);
+        } catch (Throwable e) {
+            getLogger().error("Could not create connection to: "+coordinatorUrl, e);
+            throw new StartingException("Could not create connection to: "+coordinatorUrl);
+        }
+
+        run = true;
+        Thread agentThread = new Thread(this);
+        agentThread.setDaemon(false);
+        agentThread.start();
+    }
+
+    public synchronized void stop() throws StoppingException {
+        run = false;
+        try {
+            connection.close();
+        } catch (JMSException e) {
+            getLogger().error("Could not close connection to: "+coordinatorUrl, e);
+            throw new StoppingException("Could not close connection to: "+coordinatorUrl);
+        }
+    }
+
+    public synchronized void onException(JMSException ex) {
+        getLogger().fatalError("JMS Exception occured.  Shutting down client.", ex);
+        run = false;
+    }
+
+    public synchronized boolean isRunning() {
+        return run;
+    }
+
+    protected Connection createConnection(String coordinatorUrl) throws JMSException {
+        // Create a ConnectionFactory
+        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(coordinatorUrl);
+
+        // Create a Connection
+        Connection connection = connectionFactory.createConnection();
+
+        connection.start();
+
+        connection.setExceptionListener(this);
+
+        return connection;
+    }
+
+    protected MessageConsumer createQueueConsumer(Session session, String subject) throws JMSException {
+        Queue queue = session.createQueue(subject);
+
+        return session.createConsumer(queue);
+    }
+
+    protected MessageProducer createTopicProducer(Session session, String subject) throws JMSException {
+        Topic topic = session.createTopic(subject);
+
+        MessageProducer producer = session.createProducer(topic);
+
+        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
+
+        return producer;
+    }
+
+    protected MessageConsumer createConsumer(Session session, String subject) throws JMSException {
+        Topic topic = session.createTopic(subject);
+        return session.createConsumer(topic);
+    }
+
+    protected Map getMap(ObjectMessage objectMessage, Message message) throws JMSException, BuildAgentException {
+        try {
+            return (Map) objectMessage.getObject();
+        } catch (Exception e) {
+            throw new BuildAgentException("Message.getObject failed on "+ message.getJMSMessageID(), e);
+        }
+    }
+}

Modified: geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildAgentExtentionManager.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildAgentExtentionManager.java?rev=344993&r1=344992&r2=344993&view=diff
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildAgentExtentionManager.java (original)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildAgentExtentionManager.java Wed Nov 16 04:34:52 2005
@@ -26,7 +26,7 @@
 
     String ROLE = BuildAgentExtentionManager.class.getName();
 
-    BuildAgentExtention getBuildAgentExtention(String id) throws NoSuchBuildAgentExtentionException;
+    BuildAgentExtention getBuildAgentExtention(String id) throws NoSuchExtentionException;
 
     void postProcess(Map build, HashMap results);
 

Added: geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildResultsContinuumAgent.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildResultsContinuumAgent.java?rev=344993&view=auto
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildResultsContinuumAgent.java (added)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildResultsContinuumAgent.java Wed Nov 16 04:34:52 2005
@@ -0,0 +1,96 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.gbuild.agent;
+
+import javax.jms.Session;
+import javax.jms.MessageConsumer;
+import javax.jms.Message;
+import javax.jms.ObjectMessage;
+import java.util.Map;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class BuildResultsContinuumAgent extends AbstractContinuumBuildAgent {
+
+    /**
+     * @plexus.requirement
+     */
+    private BuildResultsExtentionManager extentionManager;
+
+    /**
+     * @plexus.configuration
+     */
+    private String buildResultsTopic;
+
+
+    public void run() {
+        try {
+            getLogger().info("Continuum Build Agent starting.");
+            getLogger().info("coordinatorUrl "+coordinatorUrl);
+            getLogger().info("buildResultsTopic "+buildResultsTopic);
+
+            // Create a Session
+            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+            MessageConsumer resultsConsumer = createConsumer(session, buildResultsTopic);
+
+            getLogger().info("Continuum Build Agent started and waiting for work.");
+
+            while (run) {
+                // Wait for a message
+                Message message = resultsConsumer.receive(1000);
+
+                if (message == null){
+
+                    continue;
+
+                } else if (message instanceof ObjectMessage) {
+
+                    try {
+                        getLogger().info("Message Received "+ message.getJMSMessageID() +" on "+ connection.getClientID()+":"+buildResultsTopic);
+
+                        ObjectMessage objectMessage = (ObjectMessage) message;
+
+                        Map context = getMap(objectMessage, message);
+
+                        execute(context);
+
+                        getLogger().info("Finished processing "+ message.getJMSMessageID());
+
+                    } catch (Exception e) {
+                        getLogger().error("Failed Processing message "+message.getJMSMessageID());
+                    }
+
+                } else {
+                    getLogger().warn("Agent received incorrect message type: "+message.getClass().getName());
+                }
+            }
+
+            resultsConsumer.close();
+            session.close();
+        } catch (Exception e) {
+            getLogger().error("Agent failed.", e);
+        }
+    }
+
+    public void execute(Map map) throws Exception {
+        extentionManager.execute(map);
+    }
+
+
+}

Added: geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildResultsExtention.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildResultsExtention.java?rev=344993&view=auto
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildResultsExtention.java (added)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildResultsExtention.java Wed Nov 16 04:34:52 2005
@@ -0,0 +1,28 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.gbuild.agent;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public interface BuildResultsExtention {
+
+    String ROLE = BuildResultsExtention.class.getName(); 
+
+    void execute(java.util.Map context) throws java.lang.Exception;
+
+}

Added: geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildResultsExtentionManager.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildResultsExtentionManager.java?rev=344993&view=auto
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildResultsExtentionManager.java (added)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/BuildResultsExtentionManager.java Wed Nov 16 04:34:52 2005
@@ -0,0 +1,32 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.gbuild.agent;
+
+import java.util.Map;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public interface BuildResultsExtentionManager {
+
+    String ROLE = BuildResultsExtentionManager.class.getName();
+
+    BuildResultsExtention getBuildResultsExtention(String id) throws NoSuchExtentionException;
+
+    void execute(Map results) throws Exception;
+
+}

Modified: geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/ContinuumBuildAgent.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/ContinuumBuildAgent.java?rev=344993&r1=344992&r2=344993&view=diff
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/ContinuumBuildAgent.java (original)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/ContinuumBuildAgent.java Wed Nov 16 04:34:52 2005
@@ -21,7 +21,6 @@
 import org.apache.maven.continuum.store.ContinuumStore;
 import org.apache.maven.continuum.configuration.ConfigurationService;
 import org.apache.maven.continuum.configuration.ConfigurationLoadingException;
-import org.codehaus.plexus.logging.AbstractLogEnabled;
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Startable;
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.StartingException;
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.StoppingException;
@@ -38,36 +37,16 @@
 import javax.jms.Topic;
 import javax.jms.ObjectMessage;
 import java.net.InetAddress;
-import java.net.UnknownHostException;
 import java.io.File;
 import java.util.Map;
 import java.util.HashMap;
-import java.util.Iterator;
 
 /**
  * @version $Rev$ $Date$
  */
-public class ContinuumBuildAgent extends AbstractLogEnabled implements BuildAgent, ExceptionListener, Startable {
+public class ContinuumBuildAgent extends AbstractContinuumBuildAgent {
 
-    // ----------------------------------------------------------------------
-    // Keys for the values that can be in the context
-    // ----------------------------------------------------------------------
-
-    public static final String KEY_STORE = "store";
-
-    public static final String KEY_PROJECT_ID = "projectId";
-
-    public static final String KEY_BUILD_DEFINITION_ID = "buildDefinitionId";
-
-    public static final String KEY_TRIGGER = "trigger";
-
-    public static final String KEY_HOST_NAME = "hostName";
-
-    public static final String KEY_HOST_ADDRESS = "hostAddress";
-
-    public static final String KEY_CONTRIBUTOR = "contributor";
-
-    public static final String KEY_ADMIN_ADDRESS = "adminAddress";
+    public static final String KEY_BUILD_RESULTS = "build-results";
 
     /**
      * @plexus.requirement
@@ -97,11 +76,6 @@
     /**
      * @plexus.configuration
      */
-    private String coordinatorUrl;
-
-    /**
-     * @plexus.configuration
-     */
     private String buildTaskQueue;
 
     /**
@@ -119,8 +93,6 @@
      */
     private String buildOutputDirectory;
 
-    private boolean run;
-
     public void run() {
         try {
             getLogger().info("Continuum Build Agent starting.");
@@ -132,16 +104,6 @@
             getLogger().info("adminAddress "+adminAddress);
             getLogger().info("contributor "+contributor);
 
-            run = true;
-
-            Connection connection = null;
-            try {
-                connection = createConnection(coordinatorUrl);
-            } catch (Throwable e) {
-                getLogger().error("Could not create connection to: "+coordinatorUrl, e);
-                return;
-            }
-
             // Create a Session
             Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
 
@@ -166,54 +128,16 @@
 
                         ObjectMessage objectMessage = (ObjectMessage) message;
 
-                        Map buildTask = getMap(objectMessage, message);
-
-                        ContinuumStore store = getContinuumStore(buildTask);
-
-                        ThreadContextContinuumStore.setStore(store);
-
-                        init();
-
-                        int projectId = getProjectId(buildTask);
-
-                        int buildDefinitionId = getBuildDefinitionId(buildTask);
-
-                        int trigger = getTrigger(buildTask);
+                        Map build = getMap(objectMessage, message);
 
-                        extentionManager.preProcess(buildTask);
+                        execute(build);
 
-                        build(projectId, buildDefinitionId, trigger);
+                        HashMap results = getBuildResults(build);
 
-                        HashMap results = new HashMap();
-
-                        setStore(results, store);
-
-                        setProjectId(results, projectId);
-
-                        setBuildDefinitionId(results, buildDefinitionId);
-
-                        setTrigger(results, trigger);
-
-                        setSystemProperty(results, "os.version");
-
-                        setSystemProperty(results, "os.name");
-
-                        setSystemProperty(results, "java.version");
-
-                        setSystemProperty(results, "java.vendor");
-
-                        setHostInformation(results);
-
-                        setContributor(results);
-
-                        setAdminAddress(results);
-
-                        extentionManager.postProcess(buildTask, results);
+                        ObjectMessage resultMessage = session.createObjectMessage(results);
 
                         getLogger().info("Finished processing "+ message.getJMSMessageID());
 
-                        ObjectMessage resultMessage = session.createObjectMessage(results);
-
                         resultsProducer.send(resultMessage);
 
                         getLogger().info("Results sent to "+ buildResultsTopic );
@@ -229,127 +153,78 @@
 
             buildConsumer.close();
             session.close();
-            connection.close();
         } catch (Exception e) {
             getLogger().error("Agent failed.", e);
         }
     }
 
-    private Map getMap(ObjectMessage objectMessage, Message message) throws JMSException, BuildAgentException {
-        try {
-            return (Map) objectMessage.getObject();
-        } catch (Exception e) {
-            throw new BuildAgentException("Message.getObject failed on "+ message.getJMSMessageID(), e);
-        }
+    private HashMap getBuildResults(Map build) {
+        return (HashMap) getObject(build, KEY_BUILD_RESULTS);
     }
 
-    public void init() throws ConfigurationLoadingException {
-        configurationService.load();
-        configurationService.setWorkingDirectory(new File(workingDirectory));
-        configurationService.setBuildOutputDirectory(new File(buildOutputDirectory));
-    }
+    public void execute(Map context) throws Exception {
 
-    public void build(int projectId, int buildDefinitionId, int trigger) {
-        controller.build(projectId, buildDefinitionId, trigger);
-    }
+        ContinuumStore store = getContinuumStore(context);
 
-    private Connection createConnection(String coordinatorUrl) throws JMSException {
-        // Create a ConnectionFactory
-        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(coordinatorUrl);
+        ThreadContextContinuumStore.setStore(store);
 
-        // Create a Connection
-        Connection connection = connectionFactory.createConnection();
+        init();
 
-        connection.start();
+        int projectId = getProjectId(context);
 
-        connection.setExceptionListener(this);
+        int buildDefinitionId = getBuildDefinitionId(context);
 
-        return connection;
-    }
+        int trigger = getTrigger(context);
 
-    public void setAdminAddress(Map results) throws JMSException {
-        results.put(KEY_ADMIN_ADDRESS, adminAddress);
-    }
+        extentionManager.preProcess(context);
 
-    public void setContributor(Map results) throws JMSException {
-        results.put(KEY_CONTRIBUTOR, contributor);
-    }
+        build(projectId, buildDefinitionId, trigger);
 
-    public static void setHostInformation(Map results) throws UnknownHostException, JMSException {
-        InetAddress localHost = InetAddress.getLocalHost();
-        results.put(KEY_HOST_NAME, localHost.getHostName());
-        results.put(KEY_HOST_ADDRESS, localHost.getHostAddress());
-    }
+        HashMap results = new HashMap();
 
-    public static void setSystemProperty(Map results, String name) throws JMSException {
-        results.put(name, System.getProperty(name));
-    }
+        context.put(KEY_BUILD_RESULTS, results);
 
-    public static void setStore(Map results, ContinuumStore store) throws JMSException {
         results.put(KEY_STORE, store);
-    }
 
-    public static void setBuildDefinitionId(Map results, int buildDefinitionId) throws JMSException {
+        results.put(KEY_PROJECT_ID, new Integer(projectId));
+
         results.put(KEY_BUILD_DEFINITION_ID, new Integer(buildDefinitionId));
-    }
 
-    public static void setTrigger(Map results, int trigger) throws JMSException {
         results.put(KEY_TRIGGER, new Integer(trigger));
-    }
 
-    public static void setProjectId(Map results, int projectId) throws JMSException {
-        results.put(KEY_PROJECT_ID, new Integer(projectId));
-    }
-
-    public static int getTrigger(Map mapMessage) throws JMSException {
-        return ((Integer)mapMessage.get(KEY_TRIGGER)).intValue();
-    }
+        setSystemProperty(results, KEY_OS_VERSION);
 
-    public static int getBuildDefinitionId(Map mapMessage) throws JMSException {
-        return ((Integer)mapMessage.get(KEY_BUILD_DEFINITION_ID)).intValue();
-    }
+        setSystemProperty(results, KEY_OS_NAME);
 
-    public static int getProjectId(Map mapMessage) throws JMSException {
-        return ((Integer)mapMessage.get(KEY_PROJECT_ID)).intValue();
-    }
+        setSystemProperty(results, KEY_JAVA_VERSION);
 
-    public static ContinuumStore getContinuumStore(Map mapMessage) throws JMSException {
-        return (ContinuumStore) mapMessage.get(KEY_STORE);
-    }
+        setSystemProperty(results, KEY_JAVA_VENDOR);
 
-    private MessageConsumer createQueueConsumer(Session session, String subject) throws JMSException {
-        Queue queue = session.createQueue(subject);
-
-        return session.createConsumer(queue);
-    }
+        InetAddress localHost = InetAddress.getLocalHost();
 
-    private MessageProducer createTopicProducer(Session session, String subject) throws JMSException {
-        Topic topic = session.createTopic(subject);
+        results.put(KEY_HOST_NAME, localHost.getHostName());
 
-        MessageProducer producer = session.createProducer(topic);
+        results.put(KEY_HOST_ADDRESS, localHost.getHostAddress());
 
-        producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
+        results.put(KEY_CONTRIBUTOR, contributor);
 
-        return producer;
-    }
+        results.put(KEY_ADMIN_ADDRESS, adminAddress);
 
-    public synchronized boolean isRunning() {
-        return run;
+        extentionManager.postProcess(context, results);
     }
 
-    public synchronized void start() throws StartingException {
-        run = true;
-        Thread agentThread = new Thread(this);
-        agentThread.setDaemon(false);
-        agentThread.start();
+    public void init() throws ConfigurationLoadingException {
+        configurationService.load();
+        configurationService.setWorkingDirectory(new File(workingDirectory));
+        configurationService.setBuildOutputDirectory(new File(buildOutputDirectory));
     }
 
-    public synchronized void stop() throws StoppingException {
-        run = false;
+    public void build(int projectId, int buildDefinitionId, int trigger) {
+        controller.build(projectId, buildDefinitionId, trigger);
     }
 
-    public synchronized void onException(JMSException ex) {
-        System.out.println("JMS Exception occured.  Shutting down client.");
+    public static void setSystemProperty(Map results, String name) {
+        results.put(name, System.getProperty(name));
     }
 
 }

Modified: geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/DefaultBuildAgentExtentionManager.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/DefaultBuildAgentExtentionManager.java?rev=344993&r1=344992&r2=344993&view=diff
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/DefaultBuildAgentExtentionManager.java (original)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/DefaultBuildAgentExtentionManager.java Wed Nov 16 04:34:52 2005
@@ -32,12 +32,12 @@
      */
     private Map extentions;
 
-    public BuildAgentExtention getBuildAgentExtention(String id) throws NoSuchBuildAgentExtentionException {
+    public BuildAgentExtention getBuildAgentExtention(String id) throws NoSuchExtentionException {
 
         BuildAgentExtention agentExtention = (BuildAgentExtention) extentions.get(id);
 
         if (agentExtention == null){
-            throw new NoSuchBuildAgentExtentionException(id);
+            throw new NoSuchExtentionException(id);
         }
         return agentExtention;
     }

Added: geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/DefaultBuildResultsExtentionManager.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/DefaultBuildResultsExtentionManager.java?rev=344993&view=auto
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/DefaultBuildResultsExtentionManager.java (added)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/DefaultBuildResultsExtentionManager.java Wed Nov 16 04:34:52 2005
@@ -0,0 +1,66 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.gbuild.agent;
+
+import org.codehaus.plexus.logging.AbstractLogEnabled;
+
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Iterator;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class DefaultBuildResultsExtentionManager extends AbstractLogEnabled implements BuildResultsExtentionManager {
+
+    /**
+     * @plexus.requirement
+     */
+    private Map extentions;
+
+    public BuildResultsExtention getBuildResultsExtention(String id) throws NoSuchExtentionException {
+        BuildResultsExtention agentExtention = (BuildResultsExtention) extentions.get(id);
+
+        if (agentExtention == null){
+            throw new NoSuchExtentionException(id);
+        }
+        return agentExtention;
+    }
+
+    public void execute(Map results) throws Exception {
+        for (Iterator iterator = extentions.entrySet().iterator(); iterator.hasNext();) {
+
+            Map.Entry entry = (Map.Entry) iterator.next();
+
+            String name = (String) entry.getKey();
+
+            BuildResultsExtention extention = (BuildResultsExtention) entry.getValue();
+
+            getLogger().info("Executing extention "+name);
+
+            try {
+
+                extention.execute(results);
+
+            } catch (Exception e) {
+
+                getLogger().warn("Extention Failed: "+name, e);
+
+            }
+        }
+    }
+}

Modified: geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/DirectoryMonitor.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/DirectoryMonitor.java?rev=344993&r1=344992&r2=344993&view=diff
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/DirectoryMonitor.java (original)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/DirectoryMonitor.java Wed Nov 16 04:34:52 2005
@@ -53,9 +53,9 @@
     private Map files = new HashMap();
 
     public DirectoryMonitor(File directory, Listener listener, int pollIntervalMillis) {
-        assert listener != null: "No point in scanning without a listener.";
+        assert listener == null: "No point in scanning without a listener.";
         assert directory.isDirectory(): "File specified is not a directory. " + directory.getAbsolutePath();
-        assert !directory.canRead(): "Directory specified cannot be read. " + directory.getAbsolutePath();
+        assert directory.canRead(): "Directory specified cannot be read. " + directory.getAbsolutePath();
         assert pollIntervalMillis > 0: "Poll Interval must be above zero.";
 
         this.directory = directory;

Modified: geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/DistrubutedBuildController.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/DistrubutedBuildController.java?rev=344993&r1=344992&r2=344993&view=diff
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/DistrubutedBuildController.java (original)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/DistrubutedBuildController.java Wed Nov 16 04:34:52 2005
@@ -25,17 +25,9 @@
 import org.apache.maven.continuum.utils.ContinuumUtils;
 import org.apache.maven.continuum.project.ContinuumProjectState;
 
-import org.apache.maven.continuum.core.action.AbstractContinuumAction;
-import org.apache.maven.continuum.model.project.BuildResult;
-import org.apache.maven.continuum.model.project.Project;
 import org.apache.maven.continuum.model.project.BuildDefinition;
-import org.apache.maven.continuum.model.scm.ScmResult;
 import org.apache.maven.continuum.notification.ContinuumNotificationDispatcher;
-import org.apache.maven.continuum.project.ContinuumProjectState;
-import org.apache.maven.continuum.scm.ContinuumScmException;
 import org.apache.maven.continuum.store.ContinuumStore;
-import org.apache.maven.continuum.store.ContinuumStoreException;
-import org.apache.maven.continuum.utils.ContinuumUtils;
 import org.apache.maven.continuum.utils.WorkingDirectoryService;
 import org.codehaus.plexus.action.ActionManager;
 import org.codehaus.plexus.logging.AbstractLogEnabled;
@@ -97,9 +89,9 @@
 
             Map actionContext = new HashMap();
 
-            actionContext.put( AbstractDistributedContinuumAction.KEY_PROJECT, project );
+            actionContext.put( AbstractContinuumAgentAction.KEY_PROJECT, project );
 
-            actionContext.put( AbstractDistributedContinuumAction.KEY_BUILD_DEFINITION, buildDefinition );
+            actionContext.put( AbstractContinuumAgentAction.KEY_BUILD_DEFINITION, buildDefinition );
 
             actionContext.put( AbstractContinuumAction.KEY_TRIGGER, new Integer( trigger ) );
 

Modified: geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/FileIncludeExtention.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/FileIncludeExtention.java?rev=344993&r1=344992&r2=344993&view=diff
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/FileIncludeExtention.java (original)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/FileIncludeExtention.java Wed Nov 16 04:34:52 2005
@@ -39,7 +39,7 @@
     /**
      * @plexus.configuration
      */
-    private String prefix;
+    private String pattern;
 
 
     public void preProcess(Map build) {
@@ -52,7 +52,7 @@
 
             String key = (String) keys.next();
 
-            if (key.startsWith(prefix)){
+            if (key.matches(pattern)){
 
                 include(key, build, results);
 

Modified: geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/HeaderIncludeExtention.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/HeaderIncludeExtention.java?rev=344993&r1=344992&r2=344993&view=diff
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/HeaderIncludeExtention.java (original)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/HeaderIncludeExtention.java Wed Nov 16 04:34:52 2005
@@ -29,7 +29,7 @@
     /**
      * @plexus.configuration
      */
-    private String prefix;
+    private String pattern;
 
 
     public void preProcess(Map build) {
@@ -42,7 +42,7 @@
 
             String key = (String) keys.next();
 
-            if (key.startsWith(prefix)){
+            if (key.matches(pattern)){
 
                 include(key, build, results);
 

Copied: geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/NoSuchExtentionException.java (from r344296, geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/NoSuchBuildAgentExtentionException.java)
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/NoSuchExtentionException.java?p2=geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/NoSuchExtentionException.java&p1=geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/NoSuchBuildAgentExtentionException.java&r1=344296&r2=344993&rev=344993&view=diff
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/NoSuchBuildAgentExtentionException.java (original)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/NoSuchExtentionException.java Wed Nov 16 04:34:52 2005
@@ -19,9 +19,9 @@
 /**
  * @version $Rev$ $Date$
  */
-public class NoSuchBuildAgentExtentionException extends Exception {
+public class NoSuchExtentionException extends Exception {
 
-    public NoSuchBuildAgentExtentionException(String id) {
+    public NoSuchExtentionException(String id) {
         super(id);
     }
 

Modified: geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/PropertiesBuildTaskProducer.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/PropertiesBuildTaskProducer.java?rev=344993&r1=344992&r2=344993&view=diff
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/PropertiesBuildTaskProducer.java (original)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/PropertiesBuildTaskProducer.java Wed Nov 16 04:34:52 2005
@@ -21,7 +21,6 @@
 import org.apache.maven.continuum.model.project.BuildDefinition;
 import org.apache.maven.continuum.model.project.Project;
 import org.apache.maven.continuum.project.ContinuumProjectState;
-import org.codehaus.plexus.logging.AbstractLogEnabled;
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Startable;
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.StartingException;
 import org.codehaus.plexus.personality.plexus.lifecycle.phase.StoppingException;
@@ -42,12 +41,7 @@
 /**
  * @version $Rev$ $Date$
  */
-public class PropertiesBuildTaskProducer extends AbstractLogEnabled implements Startable, DirectoryMonitor.Listener {
-
-    /**
-     * @plexus.configuration
-     */
-    private String coordinatorUrl;
+public class PropertiesBuildTaskProducer extends AbstractContinuumBuildAgent implements DirectoryMonitor.Listener {
 
     /**
      * @plexus.configuration
@@ -84,13 +78,16 @@
     public synchronized void start() throws StartingException {
         File dir = new File(watchDirectory);
         scanner = new DirectoryMonitor(dir, this, pollInterval);
-        Thread thread = new Thread(scanner);
-        thread.setDaemon(false);
-        thread.start();
+        super.start();
     }
 
     public synchronized void stop() throws StoppingException {
         scanner.stop();
+        super.stop();
+    }
+
+    public void run() {
+        scanner.run();
     }
 
     public boolean fileAdded(File file) {
@@ -103,7 +100,8 @@
             getLogger().error("Unable to load properties file: "+file.getAbsolutePath(), e);
         }
         try {
-            queueBuildTasks(properties);
+            // TODO: Improve this so you can have ${my-property} parts to property values
+            execute(properties);
         } catch (Exception e) {
             getLogger().error("Unable to process file: "+file.getAbsolutePath(), e);
         }
@@ -118,12 +116,8 @@
     }
 
 
-    // TODO: Improve this so you can have ${my-property} parts to property values
-    private void queueBuildTasks(Properties def) throws Exception {
+    public void execute(Map def) throws Exception {
 
-        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(coordinatorUrl);
-        Connection connection = connectionFactory.createConnection();
-        connection.start();
         Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
 
         Queue buildQueue = session.createQueue(buildTaskQueue);
@@ -183,10 +177,13 @@
 
             map.put(key, value);
 
-            ContinuumBuildAgent.setStore(map, store);
-            ContinuumBuildAgent.setProjectId(map, project.getId());
-            ContinuumBuildAgent.setBuildDefinitionId(map, bd.getId());
-            ContinuumBuildAgent.setTrigger(map, ContinuumProjectState.TRIGGER_FORCED);
+            map.put(KEY_STORE, store);
+
+            map.put(KEY_PROJECT_ID, new Integer(project.getId()));
+
+            map.put(KEY_BUILD_DEFINITION_ID, new Integer(bd.getId()));
+
+            map.put(KEY_TRIGGER, new Integer(ContinuumProjectState.TRIGGER_FORCED));
 
             addProperties("project.", def, map);
             addProperties(headerPrefix, def, map);
@@ -196,10 +193,9 @@
         }
 
         session.close();
-        connection.close();
     }
 
-    private void addProperties(String prefix, Properties def, HashMap map) {
+    private void addProperties(String prefix, Map def, HashMap map) {
         for (Iterator iterator = def.entrySet().iterator(); iterator.hasNext();) {
 
             Map.Entry entry = (Map.Entry) iterator.next();
@@ -211,45 +207,4 @@
             }
         }
     }
-
-    protected static String getString(Map context, String key) {
-        return (String) getObject(context, key);
-    }
-
-    protected static String getString(Map context, String key, String defaultValue) {
-        return (String) getObject(context, key, defaultValue);
-    }
-
-    public static boolean getBoolean(Map context, String key) {
-        return ((Boolean) getObject(context, key)).booleanValue();
-    }
-
-    protected static int getInteger(Map context, String key) {
-        return ((Integer) getObject(context, key, null)).intValue();
-    }
-
-    protected static Object getObject(Map context, String key) {
-        if (!context.containsKey(key)) {
-            throw new RuntimeException("Missing key '" + key + "'.");
-        }
-
-        Object value = context.get(key);
-
-        if (value == null) {
-            throw new RuntimeException("Missing value for key '" + key + "'.");
-        }
-
-        return value;
-    }
-
-    protected static Object getObject(Map context, String key, Object defaultValue) {
-        Object value = context.get(key);
-
-        if (value == null) {
-            return defaultValue;
-        }
-
-        return value;
-    }
-
 }

Added: geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/WriteIncludeFileExtention.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/WriteIncludeFileExtention.java?rev=344993&view=auto
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/WriteIncludeFileExtention.java (added)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/java/org/apache/geronimo/gbuild/agent/WriteIncludeFileExtention.java Wed Nov 16 04:34:52 2005
@@ -0,0 +1,107 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.geronimo.gbuild.agent;
+
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.Startable;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.StartingException;
+import org.codehaus.plexus.personality.plexus.lifecycle.phase.StoppingException;
+
+import java.util.Map;
+import java.util.Iterator;
+import java.util.Date;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class WriteIncludeFileExtention extends AbstractContinuumAgentAction implements BuildResultsExtention, Startable {
+
+    /**
+     * @plexus.configuration
+     */
+    private String includePattern;
+
+    /**
+     * @plexus.configuration
+     */
+    private String fileExtention;
+
+    /**
+     * @plexus.configuration
+     */
+    private String resultsDirectory;
+
+    /**
+     * @plexus.configuration
+     */
+    private String useHeader;
+
+    /**
+     * @plexus.configuration
+     */
+    private String dateFormat;
+
+
+    private File directory;
+    private SimpleDateFormat dateFormatter;
+
+    public void start() throws StartingException {
+        directory = new File(resultsDirectory);
+        assert directory.exists(): "File specified does not exist. " + directory.getAbsolutePath();
+        assert directory.isDirectory(): "File specified is not a directory. " + directory.getAbsolutePath();
+        assert directory.canWrite(): "Directory specified is not writable. " + directory.getAbsolutePath();
+
+        dateFormatter = new SimpleDateFormat(dateFormat);
+    }
+
+    public void stop() throws StoppingException {
+    }
+
+    public void execute(Map context) throws Exception {
+
+        String header = (String) context.get(useHeader);
+
+        for (Iterator iterator = context.entrySet().iterator(); iterator.hasNext();) {
+            Map.Entry entry = (Map.Entry) iterator.next();
+            String key = (String) entry.getKey();
+            Object value = entry.getValue();
+
+            if (key.startsWith(includePattern)){
+
+                String fileName = header;
+                fileName += key.replaceFirst(includePattern, "");
+                fileName += "-"+ dateFormatter.format(new Date());
+                fileName += fileExtention;
+
+                write(fileName, (String)value);
+            }
+        }
+    }
+
+    private void write(String fileName, String content) {
+        try {
+            FileOutputStream file = new FileOutputStream(fileName);
+            file.write(content.getBytes());
+            file.close();
+        } catch (IOException e) {
+            getLogger().error("Could not write to file "+fileName, e);
+        }
+    }
+}

Modified: geronimo/gbuild/trunk/gbuild-agent/src/main/resources/META-INF/plexus/components.xml
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/main/resources/META-INF/plexus/components.xml?rev=344993&r1=344992&r2=344993&view=diff
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/main/resources/META-INF/plexus/components.xml (original)
+++ geronimo/gbuild/trunk/gbuild-agent/src/main/resources/META-INF/plexus/components.xml Wed Nov 16 04:34:52 2005
@@ -13,6 +13,7 @@
     -->
     <component>
       <role>org.apache.geronimo.gbuild.agent.BuildAgent</role>
+      <role-hint>build-executor</role-hint>
       <implementation>org.apache.geronimo.gbuild.agent.ContinuumBuildAgent</implementation>
       <requirements>
         <requirement>
@@ -31,8 +32,8 @@
         <coordinator-url>tcp://localhost:61616</coordinator-url>
         <build-task-queue>BUILD.TASKS</build-task-queue>
         <build-results-topic>BUILD.RESULTS</build-results-topic>
-        <working-directory>target/agent/work</working-directory>
-        <build-output-directory>target/agent/output</build-output-directory>
+        <working-directory>agent/work</working-directory>
+        <build-output-directory>agent/output</build-output-directory>
       </configuration>
     </component>
 
@@ -79,6 +80,81 @@
       </requirements>
     </component>
 
+    <component>
+      <role>org.apache.geronimo.gbuild.agent.BuildAgentExtention</role>
+      <role-hint>file-include</role-hint>
+      <implementation>org.apache.geronimo.gbuild.agent.FileIncludeExtention</implementation>
+      <requirements>
+        <requirement>
+          <role>org.apache.maven.continuum.configuration.ConfigurationService</role>
+        </requirement>
+      </requirements>
+      <configuration>
+        <pattern>^include\.</pattern>
+      </configuration>
+    </component>
+
+    <component>
+      <role>org.apache.geronimo.gbuild.agent.BuildAgentExtention</role>
+      <role-hint>general-headers</role-hint>
+      <implementation>org.apache.geronimo.gbuild.agent.HeaderIncludeExtention</implementation>
+      <configuration>
+        <pattern>^(project|build|header)\.</pattern>
+      </configuration>
+    </component>
+
+
+    <!--
+    | Build Producer
+    -->
+    <component>
+      <role>org.apache.geronimo.gbuild.agent.BuildAgent</role>
+      <role-hint>build-producer</role-hint>
+      <implementation>org.apache.geronimo.gbuild.agent.PropertiesBuildTaskProducer</implementation>
+      <configuration>
+        <coordinator-url>tcp://localhost:61616</coordinator-url>
+        <build-task-queue>BUILD.TASKS</build-task-queue>
+        <include-prefix>include.</include-prefix>
+        <header-prefix>header.</header-prefix>
+        <watch-directory>tasks</watch-directory>
+        <poll-interval>10000</poll-interval>
+      </configuration>
+    </component>
 
+    <!--
+    | Build Results
+    -->
+    <component>
+      <role>org.apache.geronimo.gbuild.agent.BuildAgent</role>
+      <role-hint>build-results</role-hint>
+      <implementation>org.apache.geronimo.gbuild.agent.BuildResultsContinuumAgent</implementation>
+      <requirements>
+        <requirement>
+          <role>org.apache.geronimo.gbuild.agent.BuildResultsExtentionManager</role>
+        </requirement>
+      </requirements>
+      <configuration>
+        <coordinator-url>tcp://localhost:61616</coordinator-url>
+        <build-results-topic>BUILD.RESULTS</build-results-topic>
+      </configuration>
+    </component>
+
+    <component>
+      <role>org.apache.geronimo.gbuild.agent.BuildResultsExtention</role>
+      <role-hint>write-include-file</role-hint>
+      <implementation>org.apache.geronimo.gbuild.agent.WriteIncludeFileExtention</implementation>
+      <requirements>
+        <requirement>
+          <role>org.apache.maven.continuum.configuration.ConfigurationService</role>
+        </requirement>
+      </requirements>
+      <configuration>
+        <include-pattern>^include\.</include-pattern>
+        <file-extention>.properties</file-extention>
+        <results-directory>results</results-directory>
+        <use-header>project.name</use-header>
+        <date-format></date-format>
+      </configuration>
+    </component>
   </components>
 </component-set>

Modified: geronimo/gbuild/trunk/gbuild-agent/src/test/java/org/apache/geronimo/gbuild/agent/ContinuumBuildAgentTest.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/test/java/org/apache/geronimo/gbuild/agent/ContinuumBuildAgentTest.java?rev=344993&r1=344992&r2=344993&view=diff
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/test/java/org/apache/geronimo/gbuild/agent/ContinuumBuildAgentTest.java (original)
+++ geronimo/gbuild/trunk/gbuild-agent/src/test/java/org/apache/geronimo/gbuild/agent/ContinuumBuildAgentTest.java Wed Nov 16 04:34:52 2005
@@ -18,7 +18,6 @@
 
 import javax.jms.Connection;
 import javax.jms.Session;
-import javax.jms.Destination;
 import javax.jms.MessageProducer;
 import javax.jms.DeliveryMode;
 import javax.jms.Topic;
@@ -51,7 +50,7 @@
 
     }
 
-    public void testBuild() throws Exception {
+    public void _testBuild() throws Exception {
 
         Project project = new Project();
         project.setId(10);
@@ -151,10 +150,10 @@
 
             HashMap map = new HashMap();
 
-            ContinuumBuildAgent.setStore(map, store);
-            ContinuumBuildAgent.setProjectId(map, project.getId());
-            ContinuumBuildAgent.setBuildDefinitionId(map, bd.getId());
-            ContinuumBuildAgent.setTrigger(map, 0);
+            map.put(AbstractContinuumAgentAction.KEY_STORE, store);
+            map.put(AbstractContinuumAgentAction.KEY_PROJECT_ID, new Integer(project.getId()));
+            map.put(AbstractContinuumAgentAction.KEY_BUILD_DEFINITION_ID, new Integer(bd.getId()));
+            map.put(AbstractContinuumAgentAction.KEY_TRIGGER, new Integer(0));
 
             producer.send(session.createObjectMessage(map));
         }

Modified: geronimo/gbuild/trunk/gbuild-agent/src/test/java/org/apache/geronimo/gbuild/agent/MainTest.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/gbuild-agent/src/test/java/org/apache/geronimo/gbuild/agent/MainTest.java?rev=344993&r1=344992&r2=344993&view=diff
==============================================================================
--- geronimo/gbuild/trunk/gbuild-agent/src/test/java/org/apache/geronimo/gbuild/agent/MainTest.java (original)
+++ geronimo/gbuild/trunk/gbuild-agent/src/test/java/org/apache/geronimo/gbuild/agent/MainTest.java Wed Nov 16 04:34:52 2005
@@ -8,6 +8,7 @@
 import org.apache.maven.continuum.model.project.BuildDefinition;
 import org.apache.maven.continuum.model.project.Project;
 import org.apache.maven.continuum.execution.shell.ShellBuildExecutor;
+import org.apache.maven.continuum.project.ContinuumProjectState;
 import org.codehaus.plexus.util.FileUtils;
 import org.codehaus.plexus.util.cli.CommandLineException;
 
@@ -17,6 +18,7 @@
 import javax.jms.MessageProducer;
 import javax.jms.Session;
 import javax.jms.Message;
+import javax.jms.Queue;
 import java.io.File;
 import java.io.IOException;
 import java.util.HashMap;
@@ -191,6 +193,53 @@
 
     }
 
+    public static class BuildTaskProducer {
+        public static void main(String[] args) throws Exception {
+            ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:41616");
+            Connection connection = connectionFactory.createConnection();
+            connection.start();
+            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+            Queue buildQueue = session.createQueue("BUILD.TASKS");
+            MessageProducer producer = session.createProducer(buildQueue);
+            producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
+
+            MapContinuumStore store = new MapContinuumStore();
+
+            Project project = new Project();
+            project.setId(14);
+            project.setScmUrl("scm:svn:https://svn.apache.org/repos/asf/geronimo/trunk");
+//            project.setScmUrl("scm:cvs:pserver:anonymous@cvs.openejb.codehaus.org:/home/projects/openejb/scm:openejb1");
+            project.setName("OpenEJB");
+            project.setVersion("1.0-SNAPSHOT");
+            project.setExecutorId(ShellBuildExecutor.ID);
+            project.setState(ContinuumProjectState.OK);
+            store.updateProject(project);
+
+            String[] goals = new String[]{"clean", "default"};
+
+            for (int i = 0; i < goals.length; i++) {
+                String goal = goals[i];
+                BuildDefinition bd = new BuildDefinition();
+                bd.setId(i);
+                bd.setBuildFile("/usr/local/maven/bin/maven");
+                bd.setArguments(goal);
+                project.addBuildDefinition(bd);
+                store.storeBuildDefinition(bd);
+
+                HashMap map = new HashMap();
+
+                map.put(AbstractContinuumAgentAction.KEY_STORE, store);
+                map.put(AbstractContinuumAgentAction.KEY_PROJECT_ID, new Integer(project.getId()));
+                map.put(AbstractContinuumAgentAction.KEY_BUILD_DEFINITION_ID, new Integer(bd.getId()));
+                map.put(AbstractContinuumAgentAction.KEY_TRIGGER, new Integer(ContinuumProjectState.TRIGGER_FORCED));
+
+                producer.send(session.createObjectMessage(map));
+            }
+
+            connection.close();
+            session.close();
+        }
+    }
 
 
     public static void deleteAndCreateDirectory(File directory)