001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet;
016    
017    import com.liferay.portal.kernel.log.Log;
018    import com.liferay.portal.kernel.log.LogFactoryUtil;
019    import com.liferay.portal.kernel.portlet.PortletQName;
020    import com.liferay.portal.kernel.security.pacl.DoPrivileged;
021    import com.liferay.portal.kernel.util.CharPool;
022    import com.liferay.portal.kernel.util.StringBundler;
023    import com.liferay.portal.kernel.util.StringPool;
024    import com.liferay.portal.kernel.xml.Element;
025    import com.liferay.portal.kernel.xml.Namespace;
026    import com.liferay.portal.kernel.xml.QName;
027    import com.liferay.portal.kernel.xml.SAXReaderUtil;
028    
029    import java.util.Map;
030    import java.util.concurrent.ConcurrentHashMap;
031    
032    /**
033     * @author Brian Wing Shun Chan
034     */
035    @DoPrivileged
036    public class PortletQNameImpl implements PortletQName {
037    
038            @Override
039            public String getKey(QName qName) {
040                    return getKey(qName.getNamespaceURI(), qName.getLocalPart());
041            }
042    
043            @Override
044            public String getKey(String uri, String localPart) {
045                    return uri.concat(_KEY_SEPARATOR).concat(localPart);
046            }
047    
048            @Override
049            public String getPublicRenderParameterIdentifier(
050                    String publicRenderParameterName) {
051    
052                    if (!publicRenderParameterName.startsWith(
053                                    PUBLIC_RENDER_PARAMETER_NAMESPACE) &&
054                            !publicRenderParameterName.startsWith(
055                                    REMOVE_PUBLIC_RENDER_PARAMETER_NAMESPACE)) {
056    
057                            return null;
058                    }
059    
060                    return _identifiers.get(publicRenderParameterName);
061            }
062    
063            @Override
064            public String getPublicRenderParameterName(QName qName) {
065                    String publicRenderParameterName = _qNameStrings.get(qName);
066    
067                    if (publicRenderParameterName == null) {
068                            publicRenderParameterName = _toString(
069                                    PUBLIC_RENDER_PARAMETER_NAMESPACE, qName);
070    
071                            _qNames.put(publicRenderParameterName, qName);
072                            _qNameStrings.put(qName, publicRenderParameterName);
073                    }
074    
075                    return publicRenderParameterName;
076            }
077    
078            @Override
079            public QName getQName(
080                    Element qNameEl, Element nameEl, String defaultNamespace) {
081    
082                    if ((qNameEl == null) && (nameEl == null)) {
083                            _log.error("both qname and name elements are null");
084    
085                            return null;
086                    }
087    
088                    if (qNameEl == null) {
089                            return SAXReaderUtil.createQName(
090                                    nameEl.getTextTrim(),
091                                    SAXReaderUtil.createNamespace(defaultNamespace));
092                    }
093    
094                    String localPart = qNameEl.getTextTrim();
095    
096                    int pos = localPart.indexOf(CharPool.COLON);
097    
098                    if (pos == -1) {
099                            if (_log.isDebugEnabled()) {
100                                    _log.debug("qname " + localPart + " does not have a prefix");
101                            }
102    
103                            return SAXReaderUtil.createQName(localPart);
104                    }
105    
106                    String prefix = localPart.substring(0, pos);
107    
108                    Namespace namespace = qNameEl.getNamespaceForPrefix(prefix);
109    
110                    if (namespace == null) {
111                            if (_log.isWarnEnabled()) {
112                                    _log.warn(
113                                            "qname " + localPart + " does not have a valid namespace");
114                            }
115    
116                            return null;
117                    }
118    
119                    localPart = localPart.substring(prefix.length() + 1);
120    
121                    return SAXReaderUtil.createQName(localPart, namespace);
122            }
123    
124            @Override
125            public QName getQName(String publicRenderParameterName) {
126                    if (!publicRenderParameterName.startsWith(
127                                    PUBLIC_RENDER_PARAMETER_NAMESPACE) &&
128                            !publicRenderParameterName.startsWith(
129                                    REMOVE_PUBLIC_RENDER_PARAMETER_NAMESPACE)) {
130    
131                            return null;
132                    }
133    
134                    return _qNames.get(publicRenderParameterName);
135            }
136    
137            @Override
138            public String getRemovePublicRenderParameterName(QName qName) {
139                    String removePublicRenderParameterName = _qNameStrings.get(qName);
140    
141                    if (removePublicRenderParameterName == null) {
142                            removePublicRenderParameterName = _toString(
143                                    REMOVE_PUBLIC_RENDER_PARAMETER_NAMESPACE, qName);
144    
145                            _qNames.put(removePublicRenderParameterName, qName);
146                            _qNameStrings.put(qName, removePublicRenderParameterName);
147                    }
148    
149                    return removePublicRenderParameterName;
150            }
151    
152            @Override
153            public void setPublicRenderParameterIdentifier(
154                    String publicRenderParameterName, String identifier) {
155    
156                    _identifiers.put(publicRenderParameterName, identifier);
157            }
158    
159            private String _toString(String prefix, QName qName) {
160                    StringBundler sb = new StringBundler(6);
161    
162                    sb.append(prefix);
163                    sb.append(qName.getNamespacePrefix());
164                    sb.append(StringPool.UNDERLINE);
165                    sb.append(qName.getNamespaceURI());
166                    sb.append(StringPool.UNDERLINE);
167                    sb.append(qName.getLocalPart());
168    
169                    return sb.toString();
170            }
171    
172            private static final String _KEY_SEPARATOR = "_KEY_";
173    
174            private static final Log _log = LogFactoryUtil.getLog(
175                    PortletQNameImpl.class);
176    
177            private final Map<String, String> _identifiers = new ConcurrentHashMap<>();
178            private final Map<String, QName> _qNames = new ConcurrentHashMap<>();
179            private final Map<QName, String> _qNameStrings = new ConcurrentHashMap<>();
180    
181    }