package vnet.sms.common.shell.springshell.event;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import vnet.sms.common.shell.springshell.ParseResult;
import vnet.sms.common.shell.springshell.event.ShellStatus.Status;
import vnet.sms.common.shell.springshell.internal.util.Assert;
/**
* Provides a convenience superclass for those shells wishing to publish status
* messages.
*
* @author Ben Alex
* @since 1.0
*/
public abstract class AbstractShellStatusPublisher implements
ShellStatusProvider {
// Fields
protected Set<ShellStatusListener> shellStatusListeners = new CopyOnWriteArraySet<ShellStatusListener>();
protected ShellStatus shellStatus = new ShellStatus(
Status.STARTING);
@Override
public final void addShellStatusListener(
final ShellStatusListener shellStatusListener) {
Assert.notNull(shellStatusListener, "Status listener required");
synchronized (this) {
this.shellStatusListeners.add(shellStatusListener);
}
}
@Override
public final void removeShellStatusListener(
final ShellStatusListener shellStatusListener) {
Assert.notNull(shellStatusListener, "Status listener required");
synchronized (this) {
this.shellStatusListeners.remove(shellStatusListener);
}
}
@Override
public final ShellStatus getShellStatus() {
synchronized (this) {
return this.shellStatus;
}
}
protected void setShellStatus(final Status shellStatus) {
setShellStatus(shellStatus, null, null);
}
protected void setShellStatus(final Status shellStatus, final String msg,
final ParseResult parseResult) {
Assert.notNull(shellStatus, "Shell status required");
synchronized (this) {
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 : this.shellStatusListeners) {
listener.onShellStatusChange(this.shellStatus, st);
}
this.shellStatus = st;
}
}
}