Skip to main content
summaryrefslogtreecommitdiffstats
blob: 9c16bd54d9c0d37ca24b79ecc18e04006ac08b3b (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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
/*******************************************************************************
 * Copyright (c) 2001, 2010 Oracle Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *     Oracle Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.jsf.designtime.internal.view.model.jsp;

import java.io.IOException;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttribute;
import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.ITagAttributeHandler;
import org.eclipse.jst.jsf.common.runtime.internal.view.model.common.TagElement;
import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;


/**
 * A tag element for a JSP tag (TLD-defined)
 * 
 * @author cbateman
 *
 */
public class TLDTagElement extends TagElement
{
    /**
     * 
     */
    private static final long serialVersionUID = -874272538404837105L;
    private final TLDElementData                  _tldData;

    /**
     * @param elementDecl
     * @param advisor 
     */
    public TLDTagElement(final TLDElementDeclaration elementDecl
            , final IAttributeAdvisor advisor)
    {
        _tldData = new DocumentElementData(elementDecl, advisor);
    }

    @Override
    public String getName()
    {
        return _tldData.getName();
    }

    @Override
    public String getUri()
    {
        return _tldData.getUri();
    }

    @Override
    public String getTagHandlerClassName() {
        return _tldData.getTagHandlerClassName();
    }

    @Override
    public String toString()
    {
        return String.format("Tag: Tag Handler: name=%s, uri=%s, tagHandlerClassName=%s\n" //$NON-NLS-1$
                , getName(), getUri(), getTagHandlerClassName())
                + constructAttributesString();
    }

    /**
     * @return a string representation of the attributes.
     */
    protected String constructAttributesString()
    {
        String attributes = ""; //$NON-NLS-1$

        for (final Iterator it = getAttributeHandlers().entrySet().iterator(); it.hasNext();)
        {
            final Map.Entry entry = (Entry) it.next();
            final String name = (String) entry.getKey();
            final ITagAttributeHandler handler = (ITagAttributeHandler) entry.getValue();

            attributes += String.format("\t\t\tAttribute: name=%s, customHandler=%s, propertyName=%s, isELAllowed=%b\n",  //$NON-NLS-1$
                    name, handler.getCustomHandler(), handler.getName(),
                    Boolean.valueOf(handler.isELAllowed()));
        }
        return attributes;
    }

    @Override
    public Map getAttributeHandlers()
    {
        return _tldData.getAttributeHandlers();
    }

    public Map<String, ? extends ITagAttribute> getAttributes()
    {
        return _tldData.getAttributes();
    }
    
    private static class DocumentElementData extends TLDElementData
    {
        /**
         * serialization id
         */
        private static final long serialVersionUID = -6160324802818766058L;
        private final TLDElementDeclaration _tldDoc;
        private final CMNodeNamedMapAdapter _adapter;
        private Map<String, ? extends ITagAttribute> _tldAttributes;

        public DocumentElementData(final TLDElementDeclaration tldDoc,
                final IAttributeAdvisor advisor)
        {
            _tldDoc = tldDoc;
            _adapter = new CMNodeNamedMapAdapter(tldDoc, advisor);
            _tldAttributes = advisor.getAttributes();
        }

        @Override
        public String getName()
        {
            return _tldDoc.getElementName();
        }

        @Override
        public String getTagHandlerClassName()
        {
            return _tldDoc.getTagclass();
        }

        @Override
        public String getUri()
        {
            final CMDocument owner = _tldDoc.getOwnerDocument();

            if (owner instanceof TLDDocument)
            {
                return ((TLDDocument)owner).getUri();
            }
            return null;
        }

        private Object writeReplace()
        {
            return new SerializedTLDElementData(getName(), getTagHandlerClassName(), getUri()
                    , _adapter, _tldAttributes);
        }

        @SuppressWarnings("unused")
        private void readObject(java.io.ObjectInputStream in)
                        throws IOException, ClassNotFoundException
        {
            throw new UnsupportedOperationException("This object should be serialized; writeReplace"); //$NON-NLS-1$
        }

        @Override
        public Map<String, ? extends ITagAttributeHandler> getAttributeHandlers()
        {
            return _adapter;
        }

        @Override
        public Map<String, ? extends ITagAttribute> getAttributes()
        {
            return _tldAttributes;
        }
    }

    /**
     * @author cbateman
     *
     */
    private static class SerializedTLDElementData extends TLDElementData
    {
        /**
         * 
         */
        private static final long serialVersionUID = 4008084060638384114L;
        private final String        _name;
        private final String        _uri;
        private final String        _tagHandlerClassName;
        private final Map<String, ? extends ITagAttributeHandler>  _tagAttributes;
        private final Map<String, ? extends ITagAttribute> _actualTagAttributes;

        /**
         * @param name
         * @param tagHandlerClassName
         * @param uri
         * @param tagAttributes
         */
        private SerializedTLDElementData(final String name,
                final String tagHandlerClassName, final String uri,
                final Map<String, ? extends ITagAttributeHandler> tagAttributes,
                final Map<String, ? extends ITagAttribute> actualTagAttributes)
        {
            super();
            _name = name;
            _tagHandlerClassName = tagHandlerClassName;
            _uri = uri;
            // copy the map, because we don't if it is simply delta
            _tagAttributes = new HashMap(tagAttributes);
            _actualTagAttributes = new HashMap(actualTagAttributes);
        }

        @Override
        public String getName()
        {
            return _name;
        }

        @Override
        public String getTagHandlerClassName()
        {
            return _tagHandlerClassName;
        }

        @Override
        public String getUri()
        {
            return _uri;
        }

        @Override
        public Map<String, ? extends ITagAttributeHandler> getAttributeHandlers()
        {
            return _tagAttributes;
        }

        @Override
        public Map<String, ? extends ITagAttribute> getAttributes()
        {
            return _actualTagAttributes;
        }
    }

    private static abstract class TLDElementData implements Serializable
    {
        /**
         * 
         */
        private static final long serialVersionUID = -2494388738109839064L;
        public abstract String getTagHandlerClassName();
        public abstract String getName();
        public abstract String getUri();
        public abstract Map<String, ? extends ITagAttributeHandler>  getAttributeHandlers();
        public abstract Map<String, ? extends ITagAttribute>         getAttributes();
        
    }


}

Back to the top