package org.tessell.model.validation;
import java.util.ArrayList;
import org.tessell.model.properties.Property;
import org.tessell.model.validation.events.RuleTriggeredEvent;
import org.tessell.model.validation.events.RuleUntriggeredEvent;
import org.tessell.widgets.TextList;
/**
* For keeping track of custom, controlled-based errors that later need to be cleared
* on the next AJAX request to the server.
*
* When a message is added, a {@link RuleTriggeredEvent} event is fired against
* the property, and so any {@link TextList} components listening for errors will
* pick it up and show the error.
*
* When {@link #clear()} is called, a {@link RuleUntriggeredEvent} event is fired
* to remove the message while the server is re-consulted about the error state.
*/
public class ServerErrors {
private final ArrayList<Message> messages = new ArrayList<Message>();
public void add(final Property<?> property, final String message) {
final Message m = new Message(property, message);
m.fire();
messages.add(m);
}
// If there some sort of of "ServerCall" object, this clear could be called automatically
public void clear() {
for (final Message m : messages) {
m.unfire();
}
}
private static class Message {
private final Property<?> property;
private final String message;
private Message(final Property<?> property, final String message) {
this.property = property;
this.message = message;
}
private void fire() {
property.fireEvent(new RuleTriggeredEvent(this, message, new Boolean[] { false }));
}
private void unfire() {
// Ack. Not good because the rule will still think it is fired. Untouched is better.
property.fireEvent(new RuleUntriggeredEvent(this, message));
}
}
}