/*
* Copyright (C) 2008 XStream Committers.
* All rights reserved.
*
* The software in this package is published under the terms of the BSD
* style license a copy of which has been included with this distribution in
* the LICENSE.txt file.
*
* Created on 24. November 2008 by Joerg Schaible
*/
package com.thoughtworks.acceptance;
import com.thoughtworks.acceptance.objects.SampleLists;
import com.thoughtworks.acceptance.objects.Software;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.persistence.FilePersistenceStrategy;
import com.thoughtworks.xstream.persistence.XmlArrayList;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
/**
* Tests the persistence package.
*
* @author Jörg Schaible
*/
public class PersistenceTest extends AbstractAcceptanceTest {
private File dir;
protected void setUp() throws Exception {
super.setUp();
dir = new File("target/test-storage");
dir.mkdirs();
cleanUp();
}
protected void tearDown() throws Exception {
cleanUp();
dir.delete();
super.tearDown();
}
private void cleanUp() {
File[] files = dir.listFiles();
for(int i = 0; i < files.length; ++i) {
if (files[i].isFile()) {
files[i].delete();
}
}
}
private final class PersistenceArrayListConverter implements Converter {
public void marshal(Object source, HierarchicalStreamWriter writer,
MarshallingContext context) {
final XmlArrayList list = new XmlArrayList(new FilePersistenceStrategy(dir, xstream));
context.convertAnother(dir);
list.addAll((Collection)source);
}
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {
final File directory = (File)context.convertAnother(null, File.class);
final XmlArrayList persistentList = new XmlArrayList(new FilePersistenceStrategy(directory, xstream));
final ArrayList list = new ArrayList(persistentList);
//persistentList.clear(); // remove files
return list;
}
public boolean canConvert(Class type) {
return type == ArrayList.class;
}
}
public void testCanUsePersistenceCollectionAsConverter() throws IOException {
xstream.alias("lists", SampleLists.class);
xstream.alias("software", Software.class);
xstream.registerLocalConverter(SampleLists.class, "good", new PersistenceArrayListConverter());
SampleLists lists = new SampleLists();
lists.good.add("Guilherme");
lists.good.add(new Integer(1970));
lists.good.add(new Software("Codehaus", "XStream"));
String expected = "" +
"<lists>\n" +
" <good>" + dir.getPath() + "</good>\n" +
" <bad class=\"list\"/>\n" +
"</lists>";
// assumes 'lists' is serialized first
SampleLists serialized = (SampleLists)assertBothWays(lists, expected);
// compare original list and list written in separate XML file
assertEquals(lists.good, serialized.good);
// retrieve value from external file
FileInputStream inputStream = new FileInputStream(new File(dir, "int@2.xml"));
try {
assertEquals(lists.good.get(2), xstream.fromXML(inputStream));
} finally {
inputStream.close();
}
}
}