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/11 10:40:17 UTC
svn commit: r332501 - in
/geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent:
ContinuumBuildAgent.java ContinuumStoreContext.java
DistrubutedBuildController.java MapContinuumStore.java
MockContinuumNotificationDispatcher.java
Author: dblevins
Date: Fri Nov 11 01:40:13 2005
New Revision: 332501
URL: http://svn.apache.org/viewcvs?rev=332501&view=rev
Log:
Basic continuum agent code
Added:
geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/ContinuumStoreContext.java
geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/MapContinuumStore.java
- copied, changed from r332478, geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/DistributedContinuumStore.java
geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/MockContinuumNotificationDispatcher.java
Modified:
geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/ContinuumBuildAgent.java
geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/DistrubutedBuildController.java
Modified: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/ContinuumBuildAgent.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/ContinuumBuildAgent.java?rev=332501&r1=332500&r2=332501&view=diff
==============================================================================
--- geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/ContinuumBuildAgent.java (original)
+++ geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/ContinuumBuildAgent.java Fri Nov 11 01:40:13 2005
@@ -17,38 +17,79 @@
package org.apache.geronimo.gbuild.agent;
import org.activemq.ActiveMQConnectionFactory;
-import org.apache.maven.continuum.utils.shell.ShellCommandHelper;
+import org.apache.maven.continuum.store.ContinuumStore;
+import org.apache.maven.continuum.buildcontroller.BuildController;
import javax.jms.Connection;
-import javax.jms.Destination;
import javax.jms.ExceptionListener;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
-import javax.jms.ObjectMessage;
import javax.jms.Session;
-import java.util.HashMap;
+import javax.jms.MapMessage;
+import javax.jms.Queue;
+import javax.jms.MessageProducer;
+import javax.jms.DeliveryMode;
+import javax.jms.TextMessage;
+import javax.jms.Topic;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
/**
* @version $Rev$ $Date$
*/
public class ContinuumBuildAgent implements BuildAgent, ExceptionListener {
+ // ----------------------------------------------------------------------
+ // 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";
+
/**
* @plexus.requirement
*/
- private ShellCommandHelper shellCommandHelper;
+ private BuildController controller;
/**
* @plexus.configuration
*/
- private String subject;
+ private String contributor;
+
+ /**
+ * @plexus.configuration
+ */
+ private String adminAddress;
/**
* @plexus.configuration
*/
private String url;
+ /**
+ * @plexus.configuration
+ */
+ private String buildQueueSubject;
+
+ /**
+ * @plexus.configuration
+ */
+ private String buildResultsSubject;
+
private boolean run;
public void run() {
@@ -60,6 +101,7 @@
// Create a Connection
Connection connection = connectionFactory.createConnection();
+
connection.start();
connection.setExceptionListener(this);
@@ -67,26 +109,62 @@
// Create a Session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
- // Create the destination (Topic or Queue)
- Destination destination = session.createQueue(subject);
+ MessageConsumer buildConsumer = createQueueConsumer(session, buildQueueSubject);
- // Create a MessageConsumer from the Session to the Topic or Queue
- MessageConsumer consumer = session.createConsumer(destination);
+ MessageProducer resultsProducer = createTopicProducer(session, buildResultsSubject);
while (run) {
// Wait for a message
- Message message = consumer.receive();
+ Message message = buildConsumer.receive();
+
+ if (message instanceof MapMessage) {
+
+ MapMessage mapMessage = (MapMessage) message;
+
+ ContinuumStore store = getContinuumStore(mapMessage);
+
+ ContinuumStoreContext.setStore(store);
+
+ int projectId = getProjectId(mapMessage);
+
+ int buildDefinitionId = getBuildDefinitionId(mapMessage);
+
+ int trigger = getTrigger(mapMessage);
+
+ controller.build(projectId, buildDefinitionId, trigger);
+
+ MapMessage results = session.createMapMessage();
+
+ setStore(results, store);
+
+ setProjectId(results, projectId);
+
+ setBuildDefinitionId(results, buildDefinitionId);
+
+ setTrigger(results, trigger);
+
+ setSystemProperty(results, "os.version");
+
+ setSystemProperty(results, "os.name");
+
+ setSystemProperty(results, "java.version");
- if (message instanceof ObjectMessage) {
- ObjectMessage objectMessage = (ObjectMessage) message;
- HashMap map = (HashMap) objectMessage.getObject();
+ setSystemProperty(results, "java.vendor");
+
+ setHostInformation(results);
+
+ setContributor(results);
+
+ setAdminAddress(results);
+
+ resultsProducer.send(results);
} else {
System.out.println("Incorect message type: " + message.getClass().getName());
}
}
- consumer.close();
+ buildConsumer.close();
session.close();
connection.close();
} catch (Exception e) {
@@ -95,6 +173,74 @@
}
}
+ private void setAdminAddress(MapMessage results) throws JMSException {
+ results.setString(KEY_ADMIN_ADDRESS, adminAddress);
+ }
+
+ private void setContributor(MapMessage results) throws JMSException {
+ results.setString(KEY_CONTRIBUTOR, contributor);
+ }
+
+ private void setHostInformation(MapMessage results) throws UnknownHostException, JMSException {
+ InetAddress localHost = InetAddress.getLocalHost();
+ results.setString(KEY_HOST_NAME, localHost.getHostName());
+ results.setString(KEY_HOST_ADDRESS, localHost.getHostAddress());
+ }
+
+ private void setSystemProperty(MapMessage results, String name) throws JMSException {
+ results.setString(name, System.getProperty(name));
+ }
+
+ private void setStore(MapMessage results, ContinuumStore store) throws JMSException {
+ results.setObject(KEY_STORE, store);
+ }
+
+ private void setBuildDefinitionId(MapMessage results, int buildDefinitionId) throws JMSException {
+ results.setInt(KEY_BUILD_DEFINITION_ID, buildDefinitionId);
+ }
+
+ private void setTrigger(MapMessage results, int trigger) throws JMSException {
+ results.setInt(KEY_TRIGGER, trigger);
+ }
+
+ private void setProjectId(MapMessage results, int projectId) throws JMSException {
+ results.setInt(KEY_PROJECT_ID, projectId);
+ }
+
+ private int getTrigger(MapMessage mapMessage) throws JMSException {
+ return mapMessage.getIntProperty(KEY_TRIGGER);
+ }
+
+ private int getBuildDefinitionId(MapMessage mapMessage) throws JMSException {
+ return mapMessage.getIntProperty(KEY_BUILD_DEFINITION_ID);
+ }
+
+ private int getProjectId(MapMessage mapMessage) throws JMSException {
+ return mapMessage.getIntProperty(KEY_PROJECT_ID);
+ }
+
+ private ContinuumStore getContinuumStore(MapMessage mapMessage) throws JMSException {
+ return (ContinuumStore) mapMessage.getObject(KEY_STORE);
+ }
+
+ private MessageConsumer createQueueConsumer(Session session, String subject) throws JMSException {
+ Queue queue = session.createQueue(subject);
+
+ MessageConsumer consumer = session.createConsumer(queue);
+
+ return consumer;
+ }
+
+ private 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;
+ }
+
public synchronized boolean isRunning() {
return run;
}
@@ -102,7 +248,7 @@
public synchronized void stop() {
run = false;
}
-
+
public synchronized void onException(JMSException ex) {
System.out.println("JMS Exception occured. Shutting down client.");
}
Added: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/ContinuumStoreContext.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/ContinuumStoreContext.java?rev=332501&view=auto
==============================================================================
--- geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/ContinuumStoreContext.java (added)
+++ geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/ContinuumStoreContext.java Fri Nov 11 01:40:13 2005
@@ -0,0 +1,300 @@
+/**
+ *
+ * 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.apache.maven.continuum.store.ContinuumStore;
+import org.apache.maven.continuum.store.ContinuumStoreException;
+import org.apache.maven.continuum.store.ContinuumObjectNotFoundException;
+import org.apache.maven.continuum.model.project.Project;
+import org.apache.maven.continuum.model.project.ProjectNotifier;
+import org.apache.maven.continuum.model.project.BuildDefinition;
+import org.apache.maven.continuum.model.project.ProjectGroup;
+import org.apache.maven.continuum.model.project.Schedule;
+import org.apache.maven.continuum.model.project.Profile;
+import org.apache.maven.continuum.model.project.BuildResult;
+import org.apache.maven.continuum.model.system.Installation;
+import org.apache.maven.continuum.model.system.SystemConfiguration;
+import org.apache.maven.continuum.model.system.ContinuumUser;
+import org.apache.maven.continuum.model.system.Permission;
+import org.apache.maven.continuum.model.system.UserGroup;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class ContinuumStoreContext implements ContinuumStore {
+
+ private static ThreadLocal stores = new ThreadLocal();
+
+ public static ContinuumStore getStore() {
+ return (ContinuumStore) stores.get();
+ }
+
+ public static void setStore(ContinuumStore store) {
+ stores.set(store);
+ }
+
+ public Project getProjectByName(String name) throws ContinuumStoreException {
+ return getStore().getProjectByName(name);
+ }
+
+ public void removeNotifier(ProjectNotifier notifier) throws ContinuumStoreException {
+ getStore().removeNotifier(notifier);
+ }
+
+ public ProjectNotifier storeNotifier(ProjectNotifier notifier) throws ContinuumStoreException {
+ return getStore().storeNotifier(notifier);
+ }
+
+ public BuildDefinition getBuildDefinition(int buildDefinitionId) throws ContinuumStoreException, ContinuumObjectNotFoundException {
+ return getStore().getBuildDefinition(buildDefinitionId);
+ }
+
+ public void removeBuildDefinition(BuildDefinition buildDefinition) throws ContinuumStoreException {
+ getStore().removeBuildDefinition(buildDefinition);
+ }
+
+ public BuildDefinition storeBuildDefinition(BuildDefinition buildDefinition) throws ContinuumStoreException {
+ return getStore().storeBuildDefinition(buildDefinition);
+ }
+
+ public ProjectGroup addProjectGroup(ProjectGroup group) {
+ return getStore().addProjectGroup(group);
+ }
+
+ public ProjectGroup getProjectGroup(int projectGroupId) throws ContinuumStoreException, ContinuumObjectNotFoundException {
+ return getStore().getProjectGroup(projectGroupId);
+ }
+
+ public void updateProjectGroup(ProjectGroup group) throws ContinuumStoreException {
+ getStore().updateProjectGroup(group);
+ }
+
+ public Collection getAllProjectGroupsWithProjects() {
+ return getStore().getAllProjectGroupsWithProjects();
+ }
+
+ public List getAllProjectsByName() {
+ return getStore().getAllProjectsByName();
+ }
+
+ public List getAllSchedulesByName() {
+ return getStore().getAllSchedulesByName();
+ }
+
+ public Schedule addSchedule(Schedule schedule) {
+ return getStore().addSchedule(schedule);
+ }
+
+ public Schedule getScheduleByName(String name) throws ContinuumStoreException {
+ return getStore().getScheduleByName(name);
+ }
+
+ public Schedule storeSchedule(Schedule schedule) throws ContinuumStoreException {
+ return getStore().storeSchedule(schedule);
+ }
+
+ public List getAllProfilesByName() {
+ return getStore().getAllProfilesByName();
+ }
+
+ public Profile addProfile(Profile profile) {
+ return getStore().addProfile(profile);
+ }
+
+ public Installation addInstallation(Installation installation) {
+ return getStore().addInstallation(installation);
+ }
+
+ public List getAllInstallations() {
+ return getStore().getAllInstallations();
+ }
+
+ public List getAllBuildsForAProjectByDate(int projectId) {
+ return getStore().getAllBuildsForAProjectByDate(projectId);
+ }
+
+ public Project getProject(int projectId) throws ContinuumStoreException, ContinuumObjectNotFoundException {
+ return getStore().getProject(projectId);
+ }
+
+ public void updateProject(Project project) throws ContinuumStoreException {
+ getStore().updateProject(project);
+ }
+
+ public void updateProfile(Profile profile) throws ContinuumStoreException {
+ getStore().updateProfile(profile);
+ }
+
+ public void updateSchedule(Schedule schedule) throws ContinuumStoreException {
+ getStore().updateSchedule(schedule);
+ }
+
+ public Project getProjectWithBuilds(int projectId) throws ContinuumStoreException, ContinuumObjectNotFoundException {
+ return getStore().getProjectWithBuilds(projectId);
+ }
+
+ public void removeProfile(Profile profile) {
+ getStore().removeProfile(profile);
+ }
+
+ public void removeSchedule(Schedule schedule) {
+ getStore().removeSchedule(schedule);
+ }
+
+ public Project getProjectWithCheckoutResult(int projectId) throws ContinuumObjectNotFoundException, ContinuumStoreException {
+ return getStore().getProjectWithCheckoutResult(projectId);
+ }
+
+ public BuildResult getBuildResult(int buildId) throws ContinuumObjectNotFoundException, ContinuumStoreException {
+ return getStore().getBuildResult(buildId);
+ }
+
+ public void removeProject(Project project) {
+ getStore().removeProject(project);
+ }
+
+ public void removeProjectGroup(ProjectGroup projectGroup) {
+ getStore().removeProjectGroup(projectGroup);
+ }
+
+ public ProjectGroup getProjectGroupWithBuildDetails(int projectGroupId) throws ContinuumObjectNotFoundException, ContinuumStoreException {
+ return getStore().getProjectGroupWithBuildDetails(projectGroupId);
+ }
+
+ public List getAllProjectGroupsWithBuildDetails() {
+ return getStore().getAllProjectGroupsWithBuildDetails();
+ }
+
+ public List getAllProjectsWithAllDetails() {
+ return getStore().getAllProjectsWithAllDetails();
+ }
+
+ public Project getProjectWithAllDetails(int projectId) throws ContinuumObjectNotFoundException, ContinuumStoreException {
+ return getStore().getProjectWithAllDetails(projectId);
+ }
+
+ public Schedule getSchedule(int scheduleId) throws ContinuumObjectNotFoundException, ContinuumStoreException {
+ return getStore().getSchedule(scheduleId);
+ }
+
+ public Profile getProfile(int profileId) throws ContinuumObjectNotFoundException, ContinuumStoreException {
+ return getStore().getProfile(profileId);
+ }
+
+ public ProjectGroup getProjectGroupByGroupId(String groupId) throws ContinuumStoreException, ContinuumObjectNotFoundException {
+ return getStore().getProjectGroupByGroupId(groupId);
+ }
+
+ public BuildResult getLatestBuildResultForProject(int projectId) throws ContinuumStoreException {
+ return getStore().getLatestBuildResultForProject(projectId);
+ }
+
+ public void addBuildResult(Project project, BuildResult build) throws ContinuumStoreException, ContinuumObjectNotFoundException {
+ getStore().addBuildResult(project, build);
+ }
+
+ public void updateBuildResult(BuildResult build) throws ContinuumStoreException {
+ getStore().updateBuildResult(build);
+ }
+
+ public Project getProjectWithBuildDetails(int projectId) throws ContinuumObjectNotFoundException, ContinuumStoreException {
+ return getStore().getProjectWithBuildDetails(projectId);
+ }
+
+ public ProjectGroup getDefaultProjectGroup() throws ContinuumStoreException {
+ return getStore().getDefaultProjectGroup();
+ }
+
+ public SystemConfiguration addSystemConfiguration(SystemConfiguration systemConf) {
+ return getStore().addSystemConfiguration(systemConf);
+ }
+
+ public void updateSystemConfiguration(SystemConfiguration systemConf) throws ContinuumStoreException {
+ getStore().updateSystemConfiguration(systemConf);
+ }
+
+ public SystemConfiguration getSystemConfiguration() throws ContinuumStoreException {
+ return getStore().getSystemConfiguration();
+ }
+
+ public ContinuumUser addUser(ContinuumUser user) {
+ return getStore().addUser(user);
+ }
+
+ public void updateUser(ContinuumUser user) throws ContinuumStoreException {
+ getStore().updateUser(user);
+ }
+
+ public ContinuumUser getUser(int userId) throws ContinuumObjectNotFoundException, ContinuumStoreException {
+ return getStore().getUser(userId);
+ }
+
+ public ContinuumUser getGuestUser() throws ContinuumStoreException {
+ return getStore().getGuestUser();
+ }
+
+ public List getUsers() throws ContinuumStoreException {
+ return getStore().getUsers();
+ }
+
+ public ContinuumUser getUserByUsername(String username) throws ContinuumStoreException {
+ return getStore().getUserByUsername(username);
+ }
+
+ public void removeUser(ContinuumUser user) {
+ getStore().removeUser(user);
+ }
+
+ public List getPermissions() throws ContinuumStoreException {
+ return getStore().getPermissions();
+ }
+
+ public Permission getPermission(String name) throws ContinuumStoreException {
+ return getStore().getPermission(name);
+ }
+
+ public Permission addPermission(Permission perm) {
+ return getStore().addPermission(perm);
+ }
+
+ public UserGroup addUserGroup(UserGroup group) {
+ return getStore().addUserGroup(group);
+ }
+
+ public void updateUserGroup(UserGroup group) throws ContinuumStoreException {
+ getStore().updateUserGroup(group);
+ }
+
+ public List getUserGroups() throws ContinuumStoreException {
+ return getStore().getUserGroups();
+ }
+
+ public UserGroup getUserGroup(int userGroupId) throws ContinuumObjectNotFoundException, ContinuumStoreException {
+ return getStore().getUserGroup(userGroupId);
+ }
+
+ public UserGroup getUserGroup(String name) {
+ return getStore().getUserGroup(name);
+ }
+
+ public void removeUserGroup(UserGroup group) {
+ getStore().removeUserGroup(group);
+ }
+}
Modified: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/DistrubutedBuildController.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/DistrubutedBuildController.java?rev=332501&r1=332500&r2=332501&view=diff
==============================================================================
--- geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/DistrubutedBuildController.java (original)
+++ geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/DistrubutedBuildController.java Fri Nov 11 01:40:13 2005
@@ -40,6 +40,8 @@
*/
public class DistrubutedBuildController extends AbstractLogEnabled {
+ public String ROLE = DistrubutedBuildController.class.getName();
+
/**
* @plexus.requirement
*/
Copied: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/MapContinuumStore.java (from r332478, geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/DistributedContinuumStore.java)
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/MapContinuumStore.java?p2=geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/MapContinuumStore.java&p1=geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/DistributedContinuumStore.java&r1=332478&r2=332501&rev=332501&view=diff
==============================================================================
--- geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/DistributedContinuumStore.java (original)
+++ geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/MapContinuumStore.java Fri Nov 11 01:40:13 2005
@@ -28,7 +28,7 @@
/**
* @version $Rev$ $Date$
*/
-public class DistributedContinuumStore extends MockContinuumStore implements Serializable {
+public class MapContinuumStore extends MockContinuumStore implements Serializable {
private Map store = new HashMap();
Added: geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/MockContinuumNotificationDispatcher.java
URL: http://svn.apache.org/viewcvs/geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/MockContinuumNotificationDispatcher.java?rev=332501&view=auto
==============================================================================
--- geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/MockContinuumNotificationDispatcher.java (added)
+++ geronimo/gbuild/trunk/src/main/java/org/apache/geronimo/gbuild/agent/MockContinuumNotificationDispatcher.java Fri Nov 11 01:40:13 2005
@@ -0,0 +1,45 @@
+/**
+ *
+ * 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.apache.maven.continuum.notification.ContinuumNotificationDispatcher;
+import org.apache.maven.continuum.model.project.Project;
+import org.apache.maven.continuum.model.project.BuildResult;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class MockContinuumNotificationDispatcher implements ContinuumNotificationDispatcher {
+
+ public void buildStarted(Project project) {
+ }
+
+ public void checkoutStarted(Project project) {
+ }
+
+ public void checkoutComplete(Project project) {
+ }
+
+ public void runningGoals(Project project, BuildResult build) {
+ }
+
+ public void goalsCompleted(Project project, BuildResult build) {
+ }
+
+ public void buildComplete(Project project, BuildResult build) {
+ }
+}