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