From be40eddf8181bac7976c8cf34ba0999d193dd29e Mon Sep 17 00:00:00 2001 From: Tester Date: Fri, 20 Oct 2023 10:49:03 +0200 Subject: [PATCH 01/48] set webapi.value in dev --- src/main/resources/config/dev/main.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/config/dev/main.properties b/src/main/resources/config/dev/main.properties index 84afdf0f8..96102f6a3 100644 --- a/src/main/resources/config/dev/main.properties +++ b/src/main/resources/config/dev/main.properties @@ -21,7 +21,7 @@ auth.password = 1234 # Both must be set for Web APIs to be enabled. Otherwise, we will block all calls. # webapi.key = STEVE-API-KEY -webapi.value = +webapi.value = 1234 # Jetty configuration # From 9d79bddb192e24f1b4994628ca8f7d983f669bc1 Mon Sep 17 00:00:00 2001 From: fnkbsi <> Date: Fri, 20 Oct 2023 10:52:52 +0200 Subject: [PATCH 02/48] add constructor with "caller" value at tasks RemoteStart, RemoteStop and UnlockConnector --- src/main/java/de/rwth/idsg/steve/ocpp/CommunicationTask.java | 4 ++++ .../rwth/idsg/steve/ocpp/task/RemoteStartTransactionTask.java | 4 ++++ .../rwth/idsg/steve/ocpp/task/RemoteStopTransactionTask.java | 4 ++++ .../de/rwth/idsg/steve/ocpp/task/UnlockConnectorTask.java | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/src/main/java/de/rwth/idsg/steve/ocpp/CommunicationTask.java b/src/main/java/de/rwth/idsg/steve/ocpp/CommunicationTask.java index 67414e10a..61b6ec253 100644 --- a/src/main/java/de/rwth/idsg/steve/ocpp/CommunicationTask.java +++ b/src/main/java/de/rwth/idsg/steve/ocpp/CommunicationTask.java @@ -73,6 +73,10 @@ public CommunicationTask(OcppVersion ocppVersion, S params) { this(ocppVersion, params, TaskOrigin.INTERNAL, "SteVe"); } + public CommunicationTask(OcppVersion ocppVersion, S params, String caller) { + this(ocppVersion, params, TaskOrigin.EXTERNAL, caller); + } + /** * Do not expose the constructor, make it package-private */ diff --git a/src/main/java/de/rwth/idsg/steve/ocpp/task/RemoteStartTransactionTask.java b/src/main/java/de/rwth/idsg/steve/ocpp/task/RemoteStartTransactionTask.java index d39dd4c16..2b8774d15 100644 --- a/src/main/java/de/rwth/idsg/steve/ocpp/task/RemoteStartTransactionTask.java +++ b/src/main/java/de/rwth/idsg/steve/ocpp/task/RemoteStartTransactionTask.java @@ -35,6 +35,10 @@ public RemoteStartTransactionTask(OcppVersion ocppVersion, RemoteStartTransactio super(ocppVersion, params); } + public RemoteStartTransactionTask(OcppVersion ocppVersion, RemoteStartTransactionParams params, String caller) { + super(ocppVersion, params, caller); + } + @Override public OcppCallback defaultCallback() { return new StringOcppCallback(); diff --git a/src/main/java/de/rwth/idsg/steve/ocpp/task/RemoteStopTransactionTask.java b/src/main/java/de/rwth/idsg/steve/ocpp/task/RemoteStopTransactionTask.java index bf975d931..2bd87654c 100644 --- a/src/main/java/de/rwth/idsg/steve/ocpp/task/RemoteStopTransactionTask.java +++ b/src/main/java/de/rwth/idsg/steve/ocpp/task/RemoteStopTransactionTask.java @@ -35,6 +35,10 @@ public RemoteStopTransactionTask(OcppVersion ocppVersion, RemoteStopTransactionP super(ocppVersion, params); } + public RemoteStopTransactionTask(OcppVersion ocppVersion, RemoteStopTransactionParams params, String caller) { + super(ocppVersion, params, caller); + } + @Override public OcppCallback defaultCallback() { return new StringOcppCallback(); diff --git a/src/main/java/de/rwth/idsg/steve/ocpp/task/UnlockConnectorTask.java b/src/main/java/de/rwth/idsg/steve/ocpp/task/UnlockConnectorTask.java index 92dddbf2d..a11cfad43 100644 --- a/src/main/java/de/rwth/idsg/steve/ocpp/task/UnlockConnectorTask.java +++ b/src/main/java/de/rwth/idsg/steve/ocpp/task/UnlockConnectorTask.java @@ -35,6 +35,10 @@ public UnlockConnectorTask(OcppVersion ocppVersion, UnlockConnectorParams params super(ocppVersion, params); } + public UnlockConnectorTask(OcppVersion ocppVersion, UnlockConnectorParams params, String caller) { + super(ocppVersion, params, caller); + } + @Override public OcppCallback defaultCallback() { return new StringOcppCallback(); From d2f54b5522fa5a0c06140968cd7e00cc7a7e97d8 Mon Sep 17 00:00:00 2001 From: fnkbsi <> Date: Fri, 20 Oct 2023 10:58:19 +0200 Subject: [PATCH 03/48] ChargePointRepository: add method getChargePointSelect(String ChageBoxID) --- .../steve/repository/ChargePointRepository.java | 2 ++ .../impl/ChargePointRepositoryImpl.java | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/main/java/de/rwth/idsg/steve/repository/ChargePointRepository.java b/src/main/java/de/rwth/idsg/steve/repository/ChargePointRepository.java index c698ed6c7..ea7abbb30 100644 --- a/src/main/java/de/rwth/idsg/steve/repository/ChargePointRepository.java +++ b/src/main/java/de/rwth/idsg/steve/repository/ChargePointRepository.java @@ -45,6 +45,8 @@ default List getChargePointSelect(OcppProtocol protocol, List return getChargePointSelect(protocol, inStatusFilter, Collections.emptyList()); } + List getChargePointSelect(String ChageBoxID); + List getChargeBoxIds(); Map getChargeBoxIdPkPair(List chargeBoxIdList); diff --git a/src/main/java/de/rwth/idsg/steve/repository/impl/ChargePointRepositoryImpl.java b/src/main/java/de/rwth/idsg/steve/repository/impl/ChargePointRepositoryImpl.java index 2d8cf906a..be531bd9d 100644 --- a/src/main/java/de/rwth/idsg/steve/repository/impl/ChargePointRepositoryImpl.java +++ b/src/main/java/de/rwth/idsg/steve/repository/impl/ChargePointRepositoryImpl.java @@ -102,6 +102,21 @@ public List getChargePointSelect(OcppProtocol protocol, List< .fetch() .map(r -> new ChargePointSelect(protocol.getTransport(), r.value1(), r.value2())); } + + @Override // returns List of zero or one ChargeBox + public List getChargePointSelect(String ChageBoxID) // OcppProtocol protocol, + { + //OcppProtocol protocol = OcppProtocol.V_16_JSON; + + return ctx.select(CHARGE_BOX.CHARGE_BOX_ID, CHARGE_BOX.ENDPOINT_ADDRESS, CHARGE_BOX.OCPP_PROTOCOL) + .from(CHARGE_BOX) + .where(CHARGE_BOX.CHARGE_BOX_ID.eq(ChageBoxID)) + //.and(CHARGE_BOX.OCPP_PROTOCOL.equal(protocol.getCompositeValue())) + //.and(CHARGE_BOX.ENDPOINT_ADDRESS.isNotNull()) + //.and(CHARGE_BOX.REGISTRATION_STATUS.eq(RegistrationStatus.ACCEPTED.value())) + .fetch() + .map(r -> new ChargePointSelect(OcppProtocol.fromCompositeValue(r.value3()).getTransport() , r.value1(), r.value2())); + } @Override public List getChargeBoxIds() { From cdcb3eea6d47b62274cd4ce464097dfef10b4ea9 Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Fri, 20 Oct 2023 11:00:28 +0200 Subject: [PATCH 04/48] TransactionRepository: add methods getActiveTransactionId(String chargeBoxId, Integer connectorId) and getOcppTagOfTransaction(Integer transaction_pk); --- .../repository/TransactionRepository.java | 2 ++ .../impl/TransactionRepositoryImpl.java | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/main/java/de/rwth/idsg/steve/repository/TransactionRepository.java b/src/main/java/de/rwth/idsg/steve/repository/TransactionRepository.java index dec544eee..e1e4f24b1 100644 --- a/src/main/java/de/rwth/idsg/steve/repository/TransactionRepository.java +++ b/src/main/java/de/rwth/idsg/steve/repository/TransactionRepository.java @@ -35,6 +35,8 @@ public interface TransactionRepository { void writeTransactionsCSV(TransactionQueryForm form, Writer writer); List getActiveTransactionIds(String chargeBoxId); + Integer getActiveTransactionId(String chargeBoxId, Integer connectorId); + String getOcppTagOfTransaction(Integer transaction_pk); TransactionDetails getDetails(int transactionPk, boolean firstArrivingMeterValueIfMultiple); diff --git a/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java b/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java index 52847e188..1ebac058e 100644 --- a/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java +++ b/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java @@ -88,6 +88,28 @@ public List getActiveTransactionIds(String chargeBoxId) { .fetch(TRANSACTION.TRANSACTION_PK); } + @Override + public Integer getActiveTransactionId(String chargeBoxId, Integer connectorId) { + return ctx.select(TRANSACTION.TRANSACTION_PK) + .from(TRANSACTION) + .join(CONNECTOR) + .on(TRANSACTION.CONNECTOR_PK.equal(CONNECTOR.CONNECTOR_PK)) + .and(CONNECTOR.CHARGE_BOX_ID.equal(chargeBoxId)) + .where(TRANSACTION.STOP_TIMESTAMP.isNull()) + .and(CONNECTOR.CONNECTOR_ID.equal(connectorId)) + .fetchAny(TRANSACTION.TRANSACTION_PK); + } + + @Override + public String getOcppTagOfTransaction(Integer transaction_pk) { + return ctx.select(TRANSACTION.ID_TAG) + .from(TRANSACTION) + .where(TRANSACTION.TRANSACTION_PK.eq(transaction_pk)) + .fetchAny(TRANSACTION.ID_TAG); + /* .fetch().sortDesc(TRANSACTION.START_TIMESTAMP).getValue(0, TRANSACTION.ID_TAG); + if TRANSACTION has sometimes errors an more then one open/active transaction per connector */ + } + @Override public TransactionDetails getDetails(int transactionPk, boolean firstArrivingMeterValueIfMultiple) { From 3a3e5759e3c4eb14110f6f82c455f2217e782d25 Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Fri, 20 Oct 2023 11:01:45 +0200 Subject: [PATCH 05/48] TaskOverview: added swagger.annotations --- .../idsg/steve/repository/dto/TaskOverview.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/repository/dto/TaskOverview.java b/src/main/java/de/rwth/idsg/steve/repository/dto/TaskOverview.java index fa47f1658..781263a8b 100644 --- a/src/main/java/de/rwth/idsg/steve/repository/dto/TaskOverview.java +++ b/src/main/java/de/rwth/idsg/steve/repository/dto/TaskOverview.java @@ -19,6 +19,7 @@ package de.rwth.idsg.steve.repository.dto; import de.rwth.idsg.steve.ocpp.TaskOrigin; +import io.swagger.annotations.ApiModelProperty; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -32,8 +33,17 @@ @EqualsAndHashCode @Builder public final class TaskOverview implements Comparable { - private final int taskId, responseCount, requestCount; - private final DateTime start, end; + @ApiModelProperty(value = "Task ID") + private final int taskId; + @ApiModelProperty(value = "Response count") + private final int responseCount; + @ApiModelProperty(value = "Request count") + private final int requestCount; + @ApiModelProperty(value = "Starttime") + private final DateTime start; + @ApiModelProperty(value = "Endtime") + private final DateTime end; + @ApiModelProperty(value = "Task triggered internal or external") private final TaskOrigin origin; /** From 08d7fa6b92ff5bf834643cf6c4748152e1166341 Mon Sep 17 00:00:00 2001 From: fnkbsi <> Date: Fri, 20 Oct 2023 11:05:53 +0200 Subject: [PATCH 06/48] ChargePointService12_Client: add methods which uses new task constructor for RemoteStart, RemoteStop and UnlockConnector --- .../service/ChargePointService12_Client.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/rwth/idsg/steve/service/ChargePointService12_Client.java b/src/main/java/de/rwth/idsg/steve/service/ChargePointService12_Client.java index e6bbf430a..f0941ecd9 100644 --- a/src/main/java/de/rwth/idsg/steve/service/ChargePointService12_Client.java +++ b/src/main/java/de/rwth/idsg/steve/service/ChargePointService12_Client.java @@ -138,7 +138,15 @@ public int updateFirmware(UpdateFirmwareParams params) { public int remoteStartTransaction(RemoteStartTransactionParams params) { RemoteStartTransactionTask task = new RemoteStartTransactionTask(getVersion(), params); + return addRemoteStartTask(task); + } + + public int remoteStartTransaction(RemoteStartTransactionParams params, String caller) { + RemoteStartTransactionTask task = new RemoteStartTransactionTask(getVersion(), params, caller); + return addRemoteStartTask(task); + } + private int addRemoteStartTask(RemoteStartTransactionTask task) { BackgroundService.with(executorService) .forFirst(task.getParams().getChargePointSelectList()) .execute(c -> getOcpp12Invoker().remoteStartTransaction(c, task)); @@ -146,9 +154,17 @@ public int remoteStartTransaction(RemoteStartTransactionParams params) { return taskStore.add(task); } + public int remoteStopTransaction(RemoteStopTransactionParams params, String caller) { + RemoteStopTransactionTask task = new RemoteStopTransactionTask(getVersion(), params, caller); + return addRemoteStopTask(task); + } + public int remoteStopTransaction(RemoteStopTransactionParams params) { RemoteStopTransactionTask task = new RemoteStopTransactionTask(getVersion(), params); - + return addRemoteStopTask(task); + } + + private int addRemoteStopTask(RemoteStopTransactionTask task) { BackgroundService.with(executorService) .forFirst(task.getParams().getChargePointSelectList()) .execute(c -> getOcpp12Invoker().remoteStopTransaction(c, task)); @@ -158,6 +174,15 @@ public int remoteStopTransaction(RemoteStopTransactionParams params) { public int unlockConnector(UnlockConnectorParams params) { UnlockConnectorTask task = new UnlockConnectorTask(getVersion(), params); + return addRemoteUnlockTask(task); + } + + public int unlockConnector(UnlockConnectorParams params, String caller) { + UnlockConnectorTask task = new UnlockConnectorTask(getVersion(), params, caller); + return addRemoteUnlockTask(task); + } + + private int addRemoteUnlockTask(UnlockConnectorTask task) { BackgroundService.with(executorService) .forFirst(task.getParams().getChargePointSelectList()) From 9b580be6b8eb6006725f103651d7ce6ddf7cae04 Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Fri, 20 Oct 2023 11:08:30 +0200 Subject: [PATCH 07/48] Added a first draft of RemoteStartStopREstController, also added data classes --- .../api/RemoteStartStopRestController.java | 359 ++++++++++++++++++ .../steve/web/api/dto/ApiChargePointList.java | 61 +++ .../web/api/dto/ApiChargePointStart.java | 51 +++ .../idsg/steve/web/api/dto/ApiTaskInfo.java | 90 +++++ .../idsg/steve/web/api/dto/ApiTaskList.java | 39 ++ 5 files changed, 600 insertions(+) create mode 100644 src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java create mode 100644 src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java create mode 100644 src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java create mode 100644 src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java create mode 100644 src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java diff --git a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java new file mode 100644 index 000000000..37c43428e --- /dev/null +++ b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java @@ -0,0 +1,359 @@ +/* + * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve + * Copyright (C) 2013-2023 SteVe Community Team + * All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.rwth.idsg.steve.web.api; + +//import de.rwth.idsg.steve.web.controller.*; +import de.rwth.idsg.steve.SteveException; + +import de.rwth.idsg.steve.ocpp.OcppVersion; +import de.rwth.idsg.steve.repository.ChargePointRepository; +import de.rwth.idsg.steve.repository.TaskStore; +import de.rwth.idsg.steve.repository.TransactionRepository; +import de.rwth.idsg.steve.repository.dto.ChargePointSelect; + +import de.rwth.idsg.steve.service.ChargePointHelperService; +import de.rwth.idsg.steve.service.ChargePointService12_Client; +import de.rwth.idsg.steve.service.ChargePointService15_Client; +import de.rwth.idsg.steve.service.ChargePointService16_Client; + +import de.rwth.idsg.steve.web.dto.ocpp.RemoteStartTransactionParams; +import de.rwth.idsg.steve.web.dto.ocpp.RemoteStopTransactionParams; + +import de.rwth.idsg.steve.web.dto.ocpp.UnlockConnectorParams; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; + +import de.rwth.idsg.steve.web.api.ApiControllerAdvice.ApiErrorResponse; +import de.rwth.idsg.steve.web.api.dto.ApiChargePointList; +import de.rwth.idsg.steve.web.api.dto.ApiChargePointStart; +import de.rwth.idsg.steve.web.api.dto.ApiTaskInfo; +import de.rwth.idsg.steve.web.api.dto.ApiTaskList; +import de.rwth.idsg.steve.web.dto.ChargePointQueryForm; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; + +import java.util.List; + + + +/** + * @author Sevket Goekay + * @since 15.08.2014 + */ +@Slf4j +@RestController +@RequestMapping(value = "/api/v1/remote", produces = MediaType.APPLICATION_JSON_VALUE) +@RequiredArgsConstructor +public class RemoteStartStopRestController { + + @Autowired protected ChargePointHelperService chargePointHelperService; + @Autowired private ChargePointRepository chargePointRepository; + @Autowired private TransactionRepository transactionRepository; + //@Autowired private OcppTagService ocppTagService; + @Autowired private TaskStore taskStore; + + @Autowired + @Qualifier("ChargePointService12_Client") + private ChargePointService12_Client client12; + + @Autowired + @Qualifier("ChargePointService15_Client") + private ChargePointService15_Client client15; + + @Autowired + @Qualifier("ChargePointService16_Client") + private ChargePointService16_Client client16; + + // ------------------------------------------------------------------------- + // Paths + // ------------------------------------------------------------------------- + + + + // ------------------------------------------------------------------------- + // Helpers + // ------------------------------------------------------------------------- + + private String getOcppProtocol(String chargeBoxId) { + ChargePointQueryForm form = new ChargePointQueryForm(); + form.setChargeBoxId(chargeBoxId); + return chargePointRepository.getOverview(form).get(0).getOcppProtocol().toUpperCase(); + } + + private Integer remoteStart(String chargeBoxId, RemoteStartTransactionParams transactionParams) { + String ocppProtocol = getOcppProtocol(chargeBoxId); + Integer taskId = 0; + switch (ocppProtocol) { + case "OCPP1.6J": + case "OCPP1.6S": + taskId =client16.remoteStartTransaction(transactionParams, "SteveWebApi"); + break; + case "OCPP1.5J": + case "OCPP1.5S": + case "OCPP1.5": + taskId = client15.remoteStartTransaction(transactionParams, "SteveWebApi"); + break; + case "OCPP1.2": + taskId = client12.remoteStartTransaction(transactionParams, "SteveWebApi"); + break; + default: + taskId = client12.remoteStartTransaction(transactionParams, "SteveWebApi"); + } + return taskId; + } + private Integer remoteStop(String chargeBoxId, RemoteStopTransactionParams transactionParams) { + String ocppProtocol = getOcppProtocol(chargeBoxId); + Integer taskId = 0; + switch (ocppProtocol) { + case "OCPP1.6J": + case "OCPP1.6S": + taskId = client16.remoteStopTransaction(transactionParams, "SteveWebApi"); + break; + case "OCPP1.5J": + case "OCPP1.5S": + case "OCPP1.5": + taskId = client15.remoteStopTransaction(transactionParams, "SteveWebApi"); + break; + case "OCPP1.2": + taskId = client12.remoteStopTransaction(transactionParams, "SteveWebApi"); + break; + default: + taskId = client12.remoteStopTransaction(transactionParams, "SteveWebApi"); + + } + return taskId; + } + + private Integer remoteUnlock(String chargeBoxId, UnlockConnectorParams transactionParams) { + String ocppProtocol = getOcppProtocol(chargeBoxId); + Integer taskId = 0; + switch (ocppProtocol) { + case "OCPP1.6J": + case "OCPP1.6S": + taskId = client16.unlockConnector(transactionParams, "SteveWebApi"); + break; + case "OCPP1.5J": + case "OCPP1.5S": + case "OCPP1.5": + taskId = client15.unlockConnector(transactionParams, "SteveWebApi"); + break; + case "OCPP1.2": + taskId = client12.unlockConnector(transactionParams, "SteveWebApi"); + break; + default: + taskId = client12.unlockConnector(transactionParams, "SteveWebApi"); + } + return taskId; + } + + private ApiChargePointList getChargePoints() { + List chargePoints = chargePointHelperService.getChargePoints(OcppVersion.V_12); + chargePoints.addAll(chargePointHelperService.getChargePoints(OcppVersion.V_15)); + chargePoints.addAll(chargePointHelperService.getChargePoints(OcppVersion.V_16)); + ApiChargePointList lsCp = new ApiChargePointList(); + try { + for (ChargePointSelect chargeBox : chargePoints) { + List conList = chargePointRepository.getNonZeroConnectorIds(chargeBox.getChargeBoxId()); + if (!conList.isEmpty()) { + lsCp.addCP(chargeBox.getChargeBoxId(), conList); + } + } + } catch (Exception e) { + System.out.println(e.toString()); + } + return lsCp; + } + + private ApiTaskList getTaskList() { + ApiTaskList lsTasks = new ApiTaskList(); + lsTasks.setTasks(taskStore.getOverview()); + return lsTasks; + } + + + + // ------------------------------------------------------------------------- + // Http methods (GET) + // ------------------------------------------------------------------------- + + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), + @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), + @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + ) + @GetMapping(value = "") + @ResponseBody + public ApiChargePointList getBase() { + return getChargePoints(); + } + + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), + @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), + @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + ) + @GetMapping(value = "start") + @ResponseBody + public ApiChargePointList getRemoteStartTx() { + return getChargePoints(); + } + + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), + @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), + @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + ) + @GetMapping(value = "stop") + @ResponseBody + public ApiChargePointList getRemoteStopTx() { + return getChargePoints(); + } + + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), + @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), + @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + ) + @GetMapping(value = "unlock") + @ResponseBody + public ApiChargePointList getUnlockCon() { + return getChargePoints(); + } + + // ------------------------------------------------------------------------- + // Task --> need of polling + // ------------------------------------------------------------------------- + + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), + @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), + @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + ) + @GetMapping(value = "taskoverview") + @ResponseBody + public ApiTaskList getOverview() { + return getTaskList(); + } + + + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), + @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), + @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + ) + @PostMapping(value = "clearfinishedtasks") + @ResponseBody + public ApiTaskList clearFinished() { + taskStore.clearFinished(); + return getTaskList(); + } + + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), + @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), + @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + ) + @GetMapping(value = "task") + @ResponseBody + public ApiTaskInfo getTaskDetails(@Valid Integer taskId) { + ApiTaskInfo taskInfo = new ApiTaskInfo(taskId, taskStore.get(taskId)); + return taskInfo; + } + + // ------------------------------------------------------------------------- + // Http methods (POST) + // ------------------------------------------------------------------------- + + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), + @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), + @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + ) + @PostMapping(value = "start") + @ResponseBody + public Integer postRemoteStartTx(@Valid ApiChargePointStart params) { + RemoteStartTransactionParams transactionParams = new RemoteStartTransactionParams(); + transactionParams.setChargePointSelectList(chargePointRepository.getChargePointSelect(params.getChargeBoxId())); + transactionParams.setConnectorId(params.getConnectorId()); + transactionParams.setIdTag(params.getOcppTag()); + return remoteStart(params.getChargeBoxId(), transactionParams); + } + + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), + @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), + @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + ) + @PostMapping(value = "stop") + @ResponseBody + public Integer postRemoteStopTx(@Valid ApiChargePointStart params) { + RemoteStopTransactionParams transactionParams = new RemoteStopTransactionParams(); + transactionParams.setChargePointSelectList(chargePointRepository.getChargePointSelect(params.getChargeBoxId())); + Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(),params.getConnectorId()); + String ocppTag = transactionRepository.getOcppTagOfTransaction(transactionId); + if (!params.getOcppTag().contentEquals(ocppTag)){ + // t.b.d. + throw new SteveException.NotFound("Wrong OCPP Tag!"); + } + transactionParams.setTransactionId(transactionId); + + return remoteStop(params.getChargeBoxId(), transactionParams); + } + + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), + @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), + @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + ) + @PostMapping(value = "unlock") + @ResponseBody + public Integer postUnlockCon(@Valid ApiChargePointStart params) { + UnlockConnectorParams transactionParams = new UnlockConnectorParams(); + transactionParams.setChargePointSelectList(chargePointRepository.getChargePointSelect(params.getChargeBoxId())); + Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(), params.getConnectorId()); + String ocppTag = transactionRepository.getOcppTagOfTransaction(transactionId); + if (!params.getOcppTag().contentEquals(ocppTag)){ + // t.b.d. + throw new SteveException.NotFound("Wrong OCPP Tag!"); + } + transactionParams.setConnectorId(params.getConnectorId()); + return remoteUnlock(params.getChargeBoxId(), transactionParams); + } +} diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java new file mode 100644 index 000000000..d51b09a87 --- /dev/null +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java @@ -0,0 +1,61 @@ +/* + * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve + * Copyright (C) 2013-2023 SteVe Community Team + * All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.rwth.idsg.steve.web.api.dto; + +//import de.rwth.idsg.steve.ocpp.OcppTransport; +import io.swagger.annotations.ApiModelProperty; +import java.util.ArrayList; +//import java.util.Collections; +import java.util.List; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; + +/** + * @author Frank Brosi + * @since 18.10.2023 + */ + +@Getter +@Setter +@RequiredArgsConstructor +public class ApiChargePointList { + @ApiModelProperty(value = "List of charge points") + List chargePointList = new ArrayList<>();; + + public void addCP(String chargeBoxId, List connectorIds){ + ChargePointInfo cp = new ChargePointInfo(chargeBoxId, connectorIds); + this.chargePointList.add(cp); + } + + @Getter + @Setter + class ChargePointInfo { + @ApiModelProperty(value = "Charge Box ID") + private String chargeBoxId; + @ApiModelProperty(value = "List of the charge box connectors") + private List connectorIds; + + public ChargePointInfo (String chargeBoxId, List connectorIds) { + this.chargeBoxId = chargeBoxId; + this.connectorIds = connectorIds; + } + } + +} diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java new file mode 100644 index 000000000..871d3b2d4 --- /dev/null +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java @@ -0,0 +1,51 @@ +/* + * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve + * Copyright (C) 2013-2023 SteVe Community Team + * All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.rwth.idsg.steve.web.api.dto; + +//import de.rwth.idsg.steve.ocpp.OcppTransport; +import io.swagger.annotations.ApiModelProperty; +//import java.util.Collections; +//import java.util.List; +import lombok.Getter; +//import lombok.RequiredArgsConstructor; +import lombok.Setter; + +/** + * @author Frank Brosi + * @since 18.10.2023 + */ + +@Getter +@Setter +//@RequiredArgsConstructor +public class ApiChargePointStart { + @ApiModelProperty(value = "Charge Box ID") + private String chargeBoxId; + @ApiModelProperty(value = "List of the charge box connectors") + private Integer connectorId; + @ApiModelProperty(value = "OCPP Tag") + private String ocppTag; + + public ApiChargePointStart (String chargeBoxId, Integer connectorId, String ocppTag) { + this.chargeBoxId = chargeBoxId; + this.connectorId = connectorId; + this.ocppTag = ocppTag; + } + +} diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java new file mode 100644 index 000000000..aa4c0dfe4 --- /dev/null +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java @@ -0,0 +1,90 @@ +/* + * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve + * Copyright (C) 2013-2023 SteVe Community Team + * All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.rwth.idsg.steve.web.api.dto; + +//import de.rwth.idsg.steve.ocpp.OcppTransport; +import de.rwth.idsg.steve.ocpp.CommunicationTask; +import de.rwth.idsg.steve.ocpp.OcppVersion; +import de.rwth.idsg.steve.ocpp.RequestResult; +import de.rwth.idsg.steve.ocpp.TaskOrigin; +import io.swagger.annotations.ApiModelProperty; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; +//import java.util.Collections; +//import java.util.List; +import lombok.Getter; +//import lombok.RequiredArgsConstructor; +import lombok.Setter; +import org.joda.time.DateTime; + +/** + * @author Frank Brosi + * @since 18.10.2023 + */ + +@Getter +@Setter +//@RequiredArgsConstructor +public class ApiTaskInfo { + @ApiModelProperty(value = "Task ID") + public Integer taskId; + @ApiModelProperty(value = "OCPP version") + public OcppVersion ocppVersion; + @ApiModelProperty(value = "OCPP operation") + public String operationName; + @ApiModelProperty(value = "external / internal") + public TaskOrigin origin; + @ApiModelProperty(value = "Caller of the Task") + public String caller; + + @ApiModelProperty(value = "Results") + public Map resultMap; + @ApiModelProperty(value = "Count of Results") + public int resultSize; + + @ApiModelProperty(value = "Starttime") + public DateTime startTimestamp = DateTime.now(); + @ApiModelProperty(value = "Endtime") + public DateTime endTimestamp; + + @ApiModelProperty(value = "Error count") + public AtomicInteger errorCount = new AtomicInteger(0); + @ApiModelProperty(value = "Response count") + public AtomicInteger responseCount = new AtomicInteger(0); + + + public ApiTaskInfo(Integer taskId, CommunicationTask r) { + this.taskId = taskId; + this.ocppVersion = r.getOcppVersion(); + this.operationName = r.getOperationName(); + this.origin = r.getOrigin(); + this.caller = r.getCaller(); + + + this.resultMap = r.getResultMap(); + this.resultSize = r.getResultSize(); + + this.startTimestamp = r.getStartTimestamp(); + this.endTimestamp = r.getEndTimestamp(); + + this.errorCount = r.getErrorCount(); + this.responseCount = r.getResponseCount(); + } + +} diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java new file mode 100644 index 000000000..4a52e762f --- /dev/null +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java @@ -0,0 +1,39 @@ +/* + * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve + * Copyright (C) 2013-2023 SteVe Community Team + * All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.rwth.idsg.steve.web.api.dto; + +import de.rwth.idsg.steve.repository.dto.TaskOverview; +import io.swagger.annotations.ApiModelProperty; +import java.util.List; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author Frank Brosi + * @since 18.10.2023 + */ + +@Getter +@Setter +//@RequiredArgsConstructor +public class ApiTaskList { + @ApiModelProperty(value = "List of tasks") + List tasks; +} From 1771e162f28193080e0e332c6c434fd9a5fb32ea Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Fri, 20 Oct 2023 12:05:01 +0200 Subject: [PATCH 08/48] Removed tailing spaces --- .../de/rwth/idsg/steve/ocpp/task/UnlockConnectorTask.java | 2 +- .../steve/repository/impl/ChargePointRepositoryImpl.java | 8 ++++---- .../steve/repository/impl/TransactionRepositoryImpl.java | 2 +- .../idsg/steve/service/ChargePointService12_Client.java | 6 +++--- .../rwth/idsg/steve/web/api/dto/ApiChargePointList.java | 8 ++++---- .../rwth/idsg/steve/web/api/dto/ApiChargePointStart.java | 4 ++-- .../java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java | 4 ++-- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/ocpp/task/UnlockConnectorTask.java b/src/main/java/de/rwth/idsg/steve/ocpp/task/UnlockConnectorTask.java index a11cfad43..755639486 100644 --- a/src/main/java/de/rwth/idsg/steve/ocpp/task/UnlockConnectorTask.java +++ b/src/main/java/de/rwth/idsg/steve/ocpp/task/UnlockConnectorTask.java @@ -38,7 +38,7 @@ public UnlockConnectorTask(OcppVersion ocppVersion, UnlockConnectorParams params public UnlockConnectorTask(OcppVersion ocppVersion, UnlockConnectorParams params, String caller) { super(ocppVersion, params, caller); } - + @Override public OcppCallback defaultCallback() { return new StringOcppCallback(); diff --git a/src/main/java/de/rwth/idsg/steve/repository/impl/ChargePointRepositoryImpl.java b/src/main/java/de/rwth/idsg/steve/repository/impl/ChargePointRepositoryImpl.java index be531bd9d..5f9f1c2f0 100644 --- a/src/main/java/de/rwth/idsg/steve/repository/impl/ChargePointRepositoryImpl.java +++ b/src/main/java/de/rwth/idsg/steve/repository/impl/ChargePointRepositoryImpl.java @@ -102,12 +102,12 @@ public List getChargePointSelect(OcppProtocol protocol, List< .fetch() .map(r -> new ChargePointSelect(protocol.getTransport(), r.value1(), r.value2())); } - - @Override // returns List of zero or one ChargeBox - public List getChargePointSelect(String ChageBoxID) // OcppProtocol protocol, + + @Override // returns List of zero or one ChargeBox + public List getChargePointSelect(String ChageBoxID) // OcppProtocol protocol, { //OcppProtocol protocol = OcppProtocol.V_16_JSON; - + return ctx.select(CHARGE_BOX.CHARGE_BOX_ID, CHARGE_BOX.ENDPOINT_ADDRESS, CHARGE_BOX.OCPP_PROTOCOL) .from(CHARGE_BOX) .where(CHARGE_BOX.CHARGE_BOX_ID.eq(ChageBoxID)) diff --git a/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java b/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java index 1ebac058e..90be44787 100644 --- a/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java +++ b/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java @@ -106,7 +106,7 @@ public String getOcppTagOfTransaction(Integer transaction_pk) { .from(TRANSACTION) .where(TRANSACTION.TRANSACTION_PK.eq(transaction_pk)) .fetchAny(TRANSACTION.ID_TAG); - /* .fetch().sortDesc(TRANSACTION.START_TIMESTAMP).getValue(0, TRANSACTION.ID_TAG); + /* .fetch().sortDesc(TRANSACTION.START_TIMESTAMP).getValue(0, TRANSACTION.ID_TAG); if TRANSACTION has sometimes errors an more then one open/active transaction per connector */ } diff --git a/src/main/java/de/rwth/idsg/steve/service/ChargePointService12_Client.java b/src/main/java/de/rwth/idsg/steve/service/ChargePointService12_Client.java index f0941ecd9..8185d1cfe 100644 --- a/src/main/java/de/rwth/idsg/steve/service/ChargePointService12_Client.java +++ b/src/main/java/de/rwth/idsg/steve/service/ChargePointService12_Client.java @@ -140,7 +140,7 @@ public int remoteStartTransaction(RemoteStartTransactionParams params) { RemoteStartTransactionTask task = new RemoteStartTransactionTask(getVersion(), params); return addRemoteStartTask(task); } - + public int remoteStartTransaction(RemoteStartTransactionParams params, String caller) { RemoteStartTransactionTask task = new RemoteStartTransactionTask(getVersion(), params, caller); return addRemoteStartTask(task); @@ -163,7 +163,7 @@ public int remoteStopTransaction(RemoteStopTransactionParams params) { RemoteStopTransactionTask task = new RemoteStopTransactionTask(getVersion(), params); return addRemoteStopTask(task); } - + private int addRemoteStopTask(RemoteStopTransactionTask task) { BackgroundService.with(executorService) .forFirst(task.getParams().getChargePointSelectList()) @@ -176,7 +176,7 @@ public int unlockConnector(UnlockConnectorParams params) { UnlockConnectorTask task = new UnlockConnectorTask(getVersion(), params); return addRemoteUnlockTask(task); } - + public int unlockConnector(UnlockConnectorParams params, String caller) { UnlockConnectorTask task = new UnlockConnectorTask(getVersion(), params, caller); return addRemoteUnlockTask(task); diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java index d51b09a87..bd3286c24 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java @@ -38,12 +38,12 @@ public class ApiChargePointList { @ApiModelProperty(value = "List of charge points") List chargePointList = new ArrayList<>();; - + public void addCP(String chargeBoxId, List connectorIds){ ChargePointInfo cp = new ChargePointInfo(chargeBoxId, connectorIds); this.chargePointList.add(cp); } - + @Getter @Setter class ChargePointInfo { @@ -51,11 +51,11 @@ class ChargePointInfo { private String chargeBoxId; @ApiModelProperty(value = "List of the charge box connectors") private List connectorIds; - + public ChargePointInfo (String chargeBoxId, List connectorIds) { this.chargeBoxId = chargeBoxId; this.connectorIds = connectorIds; } } - + } diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java index 871d3b2d4..1b1e84b41 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java @@ -41,11 +41,11 @@ public class ApiChargePointStart { private Integer connectorId; @ApiModelProperty(value = "OCPP Tag") private String ocppTag; - + public ApiChargePointStart (String chargeBoxId, Integer connectorId, String ocppTag) { this.chargeBoxId = chargeBoxId; this.connectorId = connectorId; this.ocppTag = ocppTag; } - + } diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java index aa4c0dfe4..19ab9d6f7 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java @@ -67,8 +67,8 @@ public class ApiTaskInfo { public AtomicInteger errorCount = new AtomicInteger(0); @ApiModelProperty(value = "Response count") public AtomicInteger responseCount = new AtomicInteger(0); - - + + public ApiTaskInfo(Integer taskId, CommunicationTask r) { this.taskId = taskId; this.ocppVersion = r.getOcppVersion(); From 7417a9e53cbee642980d4e63b0c31da4764e9b9a Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Fri, 20 Oct 2023 18:25:43 +0200 Subject: [PATCH 09/48] ConnectorStatusForm: added ApiModelProperty annotation; --- .../java/de/rwth/idsg/steve/web/dto/ConnectorStatusForm.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/de/rwth/idsg/steve/web/dto/ConnectorStatusForm.java b/src/main/java/de/rwth/idsg/steve/web/dto/ConnectorStatusForm.java index acd6884e4..0e0be9b1e 100644 --- a/src/main/java/de/rwth/idsg/steve/web/dto/ConnectorStatusForm.java +++ b/src/main/java/de/rwth/idsg/steve/web/dto/ConnectorStatusForm.java @@ -18,6 +18,7 @@ */ package de.rwth.idsg.steve.web.dto; +import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -30,6 +31,8 @@ @Setter @ToString public class ConnectorStatusForm { + @ApiModelProperty(value = "Charge Box Id") private String chargeBoxId; + @ApiModelProperty(value = "Status of the Charge Box") private String status; } From 59b31cc0157d5b8447f5e550f32f649873b0252a Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Fri, 20 Oct 2023 18:32:08 +0200 Subject: [PATCH 10/48] OcppJsonStatus: added ApiModelProperty annotation and JasonIgnor annotation o ChargeBoxPk; --- .../de/rwth/idsg/steve/web/dto/OcppJsonStatus.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/rwth/idsg/steve/web/dto/OcppJsonStatus.java b/src/main/java/de/rwth/idsg/steve/web/dto/OcppJsonStatus.java index 9aafcd773..f5e0ded84 100644 --- a/src/main/java/de/rwth/idsg/steve/web/dto/OcppJsonStatus.java +++ b/src/main/java/de/rwth/idsg/steve/web/dto/OcppJsonStatus.java @@ -18,7 +18,9 @@ */ package de.rwth.idsg.steve.web.dto; +import com.fasterxml.jackson.annotation.JsonIgnore; import de.rwth.idsg.steve.ocpp.OcppVersion; +import io.swagger.annotations.ApiModelProperty; import lombok.Builder; import lombok.Getter; import lombok.ToString; @@ -32,9 +34,17 @@ @Builder @ToString public final class OcppJsonStatus { + @JsonIgnore + @ApiModelProperty(value = "Charge Box Pk", hidden = true) private final int chargeBoxPk; - private final String chargeBoxId, connectedSince; + @ApiModelProperty(value = "Charge Box Id") + private final String chargeBoxId; + @ApiModelProperty(value = "Connected since") + private final String connectedSince; + @ApiModelProperty(value = "Duration of the Connection") private final String connectionDuration; + @ApiModelProperty(value = "Ocpp version") private final OcppVersion version; + @ApiModelProperty(value = "Connected since as DT", hidden= true) private final DateTime connectedSinceDT; } From bf14cb1d962b3df4cfecd743889a4f797a08781f Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Fri, 20 Oct 2023 18:33:00 +0200 Subject: [PATCH 11/48] ConnectorStatus: added ApiModelProperty annotation to all fields and JasonIgnor annotation to ChargeBoxPk; --- .../steve/repository/dto/ConnectorStatus.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/repository/dto/ConnectorStatus.java b/src/main/java/de/rwth/idsg/steve/repository/dto/ConnectorStatus.java index e0c675851..5f234d7e6 100644 --- a/src/main/java/de/rwth/idsg/steve/repository/dto/ConnectorStatus.java +++ b/src/main/java/de/rwth/idsg/steve/repository/dto/ConnectorStatus.java @@ -18,7 +18,9 @@ */ package de.rwth.idsg.steve.repository.dto; +import com.fasterxml.jackson.annotation.JsonIgnore; import de.rwth.idsg.steve.ocpp.OcppProtocol; +import io.swagger.annotations.ApiModelProperty; import lombok.Builder; import lombok.Getter; import lombok.Setter; @@ -32,17 +34,32 @@ @Getter @Builder public final class ConnectorStatus { - private final String chargeBoxId, timeStamp, status, errorCode; - private final int chargeBoxPk, connectorId; + @JsonIgnore + @ApiModelProperty(value = "Charge Box DB key", hidden = true) + private final int chargeBoxPk; + @ApiModelProperty(value = "Charge Box ID") + private final String chargeBoxId; + @ApiModelProperty(value = "Connector ID") + private final int connectorId; + @ApiModelProperty(value = "Status") + private final String status; + @ApiModelProperty(value = "Error code") + private final String errorCode; + + @ApiModelProperty(value = "Timestamp") + private final String timeStamp; // For additional internal processing. Not related to the humanized // String version above, which is for representation on frontend + @ApiModelProperty(value = "Timestamp of the status") private final DateTime statusTimestamp; + @ApiModelProperty(value = "OCPP version") private final OcppProtocol ocppProtocol; // This is true, if the chargeBox this connector belongs to is a WS/JSON station // and it is disconnected at the moment of building this DTO. + @ApiModelProperty(value = "jason and Disconnected") @Setter @Builder.Default private boolean jsonAndDisconnected = false; From 55ac2ec4bd1b3dc172109c4b27afd31a020278c9 Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Fri, 20 Oct 2023 18:36:17 +0200 Subject: [PATCH 12/48] no functional changes --- .../api/RemoteStartStopRestController.java | 35 +++++++++++-------- .../steve/web/api/dto/ApiChargePointList.java | 2 +- .../web/api/dto/ApiChargePointStart.java | 2 +- .../idsg/steve/web/api/dto/ApiTaskInfo.java | 2 +- .../idsg/steve/web/api/dto/ApiTaskList.java | 2 +- 5 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java index 37c43428e..785e3aacc 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java @@ -18,9 +18,6 @@ */ package de.rwth.idsg.steve.web.api; -//import de.rwth.idsg.steve.web.controller.*; -import de.rwth.idsg.steve.SteveException; - import de.rwth.idsg.steve.ocpp.OcppVersion; import de.rwth.idsg.steve.repository.ChargePointRepository; import de.rwth.idsg.steve.repository.TaskStore; @@ -45,6 +42,7 @@ import de.rwth.idsg.steve.web.api.dto.ApiChargePointStart; import de.rwth.idsg.steve.web.api.dto.ApiTaskInfo; import de.rwth.idsg.steve.web.api.dto.ApiTaskList; +import de.rwth.idsg.steve.web.api.exception.BadRequestException; import de.rwth.idsg.steve.web.dto.ChargePointQueryForm; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; @@ -60,12 +58,13 @@ import javax.validation.Valid; import java.util.List; +import static java.util.Objects.isNull; /** - * @author Sevket Goekay - * @since 15.08.2014 + * @author fnkbsi + * @since 18.10.2023 */ @Slf4j @RestController @@ -91,12 +90,6 @@ public class RemoteStartStopRestController { @Qualifier("ChargePointService16_Client") private ChargePointService16_Client client16; - // ------------------------------------------------------------------------- - // Paths - // ------------------------------------------------------------------------- - - - // ------------------------------------------------------------------------- // Helpers // ------------------------------------------------------------------------- @@ -326,10 +319,16 @@ public Integer postRemoteStopTx(@Valid ApiChargePointStart params) { RemoteStopTransactionParams transactionParams = new RemoteStopTransactionParams(); transactionParams.setChargePointSelectList(chargePointRepository.getChargePointSelect(params.getChargeBoxId())); Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(),params.getConnectorId()); + if (isNull(transactionId)){ + String errMsg = String.format("No active transaction found for connector %s at ChargeBox %s!", + params.getConnectorId(), + params.getChargeBoxId() + ); + throw new BadRequestException(errMsg); + } String ocppTag = transactionRepository.getOcppTagOfTransaction(transactionId); if (!params.getOcppTag().contentEquals(ocppTag)){ - // t.b.d. - throw new SteveException.NotFound("Wrong OCPP Tag!"); + throw new BadRequestException("The transaction wass authorised with another OCPP Tag!"); } transactionParams.setTransactionId(transactionId); @@ -348,10 +347,16 @@ public Integer postUnlockCon(@Valid ApiChargePointStart params) { UnlockConnectorParams transactionParams = new UnlockConnectorParams(); transactionParams.setChargePointSelectList(chargePointRepository.getChargePointSelect(params.getChargeBoxId())); Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(), params.getConnectorId()); + if (isNull(transactionId)){ + String errMsg = String.format("No active transaction found for connector %s at ChargeBox %s!", + params.getConnectorId(), + params.getChargeBoxId() + ); + throw new BadRequestException(errMsg); + } String ocppTag = transactionRepository.getOcppTagOfTransaction(transactionId); if (!params.getOcppTag().contentEquals(ocppTag)){ - // t.b.d. - throw new SteveException.NotFound("Wrong OCPP Tag!"); + throw new BadRequestException("The transaction wass authorised with another OCPP Tag!"); } transactionParams.setConnectorId(params.getConnectorId()); return remoteUnlock(params.getChargeBoxId(), transactionParams); diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java index bd3286c24..29a4e6ae5 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java @@ -28,7 +28,7 @@ import lombok.Setter; /** - * @author Frank Brosi + * @author fnkbsi * @since 18.10.2023 */ diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java index 1b1e84b41..b537d1c25 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java @@ -27,7 +27,7 @@ import lombok.Setter; /** - * @author Frank Brosi + * @author fnkbsi * @since 18.10.2023 */ diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java index 19ab9d6f7..cf25c0947 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java @@ -34,7 +34,7 @@ import org.joda.time.DateTime; /** - * @author Frank Brosi + * @author fnkbsi * @since 18.10.2023 */ diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java index 4a52e762f..9737b8fd8 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java @@ -26,7 +26,7 @@ import lombok.Setter; /** - * @author Frank Brosi + * @author fnkbsi * @since 18.10.2023 */ From 7fc9c5b6264d07905fc3bd0e59a7a0849ab29e14 Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Fri, 20 Oct 2023 18:38:30 +0200 Subject: [PATCH 13/48] added dto list of connector status for Api --- .../steve/web/api/dto/ApiConnectorList.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java new file mode 100644 index 000000000..79f4f62bf --- /dev/null +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java @@ -0,0 +1,53 @@ +/* + * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve + * Copyright (C) 2013-2023 SteVe Community Team + * All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.rwth.idsg.steve.web.api.dto; + +//import de.rwth.idsg.steve.ocpp.OcppTransport; +import de.rwth.idsg.steve.repository.dto.ConnectorStatus; +import de.rwth.idsg.steve.utils.ConnectorStatusCountFilter; +import io.swagger.annotations.ApiModelProperty; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; + +/** + * @author fnkbsi + * @since 20.10.2023 + */ + +@Getter +@Setter +@RequiredArgsConstructor +public class ApiConnectorList { + + @ApiModelProperty(value = "List of charge boxes") + List chargeBoxList = new ArrayList<>(); + + @ApiModelProperty(value = "List of possibel Status values") + final Set statusFilterValues = ConnectorStatusCountFilter.ALL_STATUS_VALUES; + + @ApiModelProperty(value = "List of Connectors is filtered") + Boolean isFiltered = false; + + @ApiModelProperty(value = "List of connectors") + List connectors = new ArrayList<>();; +} From c39fafa2decfd13bed20240784b6473e61926d9d Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Fri, 20 Oct 2023 18:39:57 +0200 Subject: [PATCH 14/48] added connector REST controller --- .../web/api/ConnectorRestController.java | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java diff --git a/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java new file mode 100644 index 000000000..52c1a270f --- /dev/null +++ b/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java @@ -0,0 +1,113 @@ +/* + * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve + * Copyright (C) 2013-2023 SteVe Community Team + * All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.rwth.idsg.steve.web.api; + +import de.rwth.idsg.steve.repository.ChargePointRepository; +import de.rwth.idsg.steve.repository.dto.ConnectorStatus; +import de.rwth.idsg.steve.service.ChargePointHelperService; +import de.rwth.idsg.steve.utils.ConnectorStatusFilter; +import de.rwth.idsg.steve.web.api.dto.ApiConnectorList; +import de.rwth.idsg.steve.web.dto.ConnectorStatusForm; +import de.rwth.idsg.steve.web.dto.OcppJsonStatus; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import org.springframework.beans.factory.annotation.Autowired; + +import org.springframework.web.bind.annotation.RequestMapping; + +import java.util.List; +import static java.util.Objects.isNull; +import javax.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * + * @author fnkbsi + * since 20.10.2023 + * + */ +@Slf4j +@RestController +@RequestMapping(value = "/api/v1/connectors", produces = MediaType.APPLICATION_JSON_VALUE) +@RequiredArgsConstructor +public class ConnectorRestController { + + @Autowired private ChargePointRepository chargePointRepository; + @Autowired private ChargePointHelperService chargePointHelperService; + + // ------------------------------------------------------------------------- + // HTTP methods + // ------------------------------------------------------------------------- + + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 400, message = "Bad Request", response = ApiControllerAdvice.ApiErrorResponse.class), + @ApiResponse(code = 401, message = "Unauthorized", response = ApiControllerAdvice.ApiErrorResponse.class), + @ApiResponse(code = 500, message = "Internal Server Error", response = ApiControllerAdvice.ApiErrorResponse.class)} + ) + @GetMapping(value = "") + @ResponseBody + public ApiConnectorList getConnectorStatusQuery(@Valid ConnectorStatusForm queryParams) { + ApiConnectorList conList = new ApiConnectorList(); + conList.setChargeBoxList(chargePointRepository.getChargeBoxIds()); + + conList.setIsFiltered(isFilterd(queryParams)); + List latestList = chargePointHelperService.getChargePointConnectorStatus(queryParams); + List sortedList = ConnectorStatusFilter.filterAndPreferZero(latestList); + conList.setConnectors(sortedList); + return conList; + } + + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 400, message = "Bad Request", response = ApiControllerAdvice.ApiErrorResponse.class), + @ApiResponse(code = 401, message = "Unauthorized", response = ApiControllerAdvice.ApiErrorResponse.class), + @ApiResponse(code = 500, message = "Internal Server Error", response = ApiControllerAdvice.ApiErrorResponse.class)} + ) + @GetMapping(value = "OCPP_JSON_STATUS") + @ResponseBody + public List getOcppJsonStatus() { + return chargePointHelperService.getOcppJsonStatus(); + } + + // ------------------------------------------------------------------------- + // Helpers + // ------------------------------------------------------------------------- + + private Boolean isFilterd(ConnectorStatusForm queryParams) { + if (!isNull(queryParams)) { + if (!isNull(queryParams.getChargeBoxId())) { + if (!queryParams.getChargeBoxId().isBlank()) { + return true; + } + } + if (!isNull(queryParams.getStatus())) { + if (!queryParams.getStatus().isBlank()) { + return true; + } + } + } + return false; + } +} From 5a0401852e1443a30c929400eca79dab3e251ee4 Mon Sep 17 00:00:00 2001 From: fnkbsi <> Date: Wed, 25 Oct 2023 12:27:18 +0200 Subject: [PATCH 15/48] RemoteStartStopController: methode postRemoteStartTx now checks if there is already a active transaction, methode postUnlockCon checks no that there is no active transaction, removed the ocpp tag check; Added comments --- .../api/RemoteStartStopRestController.java | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java index 785e3aacc..7f8cdefe5 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java @@ -102,7 +102,7 @@ private String getOcppProtocol(String chargeBoxId) { private Integer remoteStart(String chargeBoxId, RemoteStartTransactionParams transactionParams) { String ocppProtocol = getOcppProtocol(chargeBoxId); - Integer taskId = 0; + Integer taskId; switch (ocppProtocol) { case "OCPP1.6J": case "OCPP1.6S": @@ -121,9 +121,10 @@ private Integer remoteStart(String chargeBoxId, RemoteStartTransactionParams tra } return taskId; } - private Integer remoteStop(String chargeBoxId, RemoteStopTransactionParams transactionParams) { + + private Integer remoteStop(String chargeBoxId, RemoteStopTransactionParams transactionParams) { String ocppProtocol = getOcppProtocol(chargeBoxId); - Integer taskId = 0; + Integer taskId; switch (ocppProtocol) { case "OCPP1.6J": case "OCPP1.6S": @@ -139,14 +140,13 @@ private Integer remoteStop(String chargeBoxId, RemoteStopTransactionParams trans break; default: taskId = client12.remoteStopTransaction(transactionParams, "SteveWebApi"); - } return taskId; } private Integer remoteUnlock(String chargeBoxId, UnlockConnectorParams transactionParams) { String ocppProtocol = getOcppProtocol(chargeBoxId); - Integer taskId = 0; + Integer taskId; switch (ocppProtocol) { case "OCPP1.6J": case "OCPP1.6S": @@ -190,8 +190,6 @@ private ApiTaskList getTaskList() { return lsTasks; } - - // ------------------------------------------------------------------------- // Http methods (GET) // ------------------------------------------------------------------------- @@ -300,6 +298,17 @@ public ApiTaskInfo getTaskDetails(@Valid Integer taskId) { @PostMapping(value = "start") @ResponseBody public Integer postRemoteStartTx(@Valid ApiChargePointStart params) { + // Check for acctive transactions on the connector, If a active transaction is found, don't send RemoteStart. + Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(), params.getConnectorId()); + if (!isNull(transactionId)){ + String errMsg = String.format("Active transaction found for connector %s at ChargeBox %s!", + params.getConnectorId(), + params.getChargeBoxId() + ); + throw new BadRequestException(errMsg); + } + // Check if OCPP-Tag is allowed to use the connector? To be discussed and t.b.d.! + RemoteStartTransactionParams transactionParams = new RemoteStartTransactionParams(); transactionParams.setChargePointSelectList(chargePointRepository.getChargePointSelect(params.getChargeBoxId())); transactionParams.setConnectorId(params.getConnectorId()); @@ -317,7 +326,10 @@ public Integer postRemoteStartTx(@Valid ApiChargePointStart params) { @ResponseBody public Integer postRemoteStopTx(@Valid ApiChargePointStart params) { RemoteStopTransactionParams transactionParams = new RemoteStopTransactionParams(); + // set the ChargPointSelectionList, maybe check nessesary that length is one transactionParams.setChargePointSelectList(chargePointRepository.getChargePointSelect(params.getChargeBoxId())); + + // Get the transactionId of the active transaction on the connector. If no transaction active don't send RemoteStop Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(),params.getConnectorId()); if (isNull(transactionId)){ String errMsg = String.format("No active transaction found for connector %s at ChargeBox %s!", @@ -326,6 +338,8 @@ public Integer postRemoteStopTx(@Valid ApiChargePointStart params) { ); throw new BadRequestException(errMsg); } + + // check the user is allowed to stop this transaction (actual only the one who started it!) String ocppTag = transactionRepository.getOcppTagOfTransaction(transactionId); if (!params.getOcppTag().contentEquals(ocppTag)){ throw new BadRequestException("The transaction wass authorised with another OCPP Tag!"); @@ -346,18 +360,17 @@ public Integer postRemoteStopTx(@Valid ApiChargePointStart params) { public Integer postUnlockCon(@Valid ApiChargePointStart params) { UnlockConnectorParams transactionParams = new UnlockConnectorParams(); transactionParams.setChargePointSelectList(chargePointRepository.getChargePointSelect(params.getChargeBoxId())); + + /* If a active transaction is found, don't unlock the connection. */ Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(), params.getConnectorId()); - if (isNull(transactionId)){ - String errMsg = String.format("No active transaction found for connector %s at ChargeBox %s!", + if (!isNull(transactionId)){ + String errMsg = String.format("Active transaction found for connector %s at ChargeBox %s!", params.getConnectorId(), params.getChargeBoxId() ); throw new BadRequestException(errMsg); } - String ocppTag = transactionRepository.getOcppTagOfTransaction(transactionId); - if (!params.getOcppTag().contentEquals(ocppTag)){ - throw new BadRequestException("The transaction wass authorised with another OCPP Tag!"); - } + transactionParams.setConnectorId(params.getConnectorId()); return remoteUnlock(params.getChargeBoxId(), transactionParams); } From ed42990871e7de438d66bc51529e9329062eb89c Mon Sep 17 00:00:00 2001 From: fnkbsi <> Date: Wed, 25 Oct 2023 12:37:32 +0200 Subject: [PATCH 16/48] RemoteStartStopController: moved the task related methods to the new TaskRestController class --- .../api/RemoteStartStopRestController.java | 54 --------- .../steve/web/api/TaskRestController.java | 106 ++++++++++++++++++ 2 files changed, 106 insertions(+), 54 deletions(-) create mode 100644 src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java diff --git a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java index 7f8cdefe5..c3767b0dd 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java @@ -20,7 +20,6 @@ import de.rwth.idsg.steve.ocpp.OcppVersion; import de.rwth.idsg.steve.repository.ChargePointRepository; -import de.rwth.idsg.steve.repository.TaskStore; import de.rwth.idsg.steve.repository.TransactionRepository; import de.rwth.idsg.steve.repository.dto.ChargePointSelect; @@ -40,8 +39,6 @@ import de.rwth.idsg.steve.web.api.ApiControllerAdvice.ApiErrorResponse; import de.rwth.idsg.steve.web.api.dto.ApiChargePointList; import de.rwth.idsg.steve.web.api.dto.ApiChargePointStart; -import de.rwth.idsg.steve.web.api.dto.ApiTaskInfo; -import de.rwth.idsg.steve.web.api.dto.ApiTaskList; import de.rwth.idsg.steve.web.api.exception.BadRequestException; import de.rwth.idsg.steve.web.dto.ChargePointQueryForm; import io.swagger.annotations.ApiResponse; @@ -75,8 +72,6 @@ public class RemoteStartStopRestController { @Autowired protected ChargePointHelperService chargePointHelperService; @Autowired private ChargePointRepository chargePointRepository; @Autowired private TransactionRepository transactionRepository; - //@Autowired private OcppTagService ocppTagService; - @Autowired private TaskStore taskStore; @Autowired @Qualifier("ChargePointService12_Client") @@ -184,12 +179,6 @@ private ApiChargePointList getChargePoints() { return lsCp; } - private ApiTaskList getTaskList() { - ApiTaskList lsTasks = new ApiTaskList(); - lsTasks.setTasks(taskStore.getOverview()); - return lsTasks; - } - // ------------------------------------------------------------------------- // Http methods (GET) // ------------------------------------------------------------------------- @@ -242,49 +231,6 @@ public ApiChargePointList getUnlockCon() { return getChargePoints(); } - // ------------------------------------------------------------------------- - // Task --> need of polling - // ------------------------------------------------------------------------- - - @ApiResponses(value = { - @ApiResponse(code = 200, message = "OK"), - @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), - @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), - @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} - ) - @GetMapping(value = "taskoverview") - @ResponseBody - public ApiTaskList getOverview() { - return getTaskList(); - } - - - @ApiResponses(value = { - @ApiResponse(code = 200, message = "OK"), - @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), - @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), - @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} - ) - @PostMapping(value = "clearfinishedtasks") - @ResponseBody - public ApiTaskList clearFinished() { - taskStore.clearFinished(); - return getTaskList(); - } - - @ApiResponses(value = { - @ApiResponse(code = 200, message = "OK"), - @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), - @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), - @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} - ) - @GetMapping(value = "task") - @ResponseBody - public ApiTaskInfo getTaskDetails(@Valid Integer taskId) { - ApiTaskInfo taskInfo = new ApiTaskInfo(taskId, taskStore.get(taskId)); - return taskInfo; - } - // ------------------------------------------------------------------------- // Http methods (POST) // ------------------------------------------------------------------------- diff --git a/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java new file mode 100644 index 000000000..960947889 --- /dev/null +++ b/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java @@ -0,0 +1,106 @@ +/* + * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve + * Copyright (C) 2013-2023 SteVe Community Team + * All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.rwth.idsg.steve.web.api; + +import de.rwth.idsg.steve.repository.TaskStore; + +import org.springframework.beans.factory.annotation.Autowired; + +import de.rwth.idsg.steve.web.api.ApiControllerAdvice.ApiErrorResponse; +import de.rwth.idsg.steve.web.api.dto.ApiTaskInfo; +import de.rwth.idsg.steve.web.api.dto.ApiTaskList; +import de.rwth.idsg.steve.web.api.exception.BadRequestException; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; + +/** + * @author fnkbsi + * @since 18.10.2023 + */ +@Slf4j +@RestController +@RequestMapping(value = "/api/v1/remote", produces = MediaType.APPLICATION_JSON_VALUE) +@RequiredArgsConstructor +public class TaskRestController { + + @Autowired private TaskStore taskStore; + + // ------------------------------------------------------------------------- + // Helpers + // ------------------------------------------------------------------------- + + private ApiTaskList getTaskList() { + ApiTaskList lsTasks = new ApiTaskList(); + lsTasks.setTasks(taskStore.getOverview()); + return lsTasks; + } + + // ------------------------------------------------------------------------- + // Http methods (GET) + // ------------------------------------------------------------------------- + + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), + @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), + @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + ) + @GetMapping(value = "taskoverview") + @ResponseBody + public ApiTaskList getOverview() { + return getTaskList(); + } + + + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), + @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), + @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + ) + @PostMapping(value = "clearfinishedtasks") + @ResponseBody + public ApiTaskList clearFinished() { + taskStore.clearFinished(); + return getTaskList(); + } + + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), + @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), + @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + ) + @GetMapping(value = "task") + @ResponseBody + public ApiTaskInfo getTaskDetails(@Valid Integer taskId) { + ApiTaskInfo taskInfo = new ApiTaskInfo(taskId, taskStore.get(taskId)); + return taskInfo; + } +} From 0e724a46adb13eab2891aa5c8b4131024b5ce989 Mon Sep 17 00:00:00 2001 From: fnkbsi <> Date: Wed, 25 Oct 2023 13:36:20 +0200 Subject: [PATCH 17/48] TaskReskController: removed unused import BadRequest... --- src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java index 960947889..25749055d 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java @@ -25,7 +25,6 @@ import de.rwth.idsg.steve.web.api.ApiControllerAdvice.ApiErrorResponse; import de.rwth.idsg.steve.web.api.dto.ApiTaskInfo; import de.rwth.idsg.steve.web.api.dto.ApiTaskList; -import de.rwth.idsg.steve.web.api.exception.BadRequestException; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import lombok.RequiredArgsConstructor; From 9a5854151abc5f40802f3dff995119874126ac5b Mon Sep 17 00:00:00 2001 From: fnkbsi <> Date: Wed, 25 Oct 2023 13:41:00 +0200 Subject: [PATCH 18/48] style --- .../idsg/steve/web/api/RemoteStartStopRestController.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java index c3767b0dd..923ace771 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java @@ -272,11 +272,11 @@ public Integer postRemoteStartTx(@Valid ApiChargePointStart params) { @ResponseBody public Integer postRemoteStopTx(@Valid ApiChargePointStart params) { RemoteStopTransactionParams transactionParams = new RemoteStopTransactionParams(); - // set the ChargPointSelectionList, maybe check nessesary that length is one + // set the ChargPointSelectionList, maybe check nessesary that length is one transactionParams.setChargePointSelectList(chargePointRepository.getChargePointSelect(params.getChargeBoxId())); - // Get the transactionId of the active transaction on the connector. If no transaction active don't send RemoteStop - Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(),params.getConnectorId()); + // Get the transactionId of the active transaction on the connector. If no transaction active don't send RemoteStop + Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(), params.getConnectorId()); if (isNull(transactionId)){ String errMsg = String.format("No active transaction found for connector %s at ChargeBox %s!", params.getConnectorId(), @@ -306,7 +306,7 @@ public Integer postRemoteStopTx(@Valid ApiChargePointStart params) { public Integer postUnlockCon(@Valid ApiChargePointStart params) { UnlockConnectorParams transactionParams = new UnlockConnectorParams(); transactionParams.setChargePointSelectList(chargePointRepository.getChargePointSelect(params.getChargeBoxId())); - + /* If a active transaction is found, don't unlock the connection. */ Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(), params.getConnectorId()); if (!isNull(transactionId)){ From 41017aa1e08ee305d39782658d4ddf7912a6f1d8 Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Wed, 25 Oct 2023 13:49:10 +0200 Subject: [PATCH 19/48] removed unused dto ApiConnectorList --- .../steve/web/api/dto/ApiConnectorList.java | 53 ------------------- 1 file changed, 53 deletions(-) delete mode 100644 src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java deleted file mode 100644 index 79f4f62bf..000000000 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve - * Copyright (C) 2013-2023 SteVe Community Team - * All Rights Reserved. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package de.rwth.idsg.steve.web.api.dto; - -//import de.rwth.idsg.steve.ocpp.OcppTransport; -import de.rwth.idsg.steve.repository.dto.ConnectorStatus; -import de.rwth.idsg.steve.utils.ConnectorStatusCountFilter; -import io.swagger.annotations.ApiModelProperty; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.Setter; - -/** - * @author fnkbsi - * @since 20.10.2023 - */ - -@Getter -@Setter -@RequiredArgsConstructor -public class ApiConnectorList { - - @ApiModelProperty(value = "List of charge boxes") - List chargeBoxList = new ArrayList<>(); - - @ApiModelProperty(value = "List of possibel Status values") - final Set statusFilterValues = ConnectorStatusCountFilter.ALL_STATUS_VALUES; - - @ApiModelProperty(value = "List of Connectors is filtered") - Boolean isFiltered = false; - - @ApiModelProperty(value = "List of connectors") - List connectors = new ArrayList<>();; -} From 9b708c857ba6383b9a0c75bb8ef2a59ba7f833f9 Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Wed, 25 Oct 2023 16:14:23 +0200 Subject: [PATCH 20/48] ApiTaskInfo: removed unused/out commented imports --- .../java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java index cf25c0947..a295e2447 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java @@ -18,7 +18,6 @@ */ package de.rwth.idsg.steve.web.api.dto; -//import de.rwth.idsg.steve.ocpp.OcppTransport; import de.rwth.idsg.steve.ocpp.CommunicationTask; import de.rwth.idsg.steve.ocpp.OcppVersion; import de.rwth.idsg.steve.ocpp.RequestResult; @@ -26,10 +25,8 @@ import io.swagger.annotations.ApiModelProperty; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; -//import java.util.Collections; -//import java.util.List; + import lombok.Getter; -//import lombok.RequiredArgsConstructor; import lombok.Setter; import org.joda.time.DateTime; @@ -40,7 +37,6 @@ @Getter @Setter -//@RequiredArgsConstructor public class ApiTaskInfo { @ApiModelProperty(value = "Task ID") public Integer taskId; From e09d14c79af8e0daedc9d02f89ff8d867a29039e Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Wed, 25 Oct 2023 16:17:03 +0200 Subject: [PATCH 21/48] REmoteStartStopREstController: added check for active tasks on charge box --- .../api/RemoteStartStopRestController.java | 48 ++++++++++++++++++- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java index 923ace771..b60212347 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java @@ -18,10 +18,13 @@ */ package de.rwth.idsg.steve.web.api; +import de.rwth.idsg.steve.ocpp.CommunicationTask; import de.rwth.idsg.steve.ocpp.OcppVersion; import de.rwth.idsg.steve.repository.ChargePointRepository; +import de.rwth.idsg.steve.repository.TaskStore; import de.rwth.idsg.steve.repository.TransactionRepository; import de.rwth.idsg.steve.repository.dto.ChargePointSelect; +import de.rwth.idsg.steve.repository.dto.TaskOverview; import de.rwth.idsg.steve.service.ChargePointHelperService; import de.rwth.idsg.steve.service.ChargePointService12_Client; @@ -72,6 +75,7 @@ public class RemoteStartStopRestController { @Autowired protected ChargePointHelperService chargePointHelperService; @Autowired private ChargePointRepository chargePointRepository; @Autowired private TransactionRepository transactionRepository; + @Autowired private TaskStore taskStore; @Autowired @Qualifier("ChargePointService12_Client") @@ -90,7 +94,7 @@ public class RemoteStartStopRestController { // ------------------------------------------------------------------------- private String getOcppProtocol(String chargeBoxId) { - ChargePointQueryForm form = new ChargePointQueryForm(); + ChargePointQueryForm form = new ChargePointQueryForm(); form.setChargeBoxId(chargeBoxId); return chargePointRepository.getOverview(form).get(0).getOcppProtocol().toUpperCase(); } @@ -179,6 +183,21 @@ private ApiChargePointList getChargePoints() { return lsCp; } + private Boolean activeTaskOnChargeBox(String chargeBoxId) { + Boolean retValue = false; + List taskList = taskStore.getOverview(); + for (TaskOverview taOverview : taskList) { + CommunicationTask task = taskStore.get(taOverview.getTaskId()); + if (!task.isFinished()) { + if (!isNull(task.getResultMap().get(chargeBoxId))) { + retValue = true; + break; + } + } + } + return retValue; + } + // ------------------------------------------------------------------------- // Http methods (GET) // ------------------------------------------------------------------------- @@ -233,6 +252,7 @@ public ApiChargePointList getUnlockCon() { // ------------------------------------------------------------------------- // Http methods (POST) + // the methods return the taskID, check the sucess with the TaskRestController // ------------------------------------------------------------------------- @ApiResponses(value = { @@ -244,9 +264,17 @@ public ApiChargePointList getUnlockCon() { @PostMapping(value = "start") @ResponseBody public Integer postRemoteStartTx(@Valid ApiChargePointStart params) { + // only one active task per charge box over api; to be discussed! + if (activeTaskOnChargeBox(params.getChargeBoxId())) { + String errMsg = String.format("Active task found on ChargeBox %s!", + params.getChargeBoxId() + ); + throw new BadRequestException(errMsg); + } + // Check for acctive transactions on the connector, If a active transaction is found, don't send RemoteStart. Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(), params.getConnectorId()); - if (!isNull(transactionId)){ + if (!isNull(transactionId)) { String errMsg = String.format("Active transaction found for connector %s at ChargeBox %s!", params.getConnectorId(), params.getChargeBoxId() @@ -271,6 +299,14 @@ public Integer postRemoteStartTx(@Valid ApiChargePointStart params) { @PostMapping(value = "stop") @ResponseBody public Integer postRemoteStopTx(@Valid ApiChargePointStart params) { + // only one active task per charge box over api; to be discussed! + if (activeTaskOnChargeBox(params.getChargeBoxId())) { + String errMsg = String.format("Active task found on ChargeBox %s!", + params.getChargeBoxId() + ); + throw new BadRequestException(errMsg); + } + RemoteStopTransactionParams transactionParams = new RemoteStopTransactionParams(); // set the ChargPointSelectionList, maybe check nessesary that length is one transactionParams.setChargePointSelectList(chargePointRepository.getChargePointSelect(params.getChargeBoxId())); @@ -304,6 +340,14 @@ public Integer postRemoteStopTx(@Valid ApiChargePointStart params) { @PostMapping(value = "unlock") @ResponseBody public Integer postUnlockCon(@Valid ApiChargePointStart params) { + // only one active task per charge box over api; to be discussed! + if (activeTaskOnChargeBox(params.getChargeBoxId())) { + String errMsg = String.format("Active task found on ChargeBox %s!", + params.getChargeBoxId() + ); + throw new BadRequestException(errMsg); + } + UnlockConnectorParams transactionParams = new UnlockConnectorParams(); transactionParams.setChargePointSelectList(chargePointRepository.getChargePointSelect(params.getChargeBoxId())); From 5517cd175602baaa00fbf8303ec17ad7e8f26b28 Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Wed, 25 Oct 2023 16:34:40 +0200 Subject: [PATCH 22/48] add dto ApiConnectorList --- .../steve/web/api/dto/ApiConnectorList.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java new file mode 100644 index 000000000..b2cb2f5b5 --- /dev/null +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java @@ -0,0 +1,53 @@ +/* + * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve + * Copyright (C) 2013-2023 SteVe Community Team + * All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.rwth.idsg.steve.web.api.dto; + +//import de.rwth.idsg.steve.ocpp.OcppTransport; +import de.rwth.idsg.steve.repository.dto.ConnectorStatus; +import de.rwth.idsg.steve.utils.ConnectorStatusCountFilter; +import io.swagger.annotations.ApiModelProperty; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; + +/** + * @author fnkbsi + * @since 20.10.2023 + */ + +@Getter +@Setter +@RequiredArgsConstructor +public class ApiConnectorList { + + @ApiModelProperty(value = "List of charge boxes") + List chargeBoxList = new ArrayList<>(); + + @ApiModelProperty(value = "List of possible states") + final Set statusFilterValues = ConnectorStatusCountFilter.ALL_STATUS_VALUES; + + @ApiModelProperty(value = "List of connectors is filtered") + Boolean isFiltered = false; + + @ApiModelProperty(value = "List of connectors") + List connectors = new ArrayList<>();; +} From bc02600995c832623aaa36f505c19619c42091c4 Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Wed, 25 Oct 2023 16:35:29 +0200 Subject: [PATCH 23/48] ConnectorRestController: rename method --- .../de/rwth/idsg/steve/web/api/ConnectorRestController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java index 52c1a270f..82b0d824b 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java @@ -68,7 +68,7 @@ public class ConnectorRestController { ) @GetMapping(value = "") @ResponseBody - public ApiConnectorList getConnectorStatusQuery(@Valid ConnectorStatusForm queryParams) { + public ApiConnectorList getConnectors(@Valid ConnectorStatusForm queryParams) { ApiConnectorList conList = new ApiConnectorList(); conList.setChargeBoxList(chargePointRepository.getChargeBoxIds()); From 770c5946c45e1eb0448939aa5ab6bca8e7d78378 Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Wed, 25 Oct 2023 17:16:54 +0200 Subject: [PATCH 24/48] ApiConnectorList: removed unnessesary semicolon --- .../java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java index b2cb2f5b5..ed98cf4c7 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java @@ -49,5 +49,5 @@ public class ApiConnectorList { Boolean isFiltered = false; @ApiModelProperty(value = "List of connectors") - List connectors = new ArrayList<>();; + List connectors = new ArrayList<>(); } From b5211f76d3900d933a2e0c3c60ff3cec547842cc Mon Sep 17 00:00:00 2001 From: fnkbsi <> Date: Thu, 2 Nov 2023 11:25:48 +0100 Subject: [PATCH 25/48] ApiChargePointStart: correct ApiModelProperty value --- .../de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java index b537d1c25..33739fe5d 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java @@ -37,7 +37,7 @@ public class ApiChargePointStart { @ApiModelProperty(value = "Charge Box ID") private String chargeBoxId; - @ApiModelProperty(value = "List of the charge box connectors") + @ApiModelProperty(value = "Connector ID") private Integer connectorId; @ApiModelProperty(value = "OCPP Tag") private String ocppTag; From 6b77e92f0466eba5661e6a19a0e76821ea724c79 Mon Sep 17 00:00:00 2001 From: fnkbsi <> Date: Sun, 5 Nov 2023 21:04:20 +0100 Subject: [PATCH 26/48] ConnectorStatusForm add menber for Strategy of listing the connector --- .../de/rwth/idsg/steve/web/dto/ConnectorStatusForm.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/rwth/idsg/steve/web/dto/ConnectorStatusForm.java b/src/main/java/de/rwth/idsg/steve/web/dto/ConnectorStatusForm.java index 0e0be9b1e..86694db52 100644 --- a/src/main/java/de/rwth/idsg/steve/web/dto/ConnectorStatusForm.java +++ b/src/main/java/de/rwth/idsg/steve/web/dto/ConnectorStatusForm.java @@ -33,6 +33,13 @@ public class ConnectorStatusForm { @ApiModelProperty(value = "Charge Box Id") private String chargeBoxId; - @ApiModelProperty(value = "Status of the Charge Box") + @ApiModelProperty(value = "Connector Status") private String status; + @ApiModelProperty(value = "Strategy of listing the connector") + private Strategy strategy = Strategy.PreferZero; + + public enum Strategy { + PreferZero, + PreferOthersWithStatusOfZero; + } } From 4c01d024db2a2d4f383afd6292f3bea840c9ddd1 Mon Sep 17 00:00:00 2001 From: fnkbsi <> Date: Sun, 5 Nov 2023 21:11:16 +0100 Subject: [PATCH 27/48] HomeController & ConnectorRestController: option to choose between PreferZero and PreferOthersWithStatusOfZero --- .../rwth/idsg/steve/web/api/ConnectorRestController.java | 7 ++++++- .../de/rwth/idsg/steve/web/controller/HomeController.java | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java index 82b0d824b..4aeb6def7 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java @@ -74,7 +74,12 @@ public ApiConnectorList getConnectors(@Valid ConnectorStatusForm queryParams) { conList.setIsFiltered(isFilterd(queryParams)); List latestList = chargePointHelperService.getChargePointConnectorStatus(queryParams); - List sortedList = ConnectorStatusFilter.filterAndPreferZero(latestList); + List sortedList; + if (queryParams.getStrategy() == ConnectorStatusForm.Strategy.PreferZero) { + sortedList = ConnectorStatusFilter.filterAndPreferZero(latestList); + } else { + sortedList = ConnectorStatusFilter.filterAndPreferOthersWithStatusOfZero(latestList); + } conList.setConnectors(sortedList); return conList; } diff --git a/src/main/java/de/rwth/idsg/steve/web/controller/HomeController.java b/src/main/java/de/rwth/idsg/steve/web/controller/HomeController.java index 2eb904e5a..641cb09bf 100644 --- a/src/main/java/de/rwth/idsg/steve/web/controller/HomeController.java +++ b/src/main/java/de/rwth/idsg/steve/web/controller/HomeController.java @@ -78,7 +78,12 @@ public String getConnectorStatusQuery(@ModelAttribute(PARAMS) ConnectorStatusFor model.addAttribute(PARAMS, params); List latestList = chargePointHelperService.getChargePointConnectorStatus(params); - List filteredList = ConnectorStatusFilter.filterAndPreferZero(latestList); + List filteredList; + if (params.getStrategy()== ConnectorStatusForm.Strategy.PreferZero){ + filteredList = ConnectorStatusFilter.filterAndPreferZero(latestList); + } else { + filteredList = ConnectorStatusFilter.filterAndPreferOthersWithStatusOfZero(latestList); + } model.addAttribute("connectorStatusList", filteredList); return "connectorStatus"; } From 703867bd195a3c2ff332adc63ce9c710f6d3e9da Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Sun, 5 Nov 2023 21:13:58 +0100 Subject: [PATCH 28/48] connectorStatus.jsp: add query field for strategy the connector listing --- .../resources/webapp/WEB-INF/views/connectorStatus.jsp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/resources/webapp/WEB-INF/views/connectorStatus.jsp b/src/main/resources/webapp/WEB-INF/views/connectorStatus.jsp index ce6b75643..49ce0887e 100644 --- a/src/main/resources/webapp/WEB-INF/views/connectorStatus.jsp +++ b/src/main/resources/webapp/WEB-INF/views/connectorStatus.jsp @@ -51,6 +51,14 @@ Connector Status + + Status: + + + + + + From d41e059c15456b422f0a06d473bee726b9d64e79 Mon Sep 17 00:00:00 2001 From: fnkbsi <> Date: Mon, 6 Nov 2023 10:55:54 +0100 Subject: [PATCH 29/48] style improvement --- .../repository/ChargePointRepository.java | 2 +- .../repository/TransactionRepository.java | 2 +- .../impl/ChargePointRepositoryImpl.java | 10 ++++----- .../impl/TransactionRepositoryImpl.java | 4 ++-- .../web/api/ConnectorRestController.java | 6 +++-- .../api/RemoteStartStopRestController.java | 22 +++++++++++-------- .../steve/web/api/dto/ApiChargePointList.java | 6 ++--- .../web/api/dto/ApiChargePointStart.java | 2 +- .../steve/web/api/dto/ApiConnectorList.java | 8 +++---- .../idsg/steve/web/api/dto/ApiTaskInfo.java | 22 +++++++++---------- .../idsg/steve/web/api/dto/ApiTaskList.java | 2 +- .../steve/web/controller/HomeController.java | 2 +- .../idsg/steve/web/dto/OcppJsonStatus.java | 2 +- 13 files changed, 47 insertions(+), 43 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/repository/ChargePointRepository.java b/src/main/java/de/rwth/idsg/steve/repository/ChargePointRepository.java index ea7abbb30..4fcd6dc5a 100644 --- a/src/main/java/de/rwth/idsg/steve/repository/ChargePointRepository.java +++ b/src/main/java/de/rwth/idsg/steve/repository/ChargePointRepository.java @@ -45,7 +45,7 @@ default List getChargePointSelect(OcppProtocol protocol, List return getChargePointSelect(protocol, inStatusFilter, Collections.emptyList()); } - List getChargePointSelect(String ChageBoxID); + List getChargePointSelect(String chageBoxID); List getChargeBoxIds(); Map getChargeBoxIdPkPair(List chargeBoxIdList); diff --git a/src/main/java/de/rwth/idsg/steve/repository/TransactionRepository.java b/src/main/java/de/rwth/idsg/steve/repository/TransactionRepository.java index e1e4f24b1..940893f81 100644 --- a/src/main/java/de/rwth/idsg/steve/repository/TransactionRepository.java +++ b/src/main/java/de/rwth/idsg/steve/repository/TransactionRepository.java @@ -36,7 +36,7 @@ public interface TransactionRepository { List getActiveTransactionIds(String chargeBoxId); Integer getActiveTransactionId(String chargeBoxId, Integer connectorId); - String getOcppTagOfTransaction(Integer transaction_pk); + String getOcppTagOfTransaction(Integer transactionPk); TransactionDetails getDetails(int transactionPk, boolean firstArrivingMeterValueIfMultiple); diff --git a/src/main/java/de/rwth/idsg/steve/repository/impl/ChargePointRepositoryImpl.java b/src/main/java/de/rwth/idsg/steve/repository/impl/ChargePointRepositoryImpl.java index 5f9f1c2f0..4548f0a49 100644 --- a/src/main/java/de/rwth/idsg/steve/repository/impl/ChargePointRepositoryImpl.java +++ b/src/main/java/de/rwth/idsg/steve/repository/impl/ChargePointRepositoryImpl.java @@ -104,18 +104,16 @@ public List getChargePointSelect(OcppProtocol protocol, List< } @Override // returns List of zero or one ChargeBox - public List getChargePointSelect(String ChageBoxID) // OcppProtocol protocol, - { - //OcppProtocol protocol = OcppProtocol.V_16_JSON; - + public List getChargePointSelect(String chageBoxID) { return ctx.select(CHARGE_BOX.CHARGE_BOX_ID, CHARGE_BOX.ENDPOINT_ADDRESS, CHARGE_BOX.OCPP_PROTOCOL) .from(CHARGE_BOX) - .where(CHARGE_BOX.CHARGE_BOX_ID.eq(ChageBoxID)) + .where(CHARGE_BOX.CHARGE_BOX_ID.eq(chageBoxID)) //.and(CHARGE_BOX.OCPP_PROTOCOL.equal(protocol.getCompositeValue())) //.and(CHARGE_BOX.ENDPOINT_ADDRESS.isNotNull()) //.and(CHARGE_BOX.REGISTRATION_STATUS.eq(RegistrationStatus.ACCEPTED.value())) .fetch() - .map(r -> new ChargePointSelect(OcppProtocol.fromCompositeValue(r.value3()).getTransport() , r.value1(), r.value2())); + .map(r -> new ChargePointSelect(OcppProtocol.fromCompositeValue(r.value3()).getTransport(), + r.value1(), r.value2())); } @Override diff --git a/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java b/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java index 90be44787..0028d14c2 100644 --- a/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java +++ b/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java @@ -101,10 +101,10 @@ public Integer getActiveTransactionId(String chargeBoxId, Integer connectorId) { } @Override - public String getOcppTagOfTransaction(Integer transaction_pk) { + public String getOcppTagOfTransaction(Integer transactionPk) { return ctx.select(TRANSACTION.ID_TAG) .from(TRANSACTION) - .where(TRANSACTION.TRANSACTION_PK.eq(transaction_pk)) + .where(TRANSACTION.TRANSACTION_PK.eq(transactionPk)) .fetchAny(TRANSACTION.ID_TAG); /* .fetch().sortDesc(TRANSACTION.START_TIMESTAMP).getValue(0, TRANSACTION.ID_TAG); if TRANSACTION has sometimes errors an more then one open/active transaction per connector */ diff --git a/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java index 4aeb6def7..9602fccfc 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java @@ -64,7 +64,8 @@ public class ConnectorRestController { @ApiResponse(code = 200, message = "OK"), @ApiResponse(code = 400, message = "Bad Request", response = ApiControllerAdvice.ApiErrorResponse.class), @ApiResponse(code = 401, message = "Unauthorized", response = ApiControllerAdvice.ApiErrorResponse.class), - @ApiResponse(code = 500, message = "Internal Server Error", response = ApiControllerAdvice.ApiErrorResponse.class)} + @ApiResponse(code = 500, message = "Internal Server Error", + response = ApiControllerAdvice.ApiErrorResponse.class)} ) @GetMapping(value = "") @ResponseBody @@ -88,7 +89,8 @@ public ApiConnectorList getConnectors(@Valid ConnectorStatusForm queryParams) { @ApiResponse(code = 200, message = "OK"), @ApiResponse(code = 400, message = "Bad Request", response = ApiControllerAdvice.ApiErrorResponse.class), @ApiResponse(code = 401, message = "Unauthorized", response = ApiControllerAdvice.ApiErrorResponse.class), - @ApiResponse(code = 500, message = "Internal Server Error", response = ApiControllerAdvice.ApiErrorResponse.class)} + @ApiResponse(code = 500, message = "Internal Server Error", + response = ApiControllerAdvice.ApiErrorResponse.class)} ) @GetMapping(value = "OCPP_JSON_STATUS") @ResponseBody diff --git a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java index b60212347..bfeab7c4f 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java @@ -72,7 +72,7 @@ @RequiredArgsConstructor public class RemoteStartStopRestController { - @Autowired protected ChargePointHelperService chargePointHelperService; + @Autowired private ChargePointHelperService chargePointHelperService; @Autowired private ChargePointRepository chargePointRepository; @Autowired private TransactionRepository transactionRepository; @Autowired private TaskStore taskStore; @@ -105,7 +105,7 @@ private Integer remoteStart(String chargeBoxId, RemoteStartTransactionParams tra switch (ocppProtocol) { case "OCPP1.6J": case "OCPP1.6S": - taskId =client16.remoteStartTransaction(transactionParams, "SteveWebApi"); + taskId = client16.remoteStartTransaction(transactionParams, "SteveWebApi"); break; case "OCPP1.5J": case "OCPP1.5S": @@ -273,7 +273,8 @@ public Integer postRemoteStartTx(@Valid ApiChargePointStart params) { } // Check for acctive transactions on the connector, If a active transaction is found, don't send RemoteStart. - Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(), params.getConnectorId()); + Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(), + params.getConnectorId()); if (!isNull(transactionId)) { String errMsg = String.format("Active transaction found for connector %s at ChargeBox %s!", params.getConnectorId(), @@ -311,9 +312,11 @@ public Integer postRemoteStopTx(@Valid ApiChargePointStart params) { // set the ChargPointSelectionList, maybe check nessesary that length is one transactionParams.setChargePointSelectList(chargePointRepository.getChargePointSelect(params.getChargeBoxId())); - // Get the transactionId of the active transaction on the connector. If no transaction active don't send RemoteStop - Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(), params.getConnectorId()); - if (isNull(transactionId)){ + // Get the transactionId of the active transaction on the connector. + // If no transaction active don't send RemoteStop + Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(), + params.getConnectorId()); + if (isNull(transactionId)) { String errMsg = String.format("No active transaction found for connector %s at ChargeBox %s!", params.getConnectorId(), params.getChargeBoxId() @@ -323,7 +326,7 @@ public Integer postRemoteStopTx(@Valid ApiChargePointStart params) { // check the user is allowed to stop this transaction (actual only the one who started it!) String ocppTag = transactionRepository.getOcppTagOfTransaction(transactionId); - if (!params.getOcppTag().contentEquals(ocppTag)){ + if (!params.getOcppTag().contentEquals(ocppTag)) { throw new BadRequestException("The transaction wass authorised with another OCPP Tag!"); } transactionParams.setTransactionId(transactionId); @@ -352,8 +355,9 @@ public Integer postUnlockCon(@Valid ApiChargePointStart params) { transactionParams.setChargePointSelectList(chargePointRepository.getChargePointSelect(params.getChargeBoxId())); /* If a active transaction is found, don't unlock the connection. */ - Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(), params.getConnectorId()); - if (!isNull(transactionId)){ + Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(), + params.getConnectorId()); + if (!isNull(transactionId)) { String errMsg = String.format("Active transaction found for connector %s at ChargeBox %s!", params.getConnectorId(), params.getChargeBoxId() diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java index 29a4e6ae5..db7ecc08a 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java @@ -37,9 +37,9 @@ @RequiredArgsConstructor public class ApiChargePointList { @ApiModelProperty(value = "List of charge points") - List chargePointList = new ArrayList<>();; + private List chargePointList = new ArrayList<>(); - public void addCP(String chargeBoxId, List connectorIds){ + public void addCP(String chargeBoxId, List connectorIds) { ChargePointInfo cp = new ChargePointInfo(chargeBoxId, connectorIds); this.chargePointList.add(cp); } @@ -52,7 +52,7 @@ class ChargePointInfo { @ApiModelProperty(value = "List of the charge box connectors") private List connectorIds; - public ChargePointInfo (String chargeBoxId, List connectorIds) { + ChargePointInfo(String chargeBoxId, List connectorIds) { this.chargeBoxId = chargeBoxId; this.connectorIds = connectorIds; } diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java index 33739fe5d..0bdafdb96 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java @@ -42,7 +42,7 @@ public class ApiChargePointStart { @ApiModelProperty(value = "OCPP Tag") private String ocppTag; - public ApiChargePointStart (String chargeBoxId, Integer connectorId, String ocppTag) { + public ApiChargePointStart(String chargeBoxId, Integer connectorId, String ocppTag) { this.chargeBoxId = chargeBoxId; this.connectorId = connectorId; this.ocppTag = ocppTag; diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java index ed98cf4c7..824502e69 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java @@ -40,14 +40,14 @@ public class ApiConnectorList { @ApiModelProperty(value = "List of charge boxes") - List chargeBoxList = new ArrayList<>(); + private List chargeBoxList = new ArrayList<>(); @ApiModelProperty(value = "List of possible states") - final Set statusFilterValues = ConnectorStatusCountFilter.ALL_STATUS_VALUES; + private final Set statusFilterValues = ConnectorStatusCountFilter.ALL_STATUS_VALUES; @ApiModelProperty(value = "List of connectors is filtered") - Boolean isFiltered = false; + private Boolean isFiltered = false; @ApiModelProperty(value = "List of connectors") - List connectors = new ArrayList<>(); + private List connectors = new ArrayList<>(); } diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java index a295e2447..abb2d82f4 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java @@ -39,30 +39,30 @@ @Setter public class ApiTaskInfo { @ApiModelProperty(value = "Task ID") - public Integer taskId; + private Integer taskId; @ApiModelProperty(value = "OCPP version") - public OcppVersion ocppVersion; + private OcppVersion ocppVersion; @ApiModelProperty(value = "OCPP operation") - public String operationName; + private String operationName; @ApiModelProperty(value = "external / internal") - public TaskOrigin origin; + private TaskOrigin origin; @ApiModelProperty(value = "Caller of the Task") - public String caller; + private String caller; @ApiModelProperty(value = "Results") - public Map resultMap; + private Map resultMap; @ApiModelProperty(value = "Count of Results") - public int resultSize; + private int resultSize; @ApiModelProperty(value = "Starttime") - public DateTime startTimestamp = DateTime.now(); + private DateTime startTimestamp = DateTime.now(); @ApiModelProperty(value = "Endtime") - public DateTime endTimestamp; + private DateTime endTimestamp; @ApiModelProperty(value = "Error count") - public AtomicInteger errorCount = new AtomicInteger(0); + private AtomicInteger errorCount = new AtomicInteger(0); @ApiModelProperty(value = "Response count") - public AtomicInteger responseCount = new AtomicInteger(0); + private AtomicInteger responseCount = new AtomicInteger(0); public ApiTaskInfo(Integer taskId, CommunicationTask r) { diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java index 9737b8fd8..6b4ef1b46 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java @@ -35,5 +35,5 @@ //@RequiredArgsConstructor public class ApiTaskList { @ApiModelProperty(value = "List of tasks") - List tasks; + private List tasks; } diff --git a/src/main/java/de/rwth/idsg/steve/web/controller/HomeController.java b/src/main/java/de/rwth/idsg/steve/web/controller/HomeController.java index 641cb09bf..34100bee9 100644 --- a/src/main/java/de/rwth/idsg/steve/web/controller/HomeController.java +++ b/src/main/java/de/rwth/idsg/steve/web/controller/HomeController.java @@ -79,7 +79,7 @@ public String getConnectorStatusQuery(@ModelAttribute(PARAMS) ConnectorStatusFor List latestList = chargePointHelperService.getChargePointConnectorStatus(params); List filteredList; - if (params.getStrategy()== ConnectorStatusForm.Strategy.PreferZero){ + if (params.getStrategy() == ConnectorStatusForm.Strategy.PreferZero) { filteredList = ConnectorStatusFilter.filterAndPreferZero(latestList); } else { filteredList = ConnectorStatusFilter.filterAndPreferOthersWithStatusOfZero(latestList); diff --git a/src/main/java/de/rwth/idsg/steve/web/dto/OcppJsonStatus.java b/src/main/java/de/rwth/idsg/steve/web/dto/OcppJsonStatus.java index f5e0ded84..9c2ae1467 100644 --- a/src/main/java/de/rwth/idsg/steve/web/dto/OcppJsonStatus.java +++ b/src/main/java/de/rwth/idsg/steve/web/dto/OcppJsonStatus.java @@ -45,6 +45,6 @@ public final class OcppJsonStatus { private final String connectionDuration; @ApiModelProperty(value = "Ocpp version") private final OcppVersion version; - @ApiModelProperty(value = "Connected since as DT", hidden= true) + @ApiModelProperty(value = "Connected since as DT", hidden = true) private final DateTime connectedSinceDT; } From 86cef45a76feaa6bbd74932922ad27766b884073 Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Wed, 6 Dec 2023 12:15:10 +0100 Subject: [PATCH 30/48] typo and trailing spaces --- .../de/rwth/idsg/steve/repository/dto/ConnectorStatus.java | 2 +- .../de/rwth/idsg/steve/web/api/ConnectorRestController.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/repository/dto/ConnectorStatus.java b/src/main/java/de/rwth/idsg/steve/repository/dto/ConnectorStatus.java index 5f234d7e6..ea82f9932 100644 --- a/src/main/java/de/rwth/idsg/steve/repository/dto/ConnectorStatus.java +++ b/src/main/java/de/rwth/idsg/steve/repository/dto/ConnectorStatus.java @@ -59,7 +59,7 @@ public final class ConnectorStatus { // This is true, if the chargeBox this connector belongs to is a WS/JSON station // and it is disconnected at the moment of building this DTO. - @ApiModelProperty(value = "jason and Disconnected") + @ApiModelProperty(value = "Json and Disconnected") @Setter @Builder.Default private boolean jsonAndDisconnected = false; diff --git a/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java index 9602fccfc..4b1a3c077 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java @@ -64,7 +64,7 @@ public class ConnectorRestController { @ApiResponse(code = 200, message = "OK"), @ApiResponse(code = 400, message = "Bad Request", response = ApiControllerAdvice.ApiErrorResponse.class), @ApiResponse(code = 401, message = "Unauthorized", response = ApiControllerAdvice.ApiErrorResponse.class), - @ApiResponse(code = 500, message = "Internal Server Error", + @ApiResponse(code = 500, message = "Internal Server Error", response = ApiControllerAdvice.ApiErrorResponse.class)} ) @GetMapping(value = "") @@ -89,7 +89,7 @@ public ApiConnectorList getConnectors(@Valid ConnectorStatusForm queryParams) { @ApiResponse(code = 200, message = "OK"), @ApiResponse(code = 400, message = "Bad Request", response = ApiControllerAdvice.ApiErrorResponse.class), @ApiResponse(code = 401, message = "Unauthorized", response = ApiControllerAdvice.ApiErrorResponse.class), - @ApiResponse(code = 500, message = "Internal Server Error", + @ApiResponse(code = 500, message = "Internal Server Error", response = ApiControllerAdvice.ApiErrorResponse.class)} ) @GetMapping(value = "OCPP_JSON_STATUS") From b3581661f59fcbd5abbfdb7bce98f7d66f9d6c0b Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Tue, 16 Jan 2024 09:48:29 +0100 Subject: [PATCH 31/48] TaskRestController: changed address to /api/v1/tasks; --- .../de/rwth/idsg/steve/web/api/TaskRestController.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java index 25749055d..3472ec078 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java @@ -44,7 +44,7 @@ */ @Slf4j @RestController -@RequestMapping(value = "/api/v1/remote", produces = MediaType.APPLICATION_JSON_VALUE) +@RequestMapping(value = "/api/v1/tasks", produces = MediaType.APPLICATION_JSON_VALUE) @RequiredArgsConstructor public class TaskRestController { @@ -55,9 +55,9 @@ public class TaskRestController { // ------------------------------------------------------------------------- private ApiTaskList getTaskList() { - ApiTaskList lsTasks = new ApiTaskList(); - lsTasks.setTasks(taskStore.getOverview()); - return lsTasks; + ApiTaskList taskList = new ApiTaskList(); + taskList.setTasks(taskStore.getOverview()); + return taskList; } // ------------------------------------------------------------------------- From cb7576d5d4ad311234952fba19526c37c8275745 Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Tue, 16 Jan 2024 10:18:04 +0100 Subject: [PATCH 32/48] Update license headers --- .../de/rwth/idsg/steve/web/api/ConnectorRestController.java | 2 +- .../rwth/idsg/steve/web/api/RemoteStartStopRestController.java | 2 +- .../java/de/rwth/idsg/steve/web/api/TaskRestController.java | 2 +- .../java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java | 2 +- .../de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java | 2 +- .../java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java | 2 +- src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java | 2 +- src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java index 4b1a3c077..3ae6c9ae8 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java @@ -1,6 +1,6 @@ /* * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve - * Copyright (C) 2013-2023 SteVe Community Team + * Copyright (C) 2013-2024 SteVe Community Team * All Rights Reserved. * * This program is free software: you can redistribute it and/or modify diff --git a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java index bfeab7c4f..abfaad037 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java @@ -1,6 +1,6 @@ /* * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve - * Copyright (C) 2013-2023 SteVe Community Team + * Copyright (C) 2013-2024 SteVe Community Team * All Rights Reserved. * * This program is free software: you can redistribute it and/or modify diff --git a/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java index 3472ec078..a565b1e72 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java @@ -1,6 +1,6 @@ /* * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve - * Copyright (C) 2013-2023 SteVe Community Team + * Copyright (C) 2013-2024 SteVe Community Team * All Rights Reserved. * * This program is free software: you can redistribute it and/or modify diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java index db7ecc08a..36d81fa54 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java @@ -1,6 +1,6 @@ /* * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve - * Copyright (C) 2013-2023 SteVe Community Team + * Copyright (C) 2013-2024 SteVe Community Team * All Rights Reserved. * * This program is free software: you can redistribute it and/or modify diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java index 0bdafdb96..0aa6d23f8 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java @@ -1,6 +1,6 @@ /* * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve - * Copyright (C) 2013-2023 SteVe Community Team + * Copyright (C) 2013-2024 SteVe Community Team * All Rights Reserved. * * This program is free software: you can redistribute it and/or modify diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java index 824502e69..e8a4650d4 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java @@ -1,6 +1,6 @@ /* * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve - * Copyright (C) 2013-2023 SteVe Community Team + * Copyright (C) 2013-2024 SteVe Community Team * All Rights Reserved. * * This program is free software: you can redistribute it and/or modify diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java index abb2d82f4..385b86d74 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java @@ -1,6 +1,6 @@ /* * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve - * Copyright (C) 2013-2023 SteVe Community Team + * Copyright (C) 2013-2024 SteVe Community Team * All Rights Reserved. * * This program is free software: you can redistribute it and/or modify diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java index 6b4ef1b46..6e1f98932 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java @@ -1,6 +1,6 @@ /* * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve - * Copyright (C) 2013-2023 SteVe Community Team + * Copyright (C) 2013-2024 SteVe Community Team * All Rights Reserved. * * This program is free software: you can redistribute it and/or modify From f087287271de21b2314d3dc7ba85d4365224603e Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Tue, 23 Jan 2024 13:41:06 +0100 Subject: [PATCH 33/48] getActiveTransactionId(String chargeBox, Integer connectorId) method, add .orderBy(TRANSACTION.TRANSACTION_PK.desc()) to avoid fetching ghost transactions, fetch the latest --- .../impl/TransactionRepositoryImpl.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java b/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java index 423b2f130..339421071 100644 --- a/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java +++ b/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java @@ -65,6 +65,16 @@ public TransactionRepositoryImpl(DSLContext ctx) { this.ctx = ctx; } + @Override + public Transaction getTransaction(int transactionPk) { + TransactionQueryForm form = new TransactionQueryForm(); + form.setTransactionPk(transactionPk); + form.setReturnCSV(false); + form.setType(TransactionQueryForm.QueryType.ALL); + return getInternal(form).fetch() + .map(new TransactionMapper()).get(0); + } + @Override public List getTransactions(TransactionQueryForm form) { return getInternal(form).fetch() @@ -97,19 +107,10 @@ public Integer getActiveTransactionId(String chargeBoxId, Integer connectorId) { .and(CONNECTOR.CHARGE_BOX_ID.equal(chargeBoxId)) .where(TRANSACTION.STOP_TIMESTAMP.isNull()) .and(CONNECTOR.CONNECTOR_ID.equal(connectorId)) + .orderBy(TRANSACTION.TRANSACTION_PK.desc()) // to avoid fetching ghost transactions, fetch the latest .fetchAny(TRANSACTION.TRANSACTION_PK); } - @Override - public String getOcppTagOfTransaction(Integer transactionPk) { - return ctx.select(TRANSACTION.ID_TAG) - .from(TRANSACTION) - .where(TRANSACTION.TRANSACTION_PK.eq(transactionPk)) - .fetchAny(TRANSACTION.ID_TAG); - /* .fetch().sortDesc(TRANSACTION.START_TIMESTAMP).getValue(0, TRANSACTION.ID_TAG); - if TRANSACTION has sometimes errors an more then one open/active transaction per connector */ - } - @Override public TransactionDetails getDetails(int transactionPk, boolean firstArrivingMeterValueIfMultiple) { From 85ccc66f3ba13d61554663b8153a8f11b757f59a Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Tue, 23 Jan 2024 13:47:09 +0100 Subject: [PATCH 34/48] TransactionRepository: add method getTransaction(int transactionPk); remove method getOcppTagOfActiveTransaction (Integer connectorPk) --- .../de/rwth/idsg/steve/repository/TransactionRepository.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/rwth/idsg/steve/repository/TransactionRepository.java b/src/main/java/de/rwth/idsg/steve/repository/TransactionRepository.java index 345059c44..835ce8665 100644 --- a/src/main/java/de/rwth/idsg/steve/repository/TransactionRepository.java +++ b/src/main/java/de/rwth/idsg/steve/repository/TransactionRepository.java @@ -30,13 +30,14 @@ * @since 19.08.2014 */ public interface TransactionRepository { + Transaction getTransaction(int transactionPk); + List getTransactions(TransactionQueryForm form); void writeTransactionsCSV(TransactionQueryForm form, Writer writer); List getActiveTransactionIds(String chargeBoxId); Integer getActiveTransactionId(String chargeBoxId, Integer connectorId); - String getOcppTagOfTransaction(Integer transactionPk); TransactionDetails getDetails(int transactionPk, boolean firstArrivingMeterValueIfMultiple); From b46859a17936304658aa923ee5f8afc31c4d1bed Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Tue, 23 Jan 2024 13:50:15 +0100 Subject: [PATCH 35/48] RemoteStartStopRestController adapt to methode changes at TransactionRepository --- .../idsg/steve/web/api/RemoteStartStopRestController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java index abfaad037..60e901ddd 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java @@ -325,9 +325,9 @@ public Integer postRemoteStopTx(@Valid ApiChargePointStart params) { } // check the user is allowed to stop this transaction (actual only the one who started it!) - String ocppTag = transactionRepository.getOcppTagOfTransaction(transactionId); + String ocppTag = transactionRepository.getTransaction(transactionId).getOcppIdTag(); if (!params.getOcppTag().contentEquals(ocppTag)) { - throw new BadRequestException("The transaction wass authorised with another OCPP Tag!"); + throw new BadRequestException("The transaction was authorised with another OCPP Tag!"); } transactionParams.setTransactionId(transactionId); From a790ef682bbd7e11effbcbea53a8a61ddf7eac87 Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Tue, 23 Jan 2024 13:53:18 +0100 Subject: [PATCH 36/48] RemoteStartStopRestController: changed style of switch case --- .../api/RemoteStartStopRestController.java | 71 ++++++------------- 1 file changed, 21 insertions(+), 50 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java index 60e901ddd..830706d4c 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java @@ -66,6 +66,7 @@ * @author fnkbsi * @since 18.10.2023 */ + @Slf4j @RestController @RequestMapping(value = "/api/v1/remote", produces = MediaType.APPLICATION_JSON_VALUE) @@ -102,67 +103,37 @@ private String getOcppProtocol(String chargeBoxId) { private Integer remoteStart(String chargeBoxId, RemoteStartTransactionParams transactionParams) { String ocppProtocol = getOcppProtocol(chargeBoxId); Integer taskId; - switch (ocppProtocol) { - case "OCPP1.6J": - case "OCPP1.6S": - taskId = client16.remoteStartTransaction(transactionParams, "SteveWebApi"); - break; - case "OCPP1.5J": - case "OCPP1.5S": - case "OCPP1.5": - taskId = client15.remoteStartTransaction(transactionParams, "SteveWebApi"); - break; - case "OCPP1.2": - taskId = client12.remoteStartTransaction(transactionParams, "SteveWebApi"); - break; - default: - taskId = client12.remoteStartTransaction(transactionParams, "SteveWebApi"); - } + taskId = switch (ocppProtocol) { + case "OCPP1.6J", "OCPP1.6S" -> client16.remoteStartTransaction(transactionParams, "SteveWebApi"); + case "OCPP1.5J", "OCPP1.5S", "OCPP1.5" -> client15.remoteStartTransaction(transactionParams, "SteveWebApi"); + case "OCPP1.2" -> client12.remoteStartTransaction(transactionParams, "SteveWebApi"); + default -> client12.remoteStartTransaction(transactionParams, "SteveWebApi"); + }; return taskId; } private Integer remoteStop(String chargeBoxId, RemoteStopTransactionParams transactionParams) { String ocppProtocol = getOcppProtocol(chargeBoxId); Integer taskId; - switch (ocppProtocol) { - case "OCPP1.6J": - case "OCPP1.6S": - taskId = client16.remoteStopTransaction(transactionParams, "SteveWebApi"); - break; - case "OCPP1.5J": - case "OCPP1.5S": - case "OCPP1.5": - taskId = client15.remoteStopTransaction(transactionParams, "SteveWebApi"); - break; - case "OCPP1.2": - taskId = client12.remoteStopTransaction(transactionParams, "SteveWebApi"); - break; - default: - taskId = client12.remoteStopTransaction(transactionParams, "SteveWebApi"); - } - return taskId; + taskId = switch (ocppProtocol) { + case "OCPP1.6J", "OCPP1.6S" -> client16.remoteStopTransaction(transactionParams, "SteveWebApi"); + case "OCPP1.5J", "OCPP1.5S", "OCPP1.5" -> client15.remoteStopTransaction(transactionParams, "SteveWebApi"); + case "OCPP1.2" -> client12.remoteStopTransaction(transactionParams, "SteveWebApi"); + default -> client12.remoteStopTransaction(transactionParams, "SteveWebApi"); + }; + return taskId; } private Integer remoteUnlock(String chargeBoxId, UnlockConnectorParams transactionParams) { String ocppProtocol = getOcppProtocol(chargeBoxId); Integer taskId; - switch (ocppProtocol) { - case "OCPP1.6J": - case "OCPP1.6S": - taskId = client16.unlockConnector(transactionParams, "SteveWebApi"); - break; - case "OCPP1.5J": - case "OCPP1.5S": - case "OCPP1.5": - taskId = client15.unlockConnector(transactionParams, "SteveWebApi"); - break; - case "OCPP1.2": - taskId = client12.unlockConnector(transactionParams, "SteveWebApi"); - break; - default: - taskId = client12.unlockConnector(transactionParams, "SteveWebApi"); - } - return taskId; + taskId = switch (ocppProtocol) { + case "OCPP1.6J", "OCPP1.6S" -> client16.unlockConnector(transactionParams, "SteveWebApi"); + case "OCPP1.5J", "OCPP1.5S", "OCPP1.5" -> client15.unlockConnector(transactionParams, "SteveWebApi"); + case "OCPP1.2" -> client12.unlockConnector(transactionParams, "SteveWebApi"); + default -> client12.unlockConnector(transactionParams, "SteveWebApi"); + }; + return taskId; } private ApiChargePointList getChargePoints() { From b3da4c3c9d80ed09e87a1e4a44739eb21e4a8846 Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Tue, 23 Jan 2024 16:48:24 +0100 Subject: [PATCH 37/48] TransactionRepository: methode getTransaction(int transactionPk) using fetchAny --- .../idsg/steve/repository/impl/TransactionRepositoryImpl.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java b/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java index 339421071..030f5b19d 100644 --- a/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java +++ b/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java @@ -71,8 +71,7 @@ public Transaction getTransaction(int transactionPk) { form.setTransactionPk(transactionPk); form.setReturnCSV(false); form.setType(TransactionQueryForm.QueryType.ALL); - return getInternal(form).fetch() - .map(new TransactionMapper()).get(0); + return getInternal(form).fetchAny(new TransactionMapper()); } @Override From 83efc74764160b70d59671de8092d37119d39bf9 Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Tue, 6 Feb 2024 14:22:47 +0100 Subject: [PATCH 38/48] smaller style improvements --- .../steve/repository/impl/ChargePointRepositoryImpl.java | 3 --- .../de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java | 5 +---- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/repository/impl/ChargePointRepositoryImpl.java b/src/main/java/de/rwth/idsg/steve/repository/impl/ChargePointRepositoryImpl.java index a4037120e..f213671b3 100644 --- a/src/main/java/de/rwth/idsg/steve/repository/impl/ChargePointRepositoryImpl.java +++ b/src/main/java/de/rwth/idsg/steve/repository/impl/ChargePointRepositoryImpl.java @@ -108,9 +108,6 @@ public List getChargePointSelect(String chageBoxID) { return ctx.select(CHARGE_BOX.CHARGE_BOX_ID, CHARGE_BOX.ENDPOINT_ADDRESS, CHARGE_BOX.OCPP_PROTOCOL) .from(CHARGE_BOX) .where(CHARGE_BOX.CHARGE_BOX_ID.eq(chageBoxID)) - //.and(CHARGE_BOX.OCPP_PROTOCOL.equal(protocol.getCompositeValue())) - //.and(CHARGE_BOX.ENDPOINT_ADDRESS.isNotNull()) - //.and(CHARGE_BOX.REGISTRATION_STATUS.eq(RegistrationStatus.ACCEPTED.value())) .fetch() .map(r -> new ChargePointSelect(OcppProtocol.fromCompositeValue(r.value3()).getTransport(), r.value1(), r.value2())); diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java index 36d81fa54..578290f50 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java @@ -18,10 +18,8 @@ */ package de.rwth.idsg.steve.web.api.dto; -//import de.rwth.idsg.steve.ocpp.OcppTransport; import io.swagger.annotations.ApiModelProperty; import java.util.ArrayList; -//import java.util.Collections; import java.util.List; import lombok.Getter; import lombok.RequiredArgsConstructor; @@ -52,10 +50,9 @@ class ChargePointInfo { @ApiModelProperty(value = "List of the charge box connectors") private List connectorIds; - ChargePointInfo(String chargeBoxId, List connectorIds) { + public ChargePointInfo(String chargeBoxId, List connectorIds) { this.chargeBoxId = chargeBoxId; this.connectorIds = connectorIds; } } - } From a2dbd956246a5235203e78a6ad29fac53247e3e0 Mon Sep 17 00:00:00 2001 From: fnkbsi Date: Tue, 6 Feb 2024 15:10:33 +0100 Subject: [PATCH 39/48] RemoteStartStopController: removed trailing spaces --- .../idsg/steve/web/api/RemoteStartStopRestController.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java index 830706d4c..10f727d9a 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java @@ -244,7 +244,7 @@ public Integer postRemoteStartTx(@Valid ApiChargePointStart params) { } // Check for acctive transactions on the connector, If a active transaction is found, don't send RemoteStart. - Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(), + Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(), params.getConnectorId()); if (!isNull(transactionId)) { String errMsg = String.format("Active transaction found for connector %s at ChargeBox %s!", @@ -283,9 +283,9 @@ public Integer postRemoteStopTx(@Valid ApiChargePointStart params) { // set the ChargPointSelectionList, maybe check nessesary that length is one transactionParams.setChargePointSelectList(chargePointRepository.getChargePointSelect(params.getChargeBoxId())); - // Get the transactionId of the active transaction on the connector. + // Get the transactionId of the active transaction on the connector. // If no transaction active don't send RemoteStop - Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(), + Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(), params.getConnectorId()); if (isNull(transactionId)) { String errMsg = String.format("No active transaction found for connector %s at ChargeBox %s!", @@ -326,7 +326,7 @@ public Integer postUnlockCon(@Valid ApiChargePointStart params) { transactionParams.setChargePointSelectList(chargePointRepository.getChargePointSelect(params.getChargeBoxId())); /* If a active transaction is found, don't unlock the connection. */ - Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(), + Integer transactionId = transactionRepository.getActiveTransactionId(params.getChargeBoxId(), params.getConnectorId()); if (!isNull(transactionId)) { String errMsg = String.format("Active transaction found for connector %s at ChargeBox %s!", From c7e795dd4bfa88c5d4f02355d740f806ede91926 Mon Sep 17 00:00:00 2001 From: fnkbsi <135032168+fnkbsi@users.noreply.github.com> Date: Wed, 3 Apr 2024 12:55:37 +0200 Subject: [PATCH 40/48] Resolve Conflicts: Caused by removing the flag firstArrivingMeterValueIfMultiple at master --- .../repository/TransactionRepository.java | 6 +---- .../impl/TransactionRepositoryImpl.java | 26 ++----------------- .../steve/service/TransactionStopService.java | 2 +- 3 files changed, 4 insertions(+), 30 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/repository/TransactionRepository.java b/src/main/java/de/rwth/idsg/steve/repository/TransactionRepository.java index 835ce8665..d1ff91792 100644 --- a/src/main/java/de/rwth/idsg/steve/repository/TransactionRepository.java +++ b/src/main/java/de/rwth/idsg/steve/repository/TransactionRepository.java @@ -39,9 +39,5 @@ public interface TransactionRepository { List getActiveTransactionIds(String chargeBoxId); Integer getActiveTransactionId(String chargeBoxId, Integer connectorId); - TransactionDetails getDetails(int transactionPk, boolean firstArrivingMeterValueIfMultiple); - - default TransactionDetails getDetails(int transactionPk) { - return getDetails(transactionPk, true); - } + TransactionDetails getDetails(int transactionPk); } diff --git a/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java b/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java index 030f5b19d..6ae7188aa 100644 --- a/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java +++ b/src/main/java/de/rwth/idsg/steve/repository/impl/TransactionRepositoryImpl.java @@ -36,7 +36,6 @@ import org.jooq.RecordMapper; import org.jooq.SelectQuery; import org.jooq.Table; -import org.jooq.impl.DSL; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; @@ -111,7 +110,7 @@ public Integer getActiveTransactionId(String chargeBoxId, Integer connectorId) { } @Override - public TransactionDetails getDetails(int transactionPk, boolean firstArrivingMeterValueIfMultiple) { + public TransactionDetails getDetails(int transactionPk) { // ------------------------------------------------------------------------- // Step 1: Collect general data about transaction @@ -198,20 +197,7 @@ public TransactionDetails getDetails(int transactionPk, boolean firstArrivingMet // Table t1 = transactionQuery.union(timestampQuery).asTable("t1"); - // ------------------------------------------------------------------------- - // Step 3: Charging station might send meter vales at fixed intervals (e.g. - // every 15 min) regardless of the fact that connector's meter value did not - // change (e.g. vehicle is fully charged, but cable is still connected). This - // yields multiple entries in db with the same value but different timestamp. - // We are only interested in the first (or last) arriving entry. - // ------------------------------------------------------------------------- - - Field dateTimeField; - if (firstArrivingMeterValueIfMultiple) { - dateTimeField = DSL.min(t1.field(2, DateTime.class)).as("min"); - } else { - dateTimeField = DSL.max(t1.field(2, DateTime.class)).as("max"); - } + Field dateTimeField = t1.field(2, DateTime.class); List values = ctx.select( @@ -224,14 +210,6 @@ public TransactionDetails getDetails(int transactionPk, boolean firstArrivingMet t1.field(8, String.class), t1.field(9, String.class)) .from(t1) - .groupBy( - t1.field(3), - t1.field(4), - t1.field(5), - t1.field(6), - t1.field(7), - t1.field(8), - t1.field(9)) .orderBy(dateTimeField) .fetch() .map(r -> TransactionDetails.MeterValues.builder() diff --git a/src/main/java/de/rwth/idsg/steve/service/TransactionStopService.java b/src/main/java/de/rwth/idsg/steve/service/TransactionStopService.java index c87e32529..b6fc11e93 100644 --- a/src/main/java/de/rwth/idsg/steve/service/TransactionStopService.java +++ b/src/main/java/de/rwth/idsg/steve/service/TransactionStopService.java @@ -57,7 +57,7 @@ public void stop(List transactionPkList) { } public void stop(Integer transactionPk) { - TransactionDetails thisTxDetails = transactionRepository.getDetails(transactionPk, false); + TransactionDetails thisTxDetails = transactionRepository.getDetails(transactionPk); Transaction thisTx = thisTxDetails.getTransaction(); // early exit, if transaction is already stopped From 4d4cdbbf9ff5e056c2173b295e18338dc17be760 Mon Sep 17 00:00:00 2001 From: fnkbsi <135032168+fnkbsi@users.noreply.github.com> Date: Mon, 7 Oct 2024 19:26:33 +0200 Subject: [PATCH 41/48] switch from swagger to oas --- .../steve/repository/dto/ConnectorStatus.java | 20 +++--- .../steve/repository/dto/TaskOverview.java | 14 ++-- .../web/api/ConnectorRestController.java | 38 +++++++---- .../api/RemoteStartStopRestController.java | 64 ++++++++++--------- .../steve/web/api/TaskRestController.java | 32 +++++----- .../steve/web/api/dto/ApiChargePointList.java | 8 +-- .../web/api/dto/ApiChargePointStart.java | 8 +-- .../steve/web/api/dto/ApiConnectorList.java | 10 +-- .../idsg/steve/web/api/dto/ApiTaskInfo.java | 24 +++---- .../idsg/steve/web/api/dto/ApiTaskList.java | 4 +- .../steve/web/dto/ConnectorStatusForm.java | 8 +-- .../idsg/steve/web/dto/OcppJsonStatus.java | 14 ++-- .../ocpp/ConfigurationKeyReadWriteEnum.java | 62 +++++++++--------- 13 files changed, 161 insertions(+), 145 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/repository/dto/ConnectorStatus.java b/src/main/java/de/rwth/idsg/steve/repository/dto/ConnectorStatus.java index 8ea8e1856..361944c1c 100644 --- a/src/main/java/de/rwth/idsg/steve/repository/dto/ConnectorStatus.java +++ b/src/main/java/de/rwth/idsg/steve/repository/dto/ConnectorStatus.java @@ -20,7 +20,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import de.rwth.idsg.steve.ocpp.OcppProtocol; -import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import lombok.Getter; import lombok.Setter; @@ -35,31 +35,31 @@ @Builder public final class ConnectorStatus { @JsonIgnore - @ApiModelProperty(value = "Charge Box DB key", hidden = true) + @Schema(description = "Charge Box DB key", hidden = true) private final int chargeBoxPk; - @ApiModelProperty(value = "Charge Box ID") + @Schema(description = "Charge Box ID") private final String chargeBoxId; - @ApiModelProperty(value = "Connector ID") + @Schema(description = "Connector ID") private final int connectorId; - @ApiModelProperty(value = "Status") + @Schema(description = "Status") private final String status; - @ApiModelProperty(value = "Error code") + @Schema(description = "Error code") private final String errorCode; - @ApiModelProperty(value = "Timestamp") + @Schema(description = "Timestamp") private final String timeStamp; // For additional internal processing. Not related to the humanized // String version above, which is for representation on frontend - @ApiModelProperty(value = "Timestamp of the status") + @Schema(description = "Timestamp of the status") private final DateTime statusTimestamp; - @ApiModelProperty(value = "OCPP version") + @Schema(description = "OCPP version") private final OcppProtocol ocppProtocol; // This is true, if the chargeBox this connector belongs to is a WS/JSON station // and it is disconnected at the moment of building this DTO. - @ApiModelProperty(value = "Json and Disconnected") + @Schema(description = "Json and Disconnected") @Setter @Builder.Default private boolean jsonAndDisconnected = false; diff --git a/src/main/java/de/rwth/idsg/steve/repository/dto/TaskOverview.java b/src/main/java/de/rwth/idsg/steve/repository/dto/TaskOverview.java index 6aecc9b7a..e55add82b 100644 --- a/src/main/java/de/rwth/idsg/steve/repository/dto/TaskOverview.java +++ b/src/main/java/de/rwth/idsg/steve/repository/dto/TaskOverview.java @@ -19,7 +19,7 @@ package de.rwth.idsg.steve.repository.dto; import de.rwth.idsg.steve.ocpp.TaskOrigin; -import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -33,17 +33,17 @@ @EqualsAndHashCode @Builder public final class TaskOverview implements Comparable { - @ApiModelProperty(value = "Task ID") + @Schema(description = "Task ID") private final int taskId; - @ApiModelProperty(value = "Response count") + @Schema(description = "Response count") private final int responseCount; - @ApiModelProperty(value = "Request count") + @Schema(description = "Request count") private final int requestCount; - @ApiModelProperty(value = "Starttime") + @Schema(description = "Starttime") private final DateTime start; - @ApiModelProperty(value = "Endtime") + @Schema(description = "Endtime") private final DateTime end; - @ApiModelProperty(value = "Task triggered internal or external") + @Schema(description = "Task triggered internal or external") private final TaskOrigin origin; /** diff --git a/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java index 3ae6c9ae8..4c9dc21a4 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java @@ -25,22 +25,36 @@ import de.rwth.idsg.steve.web.api.dto.ApiConnectorList; import de.rwth.idsg.steve.web.dto.ConnectorStatusForm; import de.rwth.idsg.steve.web.dto.OcppJsonStatus; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import java.util.List; import static java.util.Objects.isNull; -import javax.validation.Valid; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; + import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; + +import de.rwth.idsg.steve.web.api.ApiControllerAdvice.ApiErrorResponse; + + +//import org.springframework.web.bind.annotation.DeleteMapping; + +//import org.springframework.web.bind.annotation.PathVariable; +//import org.springframework.web.bind.annotation.PostMapping; +//import org.springframework.web.bind.annotation.PutMapping; + + /** * * @author fnkbsi @@ -61,11 +75,10 @@ public class ConnectorRestController { // ------------------------------------------------------------------------- @ApiResponses(value = { - @ApiResponse(code = 200, message = "OK"), - @ApiResponse(code = 400, message = "Bad Request", response = ApiControllerAdvice.ApiErrorResponse.class), - @ApiResponse(code = 401, message = "Unauthorized", response = ApiControllerAdvice.ApiErrorResponse.class), - @ApiResponse(code = 500, message = "Internal Server Error", - response = ApiControllerAdvice.ApiErrorResponse.class)} + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} ) @GetMapping(value = "") @ResponseBody @@ -86,11 +99,10 @@ public ApiConnectorList getConnectors(@Valid ConnectorStatusForm queryParams) { } @ApiResponses(value = { - @ApiResponse(code = 200, message = "OK"), - @ApiResponse(code = 400, message = "Bad Request", response = ApiControllerAdvice.ApiErrorResponse.class), - @ApiResponse(code = 401, message = "Unauthorized", response = ApiControllerAdvice.ApiErrorResponse.class), - @ApiResponse(code = 500, message = "Internal Server Error", - response = ApiControllerAdvice.ApiErrorResponse.class)} + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} ) @GetMapping(value = "OCPP_JSON_STATUS") @ResponseBody diff --git a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java index 10f727d9a..5c3520a42 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java @@ -44,8 +44,10 @@ import de.rwth.idsg.steve.web.api.dto.ApiChargePointStart; import de.rwth.idsg.steve.web.api.exception.BadRequestException; import de.rwth.idsg.steve.web.dto.ChargePointQueryForm; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; @@ -55,7 +57,7 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; -import javax.validation.Valid; +import jakarta.validation.Valid; import java.util.List; import static java.util.Objects.isNull; @@ -174,10 +176,10 @@ private Boolean activeTaskOnChargeBox(String chargeBoxId) { // ------------------------------------------------------------------------- @ApiResponses(value = { - @ApiResponse(code = 200, message = "OK"), - @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), - @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), - @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} ) @GetMapping(value = "") @ResponseBody @@ -186,10 +188,10 @@ public ApiChargePointList getBase() { } @ApiResponses(value = { - @ApiResponse(code = 200, message = "OK"), - @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), - @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), - @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} ) @GetMapping(value = "start") @ResponseBody @@ -198,10 +200,10 @@ public ApiChargePointList getRemoteStartTx() { } @ApiResponses(value = { - @ApiResponse(code = 200, message = "OK"), - @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), - @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), - @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} ) @GetMapping(value = "stop") @ResponseBody @@ -210,10 +212,10 @@ public ApiChargePointList getRemoteStopTx() { } @ApiResponses(value = { - @ApiResponse(code = 200, message = "OK"), - @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), - @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), - @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} ) @GetMapping(value = "unlock") @ResponseBody @@ -227,10 +229,10 @@ public ApiChargePointList getUnlockCon() { // ------------------------------------------------------------------------- @ApiResponses(value = { - @ApiResponse(code = 200, message = "OK"), - @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), - @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), - @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} ) @PostMapping(value = "start") @ResponseBody @@ -263,10 +265,10 @@ public Integer postRemoteStartTx(@Valid ApiChargePointStart params) { } @ApiResponses(value = { - @ApiResponse(code = 200, message = "OK"), - @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), - @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), - @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} ) @PostMapping(value = "stop") @ResponseBody @@ -306,10 +308,10 @@ public Integer postRemoteStopTx(@Valid ApiChargePointStart params) { } @ApiResponses(value = { - @ApiResponse(code = 200, message = "OK"), - @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), - @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), - @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} ) @PostMapping(value = "unlock") @ResponseBody diff --git a/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java index a565b1e72..dfbf022af 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java @@ -25,8 +25,10 @@ import de.rwth.idsg.steve.web.api.ApiControllerAdvice.ApiErrorResponse; import de.rwth.idsg.steve.web.api.dto.ApiTaskInfo; import de.rwth.idsg.steve.web.api.dto.ApiTaskList; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; @@ -36,7 +38,7 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; -import javax.validation.Valid; +import jakarta.validation.Valid; /** * @author fnkbsi @@ -65,10 +67,10 @@ private ApiTaskList getTaskList() { // ------------------------------------------------------------------------- @ApiResponses(value = { - @ApiResponse(code = 200, message = "OK"), - @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), - @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), - @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} ) @GetMapping(value = "taskoverview") @ResponseBody @@ -78,10 +80,10 @@ public ApiTaskList getOverview() { @ApiResponses(value = { - @ApiResponse(code = 200, message = "OK"), - @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), - @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), - @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} ) @PostMapping(value = "clearfinishedtasks") @ResponseBody @@ -91,10 +93,10 @@ public ApiTaskList clearFinished() { } @ApiResponses(value = { - @ApiResponse(code = 200, message = "OK"), - @ApiResponse(code = 400, message = "Bad Request", response = ApiErrorResponse.class), - @ApiResponse(code = 401, message = "Unauthorized", response = ApiErrorResponse.class), - @ApiResponse(code = 500, message = "Internal Server Error", response = ApiErrorResponse.class)} + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} ) @GetMapping(value = "task") @ResponseBody diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java index 578290f50..acdd89d5a 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java @@ -18,7 +18,7 @@ */ package de.rwth.idsg.steve.web.api.dto; -import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; import java.util.ArrayList; import java.util.List; import lombok.Getter; @@ -34,7 +34,7 @@ @Setter @RequiredArgsConstructor public class ApiChargePointList { - @ApiModelProperty(value = "List of charge points") + @Schema(description = "List of charge points") private List chargePointList = new ArrayList<>(); public void addCP(String chargeBoxId, List connectorIds) { @@ -45,9 +45,9 @@ public void addCP(String chargeBoxId, List connectorIds) { @Getter @Setter class ChargePointInfo { - @ApiModelProperty(value = "Charge Box ID") + @Schema(description = "Charge Box ID") private String chargeBoxId; - @ApiModelProperty(value = "List of the charge box connectors") + @Schema(description = "List of the charge box connectors") private List connectorIds; public ChargePointInfo(String chargeBoxId, List connectorIds) { diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java index 0aa6d23f8..236ef76ea 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java @@ -19,7 +19,7 @@ package de.rwth.idsg.steve.web.api.dto; //import de.rwth.idsg.steve.ocpp.OcppTransport; -import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; //import java.util.Collections; //import java.util.List; import lombok.Getter; @@ -35,11 +35,11 @@ @Setter //@RequiredArgsConstructor public class ApiChargePointStart { - @ApiModelProperty(value = "Charge Box ID") + @Schema(description = "Charge Box ID") private String chargeBoxId; - @ApiModelProperty(value = "Connector ID") + @Schema(description = "Connector ID") private Integer connectorId; - @ApiModelProperty(value = "OCPP Tag") + @Schema(description = "OCPP Tag") private String ocppTag; public ApiChargePointStart(String chargeBoxId, Integer connectorId, String ocppTag) { diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java index e8a4650d4..aba979b8c 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java @@ -21,7 +21,7 @@ //import de.rwth.idsg.steve.ocpp.OcppTransport; import de.rwth.idsg.steve.repository.dto.ConnectorStatus; import de.rwth.idsg.steve.utils.ConnectorStatusCountFilter; -import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -39,15 +39,15 @@ @RequiredArgsConstructor public class ApiConnectorList { - @ApiModelProperty(value = "List of charge boxes") + @Schema(description = "List of charge boxes") private List chargeBoxList = new ArrayList<>(); - @ApiModelProperty(value = "List of possible states") + @Schema(description = "List of possible states") private final Set statusFilterValues = ConnectorStatusCountFilter.ALL_STATUS_VALUES; - @ApiModelProperty(value = "List of connectors is filtered") + @Schema(description = "List of connectors is filtered") private Boolean isFiltered = false; - @ApiModelProperty(value = "List of connectors") + @Schema(description = "List of connectors") private List connectors = new ArrayList<>(); } diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java index 385b86d74..7d26917e6 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java @@ -22,7 +22,7 @@ import de.rwth.idsg.steve.ocpp.OcppVersion; import de.rwth.idsg.steve.ocpp.RequestResult; import de.rwth.idsg.steve.ocpp.TaskOrigin; -import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; @@ -38,30 +38,30 @@ @Getter @Setter public class ApiTaskInfo { - @ApiModelProperty(value = "Task ID") + @Schema(description = "Task ID") private Integer taskId; - @ApiModelProperty(value = "OCPP version") + @Schema(description = "OCPP version") private OcppVersion ocppVersion; - @ApiModelProperty(value = "OCPP operation") + @Schema(description = "OCPP operation") private String operationName; - @ApiModelProperty(value = "external / internal") + @Schema(description = "external / internal") private TaskOrigin origin; - @ApiModelProperty(value = "Caller of the Task") + @Schema(description = "Caller of the Task") private String caller; - @ApiModelProperty(value = "Results") + @Schema(description = "Results") private Map resultMap; - @ApiModelProperty(value = "Count of Results") + @Schema(description = "Count of Results") private int resultSize; - @ApiModelProperty(value = "Starttime") + @Schema(description = "Starttime") private DateTime startTimestamp = DateTime.now(); - @ApiModelProperty(value = "Endtime") + @Schema(description = "Endtime") private DateTime endTimestamp; - @ApiModelProperty(value = "Error count") + @Schema(description = "Error count") private AtomicInteger errorCount = new AtomicInteger(0); - @ApiModelProperty(value = "Response count") + @Schema(description = "Response count") private AtomicInteger responseCount = new AtomicInteger(0); diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java index 6e1f98932..6ce96c8bc 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java @@ -19,7 +19,7 @@ package de.rwth.idsg.steve.web.api.dto; import de.rwth.idsg.steve.repository.dto.TaskOverview; -import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; import java.util.List; import lombok.Getter; @@ -34,6 +34,6 @@ @Setter //@RequiredArgsConstructor public class ApiTaskList { - @ApiModelProperty(value = "List of tasks") + @Schema(description = "List of tasks") private List tasks; } diff --git a/src/main/java/de/rwth/idsg/steve/web/dto/ConnectorStatusForm.java b/src/main/java/de/rwth/idsg/steve/web/dto/ConnectorStatusForm.java index 3e972ae54..b89bede17 100644 --- a/src/main/java/de/rwth/idsg/steve/web/dto/ConnectorStatusForm.java +++ b/src/main/java/de/rwth/idsg/steve/web/dto/ConnectorStatusForm.java @@ -18,7 +18,7 @@ */ package de.rwth.idsg.steve.web.dto; -import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; import lombok.ToString; @@ -31,11 +31,11 @@ @Setter @ToString public class ConnectorStatusForm { - @ApiModelProperty(value = "Charge Box Id") + @Schema(description = "Charge Box Id") private String chargeBoxId; - @ApiModelProperty(value = "Connector Status") + @Schema(description = "Connector Status") private String status; - @ApiModelProperty(value = "Strategy of listing the connector") + @Schema(description = "Strategy of listing the connector") private Strategy strategy = Strategy.PreferZero; public enum Strategy { diff --git a/src/main/java/de/rwth/idsg/steve/web/dto/OcppJsonStatus.java b/src/main/java/de/rwth/idsg/steve/web/dto/OcppJsonStatus.java index cfb868a0a..21722a0b2 100644 --- a/src/main/java/de/rwth/idsg/steve/web/dto/OcppJsonStatus.java +++ b/src/main/java/de/rwth/idsg/steve/web/dto/OcppJsonStatus.java @@ -20,7 +20,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import de.rwth.idsg.steve.ocpp.OcppVersion; -import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import lombok.Getter; import lombok.ToString; @@ -35,16 +35,16 @@ @ToString public final class OcppJsonStatus { @JsonIgnore - @ApiModelProperty(value = "Charge Box Pk", hidden = true) + @Schema(description = "Charge Box Pk", hidden = true) private final int chargeBoxPk; - @ApiModelProperty(value = "Charge Box Id") + @Schema(description = "Charge Box Id") private final String chargeBoxId; - @ApiModelProperty(value = "Connected since") + @Schema(description = "Connected since") private final String connectedSince; - @ApiModelProperty(value = "Duration of the Connection") + @Schema(description = "Duration of the Connection") private final String connectionDuration; - @ApiModelProperty(value = "Ocpp version") + @Schema(description = "Ocpp version") private final OcppVersion version; - @ApiModelProperty(value = "Connected since as DT", hidden = true) + @Schema(description = "Connected since as DT", hidden = true) private final DateTime connectedSinceDT; } diff --git a/src/main/java/de/rwth/idsg/steve/web/dto/ocpp/ConfigurationKeyReadWriteEnum.java b/src/main/java/de/rwth/idsg/steve/web/dto/ocpp/ConfigurationKeyReadWriteEnum.java index d140fdba9..0dc2530ad 100644 --- a/src/main/java/de/rwth/idsg/steve/web/dto/ocpp/ConfigurationKeyReadWriteEnum.java +++ b/src/main/java/de/rwth/idsg/steve/web/dto/ocpp/ConfigurationKeyReadWriteEnum.java @@ -1,31 +1,31 @@ -/* - * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve - * Copyright (C) 2013-2024 SteVe Community Team - * All Rights Reserved. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package de.rwth.idsg.steve.web.dto.ocpp; - -/** - * Determines if a configuration key is read-only ("R") or read-write ("RW"). In case the key is read-only, the Central - * System can read the value for the key using GetConfiguration, but not write it. In case the accessibility is - * read-write, the Central System can also write the value for the key using ChangeConfiguration. - * - * This distinction was added in OCPP 1.6. - */ -public enum ConfigurationKeyReadWriteEnum { - R, - RW -} +/* + * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve + * Copyright (C) 2013-2024 SteVe Community Team + * All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package de.rwth.idsg.steve.web.dto.ocpp; + +/** + * Determines if a configuration key is read-only ("R") or read-write ("RW"). In case the key is read-only, the Central + * System can read the value for the key using GetConfiguration, but not write it. In case the accessibility is + * read-write, the Central System can also write the value for the key using ChangeConfiguration. + * + * This distinction was added in OCPP 1.6. + */ +public enum ConfigurationKeyReadWriteEnum { + R, + RW +} From 9bf3de7a9289f26b6a91af9497fd3e453b312d07 Mon Sep 17 00:00:00 2001 From: fnkbsi <135032168+fnkbsi@users.noreply.github.com> Date: Mon, 7 Oct 2024 20:00:08 +0200 Subject: [PATCH 42/48] WebUserService: set the api_password at the first start (if no web_user is present!) --- .../de/rwth/idsg/steve/service/WebUserService.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/service/WebUserService.java b/src/main/java/de/rwth/idsg/steve/service/WebUserService.java index 6fe749368..d0c590777 100644 --- a/src/main/java/de/rwth/idsg/steve/service/WebUserService.java +++ b/src/main/java/de/rwth/idsg/steve/service/WebUserService.java @@ -86,8 +86,15 @@ public void afterStart(ContextRefreshedEvent event) { .disabled(false) .authorities("ADMIN") .build(); - - this.createUser(user); + + //this.createUser(user); + + // until there is no website to add web_user or to add/change the api_password of the web_user + // the api_key will copied to the database + validateUserDetails(user); + WebUserRecord record = toWebUserRecord(user); + record.setApiPassword(SteveConfiguration.CONFIG.getWebApi().getHeaderValue()); + webUserRepository.createUser(record); } @Override From 507f9ace95669b1e49abd2f542a7241e4069190d Mon Sep 17 00:00:00 2001 From: fnkbsi <135032168+fnkbsi@users.noreply.github.com> Date: Tue, 3 Dec 2024 15:07:04 +0100 Subject: [PATCH 43/48] web/api style check improvements --- .../web/api/ConnectorRestController.java | 24 ++++-- .../api/RemoteStartStopRestController.java | 84 ++++++++++++++----- .../steve/web/api/TaskRestController.java | 36 ++++++-- .../steve/web/api/dto/ApiChargePointList.java | 2 +- 4 files changed, 109 insertions(+), 37 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java index 4c9dc21a4..b2934da62 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/ConnectorRestController.java @@ -76,9 +76,15 @@ public class ConnectorRestController { @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} + @ApiResponse(responseCode = "400", description = "Bad Request", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))})} ) @GetMapping(value = "") @ResponseBody @@ -100,9 +106,15 @@ public ApiConnectorList getConnectors(@Valid ConnectorStatusForm queryParams) { @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} + @ApiResponse(responseCode = "400", description = "Bad Request", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))})} ) @GetMapping(value = "OCPP_JSON_STATUS") @ResponseBody diff --git a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java index 5c3520a42..bf4fcd055 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java @@ -177,9 +177,15 @@ private Boolean activeTaskOnChargeBox(String chargeBoxId) { @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} + @ApiResponse(responseCode = "400", description = "Bad Request", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))})} ) @GetMapping(value = "") @ResponseBody @@ -189,9 +195,15 @@ public ApiChargePointList getBase() { @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} + @ApiResponse(responseCode = "400", description = "Bad Request", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))})} ) @GetMapping(value = "start") @ResponseBody @@ -201,9 +213,15 @@ public ApiChargePointList getRemoteStartTx() { @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} + @ApiResponse(responseCode = "400", description = "Bad Request", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))})} ) @GetMapping(value = "stop") @ResponseBody @@ -213,9 +231,15 @@ public ApiChargePointList getRemoteStopTx() { @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} + @ApiResponse(responseCode = "400", description = "Bad Request", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))})} ) @GetMapping(value = "unlock") @ResponseBody @@ -230,9 +254,15 @@ public ApiChargePointList getUnlockCon() { @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} + @ApiResponse(responseCode = "400", description = "Bad Request", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))})} ) @PostMapping(value = "start") @ResponseBody @@ -266,9 +296,15 @@ public Integer postRemoteStartTx(@Valid ApiChargePointStart params) { @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} + @ApiResponse(responseCode = "400", description = "Bad Request", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))})} ) @PostMapping(value = "stop") @ResponseBody @@ -309,9 +345,15 @@ public Integer postRemoteStopTx(@Valid ApiChargePointStart params) { @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} + @ApiResponse(responseCode = "400", description = "Bad Request", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))})} ) @PostMapping(value = "unlock") @ResponseBody diff --git a/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java index dfbf022af..77a20a7df 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java @@ -68,9 +68,15 @@ private ApiTaskList getTaskList() { @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} + @ApiResponse(responseCode = "400", description = "Bad Request", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))})} ) @GetMapping(value = "taskoverview") @ResponseBody @@ -81,9 +87,15 @@ public ApiTaskList getOverview() { @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} + @ApiResponse(responseCode = "400", description = "Bad Request", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))})} ) @PostMapping(value = "clearfinishedtasks") @ResponseBody @@ -94,9 +106,15 @@ public ApiTaskList clearFinished() { @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "400", description = "Bad Request", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "401", description = "Unauthorized", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))}), - @ApiResponse(responseCode = "500", description = "Internal Server Error", content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ApiErrorResponse.class))})} + @ApiResponse(responseCode = "400", description = "Bad Request", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "401", description = "Unauthorized", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))}), + @ApiResponse(responseCode = "500", description = "Internal Server Error", + content = {@Content(mediaType = "application/json", + schema = @Schema(implementation = ApiErrorResponse.class))})} ) @GetMapping(value = "task") @ResponseBody diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java index acdd89d5a..f54f5d536 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java @@ -50,7 +50,7 @@ class ChargePointInfo { @Schema(description = "List of the charge box connectors") private List connectorIds; - public ChargePointInfo(String chargeBoxId, List connectorIds) { + ChargePointInfo(String chargeBoxId, List connectorIds) { this.chargeBoxId = chargeBoxId; this.connectorIds = connectorIds; } From 47b57841275969a07c201c1c4e5033f2837b5f1a Mon Sep 17 00:00:00 2001 From: fnkbsi <135032168+fnkbsi@users.noreply.github.com> Date: Tue, 3 Dec 2024 15:11:30 +0100 Subject: [PATCH 44/48] ApiChargePointStart bugfix: now using annotation @RequiredArgsConstructor --- .../steve/web/api/dto/ApiChargePointStart.java | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java index 236ef76ea..36b18460e 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java @@ -18,12 +18,9 @@ */ package de.rwth.idsg.steve.web.api.dto; -//import de.rwth.idsg.steve.ocpp.OcppTransport; import io.swagger.v3.oas.annotations.media.Schema; -//import java.util.Collections; -//import java.util.List; import lombok.Getter; -//import lombok.RequiredArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.Setter; /** @@ -33,7 +30,7 @@ @Getter @Setter -//@RequiredArgsConstructor +@RequiredArgsConstructor public class ApiChargePointStart { @Schema(description = "Charge Box ID") private String chargeBoxId; @@ -41,11 +38,4 @@ public class ApiChargePointStart { private Integer connectorId; @Schema(description = "OCPP Tag") private String ocppTag; - - public ApiChargePointStart(String chargeBoxId, Integer connectorId, String ocppTag) { - this.chargeBoxId = chargeBoxId; - this.connectorId = connectorId; - this.ocppTag = ocppTag; - } - } From b62ce9009ff7378e1b33dc70bf37e97a7b5d2a08 Mon Sep 17 00:00:00 2001 From: fnkbsi <135032168+fnkbsi@users.noreply.github.com> Date: Fri, 6 Dec 2024 12:17:11 +0100 Subject: [PATCH 45/48] TaskRestController bugfix: adding @RequestParam(name = "id") to task path --- .../java/de/rwth/idsg/steve/web/api/TaskRestController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java index 77a20a7df..f5a35e060 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java @@ -39,6 +39,7 @@ import org.springframework.web.bind.annotation.RestController; import jakarta.validation.Valid; +import org.springframework.web.bind.annotation.RequestParam; /** * @author fnkbsi @@ -118,7 +119,7 @@ public ApiTaskList clearFinished() { ) @GetMapping(value = "task") @ResponseBody - public ApiTaskInfo getTaskDetails(@Valid Integer taskId) { + public ApiTaskInfo getTaskDetails(@RequestParam(name="id") @Valid Integer taskId) { ApiTaskInfo taskInfo = new ApiTaskInfo(taskId, taskStore.get(taskId)); return taskInfo; } From d3ff223e1b7539cbfcb6181ca5dc35b765065ce1 Mon Sep 17 00:00:00 2001 From: fnkbsi <135032168+fnkbsi@users.noreply.github.com> Date: Sat, 11 Jan 2025 17:01:52 +0100 Subject: [PATCH 46/48] Update year in licence header --- .../rwth/idsg/steve/web/api/RemoteStartStopRestController.java | 2 +- .../java/de/rwth/idsg/steve/web/api/TaskRestController.java | 2 +- .../de/rwth/idsg/steve/web/api/TransactionsRestController.java | 2 +- .../java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java | 2 +- .../de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java | 2 +- .../java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java | 2 +- src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java | 2 +- src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java index bf4fcd055..453b5ffa2 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/RemoteStartStopRestController.java @@ -1,6 +1,6 @@ /* * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve - * Copyright (C) 2013-2024 SteVe Community Team + * Copyright (C) 2013-2025 SteVe Community Team * All Rights Reserved. * * This program is free software: you can redistribute it and/or modify diff --git a/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java index f5a35e060..ddfe6d890 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java @@ -1,6 +1,6 @@ /* * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve - * Copyright (C) 2013-2024 SteVe Community Team + * Copyright (C) 2013-2025 SteVe Community Team * All Rights Reserved. * * This program is free software: you can redistribute it and/or modify diff --git a/src/main/java/de/rwth/idsg/steve/web/api/TransactionsRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/TransactionsRestController.java index bfc9a22e5..1841a1bc7 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/TransactionsRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/TransactionsRestController.java @@ -1,6 +1,6 @@ /* * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve - * Copyright (C) 2013-2024 SteVe Community Team + * Copyright (C) 2013-2025 SteVe Community Team * All Rights Reserved. * * This program is free software: you can redistribute it and/or modify diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java index f54f5d536..2537ed953 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointList.java @@ -1,6 +1,6 @@ /* * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve - * Copyright (C) 2013-2024 SteVe Community Team + * Copyright (C) 2013-2025 SteVe Community Team * All Rights Reserved. * * This program is free software: you can redistribute it and/or modify diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java index 36b18460e..49ae81e0e 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiChargePointStart.java @@ -1,6 +1,6 @@ /* * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve - * Copyright (C) 2013-2024 SteVe Community Team + * Copyright (C) 2013-2025 SteVe Community Team * All Rights Reserved. * * This program is free software: you can redistribute it and/or modify diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java index aba979b8c..729e1bfd9 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiConnectorList.java @@ -1,6 +1,6 @@ /* * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve - * Copyright (C) 2013-2024 SteVe Community Team + * Copyright (C) 2013-2025 SteVe Community Team * All Rights Reserved. * * This program is free software: you can redistribute it and/or modify diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java index 7d26917e6..33a2244b2 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskInfo.java @@ -1,6 +1,6 @@ /* * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve - * Copyright (C) 2013-2024 SteVe Community Team + * Copyright (C) 2013-2025 SteVe Community Team * All Rights Reserved. * * This program is free software: you can redistribute it and/or modify diff --git a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java index 6ce96c8bc..7efb067bb 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/dto/ApiTaskList.java @@ -1,6 +1,6 @@ /* * SteVe - SteckdosenVerwaltung - https://github.com/steve-community/steve - * Copyright (C) 2013-2024 SteVe Community Team + * Copyright (C) 2013-2025 SteVe Community Team * All Rights Reserved. * * This program is free software: you can redistribute it and/or modify From dc5c497671487d39e20aa9c0c6939d6ad9961230 Mon Sep 17 00:00:00 2001 From: fnkbsi <135032168+fnkbsi@users.noreply.github.com> Date: Sun, 12 Jan 2025 01:04:47 +0100 Subject: [PATCH 47/48] removed trailing spaces (ChargeServiceClient), added whitespaces around equal-sign(TaskRestController) --- .../de/rwth/idsg/steve/service/ChargePointServiceClient.java | 5 ++--- .../java/de/rwth/idsg/steve/web/api/TaskRestController.java | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/service/ChargePointServiceClient.java b/src/main/java/de/rwth/idsg/steve/service/ChargePointServiceClient.java index 25e04414f..7f632c385 100644 --- a/src/main/java/de/rwth/idsg/steve/service/ChargePointServiceClient.java +++ b/src/main/java/de/rwth/idsg/steve/service/ChargePointServiceClient.java @@ -21,7 +21,6 @@ import de.rwth.idsg.steve.SteveException; import de.rwth.idsg.steve.ocpp.ChargePointServiceInvokerImpl; import de.rwth.idsg.steve.ocpp.OcppCallback; -import de.rwth.idsg.steve.ocpp.OcppVersion; import de.rwth.idsg.steve.ocpp.task.CancelReservationTask; import de.rwth.idsg.steve.ocpp.task.ChangeAvailabilityTask; import de.rwth.idsg.steve.ocpp.task.ChangeConfigurationTask; @@ -202,7 +201,7 @@ public final int remoteStartTransaction(RemoteStartTransactionParams params, OcppCallback... callbacks) { return remoteStartTransaction(params, "Steve", callbacks); } - + @SafeVarargs public final int remoteStartTransaction(RemoteStartTransactionParams params, String caller, OcppCallback... callbacks) { @@ -218,7 +217,7 @@ public final int remoteStartTransaction(RemoteStartTransactionParams params, Str return taskStore.add(task); } - + @SafeVarargs public final int remoteStopTransaction(RemoteStopTransactionParams params, OcppCallback... callbacks) { diff --git a/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java b/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java index ddfe6d890..ebddb085f 100644 --- a/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java +++ b/src/main/java/de/rwth/idsg/steve/web/api/TaskRestController.java @@ -119,7 +119,7 @@ public ApiTaskList clearFinished() { ) @GetMapping(value = "task") @ResponseBody - public ApiTaskInfo getTaskDetails(@RequestParam(name="id") @Valid Integer taskId) { + public ApiTaskInfo getTaskDetails(@RequestParam(name = "id") @Valid Integer taskId) { ApiTaskInfo taskInfo = new ApiTaskInfo(taskId, taskStore.get(taskId)); return taskInfo; } From cae35e56f15fa57c6d01041cbb780e2ae242ad93 Mon Sep 17 00:00:00 2001 From: fnkbsi <135032168+fnkbsi@users.noreply.github.com> Date: Sun, 12 Jan 2025 15:33:35 +0100 Subject: [PATCH 48/48] ChargePointServiceClient: rewrite the methods for remote start, stop and unlock for differentiation of internal and external tasks --- .../service/ChargePointServiceClient.java | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/rwth/idsg/steve/service/ChargePointServiceClient.java b/src/main/java/de/rwth/idsg/steve/service/ChargePointServiceClient.java index 7f632c385..dbbb60a66 100644 --- a/src/main/java/de/rwth/idsg/steve/service/ChargePointServiceClient.java +++ b/src/main/java/de/rwth/idsg/steve/service/ChargePointServiceClient.java @@ -199,14 +199,18 @@ public final int updateFirmware(UpdateFirmwareParams params, @SafeVarargs public final int remoteStartTransaction(RemoteStartTransactionParams params, OcppCallback... callbacks) { - return remoteStartTransaction(params, "Steve", callbacks); - } - + RemoteStartTransactionTask task = new RemoteStartTransactionTask(params); + return addRemoteStartTask(task, callbacks); + } @SafeVarargs public final int remoteStartTransaction(RemoteStartTransactionParams params, String caller, OcppCallback... callbacks) { RemoteStartTransactionTask task = new RemoteStartTransactionTask(params, caller); + return addRemoteStartTask(task, callbacks); + } + private int addRemoteStartTask(RemoteStartTransactionTask task, + OcppCallback... callbacks) { for (var callback : callbacks) { task.addCallback(callback); } @@ -221,14 +225,19 @@ public final int remoteStartTransaction(RemoteStartTransactionParams params, Str @SafeVarargs public final int remoteStopTransaction(RemoteStopTransactionParams params, OcppCallback... callbacks) { - return remoteStopTransaction(params, "Steve", callbacks); + RemoteStopTransactionTask task = new RemoteStopTransactionTask(params); + return addRemoteStopTask(task,callbacks); } @SafeVarargs public final int remoteStopTransaction(RemoteStopTransactionParams params, String caller, OcppCallback... callbacks) { RemoteStopTransactionTask task = new RemoteStopTransactionTask(params, caller); + return addRemoteStopTask(task,callbacks); + } + private int addRemoteStopTask(RemoteStopTransactionTask task, + OcppCallback... callbacks) { for (var callback : callbacks) { task.addCallback(callback); } @@ -243,13 +252,19 @@ public final int remoteStopTransaction(RemoteStopTransactionParams params, Strin @SafeVarargs public final int unlockConnector(UnlockConnectorParams params, OcppCallback... callbacks) { - return unlockConnector(params, "Steve", callbacks); + UnlockConnectorTask task = new UnlockConnectorTask(params); + return addUnlockConnectorTask(task, callbacks); } + @SafeVarargs public final int unlockConnector(UnlockConnectorParams params, String caller, OcppCallback... callbacks) { UnlockConnectorTask task = new UnlockConnectorTask(params, caller); + return addUnlockConnectorTask(task, callbacks); + } + private int addUnlockConnectorTask(UnlockConnectorTask task, + OcppCallback... callbacks) { for (var callback : callbacks) { task.addCallback(callback); }