001
014
015 package com.liferay.portal.increment;
016
017 import com.liferay.portal.kernel.cache.key.CacheKeyGenerator;
018 import com.liferay.portal.kernel.cache.key.CacheKeyGeneratorUtil;
019 import com.liferay.portal.kernel.concurrent.BatchablePipe;
020 import com.liferay.portal.kernel.increment.BufferedIncrement;
021 import com.liferay.portal.kernel.increment.Increment;
022 import com.liferay.portal.kernel.increment.IncrementFactory;
023 import com.liferay.portal.kernel.messaging.DestinationNames;
024 import com.liferay.portal.kernel.messaging.MessageBusUtil;
025 import com.liferay.portal.kernel.util.StringUtil;
026 import com.liferay.portal.spring.aop.AnnotationChainableMethodAdvice;
027
028 import java.io.Serializable;
029
030 import java.lang.annotation.Annotation;
031
032 import org.aopalliance.intercept.MethodInvocation;
033
034
038 public class BufferedIncrementAdvice
039 extends AnnotationChainableMethodAdvice<BufferedIncrement> {
040
041 @Override
042 @SuppressWarnings("rawtypes")
043 public Object before(MethodInvocation methodInvocation) throws Throwable {
044 BufferedIncrement bufferedIncrement = findAnnotation(methodInvocation);
045
046 if (bufferedIncrement == _nullBufferedIncrement) {
047 return null;
048 }
049
050 Object[] arguments = methodInvocation.getArguments();
051
052 Object value = arguments[arguments.length - 1];
053
054 CacheKeyGenerator cacheKeyGenerator =
055 CacheKeyGeneratorUtil.getCacheKeyGenerator(
056 BufferedIncrementAdvice.class.getName());
057
058 cacheKeyGenerator.append(methodInvocation.toString());
059
060 for (int i = 0; i < arguments.length - 1; i++) {
061 cacheKeyGenerator.append(StringUtil.toHexString(arguments[i]));
062 }
063
064 Serializable batchKey = cacheKeyGenerator.finish();
065
066 Increment<?> increment = IncrementFactory.createIncrement(
067 bufferedIncrement.incrementClass(), value);
068
069 BufferedIncreasableEntry bufferedIncreasableEntry =
070 new BufferedIncreasableEntry(methodInvocation, batchKey, increment);
071
072 if (_batchablePipe.put(bufferedIncreasableEntry)) {
073 if (bufferedIncrement.parallel()) {
074 MessageBusUtil.sendMessage(
075 DestinationNames.BUFFERED_INCREMENT_PARALLEL,
076 _batchablePipe);
077 }
078 else {
079 MessageBusUtil.sendMessage(
080 DestinationNames.BUFFERED_INCREMENT_SERIAL, _batchablePipe);
081 }
082 }
083
084 return nullResult;
085 }
086
087 @Override
088 public BufferedIncrement getNullAnnotation() {
089 return _nullBufferedIncrement;
090 }
091
092 @SuppressWarnings("rawtypes")
093 private static BatchablePipe<String, BufferedIncreasableEntry>
094 _batchablePipe = new BatchablePipe<String, BufferedIncreasableEntry>();
095
096 private static BufferedIncrement _nullBufferedIncrement =
097 new BufferedIncrement() {
098
099 public Class<? extends Annotation> annotationType() {
100 return BufferedIncrement.class;
101 }
102
103 public Class<? extends Increment<?>> incrementClass() {
104 return null;
105 }
106
107 public boolean parallel() {
108 return true;
109 }
110
111 };
112
113 }