001
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
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 }