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.model.Portlet;
020 import com.liferay.portal.kernel.portlet.FriendlyURLMapper;
021 import com.liferay.portal.kernel.portlet.FriendlyURLMapperTracker;
022 import com.liferay.portal.kernel.portlet.Route;
023 import com.liferay.portal.kernel.portlet.Router;
024 import com.liferay.portal.kernel.util.StringUtil;
025 import com.liferay.portal.kernel.util.Validator;
026 import com.liferay.portal.kernel.xml.Document;
027 import com.liferay.portal.kernel.xml.Element;
028 import com.liferay.portal.kernel.xml.UnsecureSAXReaderUtil;
029 import com.liferay.registry.Filter;
030 import com.liferay.registry.Registry;
031 import com.liferay.registry.RegistryUtil;
032 import com.liferay.registry.ServiceReference;
033 import com.liferay.registry.ServiceRegistration;
034 import com.liferay.registry.ServiceTracker;
035 import com.liferay.registry.ServiceTrackerCustomizer;
036
037 import java.util.HashMap;
038 import java.util.List;
039 import java.util.Map;
040 import java.util.concurrent.ConcurrentHashMap;
041
042
045 public class FriendlyURLMapperTrackerImpl implements FriendlyURLMapperTracker {
046
047 public FriendlyURLMapperTrackerImpl(Portlet portlet) {
048 _portlet = portlet;
049
050 Registry registry = RegistryUtil.getRegistry();
051
052 Filter filter = registry.getFilter(
053 "(&(javax.portlet.name=" + portlet.getPortletId() +
054 ")(objectClass=" + FriendlyURLMapper.class.getName() + "))");
055
056 _serviceTracker = registry.trackServices(
057 filter, new FriendlyURLMapperServiceTrackerCustomizer());
058
059 _serviceTracker.open();
060 }
061
062 @Override
063 public void close() {
064 for (Map.Entry<FriendlyURLMapper, ServiceRegistration<?>> entry :
065 _serviceRegistrations.entrySet()) {
066
067 ServiceRegistration<?> serviceRegistration = entry.getValue();
068
069 serviceRegistration.unregister();
070 }
071
072 _serviceTracker.close();
073 }
074
075 @Override
076 public FriendlyURLMapper getFriendlyURLMapper() {
077 return _serviceTracker.getService();
078 }
079
080 @Override
081 public void register(FriendlyURLMapper friendlyURLMapper) {
082 Registry registry = RegistryUtil.getRegistry();
083
084 Map<String, Object> properties = new HashMap<>();
085
086 properties.put("javax.portlet.name", _portlet.getPortletId());
087
088 ServiceRegistration<?> serviceRegistration = registry.registerService(
089 FriendlyURLMapper.class, friendlyURLMapper, properties);
090
091 _serviceRegistrations.put(friendlyURLMapper, serviceRegistration);
092 }
093
094 @Override
095 public void unregister(FriendlyURLMapper friendlyURLMapper) {
096 ServiceRegistration<?> serviceRegistration =
097 _serviceRegistrations.remove(friendlyURLMapper);
098
099 if (serviceRegistration != null) {
100 serviceRegistration.unregister();
101 }
102 }
103
104 private static final Log _log = LogFactoryUtil.getLog(
105 FriendlyURLMapperTrackerImpl.class);
106
107 private final Portlet _portlet;
108 private final Map<FriendlyURLMapper, ServiceRegistration<?>>
109 _serviceRegistrations = new ConcurrentHashMap<>();
110 private final ServiceTracker<FriendlyURLMapper, FriendlyURLMapper>
111 _serviceTracker;
112
113 private class FriendlyURLMapperServiceTrackerCustomizer
114 implements
115 ServiceTrackerCustomizer<FriendlyURLMapper, FriendlyURLMapper> {
116
117 @Override
118 public FriendlyURLMapper addingService(
119 ServiceReference<FriendlyURLMapper> serviceReference) {
120
121 Registry registry = RegistryUtil.getRegistry();
122
123 FriendlyURLMapper friendlyURLMapper = registry.getService(
124 serviceReference);
125
126 try {
127 if (Validator.isNotNull(_portlet.getFriendlyURLMapping())) {
128 friendlyURLMapper.setMapping(
129 _portlet.getFriendlyURLMapping());
130 }
131
132 friendlyURLMapper.setPortletId(_portlet.getPortletId());
133 friendlyURLMapper.setPortletInstanceable(
134 _portlet.isInstanceable());
135
136 String friendlyURLRoutes = (String)serviceReference.getProperty(
137 "com.liferay.portlet.friendly-url-routes");
138
139 if (Validator.isNotNull(_portlet.getFriendlyURLRoutes())) {
140 friendlyURLRoutes = _portlet.getFriendlyURLRoutes();
141 }
142
143 String xml = null;
144
145 if (Validator.isNotNull(friendlyURLRoutes)) {
146 Class<?> clazz = friendlyURLMapper.getClass();
147
148 ClassLoader classLoader = clazz.getClassLoader();
149
150 xml = StringUtil.read(classLoader, friendlyURLRoutes);
151 }
152
153 friendlyURLMapper.setRouter(newFriendlyURLRouter(xml));
154 }
155 catch (Exception e) {
156 _log.error(e, e);
157
158 return null;
159 }
160
161 return friendlyURLMapper;
162 }
163
164 @Override
165 public void modifiedService(
166 ServiceReference<FriendlyURLMapper> serviceReference,
167 FriendlyURLMapper friendlyURLMapper) {
168 }
169
170 @Override
171 public void removedService(
172 ServiceReference<FriendlyURLMapper> serviceReference,
173 FriendlyURLMapper friendlyURLMapper) {
174
175 Registry registry = RegistryUtil.getRegistry();
176
177 registry.ungetService(serviceReference);
178 }
179
180 protected Router newFriendlyURLRouter(String xml) throws Exception {
181 if (Validator.isNull(xml)) {
182 return null;
183 }
184
185 Document document = UnsecureSAXReaderUtil.read(xml, true);
186
187 Element rootElement = document.getRootElement();
188
189 List<Element> routeElements = rootElement.elements("route");
190
191 Router router = new RouterImpl(routeElements.size());
192
193 for (Element routeElement : routeElements) {
194 String pattern = routeElement.elementText("pattern");
195
196 Route route = router.addRoute(pattern);
197
198 for (Element generatedParameterElement :
199 routeElement.elements("generated-parameter")) {
200
201 String name = generatedParameterElement.attributeValue(
202 "name");
203 String value = generatedParameterElement.getText();
204
205 route.addGeneratedParameter(name, value);
206 }
207
208 for (Element ignoredParameterElement :
209 routeElement.elements("ignored-parameter")) {
210
211 String name = ignoredParameterElement.attributeValue(
212 "name");
213
214 route.addIgnoredParameter(name);
215 }
216
217 for (Element implicitParameterElement :
218 routeElement.elements("implicit-parameter")) {
219
220 String name = implicitParameterElement.attributeValue(
221 "name");
222 String value = implicitParameterElement.getText();
223
224 route.addImplicitParameter(name, value);
225 }
226
227 for (Element overriddenParameterElement :
228 routeElement.elements("overridden-parameter")) {
229
230 String name = overriddenParameterElement.attributeValue(
231 "name");
232 String value = overriddenParameterElement.getText();
233
234 route.addOverriddenParameter(name, value);
235 }
236 }
237
238 return router;
239 }
240
241 }
242
243 }