package com.tri.ui.model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import com.tri.ui.model.observer.ChangeEvent;
import com.tri.ui.model.observer.ChangeEventType;
import com.tri.ui.model.observer.Observable;
import com.tri.ui.model.observer.Observer;
import com.tri.ui.model.utility.Validate;
/**
* Super class for all data controllers.
*
* @param <D>
* data
*
* @author khennig@pobox.com
*/
public abstract class DataController<D> implements Observable, Serializable {
private static final long serialVersionUID = 1L;
private List<Observer> observers;
/** Returns the value element(s) of this data controller */
public abstract D getData();
@Override
public void addObserver(final Observer observer) {
Validate.notNull(observer, "Observer required");
Validate.isTrue(!getObservers().contains(observer),
"Observer already associated");
if (!getObservers().add(observer)) {
throw new RuntimeException("Failed to add observer");
}
}
@Override
public void removeObserver(final Observer observer) {
Validate.notNull(observer, "Observer required");
Validate.isTrue(getObservers().remove(observer),
"Observer not associated");
}
@Override
public void removeObservers() {
getObservers().clear();
}
@Override
public void notify(final ChangeEvent event) {
Validate.notNull(event, "Event required");
for (Observer observer : getObservers()) {
observer.update(event);
}
}
@Override
public void notify(final ChangeEventType type) {
notify(new ChangeEvent(this, type));
}
private List<Observer> getObservers() {
if (observers == null) {
observers = new ArrayList<Observer>();
}
return observers;
}
}