
goal.util.DefaultObservable Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of runtime Show documentation
Show all versions of runtime Show documentation
A system for running GOAL multi-agent systems.
The newest version!
/**
* The GOAL Runtime Environment. Copyright (C) 2015 Koen Hindriks.
*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see .
*/
package goal.util;
import java.util.Collections;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import com.google.common.collect.ImmutableSet;
import goal.tools.errorhandling.Resources;
import goal.tools.errorhandling.Warning;
import goal.tools.errorhandling.WarningStrings;
/**
* Implements generic observable functionality. Thread safe.
*
* @param
* observer of OBJects coming from SRC
* @param
* the type of the event source of OBJs
* @param
* the type of event objects created by this observable.
*/
public class DefaultObservable, SRC, OBJ> implements Observable {
private final Set observers = Collections.newSetFromMap(new ConcurrentHashMap());
@Override
public void addObserver(OBS observer) {
this.observers.add(observer);
}
@Override
public void removeObserver(OBS observer) {
this.observers.remove(observer);
}
/**
* returns a static copy of the current list of observers.
*
* @return the current list of observers
*/
private Set getObservers() {
return ImmutableSet.copyOf(this.observers);
}
/**
* notify all our observers of some event. This notifies all observers
* available at the moment of the call. If the set of observers changes
* DURING the notifyAll handling, this change will be ignored.
*
* IMPORTANT: notifyObservers should only be called by the class
* implementing this, and not by external users of the observable such as
* Observers. Can we enforce this?
*/
@Override
public void notifyObservers(SRC src, OBJ obj) {
for (OBS obs : getObservers()) {
try {
obs.eventOccured(src, obj);
} catch (Throwable e) { // Callback protection
new Warning(String.format(Resources.get(WarningStrings.FAILED_CALLBACK_1), obs.toString()), e).emit();
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy