Skip to content

Commit 1715d39

Browse files
committed
remember "not registered" chargebox ids and present in UI
basically, the same as in b6aa8d9 for charge box ids.
1 parent d008b89 commit 1715d39

13 files changed

Lines changed: 190 additions & 98 deletions

src/main/java/de/rwth/idsg/steve/config/WebSocketConfiguration.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import de.rwth.idsg.steve.ocpp.ws.ocpp15.Ocpp15WebSocketEndpoint;
88
import de.rwth.idsg.steve.ocpp.ws.ocpp16.Ocpp16WebSocketEndpoint;
99
import de.rwth.idsg.steve.repository.ChargePointRepository;
10+
import de.rwth.idsg.steve.service.ChargePointHelperService;
1011
import de.rwth.idsg.steve.service.NotificationService;
1112
import lombok.extern.slf4j.Slf4j;
1213
import org.eclipse.jetty.websocket.api.WebSocketBehavior;
@@ -36,6 +37,7 @@ public class WebSocketConfiguration implements WebSocketConfigurer {
3637

3738
@Autowired private ChargePointRepository chargePointRepository;
3839
@Autowired private NotificationService notificationService;
40+
@Autowired private ChargePointHelperService chargePointHelperService;
3941

4042
@Autowired private Ocpp12WebSocketEndpoint ocpp12WebSocketEndpoint;
4143
@Autowired private Ocpp15WebSocketEndpoint ocpp15WebSocketEndpoint;
@@ -55,7 +57,8 @@ public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
5557
List<AbstractWebSocketEndpoint> endpoints = getEndpoints();
5658
String[] protocols = endpoints.stream().map(e -> e.getVersion().getValue()).toArray(String[]::new);
5759

58-
OcppWebSocketUpgrader upgradeStrategy = new OcppWebSocketUpgrader(policy, endpoints, chargePointRepository, notificationService);
60+
OcppWebSocketUpgrader upgradeStrategy = new OcppWebSocketUpgrader(
61+
policy, endpoints, chargePointRepository, notificationService, chargePointHelperService);
5962

6063
DefaultHandshakeHandler handler = new DefaultHandshakeHandler(upgradeStrategy);
6164
handler.setSupportedProtocols(protocols);

src/main/java/de/rwth/idsg/steve/ocpp/ws/OcppWebSocketUpgrader.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package de.rwth.idsg.steve.ocpp.ws;
22

33
import de.rwth.idsg.steve.repository.ChargePointRepository;
4+
import de.rwth.idsg.steve.service.ChargePointHelperService;
45
import de.rwth.idsg.steve.service.NotificationService;
56
import org.eclipse.jetty.websocket.api.WebSocketPolicy;
67
import org.springframework.http.server.ServerHttpRequest;
@@ -24,13 +25,16 @@ public class OcppWebSocketUpgrader extends JettyRequestUpgradeStrategy {
2425
private final List<AbstractWebSocketEndpoint> endpoints;
2526
private final ChargePointRepository chargePointRepository;
2627
private final NotificationService notificationService;
28+
private final ChargePointHelperService chargePointHelperService;
2729

2830
public OcppWebSocketUpgrader(WebSocketPolicy policy, List<AbstractWebSocketEndpoint> endpoints,
29-
ChargePointRepository chargePointRepository, NotificationService notificationService) {
31+
ChargePointRepository chargePointRepository, NotificationService notificationService,
32+
ChargePointHelperService chargePointHelperService) {
3033
super(policy);
3134
this.endpoints = endpoints;
3235
this.chargePointRepository = chargePointRepository;
3336
this.notificationService = notificationService;
37+
this.chargePointHelperService = chargePointHelperService;
3438
}
3539

3640
@Override
@@ -46,6 +50,8 @@ public void upgrade(ServerHttpRequest request, ServerHttpResponse response,
4650
if (chargePointRepository.isRegistered(chargeBoxId)) {
4751
attributes.put(AbstractWebSocketEndpoint.CHARGEBOX_ID_KEY, chargeBoxId);
4852
} else {
53+
chargePointHelperService.rememberNewUnknown(chargeBoxId);
54+
4955
// send only if the station is not registered, because otherwise, after the connection it will send a boot
5056
// notification message and we handle the notifications for these normal cases in service classes already.
5157
notificationService.ocppStationBooted(chargeBoxId, false);

src/main/java/de/rwth/idsg/steve/service/CentralSystemService16_Service.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public class CentralSystemService16_Service {
4848
@Autowired private SettingsRepository settingsRepository;
4949
@Autowired private OcppTagService ocppTagService;
5050
@Autowired private NotificationService notificationService;
51+
@Autowired private ChargePointHelperService chargePointHelperService;
5152

5253
public BootNotificationResponse bootNotification(BootNotificationRequest parameters, String chargeBoxIdentity,
5354
OcppProtocol ocppProtocol) {
@@ -72,7 +73,13 @@ public BootNotificationResponse bootNotification(BootNotificationRequest paramet
7273
boolean isRegistered = ocppServerRepository.updateChargebox(params);
7374
notificationService.ocppStationBooted(chargeBoxIdentity, isRegistered);
7475

75-
RegistrationStatus status = isRegistered ? RegistrationStatus.ACCEPTED : RegistrationStatus.REJECTED;
76+
RegistrationStatus status;
77+
if (isRegistered) {
78+
status = RegistrationStatus.ACCEPTED;
79+
} else {
80+
status = RegistrationStatus.REJECTED;
81+
chargePointHelperService.rememberNewUnknown(chargeBoxIdentity);
82+
}
7683

7784
return new BootNotificationResponse()
7885
.withStatus(status)

src/main/java/de/rwth/idsg/steve/service/ChargePointHelperService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package de.rwth.idsg.steve.service;
22

33
import de.rwth.idsg.steve.repository.dto.ChargePointSelect;
4+
import de.rwth.idsg.steve.service.dto.UnidentifiedIncomingObject;
45
import de.rwth.idsg.steve.web.dto.OcppJsonStatus;
56
import de.rwth.idsg.steve.web.dto.Statistics;
67

@@ -16,4 +17,7 @@ public interface ChargePointHelperService {
1617
List<ChargePointSelect> getChargePointsV12();
1718
List<ChargePointSelect> getChargePointsV15();
1819
List<ChargePointSelect> getChargePointsV16();
20+
21+
void rememberNewUnknown(String chargeBoxId);
22+
List<UnidentifiedIncomingObject> getUnknownChargePoints();
1923
}

src/main/java/de/rwth/idsg/steve/service/ChargePointHelperServiceImpl.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import de.rwth.idsg.steve.repository.GenericRepository;
1313
import de.rwth.idsg.steve.repository.dto.ChargePointSelect;
1414
import de.rwth.idsg.steve.repository.dto.ConnectorStatus;
15+
import de.rwth.idsg.steve.service.dto.UnidentifiedIncomingObject;
1516
import de.rwth.idsg.steve.utils.ConnectorStatusCountFilter;
1617
import de.rwth.idsg.steve.utils.DateTimeUtils;
1718
import de.rwth.idsg.steve.web.dto.OcppJsonStatus;
@@ -27,7 +28,6 @@
2728
import java.util.List;
2829
import java.util.Map;
2930
import java.util.stream.Collectors;
30-
import java.util.stream.Stream;
3131

3232
/**
3333
* @author Sevket Goekay <goekay@dbis.rwth-aachen.de>
@@ -46,6 +46,8 @@ public class ChargePointHelperServiceImpl implements ChargePointHelperService {
4646
@Autowired private Ocpp15WebSocketEndpoint ocpp15WebSocketEndpoint;
4747
@Autowired private Ocpp16WebSocketEndpoint ocpp16WebSocketEndpoint;
4848

49+
private final UnidentifiedIncomingObjectService unknownChargePointService = new UnidentifiedIncomingObjectService(100);
50+
4951
@Override
5052
public Statistics getStats() {
5153
Statistics stats = genericRepository.getStats();
@@ -92,6 +94,16 @@ public List<ChargePointSelect> getChargePointsV16() {
9294
return getChargePoints(OcppProtocol.V_16_SOAP, ocpp16WebSocketEndpoint);
9395
}
9496

97+
@Override
98+
public void rememberNewUnknown(String chargeBoxId) {
99+
unknownChargePointService.processNewUnidentified(chargeBoxId);
100+
}
101+
102+
@Override
103+
public List<UnidentifiedIncomingObject> getUnknownChargePoints() {
104+
return unknownChargePointService.getObjects();
105+
}
106+
95107
// -------------------------------------------------------------------------
96108
// Helpers
97109
// -------------------------------------------------------------------------

src/main/java/de/rwth/idsg/steve/service/OcppTagService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package de.rwth.idsg.steve.service;
22

3-
import de.rwth.idsg.steve.service.dto.InvalidOcppTag;
3+
import de.rwth.idsg.steve.service.dto.UnidentifiedIncomingObject;
44
import ocpp.cp._2015._10.AuthorizationData;
55
import ocpp.cs._2015._10.IdTagInfo;
66

@@ -18,5 +18,5 @@ public interface OcppTagService {
1818

1919
List<AuthorizationData> getAuthData(List<String> idTagList);
2020

21-
List<InvalidOcppTag> getInvalidOcppTags();
21+
List<UnidentifiedIncomingObject> getUnknownOcppTags();
2222
}

src/main/java/de/rwth/idsg/steve/service/OcppTagServiceImpl.java

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package de.rwth.idsg.steve.service;
22

3-
import com.google.common.cache.Cache;
4-
import com.google.common.cache.CacheBuilder;
53
import de.rwth.idsg.steve.repository.OcppTagRepository;
64
import de.rwth.idsg.steve.repository.SettingsRepository;
7-
import de.rwth.idsg.steve.service.dto.InvalidOcppTag;
5+
import de.rwth.idsg.steve.service.dto.UnidentifiedIncomingObject;
86
import jooq.steve.db.tables.records.OcppTagRecord;
97
import lombok.extern.slf4j.Slf4j;
108
import ocpp.cp._2015._10.AuthorizationData;
@@ -15,9 +13,7 @@
1513
import org.springframework.beans.factory.annotation.Autowired;
1614
import org.springframework.stereotype.Service;
1715

18-
import java.util.Comparator;
1916
import java.util.List;
20-
import java.util.stream.Collectors;
2117

2218
/**
2319
* @author Sevket Goekay <goekay@dbis.rwth-aachen.de>
@@ -30,9 +26,7 @@ public class OcppTagServiceImpl implements OcppTagService {
3026
@Autowired private SettingsRepository settingsRepository;
3127
@Autowired private OcppTagRepository ocppTagRepository;
3228

33-
private final Cache<String, InvalidOcppTag> invalidOcppTagCache = CacheBuilder.newBuilder()
34-
.maximumSize(1_000)
35-
.build();
29+
private final UnidentifiedIncomingObjectService invalidOcppTagService = new UnidentifiedIncomingObjectService(1000);
3630

3731
@Override
3832
public List<AuthorizationData> getAuthDataOfAllTags() {
@@ -51,12 +45,8 @@ public List<AuthorizationData> getAuthData(List<String> idTagList) {
5145
}
5246

5347
@Override
54-
public List<InvalidOcppTag> getInvalidOcppTags() {
55-
return invalidOcppTagCache.asMap()
56-
.values()
57-
.stream()
58-
.sorted(Comparator.comparingInt(InvalidOcppTag::getNumberOfAttempts).reversed())
59-
.collect(Collectors.toList());
48+
public List<UnidentifiedIncomingObject> getUnknownOcppTags() {
49+
return invalidOcppTagService.getObjects();
6050
}
6151

6252
@Override
@@ -67,7 +57,7 @@ public IdTagInfo getIdTagInfo(String idTag) {
6757
if (record == null) {
6858
log.error("The user with idTag '{}' is INVALID (not present in DB).", idTag);
6959
idTagInfo.setStatus(AuthorizationStatus.INVALID);
70-
processInvalid(idTag);
60+
invalidOcppTagService.processNewUnidentified(idTag);
7161
} else {
7262
if (record.getBlocked()) {
7363
log.error("The user with idTag '{}' is BLOCKED.", idTag);
@@ -97,17 +87,6 @@ public IdTagInfo getIdTagInfo(String idTag) {
9787
// Private helpers
9888
// -------------------------------------------------------------------------
9989

100-
private void processInvalid(String idTag) {
101-
synchronized (invalidOcppTagCache) {
102-
InvalidOcppTag value = invalidOcppTagCache.getIfPresent(idTag);
103-
if (value == null) {
104-
invalidOcppTagCache.put(idTag, new InvalidOcppTag(idTag));
105-
} else {
106-
value.updateStats();
107-
}
108-
}
109-
}
110-
11190
private static class AuthorisationDataMapper implements RecordMapper<OcppTagRecord, AuthorizationData> {
11291
private final DateTime nowDt;
11392
private final DateTime cacheExpiry;
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package de.rwth.idsg.steve.service;
2+
3+
import com.google.common.cache.Cache;
4+
import com.google.common.cache.CacheBuilder;
5+
import de.rwth.idsg.steve.service.dto.UnidentifiedIncomingObject;
6+
7+
import java.util.Comparator;
8+
import java.util.List;
9+
import java.util.stream.Collectors;
10+
11+
/**
12+
* The name of this class was inspired by UFO (Unidentified flying object) and enterprise software development.
13+
*
14+
* @author Sevket Goekay <goekay@dbis.rwth-aachen.de>
15+
* @since 20.03.2018
16+
*/
17+
public class UnidentifiedIncomingObjectService {
18+
19+
private final Cache<String, UnidentifiedIncomingObject> objectsHolder;
20+
21+
public UnidentifiedIncomingObjectService(int maxSize) {
22+
objectsHolder = CacheBuilder.newBuilder()
23+
.maximumSize(maxSize)
24+
.build();
25+
}
26+
27+
public List<UnidentifiedIncomingObject> getObjects() {
28+
return objectsHolder.asMap()
29+
.values()
30+
.stream()
31+
.sorted(Comparator.comparingInt(UnidentifiedIncomingObject::getNumberOfAttempts).reversed())
32+
.collect(Collectors.toList());
33+
}
34+
35+
public void processNewUnidentified(String key) {
36+
synchronized (objectsHolder) {
37+
UnidentifiedIncomingObject value = objectsHolder.getIfPresent(key);
38+
if (value == null) {
39+
objectsHolder.put(key, new UnidentifiedIncomingObject(key));
40+
} else {
41+
value.updateStats();
42+
}
43+
}
44+
}
45+
}

src/main/java/de/rwth/idsg/steve/service/dto/InvalidOcppTag.java renamed to src/main/java/de/rwth/idsg/steve/service/dto/UnidentifiedIncomingObject.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@
66

77
/**
88
* @author Sevket Goekay <goekay@dbis.rwth-aachen.de>
9-
* @since 09.12.2016
9+
* @since 20.03.2018
1010
*/
1111
@ToString
1212
@Getter
13-
public class InvalidOcppTag {
13+
public class UnidentifiedIncomingObject {
1414

15-
private final String idTag;
15+
private final String key;
1616
private int numberOfAttempts = 0;
1717
private DateTime lastAttemptTimestamp;
1818

19-
public InvalidOcppTag(String idTag) {
20-
this.idTag = idTag;
19+
public UnidentifiedIncomingObject(String key) {
20+
this.key = key;
2121
updateStats();
2222
}
2323

src/main/java/de/rwth/idsg/steve/web/controller/ChargePointsController.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import de.rwth.idsg.steve.repository.ChargePointRepository;
44
import de.rwth.idsg.steve.repository.dto.ChargePoint;
5+
import de.rwth.idsg.steve.service.ChargePointHelperService;
56
import de.rwth.idsg.steve.utils.ControllerHelper;
67
import de.rwth.idsg.steve.web.dto.ChargePointBatchInsertForm;
78
import de.rwth.idsg.steve.web.dto.ChargePointForm;
@@ -27,6 +28,7 @@
2728
public class ChargePointsController {
2829

2930
@Autowired protected ChargePointRepository chargePointRepository;
31+
@Autowired protected ChargePointHelperService chargePointHelperService;
3032

3133
protected static final String PARAMS = "params";
3234

@@ -64,6 +66,7 @@ public String getQuery(@ModelAttribute(PARAMS) ChargePointQueryForm params, Mode
6466
private void initList(Model model, ChargePointQueryForm params) {
6567
model.addAttribute(PARAMS, params);
6668
model.addAttribute("cpList", chargePointRepository.getOverview(params));
69+
model.addAttribute("unknownList", chargePointHelperService.getUnknownChargePoints());
6770
}
6871

6972
@RequestMapping(value = DETAILS_PATH, method = RequestMethod.GET)

0 commit comments

Comments
 (0)