package org.concord.otrunk.util;
import java.util.ArrayList;
import java.util.Vector;
import org.concord.framework.otrunk.OTObject;
import org.concord.framework.otrunk.OTObjectFilter;
/**
*
* @author sfentress
*
*/
public class OTSharingManagerImpl implements OTSharingManager
{
private OTSharingBundle.ResourceSchema registry;
private ArrayList<OTSharingListener> listeners;
public OTSharingManagerImpl(OTSharingBundle.ResourceSchema registry)
{
this.registry = registry;
}
/**
*
* @return all objects being shared
*/
public Vector<OTObject> getAllSharedObjects(){
return registry.getSharedObjects().getVector();
}
/**
*
* @param clazz specific class of object
* @return all shared objects of type clazz. If null, all shared objects are returned
*/
public Vector<OTObject> getAllSharedObjects(Class<?> clazz){
final Class<?> myClazz = clazz;
if (myClazz == null) {
return getAllSharedObjects();
}
OTObjectFilter filter = new OTObjectFilter() {
public boolean keepObject(OTObject obj)
{
return myClazz.isAssignableFrom(obj.getClass());
}
};
return getAllSharedObjects(filter);
}
/**
*
* @param filter an OTObjectFilter implementation
* @return all shared objects matching OTObjectFilter filter
*/
public Vector<OTObject> getAllSharedObjects(OTObjectFilter filter) {
return filter.filterList(getAllSharedObjects());
}
/**
* This will add the object to the list, if it isn't already there.
*
* This should really only add the reference to this
* object, but as it stands, it might move the object
* from its original location to the shared objects
* list...
*
* @param obj The OTObject to be shared
*/
public void share(OTObject obj){
if (! isShared(obj)){
registry.getSharedObjects().add(obj);
notifyListeners(new OTSharingEvent(OTSharingEvent.SHARED, obj));
}
}
public void remove(OTObject obj)
{
if (isShared(obj)) {
registry.getSharedObjects().remove(obj);
notifyListeners(new OTSharingEvent(OTSharingEvent.REMOVED, obj));
}
}
public boolean isShared(OTObject obj)
{
return registry.getSharedObjects().getVector().contains(obj);
}
public void addOTSharingListener(OTSharingListener listener)
{
if (listeners == null) {
listeners = new ArrayList<OTSharingListener>();
}
listeners.add(listener);
}
public void removeOTSharingListener(OTSharingListener listener)
{
if (listeners == null) {
listeners = new ArrayList<OTSharingListener>();
}
listeners.remove(listener);
}
private void notifyListeners(OTSharingEvent event) {
if (listeners == null) {
listeners = new ArrayList<OTSharingListener>();
}
for (OTSharingListener lis : listeners) {
if (event.getType() == OTSharingEvent.SHARED) {
lis.objectShared(event);
} else if (event.getType() == OTSharingEvent.REMOVED) {
lis.objectRemoved(event);
}
}
}
}