diff --git a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/BatchListenerFactoryHelper.java b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/BatchListenerFactoryHelper.java index e1a6250f0..d6350ae24 100644 --- a/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/BatchListenerFactoryHelper.java +++ b/spring-batch-core/src/main/java/org/springframework/batch/core/step/item/BatchListenerFactoryHelper.java @@ -27,13 +27,11 @@ import org.springframework.batch.core.StepListener; import org.springframework.batch.core.listener.CompositeChunkListener; import org.springframework.batch.core.listener.CompositeItemReadListener; import org.springframework.batch.core.listener.CompositeItemWriteListener; +import org.springframework.batch.item.ClearFailedException; +import org.springframework.batch.item.FlushFailedException; import org.springframework.batch.item.ItemReader; import org.springframework.batch.item.ItemWriter; -import org.springframework.batch.item.FlushFailedException; -import org.springframework.batch.item.ClearFailedException; import org.springframework.batch.item.support.DelegatingItemReader; -import org.springframework.batch.item.support.DelegatingItemWriter; -import org.springframework.batch.item.support.AbstractItemWriter; import org.springframework.batch.repeat.RepeatContext; import org.springframework.batch.repeat.RepeatOperations; import org.springframework.batch.repeat.listener.RepeatListenerSupport; diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/launch/EmptyItemWriter.java b/spring-batch-core/src/test/java/org/springframework/batch/core/launch/EmptyItemWriter.java index 9e7de05dd..06be29e80 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/launch/EmptyItemWriter.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/launch/EmptyItemWriter.java @@ -42,10 +42,9 @@ public class EmptyItemWriter implements ItemWriter, InitializingBean { List list; - @SuppressWarnings("unchecked") public void afterPropertiesSet() throws Exception { - TransactionAwareProxyFactory factory = new TransactionAwareProxyFactory(new ArrayList()); - list = (List) factory.createInstance(); + TransactionAwareProxyFactory> factory = new TransactionAwareProxyFactory>(new ArrayList()); + list = factory.createInstance(); } public void setFailurePoint(int failurePoint) { diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/support/transaction/TransactionAwareProxyFactory.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/support/transaction/TransactionAwareProxyFactory.java index bf7e9e115..b4a045a62 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/support/transaction/TransactionAwareProxyFactory.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/support/transaction/TransactionAwareProxyFactory.java @@ -46,12 +46,11 @@ import org.springframework.transaction.support.TransactionSynchronizationManager * @author Dave Syer * */ -@SuppressWarnings("unchecked") -public class TransactionAwareProxyFactory { +public class TransactionAwareProxyFactory { - private Object target; + private T target; - public TransactionAwareProxyFactory(Object target) { + public TransactionAwareProxyFactory(T target) { super(); this.target = begin(target); } @@ -64,15 +63,16 @@ public class TransactionAwareProxyFactory { * @param target the target object (List, Set or Map) * @return an independent copy */ - protected final Object begin(Object target) { + @SuppressWarnings("unchecked") + protected final T begin(T target) { if (target instanceof List) { - return new ArrayList((List) target); + return (T) new ArrayList((List) target); } else if (target instanceof Set) { - return new HashSet((Set) target); + return (T) new HashSet((Set) target); } else if (target instanceof Map) { - return new HashMap((Map) target); + return (T) new HashMap((Map) target); } else { throw new UnsupportedOperationException("Cannot copy target for this type: " + target.getClass()); @@ -87,7 +87,8 @@ public class TransactionAwareProxyFactory { * @param copy the working copy. * @param target the original target of the factory. */ - protected void commit(Object copy, Object target) { + @SuppressWarnings("unchecked") + protected void commit(T copy, T target) { if (target instanceof Collection) { ((Collection) target).clear(); ((Collection) target).addAll((Collection) copy); @@ -98,16 +99,17 @@ public class TransactionAwareProxyFactory { } } - public Object createInstance() { + public T createInstance() { ProxyFactory factory = new ProxyFactory(target); factory.addAdvice(new MethodInterceptor() { + public Object invoke(MethodInvocation invocation) throws Throwable { if (!TransactionSynchronizationManager.isActualTransactionActive()) { return invocation.proceed(); } - Object cache; + T cache; if (!TransactionSynchronizationManager.hasResource(this)) { cache = begin(target); @@ -115,35 +117,42 @@ public class TransactionAwareProxyFactory { TransactionSynchronizationManager.registerSynchronization(new TargetSynchronization(this, cache)); } else { - cache = TransactionSynchronizationManager.getResource(this); + @SuppressWarnings("unchecked") + T retrievedCache = (T) TransactionSynchronizationManager.getResource(this); + cache = retrievedCache; } return invocation.getMethod().invoke(cache, invocation.getArguments()); } }); - return factory.getProxy(); + @SuppressWarnings("unchecked") + T instance = (T) factory.getProxy(); + return instance; } + @SuppressWarnings("unchecked") public static Map createTransactionalMap() { return (Map) new TransactionAwareProxyFactory(new HashMap()).createInstance(); } + @SuppressWarnings("unchecked") public static Set createTransactionalSet() { return (Set) new TransactionAwareProxyFactory(new HashSet()).createInstance(); } + @SuppressWarnings("unchecked") public static List createTransactionalList() { return (List) new TransactionAwareProxyFactory(new ArrayList()).createInstance(); } private class TargetSynchronization extends TransactionSynchronizationAdapter { - Object cache; + T cache; Object key; - public TargetSynchronization(Object key, Object cache) { + public TargetSynchronization(Object key, T cache) { super(); this.cache = cache; this.key = key; diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/support/transaction/TransactionAwareListFactoryTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/support/transaction/TransactionAwareListFactoryTests.java index 2ba3c81ab..524b68fac 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/support/transaction/TransactionAwareListFactoryTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/support/transaction/TransactionAwareListFactoryTests.java @@ -27,14 +27,13 @@ import org.springframework.transaction.support.TransactionTemplate; public class TransactionAwareListFactoryTests extends TestCase { - TransactionAwareProxyFactory factory = new TransactionAwareProxyFactory(Arrays.asList(new String[] { "foo", + TransactionAwareProxyFactory> factory = new TransactionAwareProxyFactory>(Arrays.asList(new String[] { "foo", "bar", "spam" })); TransactionTemplate transactionTemplate = new TransactionTemplate(new ResourcelessTransactionManager()); List list; - @SuppressWarnings("unchecked") protected void setUp() throws Exception { list = (List) factory.createInstance(); } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/support/transaction/TransactionAwareMapFactoryTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/support/transaction/TransactionAwareMapFactoryTests.java index 50995684b..4ff346249 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/support/transaction/TransactionAwareMapFactoryTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/support/transaction/TransactionAwareMapFactoryTests.java @@ -27,19 +27,18 @@ import org.springframework.transaction.support.TransactionTemplate; public class TransactionAwareMapFactoryTests extends TestCase { - TransactionAwareProxyFactory factory; + TransactionAwareProxyFactory> factory; TransactionTemplate transactionTemplate = new TransactionTemplate(new ResourcelessTransactionManager()); Map map; - @SuppressWarnings("unchecked") protected void setUp() throws Exception { Map seed = new HashMap(); seed.put("foo", "oof"); seed.put("bar", "bar"); seed.put("spam", "maps"); - factory = new TransactionAwareProxyFactory(seed); + factory = new TransactionAwareProxyFactory>(seed); map = (Map) factory.createInstance(); } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/support/transaction/TransactionAwareProxyFactoryTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/support/transaction/TransactionAwareProxyFactoryTests.java index ad8c241dc..be12e2680 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/support/transaction/TransactionAwareProxyFactoryTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/support/transaction/TransactionAwareProxyFactoryTests.java @@ -44,7 +44,7 @@ public class TransactionAwareProxyFactoryTests extends TestCase { public void testCreateUnsupported() throws Exception { try { - new TransactionAwareProxyFactory(new Object()).createInstance(); + new TransactionAwareProxyFactory(new Object()).createInstance(); fail("Expected UnsupportedOperationException"); } catch (UnsupportedOperationException e) { // expected