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.util.concurrent.Callable;
022    
023    import org.springframework.transaction.support.DefaultTransactionStatus;
024    
025    /**
026     * @author Shuyang Zhou
027     */
028    public class TransactionInvokerImpl implements TransactionInvoker {
029    
030            @Override
031            public void commit(
032                    TransactionAttribute transactionAttribute,
033                    TransactionStatus transactionStatus) {
034    
035                    TransactionHandlerUtil.commit(
036                            TransactionAttributeBuilder.build(
037                                    true, transactionAttribute.getIsolation(),
038                                    transactionAttribute.getPropagation(),
039                                    transactionAttribute.isReadOnly(),
040                                    transactionAttribute.getTimeout(),
041                                    transactionAttribute.getRollbackForClasses(),
042                                    transactionAttribute.getRollbackForClassNames(),
043                                    transactionAttribute.getNoRollbackForClasses(),
044                                    transactionAttribute.getNoRollbackForClassNames()),
045                            toTransactionStatus(transactionStatus));
046            }
047    
048            @Override
049            public <T> T invoke(
050                            TransactionAttribute transactionAttribute, Callable<T> callable)
051                    throws Throwable {
052    
053                    return TransactionHandlerUtil.invoke(
054                            TransactionAttributeBuilder.build(
055                                    true, transactionAttribute.getIsolation(),
056                                    transactionAttribute.getPropagation(),
057                                    transactionAttribute.isReadOnly(),
058                                    transactionAttribute.getTimeout(),
059                                    transactionAttribute.getRollbackForClasses(),
060                                    transactionAttribute.getRollbackForClassNames(),
061                                    transactionAttribute.getNoRollbackForClasses(),
062                                    transactionAttribute.getNoRollbackForClassNames()),
063                            callable);
064            }
065    
066            @Override
067            public void rollback(
068                            Throwable throwable, TransactionAttribute transactionAttribute,
069                            TransactionStatus transactionStatus)
070                    throws Throwable {
071    
072                    TransactionHandlerUtil.rollback(
073                            throwable,
074                            TransactionAttributeBuilder.build(
075                                    true, transactionAttribute.getIsolation(),
076                                    transactionAttribute.getPropagation(),
077                                    transactionAttribute.isReadOnly(),
078                                    transactionAttribute.getTimeout(),
079                                    transactionAttribute.getRollbackForClasses(),
080                                    transactionAttribute.getRollbackForClassNames(),
081                                    transactionAttribute.getNoRollbackForClasses(),
082                                    transactionAttribute.getNoRollbackForClassNames()),
083                            toTransactionStatus(transactionStatus));
084            }
085    
086            @Override
087            public TransactionStatus start(TransactionAttribute transactionAttribute) {
088                    org.springframework.transaction.TransactionStatus transactionStatus =
089                            TransactionHandlerUtil.start(
090                                    TransactionAttributeBuilder.build(
091                                            true, transactionAttribute.getIsolation(),
092                                            transactionAttribute.getPropagation(),
093                                            transactionAttribute.isReadOnly(),
094                                            transactionAttribute.getTimeout(),
095                                            transactionAttribute.getRollbackForClasses(),
096                                            transactionAttribute.getRollbackForClassNames(),
097                                            transactionAttribute.getNoRollbackForClasses(),
098                                            transactionAttribute.getNoRollbackForClassNames()));
099    
100                    return new TransactionStatus(
101                            transactionStatus.isNewTransaction(),
102                            transactionStatus.isRollbackOnly(),
103                            transactionStatus.isCompleted());
104            }
105    
106            protected static org.springframework.transaction.TransactionStatus
107                    toTransactionStatus(TransactionStatus transactionStatus) {
108    
109                    DefaultTransactionStatus defaultTransactionStatus =
110                            new DefaultTransactionStatus(
111                                    null, transactionStatus.isNewTransaction(), false, false, false,
112                                    null);
113    
114                    if (transactionStatus.isCompleted()) {
115                            defaultTransactionStatus.setCompleted();
116                    }
117    
118                    if (transactionStatus.isRollbackOnly()) {
119                            defaultTransactionStatus.setRollbackOnly();
120                    }
121    
122                    return defaultTransactionStatus;
123            }
124    
125    }