Skip to content

Commit f7e3abc

Browse files
committed
Implemented unpack functionality.
1 parent 9facbe4 commit f7e3abc

File tree

3 files changed

+228
-4
lines changed

3 files changed

+228
-4
lines changed

ocpp-common/src/main/java/eu/chargetime/ocpp/model/TestModel.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package eu.chargetime.ocpp.model;
22

3+
import javax.xml.bind.annotation.XmlElement;
4+
import javax.xml.bind.annotation.XmlRootElement;
35
import java.util.Calendar;
46

57
/*
@@ -33,6 +35,7 @@ of this software and associated documentation files (the "Software"), to deal
3335
* Test model used to check conversion of different field types.
3436
* Used for tests.
3537
*/
38+
@XmlRootElement
3639
public class TestModel {
3740
private String stringTest;
3841
private Calendar calendarTest;
@@ -51,6 +54,7 @@ public Integer[] getArrayTest() {
5154
return arrayTest;
5255
}
5356

57+
@XmlElement
5458
public void setArrayTest(Integer[] arrayTest) {
5559
this.arrayTest = arrayTest;
5660
}
@@ -59,6 +63,7 @@ public TestModel getObjectTest() {
5963
return objectTest;
6064
}
6165

66+
@XmlElement
6267
public void setObjectTest(TestModel objectTest) {
6368
this.objectTest = objectTest;
6469
}
@@ -67,6 +72,7 @@ public boolean isGenericBoleanTest() {
6772
return genericBoleanTest;
6873
}
6974

75+
@XmlElement
7076
public void setGenericBoleanTest(boolean genericBoleanTest) {
7177
this.genericBoleanTest = genericBoleanTest;
7278
}
@@ -75,6 +81,7 @@ public Boolean getBooleanTest() {
7581
return booleanTest;
7682
}
7783

84+
@XmlElement
7885
public void setBooleanTest(Boolean booleanTest) {
7986
this.booleanTest = booleanTest;
8087
}
@@ -83,6 +90,7 @@ public double getGenericDoubleTest() {
8390
return genericDoubleTest;
8491
}
8592

93+
@XmlElement
8694
public void setGenericDoubleTest(double genericDoubleTest) {
8795
this.genericDoubleTest = genericDoubleTest;
8896
}
@@ -91,6 +99,7 @@ public Double getDoubleTest() {
9199
return doubleTest;
92100
}
93101

102+
@XmlElement
94103
public void setDoubleTest(Double doubleTest) {
95104
this.doubleTest = doubleTest;
96105
}
@@ -99,6 +108,7 @@ public long getGenericLongTest() {
99108
return genericLongTest;
100109
}
101110

111+
@XmlElement
102112
public void setGenericLongTest(long genericLongTest) {
103113
this.genericLongTest = genericLongTest;
104114
}
@@ -107,6 +117,7 @@ public Long getLongTest() {
107117
return longTest;
108118
}
109119

120+
@XmlElement
110121
public void setLongTest(Long longTest) {
111122
this.longTest = longTest;
112123
}
@@ -115,6 +126,7 @@ public int getIntTest() {
115126
return intTest;
116127
}
117128

129+
@XmlElement
118130
public void setIntTest(int intTest) {
119131
this.intTest = intTest;
120132
}
@@ -123,6 +135,7 @@ public Integer getIntegerTest() {
123135
return integerTest;
124136
}
125137

138+
@XmlElement
126139
public void setIntegerTest(Integer integerTest) {
127140
this.integerTest = integerTest;
128141
}
@@ -131,6 +144,7 @@ public Calendar getCalendarTest() {
131144
return calendarTest;
132145
}
133146

147+
@XmlElement
134148
public void setCalendarTest(Calendar calendarTest) {
135149
this.calendarTest = calendarTest;
136150
}
@@ -139,6 +153,7 @@ public String getStringTest() {
139153
return stringTest;
140154
}
141155

156+
@XmlElement
142157
public void setStringTest(String stringTest) {
143158
this.stringTest = stringTest;
144159
}

ocpp-v1_6/src/main/java/eu/chargetime/ocpp/SOAPCommunicator.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ of this software and associated documentation files (the "Software"), to deal
3030
import javax.xml.bind.JAXBContext;
3131
import javax.xml.bind.JAXBException;
3232
import javax.xml.bind.Marshaller;
33+
import javax.xml.bind.Unmarshaller;
3334
import javax.xml.parsers.DocumentBuilderFactory;
3435
import javax.xml.parsers.ParserConfigurationException;
3536
import javax.xml.soap.*;
@@ -49,8 +50,17 @@ public SOAPCommunicator(String chargeBoxIdentity, String fromUrl, Radio radio) {
4950
}
5051

5152
@Override
52-
public <T> T unpackPayload(Object payload, Class<T> type) throws Exception {
53-
return null;
53+
public <T> T unpackPayload(Object payload, Class<T> type) {
54+
Document input = (Document) payload;
55+
T output = null;
56+
Unmarshaller unmarshaller = null;
57+
try {
58+
unmarshaller = JAXBContext.newInstance(type).createUnmarshaller();
59+
output = (T) unmarshaller.unmarshal(input);
60+
} catch (JAXBException e) {
61+
e.printStackTrace();
62+
}
63+
return output;
5464
}
5565

5666
@Override

ocpp-v1_6/src/test/java/eu/chargetime/ocpp/test/SOAPCommunicatorTest.java

Lines changed: 201 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,27 @@
22

33
import eu.chargetime.ocpp.SOAPCommunicator;
44
import eu.chargetime.ocpp.Transmitter;
5+
import eu.chargetime.ocpp.model.TestModel;
56
import eu.chargetime.ocpp.model.core.BootNotificationRequest;
67
import eu.chargetime.ocpp.utilities.TestUtilities;
78
import org.junit.Before;
89
import org.junit.Test;
910
import org.mockito.Mock;
1011
import org.w3c.dom.Document;
12+
import org.xml.sax.InputSource;
1113

14+
import javax.xml.parsers.DocumentBuilder;
15+
import javax.xml.parsers.DocumentBuilderFactory;
1216
import javax.xml.transform.Transformer;
1317
import javax.xml.transform.TransformerFactory;
1418
import javax.xml.transform.dom.DOMSource;
1519
import javax.xml.transform.stream.StreamResult;
20+
import java.io.StringReader;
1621
import java.io.StringWriter;
22+
import java.util.Calendar;
23+
import java.util.TimeZone;
1724

18-
import static org.hamcrest.CoreMatchers.equalTo;
25+
import static org.hamcrest.CoreMatchers.*;
1926
import static org.hamcrest.MatcherAssert.assertThat;
2027
import static org.mockito.Mockito.mock;
2128

@@ -58,6 +65,189 @@ public void setup() {
5865
communicator = new SOAPCommunicator(chargeBoxIdentity, fromUrl, transmitter);
5966
}
6067

68+
@Test
69+
public void unpackPayload_emptyPayload_returnRequestedType() throws Exception {
70+
// Given
71+
Document payload = stringToDocument("<bootNotificationRequest xmlns=\"urn://Ocpp/Cp/2015/10\"></bootNotificationRequest>");
72+
Class<?> type = BootNotificationRequest.class;
73+
74+
// When
75+
Object result = communicator.unpackPayload(payload, type);
76+
77+
// Then
78+
assertThat(result, instanceOf(type));
79+
}
80+
81+
@Test
82+
public void unpackPayload_aStringPayload_returnsTestModelWithAString() throws Exception {
83+
// Given
84+
String aString = "Some string";
85+
String xml = "<testModel><stringTest>%s</stringTest></testModel>";
86+
Document payload = stringToDocument(String.format(xml, aString));
87+
88+
// When
89+
TestModel model = communicator.unpackPayload(payload, TestModel.class);
90+
91+
// Then
92+
assertThat(model.getStringTest(), equalTo(aString));
93+
}
94+
95+
@Test
96+
public void unpackPayload_aCalendarPayload_returnsTestModelWithACalendar() throws Exception {
97+
// Given
98+
String aCalendar = "2016-04-28T07:16:11.988Z";
99+
String xml = "<testModel><calendarTest>%s</calendarTest></testModel>";
100+
Document payload = stringToDocument(String.format(xml, aCalendar));
101+
102+
Calendar someDate = new Calendar.Builder().setDate(2016, 03, 28).setTimeOfDay(07, 16, 11, 988).setTimeZone(TimeZone.getTimeZone("GMT+00:00")).build();
103+
104+
// When
105+
TestModel model = communicator.unpackPayload(payload, TestModel.class);
106+
107+
// Then
108+
assertThat(model.getCalendarTest().compareTo(someDate), is(0));
109+
}
110+
111+
@Test
112+
public void unpackPayload_anIntegerPayload_returnsTestModelWithAnInteger() throws Exception {
113+
// Given
114+
Integer anInteger = 1337;
115+
String xml = "<testModel><integerTest>%d</integerTest></testModel>";
116+
Document payload = stringToDocument(String.format(xml, anInteger));
117+
118+
119+
// When
120+
TestModel model = communicator.unpackPayload(payload, TestModel.class);
121+
122+
// Then
123+
assertThat(model.getIntegerTest(), equalTo(anInteger));
124+
}
125+
126+
@Test
127+
public void unpackPayload_aGenericIntPayload_returnsTestModelWithAGenericInt() throws Exception {
128+
// Given
129+
int anInteger = 1337;
130+
String xml = "<testModel><intTest>%d</intTest></testModel>";
131+
Document payload = stringToDocument(String.format(xml, anInteger));
132+
133+
// When
134+
TestModel model = communicator.unpackPayload(payload, TestModel.class);
135+
136+
// Then
137+
assertThat(model.getIntTest(), equalTo(anInteger));
138+
}
139+
140+
@Test
141+
public void unpackPayload_aLongPayload_returnsTestModelWithALong() throws Exception {
142+
// Given
143+
Long aLong = 1337L;
144+
String xml = "<testModel><longTest>%d</longTest></testModel>";
145+
Document payload = stringToDocument(String.format(xml, aLong));
146+
147+
// When
148+
TestModel model = communicator.unpackPayload(payload, TestModel.class);
149+
150+
// Then
151+
assertThat(model.getLongTest(), equalTo(aLong));
152+
}
153+
154+
@Test
155+
public void unpackPayload_aGenericLongPayload_returnsTestModelWithAGenericLong() throws Exception {
156+
// Given
157+
long aLong = 1337;
158+
String xml = "<testModel><genericLongTest>%d</genericLongTest></testModel>";
159+
Document payload = stringToDocument(String.format(xml, aLong));
160+
161+
// When
162+
TestModel model = communicator.unpackPayload(payload, TestModel.class);
163+
164+
// Then
165+
assertThat(model.getGenericLongTest(), equalTo(aLong));
166+
}
167+
168+
@Test
169+
public void unpackPayload_aDoublePayload_returnsTestModelWithADouble() throws Exception {
170+
// Given
171+
Double aDouble = 13.37D;
172+
String xml = "<testModel><doubleTest>%f</doubleTest></testModel>";
173+
Document payload = stringToDocument(String.format(xml, aDouble));
174+
175+
// When
176+
TestModel model = communicator.unpackPayload(payload, TestModel.class);
177+
178+
// Then
179+
assertThat(model.getDoubleTest(), equalTo(aDouble));
180+
}
181+
182+
@Test
183+
public void unpackPayload_aGenericDoublePayload_returnsTestModelWithAGenericDouble() throws Exception {
184+
// Given
185+
double aDouble = 13.37;
186+
String xml = "<testModel><genericDoubleTest>%f</genericDoubleTest></testModel>";
187+
Document payload = stringToDocument(String.format(xml, aDouble));
188+
189+
// When
190+
TestModel model = communicator.unpackPayload(payload, TestModel.class);
191+
192+
// Then
193+
assertThat(model.getGenericDoubleTest(), equalTo(aDouble));
194+
}
195+
196+
@Test
197+
public void unpackPayload_aBooleanPayload_returnsTestModelWithABoolean() throws Exception {
198+
// Given
199+
Boolean aBoolean = false;
200+
String xml = "<testModel><booleanTest>%b</booleanTest></testModel>";
201+
Document payload = stringToDocument(String.format(xml, aBoolean));
202+
203+
// When
204+
TestModel model = communicator.unpackPayload(payload, TestModel.class);
205+
206+
// Then
207+
assertThat(model.getBooleanTest(), equalTo(aBoolean));
208+
}
209+
210+
@Test
211+
public void unpackPayload_aGenericBooleanPayload_returnsTestModelWithAGenericBoolean() throws Exception {
212+
// Given
213+
boolean aBoolean = false;
214+
String xml = "<testModel><genericBooleanTest>%b</genericBooleanTest></testModel>";
215+
Document payload = stringToDocument(String.format(xml, aBoolean));
216+
217+
// When
218+
TestModel model = communicator.unpackPayload(payload, TestModel.class);
219+
220+
// Then
221+
assertThat(model.isGenericBoleanTest(), equalTo(aBoolean));
222+
}
223+
224+
@Test
225+
public void unpackPayload_anObjectPayload_returnsTestModelWithAnObject() throws Exception {
226+
// Given
227+
String xml = "<testModel><objectTest></objectTest></testModel>";
228+
Document payload = stringToDocument(xml);
229+
230+
// When
231+
TestModel model = communicator.unpackPayload(payload, TestModel.class);
232+
233+
// Then
234+
assertThat(model.getObjectTest(), instanceOf(TestModel.class));
235+
}
236+
237+
@Test
238+
public void unpackPayload_anArrayOfInts_returnsTestModelWithAnArrayOfInts() throws Exception {
239+
// Given
240+
Integer[] anArray = {1, 2, 3};
241+
String xml = "<testModel><arrayTest>1</arrayTest><arrayTest>2</arrayTest><arrayTest>3</arrayTest></testModel>";
242+
Document payload = stringToDocument(xml);
243+
244+
// When
245+
TestModel model = communicator.unpackPayload(payload, TestModel.class);
246+
247+
// Then
248+
assertThat(model.getArrayTest(), equalTo(anArray));
249+
}
250+
61251
@Test
62252
public void pack_bootNotificationRequest_returnsBootNotificationRequestPayload() {
63253
// Given
@@ -72,7 +262,6 @@ public void pack_bootNotificationRequest_returnsBootNotificationRequestPayload()
72262
assertThat(docToString(payload), equalTo(expected));
73263
}
74264

75-
76265
public static String docToString(Document doc) {
77266
try {
78267
StringWriter sw = new StringWriter();
@@ -85,5 +274,15 @@ public static String docToString(Document doc) {
85274
}
86275
}
87276

277+
public static Document stringToDocument(String xml) throws Exception {
278+
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
279+
factory.setNamespaceAware(true);
280+
DocumentBuilder db = factory.newDocumentBuilder();
281+
282+
InputSource is = new InputSource();
283+
is.setCharacterStream(new StringReader(xml));
284+
db.isNamespaceAware();
285+
return db.parse(is);
286+
}
88287

89288
}

0 commit comments

Comments
 (0)