RESOLVED - BATCH-821: remove EventSerializer/Deserializer abstractions and use Marshaller/Unmarshaller directly

This commit is contained in:
robokaso
2008-09-05 09:15:21 +00:00
parent 92a03420b1
commit 5994782b37
10 changed files with 158 additions and 97 deletions

View File

@@ -1,24 +1,28 @@
package org.springframework.batch.item.file;
import static org.junit.Assert.*;
import org.junit.runner.RunWith;
import org.junit.internal.runners.JUnit4ClassRunner;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.Comparator;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.StartElement;
import javax.xml.transform.Source;
import org.junit.internal.runners.JUnit4ClassRunner;
import org.junit.runner.RunWith;
import org.springframework.batch.item.CommonItemStreamItemReaderTests;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.sample.Foo;
import org.springframework.batch.item.xml.EventReaderDeserializer;
import org.springframework.batch.item.xml.StaxEventItemReader;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.Resource;
import org.springframework.oxm.Unmarshaller;
import org.springframework.oxm.XmlMappingException;
import org.springframework.xml.transform.StaxSource;
@RunWith(JUnit4ClassRunner.class)
public class MultiResourceItemReaderXmlTests extends CommonItemStreamItemReaderTests {
@@ -29,8 +33,10 @@ public class MultiResourceItemReaderXmlTests extends CommonItemStreamItemReaderT
StaxEventItemReader<Foo> reader = new StaxEventItemReader<Foo>();
reader.setFragmentRootElementName("foo");
reader.setFragmentDeserializer(new EventReaderDeserializer<Foo>() {
public Foo deserializeFragment(XMLEventReader eventReader) {
reader.setUnmarshaller(new Unmarshaller() {
public Object unmarshal(Source source) throws XmlMappingException, IOException {
StaxSource staxSource = (StaxSource) source;
XMLEventReader eventReader = staxSource.getXMLEventReader();
Attribute attr;
try {
assertTrue(eventReader.nextEvent().isStartDocument());
@@ -44,6 +50,12 @@ public class MultiResourceItemReaderXmlTests extends CommonItemStreamItemReaderT
foo.setValue(Integer.parseInt(attr.getValue()));
return foo;
}
@SuppressWarnings("unchecked")
public boolean supports(Class clazz) {
return true;
}
});
reader.setSaveState(true);

View File

@@ -1,6 +1,9 @@
package org.springframework.batch.item.xml;
import static org.junit.Assert.*;
import java.io.IOException;
import org.junit.runner.RunWith;
import org.junit.internal.runners.JUnit4ClassRunner;
@@ -8,12 +11,16 @@ import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.StartElement;
import javax.xml.transform.Source;
import org.springframework.batch.item.CommonItemStreamItemReaderTests;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.sample.Foo;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.oxm.Unmarshaller;
import org.springframework.oxm.XmlMappingException;
import org.springframework.xml.transform.StaxSource;
@RunWith(JUnit4ClassRunner.class)
public class StaxEventItemReaderCommonTests extends CommonItemStreamItemReaderTests {
@@ -24,8 +31,10 @@ public class StaxEventItemReaderCommonTests extends CommonItemStreamItemReaderTe
StaxEventItemReader<Foo> reader = new StaxEventItemReader<Foo>();
reader.setResource(new ByteArrayResource(FOOS.getBytes()));
reader.setFragmentRootElementName("foo");
reader.setFragmentDeserializer(new EventReaderDeserializer<Foo>() {
public Foo deserializeFragment(XMLEventReader eventReader) {
reader.setUnmarshaller(new Unmarshaller() {
public Object unmarshal(Source source) throws XmlMappingException, IOException {
StaxSource staxSource = (StaxSource) source;
XMLEventReader eventReader = staxSource.getXMLEventReader();
Attribute attr;
try {
assertTrue(eventReader.nextEvent().isStartDocument());
@@ -39,6 +48,12 @@ public class StaxEventItemReaderCommonTests extends CommonItemStreamItemReaderTe
foo.setValue(Integer.parseInt(attr.getValue()));
return foo;
}
@SuppressWarnings("unchecked")
public boolean supports(Class clazz) {
return true;
}
});
reader.setSaveState(true);

View File

@@ -11,6 +11,7 @@ import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.XMLEvent;
import javax.xml.transform.Source;
import junit.framework.TestCase;
@@ -19,7 +20,10 @@ import org.springframework.batch.item.ItemStreamException;
import org.springframework.core.io.AbstractResource;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.Resource;
import org.springframework.oxm.Unmarshaller;
import org.springframework.oxm.XmlMappingException;
import org.springframework.util.ClassUtils;
import org.springframework.xml.transform.StaxSource;
/**
* Tests for {@link StaxEventItemReader}.
@@ -34,7 +38,7 @@ public class StaxEventItemReaderTests extends TestCase {
// test xml input
private String xml = "<root> <fragment> <misc1/> </fragment> <misc2/> <fragment> testString </fragment> </root>";
private EventReaderDeserializer<List<XMLEvent>> deserializer = new MockFragmentDeserializer();
private Unmarshaller unmarshaller = new MockFragmentUnmarshaller();
private static final String FRAGMENT_ROOT_ELEMENT = "fragment";
@@ -62,7 +66,7 @@ public class StaxEventItemReaderTests extends TestCase {
}
source = createNewInputSouce();
source.setFragmentDeserializer(null);
source.setUnmarshaller(null);
try {
source.afterPropertiesSet();
fail();
@@ -74,12 +78,12 @@ public class StaxEventItemReaderTests extends TestCase {
/**
* Regular usage scenario. ItemReader should pass XML fragments to
* deserializer wrapped with StartDocument and EndDocument events.
* unmarshaller wrapped with StartDocument and EndDocument events.
*/
public void testFragmentWrapping() throws Exception {
source.afterPropertiesSet();
source.open(executionContext);
// see asserts in the mock deserializer
// see asserts in the mock unmarshaller
assertNotNull(source.read());
assertNotNull(source.read());
assertNull(source.read()); // there are only two fragments
@@ -163,7 +167,7 @@ public class StaxEventItemReaderTests extends TestCase {
newSource.setResource(resource);
newSource.setFragmentRootElementName(FRAGMENT_ROOT_ELEMENT);
newSource.setFragmentDeserializer(deserializer);
newSource.setUnmarshaller(unmarshaller);
newSource.open(executionContext);
@@ -239,27 +243,52 @@ public class StaxEventItemReaderTests extends TestCase {
newSource.setResource(resource);
newSource.setFragmentRootElementName(FRAGMENT_ROOT_ELEMENT);
newSource.setFragmentDeserializer(deserializer);
newSource.setUnmarshaller(unmarshaller);
newSource.setSaveState(true);
return newSource;
}
/**
* A simple XMLEvent deserializer mock - check for the start and end
* A simple XMLEvent unmarshaller mock - check for the start and end
* document events for the fragment root & end tags + skips the fragment
* contents.
*/
private static class MockFragmentDeserializer implements EventReaderDeserializer<List<XMLEvent>> {
private static class MockFragmentUnmarshaller implements Unmarshaller {
/**
* Skips the XML fragment contents.
*/
private List<XMLEvent> readRecordsInsideFragment(XMLEventReader eventReader) throws XMLStreamException {
XMLEvent eventInsideFragment;
List<XMLEvent> events = new ArrayList<XMLEvent>();
do {
eventInsideFragment = eventReader.peek();
if (eventInsideFragment instanceof EndElement
&& ((EndElement) eventInsideFragment).getName().getLocalPart().equals(FRAGMENT_ROOT_ELEMENT)) {
break;
}
events.add(eventReader.nextEvent());
} while (eventInsideFragment != null);
return events;
}
@SuppressWarnings("unchecked")
public boolean supports(Class clazz) {
return true;
}
/**
* A simple mapFragment implementation checking the
* StaxEventReaderItemReader basic read functionality.
*
* @param eventReader
* @param source
* @return list of the events from fragment body
*/
public List<XMLEvent> deserializeFragment(XMLEventReader eventReader) {
public Object unmarshal(Source source) throws XmlMappingException, IOException {
StaxSource staxSource = (StaxSource) source;
XMLEventReader eventReader = staxSource.getXMLEventReader();
List<XMLEvent> fragmentContent;
try {
// first event should be StartDocument
@@ -290,24 +319,6 @@ public class StaxEventItemReaderTests extends TestCase {
return fragmentContent;
}
/**
* Skips the XML fragment contents.
*/
private List<XMLEvent> readRecordsInsideFragment(XMLEventReader eventReader) throws XMLStreamException {
XMLEvent eventInsideFragment;
List<XMLEvent> events = new ArrayList<XMLEvent>();
do {
eventInsideFragment = eventReader.peek();
if (eventInsideFragment instanceof EndElement
&& ((EndElement) eventInsideFragment).getName().getLocalPart().equals(FRAGMENT_ROOT_ELEMENT)) {
break;
}
events.add(eventReader.nextEvent());
} while (eventInsideFragment != null);
return events;
}
}
private static class MockStaxEventItemReader extends StaxEventItemReader<List<XMLEvent>> {

View File

@@ -21,7 +21,6 @@ import org.apache.commons.io.FileUtils;
import org.junit.Before;
import org.junit.Test;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.xml.oxm.MarshallingEventWriterSerializer;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.oxm.Marshaller;
@@ -202,8 +201,7 @@ public class StaxEventItemWriterTests {
source.setResource(resource);
Marshaller marshaller = new SimpleMarshaller();
MarshallingEventWriterSerializer<Object> serializer = new MarshallingEventWriterSerializer<Object>(marshaller);
source.setSerializer(serializer);
source.setMarshaller(marshaller);
source.setEncoding("UTF-8");
source.setRootTagName("root");

View File

@@ -17,7 +17,6 @@ import org.apache.commons.io.FileUtils;
import org.junit.Before;
import org.junit.Test;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.batch.item.xml.oxm.MarshallingEventWriterSerializer;
import org.springframework.batch.support.transaction.ResourcelessTransactionManager;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
@@ -74,7 +73,12 @@ public class TransactionalStaxEventItemWriterTests {
writer.open(executionContext);
new TransactionTemplate(transactionManager).execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
writer.write(items);
try {
writer.write(items);
}
catch (IOException e) {
throw new RuntimeException(e);
}
return null;
}
});
@@ -94,7 +98,12 @@ public class TransactionalStaxEventItemWriterTests {
try {
new TransactionTemplate(transactionManager).execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
writer.write(items);
try {
writer.write(items);
}
catch (IOException e) {
throw new RuntimeException(e);
}
throw new RuntimeException("Planned");
}
});
@@ -107,7 +116,12 @@ public class TransactionalStaxEventItemWriterTests {
writer.open(executionContext);
new TransactionTemplate(transactionManager).execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
writer.write(items);
try {
writer.write(items);
}
catch (IOException e) {
throw new RuntimeException(e);
}
return null;
}
});
@@ -127,7 +141,12 @@ public class TransactionalStaxEventItemWriterTests {
writer.open(executionContext);
new TransactionTemplate(transactionManager).execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
writer.write(items);
try {
writer.write(items);
}
catch (IOException e) {
throw new RuntimeException(e);
}
return null;
}
});
@@ -137,7 +156,12 @@ public class TransactionalStaxEventItemWriterTests {
try {
new TransactionTemplate(transactionManager).execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
writer.write(items);
try {
writer.write(items);
}
catch (IOException e) {
throw new RuntimeException(e);
}
throw new RuntimeException("Planned");
}
});
@@ -189,8 +213,7 @@ public class TransactionalStaxEventItemWriterTests {
source.setResource(resource);
Marshaller marshaller = new SimpleMarshaller();
MarshallingEventWriterSerializer<Object> serializer = new MarshallingEventWriterSerializer<Object>(marshaller);
source.setSerializer(serializer);
source.setMarshaller(marshaller);
source.setEncoding("UTF-8");
source.setRootTagName("root");