blob: 7bb3dde8d64fc295536465b7e9515d5c8eb548cd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2008 Oracle Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Oracle Corporation - initial API and implementation
*******************************************************************************/
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
* @param flushCaches true indicates that any cached data should be flushed.
*
*/
public abstract void refresh(final Runnable runAfter, final boolean flushCaches);
/**
* Callers should assume the collection is not modifiable. Implementers
* may return a collection whose mutator operations throw exceptions.
*
* @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;
}
}
}