/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.spring.transaction;
import com.liferay.counter.kernel.service.CounterLocalServiceUtil;
import com.liferay.portal.kernel.bean.PortalBeanLocatorUtil;
import com.liferay.portal.kernel.cache.CacheRegistryUtil;
import com.liferay.portal.kernel.dao.orm.EntityCacheUtil;
import com.liferay.portal.kernel.model.ClassName;
import com.liferay.portal.kernel.service.ClassNameLocalServiceUtil;
import com.liferay.portal.kernel.service.persistence.ClassNameUtil;
import com.liferay.portal.kernel.util.InfrastructureUtil;
import com.liferay.portal.model.impl.ClassNameImpl;
import com.liferay.portal.spring.hibernate.PortletTransactionManager;
import com.liferay.portal.test.rule.LiferayIntegrationTestRule;
import org.junit.Assert;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.springframework.orm.hibernate3.HibernateTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionException;
import org.springframework.transaction.TransactionStatus;
/**
* @author Shuyang Zhou
*/
public class TransactionInterceptorTest {
@ClassRule
@Rule
public static final LiferayIntegrationTestRule liferayIntegrationTestRule =
new LiferayIntegrationTestRule();
@Test
public void testFailOnCommit() {
CacheRegistryUtil.clear();
long classNameId = CounterLocalServiceUtil.increment();
ClassName className = ClassNameUtil.create(classNameId);
HibernateTransactionManager hibernateTransactionManager =
(HibernateTransactionManager)
InfrastructureUtil.getTransactionManager();
MockPlatformTransactionManager platformTransactionManagerWrapper =
new MockPlatformTransactionManager(hibernateTransactionManager);
TransactionInterceptor transactionInterceptor =
(TransactionInterceptor)PortalBeanLocatorUtil.locate(
"transactionAdvice");
transactionInterceptor.setPlatformTransactionManager(
platformTransactionManagerWrapper);
try {
ClassNameLocalServiceUtil.addClassName(className);
Assert.fail();
}
catch (RuntimeException re) {
Assert.assertEquals(
"MockPlatformTransactionManager", re.getMessage());
}
finally {
transactionInterceptor.setPlatformTransactionManager(
hibernateTransactionManager);
}
ClassName cachedClassName = (ClassName)EntityCacheUtil.getResult(
true, ClassNameImpl.class, classNameId);
Assert.assertNull(cachedClassName);
}
private static class MockPlatformTransactionManager
extends PortletTransactionManager {
public MockPlatformTransactionManager(
HibernateTransactionManager hibernateTransactionManager) {
super(
hibernateTransactionManager,
hibernateTransactionManager.getSessionFactory());
_platformTransactionManager = hibernateTransactionManager;
}
@Override
public void commit(TransactionStatus transactionStatus)
throws TransactionException {
_platformTransactionManager.rollback(transactionStatus);
throw new RuntimeException("MockPlatformTransactionManager");
}
@Override
public TransactionStatus getTransaction(
TransactionDefinition transactionDefinition)
throws TransactionException {
return _platformTransactionManager.getTransaction(
transactionDefinition);
}
@Override
public void rollback(TransactionStatus transactionStatus)
throws TransactionException {
_platformTransactionManager.rollback(transactionStatus);
}
private final PlatformTransactionManager _platformTransactionManager;
}
}