Skip to content

Commit a06bb80

Browse files
merge
2 parents 6c02a8e + 2a5ede1 commit a06bb80

148 files changed

Lines changed: 7424 additions & 301 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package de.rwth.idsg.steve.ocpp.ws;
2+
3+
import com.google.common.base.Preconditions;
4+
import com.google.common.collect.ImmutableSet;
5+
import com.google.common.reflect.ClassPath;
6+
import de.rwth.idsg.steve.ocpp.RequestType;
7+
import de.rwth.idsg.steve.ocpp.ResponseType;
8+
import de.rwth.idsg.steve.ocpp.ws.data.ActionResponsePair;
9+
10+
import java.io.IOException;
11+
import java.util.HashMap;
12+
import java.util.Map;
13+
14+
/**
15+
* @author Sevket Goekay <goekay@dbis.rwth-aachen.de>
16+
* @since 14.05.2018
17+
*/
18+
public abstract class AbstractTypeStore implements TypeStore {
19+
20+
private static final String REQUEST_CLASS_SUFFIX = "Request";
21+
private static final String RESPONSE_CLASS_SUFFIX = "Response";
22+
23+
private final Map<String, Class<? extends RequestType>> requestClassMap = new HashMap<>();
24+
private final Map<Class<? extends RequestType>, ActionResponsePair> actionResponseMap = new HashMap<>();
25+
26+
public AbstractTypeStore(String packageForRequestClassMap,
27+
String packageForActionResponseMap) {
28+
populateRequestClassMap(packageForRequestClassMap);
29+
populateActionResponseMap(packageForActionResponseMap);
30+
}
31+
32+
@Override
33+
public Class<? extends RequestType> findRequestClass(String action) {
34+
return requestClassMap.get(action);
35+
}
36+
37+
@Override
38+
public <T extends RequestType> ActionResponsePair findActionResponse(T requestPayload) {
39+
return actionResponseMap.get(requestPayload.getClass());
40+
}
41+
42+
// -------------------------------------------------------------------------
43+
// Private helpers
44+
// -------------------------------------------------------------------------
45+
46+
private void populateRequestClassMap(String packageName) {
47+
Map<String, Class<RequestType>> classes = getClassesWithInterface(packageName, RequestType.class);
48+
for (Class<RequestType> clazz : classes.values()) {
49+
String action = getAction(clazz);
50+
Preconditions.checkNotNull(action);
51+
requestClassMap.put(action, clazz);
52+
}
53+
}
54+
55+
private void populateActionResponseMap(String packageName) {
56+
Map<String, Class<RequestType>> requestClasses = getClassesWithInterface(packageName, RequestType.class);
57+
Map<String, Class<ResponseType>> responseClasses = getClassesWithInterface(packageName, ResponseType.class);
58+
59+
for (Class<RequestType> requestClass : requestClasses.values()) {
60+
String action = getAction(requestClass);
61+
Preconditions.checkNotNull(action);
62+
63+
String responseClassSimpleName = action + RESPONSE_CLASS_SUFFIX;
64+
Class<? extends ResponseType> responseClass = responseClasses.get(responseClassSimpleName);
65+
Preconditions.checkNotNull(responseClass);
66+
67+
actionResponseMap.put(requestClass, new ActionResponsePair(action, responseClass));
68+
}
69+
}
70+
71+
/**
72+
* @return <simple name of class, class>
73+
*/
74+
@SuppressWarnings("unchecked")
75+
private static <INTERFACE, IMPL extends INTERFACE> Map<String, Class<IMPL>> getClassesWithInterface(
76+
String packageName, Class<INTERFACE> interfaceClass) {
77+
try {
78+
ImmutableSet<ClassPath.ClassInfo> classInfos =
79+
ClassPath.from(Thread.currentThread().getContextClassLoader())
80+
.getTopLevelClasses(packageName);
81+
82+
Map<String, Class<IMPL>> map = new HashMap<>();
83+
for (ClassPath.ClassInfo classInfo : classInfos) {
84+
Class<?> clazz = classInfo.load();
85+
if (interfaceClass.isAssignableFrom(clazz)) {
86+
map.put(clazz.getSimpleName(), (Class<IMPL>) clazz);
87+
}
88+
}
89+
return map;
90+
} catch (IOException e) {
91+
throw new RuntimeException(e);
92+
}
93+
}
94+
95+
private static String getAction(Class<? extends RequestType> clazz) {
96+
String s = clazz.getSimpleName();
97+
if (s.endsWith(REQUEST_CLASS_SUFFIX)) {
98+
s = s.substring(0, s.length() - REQUEST_CLASS_SUFFIX.length());
99+
}
100+
return s;
101+
}
102+
}

src/main/java/de/rwth/idsg/steve/ocpp/ws/ocpp12/Ocpp12JacksonModule.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ public void setupModule(SetupContext sc) {
2222
super.setupModule(sc);
2323

2424
EnumProcessor.apply(
25-
Arrays.asList("ocpp.cp._2010._08", "ocpp.cs._2010._08"),
25+
Arrays.asList(
26+
ocpp.cs._2010._08.ObjectFactory.class.getPackage().getName(),
27+
ocpp.cp._2010._08.ObjectFactory.class.getPackage().getName()
28+
),
2629
clazz -> sc.setMixInAnnotations(clazz, EnumMixin.class)
2730
);
2831
}
Lines changed: 8 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,19 @@
11
package de.rwth.idsg.steve.ocpp.ws.ocpp12;
22

3-
import de.rwth.idsg.steve.ocpp.RequestType;
4-
import de.rwth.idsg.steve.ocpp.ws.TypeStore;
5-
import de.rwth.idsg.steve.ocpp.ws.data.ActionResponsePair;
6-
import ocpp.cp._2010._08.ChangeAvailabilityResponse;
7-
import ocpp.cp._2010._08.ChangeConfigurationResponse;
8-
import ocpp.cp._2010._08.ClearCacheResponse;
9-
import ocpp.cp._2010._08.GetDiagnosticsResponse;
10-
import ocpp.cp._2010._08.RemoteStartTransactionResponse;
11-
import ocpp.cp._2010._08.RemoteStopTransactionResponse;
12-
import ocpp.cp._2010._08.ResetResponse;
13-
import ocpp.cp._2010._08.UnlockConnectorResponse;
14-
import ocpp.cp._2010._08.UpdateFirmwareResponse;
15-
import ocpp.cs._2010._08.AuthorizeRequest;
16-
import ocpp.cs._2010._08.DiagnosticsStatusNotificationRequest;
17-
import ocpp.cs._2010._08.FirmwareStatusNotificationRequest;
18-
import ocpp.cs._2010._08.HeartbeatRequest;
19-
import ocpp.cs._2010._08.MeterValuesRequest;
20-
import ocpp.cs._2010._08.StartTransactionRequest;
21-
import ocpp.cs._2010._08.StatusNotificationRequest;
22-
import ocpp.cs._2010._08.StopTransactionRequest;
23-
import org.springframework.stereotype.Component;
3+
import de.rwth.idsg.steve.ocpp.ws.AbstractTypeStore;
244

255
/**
266
* @author Sevket Goekay <goekay@dbis.rwth-aachen.de>
277
* @since 17.03.2015
288
*/
29-
public enum Ocpp12TypeStore implements TypeStore {
30-
INSTANCE;
9+
public final class Ocpp12TypeStore extends AbstractTypeStore {
3110

32-
@Override
33-
public Class<? extends RequestType> findRequestClass(String action) {
34-
switch (action) {
35-
case "FirmwareStatusNotification":
36-
return FirmwareStatusNotificationRequest.class;
37-
case "StatusNotification":
38-
return StatusNotificationRequest.class;
39-
case "MeterValues":
40-
return MeterValuesRequest.class;
41-
case "DiagnosticsStatusNotification":
42-
return DiagnosticsStatusNotificationRequest.class;
43-
case "StartTransaction":
44-
return StartTransactionRequest.class;
45-
case "StopTransaction":
46-
return StopTransactionRequest.class;
47-
case "Heartbeat":
48-
return HeartbeatRequest.class;
49-
case "Authorize":
50-
return AuthorizeRequest.class;
51-
default:
52-
return null;
53-
}
54-
}
11+
public static final Ocpp12TypeStore INSTANCE = new Ocpp12TypeStore();
5512

56-
@Override
57-
public <T extends RequestType> ActionResponsePair findActionResponse(T requestPayload) {
58-
switch (requestPayload.getClass().getSimpleName()) {
59-
case "UnlockConnectorRequest":
60-
return new ActionResponsePair("UnlockConnector", UnlockConnectorResponse.class);
61-
case "ResetRequest":
62-
return new ActionResponsePair("Reset", ResetResponse.class);
63-
case "ChangeAvailabilityRequest":
64-
return new ActionResponsePair("ChangeAvailability", ChangeAvailabilityResponse.class);
65-
case "GetDiagnosticsRequest":
66-
return new ActionResponsePair("GetDiagnostics", GetDiagnosticsResponse.class);
67-
case "ClearCacheRequest":
68-
return new ActionResponsePair("ClearCache", ClearCacheResponse.class);
69-
case "UpdateFirmwareRequest":
70-
return new ActionResponsePair("UpdateFirmware", UpdateFirmwareResponse.class);
71-
case "ChangeConfigurationRequest":
72-
return new ActionResponsePair("ChangeConfiguration", ChangeConfigurationResponse.class);
73-
case "RemoteStartTransactionRequest":
74-
return new ActionResponsePair("RemoteStartTransaction", RemoteStartTransactionResponse.class);
75-
case "RemoteStopTransactionRequest":
76-
return new ActionResponsePair("RemoteStopTransaction", RemoteStopTransactionResponse.class);
77-
default:
78-
return null;
79-
}
13+
private Ocpp12TypeStore() {
14+
super(
15+
ocpp.cs._2010._08.ObjectFactory.class.getPackage().getName(),
16+
ocpp.cp._2010._08.ObjectFactory.class.getPackage().getName()
17+
);
8018
}
8119
}

src/main/java/de/rwth/idsg/steve/ocpp/ws/ocpp15/Ocpp15JacksonModule.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@ public void setupModule(Module.SetupContext sc) {
2727
sc.setMixInAnnotations(MeterValuesRequest.class, MeterValue15Mixin.class);
2828

2929
EnumProcessor.apply(
30-
Arrays.asList("ocpp.cp._2012._06", "ocpp.cs._2012._06"),
30+
Arrays.asList(
31+
ocpp.cs._2012._06.ObjectFactory.class.getPackage().getName(),
32+
ocpp.cp._2012._06.ObjectFactory.class.getPackage().getName()
33+
),
3134
clazz -> sc.setMixInAnnotations(clazz, EnumMixin.class)
3235
);
3336
}
Lines changed: 8 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -1,106 +1,20 @@
11
package de.rwth.idsg.steve.ocpp.ws.ocpp15;
22

3-
import de.rwth.idsg.steve.ocpp.RequestType;
4-
import de.rwth.idsg.steve.ocpp.ws.TypeStore;
5-
import de.rwth.idsg.steve.ocpp.ws.data.ActionResponsePair;
6-
import ocpp.cp._2012._06.CancelReservationResponse;
7-
import ocpp.cp._2012._06.ChangeAvailabilityResponse;
8-
import ocpp.cp._2012._06.ChangeConfigurationResponse;
9-
import ocpp.cp._2012._06.ClearCacheResponse;
10-
import ocpp.cp._2012._06.DataTransferResponse;
11-
import ocpp.cp._2012._06.GetConfigurationResponse;
12-
import ocpp.cp._2012._06.GetDiagnosticsResponse;
13-
import ocpp.cp._2012._06.GetLocalListVersionResponse;
14-
import ocpp.cp._2012._06.RemoteStartTransactionResponse;
15-
import ocpp.cp._2012._06.RemoteStopTransactionResponse;
16-
import ocpp.cp._2012._06.ReserveNowResponse;
17-
import ocpp.cp._2012._06.ResetResponse;
18-
import ocpp.cp._2012._06.SendLocalListResponse;
19-
import ocpp.cp._2012._06.UnlockConnectorResponse;
20-
import ocpp.cp._2012._06.UpdateFirmwareResponse;
21-
import ocpp.cs._2012._06.AuthorizeRequest;
22-
import ocpp.cs._2012._06.BootNotificationRequest;
23-
import ocpp.cs._2012._06.DiagnosticsStatusNotificationRequest;
24-
import ocpp.cs._2012._06.FirmwareStatusNotificationRequest;
25-
import ocpp.cs._2012._06.HeartbeatRequest;
26-
import ocpp.cs._2012._06.MeterValuesRequest;
27-
import ocpp.cs._2012._06.StartTransactionRequest;
28-
import ocpp.cs._2012._06.StatusNotificationRequest;
29-
import ocpp.cs._2012._06.StopTransactionRequest;
3+
import de.rwth.idsg.steve.ocpp.ws.AbstractTypeStore;
304

315
/**
326
* @author Sevket Goekay <goekay@dbis.rwth-aachen.de>
337
* @since 15.03.2015
348
*/
35-
public enum Ocpp15TypeStore implements TypeStore {
36-
INSTANCE;
9+
public final class Ocpp15TypeStore extends AbstractTypeStore {
3710

38-
@Override
39-
public Class<? extends RequestType> findRequestClass(String action) {
40-
switch (action) {
41-
case "BootNotification":
42-
return BootNotificationRequest.class;
43-
case "FirmwareStatusNotification":
44-
return FirmwareStatusNotificationRequest.class;
45-
case "StatusNotification":
46-
return StatusNotificationRequest.class;
47-
case "MeterValues":
48-
return MeterValuesRequest.class;
49-
case "DiagnosticsStatusNotification":
50-
return DiagnosticsStatusNotificationRequest.class;
51-
case "StartTransaction":
52-
return StartTransactionRequest.class;
53-
case "StopTransaction":
54-
return StopTransactionRequest.class;
55-
case "Heartbeat":
56-
return HeartbeatRequest.class;
57-
case "Authorize":
58-
return AuthorizeRequest.class;
59-
case "DataTransfer":
60-
return ocpp.cs._2012._06.DataTransferRequest.class;
61-
default:
62-
return null;
63-
}
64-
}
65-
66-
@Override
67-
public <T extends RequestType> ActionResponsePair findActionResponse(T requestPayload) {
68-
switch (requestPayload.getClass().getSimpleName()) {
69-
case "UnlockConnectorRequest":
70-
return new ActionResponsePair("UnlockConnector", UnlockConnectorResponse.class);
71-
case "ResetRequest":
72-
return new ActionResponsePair("Reset", ResetResponse.class);
73-
case "ChangeAvailabilityRequest":
74-
return new ActionResponsePair("ChangeAvailability", ChangeAvailabilityResponse.class);
75-
case "GetDiagnosticsRequest":
76-
return new ActionResponsePair("GetDiagnostics", GetDiagnosticsResponse.class);
77-
case "ClearCacheRequest":
78-
return new ActionResponsePair("ClearCache", ClearCacheResponse.class);
79-
case "UpdateFirmwareRequest":
80-
return new ActionResponsePair("UpdateFirmware", UpdateFirmwareResponse.class);
81-
case "ChangeConfigurationRequest":
82-
return new ActionResponsePair("ChangeConfiguration", ChangeConfigurationResponse.class);
83-
case "RemoteStartTransactionRequest":
84-
return new ActionResponsePair("RemoteStartTransaction", RemoteStartTransactionResponse.class);
85-
case "RemoteStopTransactionRequest":
86-
return new ActionResponsePair("RemoteStopTransaction", RemoteStopTransactionResponse.class);
11+
public static final Ocpp15TypeStore INSTANCE = new Ocpp15TypeStore();
8712

88-
// new in ocpp 1.5
89-
case "CancelReservationRequest":
90-
return new ActionResponsePair("CancelReservation", CancelReservationResponse.class);
91-
case "DataTransferRequest":
92-
return new ActionResponsePair("DataTransfer", DataTransferResponse.class);
93-
case "GetConfigurationRequest":
94-
return new ActionResponsePair("GetConfiguration", GetConfigurationResponse.class);
95-
case "GetLocalListVersionRequest":
96-
return new ActionResponsePair("GetLocalListVersion", GetLocalListVersionResponse.class);
97-
case "ReserveNowRequest":
98-
return new ActionResponsePair("ReserveNow", ReserveNowResponse.class);
99-
case "SendLocalListRequest":
100-
return new ActionResponsePair("SendLocalList", SendLocalListResponse.class);
101-
default:
102-
return null;
103-
}
13+
private Ocpp15TypeStore() {
14+
super(
15+
ocpp.cs._2012._06.ObjectFactory.class.getPackage().getName(),
16+
ocpp.cp._2012._06.ObjectFactory.class.getPackage().getName()
17+
);
10418
}
10519

10620
}

src/main/java/de/rwth/idsg/steve/ocpp/ws/ocpp16/Ocpp16JacksonModule.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ public void setupModule(SetupContext sc) {
2222
super.setupModule(sc);
2323

2424
EnumProcessor.apply(
25-
Arrays.asList("ocpp.cp._2015._10", "ocpp.cs._2015._10"),
25+
Arrays.asList(
26+
ocpp.cs._2015._10.ObjectFactory.class.getPackage().getName(),
27+
ocpp.cp._2015._10.ObjectFactory.class.getPackage().getName()
28+
),
2629
clazz -> sc.setMixInAnnotations(clazz, EnumMixin.class)
2730
);
2831
}

0 commit comments

Comments
 (0)