package org.eclipse.jst.jsf.facelet.core.internal.cm.strategy; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.Map; import org.eclipse.core.resources.IProject; import org.eclipse.jst.jsf.common.dom.TagIdentifier; import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttribute; import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagElement; import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.Namespace; import org.eclipse.jst.jsf.designtime.internal.view.model.ITagRegistry; import org.eclipse.jst.jsf.facelet.core.internal.cm.AttributeCMAdapter; import org.eclipse.jst.jsf.facelet.core.internal.cm.TagInfo; import org.eclipse.jst.jsf.facelet.core.internal.util.ViewUtil; import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap; import org.eclipse.wst.xml.core.internal.contentmodel.CMNode; /** * The * @author cbateman * */ public class FaceletExternalMetadataStrategy extends AbstractExternalMetadataStrategy { /** * The unique identifier for the strategy. */ public final static String STRATEGY_ID = "org.eclipse.jst.jsf.facelet.core.internal.cm.strategy.FaceletExternalMetadataStrategy"; //$NON-NLS-1$ private final IProject _project; /** * @param project */ public FaceletExternalMetadataStrategy(final IProject project) { super(STRATEGY_ID, Messages.FaceletExternalMetadataStrategy_0); _project = project; } @Override public TagInfo perform(TagIdentifier input) throws Exception { final ITagRegistry tagRegistry = ViewUtil.getTagRegistry(_project); if (tagRegistry != null) { Namespace tagLibrary = tagRegistry.getTagLibrary(input.getUri()); if (tagLibrary != null) { return new FaceletInternalInfo(tagLibrary); } } return getNoResult(); } private static class FaceletInternalInfo extends TagInfo { private final Namespace _namespace; public FaceletInternalInfo(final Namespace namespace) { _namespace = namespace; } @Override public Object getTagProperty(String tagName, String key) { if ("description".equals(key)) //$NON-NLS-1$ { // TODO: } return null; } @Override public CMNamedNodeMap getAttributes(String tagName) { ITagElement viewElement = _namespace.getViewElement(tagName); if (viewElement != null) { return new MyNodeNameMap(viewElement); } return null; } private static class MyNodeNameMap implements CMNamedNodeMap { private final ITagElement _tagElement; private final ArrayList<CMNode> _attrs; public MyNodeNameMap(final ITagElement tagElement) { super(); _tagElement = tagElement; _attrs = new ArrayList<CMNode>(); for (final Map.Entry<String, ? extends ITagAttribute> entry : _tagElement.getAttributes().entrySet()) { final ITagAttribute attr = entry.getValue(); _attrs.add(new AttributeCMAdapter(attr)); } } public int getLength() { return _attrs.size(); } public CMNode getNamedItem(String name) { if (name == null) { return null; } for (final CMNode cmNode : _attrs) { if (name.equals(cmNode.getNodeName())) { return cmNode; } } return null; } public CMNode item(int index) { return _attrs.get(index); } public Iterator iterator() { return Collections.unmodifiableList(_attrs).iterator(); } } } }