blob: 1429e93665b1010449ea4cdd4dda548775d48984 [file] [log] [blame]
package org.eclipse.jst.jsf.facelet.core.internal.util;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.jst.jsf.core.internal.CompositeTagRegistryFactory;
import org.eclipse.jst.jsf.core.internal.CompositeTagRegistryFactory.TagRegistryIdentifier;
import org.eclipse.jst.jsf.designtime.DesignTimeApplicationManager;
import org.eclipse.jst.jsf.designtime.internal.view.IDTViewHandler;
import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry;
import org.eclipse.jst.jsf.designtime.internal.view.model.TagRegistryFactory.TagRegistryFactoryException;
import org.eclipse.jst.jsf.facelet.core.internal.registry.FaceletRegistryManager.MyRegistryFactory;
import org.eclipse.jst.jsp.core.internal.contentmodel.tld.CMDocumentFactoryTLD;
import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
import org.eclipse.jst.jsp.core.taglib.ITaglibRecord;
import org.eclipse.jst.jsp.core.taglib.TaglibIndex;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
/**
* Facelet view utilities
*
* @author cbateman
*/
public final class ViewUtil
{
private static final String HTMLSOURCE_CONTENT_TYPE_ID = "org.eclipse.wst.html.core.htmlsource"; //$NON-NLS-1$
private static final String XMLNS = "xmlns"; //$NON-NLS-1$
/**
* Warning! This call can be very expensive. Cache results whenever
* possible.
*
* @param project
* @param uri
* @return the tld document for uri in project or null if not found
*/
public static TLDDocument findTLDDocument(final IProject project,
final String uri)
{
final ITaglibRecord[] tldrecs = TaglibIndex
.getAvailableTaglibRecords(project.getFullPath());
for (final ITaglibRecord rec : tldrecs)
{
final String matchUri = rec.getDescriptor().getURI();
if (uri.equals(matchUri))
{
final CMDocumentFactoryTLD factory = new CMDocumentFactoryTLD();
return (TLDDocument) factory.createCMDocument(rec);
}
}
return null;
}
/**
* @param attributes
* @return the set of uri's that declared in attributes
*/
public static Set<Attr> getDeclaredNamespaces(final NamedNodeMap attributes)
{
final Set<Attr> alreadyUsed = new HashSet<Attr>();
for (int i = 0; i < attributes.getLength(); i++)
{
final Node node = attributes.item(i);
if (XMLNS.equals(node.getNodeName())
|| XMLNS.equals(node.getPrefix()))
{
final String attrValue = node.getNodeValue();
if (attrValue != null && !"".equals(attrValue.trim()) //$NON-NLS-1$
&& node instanceof Attr)
{
alreadyUsed.add((Attr) node);
}
}
}
return alreadyUsed;
}
/**
* @param attrSet
* @param value
* @return true if attrSet contains an attribute whose value is <i>value</i>
*/
public static boolean hasAttributeValue(final Set<Attr> attrSet,
final String value)
{
for (final Attr attr : attrSet)
{
if (value.equals(attr.getValue()))
{
return true;
}
}
return false;
}
/**
* @param project
* @return the html source type tag registry for project
*/
public static ITagRegistry getHtmlTagRegistry(final IProject project)
{
final IContentType contentType = Platform.getContentTypeManager()
.getContentType(HTMLSOURCE_CONTENT_TYPE_ID);
final TagRegistryIdentifier id = new TagRegistryIdentifier(project,
contentType);
final ITagRegistry tagRegistry = CompositeTagRegistryFactory
.getInstance().getRegistry(id);
return tagRegistry;
}
/**
* @param doc
* @return all of the prefixed namespaces defined in doc
*/
public static Map<String, PrefixEntry> getDocumentNamespaces(
final Document doc)
{
final Map<String, PrefixEntry> namespaces = new HashMap<String, PrefixEntry>();
final Element rootElement = doc.getDocumentElement();
if (rootElement != null)
{
final NamedNodeMap attrs = rootElement.getAttributes();
for (int i = 0; i < attrs.getLength(); i++)
{
final Attr a = (Attr) attrs.item(i);
final PrefixEntry ns = PrefixEntry.parseNamespace(a);
if (ns != null)
{
namespaces.put(ns._prefix, ns);
}
}
}
return namespaces;
}
/**
* @param file
* @return true if the file is a Facelet VDL file
*/
public static boolean isFaceletVDLFile(final IFile file)
{
final DesignTimeApplicationManager instance = DesignTimeApplicationManager.getInstance(file.getProject());
if (instance != null)
{
final IDTViewHandler viewHandler = instance.getViewHandler();
if (viewHandler != null)
{
return viewHandler.supportsViewDefinition(file);
}
}
return false;
}
/**
* @param project
* @return the facelet tag registry for the project or null if none.
*/
public static ITagRegistry getTagRegistry(final IProject project)
{
final MyRegistryFactory factory = new MyRegistryFactory();
ITagRegistry registry = null;
try
{
registry = factory.createTagRegistry(project);
}
catch (final TagRegistryFactoryException e)
{
// fall-through
}
return registry;
}
/**
* Encapsulates a single namespace/prefix use declaration in an XML document
* @author cbateman
*
*/
public static class PrefixEntry
{
private final String _uri;
private final String _prefix;
/**
* @param attr
* @return the prefix entry for attr or null
*/
public static PrefixEntry parseNamespace(final Attr attr)
{
final String prefix = attr.getPrefix();
if (XMLNS.equals(prefix))
{
final String prefixName = attr.getLocalName();
if (prefixName != null)
{
final String uri = attr.getNodeValue();
if (uri != null)
{
return new PrefixEntry(uri, prefixName);
}
}
}
return null;
}
/**
* @param uri
* @param prefix
*/
public PrefixEntry(final String uri, final String prefix)
{
_uri = uri;
_prefix = prefix;
}
/**
* @return the namespace uri
*/
public final String getUri()
{
return _uri;
}
/**
* @return the namespace prefix
*/
public final String getPrefix()
{
return _prefix;
}
@Override
public int hashCode()
{
return _uri.hashCode();
}
@Override
public boolean equals(final Object obj)
{
return _uri.equals(obj);
}
}
}