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