001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.spring.transaction;
016    
017    import com.liferay.portal.kernel.transaction.TransactionAttribute;
018    import com.liferay.portal.kernel.transaction.TransactionInvoker;
019    import com.liferay.portal.kernel.transaction.TransactionStatus;
020    
021    import java.lang.reflect.AccessibleObject;
022    import java.lang.reflect.Method;
023    
024    import java.util.concurrent.Callable;
025    
026    import org.aopalliance.intercept.MethodInvocation;
027    
028    import org.springframework.transaction.PlatformTransactionManager;
029    import org.springframework.transaction.support.DefaultTransactionStatus;
030    
031    /**
032     * @author Shuyang Zhou
033     */
034    public class TransactionInvokerImpl implements TransactionInvoker {
035    
036            @Override
037            public <T> T invoke(
038                            TransactionAttribute transactionAttribute, Callable<T> callable)
039                    throws Throwable {
040    
041                    return (T)_transactionExecutor.execute(
042                            _platformTransactionManager,
043                            TransactionAttributeBuilder.build(
044                                    true, transactionAttribute.getIsolation(),
045                                    transactionAttribute.getPropagation(),
046                                    transactionAttribute.isReadOnly(),
047                                    transactionAttribute.getTimeout(),
048                                    transactionAttribute.getRollbackForClasses(),
049                                    transactionAttribute.getRollbackForClassNames(),
050                                    transactionAttribute.getNoRollbackForClasses(),
051                                    transactionAttribute.getNoRollbackForClassNames()),
052                            new CallableMethodInvocation(callable));
053            }
054    
055            public void setPlatformTransactionManager(
056                    PlatformTransactionManager platformTransactionManager) {
057    
058                    _platformTransactionManager = platformTransactionManager;
059            }
060    
061            public void setTransactionExecutor(
062                    TransactionExecutor transactionExecutor) {
063    
064                    _transactionExecutor = transactionExecutor;
065            }
066    
067            protected static org.springframework.transaction.TransactionStatus
068                    toTransactionStatus(TransactionStatus transactionStatus) {
069    
070                    DefaultTransactionStatus defaultTransactionStatus =
071                            new DefaultTransactionStatus(
072                                    null, transactionStatus.isNewTransaction(), false, false, false,
073                                    null);
074    
075                    if (transactionStatus.isCompleted()) {
076                            defaultTransactionStatus.setCompleted();
077                    }
078    
079                    if (transactionStatus.isRollbackOnly()) {
080                            defaultTransactionStatus.setRollbackOnly();
081                    }
082    
083                    return defaultTransactionStatus;
084            }
085    
086            private static PlatformTransactionManager _platformTransactionManager;
087            private static TransactionExecutor _transactionExecutor;
088    
089            private static class CallableMethodInvocation implements MethodInvocation {
090    
091                    @Override
092                    public Object[] getArguments() {
093                            throw new UnsupportedOperationException();
094                    }
095    
096                    @Override
097                    public Method getMethod() {
098                            throw new UnsupportedOperationException();
099                    }
100    
101                    @Override
102                    public AccessibleObject getStaticPart() {
103                            throw new UnsupportedOperationException();
104                    }
105    
106                    @Override
107                    public Object getThis() {
108                            throw new UnsupportedOperationException();
109                    }
110    
111                    @Override
112                    public Object proceed() throws Throwable {
113                            return _callable.call();
114                    }
115    
116                    private CallableMethodInvocation(Callable<?> callable) {
117                            _callable = callable;
118                    }
119    
120                    private final Callable<?> _callable;
121    
122            }
123    
124    }