1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 package it.tidalwave.thesefoolishthings.examples.dci.marshal.xstream;
27
28 import javax.annotation.Nonnull;
29 import javax.inject.Inject;
30 import java.io.ByteArrayInputStream;
31 import java.io.ByteArrayOutputStream;
32 import java.io.IOException;
33 import java.nio.file.Path;
34 import it.tidalwave.util.AsExtensions;
35 import it.tidalwave.util.ContextManager;
36 import it.tidalwave.util.Id;
37 import it.tidalwave.thesefoolishthings.examples.dci.marshal.role.XStreamContext1;
38 import it.tidalwave.thesefoolishthings.examples.dci.marshal.role.XStreamContext2;
39 import it.tidalwave.thesefoolishthings.examples.person.ListOfPersons;
40 import it.tidalwave.thesefoolishthings.examples.person.Person;
41 import lombok.experimental.ExtensionMethod;
42 import lombok.extern.slf4j.Slf4j;
43 import static it.tidalwave.thesefoolishthings.examples.dci.marshal.role.Loadable._Loadable_;
44 import static it.tidalwave.thesefoolishthings.examples.dci.marshal.role.Savable._Savable_;
45 import static java.nio.charset.StandardCharsets.UTF_8;
46 import static it.tidalwave.role.io.Marshallable._Marshallable_;
47 import static it.tidalwave.role.io.Unmarshallable._Unmarshallable_;
48
49
50
51
52
53
54
55
56
57 @ExtensionMethod(AsExtensions.class) @Slf4j
58 public class DciMarshalXStreamExample
59 {
60 @Inject @Nonnull
61 private ContextManager contextManager;
62
63 public void run()
64 throws IOException
65 {
66 runWithXStreamContext1();
67 runWithXStreamContext2();
68 }
69
70 private void runWithXStreamContext1()
71 throws IOException
72 {
73
74 final var xStreamContext1 = new XStreamContext1();
75
76 try
77 {
78 contextManager.addLocalContext(xStreamContext1);
79 codeThatUsesMarshalling();
80 }
81 finally
82 {
83 contextManager.removeLocalContext(xStreamContext1);
84 }
85
86 }
87
88 @SuppressWarnings("unused")
89 private void runWithXStreamContext2()
90 throws IOException
91 {
92
93 try (final var binder = contextManager.binder(new XStreamContext2()))
94 {
95 codeThatUsesMarshalling();
96 }
97
98 }
99
100 @SuppressWarnings({"unused", "UPM_UNCALLED_PRIVATE_METHOD"})
101 private void alternateSyntax()
102 throws IOException
103 {
104 contextManager.runEWithContexts(this::codeThatUsesMarshalling, new XStreamContext2());
105 final var s = contextManager.runEWithContexts(this::codeThatUsesMarshalling2, new XStreamContext2());
106 log.info("{}", s);
107 }
108
109 private void codeThatUsesMarshalling()
110 throws IOException
111 {
112 final var path1 = Path.of("target/Person.xml");
113 final var path2 = Path.of("target/People.xml");
114
115 final var joe = new Person(new Id("1"), "Joe", "Smith");
116 final var luke = new Person(new Id("2"), "Luke", "Skywalker");
117
118 var marshalledPersons = "";
119 var marshalledPerson = "";
120
121 try (final var os = new ByteArrayOutputStream())
122 {
123 joe.as(_Marshallable_).marshal(os);
124 log.info("******** (joe as Marshallable) marshalled: {}\n", marshalledPerson = os.toString(UTF_8));
125 }
126
127 try (final var os = new ByteArrayOutputStream())
128 {
129 ListOfPersons.of(joe, luke).as(_Marshallable_).marshal(os);
130 log.info("******** (listOfPersons as Marshallable) marshalled: {}\n", marshalledPersons = os.toString(UTF_8));
131 }
132
133
134
135 try (final var is = new ByteArrayInputStream(marshalledPerson.getBytes(UTF_8)))
136 {
137 final var person = Person.prototype().as(_Unmarshallable_).unmarshal(is);
138 log.info("******** Unmarshalled person: {}\n", person);
139 }
140
141 try (final var is = new ByteArrayInputStream(marshalledPersons.getBytes(UTF_8)))
142 {
143 final var listOfPersons = ListOfPersons.empty().as(_Unmarshallable_).unmarshal(is);
144 log.info("******** Unmarshalled persons: {}\n", listOfPersons);
145 }
146
147
148
149 joe.as(_Savable_).saveTo(path1);
150 ListOfPersons.of(joe, luke).as(_Savable_).saveTo(path2);
151 final var p = Person.prototype().as(_Loadable_).loadFrom(path1);
152 final var lp = ListOfPersons.empty().as(_Loadable_).loadFrom(path2);
153
154 log.info("******** Loaded person: {}\n", p);
155 log.info("******** Loaded persons: {}\n", lp);
156 }
157
158 @Nonnull
159 private String codeThatUsesMarshalling2()
160 throws IOException
161 {
162 codeThatUsesMarshalling();
163 return "foo bar";
164 }
165 }