Jakarta EE 9 migration
Upgrades many dependency declarations; removes old EJB 2.x support and outdated Servlet-based integrations (Commons FileUpload, FreeMarker JSP support, Tiles). Closes gh-22093 Closes gh-25354 Closes gh-26185 Closes gh-27423 See gh-27424
This commit is contained in:
@@ -21,8 +21,7 @@ import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
import javax.persistence.PersistenceException;
|
||||
|
||||
import jakarta.persistence.PersistenceException;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.aop.framework.ProxyFactory;
|
||||
|
||||
@@ -16,8 +16,7 @@
|
||||
|
||||
package org.springframework.dao.annotation;
|
||||
|
||||
import javax.persistence.PersistenceException;
|
||||
|
||||
import jakarta.persistence.PersistenceException;
|
||||
import org.aspectj.lang.JoinPoint;
|
||||
import org.aspectj.lang.annotation.Aspect;
|
||||
import org.aspectj.lang.annotation.Before;
|
||||
|
||||
@@ -1,132 +0,0 @@
|
||||
/*
|
||||
* Copyright 2002-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.jca.cci;
|
||||
|
||||
import javax.resource.ResourceException;
|
||||
import javax.resource.cci.Connection;
|
||||
import javax.resource.cci.ConnectionFactory;
|
||||
import javax.resource.cci.Interaction;
|
||||
import javax.resource.cci.InteractionSpec;
|
||||
import javax.resource.cci.LocalTransaction;
|
||||
import javax.resource.cci.Record;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.dao.DataRetrievalFailureException;
|
||||
import org.springframework.jca.cci.connection.CciLocalTransactionManager;
|
||||
import org.springframework.jca.cci.core.CciTemplate;
|
||||
import org.springframework.transaction.TransactionStatus;
|
||||
import org.springframework.transaction.support.TransactionCallback;
|
||||
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
|
||||
import org.springframework.transaction.support.TransactionSynchronizationManager;
|
||||
import org.springframework.transaction.support.TransactionTemplate;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
/**
|
||||
* @author Thierry Templier
|
||||
* @author Chris Beams
|
||||
*/
|
||||
@Deprecated
|
||||
public class CciLocalTransactionTests {
|
||||
|
||||
/**
|
||||
* Test if a transaction ( begin / commit ) is executed on the
|
||||
* LocalTransaction when CciLocalTransactionManager is specified as
|
||||
* transaction manager.
|
||||
*/
|
||||
@Test
|
||||
public void testLocalTransactionCommit() throws ResourceException {
|
||||
final ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
LocalTransaction localTransaction = mock(LocalTransaction.class);
|
||||
final Record record = mock(Record.class);
|
||||
final InteractionSpec interactionSpec = mock(InteractionSpec.class);
|
||||
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connection.getLocalTransaction()).willReturn(localTransaction);
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(interaction.execute(interactionSpec, record, record)).willReturn(true);
|
||||
given(connection.getLocalTransaction()).willReturn(localTransaction);
|
||||
|
||||
CciLocalTransactionManager tm = new CciLocalTransactionManager();
|
||||
tm.setConnectionFactory(connectionFactory);
|
||||
TransactionTemplate tt = new TransactionTemplate(tm);
|
||||
|
||||
tt.execute(new TransactionCallbackWithoutResult() {
|
||||
@Override
|
||||
protected void doInTransactionWithoutResult(TransactionStatus status) {
|
||||
assertThat(TransactionSynchronizationManager.hasResource(connectionFactory)).as("Has thread connection").isTrue();
|
||||
CciTemplate ct = new CciTemplate(connectionFactory);
|
||||
ct.execute(interactionSpec, record, record);
|
||||
}
|
||||
});
|
||||
|
||||
verify(localTransaction).begin();
|
||||
verify(interaction).close();
|
||||
verify(localTransaction).commit();
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if a transaction ( begin / rollback ) is executed on the
|
||||
* LocalTransaction when CciLocalTransactionManager is specified as
|
||||
* transaction manager and a non-checked exception is thrown.
|
||||
*/
|
||||
@Test
|
||||
public void testLocalTransactionRollback() throws ResourceException {
|
||||
final ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
LocalTransaction localTransaction = mock(LocalTransaction.class);
|
||||
final Record record = mock(Record.class);
|
||||
final InteractionSpec interactionSpec = mock(InteractionSpec.class);
|
||||
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connection.getLocalTransaction()).willReturn(localTransaction);
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(interaction.execute(interactionSpec, record, record)).willReturn(true);
|
||||
given(connection.getLocalTransaction()).willReturn(localTransaction);
|
||||
|
||||
CciLocalTransactionManager tm = new CciLocalTransactionManager();
|
||||
tm.setConnectionFactory(connectionFactory);
|
||||
TransactionTemplate tt = new TransactionTemplate(tm);
|
||||
|
||||
try {
|
||||
tt.execute(new TransactionCallback<Void>() {
|
||||
@Override
|
||||
public Void doInTransaction(TransactionStatus status) {
|
||||
assertThat(TransactionSynchronizationManager.hasResource(connectionFactory)).as("Has thread connection").isTrue();
|
||||
CciTemplate ct = new CciTemplate(connectionFactory);
|
||||
ct.execute(interactionSpec, record, record);
|
||||
throw new DataRetrievalFailureException("error");
|
||||
}
|
||||
});
|
||||
}
|
||||
catch (Exception ex) {
|
||||
}
|
||||
|
||||
verify(localTransaction).begin();
|
||||
verify(interaction).close();
|
||||
verify(localTransaction).rollback();
|
||||
verify(connection).close();
|
||||
}
|
||||
}
|
||||
@@ -1,545 +0,0 @@
|
||||
/*
|
||||
* Copyright 2002-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.jca.cci;
|
||||
|
||||
import java.sql.SQLException;
|
||||
|
||||
import javax.resource.NotSupportedException;
|
||||
import javax.resource.ResourceException;
|
||||
import javax.resource.cci.Connection;
|
||||
import javax.resource.cci.ConnectionFactory;
|
||||
import javax.resource.cci.ConnectionSpec;
|
||||
import javax.resource.cci.IndexedRecord;
|
||||
import javax.resource.cci.Interaction;
|
||||
import javax.resource.cci.InteractionSpec;
|
||||
import javax.resource.cci.MappedRecord;
|
||||
import javax.resource.cci.Record;
|
||||
import javax.resource.cci.RecordFactory;
|
||||
import javax.resource.cci.ResultSet;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.jca.cci.connection.ConnectionSpecConnectionFactoryAdapter;
|
||||
import org.springframework.jca.cci.connection.NotSupportedRecordFactory;
|
||||
import org.springframework.jca.cci.core.CciTemplate;
|
||||
import org.springframework.jca.cci.core.ConnectionCallback;
|
||||
import org.springframework.jca.cci.core.InteractionCallback;
|
||||
import org.springframework.jca.cci.core.RecordCreator;
|
||||
import org.springframework.jca.cci.core.RecordExtractor;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
/**
|
||||
* @author Thierry Templier
|
||||
* @author Juergen Hoeller
|
||||
* @author Chris Beams
|
||||
*/
|
||||
@Deprecated
|
||||
public class CciTemplateTests {
|
||||
|
||||
@Test
|
||||
public void testCreateIndexedRecord() throws ResourceException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
RecordFactory recordFactory = mock(RecordFactory.class);
|
||||
IndexedRecord indexedRecord = mock(IndexedRecord.class);
|
||||
given(connectionFactory.getRecordFactory()).willReturn(recordFactory);
|
||||
given(recordFactory.createIndexedRecord("name")).willReturn(indexedRecord);
|
||||
|
||||
CciTemplate ct = new CciTemplate(connectionFactory);
|
||||
ct.createIndexedRecord("name");
|
||||
|
||||
verify(recordFactory).createIndexedRecord("name");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreateMappedRecord() throws ResourceException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
RecordFactory recordFactory = mock(RecordFactory.class);
|
||||
MappedRecord mappedRecord = mock(MappedRecord.class);
|
||||
|
||||
given(connectionFactory.getRecordFactory()).willReturn(recordFactory);
|
||||
given(recordFactory.createMappedRecord("name")).willReturn(mappedRecord);
|
||||
|
||||
CciTemplate ct = new CciTemplate(connectionFactory);
|
||||
ct.createMappedRecord("name");
|
||||
|
||||
verify(recordFactory).createMappedRecord("name");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTemplateExecuteInputOutput() throws ResourceException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
|
||||
Record inputRecord = mock(Record.class);
|
||||
Record outputRecord = mock(Record.class);
|
||||
|
||||
InteractionSpec interactionSpec = mock(InteractionSpec.class);
|
||||
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(interaction.execute(interactionSpec, inputRecord, outputRecord)).willReturn(true);
|
||||
|
||||
|
||||
CciTemplate ct = new CciTemplate(connectionFactory);
|
||||
ct.execute(interactionSpec, inputRecord, outputRecord);
|
||||
|
||||
verify(interaction).execute(interactionSpec, inputRecord, outputRecord);
|
||||
verify(interaction).close();
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTemplateExecuteWithCreatorAndRecordFactoryNotSupported()
|
||||
throws ResourceException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
|
||||
Record inputRecord = mock(Record.class);
|
||||
final Record outputRecord = mock(Record.class);
|
||||
|
||||
InteractionSpec interactionSpec = mock(InteractionSpec.class);
|
||||
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connectionFactory.getRecordFactory()).willThrow(new NotSupportedException("not supported"));
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(interaction.execute(interactionSpec, inputRecord, outputRecord)).willReturn(true);
|
||||
|
||||
CciTemplate ct = new CciTemplate(connectionFactory);
|
||||
ct.setOutputRecordCreator(new RecordCreator() {
|
||||
@Override
|
||||
public Record createRecord(RecordFactory recordFactory) {
|
||||
boolean condition = recordFactory instanceof NotSupportedRecordFactory;
|
||||
assertThat(condition).isTrue();
|
||||
return outputRecord;
|
||||
}
|
||||
});
|
||||
ct.execute(interactionSpec, inputRecord);
|
||||
|
||||
verify(interaction).execute(interactionSpec, inputRecord, outputRecord);
|
||||
verify(interaction).close();
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTemplateExecuteInputTrueWithCreator2()
|
||||
throws ResourceException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
RecordFactory recordFactory = mock(RecordFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
RecordCreator creator = mock(RecordCreator.class);
|
||||
|
||||
Record inputRecord = mock(Record.class);
|
||||
final Record outputRecord = mock(Record.class);
|
||||
|
||||
InteractionSpec interactionSpec = mock(InteractionSpec.class);
|
||||
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connectionFactory.getRecordFactory()).willReturn(recordFactory);
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(creator.createRecord(recordFactory)).willReturn(outputRecord);
|
||||
given(interaction.execute(interactionSpec, inputRecord, outputRecord)).willReturn(true);
|
||||
|
||||
CciTemplate ct = new CciTemplate(connectionFactory);
|
||||
ct.setOutputRecordCreator(creator);
|
||||
ct.execute(interactionSpec, inputRecord);
|
||||
|
||||
verify(interaction).execute(interactionSpec, inputRecord, outputRecord);
|
||||
verify(interaction).close();
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTemplateExecuteInputFalse() throws ResourceException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
|
||||
Record inputRecord = mock(Record.class);
|
||||
Record outputRecord = mock(Record.class);
|
||||
|
||||
InteractionSpec interactionSpec = mock(InteractionSpec.class);
|
||||
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(interaction.execute(interactionSpec, inputRecord)).willReturn(outputRecord);
|
||||
|
||||
CciTemplate ct = new CciTemplate(connectionFactory);
|
||||
ct.execute(interactionSpec, inputRecord);
|
||||
|
||||
verify(interaction).execute(interactionSpec, inputRecord);
|
||||
verify(interaction).close();
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test
|
||||
public void testTemplateExecuteInputExtractorTrueWithCreator()
|
||||
throws ResourceException, SQLException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
RecordFactory recordFactory = mock(RecordFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
RecordExtractor<Object> extractor = mock(RecordExtractor.class);
|
||||
RecordCreator creator = mock(RecordCreator.class);
|
||||
|
||||
Record inputRecord = mock(Record.class);
|
||||
Record outputRecord = mock(Record.class);
|
||||
|
||||
InteractionSpec interactionSpec = mock(InteractionSpec.class);
|
||||
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(connectionFactory.getRecordFactory()).willReturn(recordFactory);
|
||||
given(creator.createRecord(recordFactory)).willReturn(outputRecord);
|
||||
given(interaction.execute(interactionSpec, inputRecord, outputRecord)).willReturn(true);
|
||||
given(extractor.extractData(outputRecord)).willReturn(new Object());
|
||||
|
||||
CciTemplate ct = new CciTemplate(connectionFactory);
|
||||
ct.setOutputRecordCreator(creator);
|
||||
ct.execute(interactionSpec, inputRecord, extractor);
|
||||
|
||||
verify(extractor).extractData(outputRecord);
|
||||
verify(interaction).close();
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test
|
||||
public void testTemplateExecuteInputExtractorFalse()
|
||||
throws ResourceException, SQLException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
RecordExtractor<Object> extractor = mock(RecordExtractor.class);
|
||||
|
||||
Record inputRecord = mock(Record.class);
|
||||
Record outputRecord = mock(Record.class);
|
||||
|
||||
InteractionSpec interactionSpec = mock(InteractionSpec.class);
|
||||
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(interaction.execute(interactionSpec, inputRecord)).willReturn(outputRecord);
|
||||
given(extractor.extractData(outputRecord)).willReturn(new Object());
|
||||
|
||||
CciTemplate ct = new CciTemplate(connectionFactory);
|
||||
ct.execute(interactionSpec, inputRecord, extractor);
|
||||
|
||||
verify(extractor).extractData(outputRecord);
|
||||
verify(interaction).close();
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTemplateExecuteInputGeneratorTrueWithCreator()
|
||||
throws ResourceException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
RecordFactory recordFactory = mock(RecordFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
RecordCreator generator = mock(RecordCreator.class);
|
||||
RecordCreator creator = mock(RecordCreator.class);
|
||||
|
||||
Record inputRecord = mock(Record.class);
|
||||
Record outputRecord = mock(Record.class);
|
||||
|
||||
InteractionSpec interactionSpec = mock(InteractionSpec.class);
|
||||
|
||||
given(connectionFactory.getRecordFactory()).willReturn(recordFactory);
|
||||
given(generator.createRecord(recordFactory)).willReturn(inputRecord);
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(creator.createRecord(recordFactory)).willReturn(outputRecord);
|
||||
given(connectionFactory.getRecordFactory()).willReturn(recordFactory);
|
||||
given(interaction.execute(interactionSpec, inputRecord, outputRecord)).willReturn(true);
|
||||
|
||||
|
||||
CciTemplate ct = new CciTemplate(connectionFactory);
|
||||
ct.setOutputRecordCreator(creator);
|
||||
ct.execute(interactionSpec, generator);
|
||||
|
||||
verify(interaction).execute(interactionSpec, inputRecord, outputRecord);
|
||||
verify(interaction).close();
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTemplateExecuteInputGeneratorFalse()
|
||||
throws ResourceException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
RecordFactory recordFactory = mock(RecordFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
RecordCreator generator = mock(RecordCreator.class);
|
||||
|
||||
Record inputRecord = mock(Record.class);
|
||||
Record outputRecord = mock(Record.class);
|
||||
|
||||
InteractionSpec interactionSpec = mock(InteractionSpec.class);
|
||||
|
||||
given(connectionFactory.getRecordFactory()).willReturn(recordFactory);
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(generator.createRecord(recordFactory)).willReturn(inputRecord);
|
||||
given(interaction.execute(interactionSpec, inputRecord)).willReturn(outputRecord);
|
||||
|
||||
CciTemplate ct = new CciTemplate(connectionFactory);
|
||||
ct.execute(interactionSpec, generator);
|
||||
|
||||
verify(interaction).execute(interactionSpec, inputRecord);
|
||||
verify(interaction).close();
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test
|
||||
public void testTemplateExecuteInputGeneratorExtractorTrueWithCreator()
|
||||
throws ResourceException, SQLException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
RecordFactory recordFactory = mock(RecordFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
RecordCreator generator = mock(RecordCreator.class);
|
||||
RecordExtractor<Object> extractor = mock(RecordExtractor.class);
|
||||
RecordCreator creator = mock(RecordCreator.class);
|
||||
|
||||
Record inputRecord = mock(Record.class);
|
||||
Record outputRecord = mock(Record.class);
|
||||
|
||||
Object obj = new Object();
|
||||
|
||||
InteractionSpec interactionSpec = mock(InteractionSpec.class);
|
||||
|
||||
given(connectionFactory.getRecordFactory()).willReturn(recordFactory);
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(creator.createRecord(recordFactory)).willReturn(outputRecord);
|
||||
given(connectionFactory.getRecordFactory()).willReturn(recordFactory);
|
||||
given(generator.createRecord(recordFactory)).willReturn(inputRecord);
|
||||
given(interaction.execute(interactionSpec, inputRecord, outputRecord)).willReturn(true);
|
||||
given(extractor.extractData(outputRecord)).willReturn(obj);
|
||||
|
||||
CciTemplate ct = new CciTemplate(connectionFactory);
|
||||
ct.setOutputRecordCreator(creator);
|
||||
assertThat(ct.execute(interactionSpec, generator, extractor)).isEqualTo(obj);
|
||||
|
||||
verify(interaction).close();
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test
|
||||
public void testTemplateExecuteInputGeneratorExtractorFalse()
|
||||
throws ResourceException, SQLException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
RecordFactory recordFactory = mock(RecordFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
RecordCreator generator = mock(RecordCreator.class);
|
||||
RecordExtractor<Object> extractor = mock(RecordExtractor.class);
|
||||
|
||||
Record inputRecord = mock(Record.class);
|
||||
Record outputRecord = mock(Record.class);
|
||||
|
||||
InteractionSpec interactionSpec = mock(InteractionSpec.class);
|
||||
|
||||
given(connectionFactory.getRecordFactory()).willReturn(recordFactory);
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(generator.createRecord(recordFactory)).willReturn(inputRecord);
|
||||
given(interaction.execute(interactionSpec, inputRecord)).willReturn(outputRecord);
|
||||
given(extractor.extractData(outputRecord)).willReturn(new Object());
|
||||
|
||||
CciTemplate ct = new CciTemplate(connectionFactory);
|
||||
ct.execute(interactionSpec, generator, extractor);
|
||||
|
||||
verify(extractor).extractData(outputRecord);
|
||||
verify(interaction).close();
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTemplateExecuteInputOutputConnectionSpec() throws ResourceException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
ConnectionSpec connectionSpec = mock(ConnectionSpec.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
|
||||
Record inputRecord = mock(Record.class);
|
||||
Record outputRecord = mock(Record.class);
|
||||
|
||||
InteractionSpec interactionSpec = mock(InteractionSpec.class);
|
||||
|
||||
given(connectionFactory.getConnection(connectionSpec)).willReturn(connection);
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(interaction.execute(interactionSpec, inputRecord, outputRecord)).willReturn(true);
|
||||
|
||||
ConnectionSpecConnectionFactoryAdapter adapter = new ConnectionSpecConnectionFactoryAdapter();
|
||||
adapter.setTargetConnectionFactory(connectionFactory);
|
||||
adapter.setConnectionSpec(connectionSpec);
|
||||
CciTemplate ct = new CciTemplate(adapter);
|
||||
ct.execute(interactionSpec, inputRecord, outputRecord);
|
||||
|
||||
verify(interaction).execute(interactionSpec, inputRecord, outputRecord);
|
||||
verify(interaction).close();
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test
|
||||
public void testTemplateExecuteInputOutputResultsSetFalse()
|
||||
throws ResourceException, SQLException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
RecordFactory recordFactory = mock(RecordFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
Record record = mock(Record.class);
|
||||
ResultSet resultset = mock(ResultSet.class);
|
||||
RecordCreator generator = mock(RecordCreator.class);
|
||||
RecordExtractor<Object> extractor = mock(RecordExtractor.class);
|
||||
|
||||
InteractionSpec interactionSpec = mock(InteractionSpec.class);
|
||||
|
||||
given(connectionFactory.getRecordFactory()).willReturn(recordFactory);
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(generator.createRecord(recordFactory)).willReturn(record);
|
||||
given(interaction.execute(interactionSpec, record)).willReturn(resultset);
|
||||
given(extractor.extractData(resultset)).willReturn(new Object());
|
||||
|
||||
CciTemplate ct = new CciTemplate(connectionFactory);
|
||||
ct.execute(interactionSpec, generator, extractor);
|
||||
|
||||
verify(extractor).extractData(resultset);
|
||||
verify(resultset).close();
|
||||
verify(interaction).close();
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test
|
||||
public void testTemplateExecuteConnectionCallback()
|
||||
throws ResourceException, SQLException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
ConnectionCallback<Object> connectionCallback = mock(ConnectionCallback.class);
|
||||
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connectionCallback.doInConnection(connection, connectionFactory)).willReturn(new Object());
|
||||
|
||||
CciTemplate ct = new CciTemplate(connectionFactory);
|
||||
ct.execute(connectionCallback);
|
||||
|
||||
verify(connectionCallback).doInConnection(connection, connectionFactory);
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Test
|
||||
public void testTemplateExecuteInteractionCallback()
|
||||
throws ResourceException, SQLException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
InteractionCallback<Object> interactionCallback = mock(InteractionCallback.class);
|
||||
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(interactionCallback.doInInteraction(interaction,connectionFactory)).willReturn(new Object());
|
||||
|
||||
CciTemplate ct = new CciTemplate(connectionFactory);
|
||||
ct.execute(interactionCallback);
|
||||
|
||||
verify(interactionCallback).doInInteraction(interaction,connectionFactory);
|
||||
verify(interaction).close();
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTemplateExecuteInputTrueTrueWithCreator()
|
||||
throws ResourceException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
RecordCreator creator = mock(RecordCreator.class);
|
||||
|
||||
Record inputOutputRecord = mock(Record.class);
|
||||
|
||||
InteractionSpec interactionSpec = mock(InteractionSpec.class);
|
||||
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(interaction.execute(interactionSpec, inputOutputRecord, inputOutputRecord)).willReturn(true);
|
||||
|
||||
CciTemplate ct = new CciTemplate(connectionFactory);
|
||||
ct.setOutputRecordCreator(creator);
|
||||
ct.execute(interactionSpec, inputOutputRecord, inputOutputRecord);
|
||||
|
||||
verify(interaction).execute(interactionSpec, inputOutputRecord, inputOutputRecord);
|
||||
verify(interaction).close();
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTemplateExecuteInputTrueTrue() throws ResourceException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
Record inputOutputRecord = mock(Record.class);
|
||||
InteractionSpec interactionSpec = mock(InteractionSpec.class);
|
||||
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(interaction.execute(interactionSpec, inputOutputRecord, inputOutputRecord)).willReturn(true);
|
||||
|
||||
CciTemplate ct = new CciTemplate(connectionFactory);
|
||||
ct.execute(interactionSpec, inputOutputRecord, inputOutputRecord);
|
||||
|
||||
verify(interaction).execute(interactionSpec, inputOutputRecord, inputOutputRecord);
|
||||
verify(interaction).close();
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testTemplateExecuteInputFalseTrue() throws ResourceException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
Record inputOutputRecord = mock(Record.class);
|
||||
InteractionSpec interactionSpec = mock(InteractionSpec.class);
|
||||
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(interaction.execute(interactionSpec, inputOutputRecord)).willReturn(null);
|
||||
|
||||
CciTemplate ct = new CciTemplate(connectionFactory);
|
||||
Record tmpOutputRecord = ct.execute(interactionSpec, inputOutputRecord);
|
||||
assertThat(tmpOutputRecord).isNull();
|
||||
|
||||
verify(interaction).execute(interactionSpec, inputOutputRecord);
|
||||
verify(interaction).close();
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,217 +0,0 @@
|
||||
/*
|
||||
* Copyright 2002-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.jca.cci;
|
||||
|
||||
import javax.resource.ResourceException;
|
||||
import javax.resource.cci.Connection;
|
||||
import javax.resource.cci.ConnectionFactory;
|
||||
import javax.resource.cci.Interaction;
|
||||
import javax.resource.cci.InteractionSpec;
|
||||
import javax.resource.cci.Record;
|
||||
import javax.resource.cci.RecordFactory;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.jca.cci.core.RecordCreator;
|
||||
import org.springframework.jca.cci.object.MappingRecordOperation;
|
||||
import org.springframework.jca.cci.object.SimpleRecordOperation;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
/**
|
||||
* @author Thierry Templier
|
||||
* @author Chris Beams
|
||||
*/
|
||||
@Deprecated
|
||||
public class EisOperationTests {
|
||||
|
||||
@Test
|
||||
public void testSimpleRecordOperation() throws ResourceException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
|
||||
Record inputRecord = mock(Record.class);
|
||||
Record outputRecord = mock(Record.class);
|
||||
|
||||
InteractionSpec interactionSpec = mock(InteractionSpec.class);
|
||||
|
||||
SimpleRecordOperation query = new SimpleRecordOperation(connectionFactory, interactionSpec);
|
||||
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(interaction.execute(interactionSpec, inputRecord)).willReturn(outputRecord);
|
||||
|
||||
query.execute(inputRecord);
|
||||
|
||||
verify(interaction).execute(interactionSpec, inputRecord);
|
||||
verify(interaction).close();
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimpleRecordOperationWithExplicitOutputRecord() throws ResourceException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
|
||||
Record inputRecord = mock(Record.class);
|
||||
Record outputRecord = mock(Record.class);
|
||||
|
||||
InteractionSpec interactionSpec = mock(InteractionSpec.class);
|
||||
|
||||
SimpleRecordOperation operation = new SimpleRecordOperation(connectionFactory, interactionSpec);
|
||||
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(interaction.execute(interactionSpec, inputRecord, outputRecord)).willReturn(true);
|
||||
|
||||
operation.execute(inputRecord, outputRecord);
|
||||
|
||||
verify(interaction).execute(interactionSpec, inputRecord, outputRecord);
|
||||
verify(interaction).close();
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSimpleRecordOperationWithInputOutputRecord() throws ResourceException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
|
||||
Record inputOutputRecord = mock(Record.class);
|
||||
|
||||
InteractionSpec interactionSpec = mock(InteractionSpec.class);
|
||||
|
||||
SimpleRecordOperation query = new SimpleRecordOperation(connectionFactory, interactionSpec);
|
||||
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(interaction.execute(interactionSpec, inputOutputRecord, inputOutputRecord)).willReturn(true);
|
||||
|
||||
query.execute(inputOutputRecord, inputOutputRecord);
|
||||
|
||||
verify(interaction).execute(interactionSpec, inputOutputRecord, inputOutputRecord);
|
||||
verify(interaction).close();
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMappingRecordOperation() throws ResourceException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
RecordFactory recordFactory = mock(RecordFactory.class);
|
||||
|
||||
Record inputRecord = mock(Record.class);
|
||||
Record outputRecord = mock(Record.class);
|
||||
|
||||
InteractionSpec interactionSpec = mock(InteractionSpec.class);
|
||||
|
||||
QueryCallDetector callDetector = mock(QueryCallDetector.class);
|
||||
|
||||
MappingRecordOperationImpl query = new MappingRecordOperationImpl(connectionFactory, interactionSpec);
|
||||
query.setCallDetector(callDetector);
|
||||
|
||||
Object inObj = new Object();
|
||||
Object outObj = new Object();
|
||||
|
||||
given(connectionFactory.getRecordFactory()).willReturn(recordFactory);
|
||||
given(callDetector.callCreateInputRecord(recordFactory, inObj)).willReturn(inputRecord);
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(interaction.execute(interactionSpec, inputRecord)).willReturn(outputRecord);
|
||||
given(callDetector.callExtractOutputData(outputRecord)).willReturn(outObj);
|
||||
|
||||
assertThat(query.execute(inObj)).isSameAs(outObj);
|
||||
verify(interaction).close();
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMappingRecordOperationWithOutputRecordCreator() throws ResourceException {
|
||||
ConnectionFactory connectionFactory = mock(ConnectionFactory.class);
|
||||
Connection connection = mock(Connection.class);
|
||||
Interaction interaction = mock(Interaction.class);
|
||||
RecordFactory recordFactory = mock(RecordFactory.class);
|
||||
|
||||
Record inputRecord = mock(Record.class);
|
||||
Record outputRecord = mock(Record.class);
|
||||
|
||||
RecordCreator outputCreator = mock(RecordCreator.class);
|
||||
|
||||
InteractionSpec interactionSpec = mock(InteractionSpec.class);
|
||||
|
||||
QueryCallDetector callDetector = mock(QueryCallDetector.class);
|
||||
|
||||
MappingRecordOperationImpl query = new MappingRecordOperationImpl(connectionFactory, interactionSpec);
|
||||
query.setOutputRecordCreator(outputCreator);
|
||||
query.setCallDetector(callDetector);
|
||||
|
||||
Object inObj = new Object();
|
||||
Object outObj = new Object();
|
||||
|
||||
given(connectionFactory.getRecordFactory()).willReturn(recordFactory);
|
||||
given(callDetector.callCreateInputRecord(recordFactory, inObj)).willReturn(inputRecord);
|
||||
given(connectionFactory.getConnection()).willReturn(connection);
|
||||
given(connection.createInteraction()).willReturn(interaction);
|
||||
given(connectionFactory.getRecordFactory()).willReturn(recordFactory);
|
||||
given(outputCreator.createRecord(recordFactory)).willReturn(outputRecord);
|
||||
given(interaction.execute(interactionSpec, inputRecord, outputRecord)).willReturn(true);
|
||||
given(callDetector.callExtractOutputData(outputRecord)).willReturn(outObj);
|
||||
|
||||
assertThat(query.execute(inObj)).isSameAs(outObj);
|
||||
verify(interaction).close();
|
||||
verify(connection).close();
|
||||
}
|
||||
|
||||
|
||||
private class MappingRecordOperationImpl extends MappingRecordOperation {
|
||||
|
||||
private QueryCallDetector callDetector;
|
||||
|
||||
public MappingRecordOperationImpl(ConnectionFactory connectionFactory, InteractionSpec interactionSpec) {
|
||||
super(connectionFactory, interactionSpec);
|
||||
}
|
||||
|
||||
public void setCallDetector(QueryCallDetector callDetector) {
|
||||
this.callDetector = callDetector;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Record createInputRecord(RecordFactory recordFactory, Object inputObject) {
|
||||
return this.callDetector.callCreateInputRecord(recordFactory, inputObject);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Object extractOutputData(Record outputRecord) throws ResourceException {
|
||||
return this.callDetector.callExtractOutputData(outputRecord);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private interface QueryCallDetector {
|
||||
|
||||
Record callCreateInputRecord(RecordFactory recordFactory, Object inputObject);
|
||||
|
||||
Object callExtractOutputData(Record outputRecord);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -16,9 +16,8 @@
|
||||
|
||||
package org.springframework.jca.support;
|
||||
|
||||
import javax.resource.spi.ConnectionManager;
|
||||
import javax.resource.spi.ManagedConnectionFactory;
|
||||
|
||||
import jakarta.resource.spi.ConnectionManager;
|
||||
import jakarta.resource.spi.ManagedConnectionFactory;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2019 the original author or authors.
|
||||
* Copyright 2002-2021 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -16,10 +16,9 @@
|
||||
|
||||
package org.springframework.transaction;
|
||||
|
||||
import javax.transaction.Status;
|
||||
import javax.transaction.TransactionManager;
|
||||
import javax.transaction.UserTransaction;
|
||||
|
||||
import jakarta.transaction.Status;
|
||||
import jakarta.transaction.TransactionManager;
|
||||
import jakarta.transaction.UserTransaction;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
* Copyright 2002-2021 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -16,16 +16,15 @@
|
||||
|
||||
package org.springframework.transaction;
|
||||
|
||||
import javax.transaction.HeuristicMixedException;
|
||||
import javax.transaction.HeuristicRollbackException;
|
||||
import javax.transaction.NotSupportedException;
|
||||
import javax.transaction.RollbackException;
|
||||
import javax.transaction.Status;
|
||||
import javax.transaction.SystemException;
|
||||
import javax.transaction.Transaction;
|
||||
import javax.transaction.TransactionManager;
|
||||
import javax.transaction.UserTransaction;
|
||||
|
||||
import jakarta.transaction.HeuristicMixedException;
|
||||
import jakarta.transaction.HeuristicRollbackException;
|
||||
import jakarta.transaction.NotSupportedException;
|
||||
import jakarta.transaction.RollbackException;
|
||||
import jakarta.transaction.Status;
|
||||
import jakarta.transaction.SystemException;
|
||||
import jakarta.transaction.Transaction;
|
||||
import jakarta.transaction.TransactionManager;
|
||||
import jakarta.transaction.UserTransaction;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
|
||||
@@ -16,15 +16,16 @@
|
||||
|
||||
package org.springframework.transaction;
|
||||
|
||||
import javax.transaction.Status;
|
||||
import javax.transaction.Synchronization;
|
||||
import javax.transaction.xa.XAResource;
|
||||
|
||||
import jakarta.transaction.Status;
|
||||
import jakarta.transaction.Synchronization;
|
||||
|
||||
/**
|
||||
* @author Juergen Hoeller
|
||||
* @since 31.08.2004
|
||||
*/
|
||||
public class MockJtaTransaction implements javax.transaction.Transaction {
|
||||
public class MockJtaTransaction implements jakarta.transaction.Transaction {
|
||||
|
||||
private Synchronization synchronization;
|
||||
|
||||
|
||||
@@ -22,10 +22,9 @@ import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import javax.ejb.TransactionAttributeType;
|
||||
|
||||
import groovy.lang.GroovyObject;
|
||||
import groovy.lang.MetaClass;
|
||||
import jakarta.ejb.TransactionAttributeType;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.aop.framework.Advised;
|
||||
@@ -745,7 +744,7 @@ public class AnnotationTransactionAttributeSourceTests {
|
||||
private int age;
|
||||
|
||||
@Override
|
||||
@javax.ejb.TransactionAttribute(TransactionAttributeType.SUPPORTS)
|
||||
@jakarta.ejb.TransactionAttribute(TransactionAttributeType.SUPPORTS)
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
@@ -756,7 +755,7 @@ public class AnnotationTransactionAttributeSourceTests {
|
||||
}
|
||||
|
||||
@Override
|
||||
@javax.ejb.TransactionAttribute
|
||||
@jakarta.ejb.TransactionAttribute
|
||||
public int getAge() {
|
||||
return age;
|
||||
}
|
||||
@@ -768,7 +767,7 @@ public class AnnotationTransactionAttributeSourceTests {
|
||||
}
|
||||
|
||||
|
||||
@javax.ejb.TransactionAttribute(TransactionAttributeType.SUPPORTS)
|
||||
@jakarta.ejb.TransactionAttribute(TransactionAttributeType.SUPPORTS)
|
||||
static class Ejb3AnnotatedBean2 implements ITestBean1 {
|
||||
|
||||
private String name;
|
||||
@@ -786,7 +785,7 @@ public class AnnotationTransactionAttributeSourceTests {
|
||||
}
|
||||
|
||||
@Override
|
||||
@javax.ejb.TransactionAttribute
|
||||
@jakarta.ejb.TransactionAttribute
|
||||
public int getAge() {
|
||||
return age;
|
||||
}
|
||||
@@ -798,10 +797,10 @@ public class AnnotationTransactionAttributeSourceTests {
|
||||
}
|
||||
|
||||
|
||||
@javax.ejb.TransactionAttribute(TransactionAttributeType.SUPPORTS)
|
||||
@jakarta.ejb.TransactionAttribute(TransactionAttributeType.SUPPORTS)
|
||||
interface ITestEjb {
|
||||
|
||||
@javax.ejb.TransactionAttribute
|
||||
@jakarta.ejb.TransactionAttribute
|
||||
int getAge();
|
||||
|
||||
void setAge(int age);
|
||||
@@ -847,7 +846,7 @@ public class AnnotationTransactionAttributeSourceTests {
|
||||
private int age;
|
||||
|
||||
@Override
|
||||
@javax.transaction.Transactional(javax.transaction.Transactional.TxType.SUPPORTS)
|
||||
@jakarta.transaction.Transactional(jakarta.transaction.Transactional.TxType.SUPPORTS)
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
@@ -858,7 +857,7 @@ public class AnnotationTransactionAttributeSourceTests {
|
||||
}
|
||||
|
||||
@Override
|
||||
@javax.transaction.Transactional
|
||||
@jakarta.transaction.Transactional
|
||||
public int getAge() {
|
||||
return age;
|
||||
}
|
||||
@@ -870,7 +869,7 @@ public class AnnotationTransactionAttributeSourceTests {
|
||||
}
|
||||
|
||||
|
||||
@javax.transaction.Transactional(javax.transaction.Transactional.TxType.SUPPORTS)
|
||||
@jakarta.transaction.Transactional(jakarta.transaction.Transactional.TxType.SUPPORTS)
|
||||
static class JtaAnnotatedBean2 implements ITestBean1 {
|
||||
|
||||
private String name;
|
||||
@@ -888,7 +887,7 @@ public class AnnotationTransactionAttributeSourceTests {
|
||||
}
|
||||
|
||||
@Override
|
||||
@javax.transaction.Transactional
|
||||
@jakarta.transaction.Transactional
|
||||
public int getAge() {
|
||||
return age;
|
||||
}
|
||||
@@ -900,10 +899,10 @@ public class AnnotationTransactionAttributeSourceTests {
|
||||
}
|
||||
|
||||
|
||||
@javax.transaction.Transactional(javax.transaction.Transactional.TxType.SUPPORTS)
|
||||
@jakarta.transaction.Transactional(jakarta.transaction.Transactional.TxType.SUPPORTS)
|
||||
interface ITestJta {
|
||||
|
||||
@javax.transaction.Transactional
|
||||
@jakarta.transaction.Transactional
|
||||
int getAge();
|
||||
|
||||
void setAge(int age);
|
||||
|
||||
@@ -1,132 +0,0 @@
|
||||
/*
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.transaction.jta;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.transaction.Synchronization;
|
||||
|
||||
import com.ibm.wsspi.uow.UOWAction;
|
||||
import com.ibm.wsspi.uow.UOWActionException;
|
||||
import com.ibm.wsspi.uow.UOWException;
|
||||
import com.ibm.wsspi.uow.UOWManager;
|
||||
|
||||
/**
|
||||
* @author Juergen Hoeller
|
||||
*/
|
||||
public class MockUOWManager implements UOWManager {
|
||||
|
||||
private int type = UOW_TYPE_GLOBAL_TRANSACTION;
|
||||
|
||||
private boolean joined;
|
||||
|
||||
private int timeout;
|
||||
|
||||
private boolean rollbackOnly;
|
||||
|
||||
private int status = UOW_STATUS_NONE;
|
||||
|
||||
private final Map<Object, Object> resources = new HashMap<>();
|
||||
|
||||
private final List<Synchronization> synchronizations = new ArrayList<>();
|
||||
|
||||
|
||||
@Override
|
||||
public void runUnderUOW(int type, boolean join, UOWAction action) throws UOWActionException, UOWException {
|
||||
this.type = type;
|
||||
this.joined = join;
|
||||
try {
|
||||
this.status = UOW_STATUS_ACTIVE;
|
||||
action.run();
|
||||
this.status = (this.rollbackOnly ? UOW_STATUS_ROLLEDBACK : UOW_STATUS_COMMITTED);
|
||||
}
|
||||
catch (Error | RuntimeException ex) {
|
||||
this.status = UOW_STATUS_ROLLEDBACK;
|
||||
throw ex;
|
||||
}
|
||||
catch (Exception ex) {
|
||||
this.status = UOW_STATUS_ROLLEDBACK;
|
||||
throw new UOWActionException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getUOWType() {
|
||||
return this.type;
|
||||
}
|
||||
|
||||
public boolean getJoined() {
|
||||
return this.joined;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getLocalUOWId() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setUOWTimeout(int uowType, int timeout) {
|
||||
this.timeout = timeout;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getUOWTimeout() {
|
||||
return this.timeout;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setRollbackOnly() {
|
||||
this.rollbackOnly = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getRollbackOnly() {
|
||||
return this.rollbackOnly;
|
||||
}
|
||||
|
||||
public void setUOWStatus(int status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getUOWStatus() {
|
||||
return this.status;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void putResource(Object key, Object value) {
|
||||
this.resources.put(key, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getResource(Object key) throws NullPointerException {
|
||||
return this.resources.get(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void registerInterposedSynchronization(Synchronization sync) {
|
||||
this.synchronizations.add(sync);
|
||||
}
|
||||
|
||||
public List<Synchronization> getSynchronizations() {
|
||||
return this.synchronizations;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,656 +0,0 @@
|
||||
/*
|
||||
* Copyright 2002-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.transaction.jta;
|
||||
|
||||
import javax.transaction.RollbackException;
|
||||
import javax.transaction.Status;
|
||||
import javax.transaction.UserTransaction;
|
||||
|
||||
import com.ibm.wsspi.uow.UOWAction;
|
||||
import com.ibm.wsspi.uow.UOWException;
|
||||
import com.ibm.wsspi.uow.UOWManager;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.context.testfixture.jndi.ExpectedLookupTemplate;
|
||||
import org.springframework.dao.OptimisticLockingFailureException;
|
||||
import org.springframework.transaction.IllegalTransactionStateException;
|
||||
import org.springframework.transaction.NestedTransactionNotSupportedException;
|
||||
import org.springframework.transaction.TransactionDefinition;
|
||||
import org.springframework.transaction.TransactionStatus;
|
||||
import org.springframework.transaction.TransactionSystemException;
|
||||
import org.springframework.transaction.support.DefaultTransactionDefinition;
|
||||
import org.springframework.transaction.support.TransactionCallback;
|
||||
import org.springframework.transaction.support.TransactionSynchronizationManager;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
||||
import static org.mockito.BDDMockito.given;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
/**
|
||||
* @author Juergen Hoeller
|
||||
*/
|
||||
public class WebSphereUowTransactionManagerTests {
|
||||
|
||||
@Test
|
||||
public void uowManagerFoundInJndi() {
|
||||
MockUOWManager manager = new MockUOWManager();
|
||||
ExpectedLookupTemplate jndiTemplate =
|
||||
new ExpectedLookupTemplate(WebSphereUowTransactionManager.DEFAULT_UOW_MANAGER_NAME, manager);
|
||||
WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager();
|
||||
ptm.setJndiTemplate(jndiTemplate);
|
||||
ptm.afterPropertiesSet();
|
||||
|
||||
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
|
||||
assertThat(ptm.execute(definition, new TransactionCallback<String>() {
|
||||
@Override
|
||||
public String doInTransaction(TransactionStatus status) {
|
||||
return "result";
|
||||
}
|
||||
})).isEqualTo("result");
|
||||
|
||||
assertThat(manager.getUOWType()).isEqualTo(UOWManager.UOW_TYPE_GLOBAL_TRANSACTION);
|
||||
assertThat(manager.getJoined()).isFalse();
|
||||
assertThat(manager.getRollbackOnly()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void uowManagerAndUserTransactionFoundInJndi() throws Exception {
|
||||
UserTransaction ut = mock(UserTransaction.class);
|
||||
given(ut.getStatus()).willReturn( Status.STATUS_NO_TRANSACTION, Status.STATUS_ACTIVE, Status.STATUS_ACTIVE);
|
||||
|
||||
MockUOWManager manager = new MockUOWManager();
|
||||
ExpectedLookupTemplate jndiTemplate = new ExpectedLookupTemplate();
|
||||
jndiTemplate.addObject(WebSphereUowTransactionManager.DEFAULT_USER_TRANSACTION_NAME, ut);
|
||||
jndiTemplate.addObject(WebSphereUowTransactionManager.DEFAULT_UOW_MANAGER_NAME, manager);
|
||||
WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager();
|
||||
ptm.setJndiTemplate(jndiTemplate);
|
||||
ptm.afterPropertiesSet();
|
||||
|
||||
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
|
||||
TransactionStatus ts = ptm.getTransaction(definition);
|
||||
ptm.commit(ts);
|
||||
assertThat(ptm.execute(definition, new TransactionCallback<String>() {
|
||||
@Override
|
||||
public String doInTransaction(TransactionStatus status) {
|
||||
return "result";
|
||||
}
|
||||
})).isEqualTo("result");
|
||||
|
||||
assertThat(manager.getUOWType()).isEqualTo(UOWManager.UOW_TYPE_GLOBAL_TRANSACTION);
|
||||
assertThat(manager.getJoined()).isFalse();
|
||||
assertThat(manager.getRollbackOnly()).isFalse();
|
||||
verify(ut).begin();
|
||||
verify(ut).commit();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void propagationMandatoryFailsInCaseOfNoExistingTransaction() {
|
||||
MockUOWManager manager = new MockUOWManager();
|
||||
WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager);
|
||||
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
|
||||
definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_MANDATORY);
|
||||
|
||||
assertThatExceptionOfType(IllegalTransactionStateException.class).isThrownBy(() ->
|
||||
ptm.execute(definition, new TransactionCallback<String>() {
|
||||
@Override
|
||||
public String doInTransaction(TransactionStatus status) {
|
||||
return "result";
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newTransactionSynchronizationUsingPropagationSupports() {
|
||||
doTestNewTransactionSynchronization(
|
||||
TransactionDefinition.PROPAGATION_SUPPORTS, WebSphereUowTransactionManager.SYNCHRONIZATION_ALWAYS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newTransactionSynchronizationUsingPropagationNotSupported() {
|
||||
doTestNewTransactionSynchronization(
|
||||
TransactionDefinition.PROPAGATION_NOT_SUPPORTED, WebSphereUowTransactionManager.SYNCHRONIZATION_ALWAYS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newTransactionSynchronizationUsingPropagationNever() {
|
||||
doTestNewTransactionSynchronization(
|
||||
TransactionDefinition.PROPAGATION_NEVER, WebSphereUowTransactionManager.SYNCHRONIZATION_ALWAYS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newTransactionSynchronizationUsingPropagationSupportsAndSynchOnActual() {
|
||||
doTestNewTransactionSynchronization(
|
||||
TransactionDefinition.PROPAGATION_SUPPORTS, WebSphereUowTransactionManager.SYNCHRONIZATION_ON_ACTUAL_TRANSACTION);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newTransactionSynchronizationUsingPropagationNotSupportedAndSynchOnActual() {
|
||||
doTestNewTransactionSynchronization(
|
||||
TransactionDefinition.PROPAGATION_NOT_SUPPORTED, WebSphereUowTransactionManager.SYNCHRONIZATION_ON_ACTUAL_TRANSACTION);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newTransactionSynchronizationUsingPropagationNeverAndSynchOnActual() {
|
||||
doTestNewTransactionSynchronization(
|
||||
TransactionDefinition.PROPAGATION_NEVER, WebSphereUowTransactionManager.SYNCHRONIZATION_ON_ACTUAL_TRANSACTION);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newTransactionSynchronizationUsingPropagationSupportsAndSynchNever() {
|
||||
doTestNewTransactionSynchronization(
|
||||
TransactionDefinition.PROPAGATION_SUPPORTS, WebSphereUowTransactionManager.SYNCHRONIZATION_NEVER);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newTransactionSynchronizationUsingPropagationNotSupportedAndSynchNever() {
|
||||
doTestNewTransactionSynchronization(
|
||||
TransactionDefinition.PROPAGATION_NOT_SUPPORTED, WebSphereUowTransactionManager.SYNCHRONIZATION_NEVER);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newTransactionSynchronizationUsingPropagationNeverAndSynchNever() {
|
||||
doTestNewTransactionSynchronization(
|
||||
TransactionDefinition.PROPAGATION_NEVER, WebSphereUowTransactionManager.SYNCHRONIZATION_NEVER);
|
||||
}
|
||||
|
||||
private void doTestNewTransactionSynchronization(int propagationBehavior, final int synchMode) {
|
||||
MockUOWManager manager = new MockUOWManager();
|
||||
WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager);
|
||||
ptm.setTransactionSynchronization(synchMode);
|
||||
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
|
||||
definition.setPropagationBehavior(propagationBehavior);
|
||||
definition.setReadOnly(true);
|
||||
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
|
||||
assertThat(ptm.execute(definition, new TransactionCallback<String>() {
|
||||
@Override
|
||||
public String doInTransaction(TransactionStatus status) {
|
||||
if (synchMode == WebSphereUowTransactionManager.SYNCHRONIZATION_ALWAYS) {
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isTrue();
|
||||
}
|
||||
else {
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
}
|
||||
return "result";
|
||||
}
|
||||
})).isEqualTo("result");
|
||||
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
|
||||
assertThat(manager.getUOWTimeout()).isEqualTo(0);
|
||||
assertThat(manager.getUOWType()).isEqualTo(UOWManager.UOW_TYPE_LOCAL_TRANSACTION);
|
||||
assertThat(manager.getJoined()).isFalse();
|
||||
assertThat(manager.getRollbackOnly()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newTransactionWithCommitUsingPropagationRequired() {
|
||||
doTestNewTransactionWithCommit(
|
||||
TransactionDefinition.PROPAGATION_REQUIRED, WebSphereUowTransactionManager.SYNCHRONIZATION_ALWAYS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newTransactionWithCommitUsingPropagationRequiresNew() {
|
||||
doTestNewTransactionWithCommit(
|
||||
TransactionDefinition.PROPAGATION_REQUIRES_NEW, WebSphereUowTransactionManager.SYNCHRONIZATION_ALWAYS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newTransactionWithCommitUsingPropagationNested() {
|
||||
doTestNewTransactionWithCommit(
|
||||
TransactionDefinition.PROPAGATION_NESTED, WebSphereUowTransactionManager.SYNCHRONIZATION_ALWAYS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newTransactionWithCommitUsingPropagationRequiredAndSynchOnActual() {
|
||||
doTestNewTransactionWithCommit(
|
||||
TransactionDefinition.PROPAGATION_REQUIRED, WebSphereUowTransactionManager.SYNCHRONIZATION_ON_ACTUAL_TRANSACTION);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newTransactionWithCommitUsingPropagationRequiresNewAndSynchOnActual() {
|
||||
doTestNewTransactionWithCommit(
|
||||
TransactionDefinition.PROPAGATION_REQUIRES_NEW, WebSphereUowTransactionManager.SYNCHRONIZATION_ON_ACTUAL_TRANSACTION);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newTransactionWithCommitUsingPropagationNestedAndSynchOnActual() {
|
||||
doTestNewTransactionWithCommit(
|
||||
TransactionDefinition.PROPAGATION_NESTED, WebSphereUowTransactionManager.SYNCHRONIZATION_ON_ACTUAL_TRANSACTION);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newTransactionWithCommitUsingPropagationRequiredAndSynchNever() {
|
||||
doTestNewTransactionWithCommit(
|
||||
TransactionDefinition.PROPAGATION_REQUIRED, WebSphereUowTransactionManager.SYNCHRONIZATION_NEVER);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newTransactionWithCommitUsingPropagationRequiresNewAndSynchNever() {
|
||||
doTestNewTransactionWithCommit(
|
||||
TransactionDefinition.PROPAGATION_REQUIRES_NEW, WebSphereUowTransactionManager.SYNCHRONIZATION_NEVER);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newTransactionWithCommitUsingPropagationNestedAndSynchNever() {
|
||||
doTestNewTransactionWithCommit(
|
||||
TransactionDefinition.PROPAGATION_NESTED, WebSphereUowTransactionManager.SYNCHRONIZATION_NEVER);
|
||||
}
|
||||
|
||||
private void doTestNewTransactionWithCommit(int propagationBehavior, final int synchMode) {
|
||||
MockUOWManager manager = new MockUOWManager();
|
||||
WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager);
|
||||
ptm.setTransactionSynchronization(synchMode);
|
||||
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
|
||||
definition.setPropagationBehavior(propagationBehavior);
|
||||
definition.setReadOnly(true);
|
||||
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
|
||||
assertThat(ptm.execute(definition, new TransactionCallback<String>() {
|
||||
@Override
|
||||
public String doInTransaction(TransactionStatus status) {
|
||||
if (synchMode != WebSphereUowTransactionManager.SYNCHRONIZATION_NEVER) {
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isTrue();
|
||||
}
|
||||
else {
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
}
|
||||
return "result";
|
||||
}
|
||||
})).isEqualTo("result");
|
||||
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
|
||||
assertThat(manager.getUOWTimeout()).isEqualTo(0);
|
||||
assertThat(manager.getUOWType()).isEqualTo(UOWManager.UOW_TYPE_GLOBAL_TRANSACTION);
|
||||
assertThat(manager.getJoined()).isFalse();
|
||||
assertThat(manager.getRollbackOnly()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newTransactionWithCommitAndTimeout() {
|
||||
MockUOWManager manager = new MockUOWManager();
|
||||
WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager);
|
||||
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
|
||||
definition.setTimeout(10);
|
||||
definition.setReadOnly(true);
|
||||
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
|
||||
assertThat(ptm.execute(definition, new TransactionCallback<String>() {
|
||||
@Override
|
||||
public String doInTransaction(TransactionStatus status) {
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isTrue();
|
||||
return "result";
|
||||
}
|
||||
})).isEqualTo("result");
|
||||
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
|
||||
assertThat(manager.getUOWTimeout()).isEqualTo(10);
|
||||
assertThat(manager.getUOWType()).isEqualTo(UOWManager.UOW_TYPE_GLOBAL_TRANSACTION);
|
||||
assertThat(manager.getJoined()).isFalse();
|
||||
assertThat(manager.getRollbackOnly()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newTransactionWithCommitException() {
|
||||
final RollbackException rex = new RollbackException();
|
||||
MockUOWManager manager = new MockUOWManager() {
|
||||
@Override
|
||||
public void runUnderUOW(int type, boolean join, UOWAction action) throws UOWException {
|
||||
throw new UOWException(rex);
|
||||
}
|
||||
};
|
||||
WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager);
|
||||
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
|
||||
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
|
||||
assertThatExceptionOfType(TransactionSystemException.class).isThrownBy(() ->
|
||||
ptm.execute(definition, new TransactionCallback<String>() {
|
||||
@Override
|
||||
public String doInTransaction(TransactionStatus status) {
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
return "result";
|
||||
}
|
||||
}))
|
||||
.withCauseInstanceOf(UOWException.class)
|
||||
.satisfies(ex -> {
|
||||
assertThat(ex.getRootCause()).isSameAs(rex);
|
||||
assertThat(ex.getMostSpecificCause()).isSameAs(rex);
|
||||
});
|
||||
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
|
||||
assertThat(manager.getUOWTimeout()).isEqualTo(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newTransactionWithRollback() {
|
||||
MockUOWManager manager = new MockUOWManager();
|
||||
WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager);
|
||||
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
|
||||
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
|
||||
assertThatExceptionOfType(OptimisticLockingFailureException.class).isThrownBy(() ->
|
||||
ptm.execute(definition, new TransactionCallback<String>() {
|
||||
@Override
|
||||
public String doInTransaction(TransactionStatus status) {
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
throw new OptimisticLockingFailureException("");
|
||||
}
|
||||
}));
|
||||
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
|
||||
assertThat(manager.getUOWTimeout()).isEqualTo(0);
|
||||
assertThat(manager.getUOWType()).isEqualTo(UOWManager.UOW_TYPE_GLOBAL_TRANSACTION);
|
||||
assertThat(manager.getJoined()).isFalse();
|
||||
assertThat(manager.getRollbackOnly()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void newTransactionWithRollbackOnly() {
|
||||
MockUOWManager manager = new MockUOWManager();
|
||||
WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager);
|
||||
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
|
||||
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
|
||||
assertThat(ptm.execute(definition, new TransactionCallback<String>() {
|
||||
@Override
|
||||
public String doInTransaction(TransactionStatus status) {
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
status.setRollbackOnly();
|
||||
return "result";
|
||||
}
|
||||
})).isEqualTo("result");
|
||||
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
|
||||
assertThat(manager.getUOWTimeout()).isEqualTo(0);
|
||||
assertThat(manager.getUOWType()).isEqualTo(UOWManager.UOW_TYPE_GLOBAL_TRANSACTION);
|
||||
assertThat(manager.getJoined()).isFalse();
|
||||
assertThat(manager.getRollbackOnly()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void existingNonSpringTransaction() {
|
||||
MockUOWManager manager = new MockUOWManager();
|
||||
manager.setUOWStatus(UOWManager.UOW_STATUS_ACTIVE);
|
||||
WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager);
|
||||
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
|
||||
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
|
||||
assertThat(ptm.execute(definition, new TransactionCallback<String>() {
|
||||
@Override
|
||||
public String doInTransaction(TransactionStatus status) {
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
return "result";
|
||||
}
|
||||
})).isEqualTo("result");
|
||||
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
|
||||
assertThat(manager.getUOWTimeout()).isEqualTo(0);
|
||||
assertThat(manager.getUOWType()).isEqualTo(UOWManager.UOW_TYPE_GLOBAL_TRANSACTION);
|
||||
assertThat(manager.getJoined()).isTrue();
|
||||
assertThat(manager.getRollbackOnly()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void propagationNeverFailsInCaseOfExistingTransaction() {
|
||||
MockUOWManager manager = new MockUOWManager();
|
||||
manager.setUOWStatus(UOWManager.UOW_STATUS_ACTIVE);
|
||||
WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager);
|
||||
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
|
||||
definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_NEVER);
|
||||
|
||||
assertThatExceptionOfType(IllegalTransactionStateException.class).isThrownBy(() ->
|
||||
ptm.execute(definition, new TransactionCallback<String>() {
|
||||
@Override
|
||||
public String doInTransaction(TransactionStatus status) {
|
||||
return "result";
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void propagationNestedFailsInCaseOfExistingTransaction() {
|
||||
MockUOWManager manager = new MockUOWManager();
|
||||
manager.setUOWStatus(UOWManager.UOW_STATUS_ACTIVE);
|
||||
WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager);
|
||||
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
|
||||
definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_NESTED);
|
||||
|
||||
assertThatExceptionOfType(NestedTransactionNotSupportedException.class).isThrownBy(() ->
|
||||
ptm.execute(definition, new TransactionCallback<String>() {
|
||||
@Override
|
||||
public String doInTransaction(TransactionStatus status) {
|
||||
return "result";
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void existingTransactionWithParticipationUsingPropagationRequired() {
|
||||
doTestExistingTransactionWithParticipation(TransactionDefinition.PROPAGATION_REQUIRED);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void existingTransactionWithParticipationUsingPropagationSupports() {
|
||||
doTestExistingTransactionWithParticipation(TransactionDefinition.PROPAGATION_SUPPORTS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void existingTransactionWithParticipationUsingPropagationMandatory() {
|
||||
doTestExistingTransactionWithParticipation(TransactionDefinition.PROPAGATION_MANDATORY);
|
||||
}
|
||||
|
||||
private void doTestExistingTransactionWithParticipation(int propagationBehavior) {
|
||||
MockUOWManager manager = new MockUOWManager();
|
||||
final WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager);
|
||||
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
|
||||
final DefaultTransactionDefinition definition2 = new DefaultTransactionDefinition();
|
||||
definition2.setPropagationBehavior(propagationBehavior);
|
||||
definition2.setReadOnly(true);
|
||||
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
|
||||
assertThat(ptm.execute(definition, new TransactionCallback<String>() {
|
||||
@Override
|
||||
public String doInTransaction(TransactionStatus status) {
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
assertThat(ptm.execute(definition2, new TransactionCallback<String>() {
|
||||
@Override
|
||||
public String doInTransaction(TransactionStatus status1) {
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
return "result2";
|
||||
}
|
||||
})).isEqualTo("result2");
|
||||
return "result";
|
||||
}
|
||||
})).isEqualTo("result");
|
||||
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
|
||||
assertThat(manager.getUOWTimeout()).isEqualTo(0);
|
||||
assertThat(manager.getUOWType()).isEqualTo(UOWManager.UOW_TYPE_GLOBAL_TRANSACTION);
|
||||
assertThat(manager.getJoined()).isTrue();
|
||||
assertThat(manager.getRollbackOnly()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void existingTransactionWithSuspensionUsingPropagationRequiresNew() {
|
||||
doTestExistingTransactionWithSuspension(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void existingTransactionWithSuspensionUsingPropagationNotSupported() {
|
||||
doTestExistingTransactionWithSuspension(TransactionDefinition.PROPAGATION_NOT_SUPPORTED);
|
||||
}
|
||||
|
||||
private void doTestExistingTransactionWithSuspension(final int propagationBehavior) {
|
||||
MockUOWManager manager = new MockUOWManager();
|
||||
final WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager);
|
||||
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
|
||||
final DefaultTransactionDefinition definition2 = new DefaultTransactionDefinition();
|
||||
definition2.setPropagationBehavior(propagationBehavior);
|
||||
definition2.setReadOnly(true);
|
||||
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
|
||||
assertThat(ptm.execute(definition, new TransactionCallback<String>() {
|
||||
@Override
|
||||
public String doInTransaction(TransactionStatus status) {
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
assertThat(ptm.execute(definition2, new TransactionCallback<String>() {
|
||||
@Override
|
||||
public String doInTransaction(TransactionStatus status1) {
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isEqualTo((propagationBehavior == TransactionDefinition.PROPAGATION_REQUIRES_NEW));
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isTrue();
|
||||
return "result2";
|
||||
}
|
||||
})).isEqualTo("result2");
|
||||
return "result";
|
||||
}
|
||||
})).isEqualTo("result");
|
||||
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
|
||||
assertThat(manager.getUOWTimeout()).isEqualTo(0);
|
||||
if (propagationBehavior == TransactionDefinition.PROPAGATION_REQUIRES_NEW) {
|
||||
assertThat(manager.getUOWType()).isEqualTo(UOWManager.UOW_TYPE_GLOBAL_TRANSACTION);
|
||||
}
|
||||
else {
|
||||
assertThat(manager.getUOWType()).isEqualTo(UOWManager.UOW_TYPE_LOCAL_TRANSACTION);
|
||||
}
|
||||
assertThat(manager.getJoined()).isFalse();
|
||||
assertThat(manager.getRollbackOnly()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void existingTransactionUsingPropagationNotSupported() {
|
||||
MockUOWManager manager = new MockUOWManager();
|
||||
final WebSphereUowTransactionManager ptm = new WebSphereUowTransactionManager(manager);
|
||||
DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
|
||||
final DefaultTransactionDefinition definition2 = new DefaultTransactionDefinition();
|
||||
definition2.setPropagationBehavior(TransactionDefinition.PROPAGATION_NOT_SUPPORTED);
|
||||
definition2.setReadOnly(true);
|
||||
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
|
||||
assertThat(ptm.execute(definition, new TransactionCallback<String>() {
|
||||
@Override
|
||||
public String doInTransaction(TransactionStatus status) {
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
assertThat(ptm.execute(definition2, new TransactionCallback<String>() {
|
||||
@Override
|
||||
public String doInTransaction(TransactionStatus status1) {
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isTrue();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isTrue();
|
||||
return "result2";
|
||||
}
|
||||
})).isEqualTo("result2");
|
||||
return "result";
|
||||
}
|
||||
})).isEqualTo("result");
|
||||
|
||||
assertThat(TransactionSynchronizationManager.isSynchronizationActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isActualTransactionActive()).isFalse();
|
||||
assertThat(TransactionSynchronizationManager.isCurrentTransactionReadOnly()).isFalse();
|
||||
|
||||
assertThat(manager.getUOWTimeout()).isEqualTo(0);
|
||||
assertThat(manager.getUOWType()).isEqualTo(UOWManager.UOW_TYPE_LOCAL_TRANSACTION);
|
||||
assertThat(manager.getJoined()).isFalse();
|
||||
assertThat(manager.getRollbackOnly()).isFalse();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -16,9 +16,8 @@
|
||||
|
||||
package org.springframework.transaction.support;
|
||||
|
||||
import javax.transaction.TransactionManager;
|
||||
import javax.transaction.UserTransaction;
|
||||
|
||||
import jakarta.transaction.TransactionManager;
|
||||
import jakarta.transaction.UserTransaction;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.context.testfixture.jndi.SimpleNamingContextBuilder;
|
||||
|
||||
Reference in New Issue
Block a user