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