package java.util;

import ej.annotation.Nullable;

/**
 * This class represents an observable object, or "data" in the model-view paradigm. It can be
 * subclassed to represent an object that the application wants to have observed.
 * <p>
 * An observable object can have one or more observers. An observer may be any object that
 * implements interface <code>Observer</code>. After an observable instance changes, an application
 * calling the <code>Observable</code>'s <code>notifyObservers</code> method causes all of its
 * observers to be notified of the change by a call to their <code>update</code> method.
 * <p>
 * The order in which notifications will be delivered is unspecified. The default implementation
 * provided in the Observable class will notify Observers in the order in which they registered
 * interest, but subclasses may change this order, use no guaranteed order, deliver notifications on
 * separate threads, or may guarantee that their subclass follows this order, as they choose.
 * <p>
 * Note that this notification mechanism is has nothing to do with threads and is completely
 * separate from the <code>wait</code> and <code>notify</code> mechanism of class <code>Object</code>.
 * <p>
 * When an observable object is newly created, its set of observers is empty. Two observers are
 * considered the same if and only if the <code>equals</code> method returns true for them.
 */
public class Observable {

    /**
     * Construct an Observable with zero Observers.
     */
    public Observable() {
        throw new RuntimeException();
    }

    /**
     * Adds an observer to the set of observers for this object, provided that it is not the same as
     * some observer already in the set. The order in which notifications will be delivered to multiple
     * observers is not specified. See the class comment.
     *
     * @param o
     *        an observer to be added.
     * @throws NullPointerException
     *         if the parameter o is null.
     */
    public void addObserver(Observer o) {
        throw new RuntimeException();
    }

    /**
     * Indicates that this object has no longer changed, or that it has already notified all of its
     * observers of its most recent change, so that the <code>hasChanged</code> method will now return
     * <code>false</code>. This method is called automatically by the <code>notifyObservers</code> methods.
     *
     * @see java.util.Observable#notifyObservers()
     * @see java.util.Observable#notifyObservers(java.lang.Object)
     */
    protected void clearChanged() {
        throw new RuntimeException();
    }

    /**
     * Returns the number of observers of this <code>Observable</code> object.
     *
     * @return the number of observers of this object.
     */
    public int countObservers() {
        throw new RuntimeException();
    }

    /**
     * Deletes an observer from the set of observers of this object. Passing <code>null</code> to this
     * method will have no effect.
     *
     * @param o
     *        the observer to be deleted.
     */
    public void deleteObserver(@Nullable Observer o) {
        throw new RuntimeException();
    }

    /**
     * Clears the observer list so that this object no longer has any observers.
     */
    public void deleteObservers() {
        throw new RuntimeException();
    }

    /**
     * Tests if this object has changed.
     *
     * @return <code>true</code> if and only if the <code>setChanged</code> method has been called more
     *         recently than the <code>clearChanged</code> method on this object; <code>false</code>
     *         otherwise.
     * @see java.util.Observable#clearChanged()
     * @see java.util.Observable#setChanged()
     */
    public boolean hasChanged() {
        throw new RuntimeException();
    }

    /**
     * If this object has changed, as indicated by the <code>hasChanged</code> method, then notify all
     * of its observers and then call the <code>clearChanged</code> method to indicate that this object
     * has no longer changed.
     * <p>
     * Each observer has its <code>update</code> method called with two arguments: this observable
     * object and <code>null</code>. In other words, this method is equivalent to: <blockquote><code>
     * notifyObservers(null)</code></blockquote>
     *
     * @see java.util.Observable#clearChanged()
     * @see java.util.Observable#hasChanged()
     * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
     */
    public void notifyObservers() {
        throw new RuntimeException();
    }

    /**
     * If this object has changed, as indicated by the <code>hasChanged</code> method, then notify all
     * of its observers and then call the <code>clearChanged</code> method to indicate that this object
     * has no longer changed.
     * <p>
     * Each observer has its <code>update</code> method called with two arguments: this observable
     * object and the <code>arg</code> argument.
     *
     * @param arg
     *        any object.
     * @see java.util.Observable#clearChanged()
     * @see java.util.Observable#hasChanged()
     * @see java.util.Observer#update(java.util.Observable, java.lang.Object)
     */
    public void notifyObservers(@Nullable Object arg) {
        throw new RuntimeException();
    }

    /**
     * Marks this <code>Observable</code> object as having been changed; the <code>hasChanged</code> method will
     * now return <code>true</code>.
     */
    protected void setChanged() {
        throw new RuntimeException();
    }
}
