blob: 50f20a0e4de268276dc62986bc417840414112ef [file] [log] [blame]
package org.eclipse.jst.jsf.designtime.internal.view.model;
import java.util.Collection;
import java.util.Collections;
import java.util.EventListener;
import java.util.EventObject;
import java.util.List;
import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
/**
* A registry for tags for a given context TODO: generally tied to project, but
* may also need a tie to specific tag-in-use type. For example, if JSPs and
* Facelets are used at the same time?
*
* @author cbateman
*
*/
public interface ITagRegistry
{
/**
* @return true if this registry is disposed. It is an error to use a
* disposed registry and behaviour of such a registry is not
* guaranteed.
*/
public abstract boolean isDisposed();
/**
* This method may cause long-running operations to be executed. If runAfter
* is non-null, any long running operations will schedule asynchronously on
* a separate thread and on successful completion, runAfter will be executed
* (no assumption should be made about what thread it is run on).
*
* @param runAfter
*
*/
public abstract void refresh(final Runnable runAfter);
/**
* @return all tag libraries for a project tag registry
*/
public abstract Collection<? extends Namespace> getAllTagLibraries();
/**
* @param uri
* @return the tag library corresponding to uri or null if none.
*/
public abstract Namespace getTagLibrary(final String uri);
/**
* Adds the listener to the list of objects that receive change events
* from this tag registry instance. If listener is already in the list,
* it will not be added again.
*
* @param listener
*/
public abstract void addListener(ITagRegistryListener listener);
/**
* Remove listener from the list of objects that receive change events
* from this tag registry instance.
*
* @param listener
*/
public abstract void removeListener(ITagRegistryListener listener);
/**
* Marks a listener that receives tag registry change events
*
*/
interface ITagRegistryListener extends EventListener
{
/**
* @param changeEvent
*/
void registryChanged(final TagRegistryChangeEvent changeEvent);
}
/**
* A change event object that communicates a single type of change to
* a single tag registry
*
*/
static class TagRegistryChangeEvent extends EventObject
{
public enum EventType
{
// if the type is any of these three, then getAffectedObjects()
// will return one or more Namespace objects that have changed.
ADDED_NAMESPACE,
REMOVED_NAMESPACE,
CHANGED_NAMESPACE,
// if the type is is this one, then the event is being called
// before dispose operation on getSource().
REGISTRY_DISPOSED
}
/**
*
*/
private static final long serialVersionUID = 6559096306615373552L;
private final List<? extends Namespace> _affectedObjects;
private final EventType _type;
public TagRegistryChangeEvent(ITagRegistry source, EventType type)
{
this(source, type, Collections.EMPTY_LIST);
}
public TagRegistryChangeEvent(ITagRegistry source, EventType type,
List<? extends Namespace> affectedObjects)
{
super(source);
_affectedObjects = affectedObjects;
_type = type;
}
@Override
public ITagRegistry getSource()
{
return (ITagRegistry) super.getSource();
}
public List<? extends Namespace> getAffectedObjects()
{
return _affectedObjects;
}
public EventType getType()
{
return _type;
}
}
}