package org.springframework.roo.process.manager.event; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import org.apache.commons.lang3.Validate; import org.springframework.roo.process.manager.ProcessManager; /** * Provides a convenience superclass for those {@link ProcessManager}s wishing * to publish status messages. * * @author Ben Alex * @since 1.0 */ public abstract class AbstractProcessManagerStatusPublisher implements ProcessManagerStatusProvider { /** * Used so a single object instance contains the changing * {@link ProcessManagerStatus} enum. This is needed so there is a single * object instance for synchronization purposes. */ private static class StatusHolder { private ProcessManagerStatus status; /** * Constructor * * @param initialStatus */ private StatusHolder(final ProcessManagerStatus initialStatus) { status = initialStatus; } } protected StatusHolder processManagerStatus = new StatusHolder(ProcessManagerStatus.STARTING); protected Set<ProcessManagerStatusListener> processManagerStatusListeners = new CopyOnWriteArraySet<ProcessManagerStatusListener>(); public final void addProcessManagerStatusListener( final ProcessManagerStatusListener processManagerStatusListener) { Validate.notNull(processManagerStatusListener, "Status listener required"); processManagerStatusListeners.add(processManagerStatusListener); } /** * Obtains the process manager status without synchronization. */ public final ProcessManagerStatus getProcessManagerStatus() { return processManagerStatus.status; } public final void removeProcessManagerStatusListener( final ProcessManagerStatusListener processManagerStatusListener) { Validate.notNull(processManagerStatusListener, "Status listener required"); processManagerStatusListeners.remove(processManagerStatusListener); } /** * Set the process manager status without synchronization. */ protected void setProcessManagerStatus(final ProcessManagerStatus processManagerStatus) { Validate.notNull(processManagerStatus, "Process manager status required"); if (this.processManagerStatus.status == processManagerStatus) { // No need to make a change return; } this.processManagerStatus.status = processManagerStatus; for (final ProcessManagerStatusListener listener : processManagerStatusListeners) { listener.onProcessManagerStatusChange(this.processManagerStatus.status, processManagerStatus); } } }