Skip to main content
summaryrefslogtreecommitdiffstats
blob: 149c341124d52f7e35c89e2d2530f68b8d4ff31f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
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();
            }
        }
    }
}

Back to the top