View Javadoc
1   package de.japrost.jabudget.serialization.xstream;
2   
3   import java.io.IOException;
4   import java.io.InputStream;
5   import java.io.OutputStream;
6   
7   import com.thoughtworks.xstream.XStream;
8   import com.thoughtworks.xstream.io.xml.DomDriver;
9   
10  import de.japrost.jabudget.domain.account.Account;
11  import de.japrost.jabudget.serialization.DomainStore;
12  import de.japrost.jabudget.serialization.Serialization;
13  
14  /**
15   * {@link Serialization} using XStream.
16   */
17  public final class XStreamSerialization implements Serialization {
18  
19  	private final InputStream in;
20  	private final OutputStream out;
21  	private final XStream xstream;
22  
23  	/**
24  	 * Initialize for read.
25  	 *
26  	 * @param in the stream to read from.
27  	 */
28  	public XStreamSerialization(final InputStream in) {
29  		this(in, null);
30  	}
31  
32  	/**
33  	 * Initialize for write.
34  	 *
35  	 * @param out the stream to write to.
36  	 */
37  	public XStreamSerialization(final OutputStream out) {
38  		this(null, out);
39  	}
40  
41  	/**
42  	 * Initialize for read and write.
43  	 *
44  	 * @param out the stream to write to.
45  	 * @param in the stream to read from.
46  	 */
47  	public XStreamSerialization(final InputStream in, final OutputStream out) {
48  		this.in = in;
49  		this.out = out;
50  		// TODO using dom driver for xpp has split package
51  		this.xstream = new XStream(new DomDriver());
52  		this.xstream.addImplicitCollection(DomainStore.class, "accounts");
53  		this.xstream.aliasPackage("jabudget.account", Account.class.getPackageName());
54  		this.xstream.aliasType("Store", DomainStore.class);
55  	}
56  
57  	/**
58  	 * {@inheritDoc}
59  	 * <p>
60  	 * <strong>This implementation</strong> writes to the {@link OutputStream} and closes it.
61  	 */
62  	@Override
63  	public void serialize(final DomainStore domainStore) {
64  		xstream.toXML(domainStore, out);
65  		try {
66  			out.close();
67  		} catch (final IOException e) {
68  			// TODO implement failure handling
69  			e.printStackTrace();
70  		}
71  	}
72  
73  	/**
74  	 * {@inheritDoc}
75  	 * <p>
76  	 * <strong>This implementation</strong> reads from the {@link InputStream} and closes it.
77  	 */
78  	@Override
79  	public DomainStore deserialize() {
80  		final DomainStore/../../../de/japrost/jabudget/serialization/DomainStore.html#DomainStore">DomainStore result = (DomainStore) xstream.fromXML(in);
81  		try {
82  			in.close();
83  		} catch (final IOException e) {
84  			// TODO implement failure handling
85  			e.printStackTrace();
86  		}
87  		return result;
88  	}
89  }