001
014
015 package com.liferay.portal.jsonwebservice;
016
017 import com.liferay.portal.kernel.annotation.AnnotationLocator;
018 import com.liferay.portal.kernel.bean.BeanLocator;
019 import com.liferay.portal.kernel.bean.BeanLocatorException;
020 import com.liferay.portal.kernel.jsonwebservice.JSONWebService;
021 import com.liferay.portal.kernel.jsonwebservice.JSONWebServiceActionsManagerUtil;
022 import com.liferay.portal.kernel.jsonwebservice.JSONWebServiceMappingResolver;
023 import com.liferay.portal.kernel.jsonwebservice.JSONWebServiceMode;
024 import com.liferay.portal.kernel.jsonwebservice.JSONWebServiceNaming;
025 import com.liferay.portal.kernel.jsonwebservice.JSONWebServiceRegistrator;
026 import com.liferay.portal.kernel.jsonwebservice.JSONWebServiceScannerStrategy;
027 import com.liferay.portal.kernel.log.Log;
028 import com.liferay.portal.kernel.log.LogFactoryUtil;
029 import com.liferay.portal.util.PropsValues;
030
031 import java.lang.reflect.Method;
032
033 import java.util.HashMap;
034 import java.util.Map;
035
036
039 public class DefaultJSONWebServiceRegistrator
040 implements JSONWebServiceRegistrator {
041
042 public DefaultJSONWebServiceRegistrator() {
043 _jsonWebServiceNaming =
044 JSONWebServiceActionsManagerUtil.getJSONWebServiceNaming();
045
046 _jsonWebServiceMappingResolver = new JSONWebServiceMappingResolver(
047 _jsonWebServiceNaming);
048
049 _jsonWebServiceScannerStrategy =
050 new SpringJSONWebServiceScannerStrategy();
051 }
052
053 public DefaultJSONWebServiceRegistrator(
054 JSONWebServiceNaming jsonWebServiceNaming,
055 JSONWebServiceScannerStrategy jsonWebServiceScannerStrategy) {
056
057 _jsonWebServiceNaming = jsonWebServiceNaming;
058 _jsonWebServiceScannerStrategy = jsonWebServiceScannerStrategy;
059
060 _jsonWebServiceMappingResolver = new JSONWebServiceMappingResolver(
061 _jsonWebServiceNaming);
062 }
063
064 public DefaultJSONWebServiceRegistrator(
065 JSONWebServiceScannerStrategy jsonWebServiceScannerStrategy) {
066
067 this(
068 JSONWebServiceActionsManagerUtil.getJSONWebServiceNaming(),
069 jsonWebServiceScannerStrategy);
070 }
071
072 public void processAllBeans(
073 String contextName, String contextPath, BeanLocator beanLocator) {
074
075 if (beanLocator == null) {
076 return;
077 }
078
079 String[] beanNames = beanLocator.getNames();
080
081 for (String beanName : beanNames) {
082 processBean(contextName, contextPath, beanLocator, beanName);
083 }
084 }
085
086 public void processBean(
087 String contextName, String contextPath, BeanLocator beanLocator,
088 String beanName) {
089
090 if (!PropsValues.JSON_WEB_SERVICE_ENABLED) {
091 return;
092 }
093
094 Object bean = null;
095
096 try {
097 bean = beanLocator.locate(beanName);
098 }
099 catch (BeanLocatorException ble) {
100 return;
101 }
102
103 if (bean == null) {
104 return;
105 }
106
107 JSONWebService jsonWebService = AnnotationLocator.locate(
108 bean.getClass(), JSONWebService.class);
109
110 if (jsonWebService != null) {
111 try {
112 onJSONWebServiceBean(
113 contextName, contextPath, bean, jsonWebService);
114 }
115 catch (Exception e) {
116 _log.error(e, e);
117 }
118 }
119 }
120
121 @Override
122 public void processBean(
123 String contextName, String contextPath, Object bean) {
124
125 if (!PropsValues.JSON_WEB_SERVICE_ENABLED) {
126 return;
127 }
128
129 JSONWebService jsonWebService = AnnotationLocator.locate(
130 bean.getClass(), JSONWebService.class);
131
132 if (jsonWebService == null) {
133 return;
134 }
135
136 try {
137 onJSONWebServiceBean(
138 contextName, contextPath, bean, jsonWebService);
139 }
140 catch (Exception e) {
141 _log.error(e, e);
142 }
143 }
144
145 public void setWireViaUtil(boolean wireViaUtil) {
146 this._wireViaUtil = wireViaUtil;
147 }
148
149 protected Class<?> loadUtilClass(Class<?> implementationClass)
150 throws ClassNotFoundException {
151
152 if (_utilClasses == null) {
153 _utilClasses = new HashMap<>();
154 }
155
156 Class<?> utilClass = _utilClasses.get(implementationClass);
157
158 if (utilClass != null) {
159 return utilClass;
160 }
161
162 String utilClassName =
163 _jsonWebServiceNaming.convertServiceImplClassToUtilClassName(
164 implementationClass);
165
166 ClassLoader classLoader = implementationClass.getClassLoader();
167
168 utilClass = classLoader.loadClass(utilClassName);
169
170 _utilClasses.put(implementationClass, utilClass);
171
172 return utilClass;
173 }
174
175 protected void onJSONWebServiceBean(
176 String contextName, String contextPath, Object serviceBean,
177 JSONWebService jsonWebService)
178 throws Exception {
179
180 JSONWebServiceMode jsonWebServiceMode = JSONWebServiceMode.MANUAL;
181
182 if (jsonWebService != null) {
183 jsonWebServiceMode = jsonWebService.mode();
184 }
185
186 JSONWebServiceScannerStrategy.MethodDescriptor[] methodDescriptors =
187 _jsonWebServiceScannerStrategy.scan(serviceBean);
188
189 for (JSONWebServiceScannerStrategy.MethodDescriptor methodDescriptor :
190 methodDescriptors) {
191
192 Method method = methodDescriptor.getMethod();
193
194 JSONWebService methodJSONWebService = method.getAnnotation(
195 JSONWebService.class);
196
197 if (methodJSONWebService == null) {
198 if (!jsonWebServiceMode.equals(JSONWebServiceMode.AUTO)) {
199 continue;
200 }
201 }
202 else {
203 JSONWebServiceMode methodJSONWebServiceMode =
204 methodJSONWebService.mode();
205
206 if (methodJSONWebServiceMode.equals(
207 JSONWebServiceMode.IGNORE)) {
208
209 continue;
210 }
211 }
212
213 Class<?> serviceBeanClass = methodDescriptor.getDeclaringClass();
214
215 String httpMethod =
216 _jsonWebServiceMappingResolver.resolveHttpMethod(method);
217
218 if (!_jsonWebServiceNaming.isValidHttpMethod(httpMethod)) {
219 continue;
220 }
221
222 if (_wireViaUtil) {
223 Class<?> utilClass = loadUtilClass(serviceBeanClass);
224
225 try {
226 method = utilClass.getMethod(
227 method.getName(), method.getParameterTypes());
228 }
229 catch (NoSuchMethodException nsme) {
230 continue;
231 }
232 }
233
234 String path = _jsonWebServiceMappingResolver.resolvePath(
235 serviceBeanClass, method);
236
237 if (!_jsonWebServiceNaming.isIncludedPath(contextPath, path)) {
238 continue;
239 }
240
241 if (_jsonWebServiceNaming.isIncludedMethod(method)) {
242 if (_wireViaUtil) {
243 JSONWebServiceActionsManagerUtil.
244 registerJSONWebServiceAction(
245 contextName, contextPath,
246 method.getDeclaringClass(), method, path,
247 httpMethod);
248 }
249 else {
250 JSONWebServiceActionsManagerUtil.
251 registerJSONWebServiceAction(
252 contextName, contextPath, serviceBean,
253 serviceBeanClass, method, path, httpMethod);
254 }
255 }
256 }
257 }
258
259 private static final Log _log = LogFactoryUtil.getLog(
260 DefaultJSONWebServiceRegistrator.class);
261
262 private final JSONWebServiceMappingResolver _jsonWebServiceMappingResolver;
263 private final JSONWebServiceNaming _jsonWebServiceNaming;
264 private final JSONWebServiceScannerStrategy _jsonWebServiceScannerStrategy;
265 private Map<Class<?>, Class<?>> _utilClasses;
266 private boolean _wireViaUtil;
267
268 }