blob: 4290a96f7b7a29af914245fe7b662770f457d73d [file] [log] [blame]
package org.eclipse.jst.jsf.facelet.core.internal.metadata;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.ISafeRunnable;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.jst.jsf.common.metadata.internal.AbstractMetaDataLocator;
import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataChangeNotificationEvent;
import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataLocator;
import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataObserver;
import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
import org.eclipse.jst.jsf.common.metadata.internal.IPathSensitiveMetaDataLocator;
import org.eclipse.jst.jsf.common.metadata.internal.MetaDataChangeNotificationEvent;
import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace;
import org.eclipse.jst.jsf.core.internal.CompositeTagRegistryFactory;
import org.eclipse.jst.jsf.core.internal.CompositeTagRegistryFactory.TagRegistryIdentifier;
import org.eclipse.jst.jsf.core.metadata.internal.INamespaceModelProvider;
import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry.ITagRegistryListener;
import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry.TagRegistryChangeEvent;
import org.eclipse.jst.jsf.facelet.core.internal.FaceletCorePlugin;
/**
* Locates Facelet {@link Namespace} metadata
*/
public class FaceletNamespaceMetaDataLocator
extends AbstractMetaDataLocator
implements IPathSensitiveMetaDataLocator, ITagRegistryListener {
private static final IContentType FACELET_CONTENTTYPE = Platform.getContentTypeManager().findContentTypeFor("foo.xhtml"); //$NON-NLS-1$
private IProject _project;
private ITagRegistry _reg;
public List<IMetaDataSourceModelProvider> locateMetaDataModelProviders(final String uri) {
final List<IMetaDataSourceModelProvider> providers = new ArrayList<IMetaDataSourceModelProvider>();
if (_reg != null) {
final Namespace ns = _reg.getTagLibrary(uri);
if (ns != null) {
providers.add(new NamespaceSourceModel(ns));
}
}
return providers;
}
public void startLocating() {
final TagRegistryIdentifier tagRegId = new TagRegistryIdentifier(_project, FACELET_CONTENTTYPE);
_reg = CompositeTagRegistryFactory.getInstance().getRegistry(tagRegId);
if (_reg != null) {
_reg.addListener(this);
}
}
public void stopLocating() {
if (_reg != null) {
_reg.removeListener(this);
_reg = null;
}
}
public void setProjectContext(final IProject project) {
_project = project;
}
public void registryChanged(final TagRegistryChangeEvent changeEvent) {
for (final Namespace ns : changeEvent.getAffectedObjects()) {
if (adaptTagRegistryEvent(changeEvent) != IMetaDataChangeNotificationEvent.ADDED) {
final IMetaDataChangeNotificationEvent mdEvent = new MetaDataChangeNotificationEvent(this, ns.getNSUri(), adaptTagRegistryEvent(changeEvent));
fireEvent(mdEvent);
}
}
}
private int adaptTagRegistryEvent(final TagRegistryChangeEvent event) {
switch (event.getType()) {
case ADDED_NAMESPACE:
return IMetaDataChangeNotificationEvent.ADDED;
case REMOVED_NAMESPACE:
case REGISTRY_DISPOSED:
return IMetaDataChangeNotificationEvent.REMOVED;
default:
return IMetaDataChangeNotificationEvent.CHANGED;
}
}
private void fireEvent(final IMetaDataChangeNotificationEvent event) {
SafeRunnable.run(new ISafeRunnable(){
public void handleException(Throwable exception) {
FaceletCorePlugin.log("Error while firing metadataChangeNotificationEvent" , exception) ; //$NON-NLS-1$
}
public void run() throws Exception {
for (final IMetaDataObserver observer : getObservers()){
observer.notifyMetadataChanged(event);
}
}
});
}
private class NamespaceSourceModel implements INamespaceModelProvider {
private Namespace ns;
private IMetaDataLocator locator;
NamespaceSourceModel(final Namespace ns){
this.ns = ns;
}
public Object getSourceModel() {
return ns;
}
public IMetaDataLocator getLocator() {
return locator;
}
public void setLocator(IMetaDataLocator locator) {
this.locator = locator;
}
public Object getAdapter(Class klass) {
return null;
}
public Namespace getNamespace() {
return ns;
}
}
}