diff --git a/build.gradle b/build.gradle index b6d02d40f..0196121c8 100644 --- a/build.gradle +++ b/build.gradle @@ -48,16 +48,16 @@ allprojects { environmentProperty = project.hasProperty('environment') ? getProperty('environment') : 'hsql' - springVersionDefault = '5.0.0.BUILD-SNAPSHOT' + springVersionDefault = '5.0.0.M4' springVersion = project.hasProperty('springVersion') ? getProperty('springVersion') : springVersionDefault springRetryVersion = '1.1.3.RELEASE' springAmqpVersion = '1.5.6.RELEASE' - springDataCommonsVersion = '2.0.0.BUILD-SNAPSHOT' - springDataGemfireVersion = '2.0.0.BUILD-SNAPSHOT' - springDataJpaVersion = '2.0.0.BUILD-SNAPSHOT' - springDataMongodbVersion = '2.0.0.BUILD-SNAPSHOT' - springDataNeo4jVersion = '5.0.0.BUILD-SNAPSHOT' - springIntegrationVersion = '5.0.0.BUILD-SNAPSHOT' + springDataCommonsVersion = '2.0.0.M1' + springDataGemfireVersion = '2.0.0.M1' + springDataJpaVersion = '2.0.0.M1' + springDataMongodbVersion = '2.0.0.M1' + springDataNeo4jVersion = '5.0.0.M1' + springIntegrationVersion = '5.0.0.M1' springLdapVersion = '2.0.4.RELEASE' activemqVersion = '5.13.2' diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/resource/JdbcCursorItemReaderPreparedStatementIntegrationTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/resource/JdbcCursorItemReaderPreparedStatementIntegrationTests.java index 15eda711d..ffb84c449 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/resource/JdbcCursorItemReaderPreparedStatementIntegrationTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/resource/JdbcCursorItemReaderPreparedStatementIntegrationTests.java @@ -15,17 +15,14 @@ */ package org.springframework.batch.core.resource; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; - import java.util.ArrayList; import java.util.List; - import javax.sql.DataSource; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.batch.item.ExecutionContext; import org.springframework.batch.item.database.JdbcCursorItemReader; import org.springframework.batch.item.database.support.ListPreparedStatementSetter; @@ -34,6 +31,9 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.Transactional; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "/org/springframework/batch/core/repository/dao/data-source-context.xml") public class JdbcCursorItemReaderPreparedStatementIntegrationTests { @@ -50,7 +50,7 @@ public class JdbcCursorItemReaderPreparedStatementIntegrationTests { @Before public void onSetUpInTransaction() throws Exception { - itemReader = new JdbcCursorItemReader(); + itemReader = new JdbcCursorItemReader<>(); itemReader.setDataSource(dataSource); itemReader.setSql("select ID, NAME, VALUE from T_FOOS where ID > ? and ID < ?"); itemReader.setIgnoreWarnings(true); @@ -61,12 +61,11 @@ public class JdbcCursorItemReaderPreparedStatementIntegrationTests { itemReader.setMaxRows(100); itemReader.setQueryTimeout(1000); itemReader.setSaveState(true); - ListPreparedStatementSetter pss = new ListPreparedStatementSetter(); - List parameters = new ArrayList(); + List parameters = new ArrayList<>(); parameters.add(1L); parameters.add(4L); - pss.setParameters(parameters); - + ListPreparedStatementSetter pss = new ListPreparedStatementSetter(parameters); + itemReader.setPreparedStatementSetter(pss); } diff --git a/spring-batch-core/src/test/java/org/springframework/batch/core/resource/ListPreparedStatementSetterTests.java b/spring-batch-core/src/test/java/org/springframework/batch/core/resource/ListPreparedStatementSetterTests.java index 8be22b5d7..0ff650765 100644 --- a/spring-batch-core/src/test/java/org/springframework/batch/core/resource/ListPreparedStatementSetterTests.java +++ b/spring-batch-core/src/test/java/org/springframework/batch/core/resource/ListPreparedStatementSetterTests.java @@ -75,11 +75,10 @@ public class ListPreparedStatementSetterTests { @Before public void onSetUpInTransaction() throws Exception { - pss = new ListPreparedStatementSetter(); List parameters = new ArrayList(); parameters.add(1L); parameters.add(4L); - pss.setParameters(parameters); + pss = new ListPreparedStatementSetter(parameters); } @Transactional @@ -103,7 +102,7 @@ public class ListPreparedStatementSetterTests { @Transactional @Test(expected = IllegalArgumentException.class) public void testAfterPropertiesSet() throws Exception { - pss.setParameters(null); + pss = new ListPreparedStatementSetter(null); pss.afterPropertiesSet(); } @@ -133,7 +132,7 @@ public class ListPreparedStatementSetterTests { } public static class FooStoringItemWriter implements ItemWriter { - private List foos = new ArrayList(); + private List foos = new ArrayList<>(); @Override public void write(List items) throws Exception { diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/AbstractNeo4jItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/AbstractNeo4jItemReader.java index 2724a7094..5b721905f 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/AbstractNeo4jItemReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/AbstractNeo4jItemReader.java @@ -20,6 +20,7 @@ import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.neo4j.ogm.session.SessionFactory; import org.springframework.batch.item.ItemReader; import org.springframework.beans.factory.InitializingBean; @@ -63,6 +64,7 @@ public abstract class AbstractNeo4jItemReader extends protected Log logger = LogFactory.getLog(getClass()); private Neo4jOperations template; + private SessionFactory sessionFactory; private String startStatement; private String returnStatement; @@ -143,16 +145,31 @@ public abstract class AbstractNeo4jItemReader extends this.orderByStatement = orderByStatement; } + protected SessionFactory getSessionFactory() { + return sessionFactory; + } + + public void setSessionFactory(SessionFactory sessionFactory) { + this.sessionFactory = sessionFactory; + } + /** * Used to perform operations against the Neo4J database. * * @param template the Neo4jOperations instance to use * @see Neo4jOperations + * @deprecated Use {@link #setSessionFactory(SessionFactory)} */ + @Deprecated public void setTemplate(Neo4jOperations template) { this.template = template; } + /** + * @return the {@link Neo4jOperations} + * @deprecated Use {@link #getSessionFactory()} + */ + @Deprecated protected final Neo4jOperations getTemplate() { return this.template; } @@ -197,7 +214,8 @@ public abstract class AbstractNeo4jItemReader extends */ @Override public void afterPropertiesSet() throws Exception { - Assert.state(template != null, "A Neo4JOperations implementation is required"); + Assert.state(template != null || sessionFactory != null, + "A Neo4JOperations implementation or SessionFactory is required"); Assert.state(targetType != null, "The type to be returned is required"); Assert.state(StringUtils.hasText(startStatement), "A START statement is required"); Assert.state(StringUtils.hasText(returnStatement), "A RETURN statement is required"); diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/Neo4jItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/Neo4jItemReader.java index 4cf285adb..87d213a73 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/Neo4jItemReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/Neo4jItemReader.java @@ -18,6 +18,9 @@ package org.springframework.batch.item.data; import java.util.ArrayList; import java.util.Iterator; + +import org.neo4j.ogm.session.Session; +import org.neo4j.ogm.session.SessionFactory; // //import org.springframework.data.neo4j.conversion.ResultConverter; @@ -32,8 +35,22 @@ public class Neo4jItemReader extends AbstractNeo4jItemReader { @Override protected Iterator doPageRead() { - Iterable queryResults = getTemplate().queryForObjects( - getTargetType(), generateLimitCypherQuery(), getParameterValues()); + SessionFactory factory = getSessionFactory(); + + Iterable queryResults; + + if(factory != null) { + Session session = factory.openSession(); + + queryResults = session.query(getTargetType(), + generateLimitCypherQuery(), + getParameterValues()); + } + else { + queryResults = getTemplate().queryForObjects( + getTargetType(), generateLimitCypherQuery(), getParameterValues()); + + } if(queryResults != null) { return queryResults.iterator(); diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/Neo4jItemWriter.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/Neo4jItemWriter.java index e64f1288e..656fb8eaa 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/Neo4jItemWriter.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/data/Neo4jItemWriter.java @@ -20,6 +20,9 @@ import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.neo4j.ogm.session.Session; +import org.neo4j.ogm.session.SessionFactory; + import org.springframework.batch.item.ItemWriter; import org.springframework.beans.factory.InitializingBean; import org.springframework.data.neo4j.template.Neo4jOperations; @@ -28,8 +31,7 @@ import org.springframework.util.CollectionUtils; /** *

- * A {@link ItemWriter} implementation that writes to a Neo4j database using an - * implementation of Spring Data's {@link Neo4jOperations}. + * A {@link ItemWriter} implementation that writes to a Neo4j database. *

* *

@@ -49,6 +51,10 @@ public class Neo4jItemWriter implements ItemWriter, InitializingBean { private Neo4jOperations template; + private SessionFactory sessionFactory; + + private boolean useSession = false; + public void setDelete(boolean delete) { this.delete = delete; } @@ -57,11 +63,17 @@ public class Neo4jItemWriter implements ItemWriter, InitializingBean { * Set the {@link Neo4jOperations} to be used to save items * * @param template the template implementation to be used + * @deprecated Use {@link #setSessionFactory(SessionFactory)} */ + @Deprecated public void setTemplate(Neo4jOperations template) { this.template = template; } + public void setSessionFactory(SessionFactory sessionFactory) { + this.sessionFactory = sessionFactory; + } + /** * Checks mandatory properties * @@ -69,7 +81,10 @@ public class Neo4jItemWriter implements ItemWriter, InitializingBean { */ @Override public void afterPropertiesSet() throws Exception { - Assert.state(template != null, "A Neo4JOperations implementation is required"); + Assert.state(template != null || this.sessionFactory != null, + "A Neo4JOperations implementation or a SessionFactory is required"); + + this.useSession = this.sessionFactory != null; } /** @@ -92,13 +107,35 @@ public class Neo4jItemWriter implements ItemWriter, InitializingBean { */ protected void doWrite(List items) { if(delete) { - for (T t : items) { - template.delete(t); - } + delete(items); } else { - for (T t : items) { - template.save(t); + save(items); + } + } + + private void delete(List items) { + if(this.useSession) { + Session session = this.sessionFactory.openSession(); + + items.forEach(session::delete); + } + else { + for (T item : items) { + this.template.delete(item); + } + } + } + + private void save(List items) { + if(this.useSession) { + Session session = this.sessionFactory.openSession(); + + items.forEach(session::save); + } + else { + for (T item : items) { + this.template.save(item); } } } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernateItemReaderHelper.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernateItemReaderHelper.java index 141508e03..154b45bcb 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernateItemReaderHelper.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/HibernateItemReaderHelper.java @@ -20,12 +20,13 @@ import java.util.Collection; import java.util.List; import java.util.Map; -import org.hibernate.Query; +import org.hibernate.query.Query; import org.hibernate.ScrollMode; import org.hibernate.ScrollableResults; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.StatelessSession; + import org.springframework.batch.item.database.orm.HibernateQueryProvider; import org.springframework.beans.factory.InitializingBean; import org.springframework.util.Assert; diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/orm/AbstractHibernateQueryProvider.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/orm/AbstractHibernateQueryProvider.java index f2e744037..4b03d92ed 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/orm/AbstractHibernateQueryProvider.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/orm/AbstractHibernateQueryProvider.java @@ -16,7 +16,7 @@ package org.springframework.batch.item.database.orm; -import org.hibernate.Query; +import org.hibernate.query.Query; import org.hibernate.Session; import org.hibernate.StatelessSession; diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/orm/HibernateNativeQueryProvider.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/orm/HibernateNativeQueryProvider.java index eb2e01813..1a8bec108 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/orm/HibernateNativeQueryProvider.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/orm/HibernateNativeQueryProvider.java @@ -16,8 +16,9 @@ package org.springframework.batch.item.database.orm; -import org.hibernate.Query; -import org.hibernate.SQLQuery; +import org.hibernate.query.NativeQuery; +import org.hibernate.query.Query; + import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -40,12 +41,12 @@ public class HibernateNativeQueryProvider extends AbstractHibernateQueryProvi /** *

- * Create an {@link SQLQuery} from the session provided (preferring + * Create an {@link NativeQuery} from the session provided (preferring * stateless if both are available). *

*/ @Override - public SQLQuery createQuery() { + public NativeQuery createQuery() { if (isStatelessSession()) { return getStatelessSession().createNativeQuery(sqlQuery).addEntity(entityClass); diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/orm/HibernateQueryProvider.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/orm/HibernateQueryProvider.java index a879d72c0..ee83a95f7 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/orm/HibernateQueryProvider.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/orm/HibernateQueryProvider.java @@ -16,7 +16,7 @@ package org.springframework.batch.item.database.orm; -import org.hibernate.Query; +import org.hibernate.query.Query; import org.hibernate.Session; import org.hibernate.StatelessSession; import org.springframework.batch.item.ItemReader; diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/data/Neo4jItemReaderTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/data/Neo4jItemReaderTests.java index 8345c90d4..85c9cd26d 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/data/Neo4jItemReaderTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/data/Neo4jItemReaderTests.java @@ -25,6 +25,8 @@ import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.neo4j.ogm.session.Session; +import org.neo4j.ogm.session.SessionFactory; import org.springframework.data.neo4j.template.Neo4jOperations; @@ -38,17 +40,22 @@ import static org.mockito.Mockito.when; public class Neo4jItemReaderTests { - private Neo4jItemReader reader; @Mock private Neo4jOperations template; @Mock private Iterable result; + @Mock + private SessionFactory sessionFactory; + @Mock + private Session session; @Before public void setUp() throws Exception { - reader = new Neo4jItemReader(); - MockitoAnnotations.initMocks(this); + } + + private Neo4jItemReader buildTemplateBasedReader() throws Exception { + Neo4jItemReader reader = new Neo4jItemReader<>(); reader.setTemplate(template); reader.setTargetType(String.class); @@ -57,17 +64,33 @@ public class Neo4jItemReaderTests { reader.setOrderByStatement("n.age"); reader.setPageSize(50); reader.afterPropertiesSet(); + + return reader; + } + + private Neo4jItemReader buildSessionBasedReader() throws Exception { + Neo4jItemReader reader = new Neo4jItemReader<>(); + + reader.setSessionFactory(this.sessionFactory); + reader.setTargetType(String.class); + reader.setStartStatement("n=node(*)"); + reader.setReturnStatement("*"); + reader.setOrderByStatement("n.age"); + reader.setPageSize(50); + reader.afterPropertiesSet(); + + return reader; } @Test public void testAfterPropertiesSet() throws Exception { - reader = new Neo4jItemReader<>(); + Neo4jItemReader reader = new Neo4jItemReader<>(); try { reader.afterPropertiesSet(); fail("Template was not set but exception was not thrown."); } catch (IllegalStateException iae) { - assertEquals("A Neo4JOperations implementation is required", iae.getMessage()); + assertEquals("A Neo4JOperations implementation or SessionFactory is required", iae.getMessage()); } catch (Throwable t) { fail("Wrong exception was thrown:" + t); } @@ -119,57 +142,134 @@ public class Neo4jItemReaderTests { reader.setOrderByStatement("n.age"); reader.afterPropertiesSet(); + + reader = new Neo4jItemReader<>(); + reader.setSessionFactory(this.sessionFactory); + reader.setTargetType(String.class); + reader.setStartStatement("n=node(*)"); + reader.setReturnStatement("n.name, n.phone"); + reader.setOrderByStatement("n.age"); + + reader.afterPropertiesSet(); } @SuppressWarnings("unchecked") @Test - public void testNullResults() { + public void testNullResults() throws Exception { + Neo4jItemReader itemReader = buildTemplateBasedReader(); + ArgumentCaptor query = ArgumentCaptor.forClass(String.class); when(template.queryForObjects(eq(String.class), query.capture(), (Map) isNull())).thenReturn(null); - assertFalse(reader.doPageRead().hasNext()); + assertFalse(itemReader.doPageRead().hasNext()); assertEquals("START n=node(*) RETURN * ORDER BY n.age SKIP 0 LIMIT 50", query.getValue()); } @SuppressWarnings("unchecked") @Test - public void testNoResults() { + public void testNullResultsWithSession() throws Exception { + Neo4jItemReader itemReader = buildSessionBasedReader(); + + ArgumentCaptor query = ArgumentCaptor.forClass(String.class); + + when(this.sessionFactory.openSession()).thenReturn(this.session); + when(this.session.query(eq(String.class), query.capture(), (Map) isNull())).thenReturn(null); + + assertFalse(itemReader.doPageRead().hasNext()); + assertEquals("START n=node(*) RETURN * ORDER BY n.age SKIP 0 LIMIT 50", query.getValue()); + } + + @SuppressWarnings("unchecked") + @Test + public void testNoResults() throws Exception { + Neo4jItemReader itemReader = buildTemplateBasedReader(); ArgumentCaptor query = ArgumentCaptor.forClass(String.class); when(template.queryForObjects(eq(String.class), query.capture(), (Map) isNull())).thenReturn(result); when(result.iterator()).thenReturn(Collections.emptyIterator()); - assertFalse(reader.doPageRead().hasNext()); + assertFalse(itemReader.doPageRead().hasNext()); + assertEquals("START n=node(*) RETURN * ORDER BY n.age SKIP 0 LIMIT 50", query.getValue()); + } + + @SuppressWarnings("unchecked") + @Test + public void testNoResultsWithSession() throws Exception { + Neo4jItemReader itemReader = buildSessionBasedReader(); + ArgumentCaptor query = ArgumentCaptor.forClass(String.class); + + when(this.sessionFactory.openSession()).thenReturn(this.session); + when(this.session.query(eq(String.class), query.capture(), (Map) isNull())).thenReturn(result); + when(result.iterator()).thenReturn(Collections.emptyIterator()); + + assertFalse(itemReader.doPageRead().hasNext()); assertEquals("START n=node(*) RETURN * ORDER BY n.age SKIP 0 LIMIT 50", query.getValue()); } @SuppressWarnings("serial") @Test public void testResultsWithMatchAndWhere() throws Exception { - reader.setMatchStatement("n -- m"); - reader.setWhereStatement("has(n.name)"); - reader.setReturnStatement("m"); - reader.afterPropertiesSet(); + Neo4jItemReader itemReader = buildTemplateBasedReader(); + itemReader.setMatchStatement("n -- m"); + itemReader.setWhereStatement("has(n.name)"); + itemReader.setReturnStatement("m"); + itemReader.afterPropertiesSet(); when(template.queryForObjects(String.class, "START n=node(*) MATCH n -- m WHERE has(n.name) RETURN m ORDER BY n.age SKIP 0 LIMIT 50", null)).thenReturn(result); when(result.iterator()).thenReturn(Arrays.asList("foo", "bar", "baz").iterator()); - assertTrue(reader.doPageRead().hasNext()); + assertTrue(itemReader.doPageRead().hasNext()); + } + + @SuppressWarnings("serial") + @Test + public void testResultsWithMatchAndWhereWithSession() throws Exception { + Neo4jItemReader itemReader = buildSessionBasedReader(); + itemReader.setMatchStatement("n -- m"); + itemReader.setWhereStatement("has(n.name)"); + itemReader.setReturnStatement("m"); + itemReader.afterPropertiesSet(); + + when(this.sessionFactory.openSession()).thenReturn(this.session); + when(this.session.query(String.class, "START n=node(*) MATCH n -- m WHERE has(n.name) RETURN m ORDER BY n.age SKIP 0 LIMIT 50", null)).thenReturn(result); + when(result.iterator()).thenReturn(Arrays.asList("foo", "bar", "baz").iterator()); + + assertTrue(itemReader.doPageRead().hasNext()); } @SuppressWarnings("serial") @Test public void testResultsWithMatchAndWhereWithParameters() throws Exception { + Neo4jItemReader itemReader = buildTemplateBasedReader(); Map params = new HashMap(); params.put("foo", "bar"); - reader.setParameterValues(params); - reader.setMatchStatement("n -- m"); - reader.setWhereStatement("has(n.name)"); - reader.setReturnStatement("m"); - reader.afterPropertiesSet(); + itemReader.setParameterValues(params); + itemReader.setMatchStatement("n -- m"); + itemReader.setWhereStatement("has(n.name)"); + itemReader.setReturnStatement("m"); + itemReader.afterPropertiesSet(); when(template.queryForObjects(String.class, "START n=node(*) MATCH n -- m WHERE has(n.name) RETURN m ORDER BY n.age SKIP 0 LIMIT 50", params)).thenReturn(result); when(result.iterator()).thenReturn(Arrays.asList("foo", "bar", "baz").iterator()); - assertTrue(reader.doPageRead().hasNext()); + assertTrue(itemReader.doPageRead().hasNext()); + } + + @SuppressWarnings("serial") + @Test + public void testResultsWithMatchAndWhereWithParametersWithSession() throws Exception { + Neo4jItemReader itemReader = buildSessionBasedReader(); + Map params = new HashMap<>(); + params.put("foo", "bar"); + itemReader.setParameterValues(params); + itemReader.setMatchStatement("n -- m"); + itemReader.setWhereStatement("has(n.name)"); + itemReader.setReturnStatement("m"); + itemReader.afterPropertiesSet(); + + when(this.sessionFactory.openSession()).thenReturn(this.session); + when(this.session.query(String.class, "START n=node(*) MATCH n -- m WHERE has(n.name) RETURN m ORDER BY n.age SKIP 0 LIMIT 50", params)).thenReturn(result); + when(result.iterator()).thenReturn(Arrays.asList("foo", "bar", "baz").iterator()); + + assertTrue(itemReader.doPageRead().hasNext()); } } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/data/Neo4jItemWriterTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/data/Neo4jItemWriterTests.java index bb3b20f22..19ef4de1c 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/data/Neo4jItemWriterTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/data/Neo4jItemWriterTests.java @@ -15,11 +15,6 @@ */ package org.springframework.batch.item.data; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; - import java.util.ArrayList; import java.util.List; @@ -27,31 +22,41 @@ import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.neo4j.ogm.session.Session; +import org.neo4j.ogm.session.SessionFactory; + import org.springframework.data.neo4j.template.Neo4jOperations; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.when; + public class Neo4jItemWriterTests { private Neo4jItemWriter writer; @Mock private Neo4jOperations template; + @Mock + private SessionFactory sessionFactory; + @Mock + private Session session; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - writer = new Neo4jItemWriter(); - - writer.setTemplate(template); } @Test public void testAfterPropertiesSet() throws Exception{ - writer = new Neo4jItemWriter(); + writer = new Neo4jItemWriter<>(); try { writer.afterPropertiesSet(); fail("Template was not set but exception was not thrown."); } catch (IllegalStateException iae) { - assertEquals("A Neo4JOperations implementation is required", iae.getMessage()); + assertEquals("A Neo4JOperations implementation or a SessionFactory is required", iae.getMessage()); } catch (Throwable t) { fail("Wrong exception was thrown."); } @@ -59,25 +64,76 @@ public class Neo4jItemWriterTests { writer.setTemplate(template); writer.afterPropertiesSet(); + + writer = new Neo4jItemWriter<>(); + + writer.setSessionFactory(this.sessionFactory); + + writer.afterPropertiesSet(); } @Test public void testWriteNull() throws Exception { + writer = new Neo4jItemWriter<>(); + + writer.setTemplate(template); + writer.afterPropertiesSet(); + writer.write(null); verifyZeroInteractions(template); + verifyZeroInteractions(this.session); } @Test public void testWriteNoItems() throws Exception { - writer.write(new ArrayList()); + writer = new Neo4jItemWriter<>(); + + writer.setTemplate(template); + writer.afterPropertiesSet(); + + writer.write(new ArrayList<>()); verifyZeroInteractions(template); + verifyZeroInteractions(this.session); + } + + @Test + public void testWriteNullWithSession() throws Exception { + writer = new Neo4jItemWriter<>(); + + writer.setSessionFactory(this.sessionFactory); + writer.afterPropertiesSet(); + + when(this.sessionFactory.openSession()).thenReturn(this.session); + writer.write(null); + + verifyZeroInteractions(template); + verifyZeroInteractions(this.session); + } + + @Test + public void testWriteNoItemsWithSession() throws Exception { + writer = new Neo4jItemWriter<>(); + + writer.setSessionFactory(this.sessionFactory); + writer.afterPropertiesSet(); + + when(this.sessionFactory.openSession()).thenReturn(this.session); + writer.write(new ArrayList<>()); + + verifyZeroInteractions(template); + verifyZeroInteractions(this.session); } @Test public void testWriteItems() throws Exception { - List items = new ArrayList(); + writer = new Neo4jItemWriter<>(); + + writer.setTemplate(template); + writer.afterPropertiesSet(); + + List items = new ArrayList<>(); items.add("foo"); items.add("bar"); @@ -85,11 +141,37 @@ public class Neo4jItemWriterTests { verify(template).save("foo"); verify(template).save("bar"); + verifyZeroInteractions(this.session); + verifyZeroInteractions(this.sessionFactory); + } + + @Test + public void testWriteItemsWithSession() throws Exception { + writer = new Neo4jItemWriter<>(); + + writer.setSessionFactory(this.sessionFactory); + writer.afterPropertiesSet(); + + List items = new ArrayList<>(); + items.add("foo"); + items.add("bar"); + + when(this.sessionFactory.openSession()).thenReturn(this.session); + writer.write(items); + + verify(this.session).save("foo"); + verify(this.session).save("bar"); + verifyZeroInteractions(template); } @Test public void testDeleteItems() throws Exception { - List items = new ArrayList(); + writer = new Neo4jItemWriter<>(); + + writer.setTemplate(template); + writer.afterPropertiesSet(); + + List items = new ArrayList<>(); items.add("foo"); items.add("bar"); @@ -99,5 +181,28 @@ public class Neo4jItemWriterTests { verify(template).delete("foo"); verify(template).delete("bar"); + verifyZeroInteractions(this.session); + verifyZeroInteractions(this.sessionFactory); + } + + @Test + public void testDeleteItemsWithSession() throws Exception { + writer = new Neo4jItemWriter<>(); + + writer.setSessionFactory(this.sessionFactory); + writer.afterPropertiesSet(); + + List items = new ArrayList<>(); + items.add("foo"); + items.add("bar"); + + writer.setDelete(true); + + when(this.sessionFactory.openSession()).thenReturn(this.session); + writer.write(items); + + verify(this.session).delete("foo"); + verify(this.session).delete("bar"); + verifyZeroInteractions(template); } } diff --git a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/HibernateNativeQueryProviderIntegrationTests.java b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/HibernateNativeQueryProviderIntegrationTests.java index d9563cb5e..b5abc8401 100644 --- a/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/HibernateNativeQueryProviderIntegrationTests.java +++ b/spring-batch-infrastructure/src/test/java/org/springframework/batch/item/database/support/HibernateNativeQueryProviderIntegrationTests.java @@ -23,7 +23,7 @@ import java.util.List; import javax.sql.DataSource; -import org.hibernate.Query; +import org.hibernate.query.Query; import org.hibernate.SessionFactory; import org.junit.Before; import org.junit.Test; @@ -86,7 +86,7 @@ public class HibernateNativeQueryProviderIntegrationTests { Query query = hibernateQueryProvider.createQuery(); - List expectedFoos = new ArrayList(); + List expectedFoos = new ArrayList<>(); expectedFoos.add(new Foo(1, "bar1", 1)); expectedFoos.add(new Foo(2, "bar2", 2)); diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/multiline/AggregateItem.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/multiline/AggregateItem.java index 657b72dc8..c3e6af310 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/multiline/AggregateItem.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/multiline/AggregateItem.java @@ -66,7 +66,7 @@ public class AggregateItem { private boolean header = false; /** - * @param item + * @param item the item to wrap */ public AggregateItem(T item) { super(); diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/multiline/AggregateItemReader.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/multiline/AggregateItemReader.java index a27b645d0..ae7732a05 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/multiline/AggregateItemReader.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/multiline/AggregateItemReader.java @@ -48,8 +48,7 @@ public class AggregateItemReader implements ItemReader> { /** * Get the next list of records. - * @throws Exception - * + * * @see org.springframework.batch.item.ItemReader#read() */ @Override diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/OrderItemReader.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/OrderItemReader.java index 1146ed07f..8a38df6fb 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/OrderItemReader.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/OrderItemReader.java @@ -56,7 +56,6 @@ public class OrderItemReader implements ItemReader { private ItemReader
fieldSetReader; /** - * @throws Exception * @see org.springframework.batch.item.ItemReader#read() */ @Override diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/OrderLineAggregator.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/OrderLineAggregator.java index c7e8b085f..b4ee5256a 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/OrderLineAggregator.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/order/internal/OrderLineAggregator.java @@ -55,7 +55,8 @@ public class OrderLineAggregator implements LineAggregator { /** * Set aggregators for all types of lines in the output file * - * @param aggregators + * @param aggregators Map of LineAggregators used to map the various record types for + * each order */ public void setAggregators(Map> aggregators) { this.aggregators = aggregators; diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/trade/CompositeCustomerUpdateLineTokenizer.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/trade/CompositeCustomerUpdateLineTokenizer.java index 9ce362374..ba68c78bd 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/trade/CompositeCustomerUpdateLineTokenizer.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/trade/CompositeCustomerUpdateLineTokenizer.java @@ -75,8 +75,8 @@ public class CompositeCustomerUpdateLineTokenizer extends StepExecutionListenerS /** * Set the {@link LineTokenizer} that will be used to tokenize any lines that begin with * A, U, or D, and are thus a customer operation. - * - * @param customerTokenizer + * + * @param customerTokenizer tokenizer to delegate to for customer operation records */ public void setCustomerTokenizer(LineTokenizer customerTokenizer) { this.customerTokenizer = customerTokenizer; @@ -86,7 +86,7 @@ public class CompositeCustomerUpdateLineTokenizer extends StepExecutionListenerS * Set the {@link LineTokenizer} that will be used to tokenize any lines that being with * F and is thus a footer record. * - * @param footerTokenizer + * @param footerTokenizer tokenizer to delegate to for footer records */ public void setFooterTokenizer(LineTokenizer footerTokenizer) { this.footerTokenizer = footerTokenizer; diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/trade/Trade.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/trade/Trade.java index 5db844c14..b474c7ad7 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/trade/Trade.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/domain/trade/Trade.java @@ -44,7 +44,7 @@ public class Trade implements Serializable { } /** - * @param id + * @param id id of the trade */ public Trade(long id) { this.id = id; diff --git a/spring-batch-samples/src/main/java/org/springframework/batch/sample/loop/LimitDecider.java b/spring-batch-samples/src/main/java/org/springframework/batch/sample/loop/LimitDecider.java index 8f289bafb..509e7cbd5 100644 --- a/spring-batch-samples/src/main/java/org/springframework/batch/sample/loop/LimitDecider.java +++ b/spring-batch-samples/src/main/java/org/springframework/batch/sample/loop/LimitDecider.java @@ -44,7 +44,7 @@ public class LimitDecider implements JobExecutionDecider { } /** - * @param limit + * @param limit number of times to return "CONTINUE" */ public void setLimit(int limit) { this.limit = limit; diff --git a/spring-batch-test/src/main/java/org/springframework/batch/test/AbstractJobTests.java b/spring-batch-test/src/main/java/org/springframework/batch/test/AbstractJobTests.java index 00dbb07a8..da62e07af 100644 --- a/spring-batch-test/src/main/java/org/springframework/batch/test/AbstractJobTests.java +++ b/spring-batch-test/src/main/java/org/springframework/batch/test/AbstractJobTests.java @@ -67,6 +67,7 @@ import org.springframework.context.ApplicationContextAware; * * @deprecated (from 2.1) use {@link JobLauncherTestUtils} instead */ +@Deprecated public abstract class AbstractJobTests implements ApplicationContextAware { /** Logger */