package org.springframework.roo.shell.event; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import org.apache.commons.lang3.Validate; import org.springframework.roo.shell.ParseResult; import org.springframework.roo.shell.event.ShellStatus.Status; /** * Provides a convenience superclass for those shells wishing to publish status * messages. * * @author Ben Alex * @since 1.0 */ public abstract class AbstractShellStatusPublisher implements ShellStatusProvider { protected Set<ShellStatusListener> shellStatusListeners = new CopyOnWriteArraySet<ShellStatusListener>(); protected ShellStatus shellStatus = new ShellStatus(Status.STARTING); public final void addShellStatusListener(final ShellStatusListener shellStatusListener) { Validate.notNull(shellStatusListener, "Status listener required"); synchronized (shellStatus) { shellStatusListeners.add(shellStatusListener); } } public final ShellStatus getShellStatus() { synchronized (shellStatus) { return shellStatus; } } public final void removeShellStatusListener(final ShellStatusListener shellStatusListener) { Validate.notNull(shellStatusListener, "Status listener required"); synchronized (shellStatus) { shellStatusListeners.remove(shellStatusListener); } } protected void setShellStatus(final Status shellStatus) { setShellStatus(shellStatus, null, null); } protected void setShellStatus(final Status shellStatus, final String msg, final ParseResult parseResult) { Validate.notNull(shellStatus, "Shell status required"); synchronized (this.shellStatus) { ShellStatus st; if (msg == null || msg.length() == 0) { st = new ShellStatus(shellStatus); } else { st = new ShellStatus(shellStatus, msg, parseResult); } if (this.shellStatus.equals(st)) { return; } for (final ShellStatusListener listener : shellStatusListeners) { listener.onShellStatusChange(this.shellStatus, st); } this.shellStatus = st; } } }