001
014
015 package com.liferay.portal.util;
016
017 import com.liferay.portal.kernel.bean.PortalBeanLocatorUtil;
018 import com.liferay.portal.kernel.security.pacl.DoPrivileged;
019 import com.liferay.portal.kernel.util.ArrayUtil;
020 import com.liferay.portal.kernel.util.ServiceBeanMethodInvocationFactory;
021 import com.liferay.portal.kernel.util.StringUtil;
022 import com.liferay.portal.spring.aop.ServiceBeanMethodInvocation;
023
024 import java.lang.reflect.Method;
025
026 import java.util.ArrayList;
027 import java.util.HashMap;
028 import java.util.List;
029 import java.util.Map;
030
031 import org.aopalliance.intercept.MethodInterceptor;
032
033
037 @DoPrivileged
038 public class ServiceBeanMethodInvocationFactoryImpl
039 implements ServiceBeanMethodInvocationFactory {
040
041 @Override
042 public Object proceed(
043 Object target, Class<?> targetClass, Method method,
044 Object[] arguments, String[] methodInterceptorBeanIds)
045 throws Exception {
046
047 if (ArrayUtil.isEmpty(methodInterceptorBeanIds)) {
048 throw new IllegalArgumentException(
049 "Method interceptor bean IDs array is empty");
050 }
051
052 ServiceBeanMethodInvocation serviceBeanMethodInvocation = create(
053 target, targetClass, method, arguments);
054
055 List<MethodInterceptor> methodInterceptors = getMethodInterceptors(
056 methodInterceptorBeanIds);
057
058 serviceBeanMethodInvocation.setMethodInterceptors(methodInterceptors);
059
060 try {
061 return serviceBeanMethodInvocation.proceed();
062 }
063 catch (Throwable t) {
064 if (t instanceof Exception) {
065 throw (Exception)t;
066 }
067
068 throw new Exception(t);
069 }
070 }
071
072 protected ServiceBeanMethodInvocation create(
073 Object target, Class<?> targetClass, Method method,
074 Object[] arguments) {
075
076 return new ServiceBeanMethodInvocation(
077 target, targetClass, method, arguments);
078 }
079
080 protected List<MethodInterceptor> getMethodInterceptors(
081 String... methodInterceptorBeanIds) {
082
083 String methodInterceptorsKey = StringUtil.merge(
084 methodInterceptorBeanIds);
085
086 List<MethodInterceptor> methodInterceptors = _methodInterceptors.get(
087 methodInterceptorsKey);
088
089 if (methodInterceptors != null) {
090 return methodInterceptors;
091 }
092
093 methodInterceptors = new ArrayList<>();
094
095 for (String methodInterceptorBeanId : methodInterceptorBeanIds) {
096 MethodInterceptor methodInterceptor =
097 (MethodInterceptor)PortalBeanLocatorUtil.locate(
098 methodInterceptorBeanId);
099
100 methodInterceptors.add(methodInterceptor);
101 }
102
103 _methodInterceptors.put(methodInterceptorsKey, methodInterceptors);
104
105 return methodInterceptors;
106 }
107
108 private final Map<String, List<MethodInterceptor>> _methodInterceptors =
109 new HashMap<>();
110
111 }