1
22
23 package com.liferay.portal.util;
24
25 import com.liferay.portal.kernel.log.Log;
26 import com.liferay.portal.kernel.log.LogFactoryUtil;
27 import com.liferay.portal.kernel.util.StringPool;
28 import com.liferay.portal.kernel.xml.Element;
29 import com.liferay.portal.kernel.xml.Namespace;
30
31 import java.util.Map;
32 import java.util.concurrent.ConcurrentHashMap;
33
34 import javax.xml.namespace.QName;
35
36
41 public class QNameUtil {
42
43 public static final String PUBLIC_RENDER_PARAMETER_NAMESPACE = "p_r_p_";
44
45 public static final String REMOVE_PUBLIC_RENDER_PARAMETER_NAMESPACE =
46 "r_p_r_p";
47
48 public static String getKey(QName qName) {
49 return getKey(qName.getNamespaceURI(), qName.getLocalPart());
50 }
51
52 public static String getKey(String uri, String localPart) {
53 StringBuilder sb = new StringBuilder();
54
55 sb.append(uri);
56 sb.append(_KEY_SEPARATOR);
57 sb.append(localPart);
58
59 return sb.toString();
60 }
61
62 public static String getPublicRenderParameterIdentifier(
63 String publicRenderParameterName) {
64
65 return _instance._getPublicRenderParameterIdentifier(
66 publicRenderParameterName);
67 }
68
69 public static String getPublicRenderParameterName(QName qName) {
70 return _instance._getPublicRenderParameterName(qName);
71 }
72
73 public static QName getQName(String publicRenderParameterName) {
74 return _instance._getQName(publicRenderParameterName);
75 }
76
77 public static QName getQName(
78 Element qNameEl, Element nameEl, String defaultNamespace) {
79
80 if ((qNameEl == null) && (nameEl == null)) {
81 _log.error("both qname and name elements are null");
82
83 return null;
84 }
85
86 if (qNameEl == null) {
87 return new QName(defaultNamespace, nameEl.getTextTrim());
88 }
89
90 String localPart = qNameEl.getTextTrim();
91
92 int pos = localPart.indexOf(StringPool.COLON);
93
94 if (pos == -1) {
95 if (_log.isDebugEnabled()) {
96 _log.debug("qname " + localPart + " does not have a prefix");
97 }
98
99 return new QName(localPart);
100 }
101
102 String prefix = localPart.substring(0, pos);
103
104 Namespace namespace = qNameEl.getNamespaceForPrefix(prefix);
105
106 if (namespace == null) {
107 if (_log.isWarnEnabled()) {
108 _log.warn(
109 "qname " + localPart + " does not have a valid namespace");
110 }
111
112 return null;
113 }
114
115 String uri = namespace.getURI();
116
117 localPart = localPart.substring(prefix.length() + 1);
118
119 return new QName(uri, localPart, prefix);
120 }
121
122 public static String getRemovePublicRenderParameterName(QName qName) {
123 return _instance._getRemovePublicRenderParameterName(qName);
124 }
125
126 public static void setPublicRenderParameterIdentifier(
127 String publicRenderParameterName, String identifier) {
128
129 _instance._setPublicRenderParameterIdentifier(
130 publicRenderParameterName, identifier);
131 }
132
133 private QNameUtil() {
134 _qNames = new ConcurrentHashMap<String, QName>();
135 _identifiers = new ConcurrentHashMap<String, String>();
136 }
137
138 private String _getPublicRenderParameterIdentifier(
139 String publicRenderParameterName) {
140
141 if (!publicRenderParameterName.startsWith(
142 PUBLIC_RENDER_PARAMETER_NAMESPACE) &&
143 !publicRenderParameterName.startsWith(
144 REMOVE_PUBLIC_RENDER_PARAMETER_NAMESPACE)) {
145
146 return null;
147 }
148
149 return _identifiers.get(publicRenderParameterName);
150 }
151
152 private String _getPublicRenderParameterName(QName qName) {
153 StringBuilder sb = new StringBuilder();
154
155 sb.append(PUBLIC_RENDER_PARAMETER_NAMESPACE);
156 sb.append(qName.getNamespaceURI().hashCode());
157 sb.append(StringPool.UNDERLINE);
158 sb.append(qName.getLocalPart());
159
160 String publicRenderParameterName = sb.toString();
161
162 if (!_qNames.containsKey(publicRenderParameterName)) {
163 _qNames.put(publicRenderParameterName, qName);
164 }
165
166 return publicRenderParameterName;
167 }
168
169 private QName _getQName(String publicRenderParameterName) {
170 if (!publicRenderParameterName.startsWith(
171 PUBLIC_RENDER_PARAMETER_NAMESPACE) &&
172 !publicRenderParameterName.startsWith(
173 REMOVE_PUBLIC_RENDER_PARAMETER_NAMESPACE)) {
174
175 return null;
176 }
177
178 return _qNames.get(publicRenderParameterName);
179 }
180
181 private String _getRemovePublicRenderParameterName(QName qName) {
182 StringBuilder sb = new StringBuilder();
183
184 sb.append(REMOVE_PUBLIC_RENDER_PARAMETER_NAMESPACE);
185 sb.append(qName.getNamespaceURI().hashCode());
186 sb.append(StringPool.UNDERLINE);
187 sb.append(qName.getLocalPart());
188
189 String removePublicRenderParameterName = sb.toString();
190
191 if (!_qNames.containsKey(removePublicRenderParameterName)) {
192 _qNames.put(removePublicRenderParameterName, qName);
193 }
194
195 return removePublicRenderParameterName;
196 }
197
198 private void _setPublicRenderParameterIdentifier(
199 String publicRenderParameterName, String identifier) {
200
201 _identifiers.put(publicRenderParameterName, identifier);
202 }
203
204 private static final String _KEY_SEPARATOR = "_KEY_";
205
206 private static Log _log = LogFactoryUtil.getLog(QNameUtil.class);
207
208 private static QNameUtil _instance = new QNameUtil();
209
210 private Map<String, QName> _qNames;
211 private Map<String, String> _identifiers;
212
213 }