From bb353490fa8ce338067b973c4df01bcb242004f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Wed, 24 Mar 2021 11:43:53 +0100 Subject: [PATCH 001/157] chore: add new api for creating and updating resource contracts (in progress) --- .../entities/usagecontrol/Pattern.java | 53 ++++++ .../service/ConnectorRequestService.java | 2 - .../service/ResourceService.java | 156 ++++++++++++++++++ .../ConnectorRequestUIController.java | 2 - .../controller/ResourceContractApi.java | 10 ++ .../ResourceContractUIController.java | 39 +++++ 6 files changed, 258 insertions(+), 4 deletions(-) create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/usagecontrol/Pattern.java diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/usagecontrol/Pattern.java b/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/usagecontrol/Pattern.java new file mode 100644 index 00000000..c36f01de --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/usagecontrol/Pattern.java @@ -0,0 +1,53 @@ +package de.fraunhofer.isst.configmanager.configmanagement.entities.usagecontrol; + +public enum Pattern { + + /** + * Standard pattern to allow unrestricted access. + */ + PROVIDE_ACCESS("PROVIDE_ACCESS"), + /** + * Default pattern if no other is detected. v2.0: NO_POLICY("no-policy") + */ + PROHIBIT_ACCESS("PROHIBIT_ACCESS"), + /** + * Type: NotMoreThanN v2.0: COUNT_ACCESS("count-access") https://github.com/International-Data-Spaces-Association/InformationModel/blob/master/examples/contracts-and-usage-policy/templates/NTimesUsageTemplates/N_TIMES_USAGE_OFFER_TEMPLATE.jsonld + */ + N_TIMES_USAGE("N_TIMES_USAGE"), + /** + * Type: DurationOffer https://github.com/International-Data-Spaces-Association/InformationModel/blob/master/examples/contracts-and-usage-policy/templates/TimeRestrictedUsageTemplates/DURATION_USAGE_OFFER_TEMPLATE.jsonld + */ + DURATION_USAGE("DURATION_USAGE"), + /** + * Type: IntervalUsage v2.0: TIME_INTERVAL("time-interval") https://github.com/International-Data-Spaces-Association/InformationModel/blob/master/examples/contracts-and-usage-policy/templates/TimeRestrictedUsageTemplates/USAGE_DURING_INTERVAL_OFFER_TEMPLATE.jsonld + */ + USAGE_DURING_INTERVAL("USAGE_DURING_INTERVAL"), + /** + * Type: DeleteAfterInterval v2.0: DELETE_AFTER("delete-after") + * https://github.com/International-Data-Spaces-Association/InformationModel/blob/master/examples/contracts-and-usage-policy/templates/TimeRestrictedUsageTemplates/USAGE_UNTIL_DELETION_OFFER_TEMPLATE.jsonld + */ + USAGE_UNTIL_DELETION("USAGE_UNTIL_DELETION"), + /** + * Type: Logging v2.0: LOG_ACCESS("log-access") https://github.com/International-Data-Spaces-Association/InformationModel/blob/master/examples/contracts-and-usage-policy/templates/UsageLoggingTemplates/USAGE_LOGGING_OFFER_TEMPLATE.jsonld + */ + USAGE_LOGGING("USAGE_LOGGING"), + /** + * Type: Notification https://github.com/International-Data-Spaces-Association/InformationModel/blob/master/examples/contracts-and-usage-policy/templates/UsageNotificationTemplates/USAGE_NOTIFICATION_OFFER_TEMPLATE.jsonld + */ + USAGE_NOTIFICATION("USAGE_NOTIFICATION"), + /** + * Type: Connector-restricted access https://github.com/International-Data-Spaces-Association/InformationModel/blob/master/examples/contracts-and-usage-policy/templates/ConnectorbasedAgreementTemplates/CONNECTORBASED_OFFER_TEMPLATE.jsonld + */ + CONNECTOR_RESTRICTED_USAGE("CONNECTOR_RESTRICTED_USAGE"); + + private final String pattern; + + Pattern(String string) { + pattern = string; + } + + @Override + public String toString() { + return pattern; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/ConnectorRequestService.java b/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/ConnectorRequestService.java index e1ddc982..82677b75 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/ConnectorRequestService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/ConnectorRequestService.java @@ -5,8 +5,6 @@ import de.fraunhofer.iais.eis.ResourceCatalog; import de.fraunhofer.isst.configmanager.communication.clients.DefaultConnectorClient; import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/ResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/ResourceService.java index d659a1fb..c1e63547 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/ResourceService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/ResourceService.java @@ -1,11 +1,16 @@ package de.fraunhofer.isst.configmanager.configmanagement.service; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.util.RdfResource; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.communication.clients.DefaultConnectorClient; import de.fraunhofer.isst.configmanager.configmanagement.entities.configlists.EndpointInformationRepository; import de.fraunhofer.isst.configmanager.configmanagement.entities.endpointinfo.EndpointInformation; +import de.fraunhofer.isst.configmanager.configmanagement.entities.usagecontrol.Pattern; import de.fraunhofer.isst.configmanager.util.CalenderUtil; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; @@ -18,6 +23,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Objects; /** * Service class for managing resources. @@ -549,4 +555,154 @@ private Resource getResourceInSubroutes(final List routeSteps, } return foundResource; } + + /** + * @param pattern pattern to create appropriate contract offer + * @param contractJson the request body which holds the necessary information + * @return contract offer + */ + public ContractOffer getContractOffer(Pattern pattern, String contractJson) throws JsonProcessingException { + + ContractOffer contractOffer = null; + switch (pattern) { + case PROVIDE_ACCESS: + contractOffer = new ContractOfferBuilder() + ._permission_(Util.asList(new PermissionBuilder() + ._title_(Util.asList(new TypedLiteral("Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("provide-access"))) + ._action_(Util.asList(Action.USE)) + .build())) + .build(); + break; + case PROHIBIT_ACCESS: + contractOffer = new ContractOfferBuilder() + ._prohibition_(Util.asList(new ProhibitionBuilder() + ._title_(Util.asList(new TypedLiteral("Example Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("prohibit-access"))) + ._action_(Util.asList(Action.USE)) + .build())) + .build(); + break; + case N_TIMES_USAGE: + if (contractJson != null) { + final var jsonNode = getJsonNodeFromContract(contractJson); + + String operator = jsonNode.get("binaryoperator").asText(); + BinaryOperator binaryOperator; + if (operator.equals("<")) { + binaryOperator = BinaryOperator.LT; + } else if (operator.equals("<=")) { + binaryOperator = BinaryOperator.LTEQ; + } else binaryOperator = BinaryOperator.EQ; + + String number = jsonNode.get("number").asText(); + String pipEndpoint = jsonNode.get("pipendpoint").asText(); + + contractOffer = new NotMoreThanNOfferBuilder() + ._permission_(Util.asList(new PermissionBuilder() + ._title_(Util.asList(new TypedLiteral("Example Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("n-times-usage"))) + ._action_(Util.asList(Action.USE)) + ._constraint_(Util.asList(new ConstraintBuilder() + ._leftOperand_(LeftOperand.COUNT) + ._operator_(binaryOperator) + ._rightOperand_(new RdfResource(number, URI.create("xsd:double"))) + ._pipEndpoint_( + URI.create(pipEndpoint)) + .build())) + .build())) + .build(); + break; + } + case DURATION_USAGE: + if (contractJson != null) { + final var jsonNode = getJsonNodeFromContract(contractJson); + String number = jsonNode.get("number").asText(); + + contractOffer = new ContractOfferBuilder() + ._permission_(Util.asList(new PermissionBuilder() + ._title_(Util.asList(new TypedLiteral("Example Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("duration-usage"))) + ._action_(Util.asList(Action.USE)) + ._constraint_(Util.asList(new ConstraintBuilder() + ._leftOperand_(LeftOperand.ELAPSED_TIME) + ._operator_(BinaryOperator.SHORTER_EQ) + ._rightOperand_(new RdfResource(number, URI.create("xsd:duration"))) + .build())) + .build())) + .build(); + break; + } + case USAGE_NOTIFICATION: + if (contractJson != null) { + final var jsonNode = getJsonNodeFromContract(contractJson); + String number = jsonNode.get("url").asText(); + + contractOffer = new ContractOfferBuilder() + ._permission_(Util.asList(new PermissionBuilder() + ._title_(Util.asList(new TypedLiteral("Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("usage-notification"))) + ._action_(Util.asList(Action.USE)) + ._postDuty_(Util.asList(new DutyBuilder() + ._action_(Util.asList(Action.NOTIFY)) + ._constraint_(Util.asList(new ConstraintBuilder() + ._leftOperand_(LeftOperand.ENDPOINT) + ._operator_(BinaryOperator.DEFINES_AS) + ._rightOperand_( + new RdfResource(number, + URI.create("xsd:anyURI"))) + .build())) + .build())) + .build())) + .build(); + break; + } + case USAGE_LOGGING: + contractOffer = new ContractOfferBuilder() + ._permission_(Util.asList(new PermissionBuilder() + ._title_(Util.asList(new TypedLiteral("Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("usage-logging"))) + ._action_(Util.asList(Action.USE)) + ._postDuty_(Util.asList(new DutyBuilder() + ._action_(Util.asList(Action.LOG)) + .build())) + .build())) + .build(); + break; + + case USAGE_DURING_INTERVAL: + //TODO get values from json + //TODO usage until deletion + contractOffer = new ContractOfferBuilder() + ._permission_(Util.asList(new PermissionBuilder() + ._title_(Util.asList(new TypedLiteral("Example Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("usage-during-interval"))) + ._action_(Util.asList(Action.USE)) + ._constraint_(Util.asList(new ConstraintBuilder() + ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) + ._operator_(BinaryOperator.AFTER) + ._rightOperand_(new RdfResource("2020-07-11T00:00:00Z", + URI.create("xsd:dateTimeStamp"))) + .build(), new ConstraintBuilder() + ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) + ._operator_(BinaryOperator.BEFORE) + ._rightOperand_(new RdfResource("2020-07-11T00:00:00Z", + URI.create("xsd:dateTimeStamp"))) + .build())) + .build())) + .build(); + break; + } + return contractOffer; + } + + /** + * @param contractJson the contract offer + * @return json node + */ + private JsonNode getJsonNodeFromContract(String contractJson) throws JsonProcessingException { + final var mapper = new ObjectMapper(); + final var jsonNode = mapper.readTree(Objects.requireNonNull(contractJson)); + return jsonNode; + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorRequestUIController.java b/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorRequestUIController.java index 3fe1e6dd..ea4449af 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorRequestUIController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorRequestUIController.java @@ -7,8 +7,6 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import net.minidev.json.JSONObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceContractApi.java b/src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceContractApi.java index 0370bb12..ae8fb204 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceContractApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceContractApi.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.controller; +import de.fraunhofer.isst.configmanager.configmanagement.entities.usagecontrol.Pattern; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; @@ -23,4 +24,13 @@ public interface ResourceContractApi { @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully updated the contract in the resource")}) ResponseEntity updateResourceContract(@RequestParam("resourceId") URI resourceId, @RequestBody String contractJson); + + @PutMapping(value = "/resource/contract/specific", produces = "application/ld+json") + @Operation(summary = "Updates the contract in a resource") + @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully updated the contract in the resource")}) + ResponseEntity updateResourceContractSpecific(@RequestParam("resourceId") URI resourceId, + @RequestParam("pattern") Pattern pattern, + @RequestBody(required = false) String contractJson); + + } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceContractUIController.java b/src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceContractUIController.java index f6c1dc05..f70370dd 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceContractUIController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceContractUIController.java @@ -1,8 +1,10 @@ package de.fraunhofer.isst.configmanager.controller; +import com.fasterxml.jackson.core.JsonProcessingException; import de.fraunhofer.iais.eis.ContractOffer; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.isst.configmanager.communication.clients.DefaultConnectorClient; +import de.fraunhofer.isst.configmanager.configmanagement.entities.usagecontrol.Pattern; import de.fraunhofer.isst.configmanager.configmanagement.service.ConfigModelService; import de.fraunhofer.isst.configmanager.configmanagement.service.ResourceService; import de.fraunhofer.isst.configmanager.util.ValidateApiInput; @@ -120,4 +122,41 @@ public ResponseEntity updateResourceContract(final URI resourceId, return ResponseEntity.badRequest().body("Could not update the resource representation"); } } + + @Override + public ResponseEntity updateResourceContractSpecific(URI resourceId, Pattern pattern, String contractJson) { + log.info(">> PUT /resource/contract/specific resourceId: " + resourceId + "pattern" + pattern.toString() + + " contractJson: " + contractJson); + + if (contractJson.equals("{}") && ValidateApiInput.notValid(resourceId.toString())) { + return ResponseEntity.badRequest().body("All validated parameter have undefined as " + + "value!"); + } + + ContractOffer contractOffer = null; + try { + contractOffer = resourceService.getContractOffer(pattern, contractJson); + } catch (JsonProcessingException e) { + log.error(e.getMessage()); + } + + // Update the resource contract + if (contractOffer != null) { + final var jsonObject = new JSONObject(); + try { + jsonObject.put("resourceID", resourceId.toString()); + jsonObject.put("contractID", contractOffer.getId().toString()); + final var response = client.updateResourceContract(resourceId.toString(), contractJson); + resourceService.updateResourceContractInAppRoute(resourceId, contractOffer); + jsonObject.put("connectorResponse", response); + return ResponseEntity.ok(jsonObject.toJSONString()); + } catch (IOException e) { + log.error(e.getMessage(), e); + jsonObject.put("message", "Problems while updating the contract at the connector"); + return ResponseEntity.badRequest().body(jsonObject.toJSONString()); + } + } else { + return ResponseEntity.badRequest().body("Could not update the resource representation"); + } + } } From b936ea157f38c3484cd9fd864dc301cfaa68ace6 Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Mon, 29 Mar 2021 08:30:31 +0200 Subject: [PATCH 002/157] docs: update readme --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index f14a5866..116138ac 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ + @@ -29,9 +30,6 @@ the develop branch (as SNAPSHOT version) and to push the changes from there into the develop branch is always up to date, with the risk of small issues, while the master only contains official releases. -**The versions 1, 2 and 3 of the configuration manager do not exist for the reason to be compatible with the dataspace -connector. Therefore, the versioning starts with the 4.0.0 .** - ## Table of Contents @@ -104,7 +102,7 @@ This is a list of currently implemented features, which is continuously updated. | ------ | ------ | ------ | ------ | ------ | | IDS Information Model Library | 4.0.2 | Apache 2.0 | Fraunhofer IAIS | [Sebastian Bader](mailto:sebastian.bader@iais.fraunhofer.de) | | IDS Information Model Serializer Library | 4.0.2 | Apache 2.0 | Fraunhofer IAIS | [Sebastian Bader](mailto:sebastian.bader@iais.fraunhofer.de) | -| [Dataspace Connector](https://github.com/International-Data-Spaces-Association/DataspaceConnector) | latest | Apache 2.0 | Fraunhofer ISST | [Julia Pampus](mailto:julia.pampus@isst.fraunhofer.de) | +| [Dataspace Connector](https://github.com/International-Data-Spaces-Association/DataspaceConnector) | Recommended: 4.1.0 - 4.3.0 | Apache 2.0 | Fraunhofer ISST | [Julia Pampus](mailto:julia.pampus@isst.fraunhofer.de) | | [Configuration Manager UI](https://github.com/International-Data-Spaces-Association/IDS-ConfigurationManager-UI) | latest | Apache 2.0 | Fraunhofer FKIE | [Bastian Weltjen](mailto:bastian.weltjen@fkie.fraunhofer.de) | --- From 305f1993c3f6d8bd7585158e60e45f2687d738d4 Mon Sep 17 00:00:00 2001 From: obarretosilva Date: Mon, 29 Mar 2021 10:31:46 +0200 Subject: [PATCH 003/157] chore: add ssl field to application.properties --- src/main/resources/application.properties | 1 + src/test/resources/application.properties | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index eb7a8e11..92990854 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -21,6 +21,7 @@ server.port=8081 # enable client for dataspaceconnector dataspace.connector.enabled=true +dataspace.connector.ssl=false dataspace.connector.host=localhost dataspace.connector.port=8080 dataspace.connector.api.username=admin diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index 1062131b..2778b5c2 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -20,7 +20,8 @@ default.enabled=true # enable client for dataspaceconnector dataspace.connector.enabled=true +dataspace.connector.ssl=false dataspace.connector.host=localhost dataspace.connector.port=8080 dataspace.connector.api.username=admin -dataspace.connector.api.password=password \ No newline at end of file +dataspace.connector.api.password=password From 4a2eab23ef9f32efc9d26b66c08920af2b15aa38 Mon Sep 17 00:00:00 2001 From: obarretosilva Date: Mon, 29 Mar 2021 10:33:56 +0200 Subject: [PATCH 004/157] chore: add autowired protocol field to DataSpaceConnectorClient --- .../DataspaceConnectorClient.java | 50 +++++++++++-------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java index f5f349f6..7e4a71d7 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java @@ -15,6 +15,7 @@ import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; import okhttp3.*; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.stereotype.Service; @@ -59,6 +60,8 @@ public class DataspaceConnectorClient implements DefaultConnectorClient { @Value("${dataspace.connector.port}") transient Integer dataSpaceConnectorPort; + transient String protocol; + public DataspaceConnectorClient(final DataSpaceConnectorResourceMapper dataSpaceConnectorResourceMapper) { this.dataSpaceConnectorResourceMapper = dataSpaceConnectorResourceMapper; } @@ -69,7 +72,7 @@ public String updateAtBroker(final String brokerURI) throws IOException { brokerURI)); final var builder = new Request.Builder(); builder.url(new HttpUrl.Builder() - .scheme("https") + .scheme(protocol) .host(dataSpaceConnectorHost) .port(dataSpaceConnectorPort) .addPathSegments("admin/api/broker/update") @@ -88,7 +91,7 @@ public String unregisterAtBroker(final String brokerURI) throws IOException { dataSpaceConnectorHost, brokerURI)); final var builder = new Request.Builder(); builder.url(new HttpUrl.Builder() - .scheme("https") + .scheme(protocol) .host(dataSpaceConnectorHost) .port(dataSpaceConnectorPort) .addPathSegments("admin/api/broker/unregister") @@ -105,7 +108,7 @@ public String unregisterAtBroker(final String brokerURI) throws IOException { public ConfigurationModel getConfiguration() throws IOException { final var builder = new Request.Builder(); final var connectorUrl = - "https://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin/api" + + protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin/api" + "/configuration"; builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); @@ -127,7 +130,7 @@ public ConfigurationModel getConfiguration() throws IOException { public BaseConnector getSelfDeclaration() throws IOException { final var builder = new Request.Builder(); final var connectorUrl = - "https://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin/api" + + protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin/api" + "/connector"; builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); @@ -160,7 +163,7 @@ public String getRequestedResourcesAsJsonString() throws IOException { private JsonNode getJsonNodeOfBaseConnector() throws IOException { final var builder = new Request.Builder(); final var connectorUrl = - "https://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + + protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin/api/connector"; builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); @@ -181,7 +184,7 @@ private JsonNode getJsonNodeOfBaseConnector() throws IOException { public boolean sendConfiguration(final String configurationModel) throws IOException { log.info(String.format("---- [DataspaceConnectorClient sendConfiguration] sending new configuration to %s", dataSpaceConnectorHost)); final var builder = new Request.Builder(); - builder.url("https://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + + builder.url(protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + "/api/configuration"); builder.post(RequestBody.create(configurationModel, okhttp3.MediaType.parse("application" + "/ld+json"))); @@ -201,7 +204,7 @@ public boolean sendConfiguration(final String configurationModel) throws IOExcep public BaseConnector getBaseConnector(final String accessURL, final String resourceId) throws IOException { final var builder = new Request.Builder(); final var urlBuilder = new HttpUrl.Builder() - .scheme("https") + .scheme(protocol) .host(dataSpaceConnectorHost) .port(dataSpaceConnectorPort) .addPathSegments("admin/api/request/description") @@ -229,7 +232,7 @@ public BaseConnector getBaseConnector(final String accessURL, final String resou public Resource getRequestedResource(String accessURL, String resourceId) throws IOException { var builder = new Request.Builder(); var urlBuilder = new HttpUrl.Builder() - .scheme("https") + .scheme(protocol) .host(dataSpaceConnectorHost) .port(dataSpaceConnectorPort) .addPathSegments("admin/api/request/description") @@ -259,7 +262,7 @@ public String requestContractAgreement(String recipientId, String requestedArtif log.info("Request contract agreement with recipient: {} and artifact: {}", recipientId, requestedArtifactId); var builder = new Request.Builder(); var urlBuilder = new HttpUrl.Builder() - .scheme("https") + .scheme(protocol) .host(dataSpaceConnectorHost) .port(dataSpaceConnectorPort) .addPathSegments("admin/api/request/contract") @@ -294,7 +297,7 @@ public String registerResource(final Resource resource) throws IOException { final var path = resource.getId().getPath(); final var idStr = path.substring(path.lastIndexOf('/') + 1); final var url = new HttpUrl.Builder() - .scheme("https") + .scheme(protocol) .host(dataSpaceConnectorHost) .port(dataSpaceConnectorPort) .addPathSegments("admin/api/resources/resource") @@ -322,7 +325,7 @@ public String deleteResource(final URI resourceID) throws IOException { final var path = resourceID.getPath(); final var idStr = path.substring(path.lastIndexOf('/') + 1); final var builder = new Request.Builder(); - builder.url("https://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + + builder.url(protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + "/api/resources/" + idStr); builder.delete(); builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, @@ -343,7 +346,7 @@ public String updateResourceAtBroker(final String brokerUri, final URI resourceI final var resourceUUID = UUID.fromString(idStr); final var builder = new Request.Builder(); builder.url(new HttpUrl.Builder() - .scheme("https") + .scheme(protocol) .host(dataSpaceConnectorHost) .port(dataSpaceConnectorPort) .addPathSegments("admin/api/broker/update/" + resourceUUID) @@ -367,7 +370,7 @@ public String deleteResourceAtBroker(final String brokerUri, final URI resourceI final var idStr = path.substring(path.lastIndexOf('/') + 1); final var builder = new Request.Builder(); builder.url(new HttpUrl.Builder() - .scheme("https") + .scheme(protocol) .host(dataSpaceConnectorHost) .port(dataSpaceConnectorPort) .addPathSegments("admin/api/broker/remove/" + idStr) @@ -395,7 +398,7 @@ public String deleteResourceRepresentation(final String resourceID, final var mappedRepresentationID = dataSpaceConnectorResourceMapper.getMappedId(URI.create(representationID)); dataSpaceConnectorResourceMapper.deleteResourceIDPair(URI.create(representationID)); - builder.url("https://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + + builder.url(protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + "/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); builder.delete(); builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, @@ -427,7 +430,7 @@ public String registerResourceRepresentation(final String resourceID, log.info("---- [DataspaceConnectorClient registerResourceRepresentation] mapped representation: " + resourceJsonLD); final var builder = new Request.Builder(); builder.url(new HttpUrl.Builder() - .scheme("https") + .scheme(protocol) .host(dataSpaceConnectorHost) .port(dataSpaceConnectorPort) .addPathSegments("admin/api/resources/" + mappedResourceID + "/representation") @@ -474,7 +477,7 @@ public String updateResourceRepresentation(final String resourceID, log.info("---- [DataspaceConnectorClient updateResourceRepresentation] mapped representation: " + resourceJsonLD); final var builder = new Request.Builder(); log.info("---- [DataspaceConnectorClient updateResourceRepresentation] Calling DSC at: https://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); - builder.url("https://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + + builder.url(protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + "/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); builder.put(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld" + "+json"))); @@ -504,7 +507,7 @@ public String updateCustomResourceRepresentation(final String resourceID, final var resourceJsonLD = MAPPER.writeValueAsString(resourceRepresentation); log.info("---- [DataspaceConnectorClient updateCustomResourceRepresentation] mapped representation: " + resourceJsonLD); final var builder = new Request.Builder(); - builder.url("https://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + + builder.url(protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + "/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); builder.put(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld" + "+json"))); @@ -529,7 +532,7 @@ public String updateResourceContract(final String resourceID, final String contr dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); // var resourceJsonLD = SERIALIZER.serialize(contract); final var builder = new Request.Builder(); - builder.url("https://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + + builder.url(protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + "/api/resources/" + mappedResourceID + "/contract"); builder.put(RequestBody.create(contract, okhttp3.MediaType.parse("application/ld+json"))); builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, @@ -548,7 +551,7 @@ public String updateResourceContract(final String resourceID, final String contr public String getPolicyPattern(final String policy) throws IOException { log.info(String.format("---- [DataspaceConnectorClient getPolicyPattern] Get pattern for policy")); final var builder = new Request.Builder(); - builder.url("https://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + + builder.url(protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + "/api/example/policy-validation"); builder.post(RequestBody.create(policy, okhttp3.MediaType.parse("application/ld+json"))); builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, @@ -574,7 +577,7 @@ public String updateResource(final URI resourceID, final Resource resource) thro BackendSource backendSource = new BackendSource(); try { final var requestBackendBuilder = new Request.Builder(); - requestBackendBuilder.url("https://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + + requestBackendBuilder.url(protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + "/api/resources/" + resourceUUID); requestBackendBuilder.get(); requestBackendBuilder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, @@ -597,7 +600,7 @@ public String updateResource(final URI resourceID, final Resource resource) thro var resourceJsonLD = MAPPER.writeValueAsString(mappedResource); final var builder = new Request.Builder(); - builder.url("https://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + + builder.url(protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + "/api/resources/" + resourceUUID); builder.put(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld+json"))); builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, @@ -612,4 +615,9 @@ public String updateResource(final URI resourceID, final Resource resource) thro return body; } + @Autowired + public void setProtocol(@Value("${dataspace.connector.ssl}") String https){ + protocol = Boolean.parseBoolean(https) ? "https" : "http"; + log.info("Communication Protocol with Dataspace Connector is: " + protocol); + } } From b5860d5bef8496241549e538fbbda81e91f896b1 Mon Sep 17 00:00:00 2001 From: omar Date: Wed, 31 Mar 2021 13:27:19 +0200 Subject: [PATCH 005/157] chore: rename ssl flag in application properties --- .../dataspaceconnector/DataspaceConnectorClient.java | 2 +- src/main/resources/application.properties | 4 +++- src/test/resources/application.properties | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java index 7e4a71d7..43ae4508 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java @@ -616,7 +616,7 @@ public String updateResource(final URI resourceID, final Resource resource) thro } @Autowired - public void setProtocol(@Value("${dataspace.connector.ssl}") String https){ + public void setProtocol(@Value("${dataspace.communication.ssl}") String https){ protocol = Boolean.parseBoolean(https) ? "https" : "http"; log.info("Communication Protocol with Dataspace Connector is: " + protocol); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 92990854..42a32757 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -21,12 +21,14 @@ server.port=8081 # enable client for dataspaceconnector dataspace.connector.enabled=true -dataspace.connector.ssl=false dataspace.connector.host=localhost dataspace.connector.port=8080 dataspace.connector.api.username=admin dataspace.connector.api.password=password +# communication to dataspace connector +dataspace.communication.ssl=true + #General Information title=@project.name@ version=@project.version@ diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index 2778b5c2..3b44c0a3 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -20,8 +20,10 @@ default.enabled=true # enable client for dataspaceconnector dataspace.connector.enabled=true -dataspace.connector.ssl=false dataspace.connector.host=localhost dataspace.connector.port=8080 dataspace.connector.api.username=admin dataspace.connector.api.password=password + +# communication to dataspace connector +dataspace.communication.ssl=false From 1adc55e11ae4088b37e1ab77ae35209f444ed0d5 Mon Sep 17 00:00:00 2001 From: omar Date: Wed, 31 Mar 2021 13:38:30 +0200 Subject: [PATCH 006/157] chore: add ssl flag to docker-compose --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index bcd87ab3..6e941688 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,3 +9,4 @@ services: - 8081:8081 environment: - CUSTOM_APP_NAME=Einfache Wetterwarnungen auf Gemeindeebene + - DATASPACE_COMMUNICATION_SSL=true From 5dd77fcbebbbd771ccd344a2be2788e296d6c177 Mon Sep 17 00:00:00 2001 From: omar Date: Wed, 31 Mar 2021 13:47:17 +0200 Subject: [PATCH 007/157] chore: set ssl flag to true in test application.properties --- src/test/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index 3b44c0a3..9adba217 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -26,4 +26,4 @@ dataspace.connector.api.username=admin dataspace.connector.api.password=password # communication to dataspace connector -dataspace.communication.ssl=false +dataspace.communication.ssl=true From a07fc4bd179876b459b9036baf675efbd9ee677c Mon Sep 17 00:00:00 2001 From: omar Date: Wed, 31 Mar 2021 14:00:10 +0200 Subject: [PATCH 008/157] fix: maven version --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 5d25f8e2..5c84bd05 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM maven:latest AS maven +FROM maven:3.6.3-jdk-11 AS maven COPY pom.xml /tmp/ From 93b4738abb72f88fd0cf2389bdec177bfc87bd02 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Thu, 1 Apr 2021 13:53:46 +0200 Subject: [PATCH 009/157] fix: set jdk version in dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 8d7d98f4..af91f66f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM maven:latest AS maven +FROM maven:3-jdk-11 AS maven COPY pom.xml /tmp/ From 0f7a0e3fdcf55c7dcdac25f56f276bf0277da101 Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Thu, 1 Apr 2021 14:06:18 +0200 Subject: [PATCH 010/157] docs: update changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c323ea4..a4b1f419 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [6.0.1-SNAPSHOT] - UNRELEASED +### Changes +- Docker: The Java version to be used is now fixed in the Dockerfile + ## [6.0.0] - 2021-03-26 ### Added From 7063d0c9607ad5d29777af1abca2c60a1f6d35c1 Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Thu, 1 Apr 2021 14:07:00 +0200 Subject: [PATCH 011/157] build: update pom to 6.0.1-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 24852e3d..84be9546 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ de.fraunhofer.isst configurationmanager - 6.0.0 + 6.0.1-SNAPSHOT Configuration Manager Configuration Manager developed by the Fraunhofer ISST From 8c614917dc4932109fb43d7f0c71cedbbf58a61f Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Thu, 1 Apr 2021 14:07:32 +0200 Subject: [PATCH 012/157] build: update dockerfile to 6.0.1-SNAPSHOT --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index af91f66f..c13f5bcb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,8 +12,8 @@ RUN mvn clean package FROM adoptopenjdk/openjdk11:jre-11.0.8_10-alpine RUN mkdir /app -COPY --from=maven /tmp/target/*.jar /app/configurationmanager-6.0.0.jar +COPY --from=maven /tmp/target/*.jar /app/configurationmanager-6.0.1-SNAPSHOT.jar WORKDIR /app/ -ENTRYPOINT ["java","-Dfile.encoding=UTF-8","-jar","configurationmanager-6.0.0.jar"] +ENTRYPOINT ["java","-Dfile.encoding=UTF-8","-jar","configurationmanager-6.0.1-SNAPSHOT.jar"] From 52c7e0128ec431f046f904e99ee836b922202df5 Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Thu, 1 Apr 2021 14:08:37 +0200 Subject: [PATCH 013/157] feat: update log to 6.0.1-SNAPSHOT --- .../fraunhofer/isst/configmanager/ConfigmanagerApplication.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java b/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java index d77dd76f..c95ba4d4 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java @@ -91,7 +91,7 @@ public ObjectMapper getObjectMapper() { @Scheduled(fixedRate = 60000) public void logInfoStillAlive() { - var currentVersion = "6.0.0"; + var currentVersion = "6.0.1-SNAPSHOT"; System.gc(); var mb = 1024L * 1024L; From 3aa24c6e440583cca813814c128d35a05ba126b7 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Thu, 1 Apr 2021 14:51:27 +0200 Subject: [PATCH 014/157] feat: add API to get the accessibility status of the public connector endpoint (self-description) --- .../clients/DefaultConnectorClient.java | 9 +++++++ .../DataspaceConnectorClient.java | 22 ++++++++++++++++ .../controller/ConnectorUIApi.java | 9 ++++++- .../controller/ConnectorUIController.java | 26 +++++++++++++++++++ 4 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/communication/clients/DefaultConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/communication/clients/DefaultConnectorClient.java index 3776e6ac..f96a870d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/communication/clients/DefaultConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/communication/clients/DefaultConnectorClient.java @@ -17,6 +17,14 @@ */ public interface DefaultConnectorClient { + /** + * The method returns the current configuration model. + * + * @return the current configuration model + * @throws IOException if request fails + */ + BaseConnector getConnectorStatus() throws IOException; + /** * The method helps to update connector in the broker. For this only the id of the * corresponding broker @@ -46,6 +54,7 @@ public interface DefaultConnectorClient { */ ConfigurationModel getConfiguration() throws IOException; + /** * The boolean method helps to send the current configuration model to the target connector. * diff --git a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java index f5f349f6..80d90e2f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java @@ -63,6 +63,28 @@ public DataspaceConnectorClient(final DataSpaceConnectorResourceMapper dataSpace this.dataSpaceConnectorResourceMapper = dataSpaceConnectorResourceMapper; } + @Override + public BaseConnector getConnectorStatus() throws IOException { + final var connectorUrl = "https://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/"; + + final var builder = new Request.Builder(); + builder.url(connectorUrl); + builder.get(); + final var request = builder.build(); + + final var response = client.newCall(request).execute(); + + if (!response.isSuccessful()) { + log.warn("---- [DataspaceConnectorClient getConnectorStatus] Could not get the public self-description" + + " from {} with user {}. Response: {} - {}", + connectorUrl, dataSpaceConnectorApiUsername, response.code(), + response.message()); + } + + final var body = Objects.requireNonNull(response.body()).string(); + return SERIALIZER.deserialize(body, BaseConnector.class); + } + @Override public String updateAtBroker(final String brokerURI) throws IOException { log.info(String.format("---- [DataspaceConnectorClient updateAtBroker] updating connector %s at broker %s", dataSpaceConnectorHost, diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorUIApi.java b/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorUIApi.java index c1e38a02..1e6acb19 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorUIApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorUIApi.java @@ -9,10 +9,17 @@ public interface ConnectorUIApi { @GetMapping(value = "/connector", produces = "application/ld+json") - @Operation(summary = "Get the connector") + @Operation(summary = "Get the Connector-Description") @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully retrieved the connector")}) ResponseEntity getConnector(); + @GetMapping(value = "/connector/status", produces = "application/ld+json") + @Operation(summary = "Get the accessibility-status of the Public Connector Endpoint (Connector Self-description)") + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Public connector endpoint reachable."), + @ApiResponse(responseCode = "503", description = "Public connector endpoint not reachable.")}) + ResponseEntity getConnectorStatus(); + @GetMapping(value = "/connector/json", produces = "application/ld+json") @Operation(summary = "Get the connector in json") @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully retrieved the connector in json")}) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorUIController.java b/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorUIController.java index c4271393..1a822d81 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorUIController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorUIController.java @@ -68,6 +68,32 @@ public ResponseEntity getConnector() { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } + /** + * This methods returns the connector public endpoint accessibility status. + * + * @return accessibility status + */ + @Override + public ResponseEntity getConnectorStatus() { + log.info(">> GET /connector/status"); + + final var json = new JSONObject(); + try { + client.getConnectorStatus(); + + log.info("---- [ConnectorUIController getConnectorStatus] Could connect to the Connector!"); + + json.put("status","Public connector endpoint reachable."); + return new ResponseEntity<>(json.toString(), HttpStatus.OK); + } catch (Exception e) { + //Error case does not need to be processed further here + log.warn("---- [ConnectorUIController getConnectorStatus] Could not connect to the Connector!"); + + json.put("status","Public connector endpoint not reachable."); + return new ResponseEntity<>(json.toString(), HttpStatus.SERVICE_UNAVAILABLE); + } + } + /** * This method returns as response the base connector in JSON format. * From 7091d901856c8e2770ace0e5cffb909841589935 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Thu, 1 Apr 2021 14:59:20 +0200 Subject: [PATCH 015/157] refactor: simplify the connector-status query --- .../clients/DefaultConnectorClient.java | 7 +++---- .../DataspaceConnectorClient.java | 16 ++-------------- .../controller/ConnectorUIController.java | 2 +- 3 files changed, 6 insertions(+), 19 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/communication/clients/DefaultConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/communication/clients/DefaultConnectorClient.java index f96a870d..6e0f64d3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/communication/clients/DefaultConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/communication/clients/DefaultConnectorClient.java @@ -18,12 +18,11 @@ public interface DefaultConnectorClient { /** - * The method returns the current configuration model. + * This methods tries to connect to the public connector endpoint. * - * @return the current configuration model - * @throws IOException if request fails + * @throws IOException if connection fails */ - BaseConnector getConnectorStatus() throws IOException; + void getConnectorStatus() throws IOException; /** * The method helps to update connector in the broker. For this only the id of the diff --git a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java index 80d90e2f..7ba0729a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java @@ -64,25 +64,13 @@ public DataspaceConnectorClient(final DataSpaceConnectorResourceMapper dataSpace } @Override - public BaseConnector getConnectorStatus() throws IOException { + public void getConnectorStatus() throws IOException { final var connectorUrl = "https://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/"; - final var builder = new Request.Builder(); builder.url(connectorUrl); builder.get(); final var request = builder.build(); - - final var response = client.newCall(request).execute(); - - if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient getConnectorStatus] Could not get the public self-description" + - " from {} with user {}. Response: {} - {}", - connectorUrl, dataSpaceConnectorApiUsername, response.code(), - response.message()); - } - - final var body = Objects.requireNonNull(response.body()).string(); - return SERIALIZER.deserialize(body, BaseConnector.class); + client.newCall(request).execute(); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorUIController.java b/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorUIController.java index 1a822d81..23126885 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorUIController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorUIController.java @@ -69,7 +69,7 @@ public ResponseEntity getConnector() { } /** - * This methods returns the connector public endpoint accessibility status. + * This methods tries to connect to the public connector endpoint. * * @return accessibility status */ From 99b128f9419158490bd30f1dc67c6d8ad304440f Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Thu, 1 Apr 2021 15:18:50 +0200 Subject: [PATCH 016/157] build: update to 6.1.0-SNAPSHOT due to Minor Change (new API) --- CHANGELOG.md | 5 ++++- Dockerfile | 4 ++-- pom.xml | 2 +- .../isst/configmanager/ConfigmanagerApplication.java | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a4b1f419..593b4c38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [6.0.1-SNAPSHOT] - UNRELEASED +## [6.1.0-SNAPSHOT] - UNRELEASED +### Added +- Minor Change: New API GET /api/ui/connector/status to return the accessibility-status of the Public-Connector-Endpoint + ### Changes - Docker: The Java version to be used is now fixed in the Dockerfile diff --git a/Dockerfile b/Dockerfile index c13f5bcb..69eb80a1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,8 +12,8 @@ RUN mvn clean package FROM adoptopenjdk/openjdk11:jre-11.0.8_10-alpine RUN mkdir /app -COPY --from=maven /tmp/target/*.jar /app/configurationmanager-6.0.1-SNAPSHOT.jar +COPY --from=maven /tmp/target/*.jar /app/configurationmanager-6.1.0-SNAPSHOT.jar WORKDIR /app/ -ENTRYPOINT ["java","-Dfile.encoding=UTF-8","-jar","configurationmanager-6.0.1-SNAPSHOT.jar"] +ENTRYPOINT ["java","-Dfile.encoding=UTF-8","-jar","configurationmanager-6.1.0-SNAPSHOT.jar"] diff --git a/pom.xml b/pom.xml index 84be9546..e15fcb68 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ de.fraunhofer.isst configurationmanager - 6.0.1-SNAPSHOT + 6.1.0-SNAPSHOT Configuration Manager Configuration Manager developed by the Fraunhofer ISST diff --git a/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java b/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java index c95ba4d4..ac4e6a9a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java @@ -91,7 +91,7 @@ public ObjectMapper getObjectMapper() { @Scheduled(fixedRate = 60000) public void logInfoStillAlive() { - var currentVersion = "6.0.1-SNAPSHOT"; + var currentVersion = "6.1.0-SNAPSHOT"; System.gc(); var mb = 1024L * 1024L; From f5cb6aabed54d864fa06cfa59cb929885f6e3f75 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Thu, 1 Apr 2021 16:28:15 +0200 Subject: [PATCH 017/157] refactor: DataspaceConnectorClient http-support --- .../DataspaceConnectorClient.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java index 08f71c1a..d6626807 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java @@ -66,9 +66,15 @@ public DataspaceConnectorClient(final DataSpaceConnectorResourceMapper dataSpace this.dataSpaceConnectorResourceMapper = dataSpaceConnectorResourceMapper; } + @Autowired + public void setProtocol(@Value("${dataspace.communication.ssl}") String https){ + protocol = Boolean.parseBoolean(https) ? "https" : "http"; + log.info("---- [DataspaceConnectorClient setProtocol] Communication Protocol with DataspaceConnector is: " + protocol); + } + @Override public void getConnectorStatus() throws IOException { - final var connectorUrl = "https://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/"; + final var connectorUrl = protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/"; final var builder = new Request.Builder(); builder.url(connectorUrl); builder.get(); @@ -486,7 +492,7 @@ public String updateResourceRepresentation(final String resourceID, final var resourceJsonLD = MAPPER.writeValueAsString(mappedRepresentation); log.info("---- [DataspaceConnectorClient updateResourceRepresentation] mapped representation: " + resourceJsonLD); final var builder = new Request.Builder(); - log.info("---- [DataspaceConnectorClient updateResourceRepresentation] Calling DSC at: https://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); + log.info("---- [DataspaceConnectorClient updateResourceRepresentation] Calling DSC at: " + protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); builder.url(protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + "/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); builder.put(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld" + @@ -624,10 +630,4 @@ public String updateResource(final URI resourceID, final Resource resource) thro log.info("---- [DataspaceConnectorClient updateResource] Response: " + body); return body; } - - @Autowired - public void setProtocol(@Value("${dataspace.communication.ssl}") String https){ - protocol = Boolean.parseBoolean(https) ? "https" : "http"; - log.info("Communication Protocol with Dataspace Connector is: " + protocol); - } } From 60574ae872b4ed289c68683236de4caf0a215eea Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Thu, 1 Apr 2021 16:39:03 +0200 Subject: [PATCH 018/157] docs: update changelog (add DSC http/https option) --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 593b4c38..072c939a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [6.1.0-SNAPSHOT] - UNRELEASED ### Added - Minor Change: New API GET /api/ui/connector/status to return the accessibility-status of the Public-Connector-Endpoint +- Minor Change: New setting option to address the DSC via HTTP or HTTPS. dataspace.communication.ssl=true/false in application.properties and DATASPACE_COMMUNICATION_SSL=true/false in docker-compose environment. ### Changes - Docker: The Java version to be used is now fixed in the Dockerfile From 20a4d92d8c893b6753756a75f6437cb80353c788 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Sat, 3 Apr 2021 10:45:43 +0200 Subject: [PATCH 019/157] refactor: Code and Architecture refactoring --- CHANGELOG.md | 5 + .../ConfigmanagerApplication.java | 28 +- .../AppUIApi.java => api/AppApi.java} | 6 +- .../{controller => api}/AppRouteApi.java | 15 +- .../BrokerUIApi.java => api/BrokerApi.java} | 14 +- .../{controller => api}/ConfigModelApi.java | 3 +- .../ConnectorApi.java} | 11 +- .../ConnectorRequestApi.java | 10 +- .../EndpointApi.java} | 17 +- .../ResourceApi.java} | 28 +- .../ResourceContractApi.java | 3 +- .../ResourceRepresentationApi.java | 14 +- .../isst/configmanager/api/UtilApi.java | 22 + .../controller/AppController.java} | 35 +- .../controller/AppRouteController.java} | 249 ++++--- .../controller/BrokerController.java} | 142 ++-- .../controller/ConfigModelController.java | 65 +- .../controller/ConnectorController.java} | 108 ++-- .../ConnectorRequestController.java | 105 +++ .../controller/EndpointController.java} | 189 +++--- .../ResourceContractController.java | 121 ++++ .../controller/ResourceController.java} | 208 +++--- .../ResourceRepresentationController.java} | 209 +++--- .../api/controller/UtilController.java | 79 +++ .../service/AppRouteService.java | 74 ++- .../service/AppService.java | 12 +- .../service/BrokerService.java | 37 +- .../service/ConfigModelService.java | 74 ++- .../service/ConnectorRequestService.java | 32 +- .../service/ConnectorService.java | 48 +- .../service/EndpointService.java | 85 ++- .../service/ResourceService.java | 142 ++-- .../service/UtilService.java | 17 +- .../model/ResourceRepresentation.java | 51 -- .../configmanager/config/SecurityConfig.java | 4 +- .../entities/config/BrokerStatus.java | 9 - .../CustomGenericEndpointRepository.java | 12 - .../EndpointInformationRepository.java | 10 - .../RouteDeployMethodRepository.java | 11 - .../routedeploymethod/DeployMethod.java | 12 - .../clients/DefaultConnectorClient.java | 25 +- .../DataspaceConnectorClient.java | 612 ++++++++++-------- .../dataspaceconnector/DispatchRequest.java | 20 + .../dataspaceconnector/ResourceMapper.java} | 63 +- .../model/BackendSource.java | 18 +- .../model/ResourceIDPair.java | 7 +- .../model/ResourceMetadata.java | 27 +- .../model/ResourceRepresentation.java | 34 + .../model/repos/ResourceIDPairRepository.java | 4 +- .../ConnectorRequestUIController.java | 100 --- .../ResourceContractUIController.java | 123 ---- .../controller/UtilUIController.java | 82 --- .../model/config/BrokerStatus.java | 9 + .../config/ConfigModelObject.java | 15 +- .../config/CustomBroker.java | 14 +- .../configlists/ConfigModelRepository.java | 4 +- .../configlists/CustomAppRepository.java | 4 +- .../configlists/CustomBrokerRepository.java | 4 +- .../CustomGenericEndpointList.java | 17 +- .../CustomGenericEndpointRepository.java | 11 + .../EndpointInformationRepository.java | 10 + .../RouteDeployMethodRepository.java | 10 + .../converter/ConfigModelConverter.java | 4 +- .../converter/EndpointConverter.java | 4 +- .../customapp/CustomApp.java | 13 +- .../customapp/CustomAppEndpoint.java | 4 +- .../customgenericendpoint/BackendConfig.java | 13 +- .../CustomGenericEndpointObject.java | 2 +- .../endpointinfo/EndpointInformation.java | 2 +- .../model/routedeploymethod/DeployMethod.java | 12 + .../routedeploymethod/RouteDeployMethod.java | 5 +- .../isst/configmanager/util/CalenderUtil.java | 2 - .../isst/configmanager/util/OkHttpUtils.java | 23 +- .../isst/configmanager/util/Utility.java | 15 +- .../configmanager/util/ValidateApiInput.java | 2 +- src/main/resources/application.properties | 4 +- .../api_test/BrokerUIAPITest.java | 12 +- .../service_test/BrokerServiceTest.java | 2 +- .../isst/configmanager/util/TestUtil.java | 2 +- src/test/resources/application.properties | 2 +- 80 files changed, 2018 insertions(+), 1634 deletions(-) rename src/main/java/de/fraunhofer/isst/configmanager/{controller/AppUIApi.java => api/AppApi.java} (91%) rename src/main/java/de/fraunhofer/isst/configmanager/{controller => api}/AppRouteApi.java (91%) rename src/main/java/de/fraunhofer/isst/configmanager/{controller/BrokerUIApi.java => api/BrokerApi.java} (91%) rename src/main/java/de/fraunhofer/isst/configmanager/{controller => api}/ConfigModelApi.java (97%) rename src/main/java/de/fraunhofer/isst/configmanager/{controller/ConnectorUIApi.java => api/ConnectorApi.java} (90%) rename src/main/java/de/fraunhofer/isst/configmanager/{controller => api}/ConnectorRequestApi.java (84%) rename src/main/java/de/fraunhofer/isst/configmanager/{controller/EndpointUIApi.java => api/EndpointApi.java} (89%) rename src/main/java/de/fraunhofer/isst/configmanager/{controller/ResourceUIApi.java => api/ResourceApi.java} (83%) rename src/main/java/de/fraunhofer/isst/configmanager/{controller => api}/ResourceContractApi.java (96%) rename src/main/java/de/fraunhofer/isst/configmanager/{controller => api}/ResourceRepresentationApi.java (89%) create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/api/UtilApi.java rename src/main/java/de/fraunhofer/isst/configmanager/{controller/AppUIController.java => api/controller/AppController.java} (62%) rename src/main/java/de/fraunhofer/isst/configmanager/{controller/AppRouteUIController.java => api/controller/AppRouteController.java} (56%) rename src/main/java/de/fraunhofer/isst/configmanager/{controller/BrokerUIController.java => api/controller/BrokerController.java} (70%) rename src/main/java/de/fraunhofer/isst/configmanager/{ => api}/controller/ConfigModelController.java (75%) rename src/main/java/de/fraunhofer/isst/configmanager/{controller/ConnectorUIController.java => api/controller/ConnectorController.java} (71%) create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java rename src/main/java/de/fraunhofer/isst/configmanager/{controller/EndpointUIController.java => api/controller/EndpointController.java} (56%) create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java rename src/main/java/de/fraunhofer/isst/configmanager/{controller/ResourceUIController.java => api/controller/ResourceController.java} (53%) rename src/main/java/de/fraunhofer/isst/configmanager/{controller/ResourceRepresentationUIController.java => api/controller/ResourceRepresentationController.java} (60%) create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/api/controller/UtilController.java rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement => api}/service/AppRouteService.java (89%) rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement => api}/service/AppService.java (88%) rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement => api}/service/BrokerService.java (89%) rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement => api}/service/ConfigModelService.java (80%) rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement => api}/service/ConnectorRequestService.java (68%) rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement => api}/service/ConnectorService.java (80%) rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement => api}/service/EndpointService.java (67%) rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement => api}/service/ResourceService.java (80%) rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement => api}/service/UtilService.java (81%) delete mode 100644 src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/model/ResourceRepresentation.java delete mode 100644 src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/config/BrokerStatus.java delete mode 100644 src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/CustomGenericEndpointRepository.java delete mode 100644 src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/EndpointInformationRepository.java delete mode 100644 src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/RouteDeployMethodRepository.java delete mode 100644 src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/routedeploymethod/DeployMethod.java rename src/main/java/de/fraunhofer/isst/configmanager/{communication => connector}/clients/DefaultConnectorClient.java (93%) rename src/main/java/de/fraunhofer/isst/configmanager/{communication => connector}/dataspaceconnector/DataspaceConnectorClient.java (50%) create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DispatchRequest.java rename src/main/java/de/fraunhofer/isst/configmanager/{communication/dataspaceconnector/DataSpaceConnectorResourceMapper.java => connector/dataspaceconnector/ResourceMapper.java} (79%) rename src/main/java/de/fraunhofer/isst/configmanager/{communication => connector}/dataspaceconnector/model/BackendSource.java (73%) rename src/main/java/de/fraunhofer/isst/configmanager/{communication => connector}/dataspaceconnector/model/ResourceIDPair.java (75%) rename src/main/java/de/fraunhofer/isst/configmanager/{communication => connector}/dataspaceconnector/model/ResourceMetadata.java (65%) create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/ResourceRepresentation.java rename src/main/java/de/fraunhofer/isst/configmanager/{communication => connector}/dataspaceconnector/model/repos/ResourceIDPairRepository.java (74%) delete mode 100644 src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorRequestUIController.java delete mode 100644 src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceContractUIController.java delete mode 100644 src/main/java/de/fraunhofer/isst/configmanager/controller/UtilUIController.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/model/config/BrokerStatus.java rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement/entities => model}/config/ConfigModelObject.java (66%) rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement/entities => model}/config/CustomBroker.java (72%) rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement/entities => model}/configlists/ConfigModelRepository.java (55%) rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement/entities => model}/configlists/CustomAppRepository.java (54%) rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement/entities => model}/configlists/CustomBrokerRepository.java (54%) rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement/entities => model}/configlists/CustomGenericEndpointList.java (62%) create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointRepository.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/model/configlists/EndpointInformationRepository.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/model/configlists/RouteDeployMethodRepository.java rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement/entities => model}/converter/ConfigModelConverter.java (92%) rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement/entities => model}/converter/EndpointConverter.java (91%) rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement/entities => model}/customapp/CustomApp.java (60%) rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement/entities => model}/customapp/CustomAppEndpoint.java (71%) rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement/entities => model}/customgenericendpoint/BackendConfig.java (64%) rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement/entities => model}/customgenericendpoint/CustomGenericEndpointObject.java (84%) rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement/entities => model}/endpointinfo/EndpointInformation.java (91%) create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/model/routedeploymethod/DeployMethod.java rename src/main/java/de/fraunhofer/isst/configmanager/{configmanagement/entities => model}/routedeploymethod/RouteDeployMethod.java (86%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 072c939a..30bbe179 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,12 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Minor Change: New setting option to address the DSC via HTTP or HTTPS. dataspace.communication.ssl=true/false in application.properties and DATASPACE_COMMUNICATION_SSL=true/false in docker-compose environment. ### Changes +- Code and Architecture refactoring - Docker: The Java version to be used is now fixed in the Dockerfile +- If running infomodel-deserialize throws IOException, these are now explicitly logged in the DataspaceConnectorClient + +### Fixes +- POST /api​/ui​/broker​/register now return success:false if connector doesn't return 200 and GET /api​/ui​/brokers returns not registered in this case ## [6.0.0] - 2021-03-26 diff --git a/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java b/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java index ac4e6a9a..a47005bd 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java @@ -23,14 +23,16 @@ /** * Main class for starting the configuration manager application. */ -@SpringBootApplication -@EnableScheduling + @Slf4j +@EnableScheduling +@SpringBootApplication public class ConfigmanagerApplication { + public static final String CURRENT_VERSION = "6.1.0-SNAPSHOT"; public static void main(final String[] args) { + log.info("---- [ConfigmanagerApplication] Starting ConfigManager " + CURRENT_VERSION); log.info("---- [ConfigmanagerApplication] Used JVM charset (should be UTF-8): " + Charset.defaultCharset()); - SpringApplication.run(ConfigmanagerApplication.class, args); } @@ -42,10 +44,8 @@ public static void main(final String[] args) { */ @Bean public OpenAPI customOpenAPI() throws IOException { - final var properties = new Properties(); - try (InputStream inputStream = getClass().getClassLoader() - .getResourceAsStream("application.properties")) { + try (InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("application.properties")) { // This function may crash (e.g. ill-formatted file). Let it bubble up. properties.load(inputStream); } @@ -89,16 +89,16 @@ public ObjectMapper getObjectMapper() { return objectMapper; } - @Scheduled(fixedRate = 60000) + @Scheduled(fixedRate = 60_000) public void logInfoStillAlive() { - var currentVersion = "6.1.0-SNAPSHOT"; System.gc(); - var mb = 1024L * 1024L; - var currentHeapSize = Runtime.getRuntime().totalMemory() / mb; - var maxHeapSize = Runtime.getRuntime().maxMemory() / mb; - var freeHeapSize = Runtime.getRuntime().freeMemory() / mb; - log.info("[ConfigManager " + currentVersion + "] Heap Size Stats: Used " + Math.toIntExact(currentHeapSize) + " MB - Free " + Math.toIntExact(freeHeapSize) + " MB - Max " + Math.toIntExact(maxHeapSize) + " MB"); - log.info("[ConfigManager " + currentVersion + "] Waiting for API call..."); + final var mb = 1024L * 1024L; + final var currentHeapSize = Runtime.getRuntime().totalMemory() / mb; + final var maxHeapSize = Runtime.getRuntime().maxMemory() / mb; + final var freeHeapSize = Runtime.getRuntime().freeMemory() / mb; + final var threadCount = Thread.activeCount(); + log.info("[ConfigManager " + CURRENT_VERSION + "] Heap Size Stats: Used " + Math.toIntExact(currentHeapSize) + " MB - Free " + Math.toIntExact(freeHeapSize) + " MB - Max " + Math.toIntExact(maxHeapSize) + " MB - Running Threads: " + threadCount); + log.info("[ConfigManager " + CURRENT_VERSION + "] Waiting for API call..."); } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/AppUIApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/AppApi.java similarity index 91% rename from src/main/java/de/fraunhofer/isst/configmanager/controller/AppUIApi.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/AppApi.java index 5e209739..45dea672 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/AppUIApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/AppApi.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.controller; +package de.fraunhofer.isst.configmanager.api; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -7,8 +7,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; -public interface AppUIApi { - +public interface AppApi { @GetMapping(value = "/apps", produces = "application/ld+json") @Operation(summary = "Returns a list of all apps") @ApiResponses({@ApiResponse(responseCode = "200", description = "Returned a list of all apps")}) @@ -18,5 +17,4 @@ public interface AppUIApi { @Operation(summary = "Return an app") @ApiResponses({@ApiResponse(responseCode = "200", description = "Returned an app")}) ResponseEntity getApp(@RequestParam(value = "id") String id); - } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/AppRouteApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java similarity index 91% rename from src/main/java/de/fraunhofer/isst/configmanager/controller/AppRouteApi.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java index 2b7301c7..78d51174 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/AppRouteApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java @@ -1,17 +1,20 @@ -package de.fraunhofer.isst.configmanager.controller; +package de.fraunhofer.isst.configmanager.api; -import de.fraunhofer.isst.configmanager.configmanagement.entities.routedeploymethod.DeployMethod; +import de.fraunhofer.isst.configmanager.model.routedeploymethod.DeployMethod; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; public interface AppRouteApi { - // Interfaces for managing app routes @PostMapping(value = "/approute", produces = "application/ld+json") @Operation(summary = "Creates a new app route") @@ -66,8 +69,7 @@ ResponseEntity deleteAppRouteStep(@RequestParam(value = "routeId") URI r @GetMapping(value = "/approute/step/endpoint/info", produces = "application/ld+json") @Operation(summary = "Returns for a route step the specific endpoint information") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned for a route step " + - "the specific endpoint information")}) + @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned for a route step the specific endpoint information")}) ResponseEntity getEndpointInformation(@RequestParam(value = "routeId") URI routeId, @RequestParam(value = "endpointId") URI endpointId); @@ -87,5 +89,4 @@ ResponseEntity getEndpointInformation(@RequestParam(value = "routeId") U @Operation(summary = "Returns the route deploy method for all routes") @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned the route deploy method")}) ResponseEntity getRouteDeployMethod(); - } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/BrokerUIApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java similarity index 91% rename from src/main/java/de/fraunhofer/isst/configmanager/controller/BrokerUIApi.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java index a88cd816..3f47d89c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/BrokerUIApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java @@ -1,15 +1,18 @@ -package de.fraunhofer.isst.configmanager.controller; +package de.fraunhofer.isst.configmanager.api; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; -public interface BrokerUIApi { - +public interface BrokerApi { // APIs to manage custom broker @PostMapping(value = "/broker", produces = "application/ld+json") @Operation(summary = "Creates a new broker") @@ -74,8 +77,7 @@ ResponseEntity deleteResourceAtBroker(@RequestParam(value = "brokerUri") @GetMapping(value = "/broker/resource/information", produces = "application/ld+json") @Operation(summary = "Returns information about registration status for resources") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned information about" + - " registration status for resources")}) + @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned information about registration status for resources")}) ResponseEntity getRegisterStatusForResource(@RequestParam("resourceId") URI resourceId); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/ConfigModelApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConfigModelApi.java similarity index 97% rename from src/main/java/de/fraunhofer/isst/configmanager/controller/ConfigModelApi.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/ConfigModelApi.java index 887cd60f..8409200e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/ConfigModelApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConfigModelApi.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.controller; +package de.fraunhofer.isst.configmanager.api; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -12,7 +12,6 @@ import java.util.ArrayList; public interface ConfigModelApi { - @PutMapping(value = "/configmodel") @Operation(summary = "Updates the configuration model") @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully updated the configuration model")}) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorUIApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java similarity index 90% rename from src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorUIApi.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java index 1e6acb19..fdd1fb53 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorUIApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java @@ -1,13 +1,16 @@ -package de.fraunhofer.isst.configmanager.controller; +package de.fraunhofer.isst.configmanager.api; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -public interface ConnectorUIApi { +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; +public interface ConnectorApi { @GetMapping(value = "/connector", produces = "application/ld+json") @Operation(summary = "Get the Connector-Description") @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully retrieved the connector")}) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorRequestApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java similarity index 84% rename from src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorRequestApi.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java index d76b4bc5..dde4a887 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorRequestApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.controller; +package de.fraunhofer.isst.configmanager.api; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -11,20 +11,16 @@ import java.net.URI; public interface ConnectorRequestApi { - - // Endpoints for invoking external connector requests @PostMapping(value = "/request/description", produces = "application/ld+json") @Operation(summary = "Request metadata from another IDS connector.") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully requested metadata from " + - "IDS connector")}) + @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully requested metadata from IDS connector")}) ResponseEntity requestMetadata(@RequestParam("recipientId") URI recipientId, @RequestParam(value = "requestedResourceId", required = false) URI requestedResourceId); @PostMapping(value = "/request/contract", produces = "application/ld+json") @Operation(summary = "Send a contract request to another IDS connector.") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully send a contract request to another" + - " IDS connector.")}) + @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully send a contract request to another IDS connector")}) ResponseEntity requestContract(@RequestParam("recipientId") URI recipientId, @RequestParam(value = "requestedArtifactId ") URI requestedArtifactId, @RequestBody(required = false) String contractOffer); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/EndpointUIApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java similarity index 89% rename from src/main/java/de/fraunhofer/isst/configmanager/controller/EndpointUIApi.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java index 2f1a6c4a..5e025faa 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/EndpointUIApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java @@ -1,16 +1,18 @@ -package de.fraunhofer.isst.configmanager.controller; +package de.fraunhofer.isst.configmanager.api; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; -public interface EndpointUIApi { - - // APIs to manage the generic endpoints +public interface EndpointApi { @PostMapping(value = "/generic/endpoint", produces = "application/ld+json") @Operation(summary = "Creates a generic endpoint") @ApiResponses({@ApiResponse(responseCode = "200", description = "Created a generic endpoint")}) @@ -41,7 +43,6 @@ ResponseEntity updateGenericEndpoint(@RequestParam(value = "id") URI id, @RequestParam(value = "username", required = false) String username, @RequestParam(value = "password", required = false) String password); - // APIs to manage the connector endpoints @GetMapping(value = "/connector/endpoints", produces = "application/ld+json") @Operation(summary = "Returns the connector endpoints") @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned the connector endpoints")}) @@ -60,8 +61,6 @@ ResponseEntity getConnectorEndpointsFromClient(@RequestParam("accessUrl" @PostMapping(value = "/connector/endpoint", produces = "application/ld+json") @Operation(summary = "Creates a new connector endpoint for the connector") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully created the connector endpoint " + - "for the connector")}) + @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully created the connector endpoint for the connector")}) ResponseEntity createConnectorEndpoint(@RequestParam("accessUrl") String accessUrl); - } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceUIApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java similarity index 83% rename from src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceUIApi.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java index 7ba659ef..e7a9f221 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceUIApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java @@ -1,20 +1,22 @@ -package de.fraunhofer.isst.configmanager.controller; +package de.fraunhofer.isst.configmanager.api; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; import java.util.ArrayList; -public interface ResourceUIApi { - +public interface ResourceApi { @GetMapping(value = "/resource", produces = "application/ld+json") @Operation(summary = "Returns the specific resource from the connector") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned the specifc resource " + - "from the connector")}) + @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned the specifc resource from the connector")}) ResponseEntity getResource(@RequestParam(value = "resourceId") URI resourceId); @GetMapping(value = "/resources", produces = "application/ld+json") @@ -29,14 +31,13 @@ public interface ResourceUIApi { @GetMapping(value = "/resource/json", produces = "application/ld+json") @Operation(summary = "Returns the specific resource from the connector in JSON format") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned the specific resource " + - "from the connector in JSON format")}) + @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned the specific resource " + + "from the connector in JSON format")}) ResponseEntity getResourceInJson(@RequestParam(value = "resourceId") URI resourceId); @PostMapping(value = "/resource", produces = "application/ld+json") @Operation(summary = "Creates a resource for the connector") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully created a resource for the" + - " connector")}) + @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully created a resource for the connector")}) ResponseEntity createResource(@RequestParam("title") String title, @RequestParam("description") String description, @RequestParam("language") String language, @@ -47,8 +48,7 @@ ResponseEntity createResource(@RequestParam("title") String title, @PutMapping(value = "/resource", produces = "application/ld+json") @Operation(summary = "Updates the specific resource at the connector") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully updated the specific resource at the " + - "connector")}) + @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully updated the specific resource at the connector")}) ResponseEntity updateResource(@RequestParam("resourceId") URI resourceId, @RequestParam(value = "title", required = false) String title, @RequestParam(value = "description", required = false) String description, @@ -60,8 +60,6 @@ ResponseEntity updateResource(@RequestParam("resourceId") URI resourceId @DeleteMapping(value = "/resource") @Operation(summary = "Deletes the specific resource from the connector") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully deleted the specific resource from " + - "the connector")}) + @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully deleted the specific resource from the connector")}) ResponseEntity deleteResource(@RequestParam(value = "resourceId") URI resourceId); - } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceContractApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java similarity index 96% rename from src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceContractApi.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java index 0370bb12..8c6f7c75 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceContractApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.controller; +package de.fraunhofer.isst.configmanager.api; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; @@ -12,7 +12,6 @@ import java.net.URI; public interface ResourceContractApi { - @GetMapping(value = "/resource/contract", produces = "application/ld+json") @Operation(summary = "Returns the contract from a resource") @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned the contract from the resource")}) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceRepresentationApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java similarity index 89% rename from src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceRepresentationApi.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java index cbfcdb11..c1406947 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceRepresentationApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java @@ -1,15 +1,18 @@ -package de.fraunhofer.isst.configmanager.controller; +package de.fraunhofer.isst.configmanager.api; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; public interface ResourceRepresentationApi { - @PostMapping(value = "/resource/representation", produces = "application/ld+json") @Operation(summary = "Creates a representation for a resource") @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully created a representation for a resource")}) @@ -38,8 +41,7 @@ ResponseEntity updateResourceRepresentation(@RequestParam("resourceId") @GetMapping(value = "/resource/representation/json", produces = "application/ld+json") @Operation(summary = "Get the representation for a resource in JSON format") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully get the representation for a resource" + - " in JSON format")}) + @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully get the representation for a resource in JSON format")}) ResponseEntity getResourceRepresentationInJson(@RequestParam("resourceId") URI resourceId, @RequestParam("representationId") URI representationId); @@ -48,6 +50,4 @@ ResponseEntity getResourceRepresentationInJson(@RequestParam("resourceId @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully deleted the representation for a resource")}) ResponseEntity deleteResourceRepresentation(@RequestParam("resourceId") URI resourceId, @RequestParam("representationId") URI representationId); - - } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/UtilApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/UtilApi.java new file mode 100644 index 00000000..7ca5519c --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/UtilApi.java @@ -0,0 +1,22 @@ +package de.fraunhofer.isst.configmanager.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +public interface UtilApi { + @GetMapping(value = "/api/ui/enum/{enumName}") + @Operation(summary = "Get the specific enum") + @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully get the enums")}) + ResponseEntity getSpecificEnum(@PathVariable String enumName); + + @PostMapping(value = "/policy-pattern") + @Operation(summary = "Get pattern of policy") + @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully get the pattern of policy")}) + ResponseEntity getPolicyPattern(@RequestBody String policy); +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/AppUIController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppController.java similarity index 62% rename from src/main/java/de/fraunhofer/isst/configmanager/controller/AppUIController.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppController.java index 9898525e..6f8834d9 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/AppUIController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppController.java @@ -1,8 +1,9 @@ -package de.fraunhofer.isst.configmanager.controller; +package de.fraunhofer.isst.configmanager.api.controller; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import de.fraunhofer.isst.configmanager.configmanagement.service.AppService; +import de.fraunhofer.isst.configmanager.api.AppApi; +import de.fraunhofer.isst.configmanager.api.service.AppService; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; @@ -13,19 +14,18 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +@Slf4j @RestController @RequestMapping("/api/ui") -@Tag(name = "App Management", description = "Endpoints for managing the app in the configuration " + - "manager") -@Slf4j +@Tag(name = "App Management", description = "Endpoints for managing the app in the configuration manager") @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -public class AppUIController implements AppUIApi { +public class AppController implements AppApi { transient AppService appService; transient ObjectMapper objectMapper; @Autowired - public AppUIController(final AppService appService, final ObjectMapper objectMapper) { + public AppController(final AppService appService, final ObjectMapper objectMapper) { this.appService = appService; this.objectMapper = objectMapper; } @@ -38,20 +38,23 @@ public AppUIController(final AppService appService, final ObjectMapper objectMap @Override public ResponseEntity getApps() { log.info(">> GET /apps"); + ResponseEntity response; final var customAppList = appService.getApps(); if (!customAppList.isEmpty()) { try { - return ResponseEntity.ok(objectMapper.writeValueAsString(customAppList)); + response = ResponseEntity.ok(objectMapper.writeValueAsString(customAppList)); } catch (JsonProcessingException e) { log.error(e.getMessage(), e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Problems " + - "while parsing to json"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Problems while parsing to json"); } } else { - return ResponseEntity.badRequest().body("Could not find any app"); + response = ResponseEntity.badRequest().body("Could not find any app"); } + + return response; } /** @@ -63,20 +66,22 @@ public ResponseEntity getApps() { @Override public ResponseEntity getApp(final String id) { log.info(">> GET /app id: " + id); + ResponseEntity response; final var customApp = appService.getApp(id); if (customApp != null) { try { - return ResponseEntity.ok(objectMapper.writeValueAsString(customApp)); + response = ResponseEntity.ok(objectMapper.writeValueAsString(customApp)); } catch (JsonProcessingException e) { log.error(e.getMessage(), e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Problems " + - "while parsing to json"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Problems while parsing to json"); } } else { - return ResponseEntity.badRequest().body("Could not get app with id: " + id); + response = ResponseEntity.badRequest().body("Could not get app with id: " + id); } + return response; } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/AppRouteUIController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java similarity index 56% rename from src/main/java/de/fraunhofer/isst/configmanager/controller/AppRouteUIController.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java index 0c05b905..0abb8541 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/AppRouteUIController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java @@ -1,16 +1,16 @@ -package de.fraunhofer.isst.configmanager.controller; +package de.fraunhofer.isst.configmanager.api.controller; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import de.fraunhofer.iais.eis.AppRoute; import de.fraunhofer.iais.eis.AppRouteImpl; import de.fraunhofer.iais.eis.RouteStepImpl; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; -import de.fraunhofer.isst.configmanager.configmanagement.entities.configlists.RouteDeployMethodRepository; -import de.fraunhofer.isst.configmanager.configmanagement.entities.routedeploymethod.DeployMethod; -import de.fraunhofer.isst.configmanager.configmanagement.entities.routedeploymethod.RouteDeployMethod; -import de.fraunhofer.isst.configmanager.configmanagement.service.AppRouteService; -import de.fraunhofer.isst.configmanager.configmanagement.service.ConfigModelService; +import de.fraunhofer.isst.configmanager.api.AppRouteApi; +import de.fraunhofer.isst.configmanager.model.configlists.RouteDeployMethodRepository; +import de.fraunhofer.isst.configmanager.model.routedeploymethod.DeployMethod; +import de.fraunhofer.isst.configmanager.model.routedeploymethod.RouteDeployMethod; +import de.fraunhofer.isst.configmanager.api.service.AppRouteService; +import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; import de.fraunhofer.isst.configmanager.util.Utility; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AccessLevel; @@ -26,19 +26,18 @@ import java.io.IOException; import java.net.URI; -import java.util.ArrayList; /** - * The controller class implements the AppRouteApi and offers the possibilities to manage + * The api class implements the AppRouteApi and offers the possibilities to manage * the app routes in the configuration manager. */ +@Slf4j @RestController @RequestMapping("/api/ui") -@Tag(name = "App Route Management", description = "Endpoints for managing the app routes in the " + - "configuration manager") -@Slf4j +@Tag(name = "App Route Management", description = "Endpoints for managing the app routes in the configuration manager") @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -public class AppRouteUIController implements AppRouteApi { +public class AppRouteController implements AppRouteApi { + transient ConfigModelService configModelService; transient AppRouteService appRouteService; transient Serializer serializer; @@ -46,11 +45,11 @@ public class AppRouteUIController implements AppRouteApi { transient ObjectMapper objectMapper; @Autowired - public AppRouteUIController(final ConfigModelService configModelService, - final AppRouteService appRouteService, - final Serializer serializer, - final RouteDeployMethodRepository routeDeployMethodRepository, - final ObjectMapper objectMapper) { + public AppRouteController(final ConfigModelService configModelService, + final AppRouteService appRouteService, + final Serializer serializer, + final RouteDeployMethodRepository routeDeployMethodRepository, + final ObjectMapper objectMapper) { this.configModelService = configModelService; this.appRouteService = appRouteService; this.serializer = serializer; @@ -73,22 +72,26 @@ public AppRouteUIController(final ConfigModelService configModelService, @Override public ResponseEntity createAppRoute(final String description) { log.info(">> POST /approute description: " + description); + ResponseEntity response; + final var appRoute = appRouteService.createAppRoute(description); if (appRoute != null) { final var jsonObject = new JSONObject(); jsonObject.put("id", appRoute.getId().toString()); jsonObject.put("message", "Created a new app route successfully"); - log.info("---- [AppRouteUIController createAppRoute] Created app route successfully"); - return ResponseEntity.ok(jsonObject.toJSONString()); + log.info("---- [AppRouteController createAppRoute] Created app route successfully"); + response = ResponseEntity.ok(jsonObject.toJSONString()); } else { - log.info("---- [AppRouteUIController createAppRoute] Could not create app route"); - return ResponseEntity.badRequest().body("Could not create an app route"); + log.info("---- [AppRouteController createAppRoute] Could not create app route"); + response = ResponseEntity.badRequest().body("Could not create an app route"); } + + return response; } /** - * This method updates an app route + * This method updates an app route. * * @param routeId id of the app route * @param description description of the app route @@ -97,21 +100,23 @@ public ResponseEntity createAppRoute(final String description) { @Override public ResponseEntity updateAppRoute(final URI routeId, final String description) { log.info(">> PUT /approute routeId: " + routeId + " description: " + description); + ResponseEntity response; final boolean updated = appRouteService.updateAppRoute(routeId, description); if (updated) { - log.info("---- [AppRouteUIController updateAppRoute] App route with id: " + routeId + " is updated."); - return ResponseEntity.ok(Utility.jsonMessage("message", - "App route with id: " + routeId + " is updated.")); + log.info("---- [AppRouteController updateAppRoute] App route with id: " + routeId + " is updated."); + response = ResponseEntity.ok(Utility.jsonMessage("message", "App route with id: " + routeId + " is updated.")); } else { - log.info("---- [AppRouteUIController updateAppRoute] Could not update app route with id: " + routeId); - return ResponseEntity.badRequest().body("Could not update app route with id: " + routeId); + log.info("---- [AppRouteController updateAppRoute] Could not update app route with id: " + routeId); + response = ResponseEntity.badRequest().body("Could not update app route with id: " + routeId); } + + return response; } /** - * This method deletes an app route + * This method deletes an app route. * * @param routeId id of the app route * @return a suitable http response depending on success @@ -119,20 +124,23 @@ public ResponseEntity updateAppRoute(final URI routeId, final String des @Override public ResponseEntity deleteAppRoute(final URI routeId) { log.info(">> DELETE /approute routeId: " + routeId); + ResponseEntity response; final boolean deleted = appRouteService.deleteAppRoute(routeId); + if (deleted) { - log.info("---- [AppRouteUIController deleteAppRoute] App route with id: " + routeId + " is deleted."); - return ResponseEntity.ok(Utility.jsonMessage("message", - "App route with id: " + routeId + " is deleted.")); + log.info("---- [AppRouteController deleteAppRoute] App route with id: " + routeId + " is deleted."); + response = ResponseEntity.ok(Utility.jsonMessage("message", "App route with id: " + routeId + " is deleted.")); } else { - log.info("---- [AppRouteUIController deleteAppRoute] Could not delete app route with id: " + routeId); - return ResponseEntity.badRequest().body("Could not delete app route with id: " + routeId); + log.info("---- [AppRouteController deleteAppRoute] Could not delete app route with id: " + routeId); + response = ResponseEntity.badRequest().body("Could not delete app route with id: " + routeId); } + + return response; } /** - * This method returns a specific app route + * This method returns a specific app route. * * @param routeId id of the app route * @return a suitable http response depending on success @@ -140,54 +148,59 @@ public ResponseEntity deleteAppRoute(final URI routeId) { @Override public ResponseEntity getAppRoute(final URI routeId) { log.info(">> GET /approute routeId: " + routeId); + ResponseEntity response; final var appRoute = appRouteService.getAppRoute(routeId); if (appRoute != null) { try { final var appRouteString = serializer.serialize(appRoute); - log.info("---- [AppRouteUIController getAppRoute] Returning app route"); - return ResponseEntity.ok(appRouteString); + log.info("---- [AppRouteController getAppRoute] Returning app route"); + response = ResponseEntity.ok(appRouteString); } catch (IOException e) { - log.error("---- [AppRouteUIController getAppRoute] Problem while serializing app route!"); + log.error("---- [AppRouteController getAppRoute] Problem while serializing app route!"); log.error(e.getMessage(), e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Could not " + - "serialize app route to jsonld"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Could not serialize app route to jsonld"); } } else { - log.info("---- [AppRouteUIController getAppRoute] Could not get app route with id: " + routeId); - return ResponseEntity.badRequest().body("Could not get app route with id: " + routeId); + log.info("---- [AppRouteController getAppRoute] Could not get app route with id: " + routeId); + response = ResponseEntity.badRequest().body("Could not get app route with id: " + routeId); } + return response; } /** - * This method returns a list of app routes + * This method returns a list of app routes. * * @return a suitable http response depending on success */ @Override public ResponseEntity getAppRoutes() { log.info(">> GET /approutes"); + ResponseEntity response; final var appRouteList = appRouteService.getAppRoutes(); + try { if (appRouteList == null) { - log.info("---- [AppRouteUIController getAppRoutes] Returning empty list since no app routes are present"); - return ResponseEntity.ok(objectMapper.writeValueAsString(new JSONArray())); + log.info("---- [AppRouteController getAppRoutes] Returning empty list since no app routes are present"); + response = ResponseEntity.ok(objectMapper.writeValueAsString(new JSONArray())); } else { - log.info("---- [AppRouteUIController getAppRoutes] Returning list of app routes"); - return ResponseEntity.ok(serializer.serialize(appRouteList)); + log.info("---- [AppRouteController getAppRoutes] Returning list of app routes"); + response = ResponseEntity.ok(serializer.serialize(appRouteList)); } } catch (IOException e) { - log.error("---- [AppRouteUIController getAppRoutes] Problem while serializing app routes list!"); + log.error("---- [AppRouteController getAppRoutes] Problem while serializing app routes list!"); log.error(e.getMessage(), e); - return ResponseEntity.badRequest().body("Problems while serializing"); + response = ResponseEntity.badRequest().body("Problems while serializing"); } + + return response; } /** - * This method creates a route step for an app route with the given parameters + * This method creates a route step for an app route with the given parameters. * * @param routeId id of the route * @param startId id of the start endpoint @@ -206,11 +219,12 @@ public ResponseEntity createAppRouteStep(final URI routeId, final URI st final int endCoordinateX, final int endCoordinateY, final URI resourceId) { - log.info(">> POST /approute/step routeId: " + routeId + " startId: " + startId + " " + - "startCoordinateX: " + startCoordinateX - + " startCoordinateY: " + startCoordinateY + " endID: " + endID + " " + - "endCoordinateX: " + endCoordinateX + log.info(">> POST /approute/step routeId: " + routeId + " startId: " + startId + + " startCoordinateX: " + startCoordinateX + + " startCoordinateY: " + startCoordinateY + " endID: " + endID + + " endCoordinateX: " + endCoordinateX + " endCoordinateY: " + endCoordinateY + " resourceId: " + resourceId); + ResponseEntity response; final var routeStep = appRouteService.createAppRouteStep(routeId, startId, startCoordinateX, startCoordinateY, @@ -220,16 +234,19 @@ public ResponseEntity createAppRouteStep(final URI routeId, final URI st final var jsonObject = new JSONObject(); jsonObject.put("routeStepId", routeStep.getId().toString()); jsonObject.put("message", "Successfully created the route step"); - log.info("---- [AppRouteUIController createAppRouteStep] Successfully created the route step"); - return ResponseEntity.ok(jsonObject.toJSONString()); + + log.info("---- [AppRouteController createAppRouteStep] Successfully created the route step"); + response = ResponseEntity.ok(jsonObject.toJSONString()); } else { - log.warn("---- [AppRouteUIController createAppRouteStep] Could not create the route step"); - return ResponseEntity.badRequest().body("Could not create the route step"); + log.warn("---- [AppRouteController createAppRouteStep] Could not create the route step"); + response = ResponseEntity.badRequest().body("Could not create the route step"); } + + return response; } /** - * This method deletes a route step + * This method deletes a route step. * * @param routeId id of the app route * @param routeStepId id of the route step @@ -238,19 +255,23 @@ public ResponseEntity createAppRouteStep(final URI routeId, final URI st @Override public ResponseEntity deleteAppRouteStep(final URI routeId, final URI routeStepId) { log.info(">> DELETE /approute/step routeId: " + routeId + " routeStepId: " + routeStepId); + ResponseEntity response; final boolean deleted = appRouteService.deleteAppRouteStep(routeId, routeStepId); + if (deleted) { - log.info("---- [AppRouteUIController deleteAppRouteStep] Successfully deleted the route step with id:" + routeStepId); - return ResponseEntity.ok("Successfully deleted the route step with id: " + routeStepId); + log.info("---- [AppRouteController deleteAppRouteStep] Successfully deleted the route step with id:" + routeStepId); + response = ResponseEntity.ok("Successfully deleted the route step with id: " + routeStepId); } else { - log.warn("---- [AppRouteUIController deleteAppRouteStep] Could not delete the route step"); - return ResponseEntity.badRequest().body("---- Could not delete the route step"); + log.warn("---- [AppRouteController deleteAppRouteStep] Could not delete the route step"); + response = ResponseEntity.badRequest().body("---- Could not delete the route step"); } + + return response; } /** - * This method returns a specific route step + * This method returns a specific route step. * * @param routeId id of the app route * @param routeStepId id of the route step @@ -259,27 +280,30 @@ public ResponseEntity deleteAppRouteStep(final URI routeId, final URI ro @Override public ResponseEntity getAppRouteStep(final URI routeId, final URI routeStepId) { log.info(">> GET /approute/step routeId: " + routeId + " routeStepId: " + routeStepId); + ResponseEntity response; final var routeStep = appRouteService.getSubroute(routeId, routeStepId); + if (routeStep != null) { try { final var routeStepString = serializer.serialize(routeStep); - log.info("---- [AppRouteUIController getAppRouteStep] Route step found"); - return ResponseEntity.ok(routeStepString); + log.info("---- [AppRouteController getAppRouteStep] Route step found"); + response = ResponseEntity.ok(routeStepString); } catch (IOException e) { - log.error("---- [AppRouteUIController getAppRouteStep] Problem while serializing route step!"); + log.error("---- [AppRouteController getAppRouteStep] Problem while serializing route step!"); log.error(e.getMessage(), e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Could not " + - "serialize the route step"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Could not serialize the route step"); } } else { - log.warn("---- [AppRouteUIController getAppRouteStep] Route step is null"); - return ResponseEntity.badRequest().body("Could not get the route step"); + log.warn("---- [AppRouteController getAppRouteStep] Route step is null"); + response = ResponseEntity.badRequest().body("Could not get the route step"); } + + return response; } /** - * This method returns information regarding the endpoint + * This method returns information regarding the endpoint. * * @param routeId id of the app route * @param endpointId id of the endpoint @@ -288,24 +312,26 @@ public ResponseEntity getAppRouteStep(final URI routeId, final URI route @Override public ResponseEntity getEndpointInformation(final URI routeId, final URI endpointId) { log.info(">> GET /approute/step/endpoint/info routeId: " + routeId + " endpointId: " + endpointId); + ResponseEntity response; + + final var endpointInformation = appRouteService.getEndpointInformation(routeId, endpointId); - final var endpointInformation = appRouteService.getEndpointInformation(routeId, - endpointId); if (endpointInformation != null) { try { final var endpointInfo = objectMapper.writeValueAsString(endpointInformation); - log.info("---- [AppRouteUIController getEndpointInformation Returning endpoint information"); - return ResponseEntity.ok(endpointInfo); + log.info("---- [AppRouteController getEndpointInformation Returning endpoint information"); + response = ResponseEntity.ok(endpointInfo); } catch (JsonProcessingException e) { - log.error("---- [AppRouteUIController getEndpointInformation Could not parse endpoint Information to JSON!"); + log.error("---- [AppRouteController getEndpointInformation Could not parse endpoint Information to JSON!"); log.error(e.getMessage(), e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Could not " + - "parse endpoint information to JSON"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Could not parse endpoint information to JSON"); } } else { - log.warn("---- [AppRouteUIController getEndpointInformation] Endpoint Information is null"); - return ResponseEntity.badRequest().body("Could not get endpoint information"); + log.warn("---- [AppRouteController getEndpointInformation] Endpoint Information is null"); + response = ResponseEntity.badRequest().body("Could not get endpoint information"); } + + return response; } /** @@ -314,26 +340,30 @@ public ResponseEntity getEndpointInformation(final URI routeId, final UR @Override public ResponseEntity getAllEndpointInfo() { log.info(">> GET /approute/step/endpoints/info"); + ResponseEntity response; final var endpointInformations = appRouteService.getAllEndpointInfo(); + if (endpointInformations != null) { try { final var endpointInfos = objectMapper.writeValueAsString(endpointInformations); - log.info("---- [AppRouteUIController getAllEndpointInfo] Returning all endpoint information"); - return ResponseEntity.ok(endpointInfos); + log.info("---- [AppRouteController getAllEndpointInfo] Returning all endpoint information"); + response = ResponseEntity.ok(endpointInfos); } catch (JsonProcessingException e) { - log.error("---- [AppRouteUIController getAllEndpointInfo] Could not parse endpoint informations to JSON!"); + log.error("---- [AppRouteController getAllEndpointInfo] Could not parse endpoint informations to JSON!"); log.error(e.getMessage(), e); - return ResponseEntity.badRequest().body("Could not parse endpoint information to " + - "JSON"); + response = ResponseEntity.badRequest().body("Could not parse endpoint information to JSON"); } + } else { + log.info("---- [AppRouteController getAllEndpointInfo] Endpoint information list is null"); + response = ResponseEntity.badRequest().body("Could not get endpoint information"); } - log.info("---- [AppRouteUIController getAllEndpointInfo] Endpoint information list is null"); - return ResponseEntity.badRequest().body("Could not get endpoint information"); + + return response; } /** - * This method updates the route deploy method of all app route and route steps + * This method updates the route deploy method of all app route and route steps. * * @param deployMethod route deploy method * @return a suitable http response depending on success @@ -341,60 +371,71 @@ public ResponseEntity getAllEndpointInfo() { @Override public ResponseEntity updateRouteDeployMethod(final DeployMethod deployMethod) { log.info(">> PUT /route/deploymethod deployMethod: " + deployMethod); + ResponseEntity response; if (routeDeployMethodRepository.count() != 0) { final var existingDeployMethod = routeDeployMethodRepository.findAll().get(0); existingDeployMethod.setDeployMethod(deployMethod); + routeDeployMethodRepository.save(existingDeployMethod); + // Updates the deploy method from the app routes and route steps updateDeployMethodFromRoutes(deployMethod); - log.info("---- [AppRouteUIController updateRouteDeployMethod] Updated successfully the route deploy method"); - return ResponseEntity.ok("Updated successfully the route deploy method"); + + log.info("---- [AppRouteController updateRouteDeployMethod] Updated successfully the route deploy method"); + + response = ResponseEntity.ok("Updated successfully the route deploy method"); } else { - log.warn("---- [AppRouteUIController updateRouteDeployMethod] Could not update the route deploy method"); - return ResponseEntity.badRequest().body("Could not update the route deploy method"); + log.warn("---- [AppRouteController updateRouteDeployMethod] Could not update the route deploy method"); + response = ResponseEntity.badRequest().body("Could not update the route deploy method"); } + + return response; } /** - * This method returns the route deploy method + * This method returns the route deploy method. * * @return a suitable http response depending on success */ @Override public ResponseEntity getRouteDeployMethod() { log.info(">> GET /route/deploymethod"); + ResponseEntity response; final var routeDeployMethods = routeDeployMethodRepository.findAll(); + try { - log.info("Returning the deploy route method"); - return ResponseEntity.ok(objectMapper.writeValueAsString(routeDeployMethods)); + log.info("---- [AppRouteController getRouteDeployMethod] Returning the deploy route method"); + response = ResponseEntity.ok(objectMapper.writeValueAsString(routeDeployMethods)); } catch (JsonProcessingException e) { - log.error("Could not get deploy method from the app routes!"); + log.error("---- [AppRouteController getRouteDeployMethod] Could not get deploy method from the app routes!"); log.error(e.getMessage(), e); - return ResponseEntity.badRequest().body("Could not get deploy method from the app " + - "routes"); + response = ResponseEntity.badRequest().body("Could not get deploy method from the app routes"); } + + return response; } /** - * This method updates the deploy method from every app route and route step + * This method updates the deploy method from every app route and route step. * * @param deployMethod deploy method of the route */ private void updateDeployMethodFromRoutes(final DeployMethod deployMethod) { - final var appRouteList = - (ArrayList) configModelService.getConfigModel().getAppRoute(); + log.info("---- [AppRouteController updateDeployMethodFromRoutes] Updating deploymethod for every app route and route step..."); + + final var appRouteList = configModelService.getConfigModel().getAppRoute(); if (appRouteList != null) { // Update deploy method from app routes - for (var appRoute : appRouteList) { + for (final var appRoute : appRouteList) { if (appRoute != null) { final var appRouteImpl = (AppRouteImpl) appRoute; appRouteImpl.setRouteDeployMethod(deployMethod.toString()); // Update deploy method from route steps if (appRoute.getHasSubRoute() != null) { - for (var routeStep : appRoute.getHasSubRoute()) { + for (final var routeStep : appRoute.getHasSubRoute()) { if (routeStep != null) { final var routeStepImpl = (RouteStepImpl) routeStep; routeStepImpl.setRouteDeployMethod(deployMethod.toString()); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/BrokerUIController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java similarity index 70% rename from src/main/java/de/fraunhofer/isst/configmanager/controller/BrokerUIController.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java index 54644d6c..d90cf48d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/BrokerUIController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java @@ -1,10 +1,11 @@ -package de.fraunhofer.isst.configmanager.controller; +package de.fraunhofer.isst.configmanager.api.controller; import com.fasterxml.jackson.databind.ObjectMapper; import de.fraunhofer.iais.eis.Resource; -import de.fraunhofer.isst.configmanager.communication.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.configmanagement.entities.config.BrokerStatus; -import de.fraunhofer.isst.configmanager.configmanagement.service.BrokerService; +import de.fraunhofer.isst.configmanager.api.BrokerApi; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; +import de.fraunhofer.isst.configmanager.model.config.BrokerStatus; +import de.fraunhofer.isst.configmanager.api.service.BrokerService; import de.fraunhofer.isst.configmanager.util.Utility; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AccessLevel; @@ -22,24 +23,24 @@ import java.net.URI; /** - * The controller class implements the BrokerAPI and offers the possibilities to manage + * The api class implements the BrokerAPI and offers the possibilities to manage * the brokers in the configuration manager. */ +@Slf4j @RestController @RequestMapping("/api/ui") -@Tag(name = "Broker Management", description = "Endpoints for managing the brokers in the " + - "configuration manager") -@Slf4j +@Tag(name = "Broker Management", description = "Endpoints for managing the brokers in the configuration manager") @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -public class BrokerUIController implements BrokerUIApi { +public class BrokerController implements BrokerApi { + transient BrokerService brokerService; transient DefaultConnectorClient client; transient ObjectMapper objectMapper; @Autowired - public BrokerUIController(final BrokerService brokerService, - final DefaultConnectorClient client, - final ObjectMapper objectMapper) { + public BrokerController(final BrokerService brokerService, + final DefaultConnectorClient client, + final ObjectMapper objectMapper) { this.brokerService = brokerService; this.client = client; this.objectMapper = objectMapper; @@ -55,15 +56,17 @@ public BrokerUIController(final BrokerService brokerService, @Override public ResponseEntity createBroker(final URI brokerUri, final String title) { log.info(">> POST /broker brokerUri: " + brokerUri + " title: " + title); + ResponseEntity response; final var brokerObject = brokerService.createCustomBroker(brokerUri, title); if (brokerObject != null) { - return ResponseEntity.ok(Utility.jsonMessage("message", "Created a new broker with " + - "id: " + brokerUri)); + response = ResponseEntity.ok(Utility.jsonMessage("message", "Created a new broker with id: " + brokerUri)); } else { - return ResponseEntity.badRequest().body("Could not create a broker"); + response = ResponseEntity.badRequest().body("Could not create a broker"); } + + return response; } /** @@ -76,15 +79,18 @@ public ResponseEntity createBroker(final URI brokerUri, final String tit @Override public ResponseEntity updateBroker(final URI brokerId, final String title) { log.info(">> PUT /broker brokerId: " + brokerId + " title: " + title); + ResponseEntity response; if (brokerService.updateBroker(brokerId, title)) { final var jsonObject = new JSONObject(); jsonObject.put("message", "Updated the broker"); jsonObject.put("brokerId", brokerId.toString()); - return ResponseEntity.ok(jsonObject.toJSONString()); + response = ResponseEntity.ok(jsonObject.toJSONString()); } else { - return ResponseEntity.badRequest().body("Could not update the broker"); + response = ResponseEntity.badRequest().body("Could not update the broker"); } + + return response; } /** @@ -96,13 +102,15 @@ public ResponseEntity updateBroker(final URI brokerId, final String titl @Override public ResponseEntity deleteBroker(final URI brokerUri) { log.info(">> DELETE /broker brokerUri " + brokerUri); + ResponseEntity response; if (brokerService.deleteBroker(brokerUri)) { - return ResponseEntity.ok(Utility.jsonMessage("message", - "Broker with ID: " + brokerUri + " is deleted")); + response = ResponseEntity.ok(Utility.jsonMessage("message", "Broker with ID: " + brokerUri + " is deleted")); } else { - return ResponseEntity.badRequest().body("Could not delete the broker with the id:" + brokerUri); + response = ResponseEntity.badRequest().body("Could not delete the broker with the id:" + brokerUri); } + + return response; } /** @@ -114,17 +122,22 @@ public ResponseEntity deleteBroker(final URI brokerUri) { @Override public ResponseEntity getBroker(final URI brokerId) { log.info(">> GET /broker brokerId: " + brokerId); + ResponseEntity response; final var broker = brokerService.getById(brokerId); if (broker != null) { try { - return ResponseEntity.ok(objectMapper.writeValueAsString(broker)); + response = ResponseEntity.ok(objectMapper.writeValueAsString(broker)); } catch (IOException e) { + response = ResponseEntity.badRequest().body("Could not get the specific broker"); log.error(e.getMessage(), e); } + } else { + response = ResponseEntity.badRequest().body("Could not get the specific broker"); } - return ResponseEntity.badRequest().body("Could not get the specific broker"); + + return response; } /** @@ -135,14 +148,18 @@ public ResponseEntity getBroker(final URI brokerId) { @Override public ResponseEntity getAllBrokers() { log.info(">> GET /brokers"); + ResponseEntity response; final var brokers = brokerService.getCustomBrokers(); + try { - return new ResponseEntity<>(objectMapper.writeValueAsString(brokers), HttpStatus.OK); + response = new ResponseEntity<>(objectMapper.writeValueAsString(brokers), HttpStatus.OK); } catch (IOException e) { log.error(e.getMessage(), e); + response = new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } - return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + + return response; } /** @@ -153,13 +170,17 @@ public ResponseEntity getAllBrokers() { @Override public ResponseEntity getAllBrokerUris() { log.info(">> GET /broker/list"); + ResponseEntity response; final var brokerUris = brokerService.getAllBrokerUris(); + if (brokerUris != null) { - return ResponseEntity.ok(brokerUris.toString()); + response = ResponseEntity.ok(brokerUris.toString()); } else { - return ResponseEntity.badRequest().body("Could not return the uri list of brokers"); + response = ResponseEntity.badRequest().body("Could not return the uri list of brokers"); } + + return response; } /** @@ -171,28 +192,32 @@ public ResponseEntity getAllBrokerUris() { @Override public ResponseEntity registerConnector(final URI brokerUri) { log.info(">> POST /broker/register brokerUri: " + brokerUri); + ResponseEntity response; final var broker = brokerService.getById(brokerUri); final var jsonObject = new JSONObject(); + if (broker != null) { try { - final var response = client.updateAtBroker(brokerUri.toString()); - if (!response.contains("RejectionMessage")) { + final var clientResponse = client.updateAtBroker(brokerUri.toString()); + if (clientResponse.isSuccessful()) { brokerService.sentSelfDescToBroker(brokerUri); brokerService.setBrokerStatus(brokerUri, BrokerStatus.REGISTERED); jsonObject.put("success", true); } else { jsonObject.put("success", false); } - return ResponseEntity.ok(jsonObject.toJSONString()); + response = ResponseEntity.ok(jsonObject.toJSONString()); } catch (IOException e) { log.error(e.getMessage(), e); jsonObject.put("success", false); - return ResponseEntity.ok(jsonObject.toJSONString()); + response = ResponseEntity.ok(jsonObject.toJSONString()); } } else { - return ResponseEntity.badRequest().body("Could not find the broker"); + response = ResponseEntity.badRequest().body("Could not find the broker"); } + + return response; } /** @@ -204,28 +229,32 @@ public ResponseEntity registerConnector(final URI brokerUri) { @Override public ResponseEntity unregisterConnector(final URI brokerUri) { log.info(">> POST /broker/unregister brokerUri: " + brokerUri); + ResponseEntity response; final var broker = brokerService.getById(brokerUri); final var jsonObject = new JSONObject(); + if (broker != null) { try { - final var response = client.unregisterAtBroker(brokerUri.toString()); - if (!response.contains("RejectionMessage")) { + final var clientResponse = client.unregisterAtBroker(brokerUri.toString()); + if (!clientResponse.contains("RejectionMessage")) { brokerService.unregisteredAtBroker(brokerUri); brokerService.setBrokerStatus(brokerUri, BrokerStatus.UNREGISTERED); jsonObject.put("success", true); } else { jsonObject.put("success", false); } - return ResponseEntity.ok(jsonObject.toJSONString()); + response = ResponseEntity.ok(jsonObject.toJSONString()); } catch (IOException e) { log.error(e.getMessage(), e); jsonObject.put("success", false); - return ResponseEntity.ok(jsonObject.toJSONString()); + response = ResponseEntity.ok(jsonObject.toJSONString()); } } else { - return ResponseEntity.badRequest().body("Could not find the broker"); + response = ResponseEntity.badRequest().body("Could not find the broker"); } + + return response; } /** @@ -237,24 +266,28 @@ public ResponseEntity unregisterConnector(final URI brokerUri) { @Override public ResponseEntity updateConnector(final URI brokerUri) { log.info(">> POST /broker/update brokerUri: " + brokerUri); + ResponseEntity response; final var broker = brokerService.getById(brokerUri); final var jsonObject = new JSONObject(); + if (broker != null) { try { - final var response = client.updateAtBroker(brokerUri.toString()); - jsonObject.put("success", !response.contains("RejectionMessage")); - if (!response.contains("RejectionMessage")) { + final var clientResponse = client.updateAtBroker(brokerUri.toString()); + jsonObject.put("success", clientResponse.isSuccessful()); + if (clientResponse.isSuccessful()) { brokerService.sentSelfDescToBroker(brokerUri); } - return ResponseEntity.ok(jsonObject.toJSONString()); + response = ResponseEntity.ok(jsonObject.toJSONString()); } catch (IOException e) { log.error(e.getMessage(), e); - return ResponseEntity.badRequest().body("Could not connect to the Connector!"); + response = ResponseEntity.badRequest().body("Could not connect to the Connector!"); } } else { - return ResponseEntity.badRequest().body("Could not find the broker with URI: " + brokerUri); + response = ResponseEntity.badRequest().body("Could not find the broker with URI: " + brokerUri); } + + return response; } /** @@ -265,11 +298,13 @@ public ResponseEntity updateConnector(final URI brokerUri) { * @return HTTP response entity with the response as body string */ @Override - public ResponseEntity updateResourceAtBroker(final URI brokerUri, - final URI resourceId) { + public ResponseEntity updateResourceAtBroker(final URI brokerUri, final URI resourceId) { log.info(">> POST /broker/update/resource brokerUri: " + brokerUri + " resourceId: " + resourceId); - return updateConnector(brokerUri); + ResponseEntity response; + response = updateConnector(brokerUri); + + return response; // var broker = brokerService.getById(brokerUri); // var jsonObject = new JSONObject(); @@ -278,7 +313,7 @@ public ResponseEntity updateResourceAtBroker(final URI brokerUri, // String response = client.updateResourceAtBroker(brokerUri.toString(), resourceId); // if (response.contains("RejectionMessage") || response.equals("Could not load // resource.") -// || response.equals("The communication with the broker failed.")) { +// || response.equals("The connector with the broker failed.")) { // jsonObject.put("success", false); // } else { // brokerService.setResourceAtBroker(brokerUri, resourceId); @@ -303,8 +338,7 @@ public ResponseEntity updateResourceAtBroker(final URI brokerUri, * @return HTTP response entity with the response as body string */ @Override - public ResponseEntity deleteResourceAtBroker(final URI brokerUri, - final URI resourceId) { + public ResponseEntity deleteResourceAtBroker(final URI brokerUri, final URI resourceId) { log.info(">> POST /broker/delete/resource brokerUri: " + brokerUri + " resourceId: " + resourceId); final var response = updateConnector(brokerUri); @@ -322,7 +356,7 @@ public ResponseEntity deleteResourceAtBroker(final URI brokerUri, // String response = client.deleteResourceAtBroker(brokerUri.toString(), resourceId); // if (response.contains("RejectionMessage") || response.equals("Could not load // resource.") -// || response.equals("The communication with the broker failed.")) { +// || response.equals("The connector with the broker failed.")) { // jsonObject.put("success", false); // } else { // brokerService.deleteResourceAtBroker(brokerUri, resourceId); @@ -340,7 +374,7 @@ public ResponseEntity deleteResourceAtBroker(final URI brokerUri, } /** - * This method returns the register status for a resource + * This method returns the register status for a resource. * * @param resourceId id of the resource * @return a suitable http response depending on success @@ -348,13 +382,17 @@ public ResponseEntity deleteResourceAtBroker(final URI brokerUri, @Override public ResponseEntity getRegisterStatusForResource(final URI resourceId) { log.info(">> GET /broker/resource/information resourceId: " + resourceId); + ResponseEntity response; final var jsonObjet = brokerService.getRegisStatusForResource(resourceId); + if (jsonObjet == null) { - return ResponseEntity.ok(new JSONArray().toJSONString()); + response = ResponseEntity.ok(new JSONArray().toJSONString()); } else { - return ResponseEntity.ok(jsonObjet.toJSONString()); + response = ResponseEntity.ok(jsonObjet.toJSONString()); } + + return response; } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/ConfigModelController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java similarity index 75% rename from src/main/java/de/fraunhofer/isst/configmanager/controller/ConfigModelController.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java index 7f60c212..2669365a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/ConfigModelController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java @@ -1,10 +1,11 @@ -package de.fraunhofer.isst.configmanager.controller; +package de.fraunhofer.isst.configmanager.api.controller; import de.fraunhofer.iais.eis.ConfigurationModelImpl; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.iais.eis.util.Util; -import de.fraunhofer.isst.configmanager.communication.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.configmanagement.service.ConfigModelService; +import de.fraunhofer.isst.configmanager.api.ConfigModelApi; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; +import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; @@ -21,16 +22,16 @@ import java.util.ArrayList; /** - * The controller class implements the ConfigModelApi and offers the possibilities to manage + * The api class implements the ConfigModelApi and offers the possibilities to manage * the configuration model in the configuration manager. */ +@Slf4j @RestController @RequestMapping("/api/ui") -@Slf4j -@Tag(name = "ConfigModel Management", description = "Endpoints for managing the configuration " + - "model") +@Tag(name = "ConfigModel Management", description = "Endpoints for managing the configuration model") @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) public class ConfigModelController implements ConfigModelApi { + transient Serializer serializer; transient ConfigModelService configModelService; transient DefaultConnectorClient client; @@ -68,48 +69,48 @@ public ResponseEntity updateConfigModel(final String loglevel, final String keyStorePassword, final String proxyUri, final ArrayList noProxyUriList, - final String username, final String password) { + final String username, + final String password) { log.info(">> PUT /configmodel loglevel: " + loglevel + " connectorDeployMode: " + connectorDeployMode + " trustStore: " + trustStore - + " trustStorePassword: " + trustStorePassword + " keyStore: " + keyStore + " " + - "keyStorePassword: " + keyStorePassword + " proxyUri: " + proxyUri - + " username: " + username + " password: " + password); + + " keyStore: " + keyStore + " proxyUri: " + proxyUri + " username: " + username); + + ResponseEntity response; final var result = configModelService.updateConfigurationModel(loglevel, connectorDeployMode, trustStore, trustStorePassword, keyStore, keyStorePassword, proxyUri, noProxyUriList, username, password); + if (result) { final var jsonObject = new JSONObject(); - jsonObject.put("message", "Successfully updated the configuration model in the " + - "configuration manager"); + jsonObject.put("message", "Successfully updated the configuration model in the " + + "configuration manager"); try { // The configuration model is sent to the client without the app routes at this - // point, - // because of the different infomodels. - final var configurationModel = - (ConfigurationModelImpl) configModelService.getConfigModel(); + // point, because of the different infomodels. + final var configurationModel = (ConfigurationModelImpl) configModelService.getConfigModel(); configurationModel.setAppRoute(Util.asList()); + final var valid = client.sendConfiguration(serializer.serialize(configurationModel)); + if (valid) { - jsonObject.put("connectorResponse", "Successfully updated the configuration " + - "model at the client"); - return ResponseEntity.ok(jsonObject.toJSONString()); + jsonObject.put("connectorResponse", "Successfully updated the configuration model at the client"); + response = ResponseEntity.ok(jsonObject.toJSONString()); } else { - jsonObject.put("connectorResponse", "Failed to update the configuration model" + - " at the client"); - return ResponseEntity.badRequest().body(jsonObject.toJSONString()); + jsonObject.put("connectorResponse", "Failed to update the configuration model at the client"); + response = ResponseEntity.badRequest().body(jsonObject.toJSONString()); } } catch (IOException e) { log.error(e.getMessage(), e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Problems " + - "while sending configuration" + - " to the client"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Problems while sending configuration to the connector!"); } } else { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Failed to update the " + - "configuration model"); + response = ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Failed to update the configuration model"); } + + return response; } /** @@ -120,12 +121,16 @@ public ResponseEntity updateConfigModel(final String loglevel, @Override public ResponseEntity getConfigModel() { log.info(">> GET /configmodel"); + ResponseEntity response; + try { - return ResponseEntity.ok(serializer.serialize(configModelService.getConfigModel())); + response = ResponseEntity.ok(serializer.serialize(configModelService.getConfigModel())); } catch (IOException e) { log.error(e.getMessage(), e); - return ResponseEntity.badRequest().body("Could not determine the configuration model"); + response = ResponseEntity.badRequest().body("Could not determine the configuration model"); } + + return response; } /** diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorUIController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java similarity index 71% rename from src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorUIController.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java index 23126885..72413d20 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorUIController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java @@ -1,12 +1,13 @@ -package de.fraunhofer.isst.configmanager.controller; +package de.fraunhofer.isst.configmanager.api.controller; import de.fraunhofer.iais.eis.BaseConnector; import de.fraunhofer.iais.eis.ConfigurationModelImpl; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.iais.eis.util.Util; -import de.fraunhofer.isst.configmanager.communication.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.configmanagement.service.ConfigModelService; -import de.fraunhofer.isst.configmanager.configmanagement.service.ConnectorService; +import de.fraunhofer.isst.configmanager.api.ConnectorApi; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; +import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; +import de.fraunhofer.isst.configmanager.api.service.ConnectorService; import de.fraunhofer.isst.configmanager.util.Utility; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AccessLevel; @@ -22,26 +23,26 @@ import java.io.IOException; /** - * The controller class implements the ConnectorUIApi and offers the possibilities to manage + * The api class implements the ConnectorApi and offers the possibilities to manage * the connectors in the configuration manager. */ +@Slf4j @RestController @RequestMapping("/api/ui") -@Slf4j -@Tag(name = "Connector Management", description = "Endpoints for managing the connectors in the " + - "configuration manager") +@Tag(name = "Connector Management", description = "Endpoints for managing the connectors in the configuration manager") @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -public class ConnectorUIController implements ConnectorUIApi { +public class ConnectorController implements ConnectorApi { + transient ConnectorService connectorService; transient ConfigModelService configModelService; transient Serializer serializer; transient DefaultConnectorClient client; @Autowired - public ConnectorUIController(final ConnectorService connectorService, - final ConfigModelService configModelService, - final Serializer serializer, - final DefaultConnectorClient client) { + public ConnectorController(final ConnectorService connectorService, + final ConfigModelService configModelService, + final Serializer serializer, + final DefaultConnectorClient client) { this.configModelService = configModelService; this.connectorService = connectorService; this.serializer = serializer; @@ -56,16 +57,22 @@ public ConnectorUIController(final ConnectorService connectorService, @Override public ResponseEntity getConnector() { log.info(">> GET /connector"); + ResponseEntity response; final var connector = configModelService.getConfigModel().getConnectorDescription(); + if (connector != null) { try { - return new ResponseEntity<>(serializer.serialize(connector), HttpStatus.OK); + response = new ResponseEntity<>(serializer.serialize(connector), HttpStatus.OK); } catch (IOException e) { log.error(e.getMessage(), e); + response = new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } + } else { + response = new ResponseEntity<>(HttpStatus.NOT_FOUND); } - return new ResponseEntity<>(HttpStatus.NOT_FOUND); + + return response; } /** @@ -76,22 +83,26 @@ public ResponseEntity getConnector() { @Override public ResponseEntity getConnectorStatus() { log.info(">> GET /connector/status"); + ResponseEntity response; final var json = new JSONObject(); + try { client.getConnectorStatus(); - log.info("---- [ConnectorUIController getConnectorStatus] Could connect to the Connector!"); + log.info("---- [ConnectorController getConnectorStatus] Could connect to the Connector!"); - json.put("status","Public connector endpoint reachable."); - return new ResponseEntity<>(json.toString(), HttpStatus.OK); + json.put("status", "Public connector endpoint reachable."); + response = new ResponseEntity<>(json.toString(), HttpStatus.OK); } catch (Exception e) { //Error case does not need to be processed further here - log.warn("---- [ConnectorUIController getConnectorStatus] Could not connect to the Connector!"); + log.warn("---- [ConnectorController getConnectorStatus] Could not connect to the Connector!"); - json.put("status","Public connector endpoint not reachable."); - return new ResponseEntity<>(json.toString(), HttpStatus.SERVICE_UNAVAILABLE); + json.put("status", "Public connector endpoint not reachable."); + response = new ResponseEntity<>(json.toString(), HttpStatus.SERVICE_UNAVAILABLE); } + + return response; } /** @@ -103,14 +114,12 @@ public ResponseEntity getConnectorStatus() { public ResponseEntity getConnectorJson() { log.info(">> GET /connector/json"); - final var baseConnector = - (BaseConnector) configModelService.getConfigModel().getConnectorDescription(); + final var baseConnector = (BaseConnector) configModelService.getConfigModel().getConnectorDescription(); final var baseConnectorJson = new JSONObject(); baseConnectorJson.put("title", baseConnector.getTitle().get(0).getValue()); baseConnectorJson.put("description", baseConnector.getDescription().get(0).getValue()); - baseConnectorJson.put("endpointAccessURL", - baseConnector.getHasDefaultEndpoint().getAccessURL().toString()); + baseConnectorJson.put("endpointAccessURL", baseConnector.getHasDefaultEndpoint().getAccessURL().toString()); baseConnectorJson.put("version", baseConnector.getVersion()); baseConnectorJson.put("curator", baseConnector.getCurator().toString()); baseConnectorJson.put("maintainer", baseConnector.getMaintainer().toString()); @@ -146,15 +155,15 @@ public ResponseEntity createConnector(final String title, final String d final var baseConnector = connectorService.createConnector(title, description, endpointAccessURL, version, - curator, maintainer, inboundModelVersion, outboundModelVersion); + curator, maintainer, inboundModelVersion, + outboundModelVersion); final var configModelImpl = (ConfigurationModelImpl) configModelService.getConfigModel(); configModelImpl.setConnectorDescription(baseConnector); configModelService.saveState(); - return ResponseEntity.ok(Utility.jsonMessage("message", "Successfully created a new " + - "connector with the id: " + - baseConnector.getId().toString())); + return ResponseEntity.ok(Utility + .jsonMessage("message", "Successfully created a new connector with the id: " + baseConnector.getId().toString())); } /** @@ -182,57 +191,66 @@ public ResponseEntity updateConnector(final String title, final String d + " version: " + version + " curator: " + curator + " maintainer: " + maintainer + " inboundModelVersion: " + inboundModelVersion + " outboundModelVersion: " + outboundModelVersion); + ResponseEntity response; + final boolean updated = connectorService.updateConnector(title, description, endpointAccessURL, version, curator, maintainer, inboundModelVersion, outboundModelVersion); + final var jsonObject = new JSONObject(); + if (updated) { jsonObject.put("message", "Successfully updated the connector"); - final var configurationModel = - (ConfigurationModelImpl) configModelService.getConfigModel(); + final var configurationModel = (ConfigurationModelImpl) configModelService.getConfigModel(); + if (configurationModel.getAppRoute() != null) { configurationModel.setAppRoute(Util.asList()); } + try { final var valid = client.sendConfiguration(serializer.serialize(configurationModel)); + if (valid) { - jsonObject.put("connectorResponse", "Successfully updated the connector " + - "description of the configuration model"); - return ResponseEntity.ok(jsonObject.toJSONString()); + jsonObject.put("connectorResponse", "Successfully updated the connector " + + "description of the configuration model"); + response = ResponseEntity.ok(jsonObject.toJSONString()); } else { - jsonObject.put("connectorResponse", "Failed to update the connector. " + - "The configuration model is not valid"); - return ResponseEntity.badRequest().body(jsonObject.toJSONString()); + jsonObject.put("connectorResponse", "Failed to update the connector. " + + "The configuration model is not valid"); + response = ResponseEntity.badRequest().body(jsonObject.toJSONString()); } } catch (IOException e) { log.error(e.getMessage(), e); - jsonObject.put("connectorResponse", "Failed to send the new configuration to the " + - "client"); - return ResponseEntity.badRequest().body(jsonObject.toJSONString()); + jsonObject.put("connectorResponse", "Failed to send the new configuration to the client"); + response = ResponseEntity.badRequest().body(jsonObject.toJSONString()); } } else { - return ResponseEntity.badRequest().body("Could not update the connector"); + response = ResponseEntity.badRequest().body("Could not update the connector"); } + + return response; } /** - * This method deletes a connector from the configuration model + * This method deletes a connector from the configuration model. * * @return a suitable http response depending on success */ @Override public ResponseEntity deleteConnector() { log.info(">> DELETE /connector"); + ResponseEntity response; if (configModelService.getConfigModel().getConnectorDescription() != null) { final var configModelImpl = (ConfigurationModelImpl) configModelService.getConfigModel(); configModelImpl.setConnectorDescription(null); configModelService.saveState(); - return ResponseEntity.ok(Utility.jsonMessage("message", "Successfully deleted the " + - "connector")); + response = ResponseEntity.ok(Utility.jsonMessage("message", "Successfully deleted the connector")); } else { - return ResponseEntity.badRequest().body("Could not delete the connector"); + response = ResponseEntity.badRequest().body("Could not delete the connector"); } + + return response; } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java new file mode 100644 index 00000000..50af5463 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java @@ -0,0 +1,105 @@ +package de.fraunhofer.isst.configmanager.api.controller; + +import de.fraunhofer.iais.eis.ids.jsonld.Serializer; +import de.fraunhofer.isst.configmanager.api.ConnectorRequestApi; +import de.fraunhofer.isst.configmanager.api.service.ConnectorRequestService; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import net.minidev.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.net.URI; + +/** + * The api class implements the ConnectorRequestApi and offers the possibilities to manage + * the request to external connectors. + */ +@Slf4j +@RestController +@RequestMapping("/api/ui") +@Tag(name = "Connector Request Management", description = "Endpoints for managing connector requests") +public class ConnectorRequestController implements ConnectorRequestApi { + + private final transient ConnectorRequestService connectorRequestService; + private final transient Serializer serializer; + + @Autowired + public ConnectorRequestController(final ConnectorRequestService connectorRequestService, + final Serializer serializer) { + this.connectorRequestService = connectorRequestService; + this.serializer = serializer; + } + + /** + * This method request metadata from an IDS connector. + * + * @param recipientId uri of the requested IDS connector + * @param requestedResourceId uri of the requested resource + * @return if reqResourceId is set, then the resource will be returned otherwise the IDS connector + */ + @Override + public ResponseEntity requestMetadata(final URI recipientId, final URI requestedResourceId) { + log.info(">> POST /request/description recipientId: " + recipientId + " requestedResourceId: " + requestedResourceId); + ResponseEntity response; + + if (requestedResourceId != null) { + final var resource = connectorRequestService.requestResource(recipientId, requestedResourceId); + + if (resource != null) { + try { + response = ResponseEntity.ok(serializer.serialize(resource)); + } catch (IOException e) { + log.error(e.getMessage()); + response = ResponseEntity.badRequest().body("Problems while serializing the resource"); + } + } else { + response = ResponseEntity.badRequest().body("Could not get resource from the requested connector"); + } + } else { + final var resources = connectorRequestService.requestResourcesFromConnector(recipientId); + + if (!resources.isEmpty()) { + try { + response = ResponseEntity.ok(serializer.serialize(resources)); + } catch (IOException e) { + log.error(e.getMessage(), e); + response = ResponseEntity.badRequest().body("Problems while serializing the list of resources"); + } + } else { + response = ResponseEntity.badRequest().body("Could not get resources from the requested connector"); + } + } + return response; + } + + @Override + public ResponseEntity requestContract(final URI recipientId, + final URI requestedArtifactId, + final String contractOffer) { + log.info(">> POST /request/contract recipientId: " + recipientId + " requestedArtifactId: " + requestedArtifactId + " contractOffer: " + contractOffer); + ResponseEntity response; + + final var contractAgreementId = connectorRequestService + .requestContractAgreement(recipientId.toString(), requestedArtifactId.toString(), contractOffer); + + if (contractAgreementId != null) { + final var jsonObject = new JSONObject(); + + if (contractAgreementId.contains("Failed")) { + jsonObject.put("message", contractAgreementId); + response = ResponseEntity.badRequest().body(jsonObject.toJSONString()); + } else { + jsonObject.put("agreementId", contractAgreementId); + response = ResponseEntity.ok(jsonObject.toJSONString()); + } + } else { + response = ResponseEntity.badRequest().body("Could not get agreement id for the contract"); + } + + return response; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/EndpointUIController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java similarity index 56% rename from src/main/java/de/fraunhofer/isst/configmanager/controller/EndpointUIController.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java index 765960a9..c73444b8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/EndpointUIController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.controller; +package de.fraunhofer.isst.configmanager.api.controller; import com.fasterxml.jackson.databind.ObjectMapper; @@ -7,9 +7,10 @@ import de.fraunhofer.iais.eis.ConnectorEndpoint; import de.fraunhofer.iais.eis.ConnectorEndpointBuilder; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; -import de.fraunhofer.isst.configmanager.communication.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.configmanagement.service.ConfigModelService; -import de.fraunhofer.isst.configmanager.configmanagement.service.EndpointService; +import de.fraunhofer.isst.configmanager.api.EndpointApi; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; +import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; +import de.fraunhofer.isst.configmanager.api.service.EndpointService; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; @@ -27,15 +28,15 @@ import java.util.ArrayList; /** - * The controller class implements the EndpointUIApi and offers the possibilities to manage + * The api class implements the EndpointApi and offers the possibilities to manage * the endpoints in the configuration manager. */ +@Slf4j @RestController @RequestMapping("/api/ui") -@Slf4j @Tag(name = "Endpoints Management", description = "Different endpoint types can be managed here") @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -public class EndpointUIController implements EndpointUIApi { +public class EndpointController implements EndpointApi { transient Serializer serializer; transient ObjectMapper objectMapper; @@ -44,11 +45,11 @@ public class EndpointUIController implements EndpointUIApi { transient DefaultConnectorClient client; @Autowired - public EndpointUIController(Serializer serializer, - ObjectMapper objectMapper, - ConfigModelService configModelService, - EndpointService endpointService, - DefaultConnectorClient client) { + public EndpointController(final Serializer serializer, + final ObjectMapper objectMapper, + final ConfigModelService configModelService, + final EndpointService endpointService, + final DefaultConnectorClient client) { this.serializer = serializer; this.objectMapper = objectMapper; this.configModelService = configModelService; @@ -68,18 +69,21 @@ public EndpointUIController(Serializer serializer, public ResponseEntity createGenericEndpoint(final String accessURL, final String username, final String password) { - log.info(">> POST /generic/endpoint accessURL: " + accessURL + " username: " + username + " password: " + password); + log.info(">> POST /generic/endpoint accessURL: " + accessURL + " username: " + username); + ResponseEntity response; - final var genericEndpoint = - endpointService.createGenericEndpoint(accessURL, username, password); + final var genericEndpoint = endpointService.createGenericEndpoint(accessURL, username, password); if (genericEndpoint != null) { final var jsonObject = new JSONObject(); jsonObject.put("id", genericEndpoint.getId().toString()); jsonObject.put("message", "Created a new generic endpoint"); - return ResponseEntity.ok(jsonObject.toJSONString()); + + response = ResponseEntity.ok(jsonObject.toJSONString()); } else { - return ResponseEntity.badRequest().body("Could not create a generic endpoint"); + response = ResponseEntity.badRequest().body("Could not create a generic endpoint"); } + + return response; } /** @@ -90,15 +94,18 @@ public ResponseEntity createGenericEndpoint(final String accessURL, @Override public ResponseEntity getGenericEndpoints() { log.info(">> GET /generic/endpoints"); + ResponseEntity response; final var endpoints = endpointService.getGenericEndpoints(); + try { - return ResponseEntity.ok(serializer.serialize(endpoints)); + response = ResponseEntity.ok(serializer.serialize(endpoints)); } catch (IOException e) { log.error(e.getMessage(), e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Problems while " + - "serializing"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Problems while serializing"); } + + return response; } /** @@ -110,19 +117,22 @@ public ResponseEntity getGenericEndpoints() { @Override public ResponseEntity getGenericEndpoint(final URI endpointId) { log.info(">> GET /generic/endpoint endpointId: " + endpointId); + ResponseEntity response; final var genericEndpoint = endpointService.getGenericEndpoint(endpointId); + if (genericEndpoint != null) { try { - return ResponseEntity.ok(serializer.serialize(genericEndpoint)); + response = ResponseEntity.ok(serializer.serialize(genericEndpoint)); } catch (IOException e) { log.error(e.getMessage(), e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Problems " + - "while serializing"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Problems while serializing"); } } else { - return ResponseEntity.badRequest().body("Could not get the generic endpoint"); + response = ResponseEntity.badRequest().body("Could not get the generic endpoint"); } + + return response; } /** @@ -134,14 +144,17 @@ public ResponseEntity getGenericEndpoint(final URI endpointId) { @Override public ResponseEntity deleteGenericEndpoint(final URI endpointId) { log.info(">> DELETE /generic/endpoint endpointId: " + endpointId); + ResponseEntity response; + + final var deleted = endpointService.deleteGenericEndpoint(endpointId); - final boolean deleted = endpointService.deleteGenericEndpoint(endpointId); if (deleted) { - return ResponseEntity.ok("Deleted the generic endpoint with id: " + endpointId); + response = ResponseEntity.ok("Deleted the generic endpoint with id: " + endpointId); } else { - return ResponseEntity.badRequest().body("Could not delete the generic endpoint with " + - "id: " + endpointId); + response = ResponseEntity.badRequest().body("Could not delete the generic endpoint with id: " + endpointId); } + + return response; } /** @@ -156,18 +169,20 @@ public ResponseEntity deleteGenericEndpoint(final URI endpointId) { @Override public ResponseEntity updateGenericEndpoint(final URI endpointId, final String accessURL, - final String username, final String - password) { - log.info(">> PUT /generic/endpoint endpointId: " + endpointId + " accessURL: " + accessURL + " username: " + password); + final String username, + final String password) { + log.info(">> PUT /generic/endpoint endpointId: " + endpointId + " accessURL: " + accessURL); + ResponseEntity response; + + final var updated = endpointService.updateGenericEndpoint(endpointId, accessURL, username, password); - final boolean updated = endpointService.updateGenericEndpoint(endpointId, accessURL, username, - password); if (updated) { - return ResponseEntity.ok("Updated the generic endpoint with id: " + endpointId); + response = ResponseEntity.ok("Updated the generic endpoint with id: " + endpointId); } else { - return ResponseEntity.badRequest().body("Could not update the generic endpoint with " + - "id: " + endpointId); + response = ResponseEntity.badRequest().body("Could not update the generic endpoint with id: " + endpointId); } + + return response; } /** @@ -178,23 +193,26 @@ public ResponseEntity updateGenericEndpoint(final URI endpointId, @Override public ResponseEntity getConnectorEndpoints() { log.info(">> GET /connector/endpoints"); + ResponseEntity response; if (configModelService.getConfigModel().getConnectorDescription() == null) { - return ResponseEntity.badRequest().body("Could not get the connector"); - } - final var connector = configModelService.getConfigModel().getConnectorDescription(); - if (connector.getHasEndpoint() == null) { - return ResponseEntity.badRequest().body("Could not find any connector endpoints"); + response = ResponseEntity.badRequest().body("Could not get the connector"); } else { - try { - return ResponseEntity.ok(serializer.serialize(connector.getHasEndpoint())); - } catch (IOException e) { - log.error(e.getMessage(), e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Problems " + - "while serializing"); + final var connector = configModelService.getConfigModel().getConnectorDescription(); + + if (connector.getHasEndpoint() == null) { + response = ResponseEntity.badRequest().body("Could not find any connector endpoints"); + } else { + try { + response = ResponseEntity.ok(serializer.serialize(connector.getHasEndpoint())); + } catch (IOException e) { + log.error(e.getMessage(), e); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Problems while serializing"); + } } } + return response; } /** @@ -205,28 +223,37 @@ public ResponseEntity getConnectorEndpoints() { */ @Override public ResponseEntity getConnectorEndpoint(final URI connectorEndpointId) { + log.info(">> GET /connector/endpoint connectorEndpointId: " + connectorEndpointId); + ResponseEntity response; + if (configModelService.getConfigModel().getConnectorDescription() == null) { - return ResponseEntity.badRequest().body("Could not get the connector"); - } - final var connector = configModelService.getConfigModel().getConnectorDescription(); - if (connector.getHasEndpoint() == null) { - return ResponseEntity.badRequest().body("Could not find any connector endpoints"); + response = ResponseEntity.badRequest().body("Could not get the connector"); } else { - final var connectorEndpoint = connector.getHasEndpoint() - .stream() - .filter(connectorEndpoint1 -> connectorEndpoint1.getId().equals(connectorEndpointId)) - .findAny().orElse(null); - if (connectorEndpoint != null) { - try { - return ResponseEntity.ok(serializer.serialize(connectorEndpoint)); - } catch (IOException e) { - log.error(e.getMessage(), e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Problems" + - " while serializing"); + final var connector = configModelService.getConfigModel().getConnectorDescription(); + + if (connector.getHasEndpoint() == null) { + response = ResponseEntity.badRequest().body("Could not find any connector endpoints"); + } else { + final var connectorEndpoint = connector.getHasEndpoint() + .stream() + .filter(connectorEndpoint1 -> connectorEndpoint1.getId().equals(connectorEndpointId)) + .findAny() + .orElse(null); + + if (connectorEndpoint != null) { + try { + response = ResponseEntity.ok(serializer.serialize(connectorEndpoint)); + } catch (IOException e) { + log.error(e.getMessage(), e); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Problems while serializing"); + } + } else { + response = ResponseEntity.badRequest().body("Could not find any connector endpoint with id: " + connectorEndpointId); } } } - return ResponseEntity.badRequest().body("Could not find any connector endpoint with id: " + connectorEndpointId); + + return response; } /** @@ -238,27 +265,28 @@ public ResponseEntity getConnectorEndpoint(final URI connectorEndpointId * @return a suitable http response depending on success */ @Override - public ResponseEntity getConnectorEndpointsFromClient(final String accessUrl, - final String resourceId) { + public ResponseEntity getConnectorEndpointsFromClient(final String accessUrl, final String resourceId) { + log.info(">> GET /connector/endpoints/client accessUrl: " + accessUrl + " resourceId: " + resourceId); + ResponseEntity response; try { final var baseConnector = client.getBaseConnector(accessUrl, resourceId); + if (baseConnector == null) { - return ResponseEntity.badRequest().body("Could not determine the connector with " + - "the access url: " - + accessUrl); + response = ResponseEntity.badRequest().body("Could not determine the connector with the access url: " + accessUrl); } else { if (baseConnector.getHasEndpoint() == null) { - return ResponseEntity.ok(objectMapper.writeValueAsString(new JSONArray())); + response = ResponseEntity.ok(objectMapper.writeValueAsString(new JSONArray())); } else { - return ResponseEntity.ok(serializer.serialize(baseConnector.getHasEndpoint())); + response = ResponseEntity.ok(serializer.serialize(baseConnector.getHasEndpoint())); } } } catch (IOException e) { log.error(e.getMessage(), e); - return ResponseEntity.badRequest().body("Could not determine connector endpoints from" + - " client"); + response = ResponseEntity.badRequest().body("Could not determine connector endpoints from client"); } + + return response; } /** @@ -269,23 +297,26 @@ public ResponseEntity getConnectorEndpointsFromClient(final String acces */ @Override public ResponseEntity createConnectorEndpoint(final String accessUrl) { + log.info(">> POST /connector/endpoint accessUrl: " + accessUrl); final var configModelImpl = (ConfigurationModelImpl) configModelService.getConfigModel(); final var baseConnector = (BaseConnectorImpl) configModelImpl.getConnectorDescription(); + if (baseConnector.getHasEndpoint() == null) { baseConnector.setHasEndpoint(new ArrayList<>()); } - final var connectorEndpoints = - (ArrayList) baseConnector.getHasEndpoint(); - // Create Connector Endpoint - final var connectorEndpoint = - new ConnectorEndpointBuilder()._accessURL_(URI.create(accessUrl)).build(); - // Add Connector Endpoint in Connector + + final var connectorEndpoints = (ArrayList) baseConnector.getHasEndpoint(); + final var connectorEndpoint = new ConnectorEndpointBuilder()._accessURL_(URI.create(accessUrl)).build(); + connectorEndpoints.add(connectorEndpoint); configModelService.saveState(); + final var jsonObject = new JSONObject(); + jsonObject.put("connectorEndpointId", connectorEndpoint.getId().toString()); jsonObject.put("message", "Created a new connector endpoint for the connector"); + return ResponseEntity.ok(jsonObject.toJSONString()); } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java new file mode 100644 index 00000000..e4afc240 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java @@ -0,0 +1,121 @@ +package de.fraunhofer.isst.configmanager.api.controller; + +import de.fraunhofer.iais.eis.ContractOffer; +import de.fraunhofer.iais.eis.ids.jsonld.Serializer; +import de.fraunhofer.isst.configmanager.api.ResourceContractApi; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; +import de.fraunhofer.isst.configmanager.api.service.ResourceService; +import de.fraunhofer.isst.configmanager.util.ValidateApiInput; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; +import lombok.extern.slf4j.Slf4j; +import net.minidev.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.net.URI; + +/** + * The api class implements the ResourceContractApi and offers the possibilities to manage + * the contracts in a resource. + */ +@Slf4j +@RestController +@RequestMapping("/api/ui") +@Tag(name = "Resource contracts Management", description = "Endpoints for managing the contracts of a resource") +@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) +public class ResourceContractController implements ResourceContractApi { + + transient ResourceService resourceService; + transient Serializer serializer; + transient DefaultConnectorClient client; + + @Autowired + public ResourceContractController(final ResourceService resourceService, + final Serializer serializer, + final DefaultConnectorClient client) { + this.resourceService = resourceService; + this.serializer = serializer; + this.client = client; + } + + /** + * This method returns the contract from a specific resource. + * + * @param resourceId id of the resource + * @return a suitable http response depending on success + */ + @Override + public ResponseEntity getResourceContract(final URI resourceId) { + log.info(">> GET /resource/contract resourceId: " + resourceId); + ResponseEntity response; + + final var contractOffer = resourceService.getResourceContract(resourceId); + if (contractOffer != null) { + try { + response = ResponseEntity.ok(serializer.serialize(contractOffer)); + } catch (IOException e) { + log.error(e.getMessage(), e); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Problems while parsing serializing the contract offer"); + } + } else { + response = ResponseEntity.badRequest().body("Could not get the resource contract"); + } + + return response; + } + + /** + * This method updates the contract of a resource. + * + * @param resourceId id of the resource + * @param contractJson id of the contract + * @return a suitable http response depending on success + */ + @Override + public ResponseEntity updateResourceContract(final URI resourceId, final String contractJson) { + log.info(">> PUT /resource/contract resourceId: " + resourceId + " contractJson: " + contractJson); + ResponseEntity response; + + if ("{}".equals(contractJson) && ValidateApiInput.notValid(resourceId.toString())) { + response = ResponseEntity.badRequest().body("All validated parameter have undefined as value!"); + } else { + ContractOffer contractOffer; + + try { + contractOffer = serializer.deserialize(contractJson, ContractOffer.class); + + if (contractOffer != null) { + final var jsonObject = new JSONObject(); + + try { + jsonObject.put("resourceID", resourceId.toString()); + jsonObject.put("contractID", contractOffer.getId().toString()); + + final var clientResponse = client.updateResourceContract(resourceId.toString(), contractJson); + + resourceService.updateResourceContractInAppRoute(resourceId, contractOffer); + jsonObject.put("connectorResponse", clientResponse); + response = ResponseEntity.ok(jsonObject.toJSONString()); + } catch (IOException e) { + log.error(e.getMessage(), e); + jsonObject.put("message", "Problems while updating the contract at the connector"); + response = ResponseEntity.badRequest().body(jsonObject.toJSONString()); + } + } else { + response = ResponseEntity.badRequest().body("Could not update the resource representation"); + } + } catch (IOException e) { + log.error(e.getMessage(), e); + response = ResponseEntity.badRequest().body("Problems while deserializing the contract"); + } + } + + return response; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceUIController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java similarity index 53% rename from src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceUIController.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java index 6100165d..4ec61aca 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceUIController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java @@ -1,8 +1,9 @@ -package de.fraunhofer.isst.configmanager.controller; +package de.fraunhofer.isst.configmanager.api.controller; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; -import de.fraunhofer.isst.configmanager.communication.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.configmanagement.service.ResourceService; +import de.fraunhofer.isst.configmanager.api.ResourceApi; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; +import de.fraunhofer.isst.configmanager.api.service.ResourceService; import de.fraunhofer.isst.configmanager.util.ValidateApiInput; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AccessLevel; @@ -20,30 +21,30 @@ import java.util.ArrayList; /** - * The controller class implements the ResourceUIApi and offers the possibilities to manage + * The api class implements the ResourceApi and offers the possibilities to manage * the resources in the configuration manager. */ + +@Slf4j @RestController @RequestMapping("/api/ui") -@Slf4j -@Tag(name = "Resource Management", description = "Endpoints for managing the resource in the " + - "configuration manager") +@Tag(name = "Resource Management", description = "Endpoints for managing the resource in the configuration manager") @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -public class ResourceUIController implements ResourceUIApi { +public class ResourceController implements ResourceApi { transient ResourceService resourceService; transient DefaultConnectorClient client; transient Serializer serializer; @Autowired - public ResourceUIController(final ResourceService resourceService, - final DefaultConnectorClient client, final Serializer serializer) { + public ResourceController(final ResourceService resourceService, + final DefaultConnectorClient client, final Serializer serializer) { this.resourceService = resourceService; this.client = client; this.serializer = serializer; } /** - * This method returns a resource from the connector with the given paraemter. + * This method returns a resource from the connector with the given parameter. * * @param resourceId id of the resource * @return a suitable http response depending on success @@ -51,25 +52,26 @@ public ResourceUIController(final ResourceService resourceService, @Override public ResponseEntity getResource(final URI resourceId) { log.info(">> GET /resource resourceId: " + resourceId); + ResponseEntity response; if (ValidateApiInput.notValid(resourceId.toString())) { - return ResponseEntity.badRequest().body("All validated parameter have undefined as " + - "value!"); - } - - final var resource = resourceService.getResource(resourceId); + response = ResponseEntity.badRequest().body("All validated parameter have undefined as value!"); + } else { + final var resource = resourceService.getResource(resourceId); - if (resource != null) { - try { - return ResponseEntity.ok(serializer.serialize(resource)); - } catch (IOException e) { - log.error(e.getMessage(), e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Could not " + - "serialize resource!"); + if (resource != null) { + try { + response = ResponseEntity.ok(serializer.serialize(resource)); + } catch (IOException e) { + log.error(e.getMessage(), e); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Could not serialize resource!"); + } + } else { + response = ResponseEntity.badRequest().body("Could not determine the resource"); } - } else { - return ResponseEntity.badRequest().body("Could not determine the resource"); } + + return response; } /** @@ -98,23 +100,25 @@ public ResponseEntity getRequestedResources() { @Override public ResponseEntity getResourceInJson(final URI resourceId) { log.info(">> GET /resource/json resourceId: " + resourceId); + ResponseEntity response; if (ValidateApiInput.notValid(resourceId.toString())) { - return ResponseEntity.badRequest().body("All validated parameter have undefined as " + - "value!"); - } + response = ResponseEntity.badRequest().body("All validated parameter have undefined as value!"); + } else { + final var resource = resourceService.getResource(resourceId); - final var resource = resourceService.getResource(resourceId); + final var resourceJson = new JSONObject(); + resourceJson.put("title", resource.getTitle().get(0).getValue()); + resourceJson.put("description", resource.getDescription().get(0).getValue()); + resourceJson.put("keyword", resource.getKeyword()); + resourceJson.put("version", resource.getVersion()); + resourceJson.put("standardlicense", resource.getStandardLicense().toString()); + resourceJson.put("publisher", resource.getPublisher().toString()); - final var resourceJson = new JSONObject(); - resourceJson.put("title", resource.getTitle().get(0).getValue()); - resourceJson.put("description", resource.getDescription().get(0).getValue()); - resourceJson.put("keyword", resource.getKeyword()); - resourceJson.put("version", resource.getVersion()); - resourceJson.put("standardlicense", resource.getStandardLicense().toString()); - resourceJson.put("publisher", resource.getPublisher().toString()); + response = ResponseEntity.ok(resourceJson.toJSONString()); + } - return ResponseEntity.ok(resourceJson.toJSONString()); + return response; } /** @@ -128,23 +132,28 @@ public ResponseEntity getResourceInJson(final URI resourceId) { @Override public ResponseEntity deleteResource(final URI resourceId) { log.info(">> DELETE /resource resourceId: " + resourceId); + ResponseEntity response; if (ValidateApiInput.notValid(resourceId.toString())) { - return ResponseEntity.badRequest().body("All validated parameter have undefined as " + - "value!"); - } + response = ResponseEntity.badRequest().body("All validated parameter have undefined as value!"); + } else { + try { + final var clientResponse = client.deleteResource(resourceId); + resourceService.deleteResourceFromAppRoute(resourceId); - try { - final var response = client.deleteResource(resourceId); - resourceService.deleteResourceFromAppRoute(resourceId); - final var jsonObject = new JSONObject(); - jsonObject.put("connectorResponse", response); - jsonObject.put("resourceID", resourceId.toString()); - return ResponseEntity.ok(jsonObject.toJSONString()); - } catch (IOException e) { - log.error(e.getMessage(), e); - return ResponseEntity.badRequest().body("Could not send delete request to connector"); + final var jsonObject = new JSONObject(); + jsonObject.put("connectorResponse", clientResponse); + jsonObject.put("resourceID", resourceId.toString()); + + response = ResponseEntity.ok(jsonObject.toJSONString()); + } catch (IOException e) { + log.error(e.getMessage(), e); + + response = ResponseEntity.badRequest().body("Could not send delete request to connector"); + } } + + return response; } /** @@ -167,34 +176,32 @@ public ResponseEntity createResource(final String title, final String de final ArrayList keywords, final String version, final String standardlicense, final String publisher) { - log.info(">> POST /resource title: " + title + " description: " + description + " " + - "language: " + language + " keywords: " + keywords + " version: " + version + " " + - "standardlicense: " + standardlicense - + " publisher: " + publisher); - - if (ValidateApiInput.notValid(title, description, language, version, standardlicense, - publisher)) { - return ResponseEntity.badRequest().body("All validated parameter have undefined as " + - "value!"); - } + log.info(">> POST /resource title: " + title + " description: " + description + + " language: " + language + " keywords: " + keywords + " version: " + version + + " standardlicense: " + standardlicense + " publisher: " + publisher); + ResponseEntity response; + if (ValidateApiInput.notValid(title, description, language, version, standardlicense, publisher)) { + response = ResponseEntity.badRequest().body("All validated parameter have undefined as value!"); + } else { + final var resource = resourceService.createResource(title, description, language, + keywords, + version, standardlicense, publisher); - final var resource = resourceService.createResource(title, description, language, - keywords, - version, standardlicense, publisher); - - // Save and send request to dataspace connector - final var jsonObject = new JSONObject(); - try { - jsonObject.put("resourceID", resource.getId().toString()); - final var response = client.registerResource(resource); - jsonObject.put("connectorResponse", response); - return ResponseEntity.ok(jsonObject.toJSONString()); - } catch (IOException e) { - jsonObject.put("message", "Could not register resource at connector"); - log.error(e.getMessage(), e); - return ResponseEntity.badRequest().body(jsonObject.toJSONString()); + final var jsonObject = new JSONObject(); + try { + jsonObject.put("resourceID", resource.getId().toString()); + final var clientResponse = client.registerResource(resource); + jsonObject.put("connectorResponse", clientResponse); + response = ResponseEntity.ok(jsonObject.toJSONString()); + } catch (IOException e) { + jsonObject.put("message", "Could not register resource at connector"); + log.error(e.getMessage(), e); + response = ResponseEntity.badRequest().body(jsonObject.toJSONString()); + } } + + return response; } /** @@ -218,35 +225,36 @@ public ResponseEntity updateResource(final URI resourceId, final String final ArrayList keywords, final String version, final String standardlicense, final String publisher) { - log.info(">> PUT /resource title: " + title + " description: " + description + " language" + - ": " + language + " keywords: " + keywords + " version: " + version + " " + - "standardlicense: " + standardlicense - + " publisher: " + publisher); + log.info(">> PUT /resource title: " + title + " description: " + description + " language: " + + language + " keywords: " + keywords + " version: " + version + + " standardlicense: " + standardlicense + " publisher: " + publisher); + ResponseEntity response; if (ValidateApiInput.notValid(resourceId.toString(), title, description, language, version, standardlicense, publisher)) { - return ResponseEntity.badRequest().body("All validated parameter have undefined as " + - "value!"); - } + response = ResponseEntity.badRequest().body("All validated parameter have undefined as value!"); + } else { + try { + final var updatedResource = resourceService.updateResource(resourceId, title, + description, language, keywords, version, standardlicense, publisher); - // Save the updated resource and update the resource in the dataspace connector - try { - final var updatedResource = resourceService.updateResource(resourceId, title, - description, language, keywords, - version, standardlicense, publisher); - if (updatedResource != null) { - final var response = client.updateResource(resourceId, updatedResource); - resourceService.updateResourceInAppRoute(updatedResource); - final var jsonObject = new JSONObject(); - jsonObject.put("connectorResponse", response); - jsonObject.put("resourceID", resourceId.toString()); - return ResponseEntity.ok(jsonObject.toJSONString()); - } else { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body(String.format("No " + - "resource with ID %s was found!", resourceId)); + if (updatedResource != null) { + final var clientResponse = client.updateResource(resourceId, updatedResource); + resourceService.updateResourceInAppRoute(updatedResource); + + final var jsonObject = new JSONObject(); + jsonObject.put("connectorResponse", clientResponse); + jsonObject.put("resourceID", resourceId.toString()); + + response = ResponseEntity.ok(jsonObject.toJSONString()); + } else { + response = ResponseEntity.status(HttpStatus.NOT_FOUND).body(String.format("No resource with ID %s was found!", resourceId)); + } + } catch (IOException e) { + log.error(e.getMessage(), e); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage()); } - } catch (IOException e) { - log.error(e.getMessage(), e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage()); } + + return response; } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceRepresentationUIController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java similarity index 60% rename from src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceRepresentationUIController.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java index f917dd48..76e628b1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceRepresentationUIController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java @@ -1,13 +1,19 @@ -package de.fraunhofer.isst.configmanager.controller; +package de.fraunhofer.isst.configmanager.api.controller; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.Artifact; +import de.fraunhofer.iais.eis.ArtifactBuilder; +import de.fraunhofer.iais.eis.IANAMediaTypeBuilder; +import de.fraunhofer.iais.eis.Language; +import de.fraunhofer.iais.eis.RepresentationBuilder; +import de.fraunhofer.iais.eis.RepresentationImpl; +import de.fraunhofer.iais.eis.ResourceImpl; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.iais.eis.util.Util; -import de.fraunhofer.isst.configmanager.communication.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.configmanagement.service.ConfigModelService; -import de.fraunhofer.isst.configmanager.configmanagement.service.ResourceService; -import de.fraunhofer.isst.configmanager.configmanagement.service.UtilService; +import de.fraunhofer.isst.configmanager.api.ResourceRepresentationApi; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; +import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; +import de.fraunhofer.isst.configmanager.api.service.ResourceService; import de.fraunhofer.isst.configmanager.util.ValidateApiInput; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AccessLevel; @@ -25,34 +31,29 @@ import java.net.URI; /** - * The controller class implements the ResourceRepresentationApi and offers the possibilities to - * manage - * the resource representations in the configuration manager. + * The api class implements the ResourceRepresentationApi and offers the possibilities to + * manage the resource representations in the configuration manager. */ -@RestController @Slf4j +@RestController @RequestMapping("/api/ui") -@Tag(name = "Resource representation Management", description = "Endpoints for managing the " + - "representation of a resource") +@Tag(name = "Resource representation Management", description = "Endpoints for managing the representation of a resource") @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -public class ResourceRepresentationUIController implements ResourceRepresentationApi { +public class ResourceRepresentationController implements ResourceRepresentationApi { transient ConfigModelService configModelService; - transient UtilService utilService; transient ResourceService resourceService; transient DefaultConnectorClient client; transient Serializer serializer; @Autowired - public ResourceRepresentationUIController(ConfigModelService configModelService, - UtilService utilService, - ResourceService resourceService, - DefaultConnectorClient client, - Serializer serializer) { + public ResourceRepresentationController(final ConfigModelService configModelService, + final ResourceService resourceService, + final DefaultConnectorClient client, + final Serializer serializer) { this.client = client; this.configModelService = configModelService; this.resourceService = resourceService; - this.utilService = utilService; this.serializer = serializer; } @@ -75,43 +76,44 @@ public ResponseEntity createResourceRepresentation(final URI resourceId, final Long bytesize, final String sourceType) { log.info(">> POST /resource/representation resourceId: " + resourceId + " endpointId: " + endpointId + " language: " + language - + " filenameExtension: " + filenameExtension + " bytesize: " + bytesize + " " + - "sourceType: " + sourceType); + + " filenameExtension: " + filenameExtension + " bytesize: " + bytesize + + " sourceType: " + sourceType); + ResponseEntity response; if (ValidateApiInput.notValid(resourceId.toString(), sourceType)) { - return ResponseEntity.badRequest().body("All validated parameter have undefined as " + - "value!"); - } + response = ResponseEntity.badRequest().body("All validated parameter have undefined as value!"); + } else { + if (resourceService.getResources() == null || resourceService.getResources().isEmpty()) { + response = ResponseEntity.status(HttpStatus.NOT_FOUND).body("Could not find any resources!"); + } else { + final var representation = new RepresentationBuilder() + ._language_(Language.valueOf(language)) + ._mediaType_(new IANAMediaTypeBuilder()._filenameExtension_(filenameExtension).build()) + ._instance_(Util.asList(new ArtifactBuilder() + ._byteSize_(BigInteger.valueOf(bytesize)).build())).build(); + representation.setProperty("ids:sourceType", sourceType); - if (resourceService.getResources() == null || resourceService.getResources().isEmpty()) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body("{\"error\":\"Could not find " + - "any resources!\"}"); - } + final var jsonObject = new JSONObject(); - // Create representation for resource - final var representation = new RepresentationBuilder() - ._language_(Language.valueOf(language)) - ._mediaType_(new IANAMediaTypeBuilder()._filenameExtension_(filenameExtension).build()) - ._instance_(Util.asList(new ArtifactBuilder() - ._byteSize_(BigInteger.valueOf(bytesize)).build())).build(); - representation.setProperty("ids:sourceType", sourceType); + try { + configModelService.saveState(); + jsonObject.put("resourceID", resourceId.toString()); + jsonObject.put("representationID", representation.getId().toString()); - final var jsonObject = new JSONObject(); - try { - configModelService.saveState(); - jsonObject.put("resourceID", resourceId.toString()); - jsonObject.put("representationID", representation.getId().toString()); + final var clientResponse = client.registerResourceRepresentation(resourceId.toString(), + representation, endpointId.toString()); - final var response = client.registerResourceRepresentation(resourceId.toString(), - representation, endpointId.toString()); - jsonObject.put("connectorResponse", response); - return ResponseEntity.ok(jsonObject.toJSONString()); - } catch (IOException e) { - log.error(e.getMessage(), e); - jsonObject.put("message", "Could not register the resource representation at the " + - "connector"); - return ResponseEntity.badRequest().body(jsonObject.toJSONString()); + jsonObject.put("connectorResponse", clientResponse); + response = ResponseEntity.ok(jsonObject.toJSONString()); + } catch (IOException e) { + log.error(e.getMessage(), e); + jsonObject.put("message", "Could not register the resource representation at the connector"); + response = ResponseEntity.badRequest().body(jsonObject.toJSONString()); + } + } } + + return response; } /** @@ -134,47 +136,47 @@ public ResponseEntity updateResourceRepresentation(final URI resourceId, final String filenameExtension, final Long bytesize, final String sourceType) { - log.info(">> PUT /resource/representation resourceId: " + resourceId + " representationId" + - ": " + representationId - + " endpointId: " + endpointId + " language: " + language + " filenameExtension: " - + filenameExtension + " bytesize: " + bytesize - + " sourceType: " + sourceType); + log.info(">> PUT /resource/representation resourceId: " + resourceId + " representationId: " + + representationId + " endpointId: " + endpointId + " language: " + language + " filenameExtension: " + + filenameExtension + " bytesize: " + bytesize + " sourceType: " + sourceType); + ResponseEntity response = null; final var oldResourceCatalog = (ResourceImpl) resourceService.getResource(resourceId); + if (oldResourceCatalog != null) { final var oldRepresentationId = oldResourceCatalog.getRepresentation().get(0).getId(); oldResourceCatalog.setRepresentation(null); + if (configModelService.getConfigModel().getAppRoute() == null) { - log.info("---- No AppRoute in ConfigModel!"); + log.info("---- [ResourceRepresentationController updateResourceRepresentation] No AppRoute in ConfigModel!"); } else { - final var oldResourceRoute = - (ResourceImpl) resourceService.getResourceInAppRoute(resourceId); + final var oldResourceRoute = (ResourceImpl) resourceService.getResourceInAppRoute(resourceId); if (oldResourceRoute != null) { oldResourceRoute.setRepresentation(null); } } + // Create representation for resource final var representation = new RepresentationBuilder(oldRepresentationId).build(); final var representationImpl = (RepresentationImpl) representation; + if (language != null) { representationImpl.setLanguage(Language.valueOf(language)); } if (filenameExtension != null) { - representationImpl.setMediaType(new IANAMediaTypeBuilder() - ._filenameExtension_(filenameExtension).build()); + representationImpl.setMediaType(new IANAMediaTypeBuilder()._filenameExtension_(filenameExtension).build()); } if (bytesize != null) { - representationImpl.setInstance(Util.asList(new ArtifactBuilder() - ._byteSize_(BigInteger.valueOf(bytesize)).build())); + representationImpl.setInstance(Util.asList(new ArtifactBuilder()._byteSize_(BigInteger.valueOf(bytesize)).build())); } if (sourceType != null) { representationImpl.setProperty("ids:sourceType", sourceType); } // Update representation in app route if (configModelService.getConfigModel().getAppRoute() != null) { - for (var appRoute : configModelService.getConfigModel().getAppRoute()) { - for (var routeStep : appRoute.getHasSubRoute()) { - for (var resource : routeStep.getAppRouteOutput()) { + for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { + for (final var routeStep : appRoute.getHasSubRoute()) { + for (final var resource : routeStep.getAppRouteOutput()) { if (resourceId.equals(resource.getId())) { final var resourceImpl = (ResourceImpl) resource; resourceImpl.setRepresentation(Util.asList(representationImpl)); @@ -190,28 +192,32 @@ public ResponseEntity updateResourceRepresentation(final URI resourceId, try { // Update the resource representation in the dataspace connector if (representationImpl != null) { - final var response = client.updateResourceRepresentation( + final var clientResponse = client.updateResourceRepresentation( resourceId.toString(), representationId.toString(), representationImpl, endpointId.toString() ); final var jsonObject = new JSONObject(); - jsonObject.put("connectorResponse", response); + jsonObject.put("connectorResponse", clientResponse); jsonObject.put("resourceID", resourceId.toString()); jsonObject.put("representationID", representationId.toString()); - return ResponseEntity.ok(jsonObject.toJSONString()); + + response = ResponseEntity.ok(jsonObject.toJSONString()); } else { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body("No representation " + - "with given IDs found!"); + response = ResponseEntity.status(HttpStatus.NOT_FOUND).body("No representation with given IDs found!"); } } catch (IOException e) { configModelService.saveState(); log.error(e.getMessage(), e); } } - return ResponseEntity.badRequest().body("Could not update the representation of the " + - "resource"); + + if (response == null) { + response = ResponseEntity.badRequest().body("Could not update the representation of the resource"); + } + + return response; } /** @@ -223,22 +229,23 @@ public ResponseEntity updateResourceRepresentation(final URI resourceId, @Override public ResponseEntity getResourceRepresentation(final URI representationId) { log.info(">> GET /resource/representation representationId: " + representationId); + ResponseEntity response; + + final var representation = resourceService.getResourceRepresentationInCatalog(representationId); - final var representation = - resourceService.getResourceRepresentationInCatalog(representationId); if (representation != null) { try { - return ResponseEntity.ok(serializer.serialize(representation)); + response = ResponseEntity.ok(serializer.serialize(representation)); } catch (IOException e) { log.error(e.getMessage(), e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Problems " + - "while serializing the " + - "representation"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Problems while serializing the representation"); } } else { - return ResponseEntity.badRequest().body("Could not get resource representation"); - + response = ResponseEntity.badRequest().body("Could not get resource representation"); } + + return response; } /** @@ -252,28 +259,31 @@ public ResponseEntity getResourceRepresentation(final URI representation @Override public ResponseEntity getResourceRepresentationInJson(final URI resourceId, final URI representationId) { - log.info(">> GET /resource/representation/json resourceId: " + resourceId + " " + - "representationId: " + representationId); + log.info(">> GET /resource/representation/json resourceId: " + resourceId + " representationId: " + representationId); + ResponseEntity response = null; - for (var resource : resourceService.getResources()) { + var representationJson = new JSONObject(); + for (final var resource : resourceService.getResources()) { if (resourceId.equals(resource.getId())) { - for (var representation : resource.getRepresentation()) { + for (final var representation : resource.getRepresentation()) { if (representationId.equals(representation.getId())) { - - final var representationJson = new JSONObject(); + representationJson.clear(); representationJson.put("language", representation.getLanguage()); representationJson.put("filenameExtension", representation.getMediaType() .getFilenameExtension()); final var artifact = (Artifact) representation.getInstance().get(0); representationJson.put("byteSize", artifact.getByteSize().toString()); - return ResponseEntity.ok(representationJson.toJSONString()); - + response = ResponseEntity.ok(representationJson.toJSONString()); } } } } - return ResponseEntity.badRequest().body("Could not get resource representation"); + if (response == null) { + response = ResponseEntity.badRequest().body("Could not get resource representation"); + } + + return response; } /** @@ -286,21 +296,26 @@ public ResponseEntity getResourceRepresentationInJson(final URI resource @Override public ResponseEntity deleteResourceRepresentation(final URI resourceId, final URI representationId) { - log.info(">> DELETE /resource/representation resourceId: " + resourceId + " " + - "representationId: " + representationId); + log.info(">> DELETE /resource/representation resourceId: " + resourceId + " representationId: " + representationId); + ResponseEntity response; + try { - final var response = client.deleteResourceRepresentation(resourceId.toString(), - representationId.toString()); + final var clientResponse = client.deleteResourceRepresentation(resourceId.toString(), representationId.toString()); + resourceService.deleteResourceRepresentationFromAppRoute(resourceId, representationId); + final var jsonObject = new JSONObject(); - jsonObject.put("connectorResponse", response); + jsonObject.put("connectorResponse", clientResponse); jsonObject.put("resourceID", resourceId.toString()); jsonObject.put("representationID", representationId.toString()); - return ResponseEntity.ok(jsonObject.toJSONString()); + + response = ResponseEntity.ok(jsonObject.toJSONString()); } catch (IOException e) { log.error(e.getMessage(), e); - return ResponseEntity.badRequest().body("Problems while deleting the representation " + - "at the connector"); + + response = ResponseEntity.badRequest().body("Problems while deleting the representation at the connector"); } + + return response; } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/UtilController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/UtilController.java new file mode 100644 index 00000000..fa649a4c --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/UtilController.java @@ -0,0 +1,79 @@ +package de.fraunhofer.isst.configmanager.api.controller; + +import de.fraunhofer.isst.configmanager.api.UtilApi; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; +import de.fraunhofer.isst.configmanager.api.service.UtilService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; + +/** + * The api class offers the possibilities to provide other api's which could be needed. + * As an example, enum values are supplied here via an api. + */ +@Slf4j +@RestController +public class UtilController implements UtilApi { + + private final transient UtilService utilService; + private final transient DefaultConnectorClient client; + + @Autowired + public UtilController(final UtilService utilService, final DefaultConnectorClient client) { + this.utilService = utilService; + this.client = client; + } + + /** + * This method returns for a given enum name all enum values. + * + * @param enumName name of the enum + * @return enum values as a string + */ + @Override + public ResponseEntity getSpecificEnum(final String enumName) { + log.info(">> GET /api/ui/enum " + enumName); + ResponseEntity response; + + final var enums = utilService.getSpecificEnum(enumName); + + if (enums != null) { + response = ResponseEntity.ok(enums); + } else { + response = ResponseEntity.badRequest().body("Could not get the enums"); + } + + return response; + } + + /** + * This method returns for a given policy the pattern. + * + * @param policy string, representing a policy + * @return pattern of policy + */ + @Override + public ResponseEntity getPolicyPattern(final String policy) { + log.info(">> GET /api/ui/policy-pattern " + policy); + ResponseEntity response; + + String pattern; + try { + pattern = client.getPolicyPattern(policy); + + if (pattern != null) { + response = ResponseEntity.ok(pattern); + } else { + response = ResponseEntity.badRequest().body("Could not find any pattern for the given policy"); + } + } catch (IOException e) { + log.error(e.getMessage(), e); + response = ResponseEntity.badRequest().body("Failed to determine policy pattern at the client"); + } + + return response; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/AppRouteService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java similarity index 89% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/AppRouteService.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java index f8ff4fe4..0ffc2cee 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/AppRouteService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java @@ -1,17 +1,28 @@ -package de.fraunhofer.isst.configmanager.configmanagement.service; - -import de.fraunhofer.iais.eis.*; +package de.fraunhofer.isst.configmanager.api.service; + +import de.fraunhofer.iais.eis.AppRoute; +import de.fraunhofer.iais.eis.AppRouteBuilder; +import de.fraunhofer.iais.eis.AppRouteImpl; +import de.fraunhofer.iais.eis.BaseConnectorImpl; +import de.fraunhofer.iais.eis.ConfigurationModelImpl; +import de.fraunhofer.iais.eis.ConnectorEndpointBuilder; +import de.fraunhofer.iais.eis.Endpoint; +import de.fraunhofer.iais.eis.ResourceImpl; +import de.fraunhofer.iais.eis.RouteStep; +import de.fraunhofer.iais.eis.RouteStepBuilder; +import de.fraunhofer.iais.eis.RouteStepImpl; import de.fraunhofer.iais.eis.util.Util; -import de.fraunhofer.isst.configmanager.configmanagement.entities.configlists.CustomAppRepository; -import de.fraunhofer.isst.configmanager.configmanagement.entities.configlists.EndpointInformationRepository; -import de.fraunhofer.isst.configmanager.configmanagement.entities.configlists.RouteDeployMethodRepository; -import de.fraunhofer.isst.configmanager.configmanagement.entities.customapp.CustomApp; -import de.fraunhofer.isst.configmanager.configmanagement.entities.endpointinfo.EndpointInformation; +import de.fraunhofer.isst.configmanager.model.configlists.CustomAppRepository; +import de.fraunhofer.isst.configmanager.model.configlists.EndpointInformationRepository; +import de.fraunhofer.isst.configmanager.model.configlists.RouteDeployMethodRepository; +import de.fraunhofer.isst.configmanager.model.customapp.CustomApp; +import de.fraunhofer.isst.configmanager.model.endpointinfo.EndpointInformation; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.net.URI; import java.util.ArrayList; @@ -21,14 +32,15 @@ /** * Service class for managing app routes in the configuration manager. */ -@Service @Slf4j +@Service +@Transactional @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) public class AppRouteService { + transient ConfigModelService configModelService; transient EndpointService endpointService; transient ResourceService resourceService; - transient RouteDeployMethodRepository routeDeployMethodRepository; transient EndpointInformationRepository endpointInformationRepository; transient CustomAppRepository customAppRepository; @@ -49,7 +61,7 @@ public AppRouteService(final ConfigModelService configModelService, } /** - * This method creates an app route + * This method creates an app route. * * @param description description of the app route * @return app route @@ -61,20 +73,25 @@ public AppRoute createAppRoute(final String description) { if (configModelService.getConfigModel().getAppRoute() == null) { configModelImpl.setAppRoute(new ArrayList<>()); } - final ArrayList appRoutes = (ArrayList) configModelImpl.getAppRoute(); + + final var appRoutes = (ArrayList) configModelImpl.getAppRoute(); final var routeDeployMethod = routeDeployMethodRepository.findAll(); String deployMethod; + if (routeDeployMethod.isEmpty()) { deployMethod = "custom"; } else { deployMethod = routeDeployMethod.get(0).getDeployMethod().toString(); } + final var appRoute = new AppRouteBuilder() ._routeDeployMethod_(deployMethod) ._routeDescription_(description) .build(); + appRoutes.add(appRoute); configModelImpl.setAppRoute(appRoutes); + configModelService.saveState(); return appRoute; @@ -88,7 +105,6 @@ public AppRoute createAppRoute(final String description) { * @return true, if app route is updated */ public boolean updateAppRoute(final URI routeId, final String description) { - boolean updated = false; final var appRouteImpl = getAppRouteImpl(routeId); @@ -100,23 +116,23 @@ public boolean updateAppRoute(final URI routeId, final String description) { appRouteImpl.setAppRouteOutput(null); appRouteImpl.setHasSubRoute(null); appRouteImpl.setRouteConfiguration(null); - if (description != null) { - appRouteImpl.setRouteDescription(description); - } else { - appRouteImpl.setRouteDescription(null); - } + appRouteImpl.setRouteDescription(description); final var routeDeployMethod = routeDeployMethodRepository.findAll(); + String deployMethod; + if (routeDeployMethod.isEmpty()) { deployMethod = "custom"; } else { deployMethod = routeDeployMethod.get(0).getDeployMethod().toString(); } + appRouteImpl.setRouteDeployMethod(deployMethod); configModelService.saveState(); updated = true; } + return updated; } @@ -128,13 +144,17 @@ public boolean updateAppRoute(final URI routeId, final String description) { */ public boolean deleteAppRoute(final URI routeId) { boolean deleted = false; + final var appRoute = getAppRoute(routeId); + if (appRoute != null) { deleted = configModelService.getConfigModel().getAppRoute().remove(appRoute); + if (deleted) { configModelService.saveState(); } } + return deleted; } @@ -164,11 +184,14 @@ public List getAppRoutes() { * @return subroute */ public RouteStep getSubroute(final URI routeId, final URI routeStepId) { + RouteStepImpl routeStep = null; final var appRouteImpl = getAppRouteImpl(routeId); + if (appRouteImpl != null) { - return getSubrouteImpl(routeStepId, appRouteImpl); + routeStep = getSubrouteImpl(routeStepId, appRouteImpl); } - return null; + + return routeStep; } /** @@ -218,8 +241,7 @@ public RouteStep createAppRouteStep(final URI routeId, final URI startId, if (appRouteImpl.getHasSubRoute() == null) { appRouteImpl.setHasSubRoute(new ArrayList<>()); } - final ArrayList routeSteps = - (ArrayList) appRouteImpl.getHasSubRoute(); + final var routeSteps = (ArrayList) appRouteImpl.getHasSubRoute(); // Determine endpoints final var startEndpoint = getEndpoint(startId); @@ -233,6 +255,7 @@ public RouteStep createAppRouteStep(final URI routeId, final URI startId, // Get route deploy method for route step final var routeDeployMethod = routeDeployMethodRepository.findAll(); + String deployMethod; if (routeDeployMethod.isEmpty()) { deployMethod = "custom"; @@ -266,7 +289,6 @@ public RouteStep createAppRouteStep(final URI routeId, final URI startId, ._appRouteOutput_(Util.asList(resourceImpl)) .build(); } else { - log.info("---- Subroute is created without Resource!!!"); routeStep = new RouteStepBuilder()._routeDeployMethod_(deployMethod) ._appRouteStart_(Util.asList(startEndpoint)) ._appRouteEnd_(Util.asList(endpoint)) @@ -325,9 +347,9 @@ private Endpoint getEndpoint(final URI endpointId) { public EndpointInformation getEndpointInformation(final URI routeId, final URI endpointId) { final var endpointInformations = endpointInformationRepository.findAll(); if (!endpointInformations.isEmpty()) { - for (var endpointInformation : endpointInformations) { - if (routeId.toString().equals(endpointInformation.getRouteId()) && - endpointId.toString().equals(endpointInformation.getEndpointId())) { + for (final var endpointInformation : endpointInformations) { + if (routeId.toString().equals(endpointInformation.getRouteId()) + && endpointId.toString().equals(endpointInformation.getEndpointId())) { return endpointInformation; } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/AppService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java similarity index 88% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/AppService.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java index d11c4e6b..34613ac4 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/AppService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java @@ -1,16 +1,17 @@ -package de.fraunhofer.isst.configmanager.configmanagement.service; +package de.fraunhofer.isst.configmanager.api.service; import de.fraunhofer.iais.eis.AppEndpointType; import de.fraunhofer.iais.eis.Language; -import de.fraunhofer.isst.configmanager.configmanagement.entities.configlists.CustomAppRepository; -import de.fraunhofer.isst.configmanager.configmanagement.entities.customapp.CustomApp; -import de.fraunhofer.isst.configmanager.configmanagement.entities.customapp.CustomAppEndpoint; +import de.fraunhofer.isst.configmanager.model.configlists.CustomAppRepository; +import de.fraunhofer.isst.configmanager.model.customapp.CustomApp; +import de.fraunhofer.isst.configmanager.model.customapp.CustomAppEndpoint; import de.fraunhofer.isst.configmanager.util.Utility; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.math.BigInteger; import java.net.URISyntaxException; @@ -21,8 +22,9 @@ /** * Service class for managing created apps. */ -@Service @Slf4j +@Service +@Transactional @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) public class AppService { transient CustomAppRepository customAppRepository; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/BrokerService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java similarity index 89% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/BrokerService.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java index d31a7069..0abe53b3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/BrokerService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java @@ -1,9 +1,9 @@ -package de.fraunhofer.isst.configmanager.configmanagement.service; +package de.fraunhofer.isst.configmanager.api.service; import de.fraunhofer.iais.eis.Resource; -import de.fraunhofer.isst.configmanager.configmanagement.entities.config.BrokerStatus; -import de.fraunhofer.isst.configmanager.configmanagement.entities.config.CustomBroker; -import de.fraunhofer.isst.configmanager.configmanagement.entities.configlists.CustomBrokerRepository; +import de.fraunhofer.isst.configmanager.model.config.BrokerStatus; +import de.fraunhofer.isst.configmanager.model.config.CustomBroker; +import de.fraunhofer.isst.configmanager.model.configlists.CustomBrokerRepository; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; @@ -11,6 +11,7 @@ import net.minidev.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.net.URI; import java.util.ArrayList; @@ -20,8 +21,9 @@ /** * Service class for the custom broker. */ -@Service @Slf4j +@Service +@Transactional @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) public class BrokerService { transient CustomBrokerRepository customBrokerRepository; @@ -37,8 +39,7 @@ public BrokerService(final CustomBrokerRepository customBrokerRepository, if (customBrokerRepository.count() == 0) { log.info("---- [BrokerService] Db is empty! Creating custom broker"); final var customBroker = new CustomBroker(); - customBroker.setBrokerUri(URI.create("https://broker.ids.isst.fraunhofer" + - ".de/infrastructure")); + customBroker.setBrokerUri(URI.create("https://broker.ids.isst.fraunhofer.de/infrastructure")); customBroker.setTitle("IDS Broker"); customBroker.setBrokerStatus(BrokerStatus.UNREGISTERED); customBrokerRepository.save(customBroker); @@ -53,7 +54,6 @@ public BrokerService(final CustomBrokerRepository customBrokerRepository, * @return custom broker */ public CustomBroker createCustomBroker(final URI brokerUri, final String title) { - final var customBroker = new CustomBroker(brokerUri); if (title != null) { customBroker.setTitle(title); @@ -74,24 +74,26 @@ public CustomBroker createCustomBroker(final URI brokerUri, final String title) public boolean updateBroker(final URI brokerUri, final String title) { boolean updated = false; final var broker = getById(brokerUri); + if (broker != null) { if (title != null) { broker.setTitle(title); } + customBrokerRepository.save(broker); updated = true; } - customBrokerRepository.save(broker); + return updated; } /** - * The method returns a list of all broker uri's + * The method returns a list of all broker uri's. * * @return list of all broker uri's */ public List getAllBrokerUris() { final List brokerUris = new ArrayList<>(); - for (var customBroker : customBrokerRepository.findAll()) { + for (final var customBroker : customBrokerRepository.findAll()) { if (customBroker != null) { brokerUris.add(customBroker.getBrokerUri()); } @@ -112,8 +114,7 @@ public boolean deleteBroker(final URI id) { customBrokerRepository.delete(customBroker); deleted = true; } else { - log.warn(String.format("---- [BrokerService deleteBroker] Tried to delete a Broker, but no config with id %s " + - "exists!", id.toString())); + log.warn(String.format("---- [BrokerService deleteBroker] Tried to delete a Broker, but no config with id %s exists!", id.toString())); } return deleted; } @@ -137,7 +138,7 @@ public CustomBroker getById(final URI id) { } /** - * This method is responsible for setting the broker status + * This method is responsible for setting the broker status. * * @param brokerId id of the broker * @param brokerStatus broker status @@ -185,7 +186,7 @@ public void unregisteredAtBroker(final URI brokerId) { } /** - * This method deletes the resource at the broker + * This method deletes the resource at the broker. * * @param brokerUri id of the broker * @param resourceId id of the resource @@ -205,7 +206,7 @@ public void deleteResourceAtBroker(final URI brokerUri, final URI resourceId) { } /** - * This method creates a JSON for the registration status of a resource at a broker + * This method creates a JSON for the registration status of a resource at a broker. * * @param resourceId id of the resource * @return jsonObject @@ -218,9 +219,9 @@ public JSONArray getRegisStatusForResource(final URI resourceId) { } else { final var jsonArray = new JSONArray(); final var jsonObject = new JSONObject(); - for (var customBroker : customBrokers) { + for (final var customBroker : customBrokers) { if (customBroker.getRegisteredResources() != null) { - for (var id : customBroker.getRegisteredResources()) { + for (final var id : customBroker.getRegisteredResources()) { if (resourceId.toString().equals(id)) { jsonObject.clear(); jsonObject.put("brokerId", customBroker.getBrokerUri().toString()); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/ConfigModelService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java similarity index 80% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/ConfigModelService.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java index 31857f04..ca956457 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/ConfigModelService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java @@ -1,16 +1,27 @@ -package de.fraunhofer.isst.configmanager.configmanagement.service; +package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.BaseConnectorBuilder; +import de.fraunhofer.iais.eis.BasicAuthenticationBuilder; +import de.fraunhofer.iais.eis.ConfigurationModel; +import de.fraunhofer.iais.eis.ConfigurationModelBuilder; +import de.fraunhofer.iais.eis.ConfigurationModelImpl; +import de.fraunhofer.iais.eis.ConnectorDeployMode; +import de.fraunhofer.iais.eis.ConnectorStatus; +import de.fraunhofer.iais.eis.LogLevel; +import de.fraunhofer.iais.eis.ProxyBuilder; +import de.fraunhofer.iais.eis.ProxyImpl; +import de.fraunhofer.iais.eis.SecurityProfile; import de.fraunhofer.iais.eis.util.Util; -import de.fraunhofer.isst.configmanager.communication.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.configmanagement.entities.config.ConfigModelObject; -import de.fraunhofer.isst.configmanager.configmanagement.entities.configlists.ConfigModelRepository; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; +import de.fraunhofer.isst.configmanager.model.config.ConfigModelObject; +import de.fraunhofer.isst.configmanager.model.configlists.ConfigModelRepository; import lombok.AccessLevel; import lombok.Getter; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.net.URI; @@ -20,12 +31,13 @@ /** * Service class for the configuration model. */ -@Service @Slf4j +@Service +@Transactional @FieldDefaults(level = AccessLevel.PRIVATE) public class ConfigModelService { - transient final ConfigModelRepository configModelRepository; + final transient ConfigModelRepository configModelRepository; @Getter ConfigModelObject configModelObject; @@ -35,18 +47,18 @@ public ConfigModelService(final ConfigModelRepository configModelRepository, this.configModelRepository = configModelRepository; log.warn("---- [ConfigModelService] Initial StartUp! Trying to get current Configuration from Connector!"); try { - updateConfigModel(client.getConfiguration()); + final var connectorConfiguration = client.getConfiguration(); + updateConfigModel(connectorConfiguration); + log.info("---- [ConfigModelService] Received configuration from running Connector!"); } catch (IOException e) { - log.warn("---- [ConfigModelService] Could not get Configmodel from Connector! Using old Config if " + - "available! " + - "Error establishing connection to connector: " + e.getMessage()); + log.warn("---- [ConfigModelService] Could not get Configmodel from Connector! Using old Config if " + + "available! Error establishing connection to connector: " + e.getMessage()); if (configModelRepository.findAll().size() > 0) { configModelObject = configModelRepository.findAll().get(0); } else { - log.warn("---- [ConfigModelService] Connector Config not reachable and no old config available! Using " + - "new placeholder Config."); + log.warn("---- [ConfigModelService] Connector Config not reachable and no old config available! Using new placeholder Config."); createConfigModel( "NO_LOGGING", "TEST_DEPLOYMENT", @@ -85,14 +97,13 @@ public ConfigModelService(final ConfigModelRepository configModelRepository, * @param trustStorePassword password for the trust store * @param keyStore repository for certificates * @param keyStorePassword password for the key store - * @return configurationmodel */ - public ConfigurationModel createConfigModel(final String loglevel, - final String connectorDeployMode, - final String trustStore, - final String trustStorePassword, - final String keyStore, - final String keyStorePassword) { + public void createConfigModel(final String loglevel, + final String connectorDeployMode, + final String trustStore, + final String trustStorePassword, + final String keyStore, + final String keyStorePassword) { final var connector = new BaseConnectorBuilder() ._inboundModelVersion_(new ArrayList<>(List.of("3.1.0"))) @@ -113,10 +124,7 @@ public ConfigurationModel createConfigModel(final String loglevel, ._keyStorePassword_(keyStorePassword) .build(); - // The configuration model is added to the list of configuration models and then stored - // in the database. configModelRepository.saveAndFlush(new ConfigModelObject(configurationModel)); - return configurationModel; } /** @@ -125,10 +133,8 @@ public ConfigurationModel createConfigModel(final String loglevel, * @param configurationModel which is updated */ public void updateConfigModel(final ConfigurationModel configurationModel) { - configModelRepository.deleteAll(); - configModelObject = - configModelRepository.saveAndFlush(new ConfigModelObject(configurationModel)); + configModelObject = configModelRepository.saveAndFlush(new ConfigModelObject(configurationModel)); } /** @@ -155,12 +161,16 @@ public boolean saveState() { * @param password password for the authentication * @return true, if configuration model is updated */ - public boolean updateConfigurationModel(final String loglevel, final String connectorDeployMode, + public boolean updateConfigurationModel(final String loglevel, + final String connectorDeployMode, final String trustStore, - final String trustStorePassword, final String keyStore, - final String keyStorePassword, final String proxyUri, + final String trustStorePassword, + final String keyStore, + final String keyStorePassword, + final String proxyUri, final ArrayList noProxyUriList, - final String username, final String password) { + final String username, + final String password) { final var configModelImpl = (ConfigurationModelImpl) getConfigModelObject().getConfigurationModel(); @@ -193,7 +203,7 @@ public boolean updateConfigurationModel(final String loglevel, final String conn } /** - * This method updates the proxy settings + * This method updates the proxy settings. * * @param proxyUri the uri of the proxy * @param noProxyUriList list of no proxy uri's @@ -204,7 +214,7 @@ public boolean updateConfigurationModel(final String loglevel, final String conn public void updateProxySettings(final String proxyUri, final ArrayList noProxyUriList, final String username, final String password, final ConfigurationModelImpl configmodelImpl) { - if (proxyUri.equals("null")) { + if ("null".equals(proxyUri)) { configmodelImpl.setConnectorProxy(null); } else { if (getConfigModelObject().getConfigurationModel().getConnectorProxy() == null) { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/ConnectorRequestService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java similarity index 68% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/ConnectorRequestService.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java index e1ddc982..21cb85a8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/ConnectorRequestService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java @@ -1,14 +1,11 @@ -package de.fraunhofer.isst.configmanager.configmanagement.service; +package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.BaseConnector; import de.fraunhofer.iais.eis.Resource; -import de.fraunhofer.iais.eis.ResourceCatalog; -import de.fraunhofer.isst.configmanager.communication.clients.DefaultConnectorClient; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.net.URI; @@ -18,14 +15,15 @@ /** * Service class for managing external connector requests. */ -@Service @Slf4j +@Service +@Transactional public class ConnectorRequestService { - private final DefaultConnectorClient client; + private final transient DefaultConnectorClient client; @Autowired - public ConnectorRequestService(DefaultConnectorClient client) { + public ConnectorRequestService(final DefaultConnectorClient client) { this.client = client; } @@ -35,13 +33,13 @@ public ConnectorRequestService(DefaultConnectorClient client) { * @param recipientId id of the recipient * @return list of resources */ - public List requestResourcesFromConnector(URI recipientId) { + public List requestResourcesFromConnector(final URI recipientId) { try { - BaseConnector connector = client.getBaseConnector(recipientId.toString(), ""); + final var connector = client.getBaseConnector(recipientId.toString(), ""); if (connector != null && connector.getResourceCatalog() != null) { - List resourceList = new ArrayList<>(); - for (ResourceCatalog resourceCatalog : connector.getResourceCatalog()) { + final List resourceList = new ArrayList<>(); + for (final var resourceCatalog : connector.getResourceCatalog()) { if (resourceCatalog != null && resourceCatalog.getOfferedResource() != null) { resourceList.addAll(resourceCatalog.getOfferedResource()); } @@ -64,10 +62,10 @@ public List requestResourcesFromConnector(URI recipientId) { * @param requestedResourceId id of the requested resource * @return resource */ - public Resource requestResource(URI recipientId, URI requestedResourceId) { + public Resource requestResource(final URI recipientId, final URI requestedResourceId) { try { - Resource resource = client.getRequestedResource(recipientId.toString(), requestedResourceId.toString()); + final var resource = client.getRequestedResource(recipientId.toString(), requestedResourceId.toString()); if (resource != null) { return resource; } else { @@ -88,7 +86,9 @@ public Resource requestResource(URI recipientId, URI requestedResourceId) { * @param contractOffer contact offer for the requested resource * @return string, contract acgreement id */ - public String requestContractAgreement(String recipientId, String requestedArtifactId, String contractOffer) { + public String requestContractAgreement(final String recipientId, + final String requestedArtifactId, + final String contractOffer) { try { return client.requestContractAgreement(recipientId, requestedArtifactId, contractOffer); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/ConnectorService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java similarity index 80% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/ConnectorService.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java index f3296d03..72b0c90e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/ConnectorService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java @@ -1,14 +1,20 @@ -package de.fraunhofer.isst.configmanager.configmanagement.service; +package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.BaseConnector; +import de.fraunhofer.iais.eis.BaseConnectorBuilder; +import de.fraunhofer.iais.eis.BaseConnectorImpl; +import de.fraunhofer.iais.eis.ConfigurationModelImpl; +import de.fraunhofer.iais.eis.ConnectorEndpointBuilder; +import de.fraunhofer.iais.eis.SecurityProfile; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; -import de.fraunhofer.isst.configmanager.configmanagement.entities.configlists.ConfigModelRepository; +import de.fraunhofer.isst.configmanager.model.configlists.ConfigModelRepository; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.net.URI; import java.util.ArrayList; @@ -16,10 +22,11 @@ /** * Service class for the connector, which manages a list of configurations and a set of observers, - * notified when the current configuration changes + * notified when the current configuration changes. */ -@Service @Slf4j +@Service +@Transactional @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) public class ConnectorService { @@ -32,9 +39,9 @@ public ConnectorService(final ConfigModelService configModelService, // If no connector is found in the database, a default connector is created at this point. if (configModelRepository.findAll().get(0).getConfigurationModel().getConnectorDescription() == null) { - log.info("---- [ConnectorService] No connector description is found in the configuration model! Creating" + - " default connector " + - "description"); + log.info("---- [ConnectorService] No connector description is found in the configuration model! Creating" + + " default connector description"); + final var connector = new BaseConnectorBuilder() ._inboundModelVersion_(new ArrayList<>(List.of("3.1.0"))) ._outboundModelVersion_("3.1.0") @@ -42,8 +49,9 @@ public ConnectorService(final ConfigModelService configModelService, ._maintainer_(URI.create("https://example.com")) ._curator_(URI.create("https://example.com")) .build(); - final var configurationModel = - (ConfigurationModelImpl) configModelService.getConfigModel(); + + final var configurationModel = (ConfigurationModelImpl) configModelService.getConfigModel(); + configurationModel.setConnectorDescription(connector); } } @@ -59,9 +67,11 @@ public ConnectorService(final ConfigModelService configModelService, * @param outboundedModelVersion the outbounded model version of the connector * @return base connector */ - public BaseConnector createConnector(final String title, final String description, + public BaseConnector createConnector(final String title, + final String description, final String endpointAccessURL, - final String version, final String curator, + final String version, + final String curator, final String maintainer, final String inboundedModelVersion, final String outboundedModelVersion) { @@ -89,15 +99,18 @@ public BaseConnector createConnector(final String title, final String descriptio * @param outboundModelVersion outbound model version of the connector * @return true, if connector is updated */ - public boolean updateConnector(final String title, final String description, - final String endpointAccessURL, final String version, - final String curator, final String maintainer, + public boolean updateConnector(final String title, + final String description, + final String endpointAccessURL, + final String version, + final String curator, + final String maintainer, final String inboundModelVersion, final String outboundModelVersion) { boolean updated = false; - final var connector = (BaseConnectorImpl) configModelService.getConfigModel() - .getConnectorDescription(); + final var connector = (BaseConnectorImpl) configModelService.getConfigModel().getConnectorDescription(); + if (connector != null) { if (title != null) { connector.setTitle(Util.asList(new TypedLiteral(title))); @@ -130,6 +143,7 @@ public boolean updateConnector(final String title, final String description, final var configModelImpl = (ConfigurationModelImpl) configModelService.getConfigModel(); configModelImpl.setConnectorDescription(connector); configModelService.saveState(); + return updated; } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/EndpointService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java similarity index 67% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/EndpointService.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java index 249f2b89..8d257ffa 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/EndpointService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java @@ -1,14 +1,19 @@ -package de.fraunhofer.isst.configmanager.configmanagement.service; +package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.*; -import de.fraunhofer.isst.configmanager.configmanagement.entities.configlists.CustomGenericEndpointList; -import de.fraunhofer.isst.configmanager.configmanagement.entities.configlists.CustomGenericEndpointRepository; -import de.fraunhofer.isst.configmanager.configmanagement.entities.customgenericendpoint.CustomGenericEndpointObject; +import de.fraunhofer.iais.eis.BasicAuthenticationBuilder; +import de.fraunhofer.iais.eis.Endpoint; +import de.fraunhofer.iais.eis.GenericEndpoint; +import de.fraunhofer.iais.eis.GenericEndpointBuilder; +import de.fraunhofer.iais.eis.GenericEndpointImpl; +import de.fraunhofer.isst.configmanager.model.configlists.CustomGenericEndpointList; +import de.fraunhofer.isst.configmanager.model.configlists.CustomGenericEndpointRepository; +import de.fraunhofer.isst.configmanager.model.customgenericendpoint.CustomGenericEndpointObject; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.net.URI; import java.util.ArrayList; @@ -16,18 +21,18 @@ import java.util.NoSuchElementException; /** - * Service class for managing generic endpoints + * Service class for managing generic endpoints. */ -@Service @Slf4j +@Service +@Transactional @FieldDefaults(level = AccessLevel.PRIVATE) public class EndpointService { - transient final CustomGenericEndpointRepository customGenericEndpointRepository; + final transient CustomGenericEndpointRepository customGenericEndpointRepository; transient CustomGenericEndpointList customGenericEndpointList; @Autowired public EndpointService(final CustomGenericEndpointRepository customGenericEndpointRepository) { - this.customGenericEndpointRepository = customGenericEndpointRepository; } @@ -39,30 +44,32 @@ public EndpointService(final CustomGenericEndpointRepository customGenericEndpoi * @param password password for the authentication * @return generic endpoint */ - public GenericEndpoint createGenericEndpoint(final String accessURL, final String username, + public GenericEndpoint createGenericEndpoint(final String accessURL, + final String username, final String password) { - // Create generic endpoint - final var endpoint = - new GenericEndpointBuilder()._accessURL_(URI.create(accessURL)).build(); + final var endpoint = new GenericEndpointBuilder()._accessURL_(URI.create(accessURL)).build(); final var endpointImpl = (GenericEndpointImpl) endpoint; + if (username != null && password != null) { - endpointImpl.setGenericEndpointAuthentication(new BasicAuthenticationBuilder()._authUsername_(username) - ._authPassword_(password).build()); + endpointImpl + .setGenericEndpointAuthentication( + new BasicAuthenticationBuilder()._authUsername_(username)._authPassword_(password).build() + ); } else { - log.info("---- [EndpointService createGenericEndpoint] No authentication was created because username and password were not " + - "entered."); + log.info("---- [EndpointService createGenericEndpoint] No authentication was created because username and password were not entered."); } - // Save the endpoint + final var customGenericEndpointObject = new CustomGenericEndpointObject(endpoint); + if (customGenericEndpointRepository.count() == 0) { customGenericEndpointList = new CustomGenericEndpointList(); } else { - customGenericEndpointList = - customGenericEndpointRepository.findAll().stream().findAny().get(); + customGenericEndpointList = customGenericEndpointRepository.findAll().stream().findAny().get(); } + customGenericEndpointList.getCustomGenericEndpointObjects().add(customGenericEndpointObject); - customGenericEndpointList = - customGenericEndpointRepository.saveAndFlush(customGenericEndpointList); + customGenericEndpointList = customGenericEndpointRepository.saveAndFlush(customGenericEndpointList); + return endpoint; } @@ -71,8 +78,8 @@ public GenericEndpoint createGenericEndpoint(final String accessURL, final Strin */ public List getGenericEndpoints() { try { - customGenericEndpointList = - customGenericEndpointRepository.findAll().stream().findAny().get(); + customGenericEndpointList = customGenericEndpointRepository.findAll().stream().findAny().get(); + return customGenericEndpointList.getEndpoints(); } catch (NoSuchElementException e) { return new ArrayList<>(); @@ -84,8 +91,8 @@ public List getGenericEndpoints() { * @return generic endpoint */ public GenericEndpoint getGenericEndpoint(final URI id) { - customGenericEndpointList = - customGenericEndpointRepository.findAll().stream().findAny().get(); + customGenericEndpointList = customGenericEndpointRepository.findAll().stream().findAny().get(); + return (GenericEndpoint) this.customGenericEndpointList.getEndpoints() .stream() .filter(endpoint -> endpoint.getId().equals(id)) @@ -97,10 +104,12 @@ public GenericEndpoint getGenericEndpoint(final URI id) { * @return true, if generic endpoint is deleted */ public boolean deleteGenericEndpoint(final URI id) { - final boolean deleted = customGenericEndpointList.getCustomGenericEndpointObjects() + final boolean deleted = customGenericEndpointList + .getCustomGenericEndpointObjects() .removeIf(customGenericEndpointObject -> customGenericEndpointObject.getEndpoint().getId().equals(id)); - customGenericEndpointList = - customGenericEndpointRepository.saveAndFlush(customGenericEndpointList); + + customGenericEndpointList = customGenericEndpointRepository.saveAndFlush(customGenericEndpointList); + return deleted; } @@ -113,17 +122,22 @@ public boolean deleteGenericEndpoint(final URI id) { * @param password password for the authentication * @return true, if generic endpoint is updated */ - public boolean updateGenericEndpoint(final URI id, final String accessURL, - final String username, final String password) { - boolean updated = false; + public boolean updateGenericEndpoint(final URI id, + final String accessURL, + final String username, + final String password) { + + var updated = false; final var genericEndpointold = getGenericEndpoint(id); final var genericEndpointNew = getGenericEndpoint(id); if (genericEndpointNew != null) { final var genericEndpointNewImpl = (GenericEndpointImpl) genericEndpointNew; + if (accessURL != null) { genericEndpointNewImpl.setAccessURL(URI.create(accessURL)); } + final var basicAuthentication = genericEndpointNew.getGenericEndpointAuthentication(); if (username != null && password != null) { @@ -144,13 +158,14 @@ public boolean updateGenericEndpoint(final URI id, final String accessURL, } } - final int index = this.getGenericEndpoints().indexOf(genericEndpointold); + final var index = this.getGenericEndpoints().indexOf(genericEndpointold); + if (index != -1) { this.getGenericEndpoints().set(index, genericEndpointNew); - customGenericEndpointList = - customGenericEndpointRepository.saveAndFlush(customGenericEndpointList); + customGenericEndpointList = customGenericEndpointRepository.saveAndFlush(customGenericEndpointList); updated = true; } + return updated; } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/ResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java similarity index 80% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/ResourceService.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java index d659a1fb..1b58db53 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/ResourceService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java @@ -1,17 +1,28 @@ -package de.fraunhofer.isst.configmanager.configmanagement.service; - -import de.fraunhofer.iais.eis.*; +package de.fraunhofer.isst.configmanager.api.service; + +import de.fraunhofer.iais.eis.AppRouteImpl; +import de.fraunhofer.iais.eis.BaseConnector; +import de.fraunhofer.iais.eis.ContractOffer; +import de.fraunhofer.iais.eis.DigitalContent; +import de.fraunhofer.iais.eis.Language; +import de.fraunhofer.iais.eis.RepresentationImpl; +import de.fraunhofer.iais.eis.Resource; +import de.fraunhofer.iais.eis.ResourceBuilder; +import de.fraunhofer.iais.eis.ResourceImpl; +import de.fraunhofer.iais.eis.RouteStep; +import de.fraunhofer.iais.eis.RouteStepImpl; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; -import de.fraunhofer.isst.configmanager.communication.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.configmanagement.entities.configlists.EndpointInformationRepository; -import de.fraunhofer.isst.configmanager.configmanagement.entities.endpointinfo.EndpointInformation; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; +import de.fraunhofer.isst.configmanager.model.configlists.EndpointInformationRepository; +import de.fraunhofer.isst.configmanager.model.endpointinfo.EndpointInformation; import de.fraunhofer.isst.configmanager.util.CalenderUtil; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.net.URI; @@ -22,8 +33,9 @@ /** * Service class for managing resources. */ -@Service @Slf4j +@Service +@Transactional @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) public class ResourceService { @@ -88,8 +100,10 @@ public void updateResourceContent(final String title, final String description, } if (keywords != null) { final ArrayList keys = new ArrayList<>(); - for (var keyword : keywords) { - keys.add(new TypedLiteral(keyword)); + final var literal = new TypedLiteral(); + for (final var keyword : keywords) { + literal.setValue(keyword); + keys.add(literal); } resourceImpl.setKeyword(keys); } @@ -119,7 +133,7 @@ public List getResources() { log.error(e.getMessage(), e); } if (baseConnector != null && baseConnector.getResourceCatalog() != null) { - for (var resourceCatalog : baseConnector.getResourceCatalog()) { + for (final var resourceCatalog : baseConnector.getResourceCatalog()) { if (resourceCatalog.getOfferedResource() != null) { resources.addAll(resourceCatalog.getOfferedResource()); } @@ -129,7 +143,7 @@ public List getResources() { } /** - * This method returns all offered resources of a connector as plain json String + * This method returns all offered resources of a connector as plain json String. * * @return list of resources from the connector */ @@ -143,7 +157,7 @@ public String getOfferedResourcesAsJsonString() { } /** - * This method returns all requested resources of a connector as plain json String + * This method returns all requested resources of a connector as plain json String. * * @return list of resources from the connector */ @@ -157,7 +171,7 @@ public String getRequestedResourcesAsJsonString() { } /** - * This method updates the resource contract with the given parameters + * This method updates the resource contract with the given parameters. * * @param resourceId id of the resource * @param contractOffer the contract offer which will be updated @@ -166,12 +180,13 @@ public void updateResourceContractInAppRoute(final URI resourceId, final ContractOffer contractOffer) { // Update resource representation in app route if (configModelService.getConfigModel().getAppRoute() == null) { - log.info("---- Could not find any app route"); + log.info("---- [ResourceService updateResourceContractInAppRoute] Could not find any app route"); } else { - for (var appRoute : configModelService.getConfigModel().getAppRoute()) { + final ArrayList emptyList = new ArrayList<>(); + for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { if (appRoute.getHasSubRoute() != null) { updateResourceContractInSubroutes((List) appRoute.getHasSubRoute(), - new ArrayList<>(), resourceId, contractOffer); + emptyList, resourceId, contractOffer); configModelService.saveState(); } } @@ -180,6 +195,7 @@ public void updateResourceContractInAppRoute(final URI resourceId, /** * @param routeSteps list of route steps + * @param visited list of route steps already managed * @param resourceId id of the resource * @param contractOffer the contract offer */ @@ -188,14 +204,14 @@ private void updateResourceContractInSubroutes(final List routeSteps, final URI resourceId, final ContractOffer contractOffer) { - for (var routeStep : routeSteps) { + for (final var routeStep : routeSteps) { if (routeStep.getAppRouteOutput() != null) { - for (var resource : routeStep.getAppRouteOutput()) { + for (final var resource : routeStep.getAppRouteOutput()) { if (resourceId.equals(resource.getId())) { final var resourceImpl = (ResourceImpl) resource; resourceImpl.setContractOffer(Util.asList(contractOffer)); - log.info("---- Updated resource representation in the app " + - "route"); + log.info("---- [ResourceService updateResourceContractInSubroutes] Updated resource representation in the app route"); + break; } } @@ -209,13 +225,13 @@ private void updateResourceContractInSubroutes(final List routeSteps, } /** - * This method returns from a resource the contract offer + * This method returns from a resource the contract offer. * * @param resourceId id of the resource * @return contract offer */ public ContractOffer getResourceContract(final URI resourceId) { - for (var resource : getResources()) { + for (final var resource : getResources()) { if (resourceId.equals(resource.getId()) && resource.getContractOffer().get(0) != null) { return resource.getContractOffer().get(0); } @@ -244,14 +260,15 @@ public RepresentationImpl getResourceRepresentationInCatalog(final URI represent public void deleteResourceRepresentationFromAppRoute(final URI resourceId, final URI representationId) { if (configModelService.getConfigModel().getAppRoute() == null) { - log.info("---- Could not find any app route to delete the resource"); + log.info("---- [ResourceService deleteResourceRepresentationFromAppRoute] Could not find any app route to delete the resource"); } else { - for (var route : configModelService.getConfigModel().getAppRoute()) { + final ArrayList emptyList = new ArrayList<>(); + for (final var route : configModelService.getConfigModel().getAppRoute()) { if (route == null) { continue; } if (route.getAppRouteOutput() != null) { - for (var resource : route.getAppRouteOutput()) { + for (final var resource : route.getAppRouteOutput()) { if (resource.getRepresentation() != null) { resource.getRepresentation().removeIf(representation -> representation.getId().equals(representationId) @@ -262,8 +279,9 @@ public void deleteResourceRepresentationFromAppRoute(final URI resourceId, if (route.getHasSubRoute() == null) { continue; } - for (var subRoute : route.getHasSubRoute()) { - deleteRepresentationFromSubRoutes(subRoute, new ArrayList<>(), resourceId, + + for (final var subRoute : route.getHasSubRoute()) { + deleteRepresentationFromSubRoutes(subRoute, emptyList, resourceId, representationId); } } @@ -272,7 +290,7 @@ public void deleteResourceRepresentationFromAppRoute(final URI resourceId, } /** - * Delete occurrence of a resource representation with resourceID and representationID from + * Delete occurrence of a resource representation with resourceID and representationID from. * all SubRoutes * * @param current current Node in AppRoute @@ -288,7 +306,7 @@ private void deleteRepresentationFromSubRoutes(final RouteStep current, return; } if (current.getAppRouteOutput() != null) { - for (var resource : current.getAppRouteOutput()) { + for (final var resource : current.getAppRouteOutput()) { if (resource.getRepresentation() != null) { resource.getRepresentation().removeIf(representation -> representation.getId().equals(representationId) @@ -299,7 +317,7 @@ private void deleteRepresentationFromSubRoutes(final RouteStep current, if (current.getHasSubRoute() == null) { return; } - for (var subRoute : current.getHasSubRoute()) { + for (final var subRoute : current.getHasSubRoute()) { if (!visited.contains(subRoute)) { visited.add(current); deleteFromSubRoutes(subRoute, visited, resourceId); @@ -312,9 +330,10 @@ private void deleteRepresentationFromSubRoutes(final RouteStep current, */ public void deleteResourceFromAppRoute(final URI resourceId) { if (configModelService.getConfigModel().getAppRoute() == null) { - log.info("---- Could not find any app route to delete the resource"); + log.info("---- [ResourceService deleteResourceFromAppRoute] Could not find any app route to delete the resource"); } else { - for (var route : configModelService.getConfigModel().getAppRoute()) { + final ArrayList emptyList = new ArrayList<>(); + for (final var route : configModelService.getConfigModel().getAppRoute()) { if (route == null) { continue; } @@ -324,8 +343,9 @@ public void deleteResourceFromAppRoute(final URI resourceId) { if (route.getHasSubRoute() == null) { continue; } - for (var subRoute : route.getHasSubRoute()) { - deleteFromSubRoutes(subRoute, new ArrayList<>(), resourceId); + + for (final var subRoute : route.getHasSubRoute()) { + deleteFromSubRoutes(subRoute, emptyList, resourceId); } } } @@ -333,7 +353,7 @@ public void deleteResourceFromAppRoute(final URI resourceId) { } /** - * Delete occurrence of a resource with resourceID from all SubRoutes + * Delete occurrence of a resource with resourceID from all SubRoutes. * * @param current current Node in AppRoute * @param visited already visited AppRoutes @@ -350,7 +370,7 @@ private void deleteFromSubRoutes(final RouteStep current, final List if (current.getHasSubRoute() == null) { return; } - for (var subRoute : current.getHasSubRoute()) { + for (final var subRoute : current.getHasSubRoute()) { if (!visited.contains(subRoute)) { visited.add(current); deleteFromSubRoutes(subRoute, visited, resourceId); @@ -374,8 +394,10 @@ public ResourceImpl createResource(final String title, final String description, final String publisher) { final ArrayList keys = new ArrayList<>(); - for (var keyword : keywords) { - keys.add(new TypedLiteral(keyword)); + final var literal = new TypedLiteral(); + for (final var keyword : keywords) { + literal.setValue(keyword); + keys.add(literal); } // Create the resource with the given parameters @@ -397,12 +419,11 @@ public ResourceImpl updateResource(final URI resourceId, final String title, final List keywords, final String version, final String standardlicense, final String publisher) { //Get a Resource and update if it exists - for (var resource : getResources()) { + for (final var resource : getResources()) { if (resource.getId().equals(resourceId)) { final var resImpl = (ResourceImpl) resource; updateResourceContent(title, description, language, keywords, version, - standardlicense, - publisher, resImpl); + standardlicense, publisher, resImpl); return resImpl; } } @@ -415,11 +436,12 @@ public ResourceImpl updateResource(final URI resourceId, final String title, public void updateResourceInAppRoute(final ResourceImpl newResource) { // Update the resource in the app route if (configModelService.getConfigModel().getAppRoute() == null) { - log.info("---- Could not find any app route to update the resource"); + log.info("---- [ResourceService updateResourceInAppRoute] Could not find any app route to update the resource"); } else { - for (var appRoute : configModelService.getConfigModel().getAppRoute()) { + final ArrayList emptyList = new ArrayList<>(); + for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { if (appRoute.getHasSubRoute() != null) { - updateResourceInSubroutes((List) appRoute.getHasSubRoute(), new ArrayList<>(), newResource); + updateResourceInSubroutes((List) appRoute.getHasSubRoute(), emptyList, newResource); configModelService.saveState(); } } @@ -428,15 +450,16 @@ public void updateResourceInAppRoute(final ResourceImpl newResource) { /** * @param routeSteps list of route steps + * @param visited list of route steps already managed * @param newResource new resource old version should be replaced with */ private void updateResourceInSubroutes(final List routeSteps, final List visited, final ResourceImpl newResource) { boolean updated = false; - for (var routeStep : routeSteps) { + for (final var routeStep : routeSteps) { if (routeStep.getAppRouteOutput() != null) { - for (var resource : routeStep.getAppRouteOutput()) { + for (final var resource : routeStep.getAppRouteOutput()) { if (newResource.getId().equals(resource.getId())) { final ArrayList output = (ArrayList) routeStep.getAppRouteOutput(); @@ -457,7 +480,7 @@ private void updateResourceInSubroutes(final List routeSteps, } /** - * This method updates a backend connection + * This method updates a backend connection. * * @param resourceId id of the resource * @param endpointId id of the endpoint @@ -466,9 +489,9 @@ public void updateBackendConnection(final URI resourceId, final URI endpointId) if (configModelService.getConfigModel().getAppRoute() != null) { RouteStepImpl foundRouteStep = null; AppRouteImpl appRouteImpl = null; - for (var appRoute : configModelService.getConfigModel().getAppRoute()) { - for (var routeStep : appRoute.getHasSubRoute()) { - for (var resource : routeStep.getAppRouteOutput()) { + for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { + for (final var routeStep : appRoute.getHasSubRoute()) { + for (final var resource : routeStep.getAppRouteOutput()) { if (resourceId.equals(resource.getId())) { appRouteImpl = (AppRouteImpl) appRoute; foundRouteStep = (RouteStepImpl) routeStep; @@ -479,7 +502,7 @@ public void updateBackendConnection(final URI resourceId, final URI endpointId) } // Set app route start and subroute start to the updated endpoint - if (appRouteImpl != null && foundRouteStep != null) { + if (appRouteImpl != null) { final var endpoint = endpointService.getGenericEndpoint(endpointId); if (endpoint != null) { appRouteImpl.setAppRouteStart(Util.asList(endpoint)); @@ -501,7 +524,7 @@ public void updateBackendConnection(final URI resourceId, final URI endpointId) } /** - * This method returns the resource if it is exists in an app route + * This method returns the resource if it is exists in an app route. * * @param resourceId id of the resource * @return resource @@ -509,19 +532,22 @@ public void updateBackendConnection(final URI resourceId, final URI endpointId) public Resource getResourceInAppRoute(final URI resourceId) { Resource resource = null; - for (AppRoute appRoute : configModelService.getConfigModel().getAppRoute()) { + final ArrayList emptyList = new ArrayList<>(); + for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { if (appRoute.getHasSubRoute() != null) { - resource = getResourceInSubroutes((List) appRoute.getHasSubRoute(), new ArrayList<>(), resourceId); + resource = getResourceInSubroutes((List) appRoute.getHasSubRoute(), emptyList, resourceId); } } if (resource == null) { - log.info("---- Could not find any resource in app routes and subroutes"); + log.info("---- [ResourceService getResourceInAppRoute] Could not find any resource in app routes and subroutes"); } + return resource; } /** * @param routeSteps list of route steps + * @param visited list of route steps already visited * @param resourceId id of the resource * @return resource */ @@ -532,12 +558,13 @@ private Resource getResourceInSubroutes(final List routeSteps, Resource foundResource = null; boolean found = false; - for (RouteStep routeStep : routeSteps) { + for (final var routeStep : routeSteps) { if (routeStep.getAppRouteOutput() != null) { - for (Resource resource : routeStep.getAppRouteOutput()) { + for (final var resource : routeStep.getAppRouteOutput()) { if (resourceId.equals(resource.getId())) { foundResource = resource; found = true; + break; } } @@ -547,6 +574,7 @@ private Resource getResourceInSubroutes(final List routeSteps, getResourceInSubroutes((List) routeStep.getHasSubRoute(), visited, resourceId); } } + return foundResource; } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/UtilService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java similarity index 81% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/UtilService.java rename to src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java index b69fc285..8e5b24be 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/service/UtilService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java @@ -1,16 +1,22 @@ -package de.fraunhofer.isst.configmanager.configmanagement.service; +package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.*; -import de.fraunhofer.isst.configmanager.communication.dataspaceconnector.model.BackendSource; -import de.fraunhofer.isst.configmanager.configmanagement.entities.config.BrokerStatus; -import de.fraunhofer.isst.configmanager.configmanagement.entities.routedeploymethod.DeployMethod; +import de.fraunhofer.iais.eis.ConnectorDeployMode; +import de.fraunhofer.iais.eis.ConnectorStatus; +import de.fraunhofer.iais.eis.Language; +import de.fraunhofer.iais.eis.LogLevel; +import de.fraunhofer.iais.eis.SecurityProfile; +import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.BackendSource; +import de.fraunhofer.isst.configmanager.model.config.BrokerStatus; +import de.fraunhofer.isst.configmanager.model.routedeploymethod.DeployMethod; import net.minidev.json.JSONArray; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; /** * The class can be used to define auxiliary methods that are needed again and again. */ @Service +@Transactional public class UtilService { /** @@ -71,6 +77,7 @@ public String getSpecificEnum(final String enumName) { jsonArray.add(i, brokerStatuses[i].name()); } } + return jsonArray.toJSONString(); } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/model/ResourceRepresentation.java b/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/model/ResourceRepresentation.java deleted file mode 100644 index f1940ac5..00000000 --- a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/model/ResourceRepresentation.java +++ /dev/null @@ -1,51 +0,0 @@ -package de.fraunhofer.isst.configmanager.communication.dataspaceconnector.model; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AccessLevel; -import lombok.Data; -import lombok.experimental.FieldDefaults; - -import javax.persistence.Column; -import javax.persistence.Id; -import java.io.Serializable; -import java.util.UUID; - -/** - * ResourceRepresentation class. - */ -@Schema( - name = "ResourceRepresentation", - description = "Representation of a resource", - oneOf = ResourceRepresentation.class, - example = "{\n" + - " \"type\": \"json\",\n" + - " \"byteSize\": 105,\n" + - " \"source\": {\n" + - " \"type\":\"http-get\", \n" + - " \"url\": \"https://samples.openweathermap.org/data/2" + - ".5/weather?lat=35&lon=139&appid=439d4b804bc8187953eb36d2a8c26a02\",\n" + - " \"username\": \"-\",\n" + - " \"password\": \"-\",\n" + - " \"system\": \"Open Weather Map API\"\n" + - " }\n" + - " }" -) -@Data -@FieldDefaults(level = AccessLevel.PRIVATE) -public class ResourceRepresentation implements Serializable { - - @Id - @JsonProperty("uuid") - UUID uuid; - - @JsonProperty("type") - String type; - - @JsonProperty("byteSize") - Integer byteSize; - - @JsonProperty("source") - @Column(columnDefinition = "BLOB") - BackendSource source; -} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/config/SecurityConfig.java b/src/main/java/de/fraunhofer/isst/configmanager/config/SecurityConfig.java index 1f49f91c..42328e3c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/config/SecurityConfig.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/config/SecurityConfig.java @@ -10,14 +10,12 @@ */ @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { - /** * @param http the HttpSecurity object - * @throws Exception + * @throws Exception HttpSecurity could not be configured */ @Override protected void configure(final HttpSecurity http) throws Exception { http.csrf().disable().authorizeRequests().antMatchers("/**").permitAll(); } - } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/config/BrokerStatus.java b/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/config/BrokerStatus.java deleted file mode 100644 index aefd00ab..00000000 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/config/BrokerStatus.java +++ /dev/null @@ -1,9 +0,0 @@ -package de.fraunhofer.isst.configmanager.configmanagement.entities.config; - -/** - * Enums for the broker status - */ -public enum BrokerStatus { - REGISTERED, - UNREGISTERED -} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/CustomGenericEndpointRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/CustomGenericEndpointRepository.java deleted file mode 100644 index 0621348a..00000000 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/CustomGenericEndpointRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package de.fraunhofer.isst.configmanager.configmanagement.entities.configlists; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -/** - * CRUD repository for persisting generic endpoints. - */ -@Repository -public interface CustomGenericEndpointRepository extends - JpaRepository { -} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/EndpointInformationRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/EndpointInformationRepository.java deleted file mode 100644 index b1fba4e6..00000000 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/EndpointInformationRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package de.fraunhofer.isst.configmanager.configmanagement.entities.configlists; - -import de.fraunhofer.isst.configmanager.configmanagement.entities.endpointinfo.EndpointInformation; -import org.springframework.data.jpa.repository.JpaRepository; - -/** - * CRUD repository for persisting endpoint information - */ -public interface EndpointInformationRepository extends JpaRepository { -} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/RouteDeployMethodRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/RouteDeployMethodRepository.java deleted file mode 100644 index 34321686..00000000 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/RouteDeployMethodRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package de.fraunhofer.isst.configmanager.configmanagement.entities.configlists; - -import de.fraunhofer.isst.configmanager.configmanagement.entities.routedeploymethod.RouteDeployMethod; -import org.springframework.data.jpa.repository.JpaRepository; - -/** - * CRUD repository for the route deploy method - */ -public interface RouteDeployMethodRepository extends JpaRepository { - -} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/routedeploymethod/DeployMethod.java b/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/routedeploymethod/DeployMethod.java deleted file mode 100644 index 70d27f0f..00000000 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/routedeploymethod/DeployMethod.java +++ /dev/null @@ -1,12 +0,0 @@ -package de.fraunhofer.isst.configmanager.configmanagement.entities.routedeploymethod; - -/** - * Enums for the route deploy methods - */ -public enum DeployMethod { - NONE, - CAMEL, - KAFKA, - ARGO, - AIRFLOW; -} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/communication/clients/DefaultConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java similarity index 93% rename from src/main/java/de/fraunhofer/isst/configmanager/communication/clients/DefaultConnectorClient.java rename to src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java index 6e0f64d3..dac2d520 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/communication/clients/DefaultConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java @@ -1,10 +1,11 @@ -package de.fraunhofer.isst.configmanager.communication.clients; +package de.fraunhofer.isst.configmanager.connector.clients; import de.fraunhofer.iais.eis.BaseConnector; import de.fraunhofer.iais.eis.ConfigurationModel; import de.fraunhofer.iais.eis.Representation; import de.fraunhofer.iais.eis.Resource; -import de.fraunhofer.isst.configmanager.communication.dataspaceconnector.model.ResourceRepresentation; +import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.ResourceRepresentation; +import okhttp3.Response; import java.io.IOException; import java.net.URI; @@ -26,14 +27,13 @@ public interface DefaultConnectorClient { /** * The method helps to update connector in the broker. For this only the id of the - * corresponding broker - * is necessary. + * corresponding broker is necessary. * * @param brokerURI URI of the broker to update/register * @return Response of the update/register request of the connector * @throws IOException when sending the request fails */ - String updateAtBroker(String brokerURI) throws IOException; + Response updateAtBroker(String brokerURI) throws IOException; /** * The method removes the connector from the corresponding broker. For this only the id of @@ -84,7 +84,7 @@ public interface DefaultConnectorClient { /** - * Send a Resource update Request to a target Connector + * Send a Resource update Request to a target Connector. * * @param resourceID ID of the Resource that will be created * @param resource Resource to create @@ -146,6 +146,7 @@ public interface DefaultConnectorClient { * * @param resourceID ID of the Resource for which the representation is registered * @param representation representation to be registered + * @param endpointId ID of endpoint of the resource * @return Response of the target Connector * @throws IOException when an error occurs while sending the request */ @@ -158,12 +159,12 @@ String registerResourceRepresentation(String resourceID, Representation represen * @param resourceID ID of the Resource for which the representation is updated * @param representationID ID of the representation to be updated * @param representation representation to be updated + * @param endpointId ID of endpoint of the resource * @return Response of the target Connector * @throws IOException when an error occurs while sending the request */ String updateResourceRepresentation(String resourceID, String representationID, - Representation representation, String endpointId) - throws IOException; + Representation representation, String endpointId) throws IOException; /** * Updates a custom {@link ResourceRepresentation} at a connector. @@ -198,7 +199,7 @@ String updateCustomResourceRepresentation(String resourceID, String representati /** - * Returns the self declaration of a connector + * Returns the self declaration of a connector. * * @return base connector * @throws IOException when an error occurs while sending the request @@ -206,7 +207,7 @@ String updateCustomResourceRepresentation(String resourceID, String representati BaseConnector getSelfDeclaration() throws IOException; /** - * Returns the offered resources of the self declaration of a connector + * Returns the offered resources of the self declaration of a connector. * * @return json-string with all offered resources * @throws IOException when an error occurs while sending the request @@ -214,7 +215,7 @@ String updateCustomResourceRepresentation(String resourceID, String representati String getOfferedResourcesAsJsonString() throws IOException; /** - * Returns the requested resources of the self declaration of a connector + * Returns the requested resources of the self declaration of a connector. * * @return json-string with all requested resources * @throws IOException when an error occurs while sending the request @@ -222,7 +223,7 @@ String updateCustomResourceRepresentation(String resourceID, String representati String getRequestedResourcesAsJsonString() throws IOException; /** - * Sends a contract request to a connector by building an ContractRequestMessage + * Sends a contract request to a connector by building an ContractRequestMessage. * * @param recipientId id of the recipient * @param requestedArtifactId id of the requested artifact diff --git a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceConnectorClient.java similarity index 50% rename from src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java rename to src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceConnectorClient.java index d6626807..eecd0e28 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataspaceConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceConnectorClient.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.communication.dataspaceconnector; +package de.fraunhofer.isst.configmanager.connector.dataspaceconnector; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -7,14 +7,18 @@ import de.fraunhofer.iais.eis.Representation; import de.fraunhofer.iais.eis.Resource; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; -import de.fraunhofer.isst.configmanager.communication.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.communication.dataspaceconnector.model.BackendSource; -import de.fraunhofer.isst.configmanager.communication.dataspaceconnector.model.ResourceRepresentation; -import de.fraunhofer.isst.configmanager.util.OkHttpUtils; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; +import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.BackendSource; +import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.ResourceRepresentation; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; -import okhttp3.*; +import okhttp3.Credentials; +import okhttp3.HttpUrl; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; @@ -26,27 +30,15 @@ import java.util.UUID; /** - * A prototypical implementation of the interface DefaultConnectorClient for the dataspace - * connector. - * This can be used as a guide and can also be used for a specific connector. - *

- * The special feature here is that requests are sent to the connector via http. - * The corresponding host, port number and credentials can then be set to establish the connection. - * In addition it must be considered whether the model e.g. for a resource also corresponds to - * the model of the - * information model. If this is not the case, a mapping has to be done, see for example - * {@link de.fraunhofer.isst.configmanager.communication.dataspaceconnector.DataSpaceConnectorResourceMapper}. + * An implementation of the interface DefaultConnectorClient for the DataspaceConnector. */ @Slf4j @Service @ConditionalOnExpression("${dataspace.connector.enabled:false}") @FieldDefaults(level = AccessLevel.PRIVATE) public class DataspaceConnectorClient implements DefaultConnectorClient { - static final Serializer SERIALIZER = new Serializer(); - static final ObjectMapper MAPPER = new ObjectMapper(); - - transient final OkHttpClient client = OkHttpUtils.getUnsafeOkHttpClient(); - transient final DataSpaceConnectorResourceMapper dataSpaceConnectorResourceMapper; + final static Serializer SERIALIZER = new Serializer(); + final static ObjectMapper MAPPER = new ObjectMapper(); @Value("${dataspace.connector.host}") transient String dataSpaceConnectorHost; @@ -62,31 +54,39 @@ public class DataspaceConnectorClient implements DefaultConnectorClient { transient String protocol; - public DataspaceConnectorClient(final DataSpaceConnectorResourceMapper dataSpaceConnectorResourceMapper) { + final transient ResourceMapper dataSpaceConnectorResourceMapper; + + String connectorBaseUrl = ""; + + public DataspaceConnectorClient(final ResourceMapper dataSpaceConnectorResourceMapper) { this.dataSpaceConnectorResourceMapper = dataSpaceConnectorResourceMapper; } @Autowired - public void setProtocol(@Value("${dataspace.communication.ssl}") String https){ + public void setProtocol(final @Value("${dataspace.communication.ssl}") String https) { protocol = Boolean.parseBoolean(https) ? "https" : "http"; + connectorBaseUrl = protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/"; + log.info("---- [DataspaceConnectorClient setProtocol] Communication Protocol with DataspaceConnector is: " + protocol); } @Override public void getConnectorStatus() throws IOException { - final var connectorUrl = protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/"; - final var builder = new Request.Builder(); - builder.url(connectorUrl); + final var builder = getRequestBuilder(); + builder.url(connectorBaseUrl); builder.get(); final var request = builder.build(); - client.newCall(request).execute(); + DispatchRequest.sendToDataspaceConnector(request); } @Override - public String updateAtBroker(final String brokerURI) throws IOException { - log.info(String.format("---- [DataspaceConnectorClient updateAtBroker] updating connector %s at broker %s", dataSpaceConnectorHost, + public Response updateAtBroker(final String brokerURI) throws IOException { + log.info(String.format( + "---- [DataspaceConnectorClient updateAtBroker] updating connector %s at broker %s", + dataSpaceConnectorHost, brokerURI)); - final var builder = new Request.Builder(); + + final var builder = getRequestBuilder(); builder.url(new HttpUrl.Builder() .scheme(protocol) .host(dataSpaceConnectorHost) @@ -95,17 +95,22 @@ public String updateAtBroker(final String brokerURI) throws IOException { .addQueryParameter("broker", brokerURI) .build()); builder.post(RequestBody.create(brokerURI, okhttp3.MediaType.parse("text/html"))); - builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, - dataSpaceConnectorApiPassword)); + builder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + final var request = builder.build(); - return Objects.requireNonNull(client.newCall(request).execute().body()).string(); + + return DispatchRequest.sendToDataspaceConnector(request); } @Override public String unregisterAtBroker(final String brokerURI) throws IOException { - log.info(String.format("---- [DataspaceConnectorClient unregisterAtBroker] unregistering connector %s at broker %s", - dataSpaceConnectorHost, brokerURI)); - final var builder = new Request.Builder(); + log.info(String.format( + "---- [DataspaceConnectorClient unregisterAtBroker] unregistering connector %s at broker %s", + dataSpaceConnectorHost, + brokerURI)); + + final var builder = getRequestBuilder(); builder.url(new HttpUrl.Builder() .scheme(protocol) .host(dataSpaceConnectorHost) @@ -116,50 +121,74 @@ public String unregisterAtBroker(final String brokerURI) throws IOException { builder.post(RequestBody.create(brokerURI, okhttp3.MediaType.parse("text/html"))); builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + final var request = builder.build(); - return Objects.requireNonNull(client.newCall(request).execute().body()).string(); + + return Objects.requireNonNull(DispatchRequest.sendToDataspaceConnector(request).body()).string(); } @Override public ConfigurationModel getConfiguration() throws IOException { - final var builder = new Request.Builder(); - final var connectorUrl = - protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin/api" + - "/configuration"; - builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, - dataSpaceConnectorApiPassword)); + final var connectorUrl = connectorBaseUrl + "admin/api/configuration"; + + final var builder = getRequestBuilder(); + builder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); builder.url(connectorUrl); builder.get(); + final var request = builder.build(); - final var response = client.newCall(request).execute(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient getConfiguration] Could not get ConfigurationModel from {} with user {}. Response: {} - " + - "{}", - connectorUrl, dataSpaceConnectorApiUsername, response.code(), + log.warn("---- [DataspaceConnectorClient getConfiguration] Could not get ConfigurationModel from {} with user {}. Response: {} - {}", + connectorUrl, + dataSpaceConnectorApiUsername, + response.code(), response.message()); } + final var body = Objects.requireNonNull(response.body()).string(); - return SERIALIZER.deserialize(body, ConfigurationModel.class); + + ConfigurationModel configurationModel = null; + try { + configurationModel = SERIALIZER.deserialize(body, ConfigurationModel.class); + } catch (IOException e) { + log.error("---- [DataspaceConnectorClient getConfiguration] SERIALIZER.deserialize threw IOException"); + log.error(e.getMessage(), e); + } + + return configurationModel; } @Override public BaseConnector getSelfDeclaration() throws IOException { - final var builder = new Request.Builder(); - final var connectorUrl = - protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin/api" + - "/connector"; - builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, - dataSpaceConnectorApiPassword)); + final var connectorUrl = connectorBaseUrl + "admin/api/connector"; + + final var builder = getRequestBuilder(); + builder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); builder.url(connectorUrl); builder.get(); + final var request = builder.build(); - final var response = client.newCall(request).execute(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + if (!response.isSuccessful()) { log.warn("---- [DataspaceConnectorClient getSelfDeclaration] Could not get BaseConnector"); } final var body = Objects.requireNonNull(response.body()).string(); - return SERIALIZER.deserialize(body, BaseConnector.class); + + BaseConnector baseConnector = null; + try { + baseConnector = SERIALIZER.deserialize(body, BaseConnector.class); + } catch (IOException e) { + log.error("---- [DataspaceConnectorClient getSelfDeclaration] SERIALIZER.deserialize threw IOException"); + log.error(e.getMessage(), e); + } + + return baseConnector; } @Override @@ -177,21 +206,24 @@ public String getRequestedResourcesAsJsonString() throws IOException { } private JsonNode getJsonNodeOfBaseConnector() throws IOException { - final var builder = new Request.Builder(); - final var connectorUrl = - protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + - "/admin/api/connector"; + final var connectorUrl = connectorBaseUrl + "admin/api/connector"; + + final var builder = getRequestBuilder(); builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); builder.url(connectorUrl); builder.get(); + final var request = builder.build(); - final var response = client.newCall(request).execute(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + if (!response.isSuccessful()) { log.warn("---- [DataspaceConnectorClient getJsonNodeOfBaseConnector] Could not get BaseConnector"); } + final var body = Objects.requireNonNull(response.body()).string(); final var mapper = new ObjectMapper(); + return mapper.readTree(body); } @@ -199,119 +231,153 @@ private JsonNode getJsonNodeOfBaseConnector() throws IOException { @Override public boolean sendConfiguration(final String configurationModel) throws IOException { log.info(String.format("---- [DataspaceConnectorClient sendConfiguration] sending new configuration to %s", dataSpaceConnectorHost)); - final var builder = new Request.Builder(); - builder.url(protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + - "/api/configuration"); - builder.post(RequestBody.create(configurationModel, okhttp3.MediaType.parse("application" + - "/ld+json"))); + + final var builder = getRequestBuilder(); + builder.url(connectorBaseUrl + "admin/api/configuration"); + builder.post(RequestBody.create( + configurationModel, + okhttp3.MediaType.parse("application/ld+json"))); builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + final var request = builder.build(); - final var response = client.newCall(request).execute(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + var success = true; + if (!response.isSuccessful()) { - log.warn(String.format("---- [DataspaceConnectorClient sendConfiguration] Updating ConfigurationModel at %s failed!", - dataSpaceConnectorHost)); - return false; + log.warn("---- [DataspaceConnectorClient sendConfiguration] Updating ConfigurationModel failed!"); + success = false; } - return true; + + return success; } @Override public BaseConnector getBaseConnector(final String accessURL, final String resourceId) throws IOException { - final var builder = new Request.Builder(); + final var builder = getRequestBuilder(); final var urlBuilder = new HttpUrl.Builder() .scheme(protocol) .host(dataSpaceConnectorHost) .port(dataSpaceConnectorPort) .addPathSegments("admin/api/request/description") .addQueryParameter("recipient", accessURL); + if (resourceId != null && !resourceId.isBlank()) { urlBuilder.addQueryParameter("requestedResource", resourceId); } + final var url = urlBuilder.build(); - log.info("---- [DataspaceConnectorClient getBaseConnector] " + url.toString()); builder.url(url); builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); - builder.post(RequestBody.create(null, new byte[0])); + builder.post(RequestBody.create(new byte[0], null)); + + log.info("---- [DataspaceConnectorClient getBaseConnector] " + url.toString()); final var request = builder.build(); - final var response = client.newCall(request).execute(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + if (!response.isSuccessful()) { - log.warn(String.format("---- [DataspaceConnectorClient getBaseConnector] Could not get BaseConnector from %s!", - dataSpaceConnectorHost)); + log.warn("---- [DataspaceConnectorClient getBaseConnector] Could not get BaseConnector Info!"); } final var body = Objects.requireNonNull(response.body()).string(); - return SERIALIZER.deserialize(body, BaseConnector.class); + + BaseConnector baseConnector = null; + try { + baseConnector = SERIALIZER.deserialize(body, BaseConnector.class); + } catch (IOException e) { + log.error("---- [DataspaceConnectorClient getBaseConnector] SERIALIZER.deserialize threw IOException"); + log.error(e.getMessage(), e); + } + + return baseConnector; } @Override - public Resource getRequestedResource(String accessURL, String resourceId) throws IOException { - var builder = new Request.Builder(); - var urlBuilder = new HttpUrl.Builder() + public Resource getRequestedResource(final String accessURL, final String resourceId) throws IOException { + final var builder = getRequestBuilder(); + final var urlBuilder = new HttpUrl.Builder() .scheme(protocol) .host(dataSpaceConnectorHost) .port(dataSpaceConnectorPort) .addPathSegments("admin/api/request/description") .addQueryParameter("recipient", accessURL) .addQueryParameter("requestedResource", resourceId); - var url = urlBuilder.build(); - log.info(url.toString()); + + final var url = urlBuilder.build(); builder.url(url); builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); - builder.post(RequestBody.create(null, new byte[0])); - var request = builder.build(); - var response = client.newCall(request).execute(); + builder.post(RequestBody.create(new byte[0], null)); + + final var request = builder.build(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + if (!response.isSuccessful()) { - log.warn(String.format("Could not get BaseConnector from %s!", dataSpaceConnectorHost)); + log.warn(String.format("---- [DataspaceConnectorClient getRequestedResource] Could not get BaseConnector from %s!", dataSpaceConnectorHost)); + } + + final var body = Objects.requireNonNull(response.body()).string(); + final var splitBody = body.split("\n", 2); + final var resource = splitBody[1].substring(10); + + Resource deserializedResource = null; + try { + deserializedResource = SERIALIZER.deserialize(resource, Resource.class); + } catch (IOException e) { + log.error("---- [DataspaceConnectorClient getRequestedResource] SERIALIZER.deserialize threw IOException"); + log.error(e.getMessage(), e); } - var body = response.body().string(); - var splitBody = body.split("\n", 2); - String uuid = splitBody[0].substring(12); - log.info(uuid); - String resource = splitBody[1].substring(10); - log.info(resource); - return SERIALIZER.deserialize(resource, Resource.class); + + return deserializedResource; } @Override - public String requestContractAgreement(String recipientId, String requestedArtifactId, String contractOffer) throws IOException { - log.info("Request contract agreement with recipient: {} and artifact: {}", recipientId, requestedArtifactId); - var builder = new Request.Builder(); - var urlBuilder = new HttpUrl.Builder() + public String requestContractAgreement(final String recipientId, + final String requestedArtifactId, + final String contractOffer) throws IOException { + log.info("---- [DataspaceConnectorClient requestContractAgreement] Request contract agreement with recipient: {} and artifact: {}", recipientId, requestedArtifactId); + + final var builder = getRequestBuilder(); + final var urlBuilder = new HttpUrl.Builder() .scheme(protocol) .host(dataSpaceConnectorHost) .port(dataSpaceConnectorPort) .addPathSegments("admin/api/request/contract") .addQueryParameter("recipient", recipientId) .addQueryParameter("requestedArtifact", requestedArtifactId); - var url = urlBuilder.build(); - log.info(url.toString()); + + final var url = urlBuilder.build(); builder.url(url); builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + if (contractOffer != null && !contractOffer.isBlank()) { builder.post(RequestBody.create(contractOffer, okhttp3.MediaType.parse("application/ld+json"))); } else { - builder.post(RequestBody.create(null, new byte[0])); + builder.post(RequestBody.create(new byte[0], null)); } - var request = builder.build(); - var response = client.newCall(request).execute(); + + final var request = builder.build(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + if (!response.isSuccessful()) { - log.warn("Could not request contract agreement"); + log.warn("---- [DataspaceConnectorClient requestContractAgreement] Could not request contract agreement"); } - var body = response.body().string(); - log.info("Response: " + body); - return body; + + return Objects.requireNonNull(response.body()).string(); } @Override public String registerResource(final Resource resource) throws IOException { - log.info(String.format("---- [DataspaceConnectorClient registerResource] registering resource at %s", dataSpaceConnectorHost)); + log.info("---- [DataspaceConnectorClient registerResource] Registering resource..."); + final var mappedResource = dataSpaceConnectorResourceMapper.getMetadata(resource); final var resourceJsonLD = MAPPER.writeValueAsString(mappedResource); - log.info("---- [DataspaceConnectorClient registerResource] new resource: " + resourceJsonLD); - final var builder = new Request.Builder(); + + log.info("---- [DataspaceConnectorClient registerResource] New resource: " + resourceJsonLD); + + final var builder = getRequestBuilder(); final var path = resource.getId().getPath(); final var idStr = path.substring(path.lastIndexOf('/') + 1); + final var url = new HttpUrl.Builder() .scheme(protocol) .host(dataSpaceConnectorHost) @@ -319,18 +385,21 @@ public String registerResource(final Resource resource) throws IOException { .addPathSegments("admin/api/resources/resource") .addQueryParameter("id", idStr) .build(); - log.info("---- [DataspaceConnectorClient registerResource] " + url.toString()); builder.url(url); builder.post(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld" + "+json"))); - builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, - dataSpaceConnectorApiPassword)); + builder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + + log.info("---- [DataspaceConnectorClient registerResource] " + url.toString()); + final var request = builder.build(); - final var response = client.newCall(request).execute(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + if (!response.isSuccessful()) { - log.warn(String.format("---- [DataspaceConnectorClient registerResource] Registering Resource at %s failed!", - dataSpaceConnectorHost)); + log.warn("---- [DataspaceConnectorClient registerResource] Registering Resource failed!"); } + return Objects.requireNonNull(response.body()).string(); } @@ -338,29 +407,34 @@ public String registerResource(final Resource resource) throws IOException { public String deleteResource(final URI resourceID) throws IOException { log.info(String.format("---- [DataspaceConnectorClient deleteResource] deleting resource %s at %s", resourceID, dataSpaceConnectorHost)); + final var path = resourceID.getPath(); final var idStr = path.substring(path.lastIndexOf('/') + 1); - final var builder = new Request.Builder(); - builder.url(protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + - "/api/resources/" + idStr); + + final var builder = getRequestBuilder(); + builder.url(connectorBaseUrl + "admin/api/resources/" + idStr); builder.delete(); - builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, - dataSpaceConnectorApiPassword)); + builder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); final var request = builder.build(); - final var response = client.newCall(request).execute(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + if (!response.isSuccessful()) { - log.warn(String.format("---- [DataspaceConnectorClient deleteResource] Deleting Resource at %s failed!", dataSpaceConnectorHost)); + log.warn("---- [DataspaceConnectorClient deleteResource] Deleting Resource failed!"); } + return Objects.requireNonNull(response.body()).string(); } @Override public String updateResourceAtBroker(final String brokerUri, final URI resourceID) throws IOException { log.info(String.format("---- [DataspaceConnectorClient updateResourceAtBroker] updating resource at Broker %s", brokerUri)); + final var path = resourceID.getPath(); final var idStr = path.substring(path.lastIndexOf('/') + 1); final var resourceUUID = UUID.fromString(idStr); - final var builder = new Request.Builder(); + + final var builder = getRequestBuilder(); builder.url(new HttpUrl.Builder() .scheme(protocol) .host(dataSpaceConnectorHost) @@ -368,23 +442,26 @@ public String updateResourceAtBroker(final String brokerUri, final URI resourceI .addPathSegments("admin/api/broker/update/" + resourceUUID) .addQueryParameter("broker", brokerUri) .build()); - builder.post(RequestBody.create(null, new byte[0])); - builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, - dataSpaceConnectorApiPassword)); + builder.post(RequestBody.create(new byte[0], null)); + builder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); final var request = builder.build(); - final var response = client.newCall(request).execute(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + if (!response.isSuccessful()) { - log.warn(String.format("---- [DataspaceConnectorClient updateResourceAtBroker] Updating Resource at Broker %s failed!", brokerUri)); + log.warn("---- [DataspaceConnectorClient updateResourceAtBroker] Updating Resource at Broker failed!"); } + return Objects.requireNonNull(response.body()).string(); } @Override public String deleteResourceAtBroker(final String brokerUri, final URI resourceID) throws IOException { - log.info(String.format("---- [DataspaceConnectorClient deleteResourceAtBroker] deleting resource %s at Broker %s", resourceID, brokerUri)); + log.info(String.format("---- [DataspaceConnectorClient deleteResourceAtBroker] Deleting resource %s at Broker %s", resourceID, brokerUri)); + final var path = resourceID.getPath(); final var idStr = path.substring(path.lastIndexOf('/') + 1); - final var builder = new Request.Builder(); + final var builder = getRequestBuilder(); builder.url(new HttpUrl.Builder() .scheme(protocol) .host(dataSpaceConnectorHost) @@ -392,39 +469,47 @@ public String deleteResourceAtBroker(final String brokerUri, final URI resourceI .addPathSegments("admin/api/broker/remove/" + idStr) .addQueryParameter("broker", brokerUri) .build()); - builder.post(RequestBody.create(null, new byte[0])); - builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, - dataSpaceConnectorApiPassword)); + builder.post(RequestBody.create(new byte[0], null)); + builder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + final var request = builder.build(); - final var response = client.newCall(request).execute(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + if (!response.isSuccessful()) { - log.warn(String.format("---- [DataspaceConnectorClient deleteResourceAtBroker] Deleting Resource at Broker %s failed!", brokerUri)); + log.warn("---- [DataspaceConnectorClient deleteResourceAtBroker] Deleting Resource at Broker failed!"); } + return Objects.requireNonNull(response.body()).string(); } @Override public String deleteResourceRepresentation(final String resourceID, final String representationID) throws IOException { - log.info(String.format("---- [DataspaceConnectorClient deleteResourceRepresentation] deleting representation %s from resource %s at %s", - representationID, resourceID, dataSpaceConnectorHost)); - final var builder = new Request.Builder(); - final var mappedResourceID = - dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); - final var mappedRepresentationID = - dataSpaceConnectorResourceMapper.getMappedId(URI.create(representationID)); + log.info(String.format( + "---- [DataspaceConnectorClient deleteResourceRepresentation] Deleting representation %s from resource %s at %s", + representationID, + resourceID, + dataSpaceConnectorHost)); + + + final var mappedResourceID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); + final var mappedRepresentationID = dataSpaceConnectorResourceMapper.getMappedId(URI.create(representationID)); dataSpaceConnectorResourceMapper.deleteResourceIDPair(URI.create(representationID)); - builder.url(protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + - "/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); + + final var builder = getRequestBuilder(); + builder.url(connectorBaseUrl + "admin/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); builder.delete(); - builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, - dataSpaceConnectorApiPassword)); + builder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + final var request = builder.build(); - final var response = client.newCall(request).execute(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + if (!response.isSuccessful()) { - log.warn(String.format("---- [DataspaceConnectorClient deleteResourceRepresentation] Deleting Representation at %s failed!", - dataSpaceConnectorHost)); + log.warn("---- [DataspaceConnectorClient deleteResourceRepresentation] Deleting Representation failed!"); } + return Objects.requireNonNull(response.body()).string(); } @@ -432,19 +517,19 @@ public String deleteResourceRepresentation(final String resourceID, public String registerResourceRepresentation(final String resourceID, final Representation representation, final String endpointId) throws IOException { - log.info(String.format("---- [DataspaceConnectorClient registerResourceRepresentation] registering resource at %s", dataSpaceConnectorHost)); - final var mappedRepresentation = - dataSpaceConnectorResourceMapper.mapRepresentation(representation); - final var backendSource = dataSpaceConnectorResourceMapper.createBackendSource(endpointId - , representation); + log.info(String.format("---- [DataspaceConnectorClient registerResourceRepresentation] Registering resource at %s", dataSpaceConnectorHost)); + + final var mappedRepresentation = dataSpaceConnectorResourceMapper.mapRepresentation(representation); + final var backendSource = dataSpaceConnectorResourceMapper.createBackendSource(endpointId, representation); mappedRepresentation.setSource(backendSource); - final var mappedResourceID = - dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); - final var mappedRepresentationID = - dataSpaceConnectorResourceMapper.readUUIDFromURI(representation.getId()); + + final var mappedResourceID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); + final var mappedRepresentationID = dataSpaceConnectorResourceMapper.readUUIDFromURI(representation.getId()); final var resourceJsonLD = MAPPER.writeValueAsString(mappedRepresentation); - log.info("---- [DataspaceConnectorClient registerResourceRepresentation] mapped representation: " + resourceJsonLD); - final var builder = new Request.Builder(); + + log.info("---- [DataspaceConnectorClient registerResourceRepresentation] Mapped representation: " + resourceJsonLD); + + final var builder = getRequestBuilder(); builder.url(new HttpUrl.Builder() .scheme(protocol) .host(dataSpaceConnectorHost) @@ -452,24 +537,26 @@ public String registerResourceRepresentation(final String resourceID, .addPathSegments("admin/api/resources/" + mappedResourceID + "/representation") .addQueryParameter("id", mappedRepresentationID.toString()) .build()); - builder.post(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld" + - "+json"))); - builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, - dataSpaceConnectorApiPassword)); + builder.post(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld+json"))); + builder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + final var request = builder.build(); - final var response = client.newCall(request).execute(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + if (!response.isSuccessful()) { - log.warn(String.format("---- [DataspaceConnectorClient registerResourceRepresentation] Registering Representation at %s failed!", - dataSpaceConnectorHost)); + log.warn("---- [DataspaceConnectorClient registerResourceRepresentation] Registering Representation failed!"); } + final var body = Objects.requireNonNull(response.body()).string(); - final var uuid = dataSpaceConnectorResourceMapper.createFromResponse(body, - representation.getId()); + final var uuid = dataSpaceConnectorResourceMapper.createFromResponse(body, representation.getId()); + if (uuid == null) { log.warn("---- [DataspaceConnectorClient registerResourceRepresentation] Could not parse ID from response!"); } else { log.info("---- [DataspaceConnectorClient registerResourceRepresentation] UUID is : " + uuid); } + return body; } @@ -478,133 +565,140 @@ public String updateResourceRepresentation(final String resourceID, final String representationID, final Representation representation, final String endpointId) throws IOException { - log.info(String.format("---- [DataspaceConnectorClient updateResourceRepresentation] updating representation %s for resource %s at %s", - representationID, resourceID, dataSpaceConnectorHost)); - final var mappedResourceID = - dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); - final var mappedRepresentationID = - dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(representationID)); - final var mappedRepresentation = - dataSpaceConnectorResourceMapper.mapRepresentation(representation); - final var backendSource = dataSpaceConnectorResourceMapper.createBackendSource(endpointId - , representation); + log.info(String.format( + "---- [DataspaceConnectorClient updateResourceRepresentation] Updating representation %s for resource %s at %s", + representationID, + resourceID, + dataSpaceConnectorHost)); + + final var mappedResourceID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); + final var mappedRepresentationID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(representationID)); + final var mappedRepresentation = dataSpaceConnectorResourceMapper.mapRepresentation(representation); + final var backendSource = dataSpaceConnectorResourceMapper.createBackendSource(endpointId, representation); + mappedRepresentation.setSource(backendSource); + final var resourceJsonLD = MAPPER.writeValueAsString(mappedRepresentation); - log.info("---- [DataspaceConnectorClient updateResourceRepresentation] mapped representation: " + resourceJsonLD); - final var builder = new Request.Builder(); - log.info("---- [DataspaceConnectorClient updateResourceRepresentation] Calling DSC at: " + protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); - builder.url(protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + - "/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); - builder.put(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld" + - "+json"))); - builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, - dataSpaceConnectorApiPassword)); + + log.info("---- [DataspaceConnectorClient updateResourceRepresentation] Mapped representation: " + resourceJsonLD); + + final var builder = getRequestBuilder(); + + builder.url(connectorBaseUrl + "admin/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); + builder.put(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld+json"))); + builder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + final var request = builder.build(); - final var response = client.newCall(request).execute(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + if (!response.isSuccessful()) { - log.warn(String.format("---- [DataspaceConnectorClient updateResourceRepresentation] Updating Representation at %s failed!", - dataSpaceConnectorHost)); + log.warn("---- [DataspaceConnectorClient updateResourceRepresentation] Updating Representation failed!"); } - final var body = Objects.requireNonNull(response.body()).string(); - log.info("---- [DataspaceConnectorClient updateResourceRepresentation] Response: " + body); - return body; + + return Objects.requireNonNull(response.body()).string(); } @Override public String updateCustomResourceRepresentation(final String resourceID, final String representationID, final ResourceRepresentation resourceRepresentation) throws IOException { - log.info(String.format("---- [DataspaceConnectorClient updateCustomResourceRepresentation] updating representation %s for resource %s at %s", - representationID, resourceID, dataSpaceConnectorHost)); - final var mappedResourceID = - dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); - final var mappedRepresentationID = - dataSpaceConnectorResourceMapper.getMappedId(URI.create(representationID)); + log.info(String.format( + "---- [DataspaceConnectorClient updateCustomResourceRepresentation] Updating representation %s for resource %s at %s", + representationID, + resourceID, + dataSpaceConnectorHost)); + + final var mappedResourceID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); + final var mappedRepresentationID = dataSpaceConnectorResourceMapper.getMappedId(URI.create(representationID)); final var resourceJsonLD = MAPPER.writeValueAsString(resourceRepresentation); - log.info("---- [DataspaceConnectorClient updateCustomResourceRepresentation] mapped representation: " + resourceJsonLD); - final var builder = new Request.Builder(); - builder.url(protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + - "/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); - builder.put(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld" + - "+json"))); + + log.info("---- [DataspaceConnectorClient updateCustomResourceRepresentation] Mapped representation: " + resourceJsonLD); + + final var builder = getRequestBuilder(); + builder.url(connectorBaseUrl + "admin/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); + builder.put(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld+json"))); builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + final var request = builder.build(); - final var response = client.newCall(request).execute(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + if (!response.isSuccessful()) { - log.warn(String.format("---- [DataspaceConnectorClient updateCustomResourceRepresentation] Updating custom resource Representation at %s failed!", - dataSpaceConnectorHost)); + log.warn("---- [DataspaceConnectorClient updateCustomResourceRepresentation] Updating Resource-Representation failed!"); } - final var body = Objects.requireNonNull(response.body()).string(); - log.info("---- [DataspaceConnectorClient updateCustomResourceRepresentation] Response: " + body); - return body; + + return Objects.requireNonNull(response.body()).string(); } @Override public String updateResourceContract(final String resourceID, final String contract) throws IOException { - log.info(String.format("---- [DataspaceConnectorClient updateResourceContract] updating contract for resource at %s", + log.info(String.format( + "---- [DataspaceConnectorClient updateResourceContract] updating contract for resource at %s", dataSpaceConnectorHost)); - final var mappedResourceID = - dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); -// var resourceJsonLD = SERIALIZER.serialize(contract); - final var builder = new Request.Builder(); - builder.url(protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + - "/api/resources/" + mappedResourceID + "/contract"); + + final var mappedResourceID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); + + final var builder = getRequestBuilder(); + builder.url(connectorBaseUrl + "admin/api/resources/" + mappedResourceID + "/contract"); builder.put(RequestBody.create(contract, okhttp3.MediaType.parse("application/ld+json"))); builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + final var request = builder.build(); - final var response = client.newCall(request).execute(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + if (!response.isSuccessful()) { - log.warn(String.format("---- [DataspaceConnectorClient updateResourceContract] Updating Contract at %s failed!", dataSpaceConnectorHost)); + log.warn("---- [DataspaceConnectorClient updateResourceContract] Updating contract failed!"); } - final var body = Objects.requireNonNull(response.body()).string(); - log.info("---- [DataspaceConnectorClient updateResourceContract] Response: " + body); - return body; + + return Objects.requireNonNull(response.body()).string(); } @Override public String getPolicyPattern(final String policy) throws IOException { - log.info(String.format("---- [DataspaceConnectorClient getPolicyPattern] Get pattern for policy")); - final var builder = new Request.Builder(); - builder.url(protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + - "/api/example/policy-validation"); + log.info("---- [DataspaceConnectorClient getPolicyPattern] Get pattern for policy"); + + final var builder = getRequestBuilder(); + builder.url(connectorBaseUrl + "/admin/api/example/policy-validation"); builder.post(RequestBody.create(policy, okhttp3.MediaType.parse("application/ld+json"))); - builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, - dataSpaceConnectorApiPassword)); + builder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + final var request = builder.build(); - final var response = client.newCall(request).execute(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + if (!response.isSuccessful()) { - log.warn("---- Pattern for policy could not be determined"); + log.warn("---- [DataspaceConnectorClient getPolicyPattern] Pattern for policy could not be determined"); } - final var body = Objects.requireNonNull(response.body()).string(); - log.info("---- Response: " + body); - return body; + + return Objects.requireNonNull(response.body()).string(); } @Override public String updateResource(final URI resourceID, final Resource resource) throws IOException { log.info(String.format("---- [DataspaceConnectorClient updateResource] updating resource at %s", dataSpaceConnectorHost)); + final var mappedResource = dataSpaceConnectorResourceMapper.getMetadata(resource); final var path = resourceID.getPath(); final var idStr = path.substring(path.lastIndexOf('/') + 1); final var resourceUUID = UUID.fromString(idStr); - BackendSource backendSource = new BackendSource(); + final var backendSource = new BackendSource(); try { - final var requestBackendBuilder = new Request.Builder(); - requestBackendBuilder.url(protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + - "/api/resources/" + resourceUUID); + final var requestBackendBuilder = getRequestBuilder(); + requestBackendBuilder.url(connectorBaseUrl + "admin/api/resources/" + resourceUUID); requestBackendBuilder.get(); - requestBackendBuilder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, - dataSpaceConnectorApiPassword)); - final var request = requestBackendBuilder.build(); - final var response = client.newCall(request).execute(); + requestBackendBuilder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + final var request = requestBackendBuilder.build(); + final var response = DispatchRequest.sendToDataspaceConnector(request); final var mapper = new ObjectMapper(); final var jsonTree = mapper.readTree(Objects.requireNonNull(response.body()).string()); - JsonNode source = jsonTree.findValue("source"); - backendSource.setType(BackendSource.Type.valueOf(source.get("type").asText().toUpperCase().replace("-","_"))); + + final var source = jsonTree.findValue("source"); + backendSource.setType(BackendSource.Type.valueOf(source.get("type").asText().toUpperCase().replace("-", "_"))); backendSource.setUrl(URI.create(source.get("url").asText())); backendSource.setUsername(source.get("username").asText()); backendSource.setPassword(source.get("password").asText()); @@ -613,21 +707,25 @@ public String updateResource(final URI resourceID, final Resource resource) thro } mappedResource.getRepresentations().get(0).setSource(backendSource); - var resourceJsonLD = MAPPER.writeValueAsString(mappedResource); + final var resourceJsonLD = MAPPER.writeValueAsString(mappedResource); - final var builder = new Request.Builder(); - builder.url(protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/admin" + - "/api/resources/" + resourceUUID); + final var builder = getRequestBuilder(); + builder.url(connectorBaseUrl + "admin/api/resources/" + resourceUUID); builder.put(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld+json"))); - builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, - dataSpaceConnectorApiPassword)); + builder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); final var request = builder.build(); - final var response = client.newCall(request).execute(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + if (!response.isSuccessful()) { - log.warn(String.format("---- [DataspaceConnectorClient updateResource] Updating Resource at %s failed!", dataSpaceConnectorHost)); + log.warn("---- [DataspaceConnectorClient updateResource] Updating Resource failed!"); } - final var body = Objects.requireNonNull(response.body()).string(); - log.info("---- [DataspaceConnectorClient updateResource] Response: " + body); - return body; + + return Objects.requireNonNull(response.body()).string(); + } + + @NotNull + private Request.Builder getRequestBuilder() { + return new Request.Builder(); } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DispatchRequest.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DispatchRequest.java new file mode 100644 index 00000000..913586f0 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DispatchRequest.java @@ -0,0 +1,20 @@ +package de.fraunhofer.isst.configmanager.connector.dataspaceconnector; + +import de.fraunhofer.isst.configmanager.util.OkHttpUtils; +import lombok.experimental.UtilityClass; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; + +@UtilityClass +public class DispatchRequest { + final static transient OkHttpClient OK_HTTP_CLIENT = OkHttpUtils.getUnsafeOkHttpClient(); + + @NotNull + public static Response sendToDataspaceConnector(final Request request) throws IOException { + return OK_HTTP_CLIENT.newCall(request).execute(); + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataSpaceConnectorResourceMapper.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/ResourceMapper.java similarity index 79% rename from src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataSpaceConnectorResourceMapper.java rename to src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/ResourceMapper.java index 24dc1c6c..d754d107 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/DataSpaceConnectorResourceMapper.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/ResourceMapper.java @@ -1,18 +1,23 @@ -package de.fraunhofer.isst.configmanager.communication.dataspaceconnector; +package de.fraunhofer.isst.configmanager.connector.dataspaceconnector; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.Artifact; +import de.fraunhofer.iais.eis.BasicAuthenticationImpl; +import de.fraunhofer.iais.eis.GenericEndpoint; +import de.fraunhofer.iais.eis.Representation; +import de.fraunhofer.iais.eis.Resource; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.iais.eis.util.RdfResource; import de.fraunhofer.iais.eis.util.TypedLiteral; -import de.fraunhofer.isst.configmanager.communication.dataspaceconnector.model.BackendSource; -import de.fraunhofer.isst.configmanager.communication.dataspaceconnector.model.ResourceIDPair; -import de.fraunhofer.isst.configmanager.communication.dataspaceconnector.model.ResourceMetadata; -import de.fraunhofer.isst.configmanager.communication.dataspaceconnector.model.ResourceRepresentation; -import de.fraunhofer.isst.configmanager.communication.dataspaceconnector.model.repos.ResourceIDPairRepository; -import de.fraunhofer.isst.configmanager.configmanagement.service.EndpointService; +import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.BackendSource; +import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.ResourceIDPair; +import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.ResourceMetadata; +import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.ResourceRepresentation; +import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.repos.ResourceIDPairRepository; +import de.fraunhofer.isst.configmanager.api.service.EndpointService; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.net.URI; @@ -23,28 +28,21 @@ /** * The service class helps to map the resource model from the information model to the resource - * model from the - * dataspace connector. + * model from the dataspace connector. */ @Service +@Transactional @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -public class DataSpaceConnectorResourceMapper { +public class ResourceMapper { - static Serializer SERIALIZER = new Serializer(); - /** - * Pattern is created, which has the following structure: - * Example: - * URI: https://w3id.org/idsa/autogen/configurationModel/9abd295d-b96f-49fa-8c10-a64179c24049 -> - * UUID_REGEX: 9abd295d-b96f-49fa-8c10-a64179c24049 - */ - static Pattern UUID_REGEX = Pattern.compile("[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a" + - "-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"); + static Serializer serializer = new Serializer(); + static Pattern uuidRegex = Pattern.compile("[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"); transient EndpointService endpointService; transient ResourceIDPairRepository resourceIDPairRepository; - public DataSpaceConnectorResourceMapper(final ResourceIDPairRepository resourceIDPairRepository, - final EndpointService endpointService) { + public ResourceMapper(final ResourceIDPairRepository resourceIDPairRepository, + final EndpointService endpointService) { this.resourceIDPairRepository = resourceIDPairRepository; this.endpointService = endpointService; } @@ -80,17 +78,15 @@ public UUID readUUIDFromURI(final URI id) { /** * This method takes the response from the connector and generates a ResourceIDPair, which - * holds the uri - * and the uuid. This is be persisted in the database and finally the method returns the - * extracted uuid - * from the response. + * holds the uri and the uuid. This is be persisted in the database and finally the method returns the + * extracted uuid from the response. * * @param response of the connector * @param id of the resource * @return uuid */ public UUID createFromResponse(final String response, final URI id) { - final var matcher = UUID_REGEX.matcher(response); + final var matcher = uuidRegex.matcher(response); if (matcher.find()) { final var uuidString = matcher.group(0); final var uuid = UUID.fromString(uuidString); @@ -103,8 +99,7 @@ public UUID createFromResponse(final String response, final URI id) { /** * The method helps to map resource metadata from the information model to resource metadata - * from the - * dataspace connector. + * from the dataspace connector. * * @param resource object * @return resource metadata object @@ -118,7 +113,7 @@ public ResourceMetadata getMetadata(final Resource resource) throws IOException metadata.setOwner(resource.getPublisher()); metadata.setVersion(resource.getVersion()); if (resource.getContractOffer() != null && !resource.getContractOffer().isEmpty()) { - metadata.setPolicy(SERIALIZER.serialize(resource.getContractOffer())); + metadata.setPolicy(serializer.serialize(resource.getContractOffer())); } metadata.setRepresentations(mapRepresentations(resource.getRepresentation())); metadata.setTitle(resource.getTitle().stream().map(RdfResource::getValue).collect(Collectors.joining(";"))); @@ -143,7 +138,7 @@ private List mapRepresentations(final List resourceIDPairRepository.delete(pair)); + pairs.forEach(resourceIDPairRepository::delete); resourceIDPairRepository.flush(); } /** - * This method creates a new backend source for the representation + * This method creates a new backend source for the representation. * * @param endpointId id of the endpoint * @param representation representation diff --git a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/model/BackendSource.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/BackendSource.java similarity index 73% rename from src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/model/BackendSource.java rename to src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/BackendSource.java index b0624bb6..b8bc71bc 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/model/BackendSource.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/BackendSource.java @@ -1,7 +1,6 @@ -package de.fraunhofer.isst.configmanager.communication.dataspaceconnector.model; +package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model; import com.fasterxml.jackson.annotation.JsonProperty; -import io.swagger.v3.oas.annotations.media.Schema; import lombok.AccessLevel; import lombok.Data; import lombok.experimental.FieldDefaults; @@ -9,22 +8,20 @@ import java.io.Serializable; import java.net.URI; - -@Schema( - name = "BackendSource", - description = "Information of the backend system.", - oneOf = BackendSource.class -) @Data @FieldDefaults(level = AccessLevel.PRIVATE) public class BackendSource implements Serializable { + private static final long serialVersionUID = 42L; @JsonProperty("type") Type type; + @JsonProperty("url") URI url; + @JsonProperty("username") String username; + @JsonProperty("password") String password; @@ -37,11 +34,6 @@ public BackendSource() { /** * This enum is used to describe how the backend is accessed. */ - @Schema( - name = "Type", - description = "Information of the backend system.", - oneOf = Type.class - ) public enum Type { @JsonProperty("local") LOCAL("local"), diff --git a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/model/ResourceIDPair.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/ResourceIDPair.java similarity index 75% rename from src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/model/ResourceIDPair.java rename to src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/ResourceIDPair.java index 29ad1b53..74fd697e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/model/ResourceIDPair.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/ResourceIDPair.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.communication.dataspaceconnector.model; +package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -14,13 +14,12 @@ /** * The class helps to store the resource uri and the uuid in the object. This is needed because - * the implementation - * refers to the dataspace connector and there the uuid is used for the unique identification. + * the implementation refers to the dataspace connector and there the uuid is used for the unique identification. */ +@Getter @Entity @NoArgsConstructor @AllArgsConstructor -@Getter @FieldDefaults(level = AccessLevel.PRIVATE) public class ResourceIDPair { @Id diff --git a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/model/ResourceMetadata.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/ResourceMetadata.java similarity index 65% rename from src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/model/ResourceMetadata.java rename to src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/ResourceMetadata.java index c005ae76..1d6754c2 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/model/ResourceMetadata.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/ResourceMetadata.java @@ -1,9 +1,8 @@ -package de.fraunhofer.isst.configmanager.communication.dataspaceconnector.model; +package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import io.swagger.v3.oas.annotations.media.Schema; import lombok.AccessLevel; import lombok.Data; import lombok.experimental.FieldDefaults; @@ -18,31 +17,13 @@ /** * This class provides a model to handle data resource metadata. - * - * @author Julia Pampus - * @version $Id: $Id */ -@Schema( - name = "ResourceMetadata", - description = "Metadata of a resource", - oneOf = ResourceMetadata.class, - example = "{\n" + - " \"title\": \"Sample Resource\",\n" + - " \"description\": \"This is an example resource containing weather data.\",\n" + - " \"keywords\": [\n" + - " \"weather\",\n" + - " \"data\",\n" + - " \"sample\"\n" + - " ],\n" + - " \"owner\": \"https://openweathermap.org/\",\n" + - " \"license\": \"ODbL\",\n" + - " \"version\": \"1.0\"\n" + - "}\n" -) @Data @Slf4j @FieldDefaults(level = AccessLevel.PRIVATE) public class ResourceMetadata implements Serializable { + private static final long serialVersionUID = 42L; + @JsonProperty("title") String title; @@ -79,11 +60,13 @@ public class ResourceMetadata implements Serializable { public String toString() { final var mapper = new ObjectMapper(); String jsonString = null; + try { jsonString = mapper.writeValueAsString(this); } catch (JsonProcessingException e) { log.error(e.getMessage(), e); } + return jsonString; } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/ResourceRepresentation.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/ResourceRepresentation.java new file mode 100644 index 00000000..fa57a05b --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/ResourceRepresentation.java @@ -0,0 +1,34 @@ +package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AccessLevel; +import lombok.Data; +import lombok.experimental.FieldDefaults; + +import javax.persistence.Column; +import javax.persistence.Id; +import java.io.Serializable; +import java.util.UUID; + +/** + * ResourceRepresentation class. + */ +@Data +@FieldDefaults(level = AccessLevel.PRIVATE) +public class ResourceRepresentation implements Serializable { + private static final long serialVersionUID = 42L; + + @Id + @JsonProperty("uuid") + UUID uuid; + + @JsonProperty("type") + String type; + + @JsonProperty("byteSize") + Integer byteSize; + + @JsonProperty("source") + @Column(columnDefinition = "BLOB") + BackendSource source; +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/model/repos/ResourceIDPairRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/repos/ResourceIDPairRepository.java similarity index 74% rename from src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/model/repos/ResourceIDPairRepository.java rename to src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/repos/ResourceIDPairRepository.java index 9b78bff0..b90f4206 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/communication/dataspaceconnector/model/repos/ResourceIDPairRepository.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/repos/ResourceIDPairRepository.java @@ -1,6 +1,6 @@ -package de.fraunhofer.isst.configmanager.communication.dataspaceconnector.model.repos; +package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.repos; -import de.fraunhofer.isst.configmanager.communication.dataspaceconnector.model.ResourceIDPair; +import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.ResourceIDPair; import org.springframework.data.jpa.repository.JpaRepository; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorRequestUIController.java b/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorRequestUIController.java deleted file mode 100644 index 3eca7e2b..00000000 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/ConnectorRequestUIController.java +++ /dev/null @@ -1,100 +0,0 @@ -package de.fraunhofer.isst.configmanager.controller; - -import com.fasterxml.jackson.databind.ObjectMapper; -import de.fraunhofer.iais.eis.Resource; -import de.fraunhofer.iais.eis.ids.jsonld.Serializer; -import de.fraunhofer.isst.configmanager.configmanagement.service.ConnectorRequestService; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.extern.slf4j.Slf4j; -import net.minidev.json.JSONObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.io.IOException; -import java.net.URI; -import java.util.List; - -/** - * The controller class implements the ConnectorRequestApi and offers the possibilities to manage - * the request to external connectors. - */ -@RestController -@Slf4j -@RequestMapping("/api/ui") -@Tag(name = "Connector Request Management", description = "Endpoints for managing connector requests") -public class ConnectorRequestUIController implements ConnectorRequestApi { - - private final ConnectorRequestService connectorRequestService; - - private final ObjectMapper objectMapper; - private final Serializer serializer; - - @Autowired - public ConnectorRequestUIController(ConnectorRequestService connectorRequestService, - ObjectMapper objectMapper, - Serializer serializer) { - this.connectorRequestService = connectorRequestService; - this.objectMapper = objectMapper; - this.serializer = serializer; - } - - /** - * This method request metadata from an IDS connector. - * - * @param recipientId uri of the requested IDS connector - * @param requestedResourceId uri of the requested resource - * @return if reqResourceId is set, then the resource will be returned otherwise the IDS connector - */ - @Override - public ResponseEntity requestMetadata(URI recipientId, URI requestedResourceId) { - - if (requestedResourceId != null) { - Resource resource = connectorRequestService.requestResource(recipientId, requestedResourceId); - if (resource != null) { - try { - return ResponseEntity.ok(serializer.serialize(resource)); - } catch (IOException e) { - log.error(e.getMessage()); - return ResponseEntity.badRequest().body("Problems while serializing the resource"); - } - } else { - return ResponseEntity.badRequest().body("Could not get resource from the requested connector"); - } - } else { - List resources = connectorRequestService.requestResourcesFromConnector(recipientId); - if (resources != null && resources.size() > 0) { - try { - return ResponseEntity.ok(serializer.serialize(resources)); - } catch (IOException e) { - log.error(e.getMessage(), e); - return ResponseEntity.badRequest().body("Problems while serializing the list of resources"); - } - } else { - return ResponseEntity.badRequest().body("Could not get resources from the requested connector"); - } - } - } - - @Override - public ResponseEntity requestContract(URI recipientId, URI requestedArtifactId, String contractOffer) { - - String contractAgreementId = connectorRequestService - .requestContractAgreement(recipientId.toString(), requestedArtifactId.toString(), contractOffer); - if (contractAgreementId != null) { - var jsonObject = new JSONObject(); - if (contractAgreementId.contains("Failed")) { - jsonObject.put("message", contractAgreementId); - return ResponseEntity.badRequest().body(jsonObject.toJSONString()); - } else { - jsonObject.put("agreementId", contractAgreementId); - return ResponseEntity.ok(jsonObject.toJSONString()); - } - } else { - return ResponseEntity.badRequest().body("Could not get agreement id for the contract"); - } - } -} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceContractUIController.java b/src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceContractUIController.java deleted file mode 100644 index f6c1dc05..00000000 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/ResourceContractUIController.java +++ /dev/null @@ -1,123 +0,0 @@ -package de.fraunhofer.isst.configmanager.controller; - -import de.fraunhofer.iais.eis.ContractOffer; -import de.fraunhofer.iais.eis.ids.jsonld.Serializer; -import de.fraunhofer.isst.configmanager.communication.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.configmanagement.service.ConfigModelService; -import de.fraunhofer.isst.configmanager.configmanagement.service.ResourceService; -import de.fraunhofer.isst.configmanager.util.ValidateApiInput; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.AccessLevel; -import lombok.experimental.FieldDefaults; -import lombok.extern.slf4j.Slf4j; -import net.minidev.json.JSONObject; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.io.IOException; -import java.net.URI; - -/** - * The controller class implements the ResourceContractApi and offers the possibilities to manage - * the contracts in a resource. - */ -@RestController -@RequestMapping("/api/ui") -@Slf4j -@Tag(name = "Resource contracts Management", description = "Endpoints for managing the contracts " + - "of a resource") -@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -public class ResourceContractUIController implements ResourceContractApi { - transient ConfigModelService configModelService; - transient ResourceService resourceService; - transient Serializer serializer; - transient DefaultConnectorClient client; - - @Autowired - public ResourceContractUIController(final ConfigModelService configModelService, - final ResourceService resourceService, - final Serializer serializer, - final DefaultConnectorClient client) { - this.configModelService = configModelService; - this.resourceService = resourceService; - this.serializer = serializer; - this.client = client; - } - - /** - * This method returns the contract from a specific resource. - * - * @param resourceId id of the resource - * @return a suitable http response depending on success - */ - @Override - public ResponseEntity getResourceContract(final URI resourceId) { - log.info(">> GET /resource/contract resourceId: " + resourceId); - - final var contractOffer = resourceService.getResourceContract(resourceId); - if (contractOffer != null) { - try { - return ResponseEntity.ok(serializer.serialize(contractOffer)); - } catch (IOException e) { - log.error(e.getMessage(), e); - return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Problems " + - "while parsing serializing " + - "the contract offer"); - } - } else { - return ResponseEntity.badRequest().body("Could not get the resource contract"); - } - } - - /** - * This method updates the contract of a resource. - * - * @param resourceId id of the resource - * @param contractJson id of the contract - * @return a suitable http response depending on success - */ - @Override - public ResponseEntity updateResourceContract(final URI resourceId, - final String contractJson) { - log.info(">> PUT /resource/contract resourceId: " + resourceId + " contractJson: " + contractJson); - - if (contractJson.equals("{}") && ValidateApiInput.notValid(resourceId.toString())) { - return ResponseEntity.badRequest().body("All validated parameter have undefined as " + - "value!"); - } - - // Create the updated contract offer - ContractOffer contractOffer = null; - if (contractJson != null) { - try { - contractOffer = serializer.deserialize(contractJson, ContractOffer.class); - } catch (IOException e) { - log.error(e.getMessage(), e); - return ResponseEntity.badRequest().body("Problems while deserializing the " + - "contract"); - } - } - - // Update the resource contract - if (contractOffer != null) { - final var jsonObject = new JSONObject(); - try { - jsonObject.put("resourceID", resourceId.toString()); - jsonObject.put("contractID", contractOffer.getId().toString()); - final var response = client.updateResourceContract(resourceId.toString(), contractJson); - resourceService.updateResourceContractInAppRoute(resourceId, contractOffer); - jsonObject.put("connectorResponse", response); - return ResponseEntity.ok(jsonObject.toJSONString()); - } catch (IOException e) { - log.error(e.getMessage(), e); - jsonObject.put("message", "Problems while updating the contract at the connector"); - return ResponseEntity.badRequest().body(jsonObject.toJSONString()); - } - } else { - return ResponseEntity.badRequest().body("Could not update the resource representation"); - } - } -} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/controller/UtilUIController.java b/src/main/java/de/fraunhofer/isst/configmanager/controller/UtilUIController.java deleted file mode 100644 index 2fd76777..00000000 --- a/src/main/java/de/fraunhofer/isst/configmanager/controller/UtilUIController.java +++ /dev/null @@ -1,82 +0,0 @@ -package de.fraunhofer.isst.configmanager.controller; - -import de.fraunhofer.isst.configmanager.communication.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.configmanagement.service.UtilService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.io.IOException; - -/** - * The controller class offers the possibilities to provide other api's which could be needed. - * As an example, enum values are supplied here via an api. - */ -@RestController -@RequestMapping("/api/ui") -@Tag(name = "Utility", description = "Endpoints for other requirements") -@Slf4j -public class UtilUIController { - private transient final UtilService utilService; - private transient final DefaultConnectorClient client; - - @Autowired - public UtilUIController(final UtilService utilService, final DefaultConnectorClient client) { - this.utilService = utilService; - this.client = client; - } - - /** - * This method returns for a given enum name all enum values. - * - * @param enumName name of the enum - * @return enum values as a string - */ - @GetMapping(value = "/enum/{enumName}") - @Operation(summary = "Get the specific enum") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully get the enums")}) - public ResponseEntity getSpecificEnum(final @PathVariable String enumName) { - log.info(">> GET /api/ui/enum " + enumName); - - final var enums = utilService.getSpecificEnum(enumName); - if (enums != null) { - return ResponseEntity.ok(enums); - } else { - return ResponseEntity.badRequest().body("Could not get the enums"); - } - } - - /** - * This method returns for a given policy the pattern. - * - * @param policy string, representing a policy - * @return pattern of policy - */ - @PostMapping(value = "/policy-pattern") - @Operation(summary = "Get pattern of policy") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully get the pattern" + - " of policy")}) - public ResponseEntity getPolicyPattern(final @RequestBody String policy) { - log.info(">> GET /api/ui/policy-pattern " + policy); - - String pattern; - try { - pattern = client.getPolicyPattern(policy); - } catch (IOException e) { - log.error(e.getMessage(), e); - return ResponseEntity.badRequest().body("Failed to determine policy pattern at the " + - "client"); - } - if (pattern != null) { - return ResponseEntity.ok(pattern); - } else { - return ResponseEntity.badRequest().body("Could not find any pattern for the given " + - "policy"); - } - } -} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/config/BrokerStatus.java b/src/main/java/de/fraunhofer/isst/configmanager/model/config/BrokerStatus.java new file mode 100644 index 00000000..f4ee1a5d --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/config/BrokerStatus.java @@ -0,0 +1,9 @@ +package de.fraunhofer.isst.configmanager.model.config; + +/** + * Enums for the broker status. + */ +public enum BrokerStatus { + REGISTERED, + UNREGISTERED +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/config/ConfigModelObject.java b/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java similarity index 66% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/config/ConfigModelObject.java rename to src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java index d189dc87..23444149 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/config/ConfigModelObject.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java @@ -1,23 +1,27 @@ -package de.fraunhofer.isst.configmanager.configmanagement.entities.config; +package de.fraunhofer.isst.configmanager.model.config; import de.fraunhofer.iais.eis.ConfigurationModel; -import de.fraunhofer.isst.configmanager.configmanagement.entities.converter.ConfigModelConverter; +import de.fraunhofer.isst.configmanager.model.converter.ConfigModelConverter; import lombok.AccessLevel; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Convert; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; /** * Entity class for the configuration model. */ @Data -@NoArgsConstructor @Entity +@NoArgsConstructor @FieldDefaults(level = AccessLevel.PRIVATE) public class ConfigModelObject { - @Id @GeneratedValue(strategy = GenerationType.AUTO) long id; @@ -29,5 +33,4 @@ public class ConfigModelObject { public ConfigModelObject(final ConfigurationModel configurationModel) { this.configurationModel = configurationModel; } - } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/config/CustomBroker.java b/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java similarity index 72% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/config/CustomBroker.java rename to src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java index 78567cb3..ad7c3a5e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/config/CustomBroker.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java @@ -1,26 +1,34 @@ -package de.fraunhofer.isst.configmanager.configmanagement.entities.config; +package de.fraunhofer.isst.configmanager.model.config; import lombok.AccessLevel; import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; import java.net.URI; import java.util.List; /** * A custom broker entity, to be able to persist the broker in the intern database. */ -@Entity @Data +@Entity @FieldDefaults(level = AccessLevel.PRIVATE) public class CustomBroker { @Id @GeneratedValue(strategy = GenerationType.AUTO) Long id; + URI brokerUri; + String title; + BrokerStatus brokerStatus; + @ElementCollection List registeredResources; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/ConfigModelRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/ConfigModelRepository.java similarity index 55% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/ConfigModelRepository.java rename to src/main/java/de/fraunhofer/isst/configmanager/model/configlists/ConfigModelRepository.java index 057c5da9..afcf913f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/ConfigModelRepository.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/ConfigModelRepository.java @@ -1,6 +1,6 @@ -package de.fraunhofer.isst.configmanager.configmanagement.entities.configlists; +package de.fraunhofer.isst.configmanager.model.configlists; -import de.fraunhofer.isst.configmanager.configmanagement.entities.config.ConfigModelObject; +import de.fraunhofer.isst.configmanager.model.config.ConfigModelObject; import org.springframework.data.jpa.repository.JpaRepository; /** diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/CustomAppRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomAppRepository.java similarity index 54% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/CustomAppRepository.java rename to src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomAppRepository.java index 3a9e639d..1ac9ab7b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/CustomAppRepository.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomAppRepository.java @@ -1,6 +1,6 @@ -package de.fraunhofer.isst.configmanager.configmanagement.entities.configlists; +package de.fraunhofer.isst.configmanager.model.configlists; -import de.fraunhofer.isst.configmanager.configmanagement.entities.customapp.CustomApp; +import de.fraunhofer.isst.configmanager.model.customapp.CustomApp; import org.springframework.data.jpa.repository.JpaRepository; /** diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/CustomBrokerRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomBrokerRepository.java similarity index 54% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/CustomBrokerRepository.java rename to src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomBrokerRepository.java index 2dc41827..0bfd39ac 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/CustomBrokerRepository.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomBrokerRepository.java @@ -1,6 +1,6 @@ -package de.fraunhofer.isst.configmanager.configmanagement.entities.configlists; +package de.fraunhofer.isst.configmanager.model.configlists; -import de.fraunhofer.isst.configmanager.configmanagement.entities.config.CustomBroker; +import de.fraunhofer.isst.configmanager.model.config.CustomBroker; import org.springframework.data.jpa.repository.JpaRepository; /** diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/CustomGenericEndpointList.java b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java similarity index 62% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/CustomGenericEndpointList.java rename to src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java index 292e8ffb..8babab38 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/configlists/CustomGenericEndpointList.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java @@ -1,21 +1,28 @@ -package de.fraunhofer.isst.configmanager.configmanagement.entities.configlists; +package de.fraunhofer.isst.configmanager.model.configlists; import de.fraunhofer.iais.eis.Endpoint; -import de.fraunhofer.isst.configmanager.configmanagement.entities.customgenericendpoint.CustomGenericEndpointObject; +import de.fraunhofer.isst.configmanager.model.customgenericendpoint.CustomGenericEndpointObject; import lombok.AccessLevel; import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** - * Entity class for a list of generic endpoints + * Entity class for a list of generic endpoints. */ -@Entity @Data +@Entity @FieldDefaults(level = AccessLevel.PRIVATE) public class CustomGenericEndpointList { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointRepository.java new file mode 100644 index 00000000..01aeadbc --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointRepository.java @@ -0,0 +1,11 @@ +package de.fraunhofer.isst.configmanager.model.configlists; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +/** + * CRUD repository for persisting generic endpoints. + */ +@Repository +public interface CustomGenericEndpointRepository extends JpaRepository { +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/EndpointInformationRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/EndpointInformationRepository.java new file mode 100644 index 00000000..372be07a --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/EndpointInformationRepository.java @@ -0,0 +1,10 @@ +package de.fraunhofer.isst.configmanager.model.configlists; + +import de.fraunhofer.isst.configmanager.model.endpointinfo.EndpointInformation; +import org.springframework.data.jpa.repository.JpaRepository; + +/** + * CRUD repository for persisting endpoint information. + */ +public interface EndpointInformationRepository extends JpaRepository { +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/RouteDeployMethodRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/RouteDeployMethodRepository.java new file mode 100644 index 00000000..17196639 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/RouteDeployMethodRepository.java @@ -0,0 +1,10 @@ +package de.fraunhofer.isst.configmanager.model.configlists; + +import de.fraunhofer.isst.configmanager.model.routedeploymethod.RouteDeployMethod; +import org.springframework.data.jpa.repository.JpaRepository; + +/** + * CRUD repository for the route deploy method. + */ +public interface RouteDeployMethodRepository extends JpaRepository { +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/converter/ConfigModelConverter.java b/src/main/java/de/fraunhofer/isst/configmanager/model/converter/ConfigModelConverter.java similarity index 92% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/converter/ConfigModelConverter.java rename to src/main/java/de/fraunhofer/isst/configmanager/model/converter/ConfigModelConverter.java index 483e8279..99ea3131 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/converter/ConfigModelConverter.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/converter/ConfigModelConverter.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.configmanagement.entities.converter; +package de.fraunhofer.isst.configmanager.model.converter; import de.fraunhofer.iais.eis.ConfigurationModel; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; @@ -17,7 +17,7 @@ @Converter @FieldDefaults(level = AccessLevel.PRIVATE) public class ConfigModelConverter implements AttributeConverter { - transient final Serializer serializer = new Serializer(); + final transient Serializer serializer = new Serializer(); /** * Converter method converts the value stored in the entity attribute into the data diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/converter/EndpointConverter.java b/src/main/java/de/fraunhofer/isst/configmanager/model/converter/EndpointConverter.java similarity index 91% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/converter/EndpointConverter.java rename to src/main/java/de/fraunhofer/isst/configmanager/model/converter/EndpointConverter.java index 021f65a1..c5165213 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/converter/EndpointConverter.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/converter/EndpointConverter.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.configmanagement.entities.converter; +package de.fraunhofer.isst.configmanager.model.converter; import de.fraunhofer.iais.eis.Endpoint; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; @@ -17,7 +17,7 @@ @Converter @FieldDefaults(level = AccessLevel.PRIVATE) public class EndpointConverter implements AttributeConverter { - transient final Serializer serializer = new Serializer(); + final transient Serializer serializer = new Serializer(); /** * This method serializes the endpoint, which is given in the parameter to a string, to be diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/customapp/CustomApp.java b/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java similarity index 60% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/customapp/CustomApp.java rename to src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java index 6c245ab5..91ae02c7 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/customapp/CustomApp.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java @@ -1,23 +1,30 @@ -package de.fraunhofer.isst.configmanager.configmanagement.entities.customapp; +package de.fraunhofer.isst.configmanager.model.customapp; import lombok.AccessLevel; import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; import java.util.List; /** * Entity class for creating a custom app. */ -@Entity @Data +@Entity @FieldDefaults(level = AccessLevel.PRIVATE) public class CustomApp { @Id @GeneratedValue(strategy = GenerationType.AUTO) Long id; + String title; + @OneToMany(cascade = CascadeType.ALL) List appEndpointList; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/customapp/CustomAppEndpoint.java b/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomAppEndpoint.java similarity index 71% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/customapp/CustomAppEndpoint.java rename to src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomAppEndpoint.java index 2c564f0e..efcff2f6 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/customapp/CustomAppEndpoint.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomAppEndpoint.java @@ -1,7 +1,7 @@ -package de.fraunhofer.isst.configmanager.configmanagement.entities.customapp; +package de.fraunhofer.isst.configmanager.model.customapp; import de.fraunhofer.iais.eis.AppEndpoint; -import de.fraunhofer.isst.configmanager.configmanagement.entities.customgenericendpoint.BackendConfig; +import de.fraunhofer.isst.configmanager.model.customgenericendpoint.BackendConfig; import lombok.NoArgsConstructor; import javax.persistence.Entity; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/customgenericendpoint/BackendConfig.java b/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java similarity index 64% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/customgenericendpoint/BackendConfig.java rename to src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java index e5de31dc..6b661634 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/customgenericendpoint/BackendConfig.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java @@ -1,20 +1,25 @@ -package de.fraunhofer.isst.configmanager.configmanagement.entities.customgenericendpoint; +package de.fraunhofer.isst.configmanager.model.customgenericendpoint; import de.fraunhofer.iais.eis.Endpoint; -import de.fraunhofer.isst.configmanager.configmanagement.entities.converter.EndpointConverter; +import de.fraunhofer.isst.configmanager.model.converter.EndpointConverter; import lombok.AccessLevel; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Convert; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; /** * The class helps to persist objects inherited from the endpoint from the information model. */ @Data -@NoArgsConstructor @MappedSuperclass +@NoArgsConstructor @FieldDefaults(level = AccessLevel.PRIVATE) public class BackendConfig { @Id diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/customgenericendpoint/CustomGenericEndpointObject.java b/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/CustomGenericEndpointObject.java similarity index 84% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/customgenericendpoint/CustomGenericEndpointObject.java rename to src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/CustomGenericEndpointObject.java index 2f49f145..823c3b1b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/customgenericendpoint/CustomGenericEndpointObject.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/CustomGenericEndpointObject.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.configmanagement.entities.customgenericendpoint; +package de.fraunhofer.isst.configmanager.model.customgenericendpoint; import de.fraunhofer.iais.eis.GenericEndpoint; import lombok.NoArgsConstructor; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/endpointinfo/EndpointInformation.java b/src/main/java/de/fraunhofer/isst/configmanager/model/endpointinfo/EndpointInformation.java similarity index 91% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/endpointinfo/EndpointInformation.java rename to src/main/java/de/fraunhofer/isst/configmanager/model/endpointinfo/EndpointInformation.java index 14e43e9e..47dd3854 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/endpointinfo/EndpointInformation.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/endpointinfo/EndpointInformation.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.configmanagement.entities.endpointinfo; +package de.fraunhofer.isst.configmanager.model.endpointinfo; import lombok.AccessLevel; import lombok.Data; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/routedeploymethod/DeployMethod.java b/src/main/java/de/fraunhofer/isst/configmanager/model/routedeploymethod/DeployMethod.java new file mode 100644 index 00000000..7255e4ef --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/routedeploymethod/DeployMethod.java @@ -0,0 +1,12 @@ +package de.fraunhofer.isst.configmanager.model.routedeploymethod; + +/** + * Enums for the route deploy methods. + */ +public enum DeployMethod { + NONE, + CAMEL, + KAFKA, + ARGO, + AIRFLOW +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/routedeploymethod/RouteDeployMethod.java b/src/main/java/de/fraunhofer/isst/configmanager/model/routedeploymethod/RouteDeployMethod.java similarity index 86% rename from src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/routedeploymethod/RouteDeployMethod.java rename to src/main/java/de/fraunhofer/isst/configmanager/model/routedeploymethod/RouteDeployMethod.java index b9de51e5..e6b6c3ce 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/configmanagement/entities/routedeploymethod/RouteDeployMethod.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/routedeploymethod/RouteDeployMethod.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.configmanagement.entities.routedeploymethod; +package de.fraunhofer.isst.configmanager.model.routedeploymethod; import lombok.AccessLevel; import lombok.Data; @@ -13,12 +13,13 @@ * Entity class for the route deploy method. This class helps to manage the route deploy method * from every app route and subroute. */ -@Entity @Data +@Entity @FieldDefaults(level = AccessLevel.PRIVATE) public class RouteDeployMethod { @Id @GeneratedValue(strategy = GenerationType.AUTO) Long id; + DeployMethod deployMethod; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/util/CalenderUtil.java b/src/main/java/de/fraunhofer/isst/configmanager/util/CalenderUtil.java index 7b0e906b..3362b997 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/util/CalenderUtil.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/util/CalenderUtil.java @@ -15,7 +15,6 @@ @Slf4j @UtilityClass public class CalenderUtil { - /** * This method creates an XMLGreorgianCalender for for time specifications as created or * modified. @@ -32,5 +31,4 @@ public static XMLGregorianCalendar getGregorianNow() { } return null; } - } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/util/OkHttpUtils.java b/src/main/java/de/fraunhofer/isst/configmanager/util/OkHttpUtils.java index bce94759..a849c730 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/util/OkHttpUtils.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/util/OkHttpUtils.java @@ -7,6 +7,7 @@ import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; +import java.security.cert.X509Certificate; import java.util.concurrent.TimeUnit; /** @@ -15,9 +16,10 @@ @Slf4j @UtilityClass public class OkHttpUtils { + private static final int TIMEOUT = 30; /** - * Static method for generating an OkHttpClient which does not validate Certificate Chains + * Static method for generating an OkHttpClient which does not validate Certificate Chains. * * @return unsafe OKHttpClient */ @@ -27,18 +29,16 @@ public static OkHttpClient getUnsafeOkHttpClient() { final var trustAllCerts = new TrustManager[]{ new X509TrustManager() { @Override - public void checkClientTrusted(java.security.cert.X509Certificate[] chain - , String authType) { + public void checkClientTrusted(final X509Certificate[] chain, final String authType) { } @Override - public void checkServerTrusted(java.security.cert.X509Certificate[] chain - , String authType) { + public void checkServerTrusted(final X509Certificate[] chain, final String authType) { } @Override - public java.security.cert.X509Certificate[] getAcceptedIssuers() { - return new java.security.cert.X509Certificate[]{}; + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[]{}; } } }; @@ -46,21 +46,22 @@ public java.security.cert.X509Certificate[] getAcceptedIssuers() { // Install the all-trusting trust manager final var sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); + // Create an ssl socket factory with our all-trusting manager final var sslSocketFactory = sslContext.getSocketFactory(); final var builder = new OkHttpClient.Builder(); builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]); builder.hostnameVerifier((hostname, session) -> true); - builder.connectTimeout(30, TimeUnit.SECONDS); - builder.writeTimeout(30, TimeUnit.SECONDS); - builder.readTimeout(30, TimeUnit.SECONDS); + builder.connectTimeout(TIMEOUT, TimeUnit.SECONDS); + builder.writeTimeout(TIMEOUT, TimeUnit.SECONDS); + builder.readTimeout(TIMEOUT, TimeUnit.SECONDS); return builder.build(); } catch (Exception e) { log.error(e.getMessage(), e); + throw new UnsupportedOperationException(e); } } - } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java b/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java index b004fd4b..c1312004 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java @@ -1,6 +1,10 @@ package de.fraunhofer.isst.configmanager.util; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.AppEndpoint; +import de.fraunhofer.iais.eis.AppEndpointBuilder; +import de.fraunhofer.iais.eis.AppEndpointType; +import de.fraunhofer.iais.eis.CustomMediaTypeBuilder; +import de.fraunhofer.iais.eis.Language; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; import lombok.experimental.UtilityClass; @@ -47,11 +51,14 @@ public static String jsonMessage(final String key, final String value) { * @throws URISyntaxException if uri can not be created */ public static AppEndpoint createAppEndpoint(final AppEndpointType appEndpointType, - final BigInteger port, final String documentation, + final BigInteger port, + final String documentation, final String endpointInformation, final String accessURL, - final String inboundPath, final String outboundPath, - final Language language, final String mediaType, + final String inboundPath, + final String outboundPath, + final Language language, + final String mediaType, final String path) throws URISyntaxException { final var mediatype = new CustomMediaTypeBuilder()._filenameExtension_(mediaType).build(); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/util/ValidateApiInput.java b/src/main/java/de/fraunhofer/isst/configmanager/util/ValidateApiInput.java index 20167963..fe1c271c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/util/ValidateApiInput.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/util/ValidateApiInput.java @@ -11,7 +11,7 @@ public class ValidateApiInput { public static boolean notValid(final String... parameter) { log.info("---- [ValidateApiInput] Validating API Input ..."); - final var validationResult = Arrays.stream(parameter).dropWhile(param -> param.equals("undefined")).count() == 0; + final var validationResult = Arrays.stream(parameter).dropWhile("undefined"::equals).count() == 0; if (validationResult) { log.error("---- [ValidateApiInput] Validating API Input ... Input is NOT valid!"); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 42a32757..bfaeb5be 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -25,8 +25,6 @@ dataspace.connector.host=localhost dataspace.connector.port=8080 dataspace.connector.api.username=admin dataspace.connector.api.password=password - -# communication to dataspace connector dataspace.communication.ssl=true #General Information @@ -35,4 +33,4 @@ version=@project.version@ project_desc=@project.description@ organization_name=@project.organization.name@ licence=@licence_name@ -licence_url=@licence_url@ \ No newline at end of file +licence_url=@licence_url@ diff --git a/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java b/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java index 38558abd..5725c2d3 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java @@ -1,10 +1,10 @@ package de.fraunhofer.isst.configmanager.api_test; -import de.fraunhofer.isst.configmanager.communication.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.configmanagement.entities.config.CustomBroker; -import de.fraunhofer.isst.configmanager.configmanagement.service.BrokerService; -import de.fraunhofer.isst.configmanager.configmanagement.service.ResourceService; -import de.fraunhofer.isst.configmanager.controller.BrokerUIController; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; +import de.fraunhofer.isst.configmanager.model.config.CustomBroker; +import de.fraunhofer.isst.configmanager.api.service.BrokerService; +import de.fraunhofer.isst.configmanager.api.service.ResourceService; +import de.fraunhofer.isst.configmanager.api.controller.BrokerController; import de.fraunhofer.isst.configmanager.util.TestUtil; import org.junit.jupiter.api.Test; import org.mockito.Mockito; @@ -22,7 +22,7 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@WebMvcTest(BrokerUIController.class) +@WebMvcTest(BrokerController.class) public class BrokerUIAPITest { @Autowired diff --git a/src/test/java/de/fraunhofer/isst/configmanager/service_test/BrokerServiceTest.java b/src/test/java/de/fraunhofer/isst/configmanager/service_test/BrokerServiceTest.java index 132ce15a..5da7de9a 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/service_test/BrokerServiceTest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/service_test/BrokerServiceTest.java @@ -1,6 +1,6 @@ package de.fraunhofer.isst.configmanager.service_test; -import de.fraunhofer.isst.configmanager.configmanagement.service.BrokerService; +import de.fraunhofer.isst.configmanager.api.service.BrokerService; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; diff --git a/src/test/java/de/fraunhofer/isst/configmanager/util/TestUtil.java b/src/test/java/de/fraunhofer/isst/configmanager/util/TestUtil.java index dabf3c62..4b4a574c 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/util/TestUtil.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/util/TestUtil.java @@ -1,6 +1,6 @@ package de.fraunhofer.isst.configmanager.util; -import de.fraunhofer.isst.configmanager.configmanagement.entities.config.CustomBroker; +import de.fraunhofer.isst.configmanager.model.config.CustomBroker; import java.net.URI; import java.util.ArrayList; diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index 9adba217..67cfd0d0 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -25,5 +25,5 @@ dataspace.connector.port=8080 dataspace.connector.api.username=admin dataspace.connector.api.password=password -# communication to dataspace connector +# connector to dataspace connector dataspace.communication.ssl=true From a6bda08ed479c3a0083f48718ec473bee842c02b Mon Sep 17 00:00:00 2001 From: eakker Date: Tue, 6 Apr 2021 09:57:02 +0200 Subject: [PATCH 020/157] feat: split DataspaceConnectorClient into DataspaceConnectorClient, DataspaceBrokerClient, DataspaceResourceClient --- .../api/controller/BrokerController.java | 5 +- .../ResourceContractController.java | 5 +- .../api/controller/ResourceController.java | 5 +- .../ResourceRepresentationController.java | 5 +- .../api/service/ConnectorRequestService.java | 15 +- .../api/service/ResourceService.java | 16 +- .../clients/DefaultBrokerClient.java | 49 ++ .../clients/DefaultConnectorClient.java | 156 ------ .../clients/DefaultResourceClient.java | 123 +++++ .../DataspaceBrokerClient.java | 134 +++++ .../dataspaceconnector/DataspaceClient.java | 53 ++ .../DataspaceConnectorClient.java | 515 +----------------- .../DataspaceResourceClient.java | 389 +++++++++++++ .../dataspaceconnector/ResourceMapper.java | 8 +- .../api_test/BrokerUIAPITest.java | 9 + 15 files changed, 793 insertions(+), 694 deletions(-) create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultBrokerClient.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceBrokerClient.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceClient.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceResourceClient.java diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java index d90cf48d..678da16a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import de.fraunhofer.iais.eis.Resource; import de.fraunhofer.isst.configmanager.api.BrokerApi; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultBrokerClient; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; import de.fraunhofer.isst.configmanager.model.config.BrokerStatus; import de.fraunhofer.isst.configmanager.api.service.BrokerService; @@ -34,12 +35,12 @@ public class BrokerController implements BrokerApi { transient BrokerService brokerService; - transient DefaultConnectorClient client; + transient DefaultBrokerClient client; transient ObjectMapper objectMapper; @Autowired public BrokerController(final BrokerService brokerService, - final DefaultConnectorClient client, + final DefaultBrokerClient client, final ObjectMapper objectMapper) { this.brokerService = brokerService; this.client = client; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java index e4afc240..809b0536 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java @@ -5,6 +5,7 @@ import de.fraunhofer.isst.configmanager.api.ResourceContractApi; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; import de.fraunhofer.isst.configmanager.api.service.ResourceService; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; import de.fraunhofer.isst.configmanager.util.ValidateApiInput; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AccessLevel; @@ -33,12 +34,12 @@ public class ResourceContractController implements ResourceContractApi { transient ResourceService resourceService; transient Serializer serializer; - transient DefaultConnectorClient client; + transient DefaultResourceClient client; @Autowired public ResourceContractController(final ResourceService resourceService, final Serializer serializer, - final DefaultConnectorClient client) { + final DefaultResourceClient client) { this.resourceService = resourceService; this.serializer = serializer; this.client = client; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java index 4ec61aca..72638129 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java @@ -4,6 +4,7 @@ import de.fraunhofer.isst.configmanager.api.ResourceApi; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; import de.fraunhofer.isst.configmanager.api.service.ResourceService; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; import de.fraunhofer.isst.configmanager.util.ValidateApiInput; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AccessLevel; @@ -32,12 +33,12 @@ @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) public class ResourceController implements ResourceApi { transient ResourceService resourceService; - transient DefaultConnectorClient client; + transient DefaultResourceClient client; transient Serializer serializer; @Autowired public ResourceController(final ResourceService resourceService, - final DefaultConnectorClient client, final Serializer serializer) { + final DefaultResourceClient client, final Serializer serializer) { this.resourceService = resourceService; this.client = client; this.serializer = serializer; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java index 76e628b1..97c367ee 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java @@ -14,6 +14,7 @@ import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; import de.fraunhofer.isst.configmanager.api.service.ResourceService; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; import de.fraunhofer.isst.configmanager.util.ValidateApiInput; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AccessLevel; @@ -43,13 +44,13 @@ public class ResourceRepresentationController implements ResourceRepresentationA transient ConfigModelService configModelService; transient ResourceService resourceService; - transient DefaultConnectorClient client; + transient DefaultResourceClient client; transient Serializer serializer; @Autowired public ResourceRepresentationController(final ConfigModelService configModelService, final ResourceService resourceService, - final DefaultConnectorClient client, + final DefaultResourceClient client, final Serializer serializer) { this.client = client; this.configModelService = configModelService; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java index 21cb85a8..681f31da 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java @@ -2,6 +2,7 @@ import de.fraunhofer.iais.eis.Resource; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -20,11 +21,13 @@ @Transactional public class ConnectorRequestService { - private final transient DefaultConnectorClient client; + private final transient DefaultResourceClient resourceClient; + private final transient DefaultConnectorClient connectorClient; @Autowired - public ConnectorRequestService(final DefaultConnectorClient client) { - this.client = client; + public ConnectorRequestService(final DefaultResourceClient resourceClient, final DefaultConnectorClient connectorClient) { + this.resourceClient = resourceClient; + this.connectorClient = connectorClient; } /** @@ -35,7 +38,7 @@ public ConnectorRequestService(final DefaultConnectorClient client) { */ public List requestResourcesFromConnector(final URI recipientId) { try { - final var connector = client.getBaseConnector(recipientId.toString(), ""); + final var connector = connectorClient.getBaseConnector(recipientId.toString(), ""); if (connector != null && connector.getResourceCatalog() != null) { final List resourceList = new ArrayList<>(); @@ -65,7 +68,7 @@ public List requestResourcesFromConnector(final URI recipientId) { public Resource requestResource(final URI recipientId, final URI requestedResourceId) { try { - final var resource = client.getRequestedResource(recipientId.toString(), requestedResourceId.toString()); + final var resource = resourceClient.getRequestedResource(recipientId.toString(), requestedResourceId.toString()); if (resource != null) { return resource; } else { @@ -91,7 +94,7 @@ public String requestContractAgreement(final String recipientId, final String contractOffer) { try { - return client.requestContractAgreement(recipientId, requestedArtifactId, contractOffer); + return connectorClient.requestContractAgreement(recipientId, requestedArtifactId, contractOffer); } catch (IOException e) { log.error(e.getMessage(), e); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java index 1b58db53..ddb712b9 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java @@ -14,6 +14,7 @@ import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; import de.fraunhofer.isst.configmanager.model.configlists.EndpointInformationRepository; import de.fraunhofer.isst.configmanager.model.endpointinfo.EndpointInformation; import de.fraunhofer.isst.configmanager.util.CalenderUtil; @@ -42,17 +43,20 @@ public class ResourceService { transient ConfigModelService configModelService; transient EndpointService endpointService; transient EndpointInformationRepository endpointInformationRepository; - transient DefaultConnectorClient client; + transient DefaultResourceClient resourceClient; + transient DefaultConnectorClient connectorClient; @Autowired public ResourceService(final ConfigModelService configModelService, final EndpointService endpointService, final EndpointInformationRepository endpointInformationRepository, - final DefaultConnectorClient client) { + final DefaultResourceClient resourceClient, + final DefaultConnectorClient connectorClient) { this.configModelService = configModelService; this.endpointService = endpointService; this.endpointInformationRepository = endpointInformationRepository; - this.client = client; + this.resourceClient = resourceClient; + this.connectorClient = connectorClient; } /** @@ -128,7 +132,7 @@ public List getResources() { BaseConnector baseConnector = null; try { - baseConnector = client.getSelfDeclaration(); + baseConnector = connectorClient.getSelfDeclaration(); } catch (IOException e) { log.error(e.getMessage(), e); } @@ -149,7 +153,7 @@ public List getResources() { */ public String getOfferedResourcesAsJsonString() { try { - return client.getOfferedResourcesAsJsonString(); + return resourceClient.getOfferedResourcesAsJsonString(); } catch (IOException e) { log.error(e.getMessage(), e); return null; @@ -163,7 +167,7 @@ public String getOfferedResourcesAsJsonString() { */ public String getRequestedResourcesAsJsonString() { try { - return client.getRequestedResourcesAsJsonString(); + return resourceClient.getRequestedResourcesAsJsonString(); } catch (IOException e) { log.error(e.getMessage(), e); return null; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultBrokerClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultBrokerClient.java new file mode 100644 index 00000000..0c4d1f11 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultBrokerClient.java @@ -0,0 +1,49 @@ +package de.fraunhofer.isst.configmanager.connector.clients; + +import okhttp3.Response; + +import java.io.IOException; +import java.net.URI; + +public interface DefaultBrokerClient { + + /** + * The method helps to update connector in the broker. For this only the id of the + * corresponding broker is necessary. + * + * @param brokerURI URI of the broker to update/register + * @return Response of the update/register request of the connector + * @throws IOException when sending the request fails + */ + Response updateAtBroker(String brokerURI) throws IOException; + + /** + * The method removes the connector from the corresponding broker. For this only the id of + * the broker is necessary. + * + * @param brokerURI URI of the broker to unregister + * @return Response of the unregister request of the connector + * @throws IOException when sending the request fails + */ + String unregisterAtBroker(String brokerURI) throws IOException; + + /** + * Send a Resource update request to a target broker. + * + * @param brokerUri URI of the Broker + * @param resourceID ID of the Resource that will be created + * @return Response of the target Connector + * @throws IOException when serializing of the Resource, or sending of the request fails + */ + String updateResourceAtBroker(String brokerUri, URI resourceID) throws IOException; + + /** + * Send a resource deletion request to a target broker. + * + * @param brokerUri URI of the Broker + * @param resourceID ID of the Resource to delete + * @return Response of the target Connector + * @throws IOException when an error occurs while sending the request + */ + String deleteResourceAtBroker(String brokerUri, URI resourceID) throws IOException; +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java index dac2d520..3cca2359 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java @@ -2,13 +2,8 @@ import de.fraunhofer.iais.eis.BaseConnector; import de.fraunhofer.iais.eis.ConfigurationModel; -import de.fraunhofer.iais.eis.Representation; -import de.fraunhofer.iais.eis.Resource; -import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.ResourceRepresentation; -import okhttp3.Response; import java.io.IOException; -import java.net.URI; /** * The interface DefaultConnectorClient defines methods that are implemented to make @@ -25,26 +20,6 @@ public interface DefaultConnectorClient { */ void getConnectorStatus() throws IOException; - /** - * The method helps to update connector in the broker. For this only the id of the - * corresponding broker is necessary. - * - * @param brokerURI URI of the broker to update/register - * @return Response of the update/register request of the connector - * @throws IOException when sending the request fails - */ - Response updateAtBroker(String brokerURI) throws IOException; - - /** - * The method removes the connector from the corresponding broker. For this only the id of - * the broker is necessary. - * - * @param brokerURI URI of the broker to unregister - * @return Response of the unregister request of the connector - * @throws IOException when sending the request fails - */ - String unregisterAtBroker(String brokerURI) throws IOException; - /** * The method returns the current configuration model. * @@ -73,121 +48,6 @@ public interface DefaultConnectorClient { */ BaseConnector getBaseConnector(String accessURL, String resourceId) throws IOException; - /** - * This method returns the uuid of a resource and the resource. - * - * @param accessURL url of the connector - * @param resourceId id of the resource - * @return map from the id of the resource and the resource itself - */ - Resource getRequestedResource(String accessURL, String resourceId) throws IOException; - - - /** - * Send a Resource update Request to a target Connector. - * - * @param resourceID ID of the Resource that will be created - * @param resource Resource to create - * @return Response of the target Connector - * @throws IOException when serializing of the Resource, or sending of the request fails - */ - String updateResource(URI resourceID, Resource resource) throws IOException; - - /** - * Send a resource creation request to a target connector. - * - * @param resource Resource that will be created - * @return Response of the target Connector - * @throws IOException when serializing of the Resource, or sending of the request fails - */ - String registerResource(Resource resource) throws IOException; - - /** - * Send a resource deletion request to a target connector. - * - * @param resourceID ID of the Resource to delete - * @return Response of the target Connector - * @throws IOException when an error occurs while sending the request - */ - String deleteResource(URI resourceID) throws IOException; - - /** - * Send a Resource update request to a target broker. - * - * @param brokerUri URI of the Broker - * @param resourceID ID of the Resource that will be created - * @return Response of the target Connector - * @throws IOException when serializing of the Resource, or sending of the request fails - */ - String updateResourceAtBroker(String brokerUri, URI resourceID) throws IOException; - - /** - * Send a resource deletion request to a target broker. - * - * @param brokerUri URI of the Broker - * @param resourceID ID of the Resource to delete - * @return Response of the target Connector - * @throws IOException when an error occurs while sending the request - */ - String deleteResourceAtBroker(String brokerUri, URI resourceID) throws IOException; - - /** - * Send a resource representation deletion request to a connector. - * - * @param resourceID ID of the Resource for which the representation is deleted - * @param representationID ID of the Representation to delete - * @return Response of the target Connector - * @throws IOException when an error occurs while sending the request - */ - String deleteResourceRepresentation(String resourceID, String representationID) throws IOException; - - /** - * Send a resource representation creation request to the connector. - * - * @param resourceID ID of the Resource for which the representation is registered - * @param representation representation to be registered - * @param endpointId ID of endpoint of the resource - * @return Response of the target Connector - * @throws IOException when an error occurs while sending the request - */ - String registerResourceRepresentation(String resourceID, Representation representation, - String endpointId) throws IOException; - - /** - * Send a resource representation update request to a connector. - * - * @param resourceID ID of the Resource for which the representation is updated - * @param representationID ID of the representation to be updated - * @param representation representation to be updated - * @param endpointId ID of endpoint of the resource - * @return Response of the target Connector - * @throws IOException when an error occurs while sending the request - */ - String updateResourceRepresentation(String resourceID, String representationID, - Representation representation, String endpointId) throws IOException; - - /** - * Updates a custom {@link ResourceRepresentation} at a connector. - * - * @param resourceID ID of the Resource for which the representation is updated - * @param representationID ID of the representation to be updated - * @param resourceRepresentation representation to be updated - * @return Response of the target Connector - * @throws IOException when an error occurs while sending the request - */ - String updateCustomResourceRepresentation(String resourceID, String representationID, - ResourceRepresentation resourceRepresentation) throws IOException; - - /** - * Updates a resource contract at a connector. - * - * @param resourceID ID of the Resource for which the contract is updated - * @param contract contract to be created - * @return Response of the target Connector - * @throws IOException when an error occurs while sending the request - */ - String updateResourceContract(String resourceID, String contract) throws IOException; - /** * Returns the policy pattern for a given string. * @@ -206,22 +66,6 @@ String updateCustomResourceRepresentation(String resourceID, String representati */ BaseConnector getSelfDeclaration() throws IOException; - /** - * Returns the offered resources of the self declaration of a connector. - * - * @return json-string with all offered resources - * @throws IOException when an error occurs while sending the request - */ - String getOfferedResourcesAsJsonString() throws IOException; - - /** - * Returns the requested resources of the self declaration of a connector. - * - * @return json-string with all requested resources - * @throws IOException when an error occurs while sending the request - */ - String getRequestedResourcesAsJsonString() throws IOException; - /** * Sends a contract request to a connector by building an ContractRequestMessage. * diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java new file mode 100644 index 00000000..6637ca65 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java @@ -0,0 +1,123 @@ +package de.fraunhofer.isst.configmanager.connector.clients; + +import de.fraunhofer.iais.eis.Representation; +import de.fraunhofer.iais.eis.Resource; +import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.ResourceRepresentation; + +import java.io.IOException; +import java.net.URI; + +public interface DefaultResourceClient { + + /** + * This method returns the uuid of a resource and the resource. + * + * @param accessURL url of the connector + * @param resourceId id of the resource + * @return map from the id of the resource and the resource itself + */ + Resource getRequestedResource(String accessURL, String resourceId) throws IOException; + + + /** + * Send a Resource update Request to a target Connector. + * + * @param resourceID ID of the Resource that will be created + * @param resource Resource to create + * @return Response of the target Connector + * @throws IOException when serializing of the Resource, or sending of the request fails + */ + String updateResource(URI resourceID, Resource resource) throws IOException; + + /** + * Send a resource creation request to a target connector. + * + * @param resource Resource that will be created + * @return Response of the target Connector + * @throws IOException when serializing of the Resource, or sending of the request fails + */ + String registerResource(Resource resource) throws IOException; + + /** + * Send a resource deletion request to a target connector. + * + * @param resourceID ID of the Resource to delete + * @return Response of the target Connector + * @throws IOException when an error occurs while sending the request + */ + String deleteResource(URI resourceID) throws IOException; + + /** + * Send a resource representation deletion request to a connector. + * + * @param resourceID ID of the Resource for which the representation is deleted + * @param representationID ID of the Representation to delete + * @return Response of the target Connector + * @throws IOException when an error occurs while sending the request + */ + String deleteResourceRepresentation(String resourceID, String representationID) throws IOException; + + /** + * Send a resource representation creation request to the connector. + * + * @param resourceID ID of the Resource for which the representation is registered + * @param representation representation to be registered + * @param endpointId ID of endpoint of the resource + * @return Response of the target Connector + * @throws IOException when an error occurs while sending the request + */ + String registerResourceRepresentation(String resourceID, Representation representation, + String endpointId) throws IOException; + + /** + * Send a resource representation update request to a connector. + * + * @param resourceID ID of the Resource for which the representation is updated + * @param representationID ID of the representation to be updated + * @param representation representation to be updated + * @param endpointId ID of endpoint of the resource + * @return Response of the target Connector + * @throws IOException when an error occurs while sending the request + */ + String updateResourceRepresentation(String resourceID, String representationID, + Representation representation, String endpointId) throws IOException; + + /** + * Updates a custom {@link ResourceRepresentation} at a connector. + * + * @param resourceID ID of the Resource for which the representation is updated + * @param representationID ID of the representation to be updated + * @param resourceRepresentation representation to be updated + * @return Response of the target Connector + * @throws IOException when an error occurs while sending the request + */ + String updateCustomResourceRepresentation(String resourceID, String representationID, + ResourceRepresentation resourceRepresentation) throws IOException; + + /** + * Updates a resource contract at a connector. + * + * @param resourceID ID of the Resource for which the contract is updated + * @param contract contract to be created + * @return Response of the target Connector + * @throws IOException when an error occurs while sending the request + */ + String updateResourceContract(String resourceID, String contract) throws IOException; + + /** + * Returns the offered resources of the self declaration of a connector. + * + * @return json-string with all offered resources + * @throws IOException when an error occurs while sending the request + */ + String getOfferedResourcesAsJsonString() throws IOException; + + /** + * Returns the requested resources of the self declaration of a connector. + * + * @return json-string with all requested resources + * @throws IOException when an error occurs while sending the request + */ + String getRequestedResourcesAsJsonString() throws IOException; + +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceBrokerClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceBrokerClient.java new file mode 100644 index 00000000..f5f0c828 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceBrokerClient.java @@ -0,0 +1,134 @@ +package de.fraunhofer.isst.configmanager.connector.dataspaceconnector; + +import de.fraunhofer.isst.configmanager.connector.clients.DefaultBrokerClient; +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; +import lombok.extern.slf4j.Slf4j; +import okhttp3.Credentials; +import okhttp3.HttpUrl; +import okhttp3.RequestBody; +import okhttp3.Response; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.net.URI; +import java.util.Objects; +import java.util.UUID; + +@Slf4j +@Service +@ConditionalOnExpression("${dataspace.connector.enabled:false}") +@FieldDefaults(level = AccessLevel.PRIVATE) +public class DataspaceBrokerClient extends DataspaceClient implements DefaultBrokerClient { + + public DataspaceBrokerClient(ResourceMapper dataSpaceConnectorResourceMapper) { + super(dataSpaceConnectorResourceMapper); + } + + @Override + public Response updateAtBroker(final String brokerURI) throws IOException { + log.info(String.format( + "---- [DataspaceConnectorClient updateAtBroker] updating connector %s at broker %s", + dataSpaceConnectorHost, + brokerURI)); + + final var builder = getRequestBuilder(); + builder.url(new HttpUrl.Builder() + .scheme(protocol) + .host(dataSpaceConnectorHost) + .port(dataSpaceConnectorPort) + .addPathSegments("admin/api/broker/update") + .addQueryParameter("broker", brokerURI) + .build()); + builder.post(RequestBody.create(brokerURI, okhttp3.MediaType.parse("text/html"))); + builder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + + final var request = builder.build(); + + return DispatchRequest.sendToDataspaceConnector(request); + } + + @Override + public String unregisterAtBroker(final String brokerURI) throws IOException { + log.info(String.format( + "---- [DataspaceConnectorClient unregisterAtBroker] unregistering connector %s at broker %s", + dataSpaceConnectorHost, + brokerURI)); + + final var builder = getRequestBuilder(); + builder.url(new HttpUrl.Builder() + .scheme(protocol) + .host(dataSpaceConnectorHost) + .port(dataSpaceConnectorPort) + .addPathSegments("admin/api/broker/unregister") + .addQueryParameter("broker", brokerURI) + .build()); + builder.post(RequestBody.create(brokerURI, okhttp3.MediaType.parse("text/html"))); + builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, + dataSpaceConnectorApiPassword)); + + final var request = builder.build(); + + return Objects.requireNonNull(DispatchRequest.sendToDataspaceConnector(request).body()).string(); + } + + @Override + public String updateResourceAtBroker(final String brokerUri, final URI resourceID) throws IOException { + log.info(String.format("---- [DataspaceConnectorClient updateResourceAtBroker] updating resource at Broker %s", brokerUri)); + + final var path = resourceID.getPath(); + final var idStr = path.substring(path.lastIndexOf('/') + 1); + final var resourceUUID = UUID.fromString(idStr); + + final var builder = getRequestBuilder(); + builder.url(new HttpUrl.Builder() + .scheme(protocol) + .host(dataSpaceConnectorHost) + .port(dataSpaceConnectorPort) + .addPathSegments("admin/api/broker/update/" + resourceUUID) + .addQueryParameter("broker", brokerUri) + .build()); + builder.post(RequestBody.create(new byte[0], null)); + builder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + final var request = builder.build(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + + if (!response.isSuccessful()) { + log.warn("---- [DataspaceConnectorClient updateResourceAtBroker] Updating Resource at Broker failed!"); + } + + return Objects.requireNonNull(response.body()).string(); + } + + @Override + public String deleteResourceAtBroker(final String brokerUri, final URI resourceID) throws IOException { + log.info(String.format("---- [DataspaceConnectorClient deleteResourceAtBroker] Deleting resource %s at Broker %s", resourceID, brokerUri)); + + final var path = resourceID.getPath(); + final var idStr = path.substring(path.lastIndexOf('/') + 1); + final var builder = getRequestBuilder(); + builder.url(new HttpUrl.Builder() + .scheme(protocol) + .host(dataSpaceConnectorHost) + .port(dataSpaceConnectorPort) + .addPathSegments("admin/api/broker/remove/" + idStr) + .addQueryParameter("broker", brokerUri) + .build()); + builder.post(RequestBody.create(new byte[0], null)); + builder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + + final var request = builder.build(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + + if (!response.isSuccessful()) { + log.warn("---- [DataspaceConnectorClient deleteResourceAtBroker] Deleting Resource at Broker failed!"); + } + + return Objects.requireNonNull(response.body()).string(); + } + +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceClient.java new file mode 100644 index 00000000..268e9dd0 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceClient.java @@ -0,0 +1,53 @@ +package de.fraunhofer.isst.configmanager.connector.dataspaceconnector; + +import com.fasterxml.jackson.databind.ObjectMapper; +import de.fraunhofer.iais.eis.ids.jsonld.Serializer; +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; +import lombok.extern.slf4j.Slf4j; +import okhttp3.Request; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; + +@Slf4j +@FieldDefaults(level = AccessLevel.PROTECTED) +public abstract class DataspaceClient { + final static Serializer SERIALIZER = new Serializer(); + final static ObjectMapper MAPPER = new ObjectMapper(); + + @Value("${dataspace.connector.host}") + transient String dataSpaceConnectorHost; + + @Value("${dataspace.connector.api.username}") + transient String dataSpaceConnectorApiUsername; + + @Value("${dataspace.connector.api.password}") + transient String dataSpaceConnectorApiPassword; + + @Value("${dataspace.connector.port}") + transient Integer dataSpaceConnectorPort; + + transient String protocol; + + final transient ResourceMapper dataSpaceConnectorResourceMapper; + + String connectorBaseUrl = ""; + + public DataspaceClient(final ResourceMapper dataSpaceConnectorResourceMapper) { + this.dataSpaceConnectorResourceMapper = dataSpaceConnectorResourceMapper; + } + + @Autowired + public void setProtocol(final @Value("${dataspace.communication.ssl}") String https) { + protocol = Boolean.parseBoolean(https) ? "https" : "http"; + connectorBaseUrl = protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/"; + + log.info("---- [DataspaceConnectorClient setProtocol] Communication Protocol with DataspaceConnector is: " + protocol); + } + + @NotNull + protected Request.Builder getRequestBuilder() { + return new Request.Builder(); + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceConnectorClient.java index eecd0e28..31eba4f2 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceConnectorClient.java @@ -1,33 +1,19 @@ package de.fraunhofer.isst.configmanager.connector.dataspaceconnector; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import de.fraunhofer.iais.eis.BaseConnector; import de.fraunhofer.iais.eis.ConfigurationModel; -import de.fraunhofer.iais.eis.Representation; -import de.fraunhofer.iais.eis.Resource; -import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.BackendSource; -import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.ResourceRepresentation; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; import okhttp3.Credentials; import okhttp3.HttpUrl; -import okhttp3.Request; import okhttp3.RequestBody; -import okhttp3.Response; -import org.jetbrains.annotations.NotNull; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.stereotype.Service; import java.io.IOException; -import java.net.URI; import java.util.Objects; -import java.util.UUID; /** * An implementation of the interface DefaultConnectorClient for the DataspaceConnector. @@ -36,38 +22,10 @@ @Service @ConditionalOnExpression("${dataspace.connector.enabled:false}") @FieldDefaults(level = AccessLevel.PRIVATE) -public class DataspaceConnectorClient implements DefaultConnectorClient { - final static Serializer SERIALIZER = new Serializer(); - final static ObjectMapper MAPPER = new ObjectMapper(); +public class DataspaceConnectorClient extends DataspaceClient implements DefaultConnectorClient { - @Value("${dataspace.connector.host}") - transient String dataSpaceConnectorHost; - - @Value("${dataspace.connector.api.username}") - transient String dataSpaceConnectorApiUsername; - - @Value("${dataspace.connector.api.password}") - transient String dataSpaceConnectorApiPassword; - - @Value("${dataspace.connector.port}") - transient Integer dataSpaceConnectorPort; - - transient String protocol; - - final transient ResourceMapper dataSpaceConnectorResourceMapper; - - String connectorBaseUrl = ""; - - public DataspaceConnectorClient(final ResourceMapper dataSpaceConnectorResourceMapper) { - this.dataSpaceConnectorResourceMapper = dataSpaceConnectorResourceMapper; - } - - @Autowired - public void setProtocol(final @Value("${dataspace.communication.ssl}") String https) { - protocol = Boolean.parseBoolean(https) ? "https" : "http"; - connectorBaseUrl = protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/"; - - log.info("---- [DataspaceConnectorClient setProtocol] Communication Protocol with DataspaceConnector is: " + protocol); + public DataspaceConnectorClient(ResourceMapper dataSpaceConnectorResourceMapper) { + super(dataSpaceConnectorResourceMapper); } @Override @@ -79,54 +37,6 @@ public void getConnectorStatus() throws IOException { DispatchRequest.sendToDataspaceConnector(request); } - @Override - public Response updateAtBroker(final String brokerURI) throws IOException { - log.info(String.format( - "---- [DataspaceConnectorClient updateAtBroker] updating connector %s at broker %s", - dataSpaceConnectorHost, - brokerURI)); - - final var builder = getRequestBuilder(); - builder.url(new HttpUrl.Builder() - .scheme(protocol) - .host(dataSpaceConnectorHost) - .port(dataSpaceConnectorPort) - .addPathSegments("admin/api/broker/update") - .addQueryParameter("broker", brokerURI) - .build()); - builder.post(RequestBody.create(brokerURI, okhttp3.MediaType.parse("text/html"))); - builder.header("Authorization", - Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); - - final var request = builder.build(); - - return DispatchRequest.sendToDataspaceConnector(request); - } - - @Override - public String unregisterAtBroker(final String brokerURI) throws IOException { - log.info(String.format( - "---- [DataspaceConnectorClient unregisterAtBroker] unregistering connector %s at broker %s", - dataSpaceConnectorHost, - brokerURI)); - - final var builder = getRequestBuilder(); - builder.url(new HttpUrl.Builder() - .scheme(protocol) - .host(dataSpaceConnectorHost) - .port(dataSpaceConnectorPort) - .addPathSegments("admin/api/broker/unregister") - .addQueryParameter("broker", brokerURI) - .build()); - builder.post(RequestBody.create(brokerURI, okhttp3.MediaType.parse("text/html"))); - builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, - dataSpaceConnectorApiPassword)); - - final var request = builder.build(); - - return Objects.requireNonNull(DispatchRequest.sendToDataspaceConnector(request).body()).string(); - } - @Override public ConfigurationModel getConfiguration() throws IOException { final var connectorUrl = connectorBaseUrl + "admin/api/configuration"; @@ -191,43 +101,6 @@ public BaseConnector getSelfDeclaration() throws IOException { return baseConnector; } - @Override - public String getOfferedResourcesAsJsonString() throws IOException { - final var baseConnectorNode = getJsonNodeOfBaseConnector(); - final var offeredResourceNode = baseConnectorNode.findValue("ids:offeredResource"); - return offeredResourceNode.toString(); - } - - @Override - public String getRequestedResourcesAsJsonString() throws IOException { - final var baseConnectorNode = getJsonNodeOfBaseConnector(); - final var requestedResourceNode = baseConnectorNode.findValue("ids:requestedResource"); - return requestedResourceNode.toString(); - } - - private JsonNode getJsonNodeOfBaseConnector() throws IOException { - final var connectorUrl = connectorBaseUrl + "admin/api/connector"; - - final var builder = getRequestBuilder(); - builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, - dataSpaceConnectorApiPassword)); - builder.url(connectorUrl); - builder.get(); - - final var request = builder.build(); - final var response = DispatchRequest.sendToDataspaceConnector(request); - - if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient getJsonNodeOfBaseConnector] Could not get BaseConnector"); - } - - final var body = Objects.requireNonNull(response.body()).string(); - final var mapper = new ObjectMapper(); - - return mapper.readTree(body); - } - - @Override public boolean sendConfiguration(final String configurationModel) throws IOException { log.info(String.format("---- [DataspaceConnectorClient sendConfiguration] sending new configuration to %s", dataSpaceConnectorHost)); @@ -292,44 +165,6 @@ public BaseConnector getBaseConnector(final String accessURL, final String resou return baseConnector; } - @Override - public Resource getRequestedResource(final String accessURL, final String resourceId) throws IOException { - final var builder = getRequestBuilder(); - final var urlBuilder = new HttpUrl.Builder() - .scheme(protocol) - .host(dataSpaceConnectorHost) - .port(dataSpaceConnectorPort) - .addPathSegments("admin/api/request/description") - .addQueryParameter("recipient", accessURL) - .addQueryParameter("requestedResource", resourceId); - - final var url = urlBuilder.build(); - builder.url(url); - builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); - builder.post(RequestBody.create(new byte[0], null)); - - final var request = builder.build(); - final var response = DispatchRequest.sendToDataspaceConnector(request); - - if (!response.isSuccessful()) { - log.warn(String.format("---- [DataspaceConnectorClient getRequestedResource] Could not get BaseConnector from %s!", dataSpaceConnectorHost)); - } - - final var body = Objects.requireNonNull(response.body()).string(); - final var splitBody = body.split("\n", 2); - final var resource = splitBody[1].substring(10); - - Resource deserializedResource = null; - try { - deserializedResource = SERIALIZER.deserialize(resource, Resource.class); - } catch (IOException e) { - log.error("---- [DataspaceConnectorClient getRequestedResource] SERIALIZER.deserialize threw IOException"); - log.error(e.getMessage(), e); - } - - return deserializedResource; - } - @Override public String requestContractAgreement(final String recipientId, final String requestedArtifactId, @@ -365,296 +200,6 @@ public String requestContractAgreement(final String recipientId, return Objects.requireNonNull(response.body()).string(); } - @Override - public String registerResource(final Resource resource) throws IOException { - log.info("---- [DataspaceConnectorClient registerResource] Registering resource..."); - - final var mappedResource = dataSpaceConnectorResourceMapper.getMetadata(resource); - final var resourceJsonLD = MAPPER.writeValueAsString(mappedResource); - - log.info("---- [DataspaceConnectorClient registerResource] New resource: " + resourceJsonLD); - - final var builder = getRequestBuilder(); - final var path = resource.getId().getPath(); - final var idStr = path.substring(path.lastIndexOf('/') + 1); - - final var url = new HttpUrl.Builder() - .scheme(protocol) - .host(dataSpaceConnectorHost) - .port(dataSpaceConnectorPort) - .addPathSegments("admin/api/resources/resource") - .addQueryParameter("id", idStr) - .build(); - builder.url(url); - builder.post(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld" + - "+json"))); - builder.header("Authorization", - Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); - - log.info("---- [DataspaceConnectorClient registerResource] " + url.toString()); - - final var request = builder.build(); - final var response = DispatchRequest.sendToDataspaceConnector(request); - - if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient registerResource] Registering Resource failed!"); - } - - return Objects.requireNonNull(response.body()).string(); - } - - @Override - public String deleteResource(final URI resourceID) throws IOException { - log.info(String.format("---- [DataspaceConnectorClient deleteResource] deleting resource %s at %s", resourceID, - dataSpaceConnectorHost)); - - final var path = resourceID.getPath(); - final var idStr = path.substring(path.lastIndexOf('/') + 1); - - final var builder = getRequestBuilder(); - builder.url(connectorBaseUrl + "admin/api/resources/" + idStr); - builder.delete(); - builder.header("Authorization", - Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); - final var request = builder.build(); - final var response = DispatchRequest.sendToDataspaceConnector(request); - - if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient deleteResource] Deleting Resource failed!"); - } - - return Objects.requireNonNull(response.body()).string(); - } - - @Override - public String updateResourceAtBroker(final String brokerUri, final URI resourceID) throws IOException { - log.info(String.format("---- [DataspaceConnectorClient updateResourceAtBroker] updating resource at Broker %s", brokerUri)); - - final var path = resourceID.getPath(); - final var idStr = path.substring(path.lastIndexOf('/') + 1); - final var resourceUUID = UUID.fromString(idStr); - - final var builder = getRequestBuilder(); - builder.url(new HttpUrl.Builder() - .scheme(protocol) - .host(dataSpaceConnectorHost) - .port(dataSpaceConnectorPort) - .addPathSegments("admin/api/broker/update/" + resourceUUID) - .addQueryParameter("broker", brokerUri) - .build()); - builder.post(RequestBody.create(new byte[0], null)); - builder.header("Authorization", - Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); - final var request = builder.build(); - final var response = DispatchRequest.sendToDataspaceConnector(request); - - if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient updateResourceAtBroker] Updating Resource at Broker failed!"); - } - - return Objects.requireNonNull(response.body()).string(); - } - - @Override - public String deleteResourceAtBroker(final String brokerUri, final URI resourceID) throws IOException { - log.info(String.format("---- [DataspaceConnectorClient deleteResourceAtBroker] Deleting resource %s at Broker %s", resourceID, brokerUri)); - - final var path = resourceID.getPath(); - final var idStr = path.substring(path.lastIndexOf('/') + 1); - final var builder = getRequestBuilder(); - builder.url(new HttpUrl.Builder() - .scheme(protocol) - .host(dataSpaceConnectorHost) - .port(dataSpaceConnectorPort) - .addPathSegments("admin/api/broker/remove/" + idStr) - .addQueryParameter("broker", brokerUri) - .build()); - builder.post(RequestBody.create(new byte[0], null)); - builder.header("Authorization", - Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); - - final var request = builder.build(); - final var response = DispatchRequest.sendToDataspaceConnector(request); - - if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient deleteResourceAtBroker] Deleting Resource at Broker failed!"); - } - - return Objects.requireNonNull(response.body()).string(); - } - - @Override - public String deleteResourceRepresentation(final String resourceID, - final String representationID) throws IOException { - log.info(String.format( - "---- [DataspaceConnectorClient deleteResourceRepresentation] Deleting representation %s from resource %s at %s", - representationID, - resourceID, - dataSpaceConnectorHost)); - - - final var mappedResourceID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); - final var mappedRepresentationID = dataSpaceConnectorResourceMapper.getMappedId(URI.create(representationID)); - dataSpaceConnectorResourceMapper.deleteResourceIDPair(URI.create(representationID)); - - final var builder = getRequestBuilder(); - builder.url(connectorBaseUrl + "admin/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); - builder.delete(); - builder.header("Authorization", - Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); - - final var request = builder.build(); - final var response = DispatchRequest.sendToDataspaceConnector(request); - - if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient deleteResourceRepresentation] Deleting Representation failed!"); - } - - return Objects.requireNonNull(response.body()).string(); - } - - @Override - public String registerResourceRepresentation(final String resourceID, - final Representation representation, - final String endpointId) throws IOException { - log.info(String.format("---- [DataspaceConnectorClient registerResourceRepresentation] Registering resource at %s", dataSpaceConnectorHost)); - - final var mappedRepresentation = dataSpaceConnectorResourceMapper.mapRepresentation(representation); - final var backendSource = dataSpaceConnectorResourceMapper.createBackendSource(endpointId, representation); - mappedRepresentation.setSource(backendSource); - - final var mappedResourceID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); - final var mappedRepresentationID = dataSpaceConnectorResourceMapper.readUUIDFromURI(representation.getId()); - final var resourceJsonLD = MAPPER.writeValueAsString(mappedRepresentation); - - log.info("---- [DataspaceConnectorClient registerResourceRepresentation] Mapped representation: " + resourceJsonLD); - - final var builder = getRequestBuilder(); - builder.url(new HttpUrl.Builder() - .scheme(protocol) - .host(dataSpaceConnectorHost) - .port(dataSpaceConnectorPort) - .addPathSegments("admin/api/resources/" + mappedResourceID + "/representation") - .addQueryParameter("id", mappedRepresentationID.toString()) - .build()); - builder.post(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld+json"))); - builder.header("Authorization", - Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); - - final var request = builder.build(); - final var response = DispatchRequest.sendToDataspaceConnector(request); - - if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient registerResourceRepresentation] Registering Representation failed!"); - } - - final var body = Objects.requireNonNull(response.body()).string(); - final var uuid = dataSpaceConnectorResourceMapper.createFromResponse(body, representation.getId()); - - if (uuid == null) { - log.warn("---- [DataspaceConnectorClient registerResourceRepresentation] Could not parse ID from response!"); - } else { - log.info("---- [DataspaceConnectorClient registerResourceRepresentation] UUID is : " + uuid); - } - - return body; - } - - @Override - public String updateResourceRepresentation(final String resourceID, - final String representationID, - final Representation representation, - final String endpointId) throws IOException { - log.info(String.format( - "---- [DataspaceConnectorClient updateResourceRepresentation] Updating representation %s for resource %s at %s", - representationID, - resourceID, - dataSpaceConnectorHost)); - - final var mappedResourceID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); - final var mappedRepresentationID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(representationID)); - final var mappedRepresentation = dataSpaceConnectorResourceMapper.mapRepresentation(representation); - final var backendSource = dataSpaceConnectorResourceMapper.createBackendSource(endpointId, representation); - - mappedRepresentation.setSource(backendSource); - - final var resourceJsonLD = MAPPER.writeValueAsString(mappedRepresentation); - - log.info("---- [DataspaceConnectorClient updateResourceRepresentation] Mapped representation: " + resourceJsonLD); - - final var builder = getRequestBuilder(); - - builder.url(connectorBaseUrl + "admin/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); - builder.put(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld+json"))); - builder.header("Authorization", - Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); - - final var request = builder.build(); - final var response = DispatchRequest.sendToDataspaceConnector(request); - - if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient updateResourceRepresentation] Updating Representation failed!"); - } - - return Objects.requireNonNull(response.body()).string(); - } - - @Override - public String updateCustomResourceRepresentation(final String resourceID, - final String representationID, - final ResourceRepresentation resourceRepresentation) throws IOException { - log.info(String.format( - "---- [DataspaceConnectorClient updateCustomResourceRepresentation] Updating representation %s for resource %s at %s", - representationID, - resourceID, - dataSpaceConnectorHost)); - - final var mappedResourceID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); - final var mappedRepresentationID = dataSpaceConnectorResourceMapper.getMappedId(URI.create(representationID)); - final var resourceJsonLD = MAPPER.writeValueAsString(resourceRepresentation); - - log.info("---- [DataspaceConnectorClient updateCustomResourceRepresentation] Mapped representation: " + resourceJsonLD); - - final var builder = getRequestBuilder(); - builder.url(connectorBaseUrl + "admin/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); - builder.put(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld+json"))); - builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, - dataSpaceConnectorApiPassword)); - - final var request = builder.build(); - final var response = DispatchRequest.sendToDataspaceConnector(request); - - if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient updateCustomResourceRepresentation] Updating Resource-Representation failed!"); - } - - return Objects.requireNonNull(response.body()).string(); - } - - @Override - public String updateResourceContract(final String resourceID, final String contract) throws IOException { - log.info(String.format( - "---- [DataspaceConnectorClient updateResourceContract] updating contract for resource at %s", - dataSpaceConnectorHost)); - - final var mappedResourceID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); - - final var builder = getRequestBuilder(); - builder.url(connectorBaseUrl + "admin/api/resources/" + mappedResourceID + "/contract"); - builder.put(RequestBody.create(contract, okhttp3.MediaType.parse("application/ld+json"))); - builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, - dataSpaceConnectorApiPassword)); - - final var request = builder.build(); - final var response = DispatchRequest.sendToDataspaceConnector(request); - - if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient updateResourceContract] Updating contract failed!"); - } - - return Objects.requireNonNull(response.body()).string(); - } - @Override public String getPolicyPattern(final String policy) throws IOException { log.info("---- [DataspaceConnectorClient getPolicyPattern] Get pattern for policy"); @@ -674,58 +219,4 @@ public String getPolicyPattern(final String policy) throws IOException { return Objects.requireNonNull(response.body()).string(); } - - @Override - public String updateResource(final URI resourceID, final Resource resource) throws IOException { - log.info(String.format("---- [DataspaceConnectorClient updateResource] updating resource at %s", dataSpaceConnectorHost)); - - final var mappedResource = dataSpaceConnectorResourceMapper.getMetadata(resource); - final var path = resourceID.getPath(); - final var idStr = path.substring(path.lastIndexOf('/') + 1); - final var resourceUUID = UUID.fromString(idStr); - - final var backendSource = new BackendSource(); - try { - final var requestBackendBuilder = getRequestBuilder(); - requestBackendBuilder.url(connectorBaseUrl + "admin/api/resources/" + resourceUUID); - requestBackendBuilder.get(); - requestBackendBuilder.header("Authorization", - Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); - - final var request = requestBackendBuilder.build(); - final var response = DispatchRequest.sendToDataspaceConnector(request); - final var mapper = new ObjectMapper(); - final var jsonTree = mapper.readTree(Objects.requireNonNull(response.body()).string()); - - final var source = jsonTree.findValue("source"); - backendSource.setType(BackendSource.Type.valueOf(source.get("type").asText().toUpperCase().replace("-", "_"))); - backendSource.setUrl(URI.create(source.get("url").asText())); - backendSource.setUsername(source.get("username").asText()); - backendSource.setPassword(source.get("password").asText()); - } catch (Exception e) { - log.error(e.getMessage(), e); - } - - mappedResource.getRepresentations().get(0).setSource(backendSource); - final var resourceJsonLD = MAPPER.writeValueAsString(mappedResource); - - final var builder = getRequestBuilder(); - builder.url(connectorBaseUrl + "admin/api/resources/" + resourceUUID); - builder.put(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld+json"))); - builder.header("Authorization", - Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); - final var request = builder.build(); - final var response = DispatchRequest.sendToDataspaceConnector(request); - - if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient updateResource] Updating Resource failed!"); - } - - return Objects.requireNonNull(response.body()).string(); - } - - @NotNull - private Request.Builder getRequestBuilder() { - return new Request.Builder(); - } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceResourceClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceResourceClient.java new file mode 100644 index 00000000..04a6131b --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceResourceClient.java @@ -0,0 +1,389 @@ +package de.fraunhofer.isst.configmanager.connector.dataspaceconnector; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import de.fraunhofer.iais.eis.Representation; +import de.fraunhofer.iais.eis.Resource; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; +import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.BackendSource; +import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.ResourceRepresentation; +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; +import lombok.extern.slf4j.Slf4j; +import okhttp3.Credentials; +import okhttp3.HttpUrl; +import okhttp3.RequestBody; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.net.URI; +import java.util.Objects; +import java.util.UUID; + +@Slf4j +@Service +@ConditionalOnExpression("${dataspace.connector.enabled:false}") +@FieldDefaults(level = AccessLevel.PRIVATE) +public class DataspaceResourceClient extends DataspaceClient implements DefaultResourceClient { + + public DataspaceResourceClient(ResourceMapper dataSpaceConnectorResourceMapper) { + super(dataSpaceConnectorResourceMapper); + } + + @Override + public String getOfferedResourcesAsJsonString() throws IOException { + final var baseConnectorNode = getJsonNodeOfBaseConnector(); + final var offeredResourceNode = baseConnectorNode.findValue("ids:offeredResource"); + return offeredResourceNode.toString(); + } + + @Override + public String getRequestedResourcesAsJsonString() throws IOException { + final var baseConnectorNode = getJsonNodeOfBaseConnector(); + final var requestedResourceNode = baseConnectorNode.findValue("ids:requestedResource"); + return requestedResourceNode.toString(); + } + + private JsonNode getJsonNodeOfBaseConnector() throws IOException { + final var connectorUrl = connectorBaseUrl + "admin/api/connector"; + + final var builder = getRequestBuilder(); + builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, + dataSpaceConnectorApiPassword)); + builder.url(connectorUrl); + builder.get(); + + final var request = builder.build(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + + if (!response.isSuccessful()) { + log.warn("---- [DataspaceConnectorClient getJsonNodeOfBaseConnector] Could not get BaseConnector"); + } + + final var body = Objects.requireNonNull(response.body()).string(); + final var mapper = new ObjectMapper(); + + return mapper.readTree(body); + } + + @Override + public Resource getRequestedResource(final String accessURL, final String resourceId) throws IOException { + final var builder = getRequestBuilder(); + final var urlBuilder = new HttpUrl.Builder() + .scheme(protocol) + .host(dataSpaceConnectorHost) + .port(dataSpaceConnectorPort) + .addPathSegments("admin/api/request/description") + .addQueryParameter("recipient", accessURL) + .addQueryParameter("requestedResource", resourceId); + + final var url = urlBuilder.build(); + builder.url(url); + builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + builder.post(RequestBody.create(new byte[0], null)); + + final var request = builder.build(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + + if (!response.isSuccessful()) { + log.warn(String.format("---- [DataspaceConnectorClient getRequestedResource] Could not get BaseConnector from %s!", dataSpaceConnectorHost)); + } + + final var body = Objects.requireNonNull(response.body()).string(); + final var splitBody = body.split("\n", 2); + final var resource = splitBody[1].substring(10); + + Resource deserializedResource = null; + try { + deserializedResource = SERIALIZER.deserialize(resource, Resource.class); + } catch (IOException e) { + log.error("---- [DataspaceConnectorClient getRequestedResource] SERIALIZER.deserialize threw IOException"); + log.error(e.getMessage(), e); + } + + return deserializedResource; + } + + @Override + public String registerResource(final Resource resource) throws IOException { + log.info("---- [DataspaceConnectorClient registerResource] Registering resource..."); + + final var mappedResource = dataSpaceConnectorResourceMapper.getMetadata(resource); + final var resourceJsonLD = MAPPER.writeValueAsString(mappedResource); + + log.info("---- [DataspaceConnectorClient registerResource] New resource: " + resourceJsonLD); + + final var builder = getRequestBuilder(); + final var path = resource.getId().getPath(); + final var idStr = path.substring(path.lastIndexOf('/') + 1); + + final var url = new HttpUrl.Builder() + .scheme(protocol) + .host(dataSpaceConnectorHost) + .port(dataSpaceConnectorPort) + .addPathSegments("admin/api/resources/resource") + .addQueryParameter("id", idStr) + .build(); + builder.url(url); + builder.post(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld" + + "+json"))); + builder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + + log.info("---- [DataspaceConnectorClient registerResource] " + url.toString()); + + final var request = builder.build(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + + if (!response.isSuccessful()) { + log.warn("---- [DataspaceConnectorClient registerResource] Registering Resource failed!"); + } + + return Objects.requireNonNull(response.body()).string(); + } + + @Override + public String deleteResource(final URI resourceID) throws IOException { + log.info(String.format("---- [DataspaceConnectorClient deleteResource] deleting resource %s at %s", resourceID, + dataSpaceConnectorHost)); + + final var path = resourceID.getPath(); + final var idStr = path.substring(path.lastIndexOf('/') + 1); + + final var builder = getRequestBuilder(); + builder.url(connectorBaseUrl + "admin/api/resources/" + idStr); + builder.delete(); + builder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + final var request = builder.build(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + + if (!response.isSuccessful()) { + log.warn("---- [DataspaceConnectorClient deleteResource] Deleting Resource failed!"); + } + + return Objects.requireNonNull(response.body()).string(); + } + + @Override + public String deleteResourceRepresentation(final String resourceID, + final String representationID) throws IOException { + log.info(String.format( + "---- [DataspaceConnectorClient deleteResourceRepresentation] Deleting representation %s from resource %s at %s", + representationID, + resourceID, + dataSpaceConnectorHost)); + + + final var mappedResourceID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); + final var mappedRepresentationID = dataSpaceConnectorResourceMapper.getMappedId(URI.create(representationID)); + dataSpaceConnectorResourceMapper.deleteResourceIDPair(URI.create(representationID)); + + final var builder = getRequestBuilder(); + builder.url(connectorBaseUrl + "admin/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); + builder.delete(); + builder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + + final var request = builder.build(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + + if (!response.isSuccessful()) { + log.warn("---- [DataspaceConnectorClient deleteResourceRepresentation] Deleting Representation failed!"); + } + + return Objects.requireNonNull(response.body()).string(); + } + + @Override + public String registerResourceRepresentation(final String resourceID, + final Representation representation, + final String endpointId) throws IOException { + log.info(String.format("---- [DataspaceConnectorClient registerResourceRepresentation] Registering resource at %s", dataSpaceConnectorHost)); + + final var mappedRepresentation = dataSpaceConnectorResourceMapper.mapRepresentation(representation); + final var backendSource = dataSpaceConnectorResourceMapper.createBackendSource(endpointId, representation); + mappedRepresentation.setSource(backendSource); + + final var mappedResourceID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); + final var mappedRepresentationID = dataSpaceConnectorResourceMapper.readUUIDFromURI(representation.getId()); + final var resourceJsonLD = MAPPER.writeValueAsString(mappedRepresentation); + + log.info("---- [DataspaceConnectorClient registerResourceRepresentation] Mapped representation: " + resourceJsonLD); + + final var builder = getRequestBuilder(); + builder.url(new HttpUrl.Builder() + .scheme(protocol) + .host(dataSpaceConnectorHost) + .port(dataSpaceConnectorPort) + .addPathSegments("admin/api/resources/" + mappedResourceID + "/representation") + .addQueryParameter("id", mappedRepresentationID.toString()) + .build()); + builder.post(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld+json"))); + builder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + + final var request = builder.build(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + + if (!response.isSuccessful()) { + log.warn("---- [DataspaceConnectorClient registerResourceRepresentation] Registering Representation failed!"); + } + + final var body = Objects.requireNonNull(response.body()).string(); + final var uuid = dataSpaceConnectorResourceMapper.createFromResponse(body, representation.getId()); + + if (uuid == null) { + log.warn("---- [DataspaceConnectorClient registerResourceRepresentation] Could not parse ID from response!"); + } else { + log.info("---- [DataspaceConnectorClient registerResourceRepresentation] UUID is : " + uuid); + } + + return body; + } + + @Override + public String updateResourceRepresentation(final String resourceID, + final String representationID, + final Representation representation, + final String endpointId) throws IOException { + log.info(String.format( + "---- [DataspaceConnectorClient updateResourceRepresentation] Updating representation %s for resource %s at %s", + representationID, + resourceID, + dataSpaceConnectorHost)); + + final var mappedResourceID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); + final var mappedRepresentationID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(representationID)); + final var mappedRepresentation = dataSpaceConnectorResourceMapper.mapRepresentation(representation); + final var backendSource = dataSpaceConnectorResourceMapper.createBackendSource(endpointId, representation); + + mappedRepresentation.setSource(backendSource); + + final var resourceJsonLD = MAPPER.writeValueAsString(mappedRepresentation); + + log.info("---- [DataspaceConnectorClient updateResourceRepresentation] Mapped representation: " + resourceJsonLD); + + final var builder = getRequestBuilder(); + + builder.url(connectorBaseUrl + "admin/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); + builder.put(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld+json"))); + builder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + + final var request = builder.build(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + + if (!response.isSuccessful()) { + log.warn("---- [DataspaceConnectorClient updateResourceRepresentation] Updating Representation failed!"); + } + + return Objects.requireNonNull(response.body()).string(); + } + + @Override + public String updateCustomResourceRepresentation(final String resourceID, + final String representationID, + final ResourceRepresentation resourceRepresentation) throws IOException { + log.info(String.format( + "---- [DataspaceConnectorClient updateCustomResourceRepresentation] Updating representation %s for resource %s at %s", + representationID, + resourceID, + dataSpaceConnectorHost)); + + final var mappedResourceID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); + final var mappedRepresentationID = dataSpaceConnectorResourceMapper.getMappedId(URI.create(representationID)); + final var resourceJsonLD = MAPPER.writeValueAsString(resourceRepresentation); + + log.info("---- [DataspaceConnectorClient updateCustomResourceRepresentation] Mapped representation: " + resourceJsonLD); + + final var builder = getRequestBuilder(); + builder.url(connectorBaseUrl + "admin/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); + builder.put(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld+json"))); + builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, + dataSpaceConnectorApiPassword)); + + final var request = builder.build(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + + if (!response.isSuccessful()) { + log.warn("---- [DataspaceConnectorClient updateCustomResourceRepresentation] Updating Resource-Representation failed!"); + } + + return Objects.requireNonNull(response.body()).string(); + } + + @Override + public String updateResourceContract(final String resourceID, final String contract) throws IOException { + log.info(String.format( + "---- [DataspaceConnectorClient updateResourceContract] updating contract for resource at %s", + dataSpaceConnectorHost)); + + final var mappedResourceID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); + + final var builder = getRequestBuilder(); + builder.url(connectorBaseUrl + "admin/api/resources/" + mappedResourceID + "/contract"); + builder.put(RequestBody.create(contract, okhttp3.MediaType.parse("application/ld+json"))); + builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, + dataSpaceConnectorApiPassword)); + + final var request = builder.build(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + + if (!response.isSuccessful()) { + log.warn("---- [DataspaceConnectorClient updateResourceContract] Updating contract failed!"); + } + + return Objects.requireNonNull(response.body()).string(); + } + + @Override + public String updateResource(final URI resourceID, final Resource resource) throws IOException { + log.info(String.format("---- [DataspaceConnectorClient updateResource] updating resource at %s", dataSpaceConnectorHost)); + + final var mappedResource = dataSpaceConnectorResourceMapper.getMetadata(resource); + final var path = resourceID.getPath(); + final var idStr = path.substring(path.lastIndexOf('/') + 1); + final var resourceUUID = UUID.fromString(idStr); + + final var backendSource = new BackendSource(); + try { + final var requestBackendBuilder = getRequestBuilder(); + requestBackendBuilder.url(connectorBaseUrl + "admin/api/resources/" + resourceUUID); + requestBackendBuilder.get(); + requestBackendBuilder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + + final var request = requestBackendBuilder.build(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + final var mapper = new ObjectMapper(); + final var jsonTree = mapper.readTree(Objects.requireNonNull(response.body()).string()); + + final var source = jsonTree.findValue("source"); + backendSource.setType(BackendSource.Type.valueOf(source.get("type").asText().toUpperCase().replace("-", "_"))); + backendSource.setUrl(URI.create(source.get("url").asText())); + backendSource.setUsername(source.get("username").asText()); + backendSource.setPassword(source.get("password").asText()); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + mappedResource.getRepresentations().get(0).setSource(backendSource); + final var resourceJsonLD = MAPPER.writeValueAsString(mappedResource); + + final var builder = getRequestBuilder(); + builder.url(connectorBaseUrl + "admin/api/resources/" + resourceUUID); + builder.put(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld+json"))); + builder.header("Authorization", + Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + final var request = builder.build(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + + if (!response.isSuccessful()) { + log.warn("---- [DataspaceConnectorClient updateResource] Updating Resource failed!"); + } + + return Objects.requireNonNull(response.body()).string(); + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/ResourceMapper.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/ResourceMapper.java index d754d107..bff573f1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/ResourceMapper.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/ResourceMapper.java @@ -1,19 +1,15 @@ package de.fraunhofer.isst.configmanager.connector.dataspaceconnector; -import de.fraunhofer.iais.eis.Artifact; -import de.fraunhofer.iais.eis.BasicAuthenticationImpl; -import de.fraunhofer.iais.eis.GenericEndpoint; -import de.fraunhofer.iais.eis.Representation; -import de.fraunhofer.iais.eis.Resource; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.iais.eis.util.RdfResource; import de.fraunhofer.iais.eis.util.TypedLiteral; +import de.fraunhofer.isst.configmanager.api.service.EndpointService; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.BackendSource; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.ResourceIDPair; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.ResourceMetadata; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.ResourceRepresentation; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.repos.ResourceIDPairRepository; -import de.fraunhofer.isst.configmanager.api.service.EndpointService; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import org.springframework.stereotype.Service; diff --git a/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java b/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java index 5725c2d3..d9226b15 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java @@ -1,12 +1,15 @@ package de.fraunhofer.isst.configmanager.api_test; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultBrokerClient; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; import de.fraunhofer.isst.configmanager.model.config.CustomBroker; import de.fraunhofer.isst.configmanager.api.service.BrokerService; import de.fraunhofer.isst.configmanager.api.service.ResourceService; import de.fraunhofer.isst.configmanager.api.controller.BrokerController; import de.fraunhofer.isst.configmanager.util.TestUtil; import org.junit.jupiter.api.Test; +import org.mockito.Mock; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; @@ -34,6 +37,12 @@ public class BrokerUIAPITest { @MockBean private DefaultConnectorClient defaultConnectorClient; + @MockBean + private DefaultBrokerClient defaultBrokerClient; + + @MockBean + private DefaultResourceClient defaultResourceClient; + @MockBean private ResourceService resourceService; From b8042af4a224d3be86433fb04befefe77d10912e Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Tue, 6 Apr 2021 11:39:26 +0200 Subject: [PATCH 021/157] refactor: new default/DSC client structure --- .../AbstractDataspaceConnectorClient.java} | 14 +++-- .../{ => clients}/DataspaceBrokerClient.java | 20 +++--- .../DataspaceConnectorClient.java | 8 ++- .../DataspaceResourceClient.java | 63 ++++++++++--------- .../{ => util}/DispatchRequest.java | 4 +- .../{ => util}/ResourceMapper.java | 30 ++++----- 6 files changed, 74 insertions(+), 65 deletions(-) rename src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/{DataspaceClient.java => clients/AbstractDataspaceConnectorClient.java} (72%) rename src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/{ => clients}/DataspaceBrokerClient.java (81%) rename src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/{ => clients}/DataspaceConnectorClient.java (95%) rename src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/{ => clients}/DataspaceResourceClient.java (81%) rename src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/{ => util}/DispatchRequest.java (88%) rename src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/{ => util}/ResourceMapper.java (93%) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/AbstractDataspaceConnectorClient.java similarity index 72% rename from src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceClient.java rename to src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/AbstractDataspaceConnectorClient.java index 268e9dd0..ac489fea 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/AbstractDataspaceConnectorClient.java @@ -1,7 +1,8 @@ -package de.fraunhofer.isst.configmanager.connector.dataspaceconnector; +package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.clients; import com.fasterxml.jackson.databind.ObjectMapper; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; +import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util.ResourceMapper; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; @@ -12,9 +13,9 @@ @Slf4j @FieldDefaults(level = AccessLevel.PROTECTED) -public abstract class DataspaceClient { - final static Serializer SERIALIZER = new Serializer(); - final static ObjectMapper MAPPER = new ObjectMapper(); +public abstract class AbstractDataspaceConnectorClient { + static final Serializer SERIALIZER = new Serializer(); + static final ObjectMapper MAPPER = new ObjectMapper(); @Value("${dataspace.connector.host}") transient String dataSpaceConnectorHost; @@ -34,7 +35,7 @@ public abstract class DataspaceClient { String connectorBaseUrl = ""; - public DataspaceClient(final ResourceMapper dataSpaceConnectorResourceMapper) { + public AbstractDataspaceConnectorClient(final ResourceMapper dataSpaceConnectorResourceMapper) { this.dataSpaceConnectorResourceMapper = dataSpaceConnectorResourceMapper; } @@ -43,7 +44,8 @@ public void setProtocol(final @Value("${dataspace.communication.ssl}") String ht protocol = Boolean.parseBoolean(https) ? "https" : "http"; connectorBaseUrl = protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/"; - log.info("---- [DataspaceConnectorClient setProtocol] Communication Protocol with DataspaceConnector is: " + protocol); + log.info("---- [AbstractDataspaceConnectorClient extended by " + this.getClass().getSimpleName() + " setProtocol]" + + " Communication Protocol with DataspaceConnector is: " + protocol); } @NotNull diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceBrokerClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceBrokerClient.java similarity index 81% rename from src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceBrokerClient.java rename to src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceBrokerClient.java index f5f0c828..c3318e77 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceBrokerClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceBrokerClient.java @@ -1,6 +1,8 @@ -package de.fraunhofer.isst.configmanager.connector.dataspaceconnector; +package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.clients; import de.fraunhofer.isst.configmanager.connector.clients.DefaultBrokerClient; +import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util.DispatchRequest; +import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util.ResourceMapper; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; @@ -20,16 +22,16 @@ @Service @ConditionalOnExpression("${dataspace.connector.enabled:false}") @FieldDefaults(level = AccessLevel.PRIVATE) -public class DataspaceBrokerClient extends DataspaceClient implements DefaultBrokerClient { +public class DataspaceBrokerClient extends AbstractDataspaceConnectorClient implements DefaultBrokerClient { - public DataspaceBrokerClient(ResourceMapper dataSpaceConnectorResourceMapper) { + public DataspaceBrokerClient(final ResourceMapper dataSpaceConnectorResourceMapper) { super(dataSpaceConnectorResourceMapper); } @Override public Response updateAtBroker(final String brokerURI) throws IOException { log.info(String.format( - "---- [DataspaceConnectorClient updateAtBroker] updating connector %s at broker %s", + "---- [DataspaceBrokerClient updateAtBroker] updating connector %s at broker %s", dataSpaceConnectorHost, brokerURI)); @@ -53,7 +55,7 @@ public Response updateAtBroker(final String brokerURI) throws IOException { @Override public String unregisterAtBroker(final String brokerURI) throws IOException { log.info(String.format( - "---- [DataspaceConnectorClient unregisterAtBroker] unregistering connector %s at broker %s", + "---- [DataspaceBrokerClient unregisterAtBroker] unregistering connector %s at broker %s", dataSpaceConnectorHost, brokerURI)); @@ -76,7 +78,7 @@ public String unregisterAtBroker(final String brokerURI) throws IOException { @Override public String updateResourceAtBroker(final String brokerUri, final URI resourceID) throws IOException { - log.info(String.format("---- [DataspaceConnectorClient updateResourceAtBroker] updating resource at Broker %s", brokerUri)); + log.info(String.format("---- [DataspaceBrokerClient updateResourceAtBroker] updating resource at Broker %s", brokerUri)); final var path = resourceID.getPath(); final var idStr = path.substring(path.lastIndexOf('/') + 1); @@ -97,7 +99,7 @@ public String updateResourceAtBroker(final String brokerUri, final URI resourceI final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient updateResourceAtBroker] Updating Resource at Broker failed!"); + log.warn("---- [DataspaceBrokerClient updateResourceAtBroker] Updating Resource at Broker failed!"); } return Objects.requireNonNull(response.body()).string(); @@ -105,7 +107,7 @@ public String updateResourceAtBroker(final String brokerUri, final URI resourceI @Override public String deleteResourceAtBroker(final String brokerUri, final URI resourceID) throws IOException { - log.info(String.format("---- [DataspaceConnectorClient deleteResourceAtBroker] Deleting resource %s at Broker %s", resourceID, brokerUri)); + log.info(String.format("---- [DataspaceBrokerClient deleteResourceAtBroker] Deleting resource %s at Broker %s", resourceID, brokerUri)); final var path = resourceID.getPath(); final var idStr = path.substring(path.lastIndexOf('/') + 1); @@ -125,7 +127,7 @@ public String deleteResourceAtBroker(final String brokerUri, final URI resourceI final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient deleteResourceAtBroker] Deleting Resource at Broker failed!"); + log.warn("---- [DataspaceBrokerClient deleteResourceAtBroker] Deleting Resource at Broker failed!"); } return Objects.requireNonNull(response.body()).string(); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java similarity index 95% rename from src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceConnectorClient.java rename to src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java index 31eba4f2..a77231f2 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java @@ -1,8 +1,10 @@ -package de.fraunhofer.isst.configmanager.connector.dataspaceconnector; +package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.clients; import de.fraunhofer.iais.eis.BaseConnector; import de.fraunhofer.iais.eis.ConfigurationModel; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; +import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util.DispatchRequest; +import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util.ResourceMapper; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; @@ -22,9 +24,9 @@ @Service @ConditionalOnExpression("${dataspace.connector.enabled:false}") @FieldDefaults(level = AccessLevel.PRIVATE) -public class DataspaceConnectorClient extends DataspaceClient implements DefaultConnectorClient { +public class DataspaceConnectorClient extends AbstractDataspaceConnectorClient implements DefaultConnectorClient { - public DataspaceConnectorClient(ResourceMapper dataSpaceConnectorResourceMapper) { + public DataspaceConnectorClient(final ResourceMapper dataSpaceConnectorResourceMapper) { super(dataSpaceConnectorResourceMapper); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceResourceClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java similarity index 81% rename from src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceResourceClient.java rename to src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java index 04a6131b..27be68ea 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DataspaceResourceClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java @@ -1,10 +1,12 @@ -package de.fraunhofer.isst.configmanager.connector.dataspaceconnector; +package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.clients; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import de.fraunhofer.iais.eis.Representation; import de.fraunhofer.iais.eis.Resource; import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; +import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util.DispatchRequest; +import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util.ResourceMapper; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.BackendSource; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.ResourceRepresentation; import lombok.AccessLevel; @@ -25,9 +27,9 @@ @Service @ConditionalOnExpression("${dataspace.connector.enabled:false}") @FieldDefaults(level = AccessLevel.PRIVATE) -public class DataspaceResourceClient extends DataspaceClient implements DefaultResourceClient { +public class DataspaceResourceClient extends AbstractDataspaceConnectorClient implements DefaultResourceClient { - public DataspaceResourceClient(ResourceMapper dataSpaceConnectorResourceMapper) { + public DataspaceResourceClient(final ResourceMapper dataSpaceConnectorResourceMapper) { super(dataSpaceConnectorResourceMapper); } @@ -58,7 +60,7 @@ private JsonNode getJsonNodeOfBaseConnector() throws IOException { final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient getJsonNodeOfBaseConnector] Could not get BaseConnector"); + log.warn("---- [DataspaceResourceClient getJsonNodeOfBaseConnector] Could not get BaseConnector"); } final var body = Objects.requireNonNull(response.body()).string(); @@ -87,7 +89,7 @@ public Resource getRequestedResource(final String accessURL, final String resour final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn(String.format("---- [DataspaceConnectorClient getRequestedResource] Could not get BaseConnector from %s!", dataSpaceConnectorHost)); + log.warn(String.format("---- [DataspaceResourceClient getRequestedResource] Could not get BaseConnector from %s!", dataSpaceConnectorHost)); } final var body = Objects.requireNonNull(response.body()).string(); @@ -98,7 +100,7 @@ public Resource getRequestedResource(final String accessURL, final String resour try { deserializedResource = SERIALIZER.deserialize(resource, Resource.class); } catch (IOException e) { - log.error("---- [DataspaceConnectorClient getRequestedResource] SERIALIZER.deserialize threw IOException"); + log.error("---- [DataspaceResourceClient getRequestedResource] SERIALIZER.deserialize threw IOException"); log.error(e.getMessage(), e); } @@ -107,12 +109,12 @@ public Resource getRequestedResource(final String accessURL, final String resour @Override public String registerResource(final Resource resource) throws IOException { - log.info("---- [DataspaceConnectorClient registerResource] Registering resource..."); + log.info("---- [DataspaceResourceClient registerResource] Registering resource..."); final var mappedResource = dataSpaceConnectorResourceMapper.getMetadata(resource); final var resourceJsonLD = MAPPER.writeValueAsString(mappedResource); - log.info("---- [DataspaceConnectorClient registerResource] New resource: " + resourceJsonLD); + log.info("---- [DataspaceResourceClient registerResource] New resource: " + resourceJsonLD); final var builder = getRequestBuilder(); final var path = resource.getId().getPath(); @@ -126,18 +128,17 @@ public String registerResource(final Resource resource) throws IOException { .addQueryParameter("id", idStr) .build(); builder.url(url); - builder.post(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld" + - "+json"))); + builder.post(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld+json"))); builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); - log.info("---- [DataspaceConnectorClient registerResource] " + url.toString()); + log.info("---- [DataspaceResourceClient registerResource] " + url.toString()); final var request = builder.build(); final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient registerResource] Registering Resource failed!"); + log.warn("---- [DataspaceResourceClient registerResource] Registering Resource failed!"); } return Objects.requireNonNull(response.body()).string(); @@ -145,7 +146,7 @@ public String registerResource(final Resource resource) throws IOException { @Override public String deleteResource(final URI resourceID) throws IOException { - log.info(String.format("---- [DataspaceConnectorClient deleteResource] deleting resource %s at %s", resourceID, + log.info(String.format("---- [DataspaceResourceClient deleteResource] deleting resource %s at %s", resourceID, dataSpaceConnectorHost)); final var path = resourceID.getPath(); @@ -160,7 +161,7 @@ public String deleteResource(final URI resourceID) throws IOException { final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient deleteResource] Deleting Resource failed!"); + log.warn("---- [DataspaceResourceClient deleteResource] Deleting Resource failed!"); } return Objects.requireNonNull(response.body()).string(); @@ -170,7 +171,7 @@ public String deleteResource(final URI resourceID) throws IOException { public String deleteResourceRepresentation(final String resourceID, final String representationID) throws IOException { log.info(String.format( - "---- [DataspaceConnectorClient deleteResourceRepresentation] Deleting representation %s from resource %s at %s", + "---- [DataspaceResourceClient deleteResourceRepresentation] Deleting representation %s from resource %s at %s", representationID, resourceID, dataSpaceConnectorHost)); @@ -190,7 +191,7 @@ public String deleteResourceRepresentation(final String resourceID, final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient deleteResourceRepresentation] Deleting Representation failed!"); + log.warn("---- [DataspaceResourceClient deleteResourceRepresentation] Deleting Representation failed!"); } return Objects.requireNonNull(response.body()).string(); @@ -200,7 +201,7 @@ public String deleteResourceRepresentation(final String resourceID, public String registerResourceRepresentation(final String resourceID, final Representation representation, final String endpointId) throws IOException { - log.info(String.format("---- [DataspaceConnectorClient registerResourceRepresentation] Registering resource at %s", dataSpaceConnectorHost)); + log.info(String.format("---- [DataspaceResourceClient registerResourceRepresentation] Registering resource at %s", dataSpaceConnectorHost)); final var mappedRepresentation = dataSpaceConnectorResourceMapper.mapRepresentation(representation); final var backendSource = dataSpaceConnectorResourceMapper.createBackendSource(endpointId, representation); @@ -210,7 +211,7 @@ public String registerResourceRepresentation(final String resourceID, final var mappedRepresentationID = dataSpaceConnectorResourceMapper.readUUIDFromURI(representation.getId()); final var resourceJsonLD = MAPPER.writeValueAsString(mappedRepresentation); - log.info("---- [DataspaceConnectorClient registerResourceRepresentation] Mapped representation: " + resourceJsonLD); + log.info("---- [DataspaceResourceClient registerResourceRepresentation] Mapped representation: " + resourceJsonLD); final var builder = getRequestBuilder(); builder.url(new HttpUrl.Builder() @@ -228,16 +229,16 @@ public String registerResourceRepresentation(final String resourceID, final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient registerResourceRepresentation] Registering Representation failed!"); + log.warn("---- [DataspaceResourceClient registerResourceRepresentation] Registering Representation failed!"); } final var body = Objects.requireNonNull(response.body()).string(); final var uuid = dataSpaceConnectorResourceMapper.createFromResponse(body, representation.getId()); if (uuid == null) { - log.warn("---- [DataspaceConnectorClient registerResourceRepresentation] Could not parse ID from response!"); + log.warn("---- [DataspaceResourceClient registerResourceRepresentation] Could not parse ID from response!"); } else { - log.info("---- [DataspaceConnectorClient registerResourceRepresentation] UUID is : " + uuid); + log.info("---- [DataspaceResourceClient registerResourceRepresentation] UUID is : " + uuid); } return body; @@ -249,7 +250,7 @@ public String updateResourceRepresentation(final String resourceID, final Representation representation, final String endpointId) throws IOException { log.info(String.format( - "---- [DataspaceConnectorClient updateResourceRepresentation] Updating representation %s for resource %s at %s", + "---- [DataspaceResourceClient updateResourceRepresentation] Updating representation %s for resource %s at %s", representationID, resourceID, dataSpaceConnectorHost)); @@ -263,7 +264,7 @@ public String updateResourceRepresentation(final String resourceID, final var resourceJsonLD = MAPPER.writeValueAsString(mappedRepresentation); - log.info("---- [DataspaceConnectorClient updateResourceRepresentation] Mapped representation: " + resourceJsonLD); + log.info("---- [DataspaceResourceClient updateResourceRepresentation] Mapped representation: " + resourceJsonLD); final var builder = getRequestBuilder(); @@ -276,7 +277,7 @@ public String updateResourceRepresentation(final String resourceID, final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient updateResourceRepresentation] Updating Representation failed!"); + log.warn("---- [DataspaceResourceClient updateResourceRepresentation] Updating Representation failed!"); } return Objects.requireNonNull(response.body()).string(); @@ -287,7 +288,7 @@ public String updateCustomResourceRepresentation(final String resourceID, final String representationID, final ResourceRepresentation resourceRepresentation) throws IOException { log.info(String.format( - "---- [DataspaceConnectorClient updateCustomResourceRepresentation] Updating representation %s for resource %s at %s", + "---- [DataspaceResourceClient updateCustomResourceRepresentation] Updating representation %s for resource %s at %s", representationID, resourceID, dataSpaceConnectorHost)); @@ -296,7 +297,7 @@ public String updateCustomResourceRepresentation(final String resourceID, final var mappedRepresentationID = dataSpaceConnectorResourceMapper.getMappedId(URI.create(representationID)); final var resourceJsonLD = MAPPER.writeValueAsString(resourceRepresentation); - log.info("---- [DataspaceConnectorClient updateCustomResourceRepresentation] Mapped representation: " + resourceJsonLD); + log.info("---- [DataspaceResourceClient updateCustomResourceRepresentation] Mapped representation: " + resourceJsonLD); final var builder = getRequestBuilder(); builder.url(connectorBaseUrl + "admin/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); @@ -308,7 +309,7 @@ public String updateCustomResourceRepresentation(final String resourceID, final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient updateCustomResourceRepresentation] Updating Resource-Representation failed!"); + log.warn("---- [DataspaceResourceClient updateCustomResourceRepresentation] Updating Resource-Representation failed!"); } return Objects.requireNonNull(response.body()).string(); @@ -317,7 +318,7 @@ public String updateCustomResourceRepresentation(final String resourceID, @Override public String updateResourceContract(final String resourceID, final String contract) throws IOException { log.info(String.format( - "---- [DataspaceConnectorClient updateResourceContract] updating contract for resource at %s", + "---- [DataspaceResourceClient updateResourceContract] updating contract for resource at %s", dataSpaceConnectorHost)); final var mappedResourceID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); @@ -332,7 +333,7 @@ public String updateResourceContract(final String resourceID, final String contr final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient updateResourceContract] Updating contract failed!"); + log.warn("---- [DataspaceResourceClient updateResourceContract] Updating contract failed!"); } return Objects.requireNonNull(response.body()).string(); @@ -340,7 +341,7 @@ public String updateResourceContract(final String resourceID, final String contr @Override public String updateResource(final URI resourceID, final Resource resource) throws IOException { - log.info(String.format("---- [DataspaceConnectorClient updateResource] updating resource at %s", dataSpaceConnectorHost)); + log.info(String.format("---- [DataspaceResourceClient updateResource] updating resource at %s", dataSpaceConnectorHost)); final var mappedResource = dataSpaceConnectorResourceMapper.getMetadata(resource); final var path = resourceID.getPath(); @@ -381,7 +382,7 @@ public String updateResource(final URI resourceID, final Resource resource) thro final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient updateResource] Updating Resource failed!"); + log.warn("---- [DataspaceResourceClient updateResource] Updating Resource failed!"); } return Objects.requireNonNull(response.body()).string(); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DispatchRequest.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/DispatchRequest.java similarity index 88% rename from src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DispatchRequest.java rename to src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/DispatchRequest.java index 913586f0..0f1fe8c3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/DispatchRequest.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/DispatchRequest.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.connector.dataspaceconnector; +package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util; import de.fraunhofer.isst.configmanager.util.OkHttpUtils; import lombok.experimental.UtilityClass; @@ -11,7 +11,7 @@ @UtilityClass public class DispatchRequest { - final static transient OkHttpClient OK_HTTP_CLIENT = OkHttpUtils.getUnsafeOkHttpClient(); + static final transient OkHttpClient OK_HTTP_CLIENT = OkHttpUtils.getUnsafeOkHttpClient(); @NotNull public static Response sendToDataspaceConnector(final Request request) throws IOException { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/ResourceMapper.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java similarity index 93% rename from src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/ResourceMapper.java rename to src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java index bff573f1..b28bad46 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/ResourceMapper.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java @@ -1,6 +1,10 @@ -package de.fraunhofer.isst.configmanager.connector.dataspaceconnector; +package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.Artifact; +import de.fraunhofer.iais.eis.BasicAuthenticationImpl; +import de.fraunhofer.iais.eis.GenericEndpoint; +import de.fraunhofer.iais.eis.Representation; +import de.fraunhofer.iais.eis.Resource; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.iais.eis.util.RdfResource; import de.fraunhofer.iais.eis.util.TypedLiteral; @@ -51,11 +55,7 @@ public ResourceMapper(final ResourceIDPairRepository resourceIDPairRepository, */ public UUID getMappedId(final URI id) { final var pairs = resourceIDPairRepository.findByUri(id); - if (pairs.isEmpty()) { - return null; - } - //uri is set to unique - return pairs.get(0).getUuid(); + return pairs.isEmpty() ? null : pairs.get(0).getUuid(); } /** @@ -83,14 +83,17 @@ public UUID readUUIDFromURI(final URI id) { */ public UUID createFromResponse(final String response, final URI id) { final var matcher = uuidRegex.matcher(response); + UUID uuid = null; + if (matcher.find()) { final var uuidString = matcher.group(0); - final var uuid = UUID.fromString(uuidString); + uuid = UUID.fromString(uuidString); + final var pair = new ResourceIDPair(uuid, id); resourceIDPairRepository.saveAndFlush(pair); - return uuid; } - return null; + + return uuid; } /** @@ -124,10 +127,9 @@ public ResourceMetadata getMetadata(final Resource resource) throws IOException * @return list of mapped resource representations */ private List mapRepresentations(final List representations) { - if (representations == null) { - return List.of(); - } - return representations.stream().map(this::mapRepresentation).collect(Collectors.toList()); + return representations == null + ? List.of() + : representations.stream().map(this::mapRepresentation).collect(Collectors.toList()); } /** From 996b4f1abe6445163bc067c0d7a66587ca93fe01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Tue, 6 Apr 2021 13:12:40 +0200 Subject: [PATCH 022/157] fix: corrected spelling in javadoc --- .../api/controller/ResourceContractController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java index 210d511d..2cce556b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java @@ -124,7 +124,7 @@ public ResponseEntity updateResourceContract(final URI resourceId, final /** * @param resourceId id of the resource * @param pattern the pattern of the contract - * @param contractJson the created contract for the resourrce + * @param contractJson the created contract for the resource * @return a suitable http response depending on success */ @Override From ca90871b18cd58f3279f47e17ac998f938e689ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Tue, 6 Apr 2021 15:52:12 +0200 Subject: [PATCH 023/157] refactor : api documentation --- .../isst/configmanager/api/AppApi.java | 10 ++- .../isst/configmanager/api/AppRouteApi.java | 52 ++++++++++++---- .../isst/configmanager/api/BrokerApi.java | 48 ++++++++++---- .../configmanager/api/ConfigModelApi.java | 9 ++- .../isst/configmanager/api/ConnectorApi.java | 15 ++++- .../api/ConnectorRequestApi.java | 12 ++-- .../isst/configmanager/api/EndpointApi.java | 35 ++++++++--- .../isst/configmanager/api/ResourceApi.java | 25 ++++++-- .../api/ResourceContractApi.java | 18 ++++-- .../api/ResourceRepresentationApi.java | 23 +++++-- .../isst/configmanager/api/UtilApi.java | 8 ++- .../api/controller/AppController.java | 10 ++- .../api/controller/AppRouteController.java | 6 +- .../api/controller/BrokerController.java | 4 +- .../api/controller/ConfigModelController.java | 3 +- .../ConnectorRequestController.java | 5 +- .../api/controller/EndpointController.java | 8 +-- .../ResourceContractController.java | 62 ++++++++++--------- .../api/controller/ResourceController.java | 2 +- .../ResourceRepresentationController.java | 10 +-- .../clients/DataspaceResourceClient.java | 4 +- .../util/ResourceMapper.java | 6 +- 22 files changed, 250 insertions(+), 125 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/AppApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/AppApi.java index 45dea672..84875b02 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/AppApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/AppApi.java @@ -10,11 +10,17 @@ public interface AppApi { @GetMapping(value = "/apps", produces = "application/ld+json") @Operation(summary = "Returns a list of all apps") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Returned a list of all apps")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Returns a list of custom apps"), + @ApiResponse(responseCode = "400", description = "Could not find customs apps"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity getApps(); @GetMapping(value = "/app", produces = "application/ld+json") @Operation(summary = "Return an app") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Returned an app")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Returns a custom app"), + @ApiResponse(responseCode = "400", description = "Can not find the custom app"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity getApp(@RequestParam(value = "id") String id); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java index 0e7c0dcb..a34bcb0c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java @@ -14,40 +14,56 @@ public interface AppRouteApi { // Interfaces for managing app routes @PostMapping(value = "/approute", produces = "application/ld+json") @Operation(summary = "Creates a new app route") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Created a new app route")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Created a new app route"), + @ApiResponse(responseCode = "400", description = "Can not create an app route")}) ResponseEntity createAppRoute(@RequestParam("description") String description); @PutMapping(value = "/approute", produces = "application/ld+json") @Operation(summary = "Updates the given app route") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Created a new app route")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Created a new app route"), + @ApiResponse(responseCode = "400", description = "Can not update the app route")}) ResponseEntity updateAppRoute(@RequestParam("routeId") URI routeId, @RequestParam(value = "description", required = false) String description); @DeleteMapping(value = "/approute", produces = "application/ld+json") @Operation(summary = "Deletes the given app route") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully deleted the app route")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully deleted the app route"), + @ApiResponse(responseCode = "400", description = "Can not delete the app route")}) ResponseEntity deleteAppRoute(@RequestParam("routeId") URI routeId); @GetMapping(value = "/approute", produces = "application/ld+json") @Operation(summary = "Returns the given app route") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully get the app route")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully get the app route"), + @ApiResponse(responseCode = "400", description = "Can not find the app route"), + @ApiResponse(responseCode = "500", description = "Internal Server error")}) ResponseEntity getAppRoute(@RequestParam("routeId") URI routeId); @GetMapping(value = "/approutes", produces = "application/ld+json") @Operation(summary = "Returns all app routes") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully get all app routes")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Returns the list of the app routes"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity getAppRoutes(); // Interfaces for managing route steps @GetMapping(value = "/approute/step", produces = "application/ld+json") @Operation(summary = "Returns the specific route step") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned the specific route step")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully returned the specific route step"), + @ApiResponse(responseCode = "400", description = "Can not find the route step"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity getAppRouteStep(@RequestParam(value = "routeId") URI routeId, @RequestParam(value = "routeStepId") URI routeStepId); @PostMapping(value = "/approute/step", produces = "application/ld+json") @Operation(summary = "Creates a new subroute for the app route") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully created a new subroute for the app route")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully created a new subroute for the app route"), + @ApiResponse(responseCode = "400", description = "Can not create the route step")}) ResponseEntity createAppRouteStep(@RequestParam(value = "routeId") URI routeId, @RequestParam(value = "startId") URI startId, @RequestParam(value = "startCoordinateX") int startCoordinateX, @@ -59,30 +75,42 @@ ResponseEntity createAppRouteStep(@RequestParam(value = "routeId") URI r @DeleteMapping(value = "/approute/step", produces = "application/ld+json") @Operation(summary = "Deletes the specific route step") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully deleted the specific route step")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully deleted the specific route step"), + @ApiResponse(responseCode = "400", description = "Can not delete the route step")}) ResponseEntity deleteAppRouteStep(@RequestParam(value = "routeId") URI routeId, @RequestParam(value = "routeStepId") URI routeStepId); @GetMapping(value = "/approute/step/endpoint/info", produces = "application/ld+json") @Operation(summary = "Returns for a route step the specific endpoint information") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned for a route step the specific endpoint information")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully returned for a route step the specific endpoint information"), + @ApiResponse(responseCode = "400", description = "Can not find the endpoint information"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity getEndpointInformation(@RequestParam(value = "routeId") URI routeId, @RequestParam(value = "endpointId") URI endpointId); @GetMapping(value = "/approute/step/endpoints/info", produces = "application/ld+json") @Operation(summary = "Returns all endpoints information") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned all endpoint information")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully returned all endpoint information"), + @ApiResponse(responseCode = "400", description = "Can not find the endpoint information"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity getAllEndpointInfo(); // Interfaces for managing deploy methods of the routes @PutMapping(value = "/route/deploymethod", produces = "application/ld+json") @Operation(summary = "Updates the route deploy method for all routes") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully updated the route deploy method")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully updated the route deploy method"), + @ApiResponse(responseCode = "400", description = "Can not update the route deploy method")}) ResponseEntity updateRouteDeployMethod(@RequestParam("deployMethod") DeployMethod deployMethod); @GetMapping(value = "/route/deploymethod", produces = "application/ld+json") @Operation(summary = "Returns the route deploy method for all routes") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned the route deploy method")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully returned the route deploy method"), + @ApiResponse(responseCode = "400", description = "Can not find the route deploy method")}) ResponseEntity getRouteDeployMethod(); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java index 7ea877e6..fffae7c1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java @@ -12,62 +12,88 @@ public interface BrokerApi { // APIs to manage custom broker @PostMapping(value = "/broker", produces = "application/ld+json") @Operation(summary = "Creates a new broker") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Created a new broker")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Created a new broker"), + @ApiResponse(responseCode = "400", description = "Can not create the broker")}) ResponseEntity createBroker(@RequestParam(value = "brokerUri") URI brokerUri, @RequestParam(value = "title", required = false) String title); @PutMapping(value = "/broker", produces = "application/ld+json") @Operation(summary = "Updates a broker") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Updated the broker")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Updated the broker"), + @ApiResponse(responseCode = "400", description = "Can not update the broker")}) ResponseEntity updateBroker(@RequestParam(value = "brokerUri") URI brokerUri, @RequestParam(value = "title", required = false) String title); @DeleteMapping(value = "/broker", produces = "application/ld+json") @Operation(summary = "Deletes a broker") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Deleted the broker")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Deleted the broker"), + @ApiResponse(responseCode = "400", description = "Can not delete the broker")}) ResponseEntity deleteBroker(@RequestParam(value = "brokerUri") URI brokerUri); @GetMapping(value = "/brokers", produces = "application/ld+json") @Operation(summary = "Returns the list of all brokers") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned the list of all brokers")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully returned the list of all brokers"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity getAllBrokers(); @GetMapping(value = "/broker/list", produces = "application/ld+json") @Operation(summary = "Returns a list of all broker uri's") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned a list of all broker uris's")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully returned a list of all broker uris"), + @ApiResponse(responseCode = "400", description = "Can not find the broker uris")}) ResponseEntity getAllBrokerUris(); @GetMapping(value = "/broker", produces = "application/ld+json") @Operation(summary = "Returns the specific broker") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned the specific broker")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully returned the specific broker"), + @ApiResponse(responseCode = "400", description = "Can not find the broker"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity getBroker(@RequestParam(value = "brokerUri") URI brokerUri); // APIs to be able to manage connector at broker @PostMapping(value = "/broker/register", produces = "application/ld+json") @Operation(summary = "Registers the connector with the broker") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully registered the connector with the broker")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully registered the connector with the broker"), + @ApiResponse(responseCode = "400", description = "Can not find the broker to register the connector")}) ResponseEntity registerConnector(@RequestParam(value = "brokerUri") URI brokerUri); @PostMapping(value = "/broker/unregister", produces = "application/ld+json") @Operation(summary = "Unregisters the connector with the broker") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully unregistered the connector with the broker")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully unregistered the connector with the broker"), + @ApiResponse(responseCode = "400", description = "Can not find the broker to unregister the connector")}) ResponseEntity unregisterConnector(@RequestParam(value = "brokerUri") URI brokerUri); @PostMapping(value = "/broker/update", produces = "application/ld+json") @Operation(summary = "Updates the self description at the broker") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully updated the self description at the broker")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully updated the self description at the broker"), + @ApiResponse(responseCode = "400", description = "Can not find the broker to update the connector"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity updateConnector(@RequestParam(value = "brokerUri") URI brokerUri); // APIs to manage the resources at broker @PostMapping(value = "/broker/update/resource", produces = "application/ld+json") @Operation(summary = "Updates a resource at the broker") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully updated the resource at the broker")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully updated the resource at the broker"), + @ApiResponse(responseCode = "400", description = "Can not find the broker to update the connector"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity updateResourceAtBroker(@RequestParam(value = "brokerUri") URI brokerUri, @RequestParam("resourceId") URI resourceId); @PostMapping(value = "/broker/delete/resource", produces = "application/ld+json") @Operation(summary = "Deletes a resource at the broker") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully deleted the resource at the broker")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully deleted the resource at the broker"), + @ApiResponse(responseCode = "400", description = "Can not find the broker to update the connector"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity deleteResourceAtBroker(@RequestParam(value = "brokerUri") URI brokerUri, @RequestParam("resourceId") URI resourceId); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ConfigModelApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConfigModelApi.java index 8409200e..14cee406 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ConfigModelApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConfigModelApi.java @@ -14,7 +14,10 @@ public interface ConfigModelApi { @PutMapping(value = "/configmodel") @Operation(summary = "Updates the configuration model") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully updated the configuration model")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully updated the configuration model at the client"), + @ApiResponse(responseCode = "400", description = "Can not update the configuration model at the client"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity updateConfigModel(@RequestParam(value = "loglevel", required = false) String loglevel, @RequestParam(value = "connectorDeployMode", required = false) String connectorDeployMode, @RequestParam(value = "trustStore", required = false) String trustStore, @@ -29,7 +32,9 @@ ResponseEntity updateConfigModel(@RequestParam(value = "loglevel", requi @GetMapping(value = "/configmodel", produces = "application/ld+json") @Operation(summary = "Get the configuration model") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Succesfully get the configuration model")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Succesfully get the configuration model"), + @ApiResponse(responseCode = "400", description = "Can not find the configuration model")}) ResponseEntity getConfigModel(); @GetMapping(value = "/configmodel/json", produces = "application/ld+json") diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java index 70504ec2..e2e84f0b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java @@ -9,7 +9,10 @@ public interface ConnectorApi { @GetMapping(value = "/connector", produces = "application/ld+json") @Operation(summary = "Get the Connector-Description") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully retrieved the connector")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully retrieved the connector"), + @ApiResponse(responseCode = "404", description = "Can not find a connector description"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity getConnector(); @GetMapping(value = "/connector/status", produces = "application/ld+json") @@ -38,7 +41,11 @@ ResponseEntity createConnector(@RequestParam("title") String title, @PutMapping(value = "/connector", produces = "application/ld+json") @Operation(summary = "Update a connector") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully updated a new connector")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully updated the connector description of the" + + " configuration model"), + @ApiResponse(responseCode = "400", description = "Failed to update the connector. The configuration model" + + " is not valid")}) ResponseEntity updateConnector(@RequestParam(value = "title", required = false) String title, @RequestParam(value = "description", required = false) String description, @RequestParam(value = "endpoint", required = false) String endpoint, @@ -50,6 +57,8 @@ ResponseEntity updateConnector(@RequestParam(value = "title", required = @DeleteMapping(value = "/connector") @Operation(summary = "Deletes the connector") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully deleted the connector")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully deleted the connector"), + @ApiResponse(responseCode = "400", description = "Could not delete the connector")}) ResponseEntity deleteConnector(); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java index dde4a887..4a632852 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java @@ -13,14 +13,18 @@ public interface ConnectorRequestApi { @PostMapping(value = "/request/description", produces = "application/ld+json") @Operation(summary = "Request metadata from another IDS connector.") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully requested metadata from IDS connector")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully requested metadata from IDS connector"), + @ApiResponse(responseCode = "400", description = "Can not request metadata from IDS connector"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity requestMetadata(@RequestParam("recipientId") URI recipientId, - @RequestParam(value = "requestedResourceId", required = false) - URI requestedResourceId); + @RequestParam(value = "requestedResourceId", required = false) URI requestedResourceId); @PostMapping(value = "/request/contract", produces = "application/ld+json") @Operation(summary = "Send a contract request to another IDS connector.") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully send a contract request to another IDS connector")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully send a contract request to another IDS connector"), + @ApiResponse(responseCode = "400", description = "Can not return the contract agreement id")}) ResponseEntity requestContract(@RequestParam("recipientId") URI recipientId, @RequestParam(value = "requestedArtifactId ") URI requestedArtifactId, @RequestBody(required = false) String contractOffer); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java index 72dd0a38..241054c1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java @@ -11,29 +11,40 @@ public interface EndpointApi { @PostMapping(value = "/generic/endpoint", produces = "application/ld+json") @Operation(summary = "Creates a generic endpoint") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Created a generic endpoint")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Created a generic endpoint"), + @ApiResponse(responseCode = "400", description = "Can not create the generic endpoint")}) ResponseEntity createGenericEndpoint(@RequestParam(value = "accessURL") String accessURL, @RequestParam(value = "username", required = false) String username, @RequestParam(value = "password", required = false) String password); @GetMapping(value = "/generic/endpoints", produces = "application/ld+json") @Operation(summary = "Returns a list of generic endpoints") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Returned a list of generic endpoints")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Returned a list of generic endpoints"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity getGenericEndpoints(); @GetMapping(value = "/generic/endpoint", produces = "application/ld+json") @Operation(summary = "Returns a specific generic endpoint") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Returned a specific backend connection")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Returned a specific backend connection"), + @ApiResponse(responseCode = "400", description = "Can not find the generic endpoint"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity getGenericEndpoint(@RequestParam(value = "endpointId") URI endpointId); @DeleteMapping(value = "/generic/endpoint", produces = "application/ld+json") @Operation(summary = "Deletes a generic endpoint") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Deleted a generic endpoint")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Deleted a generic endpoint"), + @ApiResponse(responseCode = "400", description = "Can not delete the generic endpoint")}) ResponseEntity deleteGenericEndpoint(@RequestParam(value = "endpointId") URI endpointId); @PutMapping(value = "/generic/endpoint", produces = "application/ld+json") @Operation(summary = "Updates a generic endpoint") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Updated a generic endpoint")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Updated a generic endpoint"), + @ApiResponse(responseCode = "400", description = "Can not update the generic endpoint")}) ResponseEntity updateGenericEndpoint(@RequestParam(value = "id") URI id, @RequestParam(value = "accessURL", required = false) String accessURL, @RequestParam(value = "username", required = false) String username, @@ -41,18 +52,26 @@ ResponseEntity updateGenericEndpoint(@RequestParam(value = "id") URI id, @GetMapping(value = "/connector/endpoints", produces = "application/ld+json") @Operation(summary = "Returns the connector endpoints") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned the connector endpoints")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully returned the connector endpoints"), + @ApiResponse(responseCode = "400", description = "Can not find the connector endpoints"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity getConnectorEndpoints(); @GetMapping(value = "/connector/endpoints/client", produces = "application/ld+json") @Operation(summary = "Returns a list of connector endpoints") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned a list of connector endpoints")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully returned a list of connector endpoints"), + @ApiResponse(responseCode = "400", description = "Can not find the connector endpoints from the client")}) ResponseEntity getConnectorEndpointsFromClient(@RequestParam("accessUrl") String accessUrl, @RequestParam(value = "resourceId", required = false) String resourceId); @GetMapping(value = "/connector/endpoint", produces = "application/ld+json") @Operation(summary = "Returns the connector endpoint") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned the connector endpoint")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully returned the connector endpoint"), + @ApiResponse(responseCode = "400", description = "Can not find the connector endpoint"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity getConnectorEndpoint(@RequestParam("connectorEndpointId") URI connectorEndpointId); @PostMapping(value = "/connector/endpoint", produces = "application/ld+json") diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java index 2d025b2a..c4e89e18 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java @@ -12,7 +12,10 @@ public interface ResourceApi { @GetMapping(value = "/resource", produces = "application/ld+json") @Operation(summary = "Returns the specific resource from the connector") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned the specifc resource from the connector")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully returned the specifc resource from the connector"), + @ApiResponse(responseCode = "400", description = "Can not find the resource"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity getResource(@RequestParam(value = "resourceId") URI resourceId); @GetMapping(value = "/resources", produces = "application/ld+json") @@ -27,13 +30,17 @@ public interface ResourceApi { @GetMapping(value = "/resource/json", produces = "application/ld+json") @Operation(summary = "Returns the specific resource from the connector in JSON format") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned the specific resource " - + "from the connector in JSON format")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully returned the specific resource " + + "from the connector in JSON format"), + @ApiResponse(responseCode = "400", description = "Validation failed. Can not find the resource")}) ResponseEntity getResourceInJson(@RequestParam(value = "resourceId") URI resourceId); @PostMapping(value = "/resource", produces = "application/ld+json") @Operation(summary = "Creates a resource for the connector") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully created a resource for the connector")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully created a resource for the connector"), + @ApiResponse(responseCode = "400", description = "Can not create the resource")}) ResponseEntity createResource(@RequestParam("title") String title, @RequestParam("description") String description, @RequestParam("language") String language, @@ -44,7 +51,11 @@ ResponseEntity createResource(@RequestParam("title") String title, @PutMapping(value = "/resource", produces = "application/ld+json") @Operation(summary = "Updates the specific resource at the connector") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully updated the specific resource at the connector")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully updated the specific resource at the connector"), + @ApiResponse(responseCode = "400", description = "Validation failed. Can not update the resource"), + @ApiResponse(responseCode = "404", description = "Can not find the resource"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity updateResource(@RequestParam("resourceId") URI resourceId, @RequestParam(value = "title", required = false) String title, @RequestParam(value = "description", required = false) String description, @@ -56,6 +67,8 @@ ResponseEntity updateResource(@RequestParam("resourceId") URI resourceId @DeleteMapping(value = "/resource") @Operation(summary = "Deletes the specific resource from the connector") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully deleted the specific resource from the connector")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully deleted the specific resource from the connector"), + @ApiResponse(responseCode = "400", description = "Can not delete the resource")}) ResponseEntity deleteResource(@RequestParam(value = "resourceId") URI resourceId); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java index 1aa30d5c..19af6e48 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java @@ -15,21 +15,29 @@ public interface ResourceContractApi { @GetMapping(value = "/resource/contract", produces = "application/ld+json") @Operation(summary = "Returns the contract from a resource") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned the contract from the resource")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully returned the contract from the resource"), + @ApiResponse(responseCode = "400", description = "Can not find the resource contract"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity getResourceContract(@RequestParam("resourceId") URI resourceId); @PutMapping(value = "/resource/contract", produces = "application/ld+json") @Operation(summary = "Updates the contract in a resource") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully updated the contract in the resource")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully updated the contract in the resource"), + @ApiResponse(responseCode = "400", description = "Can not update the resource contract"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity updateResourceContract(@RequestParam("resourceId") URI resourceId, @RequestBody String contractJson); @PutMapping(value = "/resource/contract/update", produces = "application/ld+json") @Operation(summary = "Updates the contract in a resource") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully updated the contract in the resource")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully updated the contract in the resource"), + @ApiResponse(responseCode = "400", description = "Can not upda the resource contract")}) ResponseEntity updateContractForResource(@RequestParam("resourceId") URI resourceId, - @RequestParam("pattern") Pattern pattern, - @RequestBody(required = false) String contractJson); + @RequestParam("pattern") Pattern pattern, + @RequestBody(required = false) String contractJson); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java index 3471afdd..1c2057f8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java @@ -11,7 +11,10 @@ public interface ResourceRepresentationApi { @PostMapping(value = "/resource/representation", produces = "application/ld+json") @Operation(summary = "Creates a representation for a resource") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully created a representation for a resource")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully created a representation for a resource"), + @ApiResponse(responseCode = "400", description = "Can not create the resource representation"), + @ApiResponse(responseCode = "404", description = "Can not find the resource to create the representation")}) ResponseEntity createResourceRepresentation(@RequestParam("resourceId") URI resourceId, @RequestParam("endpointId") URI endpointId, @RequestParam("language") String language, @@ -21,7 +24,10 @@ ResponseEntity createResourceRepresentation(@RequestParam("resourceId") @PutMapping(value = "/resource/representation", produces = "application/ld+json") @Operation(summary = "Updates the representation for a resource") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully updated the representation for a resource")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully updated the representation for a resource"), + @ApiResponse(responseCode = "400", description = "Can not update the resource representation"), + @ApiResponse(responseCode = "404", description = "Can not find the resource to update the representation")}) ResponseEntity updateResourceRepresentation(@RequestParam("resourceId") URI resourceId, @RequestParam(value = "representationId") URI representationId, @RequestParam(value = "endpointId") URI endpointId, @@ -32,18 +38,25 @@ ResponseEntity updateResourceRepresentation(@RequestParam("resourceId") @GetMapping(value = "/resource/representation", produces = "application/ld+json") @Operation(summary = "Get the representation for a resource") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully get the representation for a resource")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully get the representation for a resource"), + @ApiResponse(responseCode = "400", description = "Can not find the resource representation"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity getResourceRepresentation(@RequestParam("representationId") URI representationId); @GetMapping(value = "/resource/representation/json", produces = "application/ld+json") @Operation(summary = "Get the representation for a resource in JSON format") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully get the representation for a resource in JSON format")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully get the representation for a resource in JSON format"), + @ApiResponse(responseCode = "400", description = "Can not find the resource representation")}) ResponseEntity getResourceRepresentationInJson(@RequestParam("resourceId") URI resourceId, @RequestParam("representationId") URI representationId); @DeleteMapping(value = "/resource/representation", produces = "application/ld+json") @Operation(summary = "Deletes the representation for a resource") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully deleted the representation for a resource")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully deleted the representation for a resource"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity deleteResourceRepresentation(@RequestParam("resourceId") URI resourceId, @RequestParam("representationId") URI representationId); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/UtilApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/UtilApi.java index 7ca5519c..76308418 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/UtilApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/UtilApi.java @@ -12,11 +12,15 @@ public interface UtilApi { @GetMapping(value = "/api/ui/enum/{enumName}") @Operation(summary = "Get the specific enum") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully get the enums")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully get the enums"), + @ApiResponse(responseCode = "400", description = "Can not find the enums")}) ResponseEntity getSpecificEnum(@PathVariable String enumName); @PostMapping(value = "/policy-pattern") @Operation(summary = "Get pattern of policy") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully get the pattern of policy")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully get the pattern of policy"), + @ApiResponse(responseCode = "400", description = "Can not find the policy pattern")}) ResponseEntity getPolicyPattern(@RequestBody String policy); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppController.java index 6f8834d9..b7988b7c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppController.java @@ -47,11 +47,10 @@ public ResponseEntity getApps() { response = ResponseEntity.ok(objectMapper.writeValueAsString(customAppList)); } catch (JsonProcessingException e) { log.error(e.getMessage(), e); - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body("Problems while parsing to json"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } else { - response = ResponseEntity.badRequest().body("Could not find any app"); + response = ResponseEntity.badRequest().body("Could not find custom apps"); } return response; @@ -75,11 +74,10 @@ public ResponseEntity getApp(final String id) { response = ResponseEntity.ok(objectMapper.writeValueAsString(customApp)); } catch (JsonProcessingException e) { log.error(e.getMessage(), e); - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body("Problems while parsing to json"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } else { - response = ResponseEntity.badRequest().body("Could not get app with id: " + id); + response = ResponseEntity.badRequest().body("Can not find the custom app"); } return response; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java index e21fad25..c3a24164 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java @@ -84,7 +84,7 @@ public ResponseEntity createAppRoute(final String description) { response = ResponseEntity.ok(jsonObject.toJSONString()); } else { log.info("---- [AppRouteController createAppRoute] Could not create app route"); - response = ResponseEntity.badRequest().body("Could not create an app route"); + response = ResponseEntity.badRequest().body("Can not create an app route"); } return response; @@ -193,7 +193,7 @@ public ResponseEntity getAppRoutes() { } catch (IOException e) { log.error("---- [AppRouteController getAppRoutes] Problem while serializing app routes list!"); log.error(e.getMessage(), e); - response = ResponseEntity.badRequest().body("Problems while serializing"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } return response; @@ -352,7 +352,7 @@ public ResponseEntity getAllEndpointInfo() { } catch (JsonProcessingException e) { log.error("---- [AppRouteController getAllEndpointInfo] Could not parse endpoint informations to JSON!"); log.error(e.getMessage(), e); - response = ResponseEntity.badRequest().body("Could not parse endpoint information to JSON"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } else { log.info("---- [AppRouteController getAllEndpointInfo] Endpoint information list is null"); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java index 1a0b0525..a24eb73b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java @@ -130,8 +130,8 @@ public ResponseEntity getBroker(final URI brokerId) { try { response = ResponseEntity.ok(objectMapper.writeValueAsString(broker)); } catch (IOException e) { - response = ResponseEntity.badRequest().body("Could not get the specific broker"); log.error(e.getMessage(), e); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } else { response = ResponseEntity.badRequest().body("Could not get the specific broker"); @@ -281,7 +281,7 @@ public ResponseEntity updateConnector(final URI brokerUri) { response = ResponseEntity.ok(jsonObject.toJSONString()); } catch (IOException e) { log.error(e.getMessage(), e); - response = ResponseEntity.badRequest().body("Could not connect to the Connector!"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } else { response = ResponseEntity.badRequest().body("Could not find the broker with URI: " + brokerUri); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java index 1cbd9c2c..bdf1f459 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java @@ -103,8 +103,7 @@ public ResponseEntity updateConfigModel(final String loglevel, } } catch (IOException e) { log.error(e.getMessage(), e); - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body("Problems while sending configuration to the connector!"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } else { response = ResponseEntity.status(HttpStatus.BAD_REQUEST).body("Failed to update the configuration model"); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java index 50af5463..aac41844 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java @@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j; import net.minidev.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -54,7 +55,7 @@ public ResponseEntity requestMetadata(final URI recipientId, final URI r response = ResponseEntity.ok(serializer.serialize(resource)); } catch (IOException e) { log.error(e.getMessage()); - response = ResponseEntity.badRequest().body("Problems while serializing the resource"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } else { response = ResponseEntity.badRequest().body("Could not get resource from the requested connector"); @@ -67,7 +68,7 @@ public ResponseEntity requestMetadata(final URI recipientId, final URI r response = ResponseEntity.ok(serializer.serialize(resources)); } catch (IOException e) { log.error(e.getMessage(), e); - response = ResponseEntity.badRequest().body("Problems while serializing the list of resources"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } else { response = ResponseEntity.badRequest().body("Could not get resources from the requested connector"); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java index 70833616..96f0222e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java @@ -102,7 +102,7 @@ public ResponseEntity getGenericEndpoints() { response = ResponseEntity.ok(serializer.serialize(endpoints)); } catch (IOException e) { log.error(e.getMessage(), e); - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Problems while serializing"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } return response; @@ -126,7 +126,7 @@ public ResponseEntity getGenericEndpoint(final URI endpointId) { response = ResponseEntity.ok(serializer.serialize(genericEndpoint)); } catch (IOException e) { log.error(e.getMessage(), e); - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Problems while serializing"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } else { response = ResponseEntity.badRequest().body("Could not get the generic endpoint"); @@ -207,7 +207,7 @@ public ResponseEntity getConnectorEndpoints() { response = ResponseEntity.ok(serializer.serialize(connector.getHasEndpoint())); } catch (IOException e) { log.error(e.getMessage(), e); - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Problems while serializing"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } } @@ -245,7 +245,7 @@ public ResponseEntity getConnectorEndpoint(final URI connectorEndpointId response = ResponseEntity.ok(serializer.serialize(connectorEndpoint)); } catch (IOException e) { log.error(e.getMessage(), e); - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Problems while serializing"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } else { response = ResponseEntity.badRequest().body("Could not find any connector endpoint with id: " + connectorEndpointId); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java index 2cce556b..d9b33bac 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java @@ -63,7 +63,7 @@ public ResponseEntity getResourceContract(final URI resourceId) { response = ResponseEntity.ok(serializer.serialize(contractOffer)); } catch (IOException e) { log.error(e.getMessage(), e); - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Problems while parsing serializing the contract offer"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } else { response = ResponseEntity.badRequest().body("Could not get the resource contract"); @@ -110,11 +110,11 @@ public ResponseEntity updateResourceContract(final URI resourceId, final response = ResponseEntity.badRequest().body(jsonObject.toJSONString()); } } else { - response = ResponseEntity.badRequest().body("Could not update the resource representation"); + response = ResponseEntity.badRequest().body("Could not update the resource contract"); } } catch (IOException e) { log.error(e.getMessage(), e); - response = ResponseEntity.badRequest().body("Problems while deserializing the contract"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } @@ -132,36 +132,38 @@ public ResponseEntity updateContractForResource(URI resourceId, Pattern log.info(">> PUT /resource/contract/update resourceId: " + resourceId + "pattern" + pattern.toString() + " contractJson: " + contractJson); - if (ValidateApiInput.notValid(resourceId.toString())) { - return ResponseEntity.badRequest().body("All validated parameter have undefined as " + - "value!"); - } - - ContractOffer contractOffer = null; - try { - contractOffer = resourceService.getContractOffer(pattern, contractJson); - } catch (JsonProcessingException e) { - log.error(e.getMessage()); - } + ResponseEntity response; - // Update the resource contract - if (contractOffer != null) { - final var jsonObject = new JSONObject(); + if (ValidateApiInput.notValid(resourceId.toString())) { + response = ResponseEntity.badRequest().body("All validated parameter have undefined as value!"); + } else { + ContractOffer contractOffer = null; try { - String contract = serializer.serialize(contractOffer); - jsonObject.put("resourceID", resourceId.toString()); - jsonObject.put("contractID", contractOffer.getId().toString()); - final var response = client.updateResourceContract(resourceId.toString(), contract); - resourceService.updateResourceContractInAppRoute(resourceId, contractOffer); - jsonObject.put("connectorResponse", response); - return ResponseEntity.ok(jsonObject.toJSONString()); - } catch (IOException e) { - log.error(e.getMessage(), e); - jsonObject.put("message", "Problems while updating the contract at the connector"); - return ResponseEntity.badRequest().body(jsonObject.toJSONString()); + contractOffer = resourceService.getContractOffer(pattern, contractJson); + } catch (JsonProcessingException e) { + log.error(e.getMessage()); + } + + // Update the resource contract + if (contractOffer != null) { + final var jsonObject = new JSONObject(); + try { + String contract = serializer.serialize(contractOffer); + jsonObject.put("resourceID", resourceId.toString()); + jsonObject.put("contractID", contractOffer.getId().toString()); + final var connectorResponse = client.updateResourceContract(resourceId.toString(), contract); + resourceService.updateResourceContractInAppRoute(resourceId, contractOffer); + jsonObject.put("connectorResponse", connectorResponse); + response = ResponseEntity.ok(jsonObject.toJSONString()); + } catch (IOException e) { + log.error(e.getMessage(), e); + jsonObject.put("message", "Problems while updating the contract at the connector"); + response = ResponseEntity.badRequest().body(jsonObject.toJSONString()); + } + } else { + response = ResponseEntity.badRequest().body("Could not update the resource representation"); } - } else { - return ResponseEntity.badRequest().body("Could not update the resource representation"); } + return response; } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java index adffa02e..592bb905 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java @@ -64,7 +64,7 @@ public ResponseEntity getResource(final URI resourceId) { response = ResponseEntity.ok(serializer.serialize(resource)); } catch (IOException e) { log.error(e.getMessage(), e); - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Could not serialize resource!"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } else { response = ResponseEntity.badRequest().body("Could not determine the resource"); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java index d9919d35..aa215ebb 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java @@ -232,8 +232,7 @@ public ResponseEntity getResourceRepresentation(final URI representation response = ResponseEntity.ok(serializer.serialize(representation)); } catch (IOException e) { log.error(e.getMessage(), e); - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) - .body("Problems while serializing the representation"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } else { response = ResponseEntity.badRequest().body("Could not get resource representation"); @@ -295,21 +294,16 @@ public ResponseEntity deleteResourceRepresentation(final URI resourceId, try { final var clientResponse = client.deleteResourceRepresentation(resourceId.toString(), representationId.toString()); - resourceService.deleteResourceRepresentationFromAppRoute(resourceId, representationId); - final var jsonObject = new JSONObject(); jsonObject.put("connectorResponse", clientResponse); jsonObject.put("resourceID", resourceId.toString()); jsonObject.put("representationID", representationId.toString()); - response = ResponseEntity.ok(jsonObject.toJSONString()); } catch (IOException e) { log.error(e.getMessage(), e); - - response = ResponseEntity.badRequest().body("Problems while deleting the representation at the connector"); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } - return response; } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java index 27be68ea..142ecc22 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java @@ -5,10 +5,10 @@ import de.fraunhofer.iais.eis.Representation; import de.fraunhofer.iais.eis.Resource; import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; -import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util.DispatchRequest; -import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util.ResourceMapper; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.BackendSource; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.ResourceRepresentation; +import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util.DispatchRequest; +import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util.ResourceMapper; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java index b28bad46..d12e2047 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java @@ -1,10 +1,6 @@ package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util; -import de.fraunhofer.iais.eis.Artifact; -import de.fraunhofer.iais.eis.BasicAuthenticationImpl; -import de.fraunhofer.iais.eis.GenericEndpoint; -import de.fraunhofer.iais.eis.Representation; -import de.fraunhofer.iais.eis.Resource; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.iais.eis.util.RdfResource; import de.fraunhofer.iais.eis.util.TypedLiteral; From 2f8955b67528a9f0a6c9877bfdf5b56bced6f0f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Tue, 6 Apr 2021 15:56:50 +0200 Subject: [PATCH 024/157] fix: spelling in api documentation --- .../fraunhofer/isst/configmanager/api/ResourceContractApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java index 19af6e48..2d502982 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java @@ -34,7 +34,7 @@ ResponseEntity updateResourceContract(@RequestParam("resourceId") URI re @Operation(summary = "Updates the contract in a resource") @ApiResponses({ @ApiResponse(responseCode = "200", description = "Successfully updated the contract in the resource"), - @ApiResponse(responseCode = "400", description = "Can not upda the resource contract")}) + @ApiResponse(responseCode = "400", description = "Can not update the resource contract")}) ResponseEntity updateContractForResource(@RequestParam("resourceId") URI resourceId, @RequestParam("pattern") Pattern pattern, @RequestBody(required = false) String contractJson); From 2988b213837f384c25b643b8490eb92d4855170f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Tue, 6 Apr 2021 16:42:01 +0200 Subject: [PATCH 025/157] refactor: readme (in progress) --- README.md | 79 +++++++++++++------ .../api/controller/ConfigModelController.java | 2 +- .../api/controller/UtilController.java | 2 + 3 files changed, 56 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 116138ac..ae305ca9 100644 --- a/README.md +++ b/README.md @@ -73,15 +73,17 @@ To get more information about the Dataspace Connector or the UI for the Configur This is a list of currently implemented features, which is continuously updated. -* The configuration model can be managed and is stored in an internal H2 database -* Proxy settings for the ConfigModel can be made -* Endpoints can be created and edited for the configuration model -* The configuration model can be provided with a connector description +* The configuration can be fetched and updated from a connector +* Proxy settings for the configuration can be made +* Generic endpoints and connector endpoints can be created and edited for creating app routes * The available brokers can be retrieved, which are located in an internal H2 database * Connectors can be registered with a broker, removed or updated -* Resources can be stored in the connector and in the app route of the configuration model - * A representation can be created and managed for each resource - * Contracts can be retrieved and updated for each resource +* An external connector can be accessed to fetch their offered resources +* The configuration of the resources can be done in the configuration manager and is transferred to the Dataspace Connector + * The configuration of resources also includes the management of their representations, + which are transferred to the Dataspace connector. + * The configuration of resources also includes the management of their contracts, + which are transferred to the Dataspace connector * The Dataspace Connector is notified about every change in the configuration model, e.g. when changes are made to resources, the connector or the configuration model itself * App routes can be defined for offering data or resources (under construction) @@ -122,7 +124,7 @@ You need: Clone the project from ``` -https://github.com/FraunhoferISST/IDS-ConfigurationManager +https://github.com/International-Data-Spaces-Association/IDS-ConfigurationManager ``` open the directory and run @@ -144,26 +146,51 @@ in terminal to start the configuration manager. ## Backend API -In the following, the different APIs are described and explained. Most of the interfaces are used to set the -configuration of configuration model, connector, brokers etc. via the user interface. - -* `Configuration model API: ` The API provides CRUD operations to manage the Configuration Model. -* `Configuration model Proxy API: ` The API helps to make proxy settings for the configuration model. -* `Endpoint API: ` With the API app routes can be configured. The CRUD operations are also available here. -* `Connector API: ` The Connector API helps to manage the connector description in the configuration model. -* `Broker API: ` The Broker API helps to manage individual brokers. It offers several endpoints to manage the brokers. - Beside the CRUD operations there are also endpoints which help to update, register or unregister a connector with the - broker. -* `Resource API: `Connectors and app routes include resources provided by data providers. The Resource API helps to - manage the resources in the connector and in the app routes. -* `Resource contract API: ` The API helps to retrieve or update the contracts of a resource. -* `Resource representation API: ` A resource can have different representations. With the API the representations can be - managed. -* `App route API: ` The app route API helps to define app routes and subroutes. When creating subroutes, resources can - also be published. Furthermore, the app route deploy method can be customized, which are then valid for all routes in - the configuration model. +In the following, the different APIs are described and explained. Most apis are mainly +used by the user interface to simplify configuration of a connector. + +* `App Route Management: ` +* `Connector Request Management: ` +* `Connector Management: ` +* `Resource Management: ` +* `Resource representation Management: ` +* `Configmodel Management: ` +* `Broker Management: ` +* `Resource contracts Management: ` +* `Endpoints Management: ` +* `Util Management: ` * `Database: `The data resources are persist in an H2 database. Console path: `http://localhost:8081/console` + +[comment]: <> (* `Configuration model API: ` The API provides CRUD operations to manage the Configuration Model.) + +[comment]: <> (* `Configuration model Proxy API: ` The API helps to make proxy settings for the configuration model.) + +[comment]: <> (* `Endpoint API: ` With the API app routes can be configured. The CRUD operations are also available here.) + +[comment]: <> (* `Connector API: ` The Connector API helps to manage the connector description in the configuration model.) + +[comment]: <> (* `Broker API: ` The Broker API helps to manage individual brokers. It offers several endpoints to manage the brokers.) + +[comment]: <> ( Beside the CRUD operations there are also endpoints which help to update, register or unregister a connector with the) + +[comment]: <> ( broker.) + +[comment]: <> (* `Resource API: `Connectors and app routes include resources provided by data providers. The Resource API helps to) + +[comment]: <> ( manage the resources in the connector and in the app routes.) + +[comment]: <> (* `Resource contract API: ` The API helps to retrieve or update the contracts of a resource.) + +[comment]: <> (* `Resource representation API: ` A resource can have different representations. With the API the representations can be) + +[comment]: <> ( managed.) + +[comment]: <> (* `App route API: ` The app route API helps to define app routes and subroutes. When creating subroutes, resources can) + +[comment]: <> ( also be published. Furthermore, the app route deploy method can be customized, which are then valid for all routes in) + +[comment]: <> ( the configuration model.) --- diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java index bdf1f459..301f23f2 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java @@ -28,7 +28,7 @@ @Slf4j @RestController @RequestMapping("/api/ui") -@Tag(name = "ConfigModel Management", description = "Endpoints for managing the configuration model") +@Tag(name = "Configmodel Management", description = "Endpoints for managing the configuration model") @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) public class ConfigModelController implements ConfigModelApi { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/UtilController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/UtilController.java index 05c6b6e0..2ac2e6c0 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/UtilController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/UtilController.java @@ -3,6 +3,7 @@ import de.fraunhofer.isst.configmanager.api.UtilApi; import de.fraunhofer.isst.configmanager.api.service.UtilService; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -16,6 +17,7 @@ */ @Slf4j @RestController +@Tag(name = "Util Management", description = "Endpoints for managing utility") public class UtilController implements UtilApi { private final transient UtilService utilService; From 858865bb799ed86506995d3696a9d2feb8659c35 Mon Sep 17 00:00:00 2001 From: omar Date: Tue, 6 Apr 2021 17:16:10 +0200 Subject: [PATCH 026/157] chore: add logger for not encoded accessURL string --- .../api/service/EndpointService.java | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java index 747c6f16..afff8f1d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java @@ -12,6 +12,7 @@ import org.springframework.transaction.annotation.Transactional; import java.net.URI; +import java.sql.SQLOutput; import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; @@ -43,29 +44,34 @@ public EndpointService(final CustomGenericEndpointRepository customGenericEndpoi public GenericEndpoint createGenericEndpoint(final String accessURL, final String username, final String password) { - final var endpoint = new GenericEndpointBuilder()._accessURL_(URI.create(accessURL)).build(); - final var endpointImpl = (GenericEndpointImpl) endpoint; - - if (username != null && password != null) { - endpointImpl - .setGenericEndpointAuthentication( - new BasicAuthenticationBuilder()._authUsername_(username)._authPassword_(password).build() - ); - } else { - log.info("---- [EndpointService createGenericEndpoint] No authentication was created because username and password were not entered."); - } + GenericEndpoint endpoint = null; + try { + URI access = URI.create(accessURL); + endpoint = new GenericEndpointBuilder()._accessURL_(access).build(); + final var endpointImpl = (GenericEndpointImpl) endpoint; - final var customGenericEndpointObject = new CustomGenericEndpointObject(endpoint); + if (username != null && password != null) { + endpointImpl + .setGenericEndpointAuthentication( + new BasicAuthenticationBuilder()._authUsername_(username)._authPassword_(password).build() + ); + } else { + log.info("---- [EndpointService createGenericEndpoint] No authentication was created because username and password were not entered."); + } - if (customGenericEndpointRepository.count() == 0) { - customGenericEndpointList = new CustomGenericEndpointList(); - } else { - customGenericEndpointList = customGenericEndpointRepository.findAll().stream().findAny().get(); - } + final var customGenericEndpointObject = new CustomGenericEndpointObject(endpoint); - customGenericEndpointList.getCustomGenericEndpointObjects().add(customGenericEndpointObject); - customGenericEndpointList = customGenericEndpointRepository.saveAndFlush(customGenericEndpointList); + if (customGenericEndpointRepository.count() == 0) { + customGenericEndpointList = new CustomGenericEndpointList(); + } else { + customGenericEndpointList = customGenericEndpointRepository.findAll().stream().findAny().get(); + } + customGenericEndpointList.getCustomGenericEndpointObjects().add(customGenericEndpointObject); + customGenericEndpointList = customGenericEndpointRepository.saveAndFlush(customGenericEndpointList); + } catch (IllegalArgumentException e) { + log.warn("Given accessURL: " + accessURL + " is not properly encoded."); + } return endpoint; } From 71aff5ce497d6eef097477b9eea07cc30b353b54 Mon Sep 17 00:00:00 2001 From: eakker Date: Wed, 7 Apr 2021 08:25:12 +0200 Subject: [PATCH 027/157] chore: update Resource at broker, when it gets updated at DSC --- .../api/controller/BrokerController.java | 9 +++--- .../api/controller/ResourceController.java | 30 ++++++++++++++++--- .../clients/DefaultBrokerClient.java | 6 ++-- .../clients/DefaultResourceClient.java | 3 +- .../clients/DataspaceBrokerClient.java | 12 ++++---- .../clients/DataspaceResourceClient.java | 5 ++-- 6 files changed, 45 insertions(+), 20 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java index a24eb73b..a8f71ed8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java @@ -237,7 +237,8 @@ public ResponseEntity unregisterConnector(final URI brokerUri) { if (broker != null) { try { final var clientResponse = client.unregisterAtBroker(brokerUri.toString()); - if (!clientResponse.contains("RejectionMessage")) { + var clientResponseString = clientResponse.body().string(); + if (clientResponse.isSuccessful() && !clientResponseString.contains("RejectionMessage")) { brokerService.unregisteredAtBroker(brokerUri); brokerService.setBrokerStatus(brokerUri, BrokerStatus.UNREGISTERED); jsonObject.put("success", true); @@ -384,12 +385,12 @@ public ResponseEntity getRegisterStatusForResource(final URI resourceId) log.info(">> GET /broker/resource/information resourceId: " + resourceId); ResponseEntity response; - final var jsonObjet = brokerService.getRegisStatusForResource(resourceId); + final var jsonObject = brokerService.getRegisStatusForResource(resourceId); - if (jsonObjet == null) { + if (jsonObject == null) { response = ResponseEntity.ok(new JSONArray().toJSONString()); } else { - response = ResponseEntity.ok(jsonObjet.toJSONString()); + response = ResponseEntity.ok(jsonObject.toJSONString()); } return response; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java index 592bb905..cc97b3aa 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java @@ -2,7 +2,9 @@ import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.isst.configmanager.api.ResourceApi; +import de.fraunhofer.isst.configmanager.api.service.BrokerService; import de.fraunhofer.isst.configmanager.api.service.ResourceService; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultBrokerClient; import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; import de.fraunhofer.isst.configmanager.util.ValidateApiInput; import io.swagger.v3.oas.annotations.tags.Tag; @@ -33,14 +35,21 @@ public class ResourceController implements ResourceApi { transient ResourceService resourceService; transient DefaultResourceClient client; + transient DefaultBrokerClient brokerClient; + transient BrokerService brokerService; transient Serializer serializer; @Autowired public ResourceController(final ResourceService resourceService, - final DefaultResourceClient client, final Serializer serializer) { + final DefaultResourceClient client, + final DefaultBrokerClient brokerClient, + final BrokerService brokerService, + final Serializer serializer) { this.resourceService = resourceService; + this.brokerClient = brokerClient; this.client = client; this.serializer = serializer; + this.brokerService = brokerService; } /** @@ -239,10 +248,23 @@ public ResponseEntity updateResource(final URI resourceId, final String if (updatedResource != null) { final var clientResponse = client.updateResource(resourceId, updatedResource); - resourceService.updateResourceInAppRoute(updatedResource); - + if(clientResponse.isSuccessful()) { + //TODO move broker registrations to a parallel thread so it won't slow down response times + var registered = brokerService.getRegisStatusForResource(resourceId); + registered.iterator().forEachRemaining(elem -> { + var asJsonObject = (JSONObject) elem; + var brokerId = asJsonObject.getAsString("brokerId"); + try { + brokerClient.updateAtBroker(brokerId); + } catch (IOException e) { + log.warn(String.format("Error while updating at broker: %s", e.getMessage()), e); + } + }); + resourceService.updateResourceInAppRoute(updatedResource); + } final var jsonObject = new JSONObject(); - jsonObject.put("connectorResponse", clientResponse); + var responseBody = clientResponse.body(); + jsonObject.put("connectorResponse", responseBody != null ? responseBody.string() : ""); jsonObject.put("resourceID", resourceId.toString()); response = ResponseEntity.ok(jsonObject.toJSONString()); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultBrokerClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultBrokerClient.java index 0c4d1f11..6fcebf63 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultBrokerClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultBrokerClient.java @@ -25,7 +25,7 @@ public interface DefaultBrokerClient { * @return Response of the unregister request of the connector * @throws IOException when sending the request fails */ - String unregisterAtBroker(String brokerURI) throws IOException; + Response unregisterAtBroker(String brokerURI) throws IOException; /** * Send a Resource update request to a target broker. @@ -35,7 +35,7 @@ public interface DefaultBrokerClient { * @return Response of the target Connector * @throws IOException when serializing of the Resource, or sending of the request fails */ - String updateResourceAtBroker(String brokerUri, URI resourceID) throws IOException; + Response updateResourceAtBroker(String brokerUri, URI resourceID) throws IOException; /** * Send a resource deletion request to a target broker. @@ -45,5 +45,5 @@ public interface DefaultBrokerClient { * @return Response of the target Connector * @throws IOException when an error occurs while sending the request */ - String deleteResourceAtBroker(String brokerUri, URI resourceID) throws IOException; + Response deleteResourceAtBroker(String brokerUri, URI resourceID) throws IOException; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java index 6637ca65..83e47cb6 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java @@ -3,6 +3,7 @@ import de.fraunhofer.iais.eis.Representation; import de.fraunhofer.iais.eis.Resource; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.ResourceRepresentation; +import okhttp3.Response; import java.io.IOException; import java.net.URI; @@ -27,7 +28,7 @@ public interface DefaultResourceClient { * @return Response of the target Connector * @throws IOException when serializing of the Resource, or sending of the request fails */ - String updateResource(URI resourceID, Resource resource) throws IOException; + Response updateResource(URI resourceID, Resource resource) throws IOException; /** * Send a resource creation request to a target connector. diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceBrokerClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceBrokerClient.java index c3318e77..89908046 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceBrokerClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceBrokerClient.java @@ -53,7 +53,7 @@ public Response updateAtBroker(final String brokerURI) throws IOException { } @Override - public String unregisterAtBroker(final String brokerURI) throws IOException { + public Response unregisterAtBroker(final String brokerURI) throws IOException { log.info(String.format( "---- [DataspaceBrokerClient unregisterAtBroker] unregistering connector %s at broker %s", dataSpaceConnectorHost, @@ -73,11 +73,11 @@ public String unregisterAtBroker(final String brokerURI) throws IOException { final var request = builder.build(); - return Objects.requireNonNull(DispatchRequest.sendToDataspaceConnector(request).body()).string(); + return DispatchRequest.sendToDataspaceConnector(request); } @Override - public String updateResourceAtBroker(final String brokerUri, final URI resourceID) throws IOException { + public Response updateResourceAtBroker(final String brokerUri, final URI resourceID) throws IOException { log.info(String.format("---- [DataspaceBrokerClient updateResourceAtBroker] updating resource at Broker %s", brokerUri)); final var path = resourceID.getPath(); @@ -102,11 +102,11 @@ public String updateResourceAtBroker(final String brokerUri, final URI resourceI log.warn("---- [DataspaceBrokerClient updateResourceAtBroker] Updating Resource at Broker failed!"); } - return Objects.requireNonNull(response.body()).string(); + return response; } @Override - public String deleteResourceAtBroker(final String brokerUri, final URI resourceID) throws IOException { + public Response deleteResourceAtBroker(final String brokerUri, final URI resourceID) throws IOException { log.info(String.format("---- [DataspaceBrokerClient deleteResourceAtBroker] Deleting resource %s at Broker %s", resourceID, brokerUri)); final var path = resourceID.getPath(); @@ -130,7 +130,7 @@ public String deleteResourceAtBroker(final String brokerUri, final URI resourceI log.warn("---- [DataspaceBrokerClient deleteResourceAtBroker] Deleting Resource at Broker failed!"); } - return Objects.requireNonNull(response.body()).string(); + return response; } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java index 142ecc22..10d8442d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java @@ -15,6 +15,7 @@ import okhttp3.Credentials; import okhttp3.HttpUrl; import okhttp3.RequestBody; +import okhttp3.Response; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.stereotype.Service; @@ -340,7 +341,7 @@ public String updateResourceContract(final String resourceID, final String contr } @Override - public String updateResource(final URI resourceID, final Resource resource) throws IOException { + public Response updateResource(final URI resourceID, final Resource resource) throws IOException { log.info(String.format("---- [DataspaceResourceClient updateResource] updating resource at %s", dataSpaceConnectorHost)); final var mappedResource = dataSpaceConnectorResourceMapper.getMetadata(resource); @@ -385,6 +386,6 @@ public String updateResource(final URI resourceID, final Resource resource) thro log.warn("---- [DataspaceResourceClient updateResource] Updating Resource failed!"); } - return Objects.requireNonNull(response.body()).string(); + return response; } } From beac111e7ca700dc55c824aef76207410f9ecf25 Mon Sep 17 00:00:00 2001 From: eakker Date: Wed, 7 Apr 2021 08:33:20 +0200 Subject: [PATCH 028/157] chore: update at Broker asynchronously using CompletableFuture.runAsync() --- .../api/controller/ResourceController.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java index cc97b3aa..ed318a25 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.net.URI; import java.util.ArrayList; +import java.util.concurrent.CompletableFuture; /** * The api class implements the ResourceApi and offers the possibilities to manage @@ -254,11 +255,13 @@ public ResponseEntity updateResource(final URI resourceId, final String registered.iterator().forEachRemaining(elem -> { var asJsonObject = (JSONObject) elem; var brokerId = asJsonObject.getAsString("brokerId"); - try { - brokerClient.updateAtBroker(brokerId); - } catch (IOException e) { - log.warn(String.format("Error while updating at broker: %s", e.getMessage()), e); - } + CompletableFuture.runAsync(() -> { + try { + brokerClient.updateAtBroker(brokerId); + } catch (IOException e) { + log.warn(String.format("Error while updating at broker: %s", e.getMessage()), e); + } + }); }); resourceService.updateResourceInAppRoute(updatedResource); } From 97f3f6124f64357640566e9e5a96cf4b83206f5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Wed, 7 Apr 2021 12:07:12 +0200 Subject: [PATCH 029/157] refactor: updated Readme.md (completed) --- README.md | 164 +++++++++++++++++-------------- images/approute-endpoint-api.PNG | Bin 41161 -> 0 bytes images/connector-api.PNG | Bin 44745 -> 0 bytes images/generic-endpoint.PNG | Bin 0 -> 10133 bytes images/resource-api.PNG | Bin 40239 -> 19812 bytes images/route-overview.PNG | Bin 0 -> 48271 bytes images/route-step.PNG | Bin 0 -> 24461 bytes 7 files changed, 88 insertions(+), 76 deletions(-) delete mode 100644 images/approute-endpoint-api.PNG delete mode 100644 images/connector-api.PNG create mode 100644 images/generic-endpoint.PNG create mode 100644 images/route-overview.PNG create mode 100644 images/route-step.PNG diff --git a/README.md b/README.md index ae305ca9..530a48d7 100644 --- a/README.md +++ b/README.md @@ -79,11 +79,12 @@ This is a list of currently implemented features, which is continuously updated. * The available brokers can be retrieved, which are located in an internal H2 database * Connectors can be registered with a broker, removed or updated * An external connector can be accessed to fetch their offered resources -* The configuration of the resources can be done in the configuration manager and is transferred to the Dataspace Connector - * The configuration of resources also includes the management of their representations, - which are transferred to the Dataspace connector. - * The configuration of resources also includes the management of their contracts, - which are transferred to the Dataspace connector +* The configuration of the resources can be done in the configuration manager and is transferred to the Dataspace + Connector + * The configuration of resources also includes the management of their representations, which are transferred to the + Dataspace connector. + * The configuration of resources also includes the management of their contracts, which are transferred to the + Dataspace connector * The Dataspace Connector is notified about every change in the configuration model, e.g. when changes are made to resources, the connector or the configuration model itself * App routes can be defined for offering data or resources (under construction) @@ -146,114 +147,125 @@ in terminal to start the configuration manager. ## Backend API -In the following, the different APIs are described and explained. Most apis are mainly -used by the user interface to simplify configuration of a connector. +In the following, the different APIs are described and explained. Most apis are mainly used by the user interface to +simplify configuration of a connector. + +* `App Route Management: ` The app route apis help to define app routes and subroutes. When creating subroutes, + resources can also be published. Furthermore, the app route deploy method can be customized, which are then valid for + all routes in the configuration model. +* `Connector Request Management: ` The connector request apis help to request offered resources from external + connectors. +* `Connector Management: ` The connector apis help to manage the connector description in the configuration model. It is + also possible to check if a connector is reachable. +* `Resource Management: ` The resource apis help to manage the resources. All configurations on the resources are + transferred to the Dataspace connector and persisted there. +* `Resource representation Management: ` A resource can have different representations. The representations apis helps + to manage the different representations of a resource. +* `Resource contracts Management: ` The resource contracts apis help to retrieve or update the contracts of a resource. +* `Configmodel Management: ` The configuration model apis help to query or update the configuration. +* `Broker Management: ` The broker apis help to manage individual brokers. It offers several endpoints to manage the + brokers. This includes, for example, registering a connector or resource with a broker. +* `Endpoints Management: ` The endpoints apis help to manage endpoints like GenericEndpoint oder ConnectorEndpoint. +* `Util Management: ` The utility apis help to make or query other configurations. +* `Database: ` The internal database persists all the necessary data that is not transferred to the Dataspace Connector, + such as the storage of endpoint information like the coordinates. Console path of the + database: `http://localhost:8081/console` -* `App Route Management: ` -* `Connector Request Management: ` -* `Connector Management: ` -* `Resource Management: ` -* `Resource representation Management: ` -* `Configmodel Management: ` -* `Broker Management: ` -* `Resource contracts Management: ` -* `Endpoints Management: ` -* `Util Management: ` - -* `Database: `The data resources are persist in an H2 database. Console path: `http://localhost:8081/console` - -[comment]: <> (* `Configuration model API: ` The API provides CRUD operations to manage the Configuration Model.) - -[comment]: <> (* `Configuration model Proxy API: ` The API helps to make proxy settings for the configuration model.) +--- + -[comment]: <> (* `Endpoint API: ` With the API app routes can be configured. The CRUD operations are also available here.) +## Hands-on IDS Configurationmanager -[comment]: <> (* `Connector API: ` The Connector API helps to manage the connector description in the configuration model.) +To interact with the running application, the provided endpoints at the Swagger UI can be used. The Swagger UI is +available at: `http://localhost:8081/swagger-ui/index.html?url=/v3/api-docs/` . -[comment]: <> (* `Broker API: ` The Broker API helps to manage individual brokers. It offers several endpoints to manage the brokers.) +The following is an example of how an app route can be defined in configuration manager to provide resources. The +following points are discussed: -[comment]: <> ( Beside the CRUD operations there are also endpoints which help to update, register or unregister a connector with the) +* Creating a resource +* Creating a generic endpoint and a connector endpoint +* Creating a resource representation +* Creating an app route and a subroute -[comment]: <> ( broker.) +`Step 1) Creating a resource` -[comment]: <> (* `Resource API: `Connectors and app routes include resources provided by data providers. The Resource API helps to) +To create an offered resource, the API: POST - `/api/ui/resource` can be used. -[comment]: <> ( manage the resources in the connector and in the app routes.) +![Create-Resource-Endpoint](images/resource-api.PNG) -[comment]: <> (* `Resource contract API: ` The API helps to retrieve or update the contracts of a resource.) +After the necessary fields have been filled in, the request can be sent, and the following response should be provided. -[comment]: <> (* `Resource representation API: ` A resource can have different representations. With the API the representations can be) +``` +{ + "resourceID": "https://w3id.org/idsa/autogen/resource/fc1613eb-f36e-4889-bdb3-a31e66e341a3", + "connectorResponse": "fc1613eb-f36e-4889-bdb3-a31e66e341a3" +} +``` -[comment]: <> ( managed.) +It displays the id of the created resource and the response from the Dataspace Connector. -[comment]: <> (* `App route API: ` The app route API helps to define app routes and subroutes. When creating subroutes, resources can) +`Step 2) Creating a generic endpoint and a connector endpoint` -[comment]: <> ( also be published. Furthermore, the app route deploy method can be customized, which are then valid for all routes in) +Next, a generic endpoint is defined, which will be the start of the route from which the resource will be published. The +following API can be used for this purpose: POST - `/api/ui/generic/endpoint`. -[comment]: <> ( the configuration model.) +![Create-Generic-Endpoint](images/generic-endpoint.PNG) ---- - +Here the access url of the endpoint can be defined and optionally an authentication can be added. After successfully +creating an endpoint, the following response should be delivered: -## Hands-on IDS Configurationmanager - -To interact with the running application, the provided endpoints at the Swagger UI can be used. The Swagger UI is -available at: `http://localhost:8081/swagger-ui/index.html?url=/v3/api-docs/` . - -The following is an example of how the configuration model can be extended step by step in the Configuration Manager. -The following points are discussed: - -* Creating an endpoint -* Create connector description -* Create resource and view the result +``` +{ + "id": "https://w3id.org/idsa/autogen/genericEndpoint/c01d4e34-2517-458b-bdef-61a5ba5b94b7", + "message": "Created a new generic endpoint" +} +``` -`Step 1) Creating an endpoint` +In the same way, create a Connector Endpoint through which the resource will be published. The following API can be used +for this purpose: POST - `/api/ui/connector/endpoint`. -To create an endpoint for the configuration model, the API POST `/api/ui/approute/endpoint` can be used. +`Step 3) Creating a resource reprsentation` -![AppRoute-Endpoint](images/approute-endpoint-api.PNG) +Like the other steps you can use the API POST `/api/ui/resource/representation` to create a resource representation. +Here you can use the id of the resource and the created endpoint. -Here information like the accessURL, username and password must be given. After an endpoint has been successfully -created, a similar respsonse should be displayed: +If no errors occurred while creating a representation, the following response should be returned: ``` { - "msg": "Successfully created endpoint!", - "routeID": "https://w3id.org/idsa/autogen/appRoute/08e324a5-9045-4678-8995-5444a4899363", - "endpointId": "de.fraunhofer.iais.eis.GenericEndpointImpl@66a37ac0" + "resourceID": "https://w3id.org/idsa/autogen/resource/fc1613eb-f36e-4889-bdb3-a31e66e341a3", + "connectorResponse": "946529d8-7109-4a04-b57b-32f28b68b871", + "representationID": "https://w3id.org/idsa/autogen/representation/946529d8-7109-4a04-b57b-32f28b68b871" } ``` -`Step 2) Create connector description` - -Next, you can add a connector description to the configuration model. You can use the API POST `/api/ui/connector` for -this. +Here you can see the id of the resource and the representation. Also, the response of the Dataspace Connector. -![Connector-Create](images/connector-api.PNG) +`Step 4) Creating an app route and a subroute` -Here the individual fields such as title, description, access url etc. must be filled out to create a connector. After -successful completion of the process the response message `Successfully created a new connector` should appear. +Now an app route can be defined via the API: POST `/api/ui/approute`. To complete the route definition, the subroute +must be defined at the end. This is done via the API: POST `/api/ui/approute/step`. -`Step 3) Create resource and view the result` +![Create-Routestep](images/route-step.PNG) -Like the other steps you can use the API POST `/api/ui/resource` to create a resource. +All necessary fields must be filled in here. That means, the id of the created app route must be set, the generic +endpoint id is necessary as startId, the x and y coordinates of the first endpoint must be specified, the id of the +connector endpoint must be set as well as the corresponding x and y coordinates. In addition, to publish the resource, +the id of the resource can be passed here. -![Resource API](images/resource-api.PNG) - -All required fields must also be filled out here. A special field in this context is "brokerList", where you can specify -under which broker the resource is available. - -After a successful creation of a resource a similar response message should appear: +When successful, the following response should be provided: ``` { - "connectorResponse": "Resource registered with uuid: 61360ba4-b50d-4259-8bd5-a054c731b004", - "resourceID": "https://w3id.org/idsa/autogen/resource/61360ba4-b50d-4259-8bd5-a054c731b004" + "routeStepId": "https://w3id.org/idsa/autogen/routeStep/34870533-acc5-4fbf-8c29-136ea275bd2e", + "message": "Successfully created the route step" } ``` -The special feature of this response message is that besides the resource id the connector response is also displayed. -This means that the creation of the resource was successful and the dataspace connector was notified about the change. +The result of the work can be optionally viewed in the configuration manager user interface. There, the created route is +visualized under the Data Offering tab under Routes. + +![Route-Overview](images/route-overview.PNG) --- diff --git a/images/approute-endpoint-api.PNG b/images/approute-endpoint-api.PNG deleted file mode 100644 index e67bc014c6c40cec29a4efc54030e63d78a01c82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41161 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�pAwvVf#4 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 diff --git a/images/generic-endpoint.PNG b/images/generic-endpoint.PNG new file mode 100644 index 0000000000000000000000000000000000000000..0279ed146135789fe4804300eb29cfa623f1e38e GIT binary patch literal 10133 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 BzLx+1 literal 0 HcmV?d00001 diff --git a/images/resource-api.PNG b/images/resource-api.PNG index 1e5dbbb8083f3644c7891aa06d0b0609aeb3a5a0..bd912fc2ed80a4dc84bf47326011923498341f3a 100644 GIT binary patch literal 19812 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 literal 40239 zcmeFZd011|yEcrqbz;&|83c*eR;nV1C}B>m73zo+0y0F1f(l7MW|D zBA_xPh=ehTCPJzVQKkSPi6KIS5WG zfZ40`+ARO7L5GTtlFdcT-}WVeo(to-WYrNgle3y*8$)}W zG9Jx!CTnZv67~ITN!o00ubLKJhl8!7vr2ZGo7<`ya2e5RsFqtd+o={_�R024ujs zY}|EeyL2`ze6#K{d=tyqFbbvN?${#4pYown_G67XpStJUB;|g2F?RML2hnN|A>s%7 zFLjMw&RJ6_`I&U`?&saz3~Dk;R0d6%BZJII3{K`oXIpdBE>$6UM`N%dSbM%<=ADua zUg{!vjUjoxcVC;y!;+`)|hjQ--;>^PZUmdN%mKN zlomzU$ooUH(UBh&t4J>KwwN&_Hwq*ww{Kbq|%YmUo0UJpUf$8;o6C}2g5 ztV=I`;@c<@?gmbCC0wa%QRtEH~?=?2m?n$5QOMI8`*tL<2*rXD?=#HWmk^;T+ zLPoEvsWBm2X>k<{?e6o+zi{kRSZlI0KjxX2FMGqJ~1(Lzn&({mJ-)0?b$B8w)`?($g0`InAWS1O_mNZwW zlWWx%T;G4`3|M2QX)9I7ikoL?zE@`FHM6&AH-pv%8yoha>NV{_5%Ag!5ph1P;pp%T zoo!7D6Cs3?-x{coD}R@CbVQy7*{hB%u&&p8tKu8F%Q@PN%RxqjUgOJbJI)i$51w;# zX>Aebq!Gwb%Zr+hl^CH`3~zvdGh^y-Anjz@iqUDCQrY=d`YS)pg^g)2m8H|im<||$ z4q!O1#~FXoJeKJ}GEEJg^KO&yp}(el0!?@u(|KFS+K?u5IxmZ}3M(IOYYUS$@8Cv; zNP8jebLh>gxorPnk!qol0_P(u6u}|OuL-82&}H{?Q-#f0H+Q{o^*K$-vL-zZb4;kx z7^i<^bMCK#v}%34kB~_-^wbgSz%8ZVdbe^}qgPh3|`P#}`C5oxWfUy1J zDUTsIpoYg#^jnUjSDq3b6^r7Na@t^*+pd7J1#S{@Ok=vKJMZj^X7*f#M1WIvRp%a{ z!)HY+4Sp@h|FWtnMrT=waIO-ySyky+0D_&ojuy27)5}b1|3GUxW4{$itH8C9k@tX` z0co4kJ+d<5(?#4QA0E9hpXC!kw(%}t?ugVT!jlx*_blRO5l42qleWK2luj^iJ67z- zXyjN7p$b2&phf2O96jiXwE$Vn9KvxxP1_FVZ!HY}G49UpNlFw`SP6Tg74GMrwBC zy?#$w4`Qxt_BC#xGwO=$xaRjG+AP$Amo8z;Id3~#ffL$EdMAz0sp-j!+w6$l#-Z-E z4E#k}R6ZmAgZ2Uy3b4x!SP)gfb`X1%<7l8j6u`P0z-+j>zts;FDy|x-oQBv+FSp)^ zZZ>oIhIV;yKwXpXzv8R%DNc}R^g&VaUpXI&qs^66vjIV{Qo8)ARK31;ymw`Vz=^wGAY@6-8{ zj#(g0za5os!Pz)GI@@&`=r5j68I92P$e{|$0180MY*PiK<=fHQ+>>&iN^vJ8ZYx_B zddfl=_vc(s6G_ z<@D|i$wv-jCnl2B>fV+FmXVg_kKC!P&EG3)bpEq#8Q=v-G!!bd%puyAg12l0HF}KJ za$r^NoXbou%G#Ek$`5P2-vFhD;h2$9PO>Mq&SfRvidMd$@mJpvp3%Q=N=RIvMpoTQH) zhHwp)LAf!%u3Of`uOcG*&|g|Gk6dQ%1au2iI4h~X-r`CwvjmenwW4e!()09T?bT5D z!VSlPdO|PyS4QVbZ5#+iVnL8D>5#QywT+}GGl+A!Cv7TnOgvk@MJyPWhq|NTM9m%U z4cVtfj_R0GNBhzD7+e6T_QZ;0q#9Fpd;FkV2gbX@r^6Fa7UBXXZNntnj<@t29X;YU zGk!EN%!TpE&4eSEw=CfmGW^if4F8SsmhR^VQt#5D;ir8ixyXasyi8>Su$8JF!3ZMA znp{K_8D&kJvn8IuZi97rpzRj&SOa;lh6FRsg(BuF@J&w5edflz6O|=Bd`b*Ck_olc zEfCwj>c!^;nt_LZd@!94=5saBh6poq}FQTi*qOyIFWj)<5Jy}-%EbxF(d0gfP zeye>H%E~$2ne1$D4=?B##DT11>mkk+p0sr5_ue-VellIe%I}@kmkli)}mBw^B4O;irNgs!}a2(OKEqN0qzRk7q*MK_5NIg|j z*gep7&R)q>N(VeTW>?gQF#yU$f0~V<#dfOoh{Pwcsg`)KmQJ4b6ZxdDQI|qnV42#P zXQUoMazm}NPf%ahFz1?tzp=Gy~!_qVNvIYh2)SCAk0H#Lzo=p)pZn@-h~!00@0z(^dnI=6T-$>*%55#L-my-6O!g3 z*o-BdAxj4P<-Y&4cTZhyym6rdIY}<&1LmS!ewB&;NS9mAn)Gxqw%{7Y1u}EhOKJinZIM*jtBM*6d0kkkY zn>%k&X(8{SXpVLfY#?{?H^V>1&E8MtpQsgZUf<(|u}+iCNORWI3k&xc19<)zL#_ z7FNes=e`KSSx47{P}ih*%SH|1DX85tk-k}4lRT|Zom6fSL6beRAra)usbem};nAHQH3WL*+8+hq(tAvVBu8Bv8*gCixJh&7(Ld&NWQiK{Px2LfOd7Yhd)XE)!wV3t>iitiA3lApBd5y~091 zzGq0nX4FAW3k2YIJ88(PbAp^8b!X27@P_WB`nX_Rw?=$A=fqPG>fkW;KEZLk*~hRA z?aV@V4#>;J*W#bt6`e}0NgBD|vh}Ttk}>pp?hlnMjaSq7IjK9`nER)&nN}L#T_6wMTih?PB| z2D&aLK@gzyx*@ym^v1S*J7M@k>aU1|iA3zhc^rbGvPXxxT5+@|sy@2_So0 zzOMC+j3>Ih=C2so3;>`XqZo;lB8WYy=bt`TFRGE(^;;m<7HDKkrfBRI6L3T3RI` zacb13_;yF%LdL)>hap3FoI;7t!$jE5bBjrzGS*B#Nr1w(c|Kv|cE?=HjWdP@8QEoT z(gD(>&Yr9c=Ry?OnB=~hp_?$UVqo{L0>#VeNMM%BTpd@W8pP#jUmoP`ueZJf`!#7H z*ffD!ktfZHP67dJkcz z?N#<5K6YYadO}qDRN$2PR|)MY(8|2v(fKlu6|H`OO?So`-sM3PSuruyJn#0s1(C;( zqARGkqAympY(}d&0cx#swShtFxc~~qGQEM>eHWB8Kao#KCdr0p>(C3Y+#e#)O+3!1 znWhs9wlb!UnHH-gIPIY(LDa}5;XAsH2pO^iS&*C(Re-S7U@g%v6Wqgr%1EY}ts1Hh zK~LSk2njrs6XEnz(u9d zqQ9`(_rE0nZs6DI&;D{fL;v;Tw@WOW!PiU7oWZUCmN)z#U3w>+dkRcmq93Q7AVKFM zBlX&Ri~PMdvWH9aDarg-H}!@q z!^2e+s>~+7xYTv<2mQtP2N4q%_2i;u4&Rt}fPc9GPXEkq{!08_-(j}ZhXN{PhjtO> zI#&o<4bZ4$7T?eK#@UY*y{?S~_@sRwwG$<}-h2QuJo@a`z3Z0(@-YB5mmj z3l4VSuV=JA{-?{#hKTU+Rk+MBq8WuhuOOR-*MxaKvEH2i2_fc~i4*vN%qmb=wmeDJ z|A@-{P)YK74l@i>M98GsFM{Dxk@nL{p1`h6<_j=h8Kp!{33!6~%dPpDptMWrUi#s* z+C>IdnVC;K6e-TizyKKvx-*>|R{R@@tc+W4o zx`}xyT%Dg#blZ+r6*xL#E=`)cR?(;d_Kq7DYUQIk@G zGubh?dNHZTr2BH$$+a!OYgaek`Jxz=5<>J7|CfcHlh-Y7 zc#Th>j3|wGZUG}njx|NcAPI#O%9~v^CUYAOJUl^Pq38!R)c@Avyd0tIS^X`|cHN9) zr}HX|_aL&T0-i^^_Ku)VQ~v^3aN5Dr9GI(U3+0HY#dV#62fsc>v24hn;++J~(0OWJ zGKb8b18(TZ$;?o1`qQ#?LN*>3#UC{_;VI8xqb>_9s+=@Z^rF;1W#Q=<5~>*W>X{`v zFd9XdQlUwbZMYIPf~~{NND+_&lZW~9PB)6hSK1sOEQEgQG|i5wcfd@MC7nf>Wm;a5v~4{e+nFc?$7Z{&%aq`6C(16&Fwlu z1T833Pa{G#Kukwkk}yAy`&wxx&Ib)*CrOL!{W`A=HFvJQx5^MCOoWdyPeTZc3j;z1z*yRM5=V#5eZC0QGmxPz zI>Kn;8TC3$>EBx7^oDl~!_-BHe(`f-8y`$nBH$9lXrir!11RQU(WuI&&$7m@Cm@4ZKP>89g^ zU-^z8%gRj*5kP$3GtA(`L;@a+JXHceQYjG}22N5jgHv0996X<~1=uLooKlNMuUlL} zbfZcZCcj#J0*6i2zFGTd$YrY3&ueQpN$vC&G7Qox5?PG*5Z`OO{9=0Ayi?jpT&-dh zI$!>3i<0u^%@ubRH$?|$9}Z8VOoV3u&s zG_-v}IE7vKW4%I{l98Yj`Kv zFWs;Wm(iOPwxv%*{}buJgc1%azk#r<^XJuPKgtZHIyvuy%kNf$hpuNNhic-ENGKzM z)Zu(8-RpG5uck!Bofi&Y-9UVF`j`L-VdoU|=1xsdJiiNn(APcjSMH~WH7RCc(~LV3 ztDpdJ74d#eSpIc~L;wx;V4;pSc$84skFF8W=U)+m^C9-lIEDIPYCC*0mV~k(}|oY1Z%OM5j0GzV7-?%Om%)#_96UE zwcgQYB9N0dRcA`6f64DcZjHoHYQq5T+R~BeN`D7O8o3o#hw>wWvZbky(1w%hN$K~J z_$k?iVCzr%5D3+UK)u5){uRt^Zrs00)Mnw$2xi<*Y_g+JQm%Qn%41;94JRX?hXlYe z@Q(tq+Ilqn;yWg8&&4u-7QPXvlCMCmZRrR0WxsF=0rrONPINGv4;%n;AkcvDfSJSS zQ6=Ow06i6nnq@EcLw2KJhKFdM@xGSV~kOw&osXb)5h4k1)Rm@?Z0l zgxYD4+^AR4dio6(OXux_mQbg5urT zlT_LF)-Z$Q;%Qbh?P>{MUvdK6ivtdJcc=17* z76Gh4Y#v=DoEQ0LM+ooXcd@?7XP>4&#=MdE)Q=EWWv2=HjzZ-vCo+s6z_!Vb#Iel1 z0GzSi7-75{2_^E5jV>mSa9%5FrzS{Vg&H@hvNsf*yT2JpCX(7vV?>PegyCTb8&19q z%s*)6xrbS(BaWq4QfHFm*h1x*FTa~i^gNTOnn{Y24>i4D(xa=;VUsp1c&7<_&2V)I zr7TVI$b-I_*y6FI3jn3Ms>d<(+ELD!%edP>T6ph}cieRE{DdN#)`NsL-Vm%%_do}< zJ-u_;-W8IL9xvPIo}$z0C-?ZflDr{|lQ>h>f`Ew5y&^w@yFDq5dhcDx-;nR5fj@#a zx<#@&`sX?c<}?2?4c+b-W!t92XVxQi z)(YYAtS^Y~mJuodyYz`1X1y*$F*FPaK({5mHmCj+=(QyH4>|lR+Y_$(oZn-0)Xl1$jp%_$sABog=0`4-f zSYyaZU+9kIb>uE(^*EH=?h9RRpv!UNoOszm;4W2!#KQSyB9-z3-JuPoP8)Hn$c;<; zR^LRIj_UzMk^E@)_M8>r;fsU8@bZ#~x0aRPckqjN766~Q%6s~W{dK%xp{+>Rp5yrW z#+<;dmbsZ3Cs5zHxvVA6?$Z3UggWqNBM27Gq^G|5hwp@kf0L}QBQcO<)*0dV06*g^ ziRu3YU`=G|Qcbmsz8Ac2&V^sg-{5!6s3tJ*%-}{?MngkG?83xR{n>NvuRnvGV8>lH z#)h0UK~4Y5Tx%euA(}z4hPSN?L#xFfrv|F@jbHxJnHu&tmMW6BPs8oa^bdc;f_IF8 z1DgV|$nV;eb|7n%>I3;R@;comix{-fFU!&HUDMYyPHcIcK5Jzu{~iFpv}y2_AeVXK?% zzQv!N*XZZ^T)u4I+s})ZL7~VDx6NgnR^el-Pw2Zpw|)tuIW7O@v$1#+p5k@t>HNh& znIf5*uT@#-J_OpLL1!~sgv-{rm=!#Ip^m}f?x^Pgn`jInH9m{QLMQ{@*A|@X*gLp_-|K~+|R(B3FmrnLqXHj4A z&`vtg<)A(x8#pjh)2JK(r6;AUuUDaEw_{@o9Ju#hl6MtB`HM_dJ}1`C$aJX=YJ>#J z?pQD{G-{@BRKGEb>yFr~czmcPuz?fI`Jq5qtx4JW@u{EaZ){Z-o4ACnyf>Cw1p)m` z4Eb3(^h~;T%;d{Qh@do1CWGos16qBmUC;#3m@*}3>qbX1W3DAkG}IV8Oj{JiCe`$G zXd3gN>D2+DZKPhgXc2KH49-ju?ktpP4d%6*bOulm(1kzaZa@9yb%cX`HT4D4{Mq!o z>W*rYbAuS>e)&BF7!&S2VI*@v@k!Gc`5OC z#t*P3ea4a)ET~$Oj3<#r#V@yJcn~oon&(rA?`e@M&RlRmXJz^mQz8&=(TOqDM(`F) z(D4QsU?PXL$)*Mjq&X@=@)z)G?p&(~ERtCpNA$(f=*?5U1GIUyXc1SmS&E@W@rH_- zf#kOrF8taT>=Nib4d%D}4rPRM`ItJLtUN}<-d}UagI7#*67%}F3*CErg@>Ezi-{+s z6X(#Yc zarfmg&XYnv_Vqy^o+uV%W(2jpFWHH0yMa>$ZCy1V<}cL20;89jP5`& zgYR@ho!vQq6a|b4l*!B>y8=d{hEQwVPI?f%?=cy)s*c)pbQKwcGLpRE2Z+hel6Fn^ z-nAU%EAbgJFf|p4Oi-M}9Tp}LtgYzZJiaSBEVWtCOcsfg#yJqkZ6#;1-qmMVnpBP8 z_ghs}BVh0Q<%uJQAfXNS3X<9M7Mz;5UJd17xGm3wQ$>ckiBaiWd+ZuR3AZ&f!a^lx zP)xgA;aRB&SqLno9fbUmACz}6J=7A7ekMq%W-TU*WWqrB3r91CzmrBy$m9VfD80v2 zFL_L$=HC?a%gm7KS6@WFPTlm=TII#6^wFM#a# zRNIaitggy)Yg&=k8#rD!*)ULB)zJp>xkji|cw1uA9pXE5;_Jz{oaZ8ST`8Ka<{iU= zqte$1=SCQpT2bU|jSKS|LajjGCw$_a=w2_M4uEz##;ahk*r@{y8P(m_=vQm2>MR|5~ z%qK+zpMOrP8qS0xx3r0sMFMq+1v}ZY3P%VQCeOM_Xajs=-qwkSX*OTt~~d3{{ZPsd?pp z=3n42f4p=IldEybE(N!S0$)DE4G$HDkxu~xnmpktQmy?+;k=E4@2p9iP7^GKU+(H0 zS3@626tv>qb)jU|Vp>dfwi?)1sPWFdGOAPt;AkDDx;?s4mq40kWN3GfDp=ahqerfW zpMa|qW$)o?GS#C5S_rhS{;B2$MwYOAg#GRe)BNfgII@Ln4+f4IM_XNQIBDsWc86(; zBVNs8=8f9pl1Fd+SktH3I+*MaWDA=Y>CK$N8O3Frw?d^*JT5-9tZT8zvDVwi4Rxuy zmAgMaXVG>%abT{hZb##eLTN4e*as&Z*LJg=z`F3g9mJz0C0SK3&GtJ5f1 zmv)pK9_Fyg`3l!@jy&X<(5GhyEMT#YLmt)OaqX_(4Y(GnvF_yOtY>}$O_dP7^r20D z&rkwK3Jd1(OY@uAfywmnvGgm<@rEHpz6bIUZG$}dw1WuVhX$qbPnE)5Jjp|iGm;Bh z52QUk@f7kB&26R+W>MJ4c=P8!ma|)z4M?@*7S0LR%_}m;lQ)n&SFI^SudDT|Wm>7{ zHZX{j0OnR!NDu6%JHxrL{77e3zqugF9r%8W;7W5yAw)TR^S?n&8Et>W42BMUqfqo^1%o;BJ2 zMc#WcA_Ua0Pc~itmCE5Z*0tkr`PZGt!bU7Wn#Mtc%OF&pGJ#UoTYa zU=WV1(a~bn`}En_xxGty?&o^#A-;=^d2LNi29TXnW@3omb@4NhIsp1buWdxEXgVI4 zA{eZR6^=B_&R|tBDbikS?w%z`Qe9jmR==TFOgl#YYM7C+B&@{oe46CbTe!4*&FPIg z%(f)XR86kj_W$Fh{||TxoIb8yoeYv5mj$4emzEaqz<&V6ek1C!z#@QG-ZsdnoUhSb zoqcUew${uIif1?I+v2Y*LB@ZHM*j|&a&mJv>YEq@?)+QDs))2O(Lth&tU0#{SFiUu zKk3g7S^tgAmLRhZiXKvpQJZ*yW%`pZFW>xZB7f^l$e2?)QR>oo9e%dmT5GAvx9G{h zYMAuL;&k`i12%X54b?AH7pb9#11XiBaije-Z+BA42 zGXvLV1IxUvnCs+fdI)}5QK%4Hr+6a1U2&F79PR0kJ4sw$np)22G5-(W!WTH(tJqQs zIzN@w4bRZh3pMn&QgqR`Z7xRX4sAAIGQv%j#GW9B)=C7|Z;F#d{mgs9^o5^g*eN7h ziDe(jCQH>VHI8a97cGy3K?Dk3Ls2$YrkAbWWN#4=KD=#?J%2k%Aj~T!?jfNl3sL!* z*Xq@IU`sI8pSjW46l?|7ZE*%KXKq*xUeQq(bV8>CYG=Bjq-hpQDU8CAi=PvL)JBJr zRiJx~H@M)9E7)yw2@TWtMh7_o%uvs;jH`YeCc!ISD|WX}Cx#MAbVImhSed-_h)zdh z@hJ-sL9~BSvb*Qr=de;6^Bz+x$BZlyTc=(D{^DV3EZ)M77(Mx_$+|#$6v|bnOr2N4 zD^v)_gN$1Af^J}kcPvS18et!oDeB08Uw72%-rYdV(UUcsRWP)K(@w4$WIc=8G(m{S z_4+d;n1sih^!>X`#oEVU1C3&=* zDPT0=9IalbAh1%{XAwaR|oihoV$W z5cU*EFy}z4i)nQxjmwS}M*$P66r*{a(?yduQ^HP{2U28(XVw*Yo48DQnkH%kC0dUs zZd3+~l_3bCeQfP=Yj$V_7`%m z8v$C5d@yJKjnITpMcXFc31dtH=zB${#30=k?a6ei?XYX`CtwDR=^jFcTb4#<{+5(D zqLYv6wMT{-2_~sWJcRc|{?d?6!UUFHOd2P=m42u8BKRRy>E0#MIF+nK5P65E)8e}vXIVEH@a1nc;enRw{tWGohW9^swKBkC#4 z%)VQFOdQV4$az3} z420nC>iaVElu}CHL9Fe0Gz_fS(NjOPwFYz1qa><1o$dBfm-CJZ`pMkpdv8e<=q=qc zb2V(_nG}=eXE7Ot@)~IzbN{rl9x1BC`R&@wQAx@! zhAE|`*ZUMuap2`iq677}vn<*iMm;qI5o~21p7PHBl(l}mCB3+g(8@p6$oX=QPHuzx zwK;BqfZx&pMJc8}d&A%U)$({%^q8P7`g<&##kmsN0QMBIixxk|SJ&3Ol_3UMTdh1e zL-bd!(tgolx4iB^(~feltQ3{RYg9*&o28SD&p<9Qxo-M%R*EDQ}y%hYo zJ!_SlK{TvMFGP!WC;av7-TCQA(wcWS*OuSPXJqb-W8TIn#Caa;NC``t(e~Jj^m25M znv}o@;2no?;5bJdHbpd%BlkHCIWBp0xp9M_?qwyCH4_YFkdHkRj(H2+9>@I!IZfur zwZe+lORcO5x2kU71anp%+NRJtPjP)Js}y{e-3G2Bj?%9fO?fkvh3Mp-dVqNaV+-Gl zkWP&Mq2sBWs9&T}_W9>sk|!sVpGsdq?d~JIvln$s-@(QzkQYaC1#byOFnl)9>&{<_AHg5|mzbl+FaJg94q>OgYLcuzVrTQ8>wS<~LNE2h2fcgWZORyS0tyK1xUJ_h)f|GH2tW}Ce#03ENZuhz8*h;gx3J%zI^ z*zz~|`r-ZR^=%}|+Qbly5H`$`vZZ-0OIV}2Vo7)4g>%6rHqd`mA+se;-{3RodHCN| zq`j<7Q_@7wk9Kq<@Ay2f>6_oc)Z+{)0^4MFy>%ucd(5?CZnWp!@z2wk*SU`y_^Ev` zChFYhO!yp)DDPo%iHK)b86ZtP$WS!>a?1|G@e;difG-=XZfs~| z$3#(9uW6*k*en!v%(3!@Gd_9kQDjFehsZ0Jh}kDu3_Tfg)m_{E6d#T*@I~G72eTs*9Q7A_(4GlT+R~A&?F(c|JdIBNTmVTZ7TC;lT9pQYp^eYz%8x6Ly`9}P+3lbcy0+BM zw+NG{l&yCKSqbfeHfUe|F@qrwm}B5{*3}E=hJygoNqZghXD}38u+_dgF=~~BLUI2X z{S$f5;n{m>gz$~uCEaEEcRnMXX09;=hOd1q9^X`JA=8zP9(@wnJ#UQ(8nTJLijUp& z)o*6u+?ROM?$o{Nn4@`1zI}5f7a#lRc&)tru-7o$b{%8T1uHx^!dG)l=#o{^$^pzw(%(-qga>5a?2m|IU8&x^74A z;gP!~IxI*;%~Zd>?-m{oGMJuWDtlht5ZQMrO>`+NSt-}gq7X*S3u;sr)%Tbhwr0$o8*X<#dU<>QOpJ0=lc__j zEz*>@`t+@h>l43t-KO63a++>GE$OS)lHt+Ao zyH^=DZtjnWbjkbsl0!>gyF>M{6mb$S=7E&XSGi}pJ9Gv9Hgwn8xb%#r!dQEvWkd~8 z9N8qcK)>(04pF|2%jNC(-2L}$`VfMJYovHd18%Rg(eMM;yf{x@Q^(v!YiaJ^!Gos@ z9>H+(z29npsDzy%NM07V0YI`1L#Ve~@3n4pMa9|hQaa*Tc|jSsKaVwZ-SQgOOI@;Mr}ZqE#k$*-GZt@(U>Yx+>2jMB}ZkQGe7`UB*}5|HIa zu-*oSbcDhB&!P03-D<;t-#_1? zwtudoM~c;^!`v%SLlj zlE7Vmi1+=!S5*9Y3IFwf4E{&;$o~hI9$shejh0+=P5Bh-ih2~5G#=u*8-e^dUH*!I zkC_(-kK{&6pWdm5u#gU(py#zb$|M0)Pd2r6-(XAXW$KFo&P6_@P_AVi%c>mPttz|Zcs|~3jcKI;cv`KO=u9=y5-r&0s}L?8?djjiFp0e zG0V>X_uIeSvH7i^8!=+1F4@1fzIq5n#qR>=#|5RT3-V1E40znmLI%R5VI|Yz5o?qE z^vcNt2-XMWN6tYr*8<@Hzkk?7caNdYg6;NQo5M@J{4>-1Whbq_w7=l$%p}3=GObJ0 z&)t8&D%_kFeWRVSnwd$;o1J?L+iFD z74RRzD@dr;PK#BBD?zbeH}24=Un4v5u>=xRItpC!zv%#-QGF47n@X`+t4{%Abm8hu z>5`8Q+5R7x>VLlU&B^N-Xt9*8yMeAqXiq^iH1q!dy|RC9*gVUZQq$*mJsP6_j~GZ@ z$pJEEDKscE@w!(V^ml#Zz1q+*lczU*ABM5lKW-GBu8wYW&@o)zp3F!Trg6q?E!$&( z@~P!*C%0p=l`=AUDlssCND_1JM`oUDttPX&MFc?~r@M=CU=@VIVLCv$ zNw?-)#jCJOIx6iBz?A!PBbVr5dOevw3SfK8&c#N@wAxI0sjs9Vg_EbagAn>-G7fZR zr(fsPua0WsZG0?MSb)^msGK7Q-Nf(8iuXNMYT|nmpS;I2z5J}S|BcK&x-h`!x0i;M zeFWd0u-VfEyz2>irDxYLTt$T1tsD%eqWZwtKPax3)b>N5u5~ zWA7N=4sAMofMdOgc?WCovX;KJ#$^=NhL||E&3^In(C^rwx%%j7XJehakag}7Gpdgy z!EEC-!O-6uoAI%+ZI7XlwdR9RlcU!&3ddq7%egE&T$XjzOp%#o(thHxU4hovWr4zg zZkuXbyHX2t2R5v=w7vY{?EK+yD0Jr!<^9i2tGaGtL%-N>VDRuoNO<_huPep_dIsu^ zvi6;8W$DTR{sdgNplyd58=+?+*m?5?_>K5KcKyh zTgPvp*yln|hqk+8y!1oc8lJ5OQ9Hbuy2Mv~=@OL^{>h>SU~a-3`7tn%9{7#<^L3P; z%KNt$>K)^Uo$$b>N3>fDrgw8ZcYCf<4w@=j!nwa-ngOjF&7a@Bo^j}@zk}ZDj-O@Y zVc{Kw2M?5J0Ij63@)8lV6)}FF(_)-!gx^w2ksp;Dvu1*J{J??0>uY z*X9)S)rR*@R)y%D@!@y&*LSv*gmVXQrK@}aX#`XQs$A$-Y#Jb7Tx&`5E_O}(wirA5 zmt0dd)XKv&`9a&R z4w_P4MgeRH;A%f15QocLu*+OlcJea(^OWl!&E*^Oq)4$BCemucD%0QpD(eRBOfb~m zK1XPLjWpx~!!fgN^AJWsPmuxtJn%?DpzFG>dtA0I34GzuV`Q^I2a@tZwyxXDC9tKL z{{z34aIu*}k?+Iek8c}r{Jd@o{Or>^x~ir-7QT$!RL%5z-9IS$f7*NRfTps&Z4?WF zgrb502P9%cAv944(i96e(6K=11cZoE0!W9TLO?}f9F-zX2LX|iAP|sFB1EOB2n0fl z2q>YKP(t9Y9h{MK-Z|%<_q*SB?;rP_e;nOAYp-Olz1Fjy^4m<@0%dmo{w&8(|Cf>Z z`t*QW8^Pe&+zZS=Y};|&t;StmrbR6KsL%?x=xXm#p$hhkc=DyZ?9w@T{&Y}*DU@wIZuU11U!rC<^ajCwqO_3Ksr=;aZ4678!dqkkP$FX-&ZZ>=R6DN*}- zNh4tZ%b@X%zisoZ*8{V~sp03gYD(Gw44em{=OFeJuCqtV&+5P=F`+NUaZAk&)ph=T z_bMe6`g=(2L?O=jD{wfdlM7Pzdl>a|=wV{DCFt*asilcms;S#Cj+o~nMo z%DS%#8xXZVJ?=&)_vNA7j&y6a%v`-k4E@afS{Zo8lb@Dx~T(taa~t~P9)c7&Te zv)wvmbz83I``AV6qGtmo`ui*e*6N*(6JR*)xqG_p37*|^p%OD=vao;PGrK9&Q?EREuxJ) zGC_#Dn`+Q)RphbaAu+#8BAw^=-n$=pt1=M=E0J^1(su7ksZ{%_J$K~*M}^;?LJ2yH z1~W?^@6M&}5`ro2ty7deIa1*o?V^Rus;DKk<)}_bdF)!}H(nx;xlNVd|9dWTkRv#m z^4I8lER{OzC{|6$H|a~y9!U%~SJ)=ROb4&` zE17eD_;@EYzj!RqFN%ZGBsPE~NFi>Xg>?0-Cgv5h~>R5_hC$7gbQp>C4| zKo~*)hz$OO&H&YvZWz(`R?zYHbM74Ro2bjhjY?X}fEpj*zkrV(1VRi#Y)01N_uodo ztYOkOg+@aMNEXq1koVMu!VhB-m_E*AosuO`^r1u2m|#DnE1ML-czz>SWcnZ@`SrO1 z@sJAjsBpv4%$W2bn=?SwX+G@WTyfC5pxg;sa{1Ursq10dt8BA{7G(v`*0egM*-ZPG zTd%u0J@L8b^Mt*ZDmpac!tmGLsA-To1?RuqwH_9bxA6PO8LCDR%ayS%w3%I>MTyfn ztxCAH6qA52pJ(ptI=_(L0bsx~Ft3P4qTd5^i1EfLMWK8| zXl7u=8=?^h1WJ(p2%DB_z**-p4vK9FTx!(j0uQB_+a-%*FwnNcGUcLlBz%u z)$r!S#3y}{SY%|NJoB@U4Af$!HF-Y{~MWNHQeZ9R)+J{feDlhvP82L~e zHyGf~gFpYdnA@Ls5}M<|>h$l}v;VCh#l=_!%wH^;rmKT;XeT*|`0bX`X1r0uIE*gZ zzTBOm{5}Bx5<~^gT02|odrjbe?4dgQ=kg4x5AtFLTP3OEZS%aX(crZ7%;T|j*C- z=}hbs1Z$;KNX2&KP{d(OhhqtaVlg8l$ZXK21PJKKcIkN<3eE&NTrZJX+qK|2JwI>n zLnuhMN#b%nirkCMWn=mvNQgrh#d&*HK)q<$gXR2dnk`UqHO;94h4sh%GJpz;ifK9-YTa7SH?6j@WV2ypEJj z1gv#~(0W;0nz;$S&{k;n%S79&XH5goImKIrlb(5~#G_Fg}7m zVG#sD&+BUFY=)cI9ioH%S*z}M+PS;-RT|G8Q!Xn|S6dt*LO;xspCDh}UK7%&cYVK1(4Mrr0RI;7R<~UkIp>d&;e?bZl^L?> zsSKm##T7zd-UpFq7@MQ^7D8Vm`zI>%-UaRkSZFeSbj{oF5 zGD2?m#K;Yiw}L>t#d8}2<=_uTZ@hTap7vv{UEZ>Zrf<1fpH-MC~0I!=^ix(zBR`)q}O z$9fnDHL4#5H!5Hm=0qF*8c__-}AYB$o=8QE0%* z?2ir};M%H1gcHEe75EpR=^x#4Z@&8gY75+0_leF%c)vG+;HUM_#G=w0sH5@mDe0+r&pIw z7@kSOTn!LXAs((Wy^HPt}{A*{pg|@m`Y?0 zv?AXqgMfK$RCqv?(#aD(<2P~6>kUprb0J*`@I^IS2-K&l4P)9G7D=7Kz{+U0yDJRj$YDI}#j!+ThKpY%z? zNOyP@x~!pGhDF`BO zQFAqZ&)xPa8Y`X_RFWr@BDF0Nvc!X~e7Fkk^JnR>TTcBpSiiZ%5VI}H?9VQp0o`xs zbM>I^R?3oPFwAdJ@t^b7V{4;2eO?N#j_AWGKW_`x`c})tq>9e>hvBDFYRhO*CF)yh zdCUaKN9iOwHl&=HQu)rfej-90Zdm>hH>fQNwP>qi@r0z>*e@Mq>AU?iBY!@(KUd?z z6{q8JP?tC#!03ejr*e2FkHq>vP@&=P5#j$0j(8hw`S;6y<**#`D|uO~L?-VNfkE~q zJsDBigIkk+v8u2DG-tR*Q&f>nNh2^zDfU^fFuM-d?wTCQF)GtfY{` znUD(hG}XaEUZrJtilcgMl=7yI0?m{jjI{fwnv(PSyjlFe{XHYpI2$nExBZ(ULed&+ zlv+o8KE1+}ytc_4eynK?Q?Yt2W9`f2zwvm3e%=>sD;*2$f}~(2L$t4)!1W*(REvnv zHJ@ZyWBRn;ZabTjV9h;s?UlF>c%jiW3gwxCprtBcVhLuRdg24p(+1Twsi^p|L%uWb zSj?I@?f$i44lhg__?!#3B(IX1$;67L(e4Zo2+~f4Ruy1I@tsQr^A8+a)D`fK)s4zG z!Du{Zev3pBnGeI5t2|ev@=&e4x1rm+A=Q(E( znOfa;!X70di^7q4W}WAV3$j%f2>ebLc^!pYvz_1O@-mqmx9c z2r@z!y;^|~z*SYlu`cIY@ZlJh8;nEeH1y($g548pgCuu*KsISZU(k72?JH>HmEOwb zW*aiWiBeUrfvaVjnJ$V_G~P(t=ugCYxN$*+<8qBzmaBNo43+XO?)PIG_8={{uG~x- zqESujCykT94zUm+6)6yKffare^BNDX_?a=j9m5QJi2x9def}qpv*QQ76(yUkGu5Mt3}jb% z2L)SgRVH(0K9%gZAXx=}$@FWt?HH}X=^;38=GrQl9*!7GeGaG1ZmGzqy--M~#D#sN zVMK$A*X5k+7!6Dxy=9mho&NK}SI}sFf>>C>!|Dy$;t8owNmkuK7mI|xw)2seiV;1J ziJ2AJa$SH44*EWwEh!aQXeB@}VsKl%EUI@ja^26J>g@W7wLo1H{f>wO!kz7ha$ZVg zrS`ZuFOffa8x^$@Cs1DZLkUg5h^R;&6-dZE$Z62HgJE7im+`2$b9t$!7|{QyrcfRn z$`PkrV#OQ!oz}Xdi1>AcKP2Q(&IP~)a>qdN#)C*1vAre3fC@Ap`FUmUFhb|F_+twB z;Qp*5DCmCV{lE_hxE^nVH1XwIv07uY?k`~Klz|MWVhopDU>xdb2@v)hRO|hyAiIh! z_3Ez=0!}Nm6LOzqT9cv;^7lPI&8ppyExaKdW2YI)62SMdBS5B+PIn0a3J;OxW)T(w z#$NRDNO3wzq40dLPRDK46~}-J_BlG5$38Rk*4;L2NV>+>@?f98D$gI`)b?>~?D4DN zHdbDGIBOkk&rC=)5*Sq#>iOO)cme&30N<`d}I zo+C}&cj!}!1#NCbQNhV_2UV0J`0lk&%7|6_j9lH5IVfP zWZ+NQ0;VkE)M4h(Kb>$`NSJ7895uNr>(*@Ct~~%r&Hw!ZkHmllrXzUhqVLoMy|{Do zYn(l^OQjT53~6|L>_7U1U@H2uBf8|Ba-G!zl-yl{Jk8R!5cw-w3M(NRLP1eS>CS%M zOVupqYn22c+DL$oj%4AvNuV(dS+|THv4cd|fCDYsA(GV<11mqjK zbb1qp*V;)I5zHKpHzTO~McWGT8yZyX6CPR{zJv7xj7fqulpgTNw2JK+|2}tQ4p@bAr=(urrf|9;>cgA)>WOVZD-yE0vo~ne0KR);^UV6ScN_j?B zf283uG6sUym0blpF&NSLu&CAY+6QV?8qhLx#*~av6a;Z^lsP+5C_3?OQ|`<==iHhG zX-{bFXP%{Q;Q_&+BLI6tIEAke+|bSvOF4v=%adBWWH3z%$C)+bh5cj4VF zx9VRldPnIt<(v&JREJ4A&CJ`6dlhzeK-M}wlNb^%qjW=8`Q#x%pRSEvC6kL|Y+V6L z0M=TnO*z~jXp-a8nP)=_#Pm1i&?+i8Ckk|wG9knVbmIGWcc3P^0lz(w&0{4vHa2k&XVrQCm`6`uO z@AL3w5+wOd40y_%eKH7?w*E*jS^s+ntR?B#Sxa~ID_HOP6yS6 z;%^XJ#1`9!Jx`d1dvnjJd=I}ay&lFGQ_EmT4f_!9kDLAet9!@R0e5Di1Y+OgKI@%7b}}UppK$}A&8Q=a@V~HRJYnd49fRml1Q=Z>D^c< zc>f32`Hf%tQFFPy9W`mPM;wVOIjTEU%Cl-JWxGt>I#5t_T|f}`shh2_bOcEKa(3*^ zI=BKlK@kU~YmP(pZ)}wXT)isEC(u#_QGB#MFTu98LF$Ry+{i|w8^7SCq^R#-)=zBw zvc2OTS33Wre#4nI0ig1)APqLcT`M%cO4p4s8lL8?U&R>1NnL)`x6U&Bj9aa z8{7sTeD7Qs-{iWI^HYYF^(wdNLAm&6<;uBqA2g@oCwcYLfaBwSg)P{O%61rUGt>B%*N7 z%W3&?^U-s}V3L`YKtLjQAd~>AX}#k5a~!!tSq;g1=F=aU$NfZ0X;?V>rFeg~I6Ia6 zq(|9gbBj{(658cCmpN~iYR`6*S4fR6|9Q1k5-F)l)Ax~2B1vVjGr78T{TfLTn0#b~ zHRt=NM@1OvT*f7y|LGjW#?(Rsxmz+?&(F_aez z50MAdi1g$_TMDxWM22PwO||**UMAN$9vtLa?Pe0V9h_ijAQ`G0T}Tk;Z64{9Zh;3 zdooYtB42YXeevWV;SEsnJond;aGl_TaQUTVQoDn|G9sLDpr|GgrNrEuX5{dzt zF$^p*Q45iEM>|dpU+0|4=v$^$|EnB`_1^AWIUHw354h*c2q{f;wb@&M{LxDZxXJlg zQ=Q*Cf;*864>USB29vkdxdDRO|G+P^w;Dr9ob9Tw&FQwyP;A0#B-N=6-a_B|JfZa$T;#7S@PK1)27PdpfJlk z*#bNO>0hv>3x7^}@({VJ=vE51E?)S(5nQ$6J!V0p!vtuPoD!q z&lEHs04VsUSNNDwNMi;?OZ1GfZ+*F5B?Ir&X_PV>U-xD6FQC0P!>#c;9RbcK4T>Yg zLhVm)Fz1O(u4aFbR2%lltRuLGb?3HC3@t{qQax=@nU|f02Z(pcwUFr-Y8I*4cMl$#U?!t-`wrw zw`FZh?FH!zwNcGgwi}g=3m$@see%5XGoyDRhw3Lz7psdfdU8r!q&Ju_H1mY86UZtF zp~z6YgA{$es9{UYvR0;I9!Vn2>>06)LOH$Q* z?$`BsO^2B5K%RNlr7Ceoed%Cr?Wj!Mdt7e1E31ohyyZ{5kOVX#!{CnRNk%9O{80IY zV;j&&eNVai#oEI*qGF0(A2cZ4z=( z6N#Z0y4`sSTtM5WP=cRE_qSe(__MCG=BNWv1#t$am&@4D!+|u)V=P_4orgO4&*bZW z2&?{|e-snH(AyqGm$UDM?whkd7>K_L=Or!1M=+<{xC6K$x*FL`rWI9ga0DEu`vJ*) zpbytOwT$5EFANug<$VW>O_Y&{Bv?ADKx7c#kPb!;wh12TH{D+_*5-el8Iv4n5L;0H z1$bHS_e#^WB4_B{;JivU`kxUWF$Zilhe}1eAa_%--ux-w8Q|0!K5Y*?#X&ne4hAV? z1r>?1z5x99tNIa=nFa$OIj0JFNIBG9+tsX;Lgc&g~W@ zaU<uuQ0f-wjn6O+aFGV9A%V5pU@f6K%LT{{>Tj@bMI~AcM^P~LRsIZ)tUV~ zTT{a#e)S0@_iR7`>nkU&4Q=BYGe0ODe16Mm!}3TKWQqj&;eBlCrdu=FGL^(->w{ zju6b}usFP-=Fd)ir%-lFAXk%J&&Brfse}i+JdIgX(kpp)`gNJ&z~Buc!nnVZh>&n} z*@pUdwv+9v&zN@a{&XJ@ft56BwuMS);b?-mRP-}ztu>@JN4s^l9mFK9Se|bTfHz0( zBK%0^C`d0HlkG)y@kT3M3(PBBiBz)3ZX40jyAEZ*a6)oZ(8+4?SzWfDL6Y3vA9vdx z({w{)ug-U39YV{wCe_t)QFW0NbB6Kq*!4=f`rC`Ca@#{!m%A+Ar2prqxZL-_n6VX?`&s{Y(wGFR%$r7GrkTi%`$iS_p7&Tl;p-b^N9IB0l-VQX)U zrmx-MvS;SvMqv%wmDN>E&E9~-rRn?qBQ*|9e((l2SaeAaE-!Xb|yb3oz&3rgM@St^=~tQ~G=hqwj;ROF&LjxZl$8LId7N zE3u!WP}*3FDV0XwTAJ4D-^D!-T&s1B@h!Lz6U?#3eY%46x*twx;!40rjDS(UrPZsn zg`+Nz$;$T8O`q1X9SUPKVK61ZUPh)%>n5hHh7lo^3vMYw{My4UF4Id!&XRxr@WQZ? zDnp-mXQ@;9%^+MT?+`6-qfN~LTk07R*iPpzty_!eB|VEOI`unkVwQ9 zjm+OV^YSnlP13b!AK7Cg)|~jIn-6D;uPBDyoGyNOUq+B;m#`%=wAEplnBl291M?rF z0MK?jG0YL(OYka3Hoz&n!5EL?ZBMjLcu-hjhOyziN~1Hf%xXwnp0nlktOLTRcOK0-EyreF7jUf-xP$bnMHrVn74)wl)V zdQ&ZiVBht43IKs`pFvn}2kW>MG`BGHd6G(Ox^YWT$A{cD5%*|@nCrp?p;yXf>{Gsr z0!tef88gH>OUK%r=e$glCg9;A7J-x(N|0XP0}T7FDGWd7{=2J862{?(2lu-(B!feD zEM8Ty5T~g{VxeB$G5{Z-`vLP9WPaE6%+U@|R?_#&NlMi8oUk*O#kOw+QgGa6Uw}s) z{TRl&@uQUQZQaM-w)pAF!oBA&G@^#cR$BOHS9+bDHI-EuIfY7&O2&y7_M?vH8Uqg7 zF1ETsO4qDl!gy4EscqGN#c*Rsk=Jtar9b^fqLi`ds+_Fh(O z&nR>%99+r#-odYf& zvl@cT8Vbc+TnEnb*@r|PdH+S{7v7lS^QHqN(6@tX0d}yofLfOc;-;A+MIcpkv9M|F zO>XNub|}GVt|vk0&(k-B61>jAsbx}O)d-=si@;=fb~quaph=|rrTr9@`~Wyj?wgIG zhSfX{p@4wNh`V#R?;^0&ITa#UrWH%zx8frO0cpEKq$zJ>%#IsiaZYeCbNi8d2_NQy zVrVlxZ-uKHoXbB>m%NyZe1i#YZ(BC8^LaOv$C>dUOr89HLsfhSHq(+6F3p%=s1lXU z&^?=^1s~y3B2rjTe{5CEb4X(oz05BA)0;k71#XkExbBROX^_ZS6Laby9n*IX+8tT?Eb@L^~IL=(W}m z(dHIy^C{7ZzRsu9g>i$_ULJP|^$@#0?Hq3Blp?j#7>9aQZpq^}fzb_!%Z7KtYu_8* z$~;FBS{>1Y%esFVc{{7GE!3%dB#W|V-R%?(gvcvp^Fc*eq3N(^wom3-&8+bQwkBZ_ zx?UDDU7D}(S!bc{lEMMmh??)+J?%_so3NirRJc`XHx~y3-XPI=4_|afNcrn$Hr#I> zqvO3JXKH?E)>eSe?0@Puy9f8`Lf*ocd({s{cP7k7Lf{OFQS3(6<;@*ONG1tRYh>fI z{IcpL%%A)U-Ofrqz+LmOCQkeBw+%nu{Q3X7S#0Fwza$3%%dvMk8N|*D+WJHMfD$$! z8bE%1J=k{?LMypm1=r3d3l$nC3tjU<$5=NmmS3vd;2b?&2#odKLGvYvW<@7TS`iV% zlHqMHk~V~&&oJUKhxEKg|$nd zjYq0vQ0&cBK>r#Fk1)#vH5$XyWF5-A&L)`o1{b-r6q%h`H!<>`S!+WI?rgc?RN>!m z>!09jjV`+B9Y39=$WMr|5d!sC4@30L7p%#`&?YIcZ%o|<{9GiWPzT@#v0|dsH!_1F zls6vzJ@k9kNv`PFs0-_YwPfmooT!viBi9t|HSWC!pLLy?)V-yC?QBH{kUW9hixvoU zDruW|jbR=K6)Leo?%t74!8Z8r6p1n@4d&;@I)F^njU8=~^ zEBsS1NDO6zB8v|@a-=3M;$CY5+u51_8XeH0Q0&;Yi^`SEq4JGhBu!bk@sLgE&CWQ& zv^T{-4Cb_wraKD6VPDg40$~m)O|3lKhD9%|e55R~@NA(G zM()T;vG)>MFmpwRAok$F3Q7>5lQk zXFdY5i-D*>xH=b5ao*9@z~cUK=oyyPmv>j4A0!S25DKl?c|qyJnaqVdcU(O6%ja!N z7Qcn$rJl;*{-gxW_apCNfXN^3#LN>5OObB~zj_iVGW4C-FBP>qCsQgsmb&IY4tt`} zKwv#Y54H-AG_sjzJw6|>oR8q~h*!|Q)0y&j4=IOY5m%{Y`8kM&)JkF!Q&a5%Ndy*f z$rW+r-Qt-l;{fhc4{~vfKM*h zcg$4Q2L0kQewkwX;pmIbTcsVf4V2z2rQvB5ilvj))?fNHAdZKB*%uhChYTG23f_18 zwfdu%eUg3vl)FaBRH&BAk{MqB<4&nYDC|YZS!*W5OTzmV5Sq$`Gmyw?%=@W7CBa~r zLYJLLBz9Fa(^7P3_nJ3{(Wr$6O2g2b1~wOg{9XZvD-V2LR8x7SK+RI2P(+lt~a>d>A&_~yS(1gtAY3zKp z!mT$|GaEpX)6C@xC$PhO-~kp44bERV6pF+|^WmOv#a(rvxJ*_^8BA@h&eo*&tP6Z} zF&Kl*U_$|`hQs!AK3%|GA)^45wr z+AA>3w`blgMrBq4U-4hOT{{gtI%5CytU&&mmX?-5hAZ%YB!a-x_+P0c=uujpTqjPi zK9c(R)FmMy>_43#a^BXr&%-}K%y#peM&w~IB0u~+Qo6jJN`WyK?b9hKF|?N9B>6@e z*bJTtMi*E-_(+mUrfA=}aolL`uJzxQ^)^H*9lpYIua`L7p-@mMI4OymEqIz^Z5~I( zTC6dMc@gE^-OGGkWF#cTI7iIm#=$OWtIcXp`ua|l`}?)eR8JLaS#P~q!_KrfWySMK zL)%6H!xBlHujOUW=*_Xqfr*aumx9y#95w(@>2gL%-$WqfSP`n(SZ@)X40Xzu2wdnS z&03Z34f~x#N=C>ohtMwFbqWdZ^44D1gW5Fz7-K7sk}&O!j;c$0 z(EK-#;ZQBd_rZ_0OgK~W-F!?i5^LUk&Q|ANp%Bo#%2n#+wh@<}TC`Kt@g=NJ}T{^WpA}4@CU+*E6&3KD+H- z%RmjYbHIG<`9U*K0@apbhIg;|^44dQaS)9Mc7_~)VBFspm=Xm$8|oi#qTiy^;wYq4 z56Rqowg~e-mUYsi#J`uk|G$bQn>n>6>1}q^W!HTx_WOiSPZn%F&eKbWK!A!3)&tP{ z$`6A;2r%X;4@8FYxD-GkV9K~p?9S)um5uG781u^*U9WxRdXPyZxa_5Cr{}g(pMJte zug6$Qy%@kt>7y^H#k2lwpU(g>#bhToJhLtUJQG9XOZRXcg}*%rP+uBXG-p5=e^7Wr z5XRczrV>t29DNrRj_ZjW>q-=$lwkkTXsxz>>HLoz^JtKD2zScfeYEy4W`}?)kTV)4 zT*q2M-LZ{?9rYS6Xw$un*lcMSOg_qHB>12VF)C(F{XnCv3uHCOt;0fAE&2SGY9&Et^3`ft7VrUPI@M;6yn5ixn2ra8f2|5sxBV$FahxAlSHyd-7lz`8 zV1Gn4bGa{5Zlo8M5JG&Qsx{b~r zjq>5)m*S`Aw-?p2IKxIs!A*_ivsNsGy=U<=>p9(9g?bAoin^RHK#ZFzf1vxEa~p8U z9d93IyY>FP)eclqK#3D2ZR^*AoHTMv7{P_qEK*U-v?wzQN&o@Muv_l{`NGjAJ4@Bo zi@*e)U2gn*j~3T4Gu@!CEL~@fj4G^D^QL<1E0>D@EjTmRFTHvz=P;U{d=jObhdT}I zSNYPRzO`VfRWsj-teYS|_7|2!)wn{-!RLk_*|JM$`nT{9ZtKHmonVP>auo0BJ46JR zziHQnbw#6`vA$Ve6iQm>A4`d9v7(EwfN#reCa|?T>Fx?V1vd3$rg`_aJ*R=LzvOte zg|Uu8(V`896V`ZwM5uA_=?GvMqRA$K;`!-~`ZHy2#r+6*~^p>EmwT-KF&T`^ihB z`>zr+rg=`IAG+dyKepg<7Cr0iJNE4kZt*JDLtwBiJTfdrOxL2KJ@Rgl-Y>FQ@lck5 z`R&f6Tq31;lKDn7IqEMljF%~;41y}BKxjPk7kIn^auq_Yk&Z^VR;wgx;n+~fF!^0b zo)YVn`i!jbfc>GE)|rsve4~=l5H1N<#>NgOMsePFP2=}&sAK5wzvjuVh^R*<9GrQ1 zaF}h-B;}DbJ2*G4cDGrpvB*U;C!v*mo@e&I&O@d!7?du3zb$jASTj$R-){%TLbT1} zPzy{Zo;^4n(xc{9VastCGa1^G%Y31{NxZSxs6k#;LvK`L|R4qO-}u!@m&KDO0@?8~u#X1N*E zZ-Gbh#~4jV*`SfgEJh5Y0C|3 z?*{V&NA7YVTolH-%E`quPVuzV4+R5Y3*iDhe^gSo^eu4yF;Lr?X6E@2(}fN=b}ky* z+04>x!s}0+rYS~#bjr(HTJR)BT7})|EN>Kpac}S}Ls#Xx)&U)WlAL&(|hwmMxy(DL_wZ@w#6MK}h!A{Hm zlAM)i=^f9;_o{AqU~T*|-ut}6+hnrc

lC<^YBH!dp{;n<*@Rbr@i5MA^!3HjG{O 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�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⩔(IQly{pQt#WnkejfzYi}DtY;?wX$K@?O5=W;7$kE#MzwaoSN_uJ-U z)ykb#YcV%y*3{;3J3Mp!?HS15jq34zGCP;#@u6jnrh`R@JUoe!~V zL|O~8Z0#hw%Klpw!HV%_rSwe)f7wJ#aQS@Zwr*CL{&$l)!fe~5zNv6jTCTkBPdM~^ zSUl?zu5y2JY9yu)qE&U(N`#2ReFbj9TY81MeT6UQf^T9!!0iP|S&knWT9y{>Sprt2 z+Fw9G1Z^3JsPu8)6Ew@e0lx@#fu8_^4j~A)7;5?IV9n3MpDo(Xg5WZHbvEB1u13d4%>fJ z8YTpO&#=`Xi4)aOyKEeI(k!(BCsZ&99tR7w-^o2M)SxF00mP(6@h=>47_l(G%l4*kebj+cFv+bL-8e`tT58R6g*X z3A1VT#Dr(}Fn!|(Lgi{3O188#jKMOW(Jw9SLS4y3P3__JCB-Wt{sv1%mlw6pe%}nT z?5-Kdb%scG7AO6WooYnJ7#OF7aUn+Wkw4h^tKBH+bp45`wB@2BGYzfW+R*5jDl08^ z9-~N$)@<0YQvufV`0(Zx1cvNbZSU6{^hR4*G{K;7SGhLC!>JB32gIEYxN#e?-=DAe z%bkAuKXa#vzvvhU)(Z2E*N4A8Q@iMP11KE3j5*ET;1tPS z1j4PY80Dw;{NR>iLD!}ex^AkXe=w)&4TF#M8d-}^COYp|6a=HWq`CM%lYJo0w zAWaRh^0JLSaso4x$GHxe_&a5gbqTV!g?hxAn%H1O27NmOy4*l&;r^;wZFdaHE37jx zu?RRX-~5g)#zg=@0idf9$Q{+Dpd}x>Yb8Hb*nI!xotFitayqs@V%aHzw^%TCJ7ukU z6~2Iz`XXeA>PbI+BaW2KX-iEh0MJ=*YX?>O2rg~dmL0Jbr}<+x@P0C9w8RC*7i>iAQv85*@v}rgKCdYABIj#qE9GK zAKjqeukarqsbG$ctCXVHg-k=nF|Mq`6a!92jm!n{%?{hr;2{+)D$3Qam*j0=l;DnY zB~gz7-5y;4z8HW!Tt+$iL%o=mmo@BuXp%v#ik4%E3MM>EV8;QQk|*Q1G?EgKxU2y3 zQ9du-BQc6IEx)YCDulU8+RljEMRrW{T2eOa3>AigRP&pdV3~4`&48YoCs6mka)B}}lk=EN^w|Zdqvvo(3 zE5sa{DM#$v;J4pix*OaGTxH`AN!St0WHAnG6~pWrbbT_ItXQI+1vI*1fIeg3b(a5J z$owk}u>az7r>IRNpl{>@g}Bv=GEXB>0)bwXcEBHx0@D5<@8WdC=$~J&1!O++2E9hN znnd+N?P>WbY#a|&{=!^vvGhI&SjJ$uF}=*)5aP8Gqcw(;bEKON`b%hhW&zZzs*9^%-jRYxG7c&Tw0 z0|N`vQDXq%nzQM@;xnxhkR^-qsH)#h1Z{2lJ{9k98&rn=@uB@B9(JwckA{;~)lM+i zj<$sHh>NQFabU0`IM`@7<}jL%qa#Kh7C~k)PHTCW+o}ULIOwcq9Cjq8v+q{_A%KMg zu88*)p|#8RCN%nOpju(jwceU`B8Eh4e#Ub0*=?l(kYAX0kv<~hy*79}_Rc=-v2c>8 z4?bS{!x%UNjw6#qMp?fDsVed~VVJr3LSA(KvQwP=MxS0m>uIQv#5S0k!bSK_{4hV$ ziEYPWw9mIAPWwpTa!Y@QV z&dS{b$p#h&fYrqzVRwK|-(S}9-*lFBH2T8*lCo@|hjb$0!ujP*)@D=z}-vfzWc%Dnqn97#xW1qEid{WkLvC%=`dClV*D^(@c(P)N~76K z_c*E0HjF5OTeY;eT5S|%R8?q|>2!uNR7I_!O;m}hDn%?Iw3h0Q7`05R#!@LIVo55Y zw6<;-64bscEwO~SPtuvWcY4lzxO30B=YF_f-;?(}Z}Pl(-rxVX4Zf&J@^*A1RaU7X z=e=)HvbqNEOeJixAC-L&X(0sAITX0dLK6`eztVyV+UeuVIkc&RO6n`?Qziiu*y
rk|c*avYu4Jwa4S zQcWIa|HSvNk~~H8#3ZMn!h4eCDXV|P#-|0?811^23-u2RP2fnzAV&tf^&E!B>Bpc~ z;syRqqkAC{w*wap$XRD;o=<;Bl4qE{hx{5W0s#4Oxn~B`?6f;8rwfG~f(6()HFEGITpnxq)(Fxfp1-E zW*&@%+Pz|VtiIqG!Gm$TxipGEWcdjadNis;-3nFV-}tJV6aC@2gYzzcC(n}ijfv~nIQj#W0NKVfQSd6Scew>rr$TVi{Rk~6M$IV@7}+-LrUVZF)hOda|RHHh0XB!GTU(f|2 zvdFhE!%}xxkTN1n=0H>q-!_laOoS=m37;O?YM3|D$J@?DD5!DD$;0-H=DQ57clH>1 z&e6kR=b2>3U}c zUzb#;`{%$oE4Ml96$38!)W3E^z-L#bJfb;3bm1-|x0wGuCVRW;rFp1n$PHbz15$fY zJBHLDq1>aju|>h}08EWNA5u?&8;^OVGz{{5cd?7=^uD@i>Te?0fqa1Yj{Q5m$K5P; zDP_y;mo96QIoeq1)^w>Y&3lkSI=jjcQ`?7!>up?ijGnR7#i#R4{jlXA617`!fhh;8!fS);ec{4v z^iaq~*lT;bOsl>=>ChBgOpMLAZ=bj12$9{q-@+|6O3m<0_pl(FlvWx?8ariHY1zAl zk`1D6GRhY{6=`Y%OI>26c*BCMagm!Y(g2vA;ewR?g1%hp-gS3c*vPZn{o4ngSDqqW zdw`-^17Nxb#ffc1amKK+`NNZ)1w>bcuqRhFqG%bD;n9;N+6@Hli|uFGRSSc`@A$K>;kA?U-TruVkQFrXU&AB zz$AOt;>&;uPKn7-o9c@HfWI>Tdl-$1kJF4>l8F~x-Gf|8+v?B zx?Dk?4}vYd>=6SD=J@!Zb*Q8Oi7!h6dVszq*)^T+Q9Tw2j^HDRo&JhCM>KlF-{Kqm zTzPOaG}`3L{Bk(c%(j~4Q8b?8je`$R)C5(u5A~#S)%;XaGe5C`l`0!`hN?hK)8%lP zASlatv!u8mm65^&Y79sW3hjq$;0Z#2?YPjfL3`1nt5Lz#vATg2waS0cUtco$l3>Z* zyAeiPYm)d%QdNL~q||_%HF{OEuG}yMyA8Vy5l^~LxqtzajbxWc9BCia@J*t>38>+i zhE_=Ve?CqG6&seuVv2}&6&2q=e~}wq5@m5aFFQS?+;G&`aM(EfaztI|HP=s(gMu;; zKq*SY$l5usHkMYk^3$~eF#pgH*pcgmE2Gck7H!d2JFhj&NByK^*Q{KJQJ?s*o~D7p zEdMsq3x}*fb~+qJUl1giyT3)fEK?FV@vM?mM!Q9R1hSQ&UInoLmH^FK{s}6#% zAk4b}Rt)2FM0ztmY^O?%0iizl_2fR_Y2%9(59+uREvwgZd#?9YbJb&jX%Hc}69-c`t!j0cBSt@jZXLIb)@(eWn)WBlDbgy;sQk<_yOaQErH;bE6kd+c5Ud#4 zJIFj79`R<@qbqROM1vgDw`{YjlkiVboec;{}2 z%OZw?j4t)BH(e#HcEU~j2o6Q`b)D1Uc_!5*4^1}Rvzo~6c6PBZaKIO|O`Z+m*e|r= zBN&Q5GQb_AK$OotH_T+i=eQ6~tcduzb1XAI6Si%E(D{~rHnZAIKG# zr&`+f`zk&dXAzw=R3MTtZ)fM9AU^Q{tC1Mq`KlsYbR+V%sG5ptmFYl@dGVEJGH6Q} z0x_jjy{amu@kf`qx?t7DsIk!dF6cc%^C~D$DS@(M z#AU>=3W$N?yLjxb@2HSVH~Tnc4(qvDvIrZY2^FS@K-x9eYh7CkteFBXa8#4cqU?UE zI?|>H z3N#o> Date: Wed, 7 Apr 2021 12:11:10 +0200 Subject: [PATCH 030/157] chore: updated Changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 613cd861..554bfc6f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Code and Architecture refactoring - Docker: The Java version to be used is now fixed in the Dockerfile - If running infomodel-deserialize throws IOException, these are now explicitly logged in the DataspaceConnectorClient +- Updated the Readme file ### Fixes - POST /api​/ui​/broker​/register now return success:false if connector doesn't return 200 and GET /api​/ui​/brokers returns not registered in this case From dfa1251833aaa195b6cefe42e19220eadca82d00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Wed, 7 Apr 2021 12:27:40 +0200 Subject: [PATCH 031/157] chore: updated Changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 613cd861..262d53e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ### Fixes - POST /api​/ui​/broker​/register now return success:false if connector doesn't return 200 and GET /api​/ui​/brokers returns not registered in this case +- Resources are updated at broker after they have been edited ## [6.0.0] - 2021-03-26 From d560178b205872c1758ee645da3547533d3494f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Wed, 7 Apr 2021 12:44:31 +0200 Subject: [PATCH 032/157] fix: internal database can be reached and viewed --- CHANGELOG.md | 1 + .../de/fraunhofer/isst/configmanager/config/SecurityConfig.java | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e5dbfe2..cbbd5aa1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ### Fixes - POST /api​/ui​/broker​/register now return success:false if connector doesn't return 200 and GET /api​/ui​/brokers returns not registered in this case - Resources are updated at broker after they have been edited +- Internal Database can be reached and viewed again at: http://localhost:8081/console ## [6.0.0] - 2021-03-26 diff --git a/src/main/java/de/fraunhofer/isst/configmanager/config/SecurityConfig.java b/src/main/java/de/fraunhofer/isst/configmanager/config/SecurityConfig.java index 42328e3c..e7ae5d6a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/config/SecurityConfig.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/config/SecurityConfig.java @@ -17,5 +17,6 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(final HttpSecurity http) throws Exception { http.csrf().disable().authorizeRequests().antMatchers("/**").permitAll(); + http.headers().frameOptions().sameOrigin(); } } From 2ec399c4f344c984f673c99d78266f72a2e05fa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Wed, 7 Apr 2021 14:19:25 +0200 Subject: [PATCH 033/157] fix: updated connector settings will be shown in the broker too --- CHANGELOG.md | 1 + .../api/controller/ConnectorController.java | 24 ++++++++++++++++++- .../api/service/BrokerService.java | 20 ++++++++++++++++ .../clients/DataspaceBrokerClient.java | 1 - 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cbbd5aa1..a17c3828 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - POST /api​/ui​/broker​/register now return success:false if connector doesn't return 200 and GET /api​/ui​/brokers returns not registered in this case - Resources are updated at broker after they have been edited - Internal Database can be reached and viewed again at: http://localhost:8081/console +- After editing the connector settings the broker will be updated with the new information ## [6.0.0] - 2021-03-26 diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java index d35750cd..92bb04de 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java @@ -5,8 +5,10 @@ import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.api.ConnectorApi; +import de.fraunhofer.isst.configmanager.api.service.BrokerService; import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; import de.fraunhofer.isst.configmanager.api.service.ConnectorService; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultBrokerClient; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; import de.fraunhofer.isst.configmanager.util.Utility; import io.swagger.v3.oas.annotations.tags.Tag; @@ -21,6 +23,7 @@ import org.springframework.web.bind.annotation.RestController; import java.io.IOException; +import java.util.concurrent.CompletableFuture; /** * The api class implements the ConnectorApi and offers the possibilities to manage @@ -35,18 +38,24 @@ public class ConnectorController implements ConnectorApi { transient ConnectorService connectorService; transient ConfigModelService configModelService; + transient BrokerService brokerService; transient Serializer serializer; transient DefaultConnectorClient client; + transient DefaultBrokerClient brokerClient; @Autowired public ConnectorController(final ConnectorService connectorService, final ConfigModelService configModelService, + final BrokerService brokerService, final Serializer serializer, - final DefaultConnectorClient client) { + final DefaultConnectorClient client, + final DefaultBrokerClient brokerClient) { this.configModelService = configModelService; this.connectorService = connectorService; + this.brokerService = brokerService; this.serializer = serializer; this.client = client; + this.brokerClient = brokerClient; } /** @@ -211,6 +220,19 @@ public ResponseEntity updateConnector(final String title, final String d final var valid = client.sendConfiguration(serializer.serialize(configurationModel)); if (valid) { + var registered = brokerService.getRegisteredBroker(); + registered.iterator().forEachRemaining(elem -> { + var asJsonObject = (JSONObject) elem; + var brokerId = asJsonObject.getAsString("brokerId"); + CompletableFuture.runAsync(() -> { + try { + brokerClient.updateAtBroker(brokerId); + } catch (IOException e) { + log.warn(String.format("Error while updating at broker: %s", e.getMessage()), e); + } + }); + }); + jsonObject.put("connectorResponse", "Successfully updated the connector " + "description of the configuration model"); response = ResponseEntity.ok(jsonObject.toJSONString()); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java index 0abe53b3..24b22191 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java @@ -237,4 +237,24 @@ public JSONArray getRegisStatusForResource(final URI resourceId) { } return null; } + + /** + * @return json array of all registered broker + */ + public JSONArray getRegisteredBroker() { + var jsonArray = new JSONArray(); + final var customBrokers = customBrokerRepository.findAll(); + if (customBrokers.isEmpty()) { + log.info("---- [BrokerService getRegisteredBroker] Could not find any broker"); + } else { + for (CustomBroker broker : customBrokers) { + if (BrokerStatus.REGISTERED.equals(broker.getBrokerStatus())) { + var jsonObject = new JSONObject(); + jsonObject.put("brokerId", broker.getBrokerUri().toString()); + jsonArray.add(jsonObject); + } + } + } + return jsonArray; + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceBrokerClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceBrokerClient.java index 89908046..0d807d4b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceBrokerClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceBrokerClient.java @@ -15,7 +15,6 @@ import java.io.IOException; import java.net.URI; -import java.util.Objects; import java.util.UUID; @Slf4j From b68e64ae6aabe1c719d42007114c134af5fefd40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Wed, 7 Apr 2021 16:27:37 +0200 Subject: [PATCH 034/157] fix: updated recursion methods that caused internal server error --- CHANGELOG.md | 2 +- .../api/service/ResourceService.java | 191 ++++++++++++------ 2 files changed, 134 insertions(+), 59 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a17c3828..f8f37cc1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,7 +22,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Resources are updated at broker after they have been edited - Internal Database can be reached and viewed again at: http://localhost:8081/console - After editing the connector settings the broker will be updated with the new information - +- Updated recursion methods in ResourceService that caused problems ## [6.0.0] - 2021-03-26 ### Added diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java index 4e7bd8bd..ba99772a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java @@ -184,41 +184,67 @@ public void updateResourceContractInAppRoute(final URI resourceId, } else { final ArrayList emptyList = new ArrayList<>(); for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { - if (appRoute.getHasSubRoute() != null) { - updateResourceContractInSubroutes((List) appRoute.getHasSubRoute(), - emptyList, resourceId, contractOffer); - configModelService.saveState(); + + if (appRoute == null) { + continue; + } + + if (appRoute.getAppRouteOutput() != null) { + for (final var resource : appRoute.getAppRouteOutput()) { + if (resourceId.equals(resource.getId())) { + final var resourceImpl = (ResourceImpl) resource; + resourceImpl.setContractOffer(Util.asList(contractOffer)); + log.info("---- [ResourceService updateResourceContractInSubroutes] Updated resource contract in the app route"); + break; + } + } + } + + if (appRoute.getHasSubRoute() == null) { + continue; + } + + for (final var subRoute : appRoute.getHasSubRoute()) { + updateResourceContractInSubroutes(subRoute, emptyList, resourceId, + contractOffer); } } + configModelService.saveState(); } } /** - * @param routeSteps list of route steps + * @param routeStep route step * @param visited list of route steps already managed * @param resourceId id of the resource * @param contractOffer the contract offer */ - private void updateResourceContractInSubroutes(final List routeSteps, + private void updateResourceContractInSubroutes(final RouteStep routeStep, final List visited, final URI resourceId, final ContractOffer contractOffer) { - for (final var routeStep : routeSteps) { - if (routeStep.getAppRouteOutput() != null) { - for (final var resource : routeStep.getAppRouteOutput()) { - if (resourceId.equals(resource.getId())) { - final var resourceImpl = (ResourceImpl) resource; - resourceImpl.setContractOffer(Util.asList(contractOffer)); - log.info("---- [ResourceService updateResourceContractInSubroutes] Updated resource representation in the app route"); + if (routeStep == null) { + return; + } - break; - } + if (routeStep.getAppRouteOutput() != null) { + for (final var resource : routeStep.getAppRouteOutput()) { + if (resourceId.equals(resource.getId())) { + final var resourceImpl = (ResourceImpl) resource; + resourceImpl.setContractOffer(Util.asList(contractOffer)); + log.info("---- [ResourceService updateResourceContractInSubroutes] Updated resource contract in the subroute"); + break; } } - if (routeStep.getHasSubRoute() != null && !visited.contains(routeStep)) { + } + if (routeStep.getHasSubRoute() == null) { + return; + } + for (final var subRoute : routeStep.getHasSubRoute()) { + if (!visited.contains(subRoute)) { visited.add(routeStep); - updateResourceContractInSubroutes((List) routeStep.getHasSubRoute(), visited, resourceId, contractOffer); + updateResourceContractInSubroutes(subRoute, visited, resourceId, contractOffer); } } @@ -440,42 +466,68 @@ public void updateResourceInAppRoute(final ResourceImpl newResource) { } else { final ArrayList emptyList = new ArrayList<>(); for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { - if (appRoute.getHasSubRoute() != null) { - updateResourceInSubroutes((List) appRoute.getHasSubRoute(), emptyList, newResource); - configModelService.saveState(); + + if (appRoute == null) { + continue; + } + + if (appRoute.getAppRouteOutput() != null) { + for (final var resource : appRoute.getAppRouteOutput()) { + if (newResource.getId().equals(resource.getId())) { + final ArrayList output = + (ArrayList) appRoute.getAppRouteOutput(); + output.remove(resource); + output.add(newResource); + log.info("---- [ResourceService updateResourceInAppRoute] Updated resource in app route"); + break; + } + } + } + + if (appRoute.getHasSubRoute() == null) { + continue; + } + + for (final var subRoute : appRoute.getHasSubRoute()) { + updateResourceInSubroutes(subRoute, emptyList, newResource); } } + configModelService.saveState(); } } /** - * @param routeSteps list of route steps + * @param routeStep routestep * @param visited list of route steps already managed * @param newResource new resource old version should be replaced with */ - private void updateResourceInSubroutes(final List routeSteps, + private void updateResourceInSubroutes(final RouteStep routeStep, final List visited, final ResourceImpl newResource) { - boolean updated = false; - for (final var routeStep : routeSteps) { - if (routeStep.getAppRouteOutput() != null) { - for (final var resource : routeStep.getAppRouteOutput()) { - if (newResource.getId().equals(resource.getId())) { - final ArrayList output = - (ArrayList) routeStep.getAppRouteOutput(); - output.remove(resource); - output.add(newResource); - updated = true; - break; - } + + if (routeStep == null) { + return; + } + if (routeStep.getAppRouteOutput() != null) { + for (final var resource : routeStep.getAppRouteOutput()) { + if (newResource.getId().equals(resource.getId())) { + final ArrayList output = + (ArrayList) routeStep.getAppRouteOutput(); + output.remove(resource); + output.add(newResource); + log.info("---- [ResourceService updateResourceInAppRoute] Updated resource in subroute"); + break; } } - if (!updated && !visited.contains(routeStep) && routeStep.getHasSubRoute() != null) { + } + if (routeStep.getHasSubRoute() == null) { + return; + } + for (final var subRoute : routeStep.getHasSubRoute()) { + if (!visited.contains(subRoute)) { visited.add(routeStep); - updateResourceInSubroutes((List) routeStep.getHasSubRoute(), visited, newResource); + updateResourceInSubroutes(subRoute, visited, newResource); } - - } } @@ -531,50 +583,73 @@ public void updateBackendConnection(final URI resourceId, final URI endpointId) */ public Resource getResourceInAppRoute(final URI resourceId) { - Resource resource = null; + Resource foundResource = null; final ArrayList emptyList = new ArrayList<>(); for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { - if (appRoute.getHasSubRoute() != null) { - resource = getResourceInSubroutes((List) appRoute.getHasSubRoute(), emptyList, resourceId); + + if (appRoute == null) { + continue; + } + + if (appRoute.getAppRouteOutput() != null) { + for (final var resource : appRoute.getAppRouteOutput()) { + if (resourceId.equals(resource.getId())) { + foundResource = resource; + log.info("---- [ResourceService getResourceInAppRoute] Resource is found in the app route"); + break; + } + } } + + if (appRoute.getHasSubRoute() == null) { + continue; + } + + for (final var subRoute : appRoute.getHasSubRoute()) { + foundResource = getResourceInSubroutes(subRoute, emptyList, resourceId); + } + } - if (resource == null) { + if (foundResource == null) { log.info("---- [ResourceService getResourceInAppRoute] Could not find any resource in app routes and subroutes"); } - return resource; + return foundResource; } /** - * @param routeSteps list of route steps + * @param routeStep routestep * @param visited list of route steps already visited * @param resourceId id of the resource * @return resource */ - private Resource getResourceInSubroutes(final List routeSteps, + private Resource getResourceInSubroutes(final RouteStep routeStep, final List visited, final URI resourceId) { Resource foundResource = null; - boolean found = false; - - for (final var routeStep : routeSteps) { - if (routeStep.getAppRouteOutput() != null) { - for (final var resource : routeStep.getAppRouteOutput()) { - if (resourceId.equals(resource.getId())) { - foundResource = resource; - found = true; - break; - } + if (routeStep == null) { + return null; + } + if (routeStep.getAppRouteOutput() != null) { + for (final var resource : routeStep.getAppRouteOutput()) { + if (resourceId.equals(resource.getId())) { + foundResource = resource; + log.info("---- [ResourceService getResourceInSubroutes] Resource is found in subroute"); + break; } } - if (!found && !visited.contains(routeStep) && routeStep.getHasSubRoute() != null) { + } + if (routeStep.getHasSubRoute() == null) { + return foundResource; + } + for (final var subRoute : routeStep.getHasSubRoute()) { + if (!visited.contains(subRoute)) { visited.add(routeStep); - getResourceInSubroutes((List) routeStep.getHasSubRoute(), visited, resourceId); + foundResource = getResourceInSubroutes(subRoute, visited, resourceId); } } - return foundResource; } From 9d40a6fcb5b09595a98fd80501f3863692276271 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Wed, 7 Apr 2021 16:29:16 +0200 Subject: [PATCH 035/157] chore: updated Changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8f37cc1..80e4bdb4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Internal Database can be reached and viewed again at: http://localhost:8081/console - After editing the connector settings the broker will be updated with the new information - Updated recursion methods in ResourceService that caused problems + ## [6.0.0] - 2021-03-26 ### Added From 2e7b260b42c1971ee86ec2b0d4ff5c2689b42882 Mon Sep 17 00:00:00 2001 From: omar Date: Tue, 6 Apr 2021 17:16:10 +0200 Subject: [PATCH 036/157] chore: add logger for not encoded accessURL string --- .../api/service/EndpointService.java | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java index 747c6f16..afff8f1d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java @@ -12,6 +12,7 @@ import org.springframework.transaction.annotation.Transactional; import java.net.URI; +import java.sql.SQLOutput; import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; @@ -43,29 +44,34 @@ public EndpointService(final CustomGenericEndpointRepository customGenericEndpoi public GenericEndpoint createGenericEndpoint(final String accessURL, final String username, final String password) { - final var endpoint = new GenericEndpointBuilder()._accessURL_(URI.create(accessURL)).build(); - final var endpointImpl = (GenericEndpointImpl) endpoint; - - if (username != null && password != null) { - endpointImpl - .setGenericEndpointAuthentication( - new BasicAuthenticationBuilder()._authUsername_(username)._authPassword_(password).build() - ); - } else { - log.info("---- [EndpointService createGenericEndpoint] No authentication was created because username and password were not entered."); - } + GenericEndpoint endpoint = null; + try { + URI access = URI.create(accessURL); + endpoint = new GenericEndpointBuilder()._accessURL_(access).build(); + final var endpointImpl = (GenericEndpointImpl) endpoint; - final var customGenericEndpointObject = new CustomGenericEndpointObject(endpoint); + if (username != null && password != null) { + endpointImpl + .setGenericEndpointAuthentication( + new BasicAuthenticationBuilder()._authUsername_(username)._authPassword_(password).build() + ); + } else { + log.info("---- [EndpointService createGenericEndpoint] No authentication was created because username and password were not entered."); + } - if (customGenericEndpointRepository.count() == 0) { - customGenericEndpointList = new CustomGenericEndpointList(); - } else { - customGenericEndpointList = customGenericEndpointRepository.findAll().stream().findAny().get(); - } + final var customGenericEndpointObject = new CustomGenericEndpointObject(endpoint); - customGenericEndpointList.getCustomGenericEndpointObjects().add(customGenericEndpointObject); - customGenericEndpointList = customGenericEndpointRepository.saveAndFlush(customGenericEndpointList); + if (customGenericEndpointRepository.count() == 0) { + customGenericEndpointList = new CustomGenericEndpointList(); + } else { + customGenericEndpointList = customGenericEndpointRepository.findAll().stream().findAny().get(); + } + customGenericEndpointList.getCustomGenericEndpointObjects().add(customGenericEndpointObject); + customGenericEndpointList = customGenericEndpointRepository.saveAndFlush(customGenericEndpointList); + } catch (IllegalArgumentException e) { + log.warn("Given accessURL: " + accessURL + " is not properly encoded."); + } return endpoint; } From ac22d126302fd3c463a4930de604ad73f02a5e2d Mon Sep 17 00:00:00 2001 From: omar Date: Fri, 9 Apr 2021 10:53:06 +0200 Subject: [PATCH 037/157] chore: change accessURL parameter from string to URI --- .../isst/configmanager/api/EndpointApi.java | 2 +- .../api/controller/EndpointController.java | 3 +- .../api/service/EndpointService.java | 46 ++++++++----------- 3 files changed, 22 insertions(+), 29 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java index 241054c1..eedb02c5 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java @@ -14,7 +14,7 @@ public interface EndpointApi { @ApiResponses({ @ApiResponse(responseCode = "200", description = "Created a generic endpoint"), @ApiResponse(responseCode = "400", description = "Can not create the generic endpoint")}) - ResponseEntity createGenericEndpoint(@RequestParam(value = "accessURL") String accessURL, + ResponseEntity createGenericEndpoint(@RequestParam(value = "accessURL") URI accessURL, @RequestParam(value = "username", required = false) String username, @RequestParam(value = "password", required = false) String password); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java index 96f0222e..9372ae66 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java @@ -66,12 +66,11 @@ public EndpointController(final Serializer serializer, * @return a suitable http response depending on success */ @Override - public ResponseEntity createGenericEndpoint(final String accessURL, + public ResponseEntity createGenericEndpoint(final URI accessURL, final String username, final String password) { log.info(">> POST /generic/endpoint accessURL: " + accessURL + " username: " + username); ResponseEntity response; - final var genericEndpoint = endpointService.createGenericEndpoint(accessURL, username, password); if (genericEndpoint != null) { final var jsonObject = new JSONObject(); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java index afff8f1d..273e260e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java @@ -12,7 +12,6 @@ import org.springframework.transaction.annotation.Transactional; import java.net.URI; -import java.sql.SQLOutput; import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; @@ -41,37 +40,32 @@ public EndpointService(final CustomGenericEndpointRepository customGenericEndpoi * @param password password for the authentication * @return generic endpoint */ - public GenericEndpoint createGenericEndpoint(final String accessURL, + public GenericEndpoint createGenericEndpoint(final URI accessURL, final String username, final String password) { GenericEndpoint endpoint = null; - try { - URI access = URI.create(accessURL); - endpoint = new GenericEndpointBuilder()._accessURL_(access).build(); - final var endpointImpl = (GenericEndpointImpl) endpoint; - - if (username != null && password != null) { - endpointImpl - .setGenericEndpointAuthentication( - new BasicAuthenticationBuilder()._authUsername_(username)._authPassword_(password).build() - ); - } else { - log.info("---- [EndpointService createGenericEndpoint] No authentication was created because username and password were not entered."); - } + endpoint = new GenericEndpointBuilder()._accessURL_(accessURL).build(); + final var endpointImpl = (GenericEndpointImpl) endpoint; + + if (username != null && password != null) { + endpointImpl + .setGenericEndpointAuthentication( + new BasicAuthenticationBuilder()._authUsername_(username)._authPassword_(password).build() + ); + } else { + log.info("---- [EndpointService createGenericEndpoint] No authentication was created because username and password were not entered."); + } - final var customGenericEndpointObject = new CustomGenericEndpointObject(endpoint); + final var customGenericEndpointObject = new CustomGenericEndpointObject(endpoint); - if (customGenericEndpointRepository.count() == 0) { - customGenericEndpointList = new CustomGenericEndpointList(); - } else { - customGenericEndpointList = customGenericEndpointRepository.findAll().stream().findAny().get(); - } - - customGenericEndpointList.getCustomGenericEndpointObjects().add(customGenericEndpointObject); - customGenericEndpointList = customGenericEndpointRepository.saveAndFlush(customGenericEndpointList); - } catch (IllegalArgumentException e) { - log.warn("Given accessURL: " + accessURL + " is not properly encoded."); + if (customGenericEndpointRepository.count() == 0) { + customGenericEndpointList = new CustomGenericEndpointList(); + } else { + customGenericEndpointList = customGenericEndpointRepository.findAll().stream().findAny().get(); } + + customGenericEndpointList.getCustomGenericEndpointObjects().add(customGenericEndpointObject); + customGenericEndpointList = customGenericEndpointRepository.saveAndFlush(customGenericEndpointList); return endpoint; } From 3551e9a7acfaff090e8f728bf46b832410df6c86 Mon Sep 17 00:00:00 2001 From: omar Date: Fri, 9 Apr 2021 11:03:05 +0200 Subject: [PATCH 038/157] chore: change accessURL parameter from string to URI in ConnectorApi --- .../de/fraunhofer/isst/configmanager/api/ConnectorApi.java | 4 +++- .../configmanager/api/controller/ConnectorController.java | 3 ++- .../isst/configmanager/api/service/ConnectorService.java | 4 ++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java index e2e84f0b..6a77db4a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java @@ -6,6 +6,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.net.URI; + public interface ConnectorApi { @GetMapping(value = "/connector", produces = "application/ld+json") @Operation(summary = "Get the Connector-Description") @@ -32,7 +34,7 @@ public interface ConnectorApi { @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully created a new connector")}) ResponseEntity createConnector(@RequestParam("title") String title, @RequestParam("description") String description, - @RequestParam("endpointAccessURL") String endpointAccessURL, + @RequestParam("endpointAccessURL") URI endpointAccessURL, @RequestParam("version") String version, @RequestParam("curator") String curator, @RequestParam("maintainer") String maintainer, diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java index 92bb04de..ae29f35f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java @@ -23,6 +23,7 @@ import org.springframework.web.bind.annotation.RestController; import java.io.IOException; +import java.net.URI; import java.util.concurrent.CompletableFuture; /** @@ -155,7 +156,7 @@ public ResponseEntity getConnectorJson() { */ @Override public ResponseEntity createConnector(final String title, final String description, - final String endpointAccessURL, + final URI endpointAccessURL, final String version, final String curator, final String maintainer, final String inboundModelVersion, diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java index d8622da8..d1f9978f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java @@ -64,7 +64,7 @@ public ConnectorService(final ConfigModelService configModelService, */ public BaseConnector createConnector(final String title, final String description, - final String endpointAccessURL, + final URI endpointAccessURL, final String version, final String curator, final String maintainer, @@ -74,7 +74,7 @@ public BaseConnector createConnector(final String title, return new BaseConnectorBuilder() ._title_(Util.asList(new TypedLiteral(title))) ._description_(Util.asList(new TypedLiteral(description))) - ._hasEndpoint_(Util.asList(new ConnectorEndpointBuilder()._accessURL_(URI.create(endpointAccessURL)).build())) + ._hasEndpoint_(Util.asList(new ConnectorEndpointBuilder()._accessURL_(endpointAccessURL).build())) ._version_(version) ._curator_(URI.create(curator)) ._maintainer_(URI.create(maintainer)) From b0975feebc1987c068c637a9c29fd7563b8bdc88 Mon Sep 17 00:00:00 2001 From: omar Date: Fri, 9 Apr 2021 11:24:57 +0200 Subject: [PATCH 039/157] chore: change accessURL parameter from string to URI in EndpointApi --- .../de/fraunhofer/isst/configmanager/api/EndpointApi.java | 4 ++-- .../configmanager/api/controller/EndpointController.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java index eedb02c5..929f4486 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java @@ -63,7 +63,7 @@ ResponseEntity updateGenericEndpoint(@RequestParam(value = "id") URI id, @ApiResponses({ @ApiResponse(responseCode = "200", description = "Successfully returned a list of connector endpoints"), @ApiResponse(responseCode = "400", description = "Can not find the connector endpoints from the client")}) - ResponseEntity getConnectorEndpointsFromClient(@RequestParam("accessUrl") String accessUrl, + ResponseEntity getConnectorEndpointsFromClient(@RequestParam("accessUrl") URI accessUrl, @RequestParam(value = "resourceId", required = false) String resourceId); @GetMapping(value = "/connector/endpoint", produces = "application/ld+json") @@ -77,5 +77,5 @@ ResponseEntity getConnectorEndpointsFromClient(@RequestParam("accessUrl" @PostMapping(value = "/connector/endpoint", produces = "application/ld+json") @Operation(summary = "Creates a new connector endpoint for the connector") @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully created the connector endpoint for the connector")}) - ResponseEntity createConnectorEndpoint(@RequestParam("accessUrl") String accessUrl); + ResponseEntity createConnectorEndpoint(@RequestParam("accessUrl") URI accessUrl); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java index 9372ae66..f82b0cc4 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java @@ -264,12 +264,12 @@ public ResponseEntity getConnectorEndpoint(final URI connectorEndpointId * @return a suitable http response depending on success */ @Override - public ResponseEntity getConnectorEndpointsFromClient(final String accessUrl, final String resourceId) { + public ResponseEntity getConnectorEndpointsFromClient(final URI accessUrl, final String resourceId) { log.info(">> GET /connector/endpoints/client accessUrl: " + accessUrl + " resourceId: " + resourceId); ResponseEntity response; try { - final var baseConnector = client.getBaseConnector(accessUrl, resourceId); + final var baseConnector = client.getBaseConnector(accessUrl.toString(), resourceId); if (baseConnector == null) { response = ResponseEntity.badRequest().body("Could not determine the connector with the access url: " + accessUrl); @@ -295,7 +295,7 @@ public ResponseEntity getConnectorEndpointsFromClient(final String acces * @return a suitable http response depending on success */ @Override - public ResponseEntity createConnectorEndpoint(final String accessUrl) { + public ResponseEntity createConnectorEndpoint(URI accessUrl) { log.info(">> POST /connector/endpoint accessUrl: " + accessUrl); final var configModelImpl = (ConfigurationModelImpl) configModelService.getConfigModel(); @@ -306,7 +306,7 @@ public ResponseEntity createConnectorEndpoint(final String accessUrl) { } final var connectorEndpoints = (ArrayList) baseConnector.getHasEndpoint(); - final var connectorEndpoint = new ConnectorEndpointBuilder()._accessURL_(URI.create(accessUrl)).build(); + final var connectorEndpoint = new ConnectorEndpointBuilder()._accessURL_(accessUrl).build(); connectorEndpoints.add(connectorEndpoint); configModelService.saveState(); From 4bbe4f97792f133fadf9ec320b2a1b4288c5c13b Mon Sep 17 00:00:00 2001 From: omar Date: Fri, 9 Apr 2021 11:53:44 +0200 Subject: [PATCH 040/157] chore: change accessURL parameter from string to URI in ResourceApi --- .../isst/configmanager/api/ResourceApi.java | 8 ++-- .../api/controller/ResourceController.java | 23 +++++++----- .../api/service/ResourceService.java | 37 ++++++++++++------- 3 files changed, 41 insertions(+), 27 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java index c4e89e18..d93aaa3e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java @@ -46,8 +46,8 @@ ResponseEntity createResource(@RequestParam("title") String title, @RequestParam("language") String language, @RequestParam("keyword") ArrayList keywords, @RequestParam("version") String version, - @RequestParam("standardlicense") String standardlicense, - @RequestParam("publisher") String publisher); + @RequestParam("standardlicense") URI standardlicense, + @RequestParam("publisher") URI publisher); @PutMapping(value = "/resource", produces = "application/ld+json") @Operation(summary = "Updates the specific resource at the connector") @@ -62,8 +62,8 @@ ResponseEntity updateResource(@RequestParam("resourceId") URI resourceId @RequestParam(value = "language", required = false) String language, @RequestParam(value = "keyword", required = false) ArrayList keywords, @RequestParam(value = "version", required = false) String version, - @RequestParam(value = "standardlicense", required = false) String standardlicense, - @RequestParam(value = "publisher", required = false) String publisher); + @RequestParam(value = "standardlicense", required = false) URI standardlicense, + @RequestParam(value = "publisher", required = false) URI publisher); @DeleteMapping(value = "/resource") @Operation(summary = "Deletes the specific resource from the connector") diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java index ed318a25..8f6173cd 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java @@ -181,17 +181,19 @@ public ResponseEntity deleteResource(final URI resourceId) { * @return response from the target connector */ @Override - public ResponseEntity createResource(final String title, final String description, + public ResponseEntity createResource(final String title, + final String description, final String language, final ArrayList keywords, - final String version, final String standardlicense, - final String publisher) { + final String version, + final URI standardlicense, + final URI publisher) { log.info(">> POST /resource title: " + title + " description: " + description + " language: " + language + " keywords: " + keywords + " version: " + version + " standardlicense: " + standardlicense + " publisher: " + publisher); ResponseEntity response; - if (ValidateApiInput.notValid(title, description, language, version, standardlicense, publisher)) { + if (ValidateApiInput.notValid(title, description, language, version, standardlicense.toString(), publisher.toString())) { response = ResponseEntity.badRequest().body("All validated parameter have undefined as value!"); } else { final var resource = resourceService.createResource(title, description, language, @@ -230,17 +232,20 @@ public ResponseEntity createResource(final String title, final String de * @return response from the target connector */ @Override - public ResponseEntity updateResource(final URI resourceId, final String title, - final String description, final String language, + public ResponseEntity updateResource(final URI resourceId, + final String title, + final String description, + final String language, final ArrayList keywords, - final String version, final String standardlicense, - final String publisher) { + final String version, + final URI standardlicense, + final URI publisher) { log.info(">> PUT /resource title: " + title + " description: " + description + " language: " + language + " keywords: " + keywords + " version: " + version + " standardlicense: " + standardlicense + " publisher: " + publisher); ResponseEntity response; - if (ValidateApiInput.notValid(resourceId.toString(), title, description, language, version, standardlicense, publisher)) { + if (ValidateApiInput.notValid(resourceId.toString(), title, description, language, version, standardlicense.toString(), publisher.toString())) { response = ResponseEntity.badRequest().body("All validated parameter have undefined as value!"); } else { try { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java index ba99772a..5c9b63ed 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java @@ -22,6 +22,8 @@ import java.io.IOException; import java.net.URI; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -87,8 +89,8 @@ public Resource getResource(final URI resourceId) { */ public void updateResourceContent(final String title, final String description, final String language, final List keywords, - final String version, final String standardlicense, - final String publisher, final ResourceImpl resourceImpl) { + final String version, URI standardlicense, + final URI publisher, final ResourceImpl resourceImpl) { if (title != null) { resourceImpl.setTitle(Util.asList(new TypedLiteral(title))); } @@ -111,10 +113,10 @@ public void updateResourceContent(final String title, final String description, resourceImpl.setVersion(version); } if (standardlicense != null) { - resourceImpl.setStandardLicense(URI.create(standardlicense)); + resourceImpl.setStandardLicense(standardlicense); } if (publisher != null) { - resourceImpl.setPublisher(URI.create(publisher)); + resourceImpl.setPublisher(publisher); } } @@ -414,10 +416,13 @@ private void deleteFromSubRoutes(final RouteStep current, final List * @param publisher the publisher of the resource * @return resource implementation */ - public ResourceImpl createResource(final String title, final String description, - final String language, final List keywords, - final String version, final String standardlicense, - final String publisher) { + public ResourceImpl createResource(final String title, + final String description, + final String language, + final List keywords, + final String version, + final URI standardlicense, + final URI publisher) { final ArrayList keys = new ArrayList<>(); final var literal = new TypedLiteral(); @@ -433,17 +438,21 @@ public ResourceImpl createResource(final String title, final String description, ._language_(Util.asList(Language.valueOf(language))) ._keyword_(keys) ._version_(version) - ._standardLicense_(URI.create(standardlicense)) - ._publisher_(URI.create(publisher)) + ._standardLicense_(standardlicense) + ._publisher_(publisher) ._created_(CalenderUtil.getGregorianNow()) ._modified_(CalenderUtil.getGregorianNow()) .build(); } - public ResourceImpl updateResource(final URI resourceId, final String title, - final String description, final String language, - final List keywords, final String version, - final String standardlicense, final String publisher) { + public ResourceImpl updateResource(final URI resourceId, + final String title, + final String description, + final String language, + final List keywords, + final String version, + final URI standardlicense, + final URI publisher) { //Get a Resource and update if it exists for (final var resource : getResources()) { if (resource.getId().equals(resourceId)) { From 8b9f937d49462b6cc0233d2b4eda165a95a79c3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Mon, 12 Apr 2021 14:38:44 +0200 Subject: [PATCH 041/157] refactor: using labels instead of enum names for better ux --- CHANGELOG.md | 1 + .../api/service/UtilService.java | 108 ++++++++++++++---- 2 files changed, 87 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 80e4bdb4..2837b7f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Docker: The Java version to be used is now fixed in the Dockerfile - If running infomodel-deserialize throws IOException, these are now explicitly logged in the DataspaceConnectorClient - Updated the Readme file +- Using labels instead of enum-names for better user experience ### Fixes - POST /api​/ui​/broker​/register now return success:false if connector doesn't return 200 and GET /api​/ui​/brokers returns not registered in this case diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java index bd4f2316..b8be6063 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java @@ -1,13 +1,22 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.ConnectorDeployMode; +import de.fraunhofer.iais.eis.ConnectorStatus; +import de.fraunhofer.iais.eis.Language; +import de.fraunhofer.iais.eis.LogLevel; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.BackendSource; import de.fraunhofer.isst.configmanager.model.config.BrokerStatus; import de.fraunhofer.isst.configmanager.model.routedeploymethod.DeployMethod; import net.minidev.json.JSONArray; +import net.minidev.json.JSONObject; +import org.json.JSONException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + /** * The class can be used to define auxiliary methods that are needed again and again. */ @@ -23,57 +32,112 @@ public class UtilService { */ public String getSpecificEnum(final String enumName) { final var jsonArray = new JSONArray(); + JSONArray sortedJsonArray = null; final var name = enumName.toLowerCase(); if (name.contains("loglevel")) { final var logLevels = LogLevel.values(); - for (int i = 0; i < logLevels.length; i++) { - jsonArray.add(i, logLevels[i].name()); + for (LogLevel logLevel : logLevels) { + var jsonObject = new JSONObject(); + jsonObject.put("originalName", logLevel.name()); + jsonObject.put("displayName", logLevel.getLabel().get(0).getValue()); + jsonArray.add(jsonObject); } + sortedJsonArray = sortJsonArray(jsonArray); } if (name.contains("connectorstatus")) { final var connectorStatuses = ConnectorStatus.values(); - for (int i = 0; i < connectorStatuses.length; i++) { - jsonArray.add(i, connectorStatuses[i].name()); + for (ConnectorStatus connectorStatus : connectorStatuses) { + var jsonObject = new JSONObject(); + jsonObject.put("originalName", connectorStatus.name()); + jsonObject.put("displayName", connectorStatus.getLabel().get(0).getValue()); + jsonArray.add(jsonObject); } + sortedJsonArray = sortJsonArray(jsonArray); } if (name.contains("connectordeploymode")) { final var connectorDeployModes = ConnectorDeployMode.values(); - for (int i = 0; i < connectorDeployModes.length; i++) { - jsonArray.add(i, connectorDeployModes[i].name()); - } - } - if (name.contains("securityprofile")) { - final var securityProfiles = SecurityProfile.values(); - for (int i = 0; i < securityProfiles.length; i++) { - jsonArray.add(i, securityProfiles[i].name()); + for (ConnectorDeployMode connectorDeployMode : connectorDeployModes) { + var jsonObject = new JSONObject(); + jsonObject.put("originalName", connectorDeployMode.name()); + jsonObject.put("displayName", connectorDeployMode.getLabel().get(0).getValue()); + jsonArray.add(jsonObject); } + sortedJsonArray = sortJsonArray(jsonArray); } if (name.contains("language")) { final var languages = Language.values(); - for (int i = 0; i < languages.length; i++) { - jsonArray.add(i, languages[i].name()); + for (Language language : languages) { + var jsonObject = new JSONObject(); + jsonObject.put("originalName", language.name()); + if ("LT".equals(language.name())) { + jsonObject.put("displayName", language.getLabel().get(1).getValue()); + } else jsonObject.put("displayName", language.getLabel().get(0).getValue()); + jsonArray.add(jsonObject); } + sortedJsonArray = sortJsonArray(jsonArray); } if (name.contains("sourcetype")) { final var sourceTypes = BackendSource.Type.values(); - for (int i = 0; i < sourceTypes.length; i++) { - jsonArray.add(i, sourceTypes[i].name()); + for (BackendSource.Type sourceType : sourceTypes) { + var jsonObject = new JSONObject(); + jsonObject.put("displayName", sourceType.name()); + jsonArray.add(jsonObject); } + sortedJsonArray = sortJsonArray(jsonArray); } if (name.contains("deploymethod")) { final var deployMethods = DeployMethod.values(); - for (int i = 0; i < deployMethods.length; i++) { - jsonArray.add(i, deployMethods[i].name()); + for (DeployMethod deployMethod : deployMethods) { + var jsonObject = new JSONObject(); + jsonObject.put("displayName", deployMethod.name()); + jsonArray.add(jsonObject); } + sortedJsonArray = sortJsonArray(jsonArray); } if (name.contains("brokerstatus")) { final var brokerStatuses = BrokerStatus.values(); - for (int i = 0; i < brokerStatuses.length; i++) { - jsonArray.add(i, brokerStatuses[i].name()); + for (BrokerStatus brokerStatus : brokerStatuses) { + var jsonObject = new JSONObject(); + jsonObject.put("displayName", brokerStatus.name()); + jsonArray.add(jsonObject); } + sortedJsonArray = sortJsonArray(jsonArray); + } + return sortedJsonArray.toJSONString(); + } + + /** + * @param jsonArray json array to be sorted + * @return sorted json array + */ + private JSONArray sortJsonArray(JSONArray jsonArray) { + List jsonObjects = new ArrayList<>(); + JSONArray sortedJsonArray = new JSONArray(); + + for (Object o : jsonArray) { + jsonObjects.add((JSONObject) o); } + jsonObjects.sort(new Comparator<>() { + private static final String KEY_NAME = "displayName"; - return jsonArray.toJSONString(); + @Override + public int compare(JSONObject a, JSONObject b) { + String str1 = ""; + String str2 = ""; + try { + str1 = (String) a.get(KEY_NAME); + str2 = (String) b.get(KEY_NAME); + } catch (JSONException e) { + e.printStackTrace(); + } + return str1.compareTo(str2); + } + }); + + for (int i = 0; i < jsonArray.size(); i++) { + sortedJsonArray.add(i, jsonObjects.get(i)); + } + return sortedJsonArray; } } From fc7349d544b4193ad952263b7908aba448586e7e Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Mon, 12 Apr 2021 17:13:28 +0200 Subject: [PATCH 042/157] refactor: minor code-refactorings --- .../isst/configmanager/api/AppRouteApi.java | 6 +- .../isst/configmanager/api/BrokerApi.java | 6 +- .../isst/configmanager/api/ConnectorApi.java | 12 +- .../isst/configmanager/api/EndpointApi.java | 6 +- .../isst/configmanager/api/ResourceApi.java | 6 +- .../api/ResourceRepresentationApi.java | 6 +- .../api/controller/BrokerController.java | 17 +- .../api/controller/ConfigModelController.java | 2 +- .../api/controller/ConnectorController.java | 7 +- .../ResourceContractController.java | 15 +- .../api/controller/ResourceController.java | 11 +- .../ResourceRepresentationController.java | 10 +- .../api/service/AppRouteService.java | 39 +- .../api/service/BrokerService.java | 8 +- .../api/service/ConfigModelService.java | 12 +- .../api/service/ConnectorService.java | 7 +- .../api/service/EndpointService.java | 16 +- .../api/service/ResourceService.java | 356 +++++++++++------- .../api/service/UtilService.java | 6 +- .../util/ResourceMapper.java | 6 +- .../model/config/ConfigModelObject.java | 7 +- .../model/config/CustomBroker.java | 6 +- .../CustomGenericEndpointList.java | 9 +- .../model/customapp/CustomApp.java | 7 +- .../customgenericendpoint/BackendConfig.java | 7 +- .../model/usagecontrol/Pattern.java | 2 +- .../isst/configmanager/util/Utility.java | 6 +- 27 files changed, 394 insertions(+), 204 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java index a34bcb0c..15007bfd 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java @@ -5,7 +5,11 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java index fffae7c1..82ecfcc0 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java @@ -4,7 +4,11 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java index e2e84f0b..42ca4d15 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java @@ -4,7 +4,11 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; public interface ConnectorApi { @GetMapping(value = "/connector", produces = "application/ld+json") @@ -42,10 +46,8 @@ ResponseEntity createConnector(@RequestParam("title") String title, @PutMapping(value = "/connector", produces = "application/ld+json") @Operation(summary = "Update a connector") @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully updated the connector description of the" + - " configuration model"), - @ApiResponse(responseCode = "400", description = "Failed to update the connector. The configuration model" + - " is not valid")}) + @ApiResponse(responseCode = "200", description = "Successfully updated the connector description of the configuration model"), + @ApiResponse(responseCode = "400", description = "Failed to update the connector. The configuration model is not valid")}) ResponseEntity updateConnector(@RequestParam(value = "title", required = false) String title, @RequestParam(value = "description", required = false) String description, @RequestParam(value = "endpoint", required = false) String endpoint, diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java index 241054c1..3f8d1266 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java @@ -4,7 +4,11 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java index c4e89e18..0f97fca8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java @@ -4,7 +4,11 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; import java.util.ArrayList; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java index 1c2057f8..ba92f25d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java @@ -4,7 +4,11 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java index a8f71ed8..a6449777 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.net.URI; +import java.util.Objects; /** * The api class implements the BrokerAPI and offers the possibilities to manage @@ -196,6 +197,7 @@ public ResponseEntity registerConnector(final URI brokerUri) { final var broker = brokerService.getById(brokerUri); final var jsonObject = new JSONObject(); + final var success = "success"; if (broker != null) { try { @@ -203,14 +205,14 @@ public ResponseEntity registerConnector(final URI brokerUri) { if (clientResponse.isSuccessful()) { brokerService.sentSelfDescToBroker(brokerUri); brokerService.setBrokerStatus(brokerUri, BrokerStatus.REGISTERED); - jsonObject.put("success", true); + jsonObject.put(success, true); } else { - jsonObject.put("success", false); + jsonObject.put(success, false); } response = ResponseEntity.ok(jsonObject.toJSONString()); } catch (IOException e) { log.error(e.getMessage(), e); - jsonObject.put("success", false); + jsonObject.put(success, false); response = ResponseEntity.ok(jsonObject.toJSONString()); } } else { @@ -233,22 +235,23 @@ public ResponseEntity unregisterConnector(final URI brokerUri) { final var broker = brokerService.getById(brokerUri); final var jsonObject = new JSONObject(); + final var success = "success"; if (broker != null) { try { final var clientResponse = client.unregisterAtBroker(brokerUri.toString()); - var clientResponseString = clientResponse.body().string(); + final var clientResponseString = Objects.requireNonNull(clientResponse.body()).string(); if (clientResponse.isSuccessful() && !clientResponseString.contains("RejectionMessage")) { brokerService.unregisteredAtBroker(brokerUri); brokerService.setBrokerStatus(brokerUri, BrokerStatus.UNREGISTERED); - jsonObject.put("success", true); + jsonObject.put(success, true); } else { - jsonObject.put("success", false); + jsonObject.put(success, false); } response = ResponseEntity.ok(jsonObject.toJSONString()); } catch (IOException e) { log.error(e.getMessage(), e); - jsonObject.put("success", false); + jsonObject.put(success, false); response = ResponseEntity.ok(jsonObject.toJSONString()); } } else { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java index 301f23f2..3bfbae7a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java @@ -133,7 +133,7 @@ public ResponseEntity getConfigModel() { } /** - * This method returns the current configuration model as JSON string + * This method returns the current configuration model as JSON string. * * @return a suitable http response depending on success */ diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java index 92bb04de..2001ce02 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java @@ -220,10 +220,11 @@ public ResponseEntity updateConnector(final String title, final String d final var valid = client.sendConfiguration(serializer.serialize(configurationModel)); if (valid) { - var registered = brokerService.getRegisteredBroker(); + final var registered = brokerService.getRegisteredBroker(); registered.iterator().forEachRemaining(elem -> { - var asJsonObject = (JSONObject) elem; - var brokerId = asJsonObject.getAsString("brokerId"); + final var asJsonObject = (JSONObject) elem; + final var brokerId = asJsonObject.getAsString("brokerId"); + CompletableFuture.runAsync(() -> { try { brokerClient.updateAtBroker(brokerId); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java index d9b33bac..f0ed125a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java @@ -102,6 +102,7 @@ public ResponseEntity updateResourceContract(final URI resourceId, final final var clientResponse = client.updateResourceContract(resourceId.toString(), contractJson); resourceService.updateResourceContractInAppRoute(resourceId, contractOffer); + jsonObject.put("connectorResponse", clientResponse); response = ResponseEntity.ok(jsonObject.toJSONString()); } catch (IOException e) { @@ -128,9 +129,11 @@ public ResponseEntity updateResourceContract(final URI resourceId, final * @return a suitable http response depending on success */ @Override - public ResponseEntity updateContractForResource(URI resourceId, Pattern pattern, String contractJson) { - log.info(">> PUT /resource/contract/update resourceId: " + resourceId + "pattern" + pattern.toString() + - " contractJson: " + contractJson); + public ResponseEntity updateContractForResource(final URI resourceId, + final Pattern pattern, + final String contractJson) { + log.info(">> PUT /resource/contract/update resourceId: " + resourceId + "pattern" + pattern.toString() + + " contractJson: " + contractJson); ResponseEntity response; @@ -148,11 +151,15 @@ public ResponseEntity updateContractForResource(URI resourceId, Pattern if (contractOffer != null) { final var jsonObject = new JSONObject(); try { - String contract = serializer.serialize(contractOffer); + final var contract = serializer.serialize(contractOffer); + jsonObject.put("resourceID", resourceId.toString()); jsonObject.put("contractID", contractOffer.getId().toString()); + final var connectorResponse = client.updateResourceContract(resourceId.toString(), contract); + resourceService.updateResourceContractInAppRoute(resourceId, contractOffer); + jsonObject.put("connectorResponse", connectorResponse); response = ResponseEntity.ok(jsonObject.toJSONString()); } catch (IOException e) { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java index ed318a25..938a9324 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java @@ -34,6 +34,7 @@ @Tag(name = "Resource Management", description = "Endpoints for managing the resource in the configuration manager") @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) public class ResourceController implements ResourceApi { + transient ResourceService resourceService; transient DefaultResourceClient client; transient DefaultBrokerClient brokerClient; @@ -249,12 +250,12 @@ public ResponseEntity updateResource(final URI resourceId, final String if (updatedResource != null) { final var clientResponse = client.updateResource(resourceId, updatedResource); - if(clientResponse.isSuccessful()) { + if (clientResponse.isSuccessful()) { //TODO move broker registrations to a parallel thread so it won't slow down response times - var registered = brokerService.getRegisStatusForResource(resourceId); + final var registered = brokerService.getRegisStatusForResource(resourceId); registered.iterator().forEachRemaining(elem -> { - var asJsonObject = (JSONObject) elem; - var brokerId = asJsonObject.getAsString("brokerId"); + final var asJsonObject = (JSONObject) elem; + final var brokerId = asJsonObject.getAsString("brokerId"); CompletableFuture.runAsync(() -> { try { brokerClient.updateAtBroker(brokerId); @@ -266,7 +267,7 @@ public ResponseEntity updateResource(final URI resourceId, final String resourceService.updateResourceInAppRoute(updatedResource); } final var jsonObject = new JSONObject(); - var responseBody = clientResponse.body(); + final var responseBody = clientResponse.body(); jsonObject.put("connectorResponse", responseBody != null ? responseBody.string() : ""); jsonObject.put("resourceID", resourceId.toString()); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java index aa215ebb..02d7ffa8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java @@ -1,7 +1,13 @@ package de.fraunhofer.isst.configmanager.api.controller; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.Artifact; +import de.fraunhofer.iais.eis.ArtifactBuilder; +import de.fraunhofer.iais.eis.IANAMediaTypeBuilder; +import de.fraunhofer.iais.eis.Language; +import de.fraunhofer.iais.eis.RepresentationBuilder; +import de.fraunhofer.iais.eis.RepresentationImpl; +import de.fraunhofer.iais.eis.ResourceImpl; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.api.ResourceRepresentationApi; @@ -255,7 +261,7 @@ public ResponseEntity getResourceRepresentationInJson(final URI resource log.info(">> GET /resource/representation/json resourceId: " + resourceId + " representationId: " + representationId); ResponseEntity response = null; - var representationJson = new JSONObject(); + final var representationJson = new JSONObject(); for (final var resource : resourceService.getResources()) { if (resourceId.equals(resource.getId())) { for (final var representation : resource.getRepresentation()) { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java index 1240ef9a..3284f44c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java @@ -1,6 +1,16 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.AppRoute; +import de.fraunhofer.iais.eis.AppRouteBuilder; +import de.fraunhofer.iais.eis.AppRouteImpl; +import de.fraunhofer.iais.eis.BaseConnectorImpl; +import de.fraunhofer.iais.eis.ConfigurationModelImpl; +import de.fraunhofer.iais.eis.ConnectorEndpointBuilder; +import de.fraunhofer.iais.eis.Endpoint; +import de.fraunhofer.iais.eis.ResourceImpl; +import de.fraunhofer.iais.eis.RouteStep; +import de.fraunhofer.iais.eis.RouteStepBuilder; +import de.fraunhofer.iais.eis.RouteStepImpl; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.model.configlists.CustomAppRepository; import de.fraunhofer.isst.configmanager.model.configlists.EndpointInformationRepository; @@ -298,6 +308,8 @@ public RouteStep createAppRouteStep(final URI routeId, final URI startId, * @return endpoint */ private Endpoint getEndpoint(final URI endpointId) { + Endpoint endpoint = null; + // Search endpoint in the app repository final var customAppList = customAppRepository.findAll(); if (!customAppList.isEmpty() && endpointId.toString().contains("appEndpoint")) { @@ -306,25 +318,29 @@ private Endpoint getEndpoint(final URI endpointId) { .flatMap(Collection::stream) .filter(customAppEndpoint -> customAppEndpoint.getEndpoint().getId().equals(endpointId)) .findAny().orElse(null); + if (customApp != null) { - return customApp.getEndpoint(); + endpoint = customApp.getEndpoint(); } } // Search endpoint in the backend repository and in list of connector endpoints - if (endpointService.getGenericEndpoints().size() != 0 && endpointId.toString().contains( - "genericEndpoint")) { + if (endpoint == null && endpointService.getGenericEndpoints().size() != 0 && endpointId.toString().contains("genericEndpoint")) { final var genericEndpoint = endpointService.getGenericEndpoint(endpointId); + if (genericEndpoint != null) { - return genericEndpoint; + endpoint = genericEndpoint; } } - if (configModelService.getConfigModel().getConnectorDescription().getHasEndpoint().size() != 0 + + if (endpoint == null && configModelService.getConfigModel().getConnectorDescription().getHasEndpoint().size() != 0 && endpointId.toString().contains("connectorEndpoint")) { - return configModelService.getConfigModel().getConnectorDescription().getHasEndpoint() + + endpoint = configModelService.getConfigModel().getConnectorDescription().getHasEndpoint() .stream().filter(connectorEndpoint -> connectorEndpoint.getId().equals(endpointId)) .findAny().orElse(null); } - return null; + + return endpoint; } /** @@ -335,16 +351,19 @@ private Endpoint getEndpoint(final URI endpointId) { * @return endpoint information */ public EndpointInformation getEndpointInformation(final URI routeId, final URI endpointId) { + EndpointInformation returnEndpointInfo = null; final var endpointInformations = endpointInformationRepository.findAll(); + if (!endpointInformations.isEmpty()) { for (final var endpointInformation : endpointInformations) { if (routeId.toString().equals(endpointInformation.getRouteId()) && endpointId.toString().equals(endpointInformation.getEndpointId())) { - return endpointInformation; + returnEndpointInfo = endpointInformation; } } } - return null; + + return returnEndpointInfo; } /** diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java index 24b22191..56417cdc 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java @@ -242,14 +242,16 @@ public JSONArray getRegisStatusForResource(final URI resourceId) { * @return json array of all registered broker */ public JSONArray getRegisteredBroker() { - var jsonArray = new JSONArray(); + final var jsonArray = new JSONArray(); final var customBrokers = customBrokerRepository.findAll(); if (customBrokers.isEmpty()) { log.info("---- [BrokerService getRegisteredBroker] Could not find any broker"); } else { - for (CustomBroker broker : customBrokers) { + final var jsonObject = new JSONObject(); + + for (final var broker : customBrokers) { if (BrokerStatus.REGISTERED.equals(broker.getBrokerStatus())) { - var jsonObject = new JSONObject(); + jsonObject.clear(); jsonObject.put("brokerId", broker.getBrokerUri().toString()); jsonArray.add(jsonObject); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java index 88d889d2..ca956457 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java @@ -1,6 +1,16 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.BaseConnectorBuilder; +import de.fraunhofer.iais.eis.BasicAuthenticationBuilder; +import de.fraunhofer.iais.eis.ConfigurationModel; +import de.fraunhofer.iais.eis.ConfigurationModelBuilder; +import de.fraunhofer.iais.eis.ConfigurationModelImpl; +import de.fraunhofer.iais.eis.ConnectorDeployMode; +import de.fraunhofer.iais.eis.ConnectorStatus; +import de.fraunhofer.iais.eis.LogLevel; +import de.fraunhofer.iais.eis.ProxyBuilder; +import de.fraunhofer.iais.eis.ProxyImpl; +import de.fraunhofer.iais.eis.SecurityProfile; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; import de.fraunhofer.isst.configmanager.model.config.ConfigModelObject; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java index d8622da8..72b0c90e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java @@ -1,6 +1,11 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.BaseConnector; +import de.fraunhofer.iais.eis.BaseConnectorBuilder; +import de.fraunhofer.iais.eis.BaseConnectorImpl; +import de.fraunhofer.iais.eis.ConfigurationModelImpl; +import de.fraunhofer.iais.eis.ConnectorEndpointBuilder; +import de.fraunhofer.iais.eis.SecurityProfile; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.model.configlists.ConfigModelRepository; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java index 747c6f16..1328e7e8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java @@ -1,6 +1,10 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.BasicAuthenticationBuilder; +import de.fraunhofer.iais.eis.Endpoint; +import de.fraunhofer.iais.eis.GenericEndpoint; +import de.fraunhofer.iais.eis.GenericEndpointBuilder; +import de.fraunhofer.iais.eis.GenericEndpointImpl; import de.fraunhofer.isst.configmanager.model.configlists.CustomGenericEndpointList; import de.fraunhofer.isst.configmanager.model.configlists.CustomGenericEndpointRepository; import de.fraunhofer.isst.configmanager.model.customgenericendpoint.CustomGenericEndpointObject; @@ -73,13 +77,17 @@ public GenericEndpoint createGenericEndpoint(final String accessURL, * @return list of generic endpoints */ public List getGenericEndpoints() { + var genericEndpoints = new ArrayList(); + try { customGenericEndpointList = customGenericEndpointRepository.findAll().stream().findAny().get(); - - return customGenericEndpointList.getEndpoints(); + genericEndpoints = (ArrayList) customGenericEndpointList.getEndpoints(); + log.info("---- [EndpointService getGenericEndpoints] Generic endpoints found: " + genericEndpoints.size()); } catch (NoSuchElementException e) { - return new ArrayList<>(); + log.info("---- [EndpointService getGenericEndpoints] No generic endpoints found!"); } + + return genericEndpoints; } /** diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java index ba99772a..b96df524 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java @@ -3,7 +3,26 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.Action; +import de.fraunhofer.iais.eis.AppRouteImpl; +import de.fraunhofer.iais.eis.BaseConnector; +import de.fraunhofer.iais.eis.BinaryOperator; +import de.fraunhofer.iais.eis.ConstraintBuilder; +import de.fraunhofer.iais.eis.ContractOffer; +import de.fraunhofer.iais.eis.ContractOfferBuilder; +import de.fraunhofer.iais.eis.DigitalContent; +import de.fraunhofer.iais.eis.DutyBuilder; +import de.fraunhofer.iais.eis.Language; +import de.fraunhofer.iais.eis.LeftOperand; +import de.fraunhofer.iais.eis.NotMoreThanNOfferBuilder; +import de.fraunhofer.iais.eis.PermissionBuilder; +import de.fraunhofer.iais.eis.ProhibitionBuilder; +import de.fraunhofer.iais.eis.RepresentationImpl; +import de.fraunhofer.iais.eis.Resource; +import de.fraunhofer.iais.eis.ResourceBuilder; +import de.fraunhofer.iais.eis.ResourceImpl; +import de.fraunhofer.iais.eis.RouteStep; +import de.fraunhofer.iais.eis.RouteStepImpl; import de.fraunhofer.iais.eis.util.RdfResource; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; @@ -16,6 +35,7 @@ import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -641,15 +661,16 @@ private Resource getResourceInSubroutes(final RouteStep routeStep, } } } - if (routeStep.getHasSubRoute() == null) { - return foundResource; - } - for (final var subRoute : routeStep.getHasSubRoute()) { - if (!visited.contains(subRoute)) { - visited.add(routeStep); - foundResource = getResourceInSubroutes(subRoute, visited, resourceId); + + if (!routeStep.getHasSubRoute().isEmpty()) { + for (final var subRoute : routeStep.getHasSubRoute()) { + if (!visited.contains(subRoute)) { + visited.add(routeStep); + foundResource = getResourceInSubroutes(subRoute, visited, resourceId); + } } } + return foundResource; } @@ -658,185 +679,232 @@ private Resource getResourceInSubroutes(final RouteStep routeStep, * @param contractJson the request body which holds the necessary information * @return contract offer */ - public ContractOffer getContractOffer(Pattern pattern, String contractJson) throws JsonProcessingException { - + public ContractOffer getContractOffer(final Pattern pattern, final String contractJson) throws JsonProcessingException { ContractOffer contractOffer = null; + switch (pattern) { case PROVIDE_ACCESS: - contractOffer = new ContractOfferBuilder() - ._permission_(Util.asList(new PermissionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("provide-access"))) - ._action_(Util.asList(Action.USE)) - .build())) - .build(); + contractOffer = buildProvideAccess(); break; case PROHIBIT_ACCESS: - contractOffer = new ContractOfferBuilder() - ._prohibition_(Util.asList(new ProhibitionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("prohibit-access"))) - ._action_(Util.asList(Action.USE)) - .build())) - .build(); + contractOffer = buildProhibitAccess(); break; case N_TIMES_USAGE: if (contractJson != null && !contractJson.equals("{}")) { final var jsonNode = getJsonNodeFromContract(contractJson); - String operator = jsonNode.get("binaryoperator").asText(); - BinaryOperator binaryOperator; - if (operator.equals("<")) { - binaryOperator = BinaryOperator.LT; - } else if (operator.equals("<=")) { - binaryOperator = BinaryOperator.LTEQ; - } else binaryOperator = BinaryOperator.EQ; - - String number = jsonNode.get("number").asText(); - String pipEndpoint = jsonNode.get("pipendpoint").asText(); - - contractOffer = new NotMoreThanNOfferBuilder() - ._permission_(Util.asList(new PermissionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("n-times-usage"))) - ._action_(Util.asList(Action.USE)) - ._constraint_(Util.asList(new ConstraintBuilder() - ._leftOperand_(LeftOperand.COUNT) - ._operator_(binaryOperator) - ._rightOperand_(new RdfResource(number, URI.create("xsd:double"))) - ._pipEndpoint_( - URI.create(pipEndpoint)) - .build())) - .build())) - .build(); + final var binaryOperator = getBinaryOperator(jsonNode); + final var number = jsonNode.get("number").asText(); + final var pipEndpoint = jsonNode.get("pipendpoint").asText(); + + contractOffer = buildNTimesUsage(binaryOperator, number, pipEndpoint); break; } case DURATION_USAGE: if (contractJson != null && !contractJson.equals("{}")) { final var jsonNode = getJsonNodeFromContract(contractJson); - String number = jsonNode.get("number").asText(); - - contractOffer = new ContractOfferBuilder() - ._permission_(Util.asList(new PermissionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("duration-usage"))) - ._action_(Util.asList(Action.USE)) - ._constraint_(Util.asList(new ConstraintBuilder() - ._leftOperand_(LeftOperand.ELAPSED_TIME) - ._operator_(BinaryOperator.SHORTER_EQ) - ._rightOperand_(new RdfResource(number, URI.create("xsd:duration"))) - .build())) - .build())) - .build(); + final var number = jsonNode.get("number").asText(); + + contractOffer = buildDurationUsage(number); break; } case USAGE_NOTIFICATION: if (contractJson != null && !contractJson.equals("{}")) { final var jsonNode = getJsonNodeFromContract(contractJson); - String url = jsonNode.get("url").asText(); - - contractOffer = new ContractOfferBuilder() - ._permission_(Util.asList(new PermissionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("usage-notification"))) - ._action_(Util.asList(Action.USE)) - ._postDuty_(Util.asList(new DutyBuilder() - ._action_(Util.asList(Action.NOTIFY)) - ._constraint_(Util.asList(new ConstraintBuilder() - ._leftOperand_(LeftOperand.ENDPOINT) - ._operator_(BinaryOperator.DEFINES_AS) - ._rightOperand_( - new RdfResource(url, URI.create("xsd:anyURI"))) - .build())) - .build())) - .build())) - .build(); + final var url = jsonNode.get("url").asText(); + + contractOffer = buidUsageNotification(url); break; } case USAGE_LOGGING: - contractOffer = new ContractOfferBuilder() - ._permission_(Util.asList(new PermissionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("usage-logging"))) - ._action_(Util.asList(Action.USE)) - ._postDuty_(Util.asList(new DutyBuilder() - ._action_(Util.asList(Action.LOG)) - .build())) - .build())) - .build(); + contractOffer = buildUsageLogging(); break; case USAGE_DURING_INTERVAL: if (contractJson != null && !contractJson.equals("{}")) { final var jsonNode = getJsonNodeFromContract(contractJson); - String fromDate = jsonNode.get("fromDate").asText(); - String toDate = jsonNode.get("toDate").asText(); - - contractOffer = new ContractOfferBuilder() - ._permission_(Util.asList(new PermissionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("usage-during-interval"))) - ._action_(Util.asList(Action.USE)) - ._constraint_(Util.asList(new ConstraintBuilder() - ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) - ._operator_(BinaryOperator.AFTER) - ._rightOperand_(new RdfResource(fromDate, - URI.create("xsd:dateTimeStamp"))) - .build(), new ConstraintBuilder() - ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) - ._operator_(BinaryOperator.BEFORE) - ._rightOperand_(new RdfResource(toDate, - URI.create("xsd:dateTimeStamp"))) - .build())) - .build())) - .build(); + final var fromDate = jsonNode.get("fromDate").asText(); + final var toDate = jsonNode.get("toDate").asText(); + + contractOffer = buildUsageDuringInterval(fromDate, toDate); break; } case USAGE_UNTIL_DELETION: if (contractJson != null && !contractJson.equals("{}")) { final var jsonNode = getJsonNodeFromContract(contractJson); - String startDate = jsonNode.get("startDate").asText(); - String endDate = jsonNode.get("endDate").asText(); - String deletionDate = jsonNode.get("deletionDate").asText(); - - contractOffer = new ContractOfferBuilder() - ._permission_(Util.asList(new PermissionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("usage-until-deletion"))) - ._action_(Util.asList(Action.USE)) - ._constraint_(Util.asList(new ConstraintBuilder() - ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) - ._operator_(BinaryOperator.AFTER) - ._rightOperand_(new RdfResource(startDate, - URI.create("xsd:dateTimeStamp"))) - .build(), new ConstraintBuilder() - ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) - ._operator_(BinaryOperator.BEFORE) - ._rightOperand_(new RdfResource(endDate, - URI.create("xsd:dateTimeStamp"))) - .build())) - ._postDuty_(Util.asList(new DutyBuilder() - ._action_(Util.asList(Action.DELETE)) - ._constraint_(Util.asList(new ConstraintBuilder() - ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) - ._operator_(BinaryOperator.TEMPORAL_EQUALS) - ._rightOperand_(new RdfResource(deletionDate, - URI.create("xsd:dateTimeStamp"))) - .build())) - .build())) - .build())) - .build(); + final var startDate = jsonNode.get("startDate").asText(); + final var endDate = jsonNode.get("endDate").asText(); + final var deletionDate = jsonNode.get("deletionDate").asText(); + + contractOffer = buildUsageUntilDeletion(startDate, endDate, deletionDate); break; } + default: + break; } return contractOffer; } + private ContractOffer buildUsageUntilDeletion(final String startDate, + final String endDate, + final String deletionDate) { + return new ContractOfferBuilder() + ._permission_(Util.asList(new PermissionBuilder() + ._title_(Util.asList(new TypedLiteral("Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("usage-until-deletion"))) + ._action_(Util.asList(Action.USE)) + ._constraint_(Util.asList(new ConstraintBuilder() + ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) + ._operator_(BinaryOperator.AFTER) + ._rightOperand_(new RdfResource(startDate, + URI.create("xsd:dateTimeStamp"))) + .build(), new ConstraintBuilder() + ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) + ._operator_(BinaryOperator.BEFORE) + ._rightOperand_(new RdfResource(endDate, + URI.create("xsd:dateTimeStamp"))) + .build())) + ._postDuty_(Util.asList(new DutyBuilder() + ._action_(Util.asList(Action.DELETE)) + ._constraint_(Util.asList(new ConstraintBuilder() + ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) + ._operator_(BinaryOperator.TEMPORAL_EQUALS) + ._rightOperand_(new RdfResource(deletionDate, + URI.create("xsd:dateTimeStamp"))) + .build())) + .build())) + .build())) + .build(); + } + + private ContractOffer buildUsageDuringInterval(final String fromDate, + final String toDate) { + return new ContractOfferBuilder() + ._permission_(Util.asList(new PermissionBuilder() + ._title_(Util.asList(new TypedLiteral("Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("usage-during-interval"))) + ._action_(Util.asList(Action.USE)) + ._constraint_(Util.asList(new ConstraintBuilder() + ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) + ._operator_(BinaryOperator.AFTER) + ._rightOperand_(new RdfResource(fromDate, + URI.create("xsd:dateTimeStamp"))) + .build(), new ConstraintBuilder() + ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) + ._operator_(BinaryOperator.BEFORE) + ._rightOperand_(new RdfResource(toDate, + URI.create("xsd:dateTimeStamp"))) + .build())) + .build())) + .build(); + } + + private ContractOffer buildUsageLogging() { + return new ContractOfferBuilder() + ._permission_(Util.asList(new PermissionBuilder() + ._title_(Util.asList(new TypedLiteral("Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("usage-logging"))) + ._action_(Util.asList(Action.USE)) + ._postDuty_(Util.asList(new DutyBuilder() + ._action_(Util.asList(Action.LOG)) + .build())) + .build())) + .build(); + } + + private ContractOffer buidUsageNotification(final String url) { + return new ContractOfferBuilder() + ._permission_(Util.asList(new PermissionBuilder() + ._title_(Util.asList(new TypedLiteral("Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("usage-notification"))) + ._action_(Util.asList(Action.USE)) + ._postDuty_(Util.asList(new DutyBuilder() + ._action_(Util.asList(Action.NOTIFY)) + ._constraint_(Util.asList(new ConstraintBuilder() + ._leftOperand_(LeftOperand.ENDPOINT) + ._operator_(BinaryOperator.DEFINES_AS) + ._rightOperand_( + new RdfResource(url, URI.create("xsd:anyURI"))) + .build())) + .build())) + .build())) + .build(); + } + + private ContractOffer buildDurationUsage(final String number) { + return new ContractOfferBuilder() + ._permission_(Util.asList(new PermissionBuilder() + ._title_(Util.asList(new TypedLiteral("Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("duration-usage"))) + ._action_(Util.asList(Action.USE)) + ._constraint_(Util.asList(new ConstraintBuilder() + ._leftOperand_(LeftOperand.ELAPSED_TIME) + ._operator_(BinaryOperator.SHORTER_EQ) + ._rightOperand_(new RdfResource(number, URI.create("xsd:duration"))) + .build())) + .build())) + .build(); + } + + @NotNull + private BinaryOperator getBinaryOperator(final JsonNode jsonNode) { + final var operator = jsonNode.get("binaryoperator").asText(); + + BinaryOperator binaryOperator; + if ("<".equals(operator)) { + binaryOperator = BinaryOperator.LT; + } else if ("<=".equals(operator)) { + binaryOperator = BinaryOperator.LTEQ; + } else { + binaryOperator = BinaryOperator.EQ; + } + return binaryOperator; + } + + private ContractOffer buildNTimesUsage(final BinaryOperator binaryOperator, + final String number, + final String pipEndpoint) { + return new NotMoreThanNOfferBuilder() + ._permission_(Util.asList(new PermissionBuilder() + ._title_(Util.asList(new TypedLiteral("Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("n-times-usage"))) + ._action_(Util.asList(Action.USE)) + ._constraint_(Util.asList(new ConstraintBuilder() + ._leftOperand_(LeftOperand.COUNT) + ._operator_(binaryOperator) + ._rightOperand_(new RdfResource(number, URI.create("xsd:double"))) + ._pipEndpoint_( + URI.create(pipEndpoint)) + .build())) + .build())) + .build(); + } + + private ContractOffer buildProhibitAccess() { + return new ContractOfferBuilder() + ._prohibition_(Util.asList(new ProhibitionBuilder() + ._title_(Util.asList(new TypedLiteral("Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("prohibit-access"))) + ._action_(Util.asList(Action.USE)) + .build())) + .build(); + } + + private ContractOffer buildProvideAccess() { + return new ContractOfferBuilder() + ._permission_(Util.asList(new PermissionBuilder() + ._title_(Util.asList(new TypedLiteral("Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("provide-access"))) + ._action_(Util.asList(Action.USE)) + .build())) + .build(); + } + /** * @param contractJson the contract offer * @return json node */ - private JsonNode getJsonNodeFromContract(String contractJson) throws JsonProcessingException { + private JsonNode getJsonNodeFromContract(final String contractJson) throws JsonProcessingException { final var mapper = new ObjectMapper(); return mapper.readTree(Objects.requireNonNull(contractJson)); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java index bd4f2316..8e5b24be 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java @@ -1,6 +1,10 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.ConnectorDeployMode; +import de.fraunhofer.iais.eis.ConnectorStatus; +import de.fraunhofer.iais.eis.Language; +import de.fraunhofer.iais.eis.LogLevel; +import de.fraunhofer.iais.eis.SecurityProfile; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.BackendSource; import de.fraunhofer.isst.configmanager.model.config.BrokerStatus; import de.fraunhofer.isst.configmanager.model.routedeploymethod.DeployMethod; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java index d12e2047..b28bad46 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java @@ -1,6 +1,10 @@ package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.Artifact; +import de.fraunhofer.iais.eis.BasicAuthenticationImpl; +import de.fraunhofer.iais.eis.GenericEndpoint; +import de.fraunhofer.iais.eis.Representation; +import de.fraunhofer.iais.eis.Resource; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.iais.eis.util.RdfResource; import de.fraunhofer.iais.eis.util.TypedLiteral; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java b/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java index 37b35f2e..23444149 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java @@ -7,7 +7,12 @@ import lombok.NoArgsConstructor; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Convert; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; /** * Entity class for the configuration model. diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java b/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java index fdaf81dd..ad7c3a5e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java @@ -4,7 +4,11 @@ import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; import java.net.URI; import java.util.List; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java index 81270a6d..8babab38 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java @@ -6,7 +6,14 @@ import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java b/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java index 15d0b10d..91ae02c7 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java @@ -4,7 +4,12 @@ import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; import java.util.List; /** diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java b/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java index 94639d37..6b661634 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java @@ -7,7 +7,12 @@ import lombok.NoArgsConstructor; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Convert; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; /** * The class helps to persist objects inherited from the endpoint from the information model. diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/usagecontrol/Pattern.java b/src/main/java/de/fraunhofer/isst/configmanager/model/usagecontrol/Pattern.java index a8458a7d..99f16d46 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/usagecontrol/Pattern.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/usagecontrol/Pattern.java @@ -38,7 +38,7 @@ public enum Pattern { private final String pattern; - Pattern(String string) { + Pattern(final String string) { pattern = string; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java b/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java index a5e87d1c..c1312004 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java @@ -1,6 +1,10 @@ package de.fraunhofer.isst.configmanager.util; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.AppEndpoint; +import de.fraunhofer.iais.eis.AppEndpointBuilder; +import de.fraunhofer.iais.eis.AppEndpointType; +import de.fraunhofer.iais.eis.CustomMediaTypeBuilder; +import de.fraunhofer.iais.eis.Language; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; import lombok.experimental.UtilityClass; From 17f1becd9e4e6d02e041f1ed003bc76357695c6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Tue, 13 Apr 2021 13:07:52 +0200 Subject: [PATCH 043/157] refactor: created new package resources for resources handling, added new abstract class for resources to outsource common code, specific services for resources were created --- .../isst/configmanager/api/AppRouteApi.java | 6 +- .../isst/configmanager/api/BrokerApi.java | 6 +- .../isst/configmanager/api/ConnectorApi.java | 6 +- .../isst/configmanager/api/EndpointApi.java | 6 +- .../isst/configmanager/api/ResourceApi.java | 6 +- .../api/ResourceRepresentationApi.java | 6 +- .../ResourceContractController.java | 16 +- .../api/controller/ResourceController.java | 5 +- .../ResourceRepresentationController.java | 30 +- .../api/service/AppRouteService.java | 13 +- .../api/service/BrokerService.java | 1 + .../api/service/ConfigModelService.java | 12 +- .../api/service/ConnectorService.java | 7 +- .../api/service/EndpointService.java | 6 +- .../api/service/ResourceService.java | 911 ------------------ .../api/service/UtilService.java | 6 +- .../resources/AbstractResourceService.java | 101 ++ .../resources/ResourceContractBuilder.java | 182 ++++ .../resources/ResourceContractService.java | 204 ++++ .../ResourceRepresentationService.java | 245 +++++ .../service/resources/ResourceService.java | 275 ++++++ .../util/ResourceMapper.java | 6 +- .../model/config/ConfigModelObject.java | 7 +- .../model/config/CustomBroker.java | 6 +- .../CustomGenericEndpointList.java | 9 +- .../model/customapp/CustomApp.java | 7 +- .../customgenericendpoint/BackendConfig.java | 7 +- .../isst/configmanager/util/Utility.java | 6 +- .../api_test/BrokerUIAPITest.java | 2 +- 29 files changed, 1051 insertions(+), 1049 deletions(-) delete mode 100644 src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/AbstractResourceService.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java index 15007bfd..a34bcb0c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java @@ -5,11 +5,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java index 82ecfcc0..fffae7c1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java @@ -4,11 +4,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java index 42ca4d15..e10f5c90 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java @@ -4,11 +4,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; public interface ConnectorApi { @GetMapping(value = "/connector", produces = "application/ld+json") diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java index 3f8d1266..241054c1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java @@ -4,11 +4,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java index 0f97fca8..c4e89e18 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java @@ -4,11 +4,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.net.URI; import java.util.ArrayList; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java index ba92f25d..1c2057f8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java @@ -4,11 +4,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java index f0ed125a..7a275464 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java @@ -4,7 +4,7 @@ import de.fraunhofer.iais.eis.ContractOffer; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.isst.configmanager.api.ResourceContractApi; -import de.fraunhofer.isst.configmanager.api.service.ResourceService; +import de.fraunhofer.isst.configmanager.api.service.resources.ResourceContractService; import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; import de.fraunhofer.isst.configmanager.model.usagecontrol.Pattern; import de.fraunhofer.isst.configmanager.util.ValidateApiInput; @@ -33,15 +33,15 @@ @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) public class ResourceContractController implements ResourceContractApi { - transient ResourceService resourceService; + transient ResourceContractService resourceContractService; transient Serializer serializer; transient DefaultResourceClient client; @Autowired - public ResourceContractController(final ResourceService resourceService, + public ResourceContractController(final ResourceContractService resourceContractService, final Serializer serializer, final DefaultResourceClient client) { - this.resourceService = resourceService; + this.resourceContractService = resourceContractService; this.serializer = serializer; this.client = client; } @@ -57,7 +57,7 @@ public ResponseEntity getResourceContract(final URI resourceId) { log.info(">> GET /resource/contract resourceId: " + resourceId); ResponseEntity response; - final var contractOffer = resourceService.getResourceContract(resourceId); + final var contractOffer = resourceContractService.getResourceContract(resourceId); if (contractOffer != null) { try { response = ResponseEntity.ok(serializer.serialize(contractOffer)); @@ -101,7 +101,7 @@ public ResponseEntity updateResourceContract(final URI resourceId, final final var clientResponse = client.updateResourceContract(resourceId.toString(), contractJson); - resourceService.updateResourceContractInAppRoute(resourceId, contractOffer); + resourceContractService.updateResourceContractInAppRoute(resourceId, contractOffer); jsonObject.put("connectorResponse", clientResponse); response = ResponseEntity.ok(jsonObject.toJSONString()); @@ -142,7 +142,7 @@ public ResponseEntity updateContractForResource(final URI resourceId, } else { ContractOffer contractOffer = null; try { - contractOffer = resourceService.getContractOffer(pattern, contractJson); + contractOffer = resourceContractService.getContractOffer(pattern, contractJson); } catch (JsonProcessingException e) { log.error(e.getMessage()); } @@ -158,7 +158,7 @@ public ResponseEntity updateContractForResource(final URI resourceId, final var connectorResponse = client.updateResourceContract(resourceId.toString(), contract); - resourceService.updateResourceContractInAppRoute(resourceId, contractOffer); + resourceContractService.updateResourceContractInAppRoute(resourceId, contractOffer); jsonObject.put("connectorResponse", connectorResponse); response = ResponseEntity.ok(jsonObject.toJSONString()); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java index 938a9324..f5b9789a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java @@ -3,7 +3,7 @@ import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.isst.configmanager.api.ResourceApi; import de.fraunhofer.isst.configmanager.api.service.BrokerService; -import de.fraunhofer.isst.configmanager.api.service.ResourceService; +import de.fraunhofer.isst.configmanager.api.service.resources.ResourceService; import de.fraunhofer.isst.configmanager.connector.clients.DefaultBrokerClient; import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; import de.fraunhofer.isst.configmanager.util.ValidateApiInput; @@ -273,7 +273,8 @@ public ResponseEntity updateResource(final URI resourceId, final String response = ResponseEntity.ok(jsonObject.toJSONString()); } else { - response = ResponseEntity.status(HttpStatus.NOT_FOUND).body(String.format("No resource with ID %s was found!", resourceId)); + response = ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(String.format("No resource with ID %s was found!", resourceId)); } } catch (IOException e) { log.error(e.getMessage(), e); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java index 02d7ffa8..9a1d1c4b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java @@ -1,18 +1,12 @@ package de.fraunhofer.isst.configmanager.api.controller; -import de.fraunhofer.iais.eis.Artifact; -import de.fraunhofer.iais.eis.ArtifactBuilder; -import de.fraunhofer.iais.eis.IANAMediaTypeBuilder; -import de.fraunhofer.iais.eis.Language; -import de.fraunhofer.iais.eis.RepresentationBuilder; -import de.fraunhofer.iais.eis.RepresentationImpl; -import de.fraunhofer.iais.eis.ResourceImpl; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.api.ResourceRepresentationApi; import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; -import de.fraunhofer.isst.configmanager.api.service.ResourceService; +import de.fraunhofer.isst.configmanager.api.service.resources.ResourceRepresentationService; import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; import de.fraunhofer.isst.configmanager.util.ValidateApiInput; import io.swagger.v3.oas.annotations.tags.Tag; @@ -42,18 +36,18 @@ public class ResourceRepresentationController implements ResourceRepresentationApi { transient ConfigModelService configModelService; - transient ResourceService resourceService; + transient ResourceRepresentationService resourceRepresentationService; transient DefaultResourceClient client; transient Serializer serializer; @Autowired public ResourceRepresentationController(final ConfigModelService configModelService, - final ResourceService resourceService, + final ResourceRepresentationService resourceRepresentationService, final DefaultResourceClient client, final Serializer serializer) { this.client = client; this.configModelService = configModelService; - this.resourceService = resourceService; + this.resourceRepresentationService = resourceRepresentationService; this.serializer = serializer; } @@ -83,7 +77,7 @@ public ResponseEntity createResourceRepresentation(final URI resourceId, if (ValidateApiInput.notValid(resourceId.toString(), sourceType)) { response = ResponseEntity.badRequest().body("All validated parameter have undefined as value!"); } else { - if (resourceService.getResources() == null || resourceService.getResources().isEmpty()) { + if (resourceRepresentationService.getResources() == null || resourceRepresentationService.getResources().isEmpty()) { response = ResponseEntity.status(HttpStatus.NOT_FOUND).body("Could not find any resources!"); } else { final var representation = new RepresentationBuilder() @@ -141,7 +135,7 @@ public ResponseEntity updateResourceRepresentation(final URI resourceId, + filenameExtension + " bytesize: " + bytesize + " sourceType: " + sourceType); ResponseEntity response = null; - final var oldResourceCatalog = (ResourceImpl) resourceService.getResource(resourceId); + final var oldResourceCatalog = (ResourceImpl) resourceRepresentationService.getResource(resourceId); if (oldResourceCatalog != null) { final var oldRepresentationId = oldResourceCatalog.getRepresentation().get(0).getId(); @@ -150,7 +144,7 @@ public ResponseEntity updateResourceRepresentation(final URI resourceId, if (configModelService.getConfigModel().getAppRoute() == null) { log.info("---- [ResourceRepresentationController updateResourceRepresentation] No AppRoute in ConfigModel!"); } else { - final var oldResourceRoute = (ResourceImpl) resourceService.getResourceInAppRoute(resourceId); + final var oldResourceRoute = (ResourceImpl) resourceRepresentationService.getResourceInAppRoute(resourceId); if (oldResourceRoute != null) { oldResourceRoute.setRepresentation(null); } @@ -187,7 +181,7 @@ public ResponseEntity updateResourceRepresentation(final URI resourceId, } } // Update the backend connection to the new endpoint - resourceService.updateBackendConnection(resourceId, endpointId); + resourceRepresentationService.updateBackendConnection(resourceId, endpointId); try { // Update the resource representation in the dataspace connector @@ -231,7 +225,7 @@ public ResponseEntity getResourceRepresentation(final URI representation log.info(">> GET /resource/representation representationId: " + representationId); ResponseEntity response; - final var representation = resourceService.getResourceRepresentationInCatalog(representationId); + final var representation = resourceRepresentationService.getResourceRepresentationInCatalog(representationId); if (representation != null) { try { @@ -262,7 +256,7 @@ public ResponseEntity getResourceRepresentationInJson(final URI resource ResponseEntity response = null; final var representationJson = new JSONObject(); - for (final var resource : resourceService.getResources()) { + for (final var resource : resourceRepresentationService.getResources()) { if (resourceId.equals(resource.getId())) { for (final var representation : resource.getRepresentation()) { if (representationId.equals(representation.getId())) { @@ -300,7 +294,7 @@ public ResponseEntity deleteResourceRepresentation(final URI resourceId, try { final var clientResponse = client.deleteResourceRepresentation(resourceId.toString(), representationId.toString()); - resourceService.deleteResourceRepresentationFromAppRoute(resourceId, representationId); + resourceRepresentationService.deleteResourceRepresentationFromAppRoute(resourceId, representationId); final var jsonObject = new JSONObject(); jsonObject.put("connectorResponse", clientResponse); jsonObject.put("resourceID", resourceId.toString()); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java index 3284f44c..b08ad2bc 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java @@ -1,17 +1,8 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.AppRoute; -import de.fraunhofer.iais.eis.AppRouteBuilder; -import de.fraunhofer.iais.eis.AppRouteImpl; -import de.fraunhofer.iais.eis.BaseConnectorImpl; -import de.fraunhofer.iais.eis.ConfigurationModelImpl; -import de.fraunhofer.iais.eis.ConnectorEndpointBuilder; -import de.fraunhofer.iais.eis.Endpoint; -import de.fraunhofer.iais.eis.ResourceImpl; -import de.fraunhofer.iais.eis.RouteStep; -import de.fraunhofer.iais.eis.RouteStepBuilder; -import de.fraunhofer.iais.eis.RouteStepImpl; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.util.Util; +import de.fraunhofer.isst.configmanager.api.service.resources.ResourceService; import de.fraunhofer.isst.configmanager.model.configlists.CustomAppRepository; import de.fraunhofer.isst.configmanager.model.configlists.EndpointInformationRepository; import de.fraunhofer.isst.configmanager.model.configlists.RouteDeployMethodRepository; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java index 56417cdc..d50d4317 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java @@ -1,6 +1,7 @@ package de.fraunhofer.isst.configmanager.api.service; import de.fraunhofer.iais.eis.Resource; +import de.fraunhofer.isst.configmanager.api.service.resources.ResourceService; import de.fraunhofer.isst.configmanager.model.config.BrokerStatus; import de.fraunhofer.isst.configmanager.model.config.CustomBroker; import de.fraunhofer.isst.configmanager.model.configlists.CustomBrokerRepository; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java index ca956457..88d889d2 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java @@ -1,16 +1,6 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.BaseConnectorBuilder; -import de.fraunhofer.iais.eis.BasicAuthenticationBuilder; -import de.fraunhofer.iais.eis.ConfigurationModel; -import de.fraunhofer.iais.eis.ConfigurationModelBuilder; -import de.fraunhofer.iais.eis.ConfigurationModelImpl; -import de.fraunhofer.iais.eis.ConnectorDeployMode; -import de.fraunhofer.iais.eis.ConnectorStatus; -import de.fraunhofer.iais.eis.LogLevel; -import de.fraunhofer.iais.eis.ProxyBuilder; -import de.fraunhofer.iais.eis.ProxyImpl; -import de.fraunhofer.iais.eis.SecurityProfile; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; import de.fraunhofer.isst.configmanager.model.config.ConfigModelObject; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java index 72b0c90e..d8622da8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java @@ -1,11 +1,6 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.BaseConnector; -import de.fraunhofer.iais.eis.BaseConnectorBuilder; -import de.fraunhofer.iais.eis.BaseConnectorImpl; -import de.fraunhofer.iais.eis.ConfigurationModelImpl; -import de.fraunhofer.iais.eis.ConnectorEndpointBuilder; -import de.fraunhofer.iais.eis.SecurityProfile; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.model.configlists.ConfigModelRepository; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java index 1328e7e8..d92525e9 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java @@ -1,10 +1,6 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.BasicAuthenticationBuilder; -import de.fraunhofer.iais.eis.Endpoint; -import de.fraunhofer.iais.eis.GenericEndpoint; -import de.fraunhofer.iais.eis.GenericEndpointBuilder; -import de.fraunhofer.iais.eis.GenericEndpointImpl; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.isst.configmanager.model.configlists.CustomGenericEndpointList; import de.fraunhofer.isst.configmanager.model.configlists.CustomGenericEndpointRepository; import de.fraunhofer.isst.configmanager.model.customgenericendpoint.CustomGenericEndpointObject; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java deleted file mode 100644 index b96df524..00000000 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java +++ /dev/null @@ -1,911 +0,0 @@ -package de.fraunhofer.isst.configmanager.api.service; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import de.fraunhofer.iais.eis.Action; -import de.fraunhofer.iais.eis.AppRouteImpl; -import de.fraunhofer.iais.eis.BaseConnector; -import de.fraunhofer.iais.eis.BinaryOperator; -import de.fraunhofer.iais.eis.ConstraintBuilder; -import de.fraunhofer.iais.eis.ContractOffer; -import de.fraunhofer.iais.eis.ContractOfferBuilder; -import de.fraunhofer.iais.eis.DigitalContent; -import de.fraunhofer.iais.eis.DutyBuilder; -import de.fraunhofer.iais.eis.Language; -import de.fraunhofer.iais.eis.LeftOperand; -import de.fraunhofer.iais.eis.NotMoreThanNOfferBuilder; -import de.fraunhofer.iais.eis.PermissionBuilder; -import de.fraunhofer.iais.eis.ProhibitionBuilder; -import de.fraunhofer.iais.eis.RepresentationImpl; -import de.fraunhofer.iais.eis.Resource; -import de.fraunhofer.iais.eis.ResourceBuilder; -import de.fraunhofer.iais.eis.ResourceImpl; -import de.fraunhofer.iais.eis.RouteStep; -import de.fraunhofer.iais.eis.RouteStepImpl; -import de.fraunhofer.iais.eis.util.RdfResource; -import de.fraunhofer.iais.eis.util.TypedLiteral; -import de.fraunhofer.iais.eis.util.Util; -import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; -import de.fraunhofer.isst.configmanager.model.configlists.EndpointInformationRepository; -import de.fraunhofer.isst.configmanager.model.endpointinfo.EndpointInformation; -import de.fraunhofer.isst.configmanager.model.usagecontrol.Pattern; -import de.fraunhofer.isst.configmanager.util.CalenderUtil; -import lombok.AccessLevel; -import lombok.experimental.FieldDefaults; -import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.NotNull; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.io.IOException; -import java.net.URI; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Objects; - -/** - * Service class for managing resources. - */ -@Slf4j -@Service -@Transactional -@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -public class ResourceService { - - transient ConfigModelService configModelService; - transient EndpointService endpointService; - transient EndpointInformationRepository endpointInformationRepository; - transient DefaultResourceClient resourceClient; - transient DefaultConnectorClient connectorClient; - - @Autowired - public ResourceService(final ConfigModelService configModelService, - final EndpointService endpointService, - final EndpointInformationRepository endpointInformationRepository, - final DefaultResourceClient resourceClient, - final DefaultConnectorClient connectorClient) { - this.configModelService = configModelService; - this.endpointService = endpointService; - this.endpointInformationRepository = endpointInformationRepository; - this.resourceClient = resourceClient; - this.connectorClient = connectorClient; - } - - /** - * Gets the {@link Resource} of a given resource ID. - * - * @param resourceId of the resource - * @return resource - */ - public Resource getResource(final URI resourceId) { - try { - return getResources().stream() - .dropWhile(res -> !res.getId().equals(resourceId)) - .findFirst() - .orElse(null); - } catch (Exception e) { - log.error(e.getMessage(), e); - return null; - } - } - - /** - * This method updates the content of the resource with the given parameters. - * - * @param title title of the resource - * @param description description of the resource - * @param language the language - * @param keywords the keywords - * @param version the version of the resource - * @param standardlicense the license of the resource - * @param publisher the publisher of the resource - * @param resourceImpl the resource implementation class to set the parameters - */ - public void updateResourceContent(final String title, final String description, - final String language, final List keywords, - final String version, final String standardlicense, - final String publisher, final ResourceImpl resourceImpl) { - if (title != null) { - resourceImpl.setTitle(Util.asList(new TypedLiteral(title))); - } - if (description != null) { - resourceImpl.setDescription(Util.asList(new TypedLiteral(description))); - } - if (language != null) { - resourceImpl.setLanguage(Util.asList(Language.valueOf(language))); - } - if (keywords != null) { - final ArrayList keys = new ArrayList<>(); - final var literal = new TypedLiteral(); - for (final var keyword : keywords) { - literal.setValue(keyword); - keys.add(literal); - } - resourceImpl.setKeyword(keys); - } - if (version != null) { - resourceImpl.setVersion(version); - } - if (standardlicense != null) { - resourceImpl.setStandardLicense(URI.create(standardlicense)); - } - if (publisher != null) { - resourceImpl.setPublisher(URI.create(publisher)); - } - } - - /** - * This method returns a list of all resources from the connector. - * - * @return list of resources from the connector - */ - public List getResources() { - final ArrayList resources = new ArrayList<>(); - - BaseConnector baseConnector = null; - try { - baseConnector = connectorClient.getSelfDeclaration(); - } catch (IOException e) { - log.error(e.getMessage(), e); - } - if (baseConnector != null && baseConnector.getResourceCatalog() != null) { - for (final var resourceCatalog : baseConnector.getResourceCatalog()) { - if (resourceCatalog.getOfferedResource() != null) { - resources.addAll(resourceCatalog.getOfferedResource()); - } - } - } - return resources; - } - - /** - * This method returns all offered resources of a connector as plain json String. - * - * @return list of resources from the connector - */ - public String getOfferedResourcesAsJsonString() { - try { - return resourceClient.getOfferedResourcesAsJsonString(); - } catch (IOException e) { - log.error(e.getMessage(), e); - return null; - } - } - - /** - * This method returns all requested resources of a connector as plain json String. - * - * @return list of resources from the connector - */ - public String getRequestedResourcesAsJsonString() { - try { - return resourceClient.getRequestedResourcesAsJsonString(); - } catch (IOException e) { - log.error(e.getMessage(), e); - return null; - } - } - - /** - * This method updates the resource contract with the given parameters. - * - * @param resourceId id of the resource - * @param contractOffer the contract offer which will be updated - */ - public void updateResourceContractInAppRoute(final URI resourceId, - final ContractOffer contractOffer) { - // Update resource representation in app route - if (configModelService.getConfigModel().getAppRoute() == null) { - log.info("---- [ResourceService updateResourceContractInAppRoute] Could not find any app route"); - } else { - final ArrayList emptyList = new ArrayList<>(); - for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { - - if (appRoute == null) { - continue; - } - - if (appRoute.getAppRouteOutput() != null) { - for (final var resource : appRoute.getAppRouteOutput()) { - if (resourceId.equals(resource.getId())) { - final var resourceImpl = (ResourceImpl) resource; - resourceImpl.setContractOffer(Util.asList(contractOffer)); - log.info("---- [ResourceService updateResourceContractInSubroutes] Updated resource contract in the app route"); - break; - } - } - } - - if (appRoute.getHasSubRoute() == null) { - continue; - } - - for (final var subRoute : appRoute.getHasSubRoute()) { - updateResourceContractInSubroutes(subRoute, emptyList, resourceId, - contractOffer); - } - } - configModelService.saveState(); - } - } - - /** - * @param routeStep route step - * @param visited list of route steps already managed - * @param resourceId id of the resource - * @param contractOffer the contract offer - */ - private void updateResourceContractInSubroutes(final RouteStep routeStep, - final List visited, - final URI resourceId, - final ContractOffer contractOffer) { - - if (routeStep == null) { - return; - } - - if (routeStep.getAppRouteOutput() != null) { - for (final var resource : routeStep.getAppRouteOutput()) { - if (resourceId.equals(resource.getId())) { - final var resourceImpl = (ResourceImpl) resource; - resourceImpl.setContractOffer(Util.asList(contractOffer)); - log.info("---- [ResourceService updateResourceContractInSubroutes] Updated resource contract in the subroute"); - break; - } - } - } - if (routeStep.getHasSubRoute() == null) { - return; - } - for (final var subRoute : routeStep.getHasSubRoute()) { - if (!visited.contains(subRoute)) { - visited.add(routeStep); - updateResourceContractInSubroutes(subRoute, visited, resourceId, contractOffer); - } - } - - } - - /** - * This method returns from a resource the contract offer. - * - * @param resourceId id of the resource - * @return contract offer - */ - public ContractOffer getResourceContract(final URI resourceId) { - for (final var resource : getResources()) { - if (resourceId.equals(resource.getId()) && resource.getContractOffer().get(0) != null) { - return resource.getContractOffer().get(0); - } - } - return null; - } - - /** - * @param representationId id of the representation - * @return representation implementation - */ - public RepresentationImpl getResourceRepresentationInCatalog(final URI representationId) { - return (RepresentationImpl) getResources() - .stream() - .map(DigitalContent::getRepresentation) - .flatMap(Collection::stream) - .filter(representation -> representation.getId().equals(representationId)) - .findAny() - .orElse(null); - } - - /** - * @param resourceId id of the resource - * @param representationId id of the representation to delete - */ - public void deleteResourceRepresentationFromAppRoute(final URI resourceId, - final URI representationId) { - if (configModelService.getConfigModel().getAppRoute() == null) { - log.info("---- [ResourceService deleteResourceRepresentationFromAppRoute] Could not find any app route to delete the resource"); - } else { - final ArrayList emptyList = new ArrayList<>(); - for (final var route : configModelService.getConfigModel().getAppRoute()) { - if (route == null) { - continue; - } - if (route.getAppRouteOutput() != null) { - for (final var resource : route.getAppRouteOutput()) { - if (resource.getRepresentation() != null) { - resource.getRepresentation().removeIf(representation -> - representation.getId().equals(representationId) - ); - } - } - } - if (route.getHasSubRoute() == null) { - continue; - } - - for (final var subRoute : route.getHasSubRoute()) { - deleteRepresentationFromSubRoutes(subRoute, emptyList, resourceId, - representationId); - } - } - } - configModelService.saveState(); - } - - /** - * Delete occurrence of a resource representation with resourceID and representationID from. - * all SubRoutes - * - * @param current current Node in AppRoute - * @param visited already visited AppRoutes - * @param resourceId ID of the Resource for which the representation should be deleted - * @param representationId ID of the Representation to delete - */ - private void deleteRepresentationFromSubRoutes(final RouteStep current, - final List visited, - final URI resourceId, - final URI representationId) { - if (current == null) { - return; - } - if (current.getAppRouteOutput() != null) { - for (final var resource : current.getAppRouteOutput()) { - if (resource.getRepresentation() != null) { - resource.getRepresentation().removeIf(representation -> - representation.getId().equals(representationId) - ); - } - } - } - if (current.getHasSubRoute() == null) { - return; - } - for (final var subRoute : current.getHasSubRoute()) { - if (!visited.contains(subRoute)) { - visited.add(current); - deleteFromSubRoutes(subRoute, visited, resourceId); - } - } - } - - /** - * @param resourceId id of the resource - */ - public void deleteResourceFromAppRoute(final URI resourceId) { - if (configModelService.getConfigModel().getAppRoute() == null) { - log.info("---- [ResourceService deleteResourceFromAppRoute] Could not find any app route to delete the resource"); - } else { - final ArrayList emptyList = new ArrayList<>(); - for (final var route : configModelService.getConfigModel().getAppRoute()) { - if (route == null) { - continue; - } - if (route.getAppRouteOutput() != null) { - route.getAppRouteOutput().removeIf(resource -> resource.getId().equals(resourceId)); - } - if (route.getHasSubRoute() == null) { - continue; - } - - for (final var subRoute : route.getHasSubRoute()) { - deleteFromSubRoutes(subRoute, emptyList, resourceId); - } - } - } - configModelService.saveState(); - } - - /** - * Delete occurrence of a resource with resourceID from all SubRoutes. - * - * @param current current Node in AppRoute - * @param visited already visited AppRoutes - * @param resourceId ID of the Resource to delete - */ - private void deleteFromSubRoutes(final RouteStep current, final List visited, - final URI resourceId) { - if (current == null) { - return; - } - if (current.getAppRouteOutput() != null) { - current.getAppRouteOutput().removeIf(resource -> resource.getId().equals(resourceId)); - } - if (current.getHasSubRoute() == null) { - return; - } - for (final var subRoute : current.getHasSubRoute()) { - if (!visited.contains(subRoute)) { - visited.add(current); - deleteFromSubRoutes(subRoute, visited, resourceId); - } - } - } - - /** - * @param title title of the resource - * @param description description of the resource - * @param language language of the resource - * @param keywords keywords for the resource - * @param version version of the resource - * @param standardlicense standard license for the resource - * @param publisher the publisher of the resource - * @return resource implementation - */ - public ResourceImpl createResource(final String title, final String description, - final String language, final List keywords, - final String version, final String standardlicense, - final String publisher) { - - final ArrayList keys = new ArrayList<>(); - final var literal = new TypedLiteral(); - for (final var keyword : keywords) { - literal.setValue(keyword); - keys.add(literal); - } - - // Create the resource with the given parameters - return (ResourceImpl) new ResourceBuilder() - ._title_(Util.asList(new TypedLiteral(title))) - ._description_(Util.asList(new TypedLiteral(description))) - ._language_(Util.asList(Language.valueOf(language))) - ._keyword_(keys) - ._version_(version) - ._standardLicense_(URI.create(standardlicense)) - ._publisher_(URI.create(publisher)) - ._created_(CalenderUtil.getGregorianNow()) - ._modified_(CalenderUtil.getGregorianNow()) - .build(); - } - - public ResourceImpl updateResource(final URI resourceId, final String title, - final String description, final String language, - final List keywords, final String version, - final String standardlicense, final String publisher) { - //Get a Resource and update if it exists - for (final var resource : getResources()) { - if (resource.getId().equals(resourceId)) { - final var resImpl = (ResourceImpl) resource; - updateResourceContent(title, description, language, keywords, version, - standardlicense, publisher, resImpl); - return resImpl; - } - } - return null; - } - - /** - * @param newResource new resource old version should be replaced with - */ - public void updateResourceInAppRoute(final ResourceImpl newResource) { - // Update the resource in the app route - if (configModelService.getConfigModel().getAppRoute() == null) { - log.info("---- [ResourceService updateResourceInAppRoute] Could not find any app route to update the resource"); - } else { - final ArrayList emptyList = new ArrayList<>(); - for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { - - if (appRoute == null) { - continue; - } - - if (appRoute.getAppRouteOutput() != null) { - for (final var resource : appRoute.getAppRouteOutput()) { - if (newResource.getId().equals(resource.getId())) { - final ArrayList output = - (ArrayList) appRoute.getAppRouteOutput(); - output.remove(resource); - output.add(newResource); - log.info("---- [ResourceService updateResourceInAppRoute] Updated resource in app route"); - break; - } - } - } - - if (appRoute.getHasSubRoute() == null) { - continue; - } - - for (final var subRoute : appRoute.getHasSubRoute()) { - updateResourceInSubroutes(subRoute, emptyList, newResource); - } - } - configModelService.saveState(); - } - } - - /** - * @param routeStep routestep - * @param visited list of route steps already managed - * @param newResource new resource old version should be replaced with - */ - private void updateResourceInSubroutes(final RouteStep routeStep, - final List visited, - final ResourceImpl newResource) { - - if (routeStep == null) { - return; - } - if (routeStep.getAppRouteOutput() != null) { - for (final var resource : routeStep.getAppRouteOutput()) { - if (newResource.getId().equals(resource.getId())) { - final ArrayList output = - (ArrayList) routeStep.getAppRouteOutput(); - output.remove(resource); - output.add(newResource); - log.info("---- [ResourceService updateResourceInAppRoute] Updated resource in subroute"); - break; - } - } - } - if (routeStep.getHasSubRoute() == null) { - return; - } - for (final var subRoute : routeStep.getHasSubRoute()) { - if (!visited.contains(subRoute)) { - visited.add(routeStep); - updateResourceInSubroutes(subRoute, visited, newResource); - } - } - } - - /** - * This method updates a backend connection. - * - * @param resourceId id of the resource - * @param endpointId id of the endpoint - */ - public void updateBackendConnection(final URI resourceId, final URI endpointId) { - if (configModelService.getConfigModel().getAppRoute() != null) { - RouteStepImpl foundRouteStep = null; - AppRouteImpl appRouteImpl = null; - for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { - for (final var routeStep : appRoute.getHasSubRoute()) { - for (final var resource : routeStep.getAppRouteOutput()) { - if (resourceId.equals(resource.getId())) { - appRouteImpl = (AppRouteImpl) appRoute; - foundRouteStep = (RouteStepImpl) routeStep; - break; - } - } - } - } - - // Set app route start and subroute start to the updated endpoint - if (appRouteImpl != null) { - final var endpoint = endpointService.getGenericEndpoint(endpointId); - if (endpoint != null) { - appRouteImpl.setAppRouteStart(Util.asList(endpoint)); - foundRouteStep.setAppRouteStart(Util.asList(endpoint)); - } - } - } - - // Set first entry of endpoint informations to the new endpoint - if (endpointInformationRepository.findAll().size() > 0) { - final var endpointInfo = endpointInformationRepository.findAll().get(0); - endpointInfo.setEndpointId(endpointId.toString()); - endpointInformationRepository.saveAndFlush(endpointInfo); - } else { - final var endpointInformation = new EndpointInformation(); - endpointInformation.setEndpointId(endpointId.toString()); - endpointInformationRepository.saveAndFlush(endpointInformation); - } - } - - /** - * This method returns the resource if it is exists in an app route. - * - * @param resourceId id of the resource - * @return resource - */ - public Resource getResourceInAppRoute(final URI resourceId) { - - Resource foundResource = null; - final ArrayList emptyList = new ArrayList<>(); - for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { - - if (appRoute == null) { - continue; - } - - if (appRoute.getAppRouteOutput() != null) { - for (final var resource : appRoute.getAppRouteOutput()) { - if (resourceId.equals(resource.getId())) { - foundResource = resource; - log.info("---- [ResourceService getResourceInAppRoute] Resource is found in the app route"); - break; - } - } - } - - if (appRoute.getHasSubRoute() == null) { - continue; - } - - for (final var subRoute : appRoute.getHasSubRoute()) { - foundResource = getResourceInSubroutes(subRoute, emptyList, resourceId); - } - - } - if (foundResource == null) { - log.info("---- [ResourceService getResourceInAppRoute] Could not find any resource in app routes and subroutes"); - } - - return foundResource; - } - - /** - * @param routeStep routestep - * @param visited list of route steps already visited - * @param resourceId id of the resource - * @return resource - */ - private Resource getResourceInSubroutes(final RouteStep routeStep, - final List visited, - final URI resourceId) { - - Resource foundResource = null; - - if (routeStep == null) { - return null; - } - if (routeStep.getAppRouteOutput() != null) { - for (final var resource : routeStep.getAppRouteOutput()) { - if (resourceId.equals(resource.getId())) { - foundResource = resource; - log.info("---- [ResourceService getResourceInSubroutes] Resource is found in subroute"); - break; - } - } - } - - if (!routeStep.getHasSubRoute().isEmpty()) { - for (final var subRoute : routeStep.getHasSubRoute()) { - if (!visited.contains(subRoute)) { - visited.add(routeStep); - foundResource = getResourceInSubroutes(subRoute, visited, resourceId); - } - } - } - - return foundResource; - } - - /** - * @param pattern pattern to create appropriate contract offer - * @param contractJson the request body which holds the necessary information - * @return contract offer - */ - public ContractOffer getContractOffer(final Pattern pattern, final String contractJson) throws JsonProcessingException { - ContractOffer contractOffer = null; - - switch (pattern) { - case PROVIDE_ACCESS: - contractOffer = buildProvideAccess(); - break; - case PROHIBIT_ACCESS: - contractOffer = buildProhibitAccess(); - break; - case N_TIMES_USAGE: - if (contractJson != null && !contractJson.equals("{}")) { - final var jsonNode = getJsonNodeFromContract(contractJson); - - final var binaryOperator = getBinaryOperator(jsonNode); - final var number = jsonNode.get("number").asText(); - final var pipEndpoint = jsonNode.get("pipendpoint").asText(); - - contractOffer = buildNTimesUsage(binaryOperator, number, pipEndpoint); - break; - } - case DURATION_USAGE: - if (contractJson != null && !contractJson.equals("{}")) { - final var jsonNode = getJsonNodeFromContract(contractJson); - final var number = jsonNode.get("number").asText(); - - contractOffer = buildDurationUsage(number); - break; - } - case USAGE_NOTIFICATION: - if (contractJson != null && !contractJson.equals("{}")) { - final var jsonNode = getJsonNodeFromContract(contractJson); - final var url = jsonNode.get("url").asText(); - - contractOffer = buidUsageNotification(url); - break; - } - case USAGE_LOGGING: - contractOffer = buildUsageLogging(); - break; - - case USAGE_DURING_INTERVAL: - if (contractJson != null && !contractJson.equals("{}")) { - final var jsonNode = getJsonNodeFromContract(contractJson); - final var fromDate = jsonNode.get("fromDate").asText(); - final var toDate = jsonNode.get("toDate").asText(); - - contractOffer = buildUsageDuringInterval(fromDate, toDate); - break; - } - case USAGE_UNTIL_DELETION: - if (contractJson != null && !contractJson.equals("{}")) { - final var jsonNode = getJsonNodeFromContract(contractJson); - final var startDate = jsonNode.get("startDate").asText(); - final var endDate = jsonNode.get("endDate").asText(); - final var deletionDate = jsonNode.get("deletionDate").asText(); - - contractOffer = buildUsageUntilDeletion(startDate, endDate, deletionDate); - break; - } - default: - break; - } - return contractOffer; - } - - private ContractOffer buildUsageUntilDeletion(final String startDate, - final String endDate, - final String deletionDate) { - return new ContractOfferBuilder() - ._permission_(Util.asList(new PermissionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("usage-until-deletion"))) - ._action_(Util.asList(Action.USE)) - ._constraint_(Util.asList(new ConstraintBuilder() - ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) - ._operator_(BinaryOperator.AFTER) - ._rightOperand_(new RdfResource(startDate, - URI.create("xsd:dateTimeStamp"))) - .build(), new ConstraintBuilder() - ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) - ._operator_(BinaryOperator.BEFORE) - ._rightOperand_(new RdfResource(endDate, - URI.create("xsd:dateTimeStamp"))) - .build())) - ._postDuty_(Util.asList(new DutyBuilder() - ._action_(Util.asList(Action.DELETE)) - ._constraint_(Util.asList(new ConstraintBuilder() - ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) - ._operator_(BinaryOperator.TEMPORAL_EQUALS) - ._rightOperand_(new RdfResource(deletionDate, - URI.create("xsd:dateTimeStamp"))) - .build())) - .build())) - .build())) - .build(); - } - - private ContractOffer buildUsageDuringInterval(final String fromDate, - final String toDate) { - return new ContractOfferBuilder() - ._permission_(Util.asList(new PermissionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("usage-during-interval"))) - ._action_(Util.asList(Action.USE)) - ._constraint_(Util.asList(new ConstraintBuilder() - ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) - ._operator_(BinaryOperator.AFTER) - ._rightOperand_(new RdfResource(fromDate, - URI.create("xsd:dateTimeStamp"))) - .build(), new ConstraintBuilder() - ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) - ._operator_(BinaryOperator.BEFORE) - ._rightOperand_(new RdfResource(toDate, - URI.create("xsd:dateTimeStamp"))) - .build())) - .build())) - .build(); - } - - private ContractOffer buildUsageLogging() { - return new ContractOfferBuilder() - ._permission_(Util.asList(new PermissionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("usage-logging"))) - ._action_(Util.asList(Action.USE)) - ._postDuty_(Util.asList(new DutyBuilder() - ._action_(Util.asList(Action.LOG)) - .build())) - .build())) - .build(); - } - - private ContractOffer buidUsageNotification(final String url) { - return new ContractOfferBuilder() - ._permission_(Util.asList(new PermissionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("usage-notification"))) - ._action_(Util.asList(Action.USE)) - ._postDuty_(Util.asList(new DutyBuilder() - ._action_(Util.asList(Action.NOTIFY)) - ._constraint_(Util.asList(new ConstraintBuilder() - ._leftOperand_(LeftOperand.ENDPOINT) - ._operator_(BinaryOperator.DEFINES_AS) - ._rightOperand_( - new RdfResource(url, URI.create("xsd:anyURI"))) - .build())) - .build())) - .build())) - .build(); - } - - private ContractOffer buildDurationUsage(final String number) { - return new ContractOfferBuilder() - ._permission_(Util.asList(new PermissionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("duration-usage"))) - ._action_(Util.asList(Action.USE)) - ._constraint_(Util.asList(new ConstraintBuilder() - ._leftOperand_(LeftOperand.ELAPSED_TIME) - ._operator_(BinaryOperator.SHORTER_EQ) - ._rightOperand_(new RdfResource(number, URI.create("xsd:duration"))) - .build())) - .build())) - .build(); - } - - @NotNull - private BinaryOperator getBinaryOperator(final JsonNode jsonNode) { - final var operator = jsonNode.get("binaryoperator").asText(); - - BinaryOperator binaryOperator; - if ("<".equals(operator)) { - binaryOperator = BinaryOperator.LT; - } else if ("<=".equals(operator)) { - binaryOperator = BinaryOperator.LTEQ; - } else { - binaryOperator = BinaryOperator.EQ; - } - return binaryOperator; - } - - private ContractOffer buildNTimesUsage(final BinaryOperator binaryOperator, - final String number, - final String pipEndpoint) { - return new NotMoreThanNOfferBuilder() - ._permission_(Util.asList(new PermissionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("n-times-usage"))) - ._action_(Util.asList(Action.USE)) - ._constraint_(Util.asList(new ConstraintBuilder() - ._leftOperand_(LeftOperand.COUNT) - ._operator_(binaryOperator) - ._rightOperand_(new RdfResource(number, URI.create("xsd:double"))) - ._pipEndpoint_( - URI.create(pipEndpoint)) - .build())) - .build())) - .build(); - } - - private ContractOffer buildProhibitAccess() { - return new ContractOfferBuilder() - ._prohibition_(Util.asList(new ProhibitionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("prohibit-access"))) - ._action_(Util.asList(Action.USE)) - .build())) - .build(); - } - - private ContractOffer buildProvideAccess() { - return new ContractOfferBuilder() - ._permission_(Util.asList(new PermissionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("provide-access"))) - ._action_(Util.asList(Action.USE)) - .build())) - .build(); - } - - /** - * @param contractJson the contract offer - * @return json node - */ - private JsonNode getJsonNodeFromContract(final String contractJson) throws JsonProcessingException { - final var mapper = new ObjectMapper(); - return mapper.readTree(Objects.requireNonNull(contractJson)); - } -} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java index 8e5b24be..bd4f2316 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java @@ -1,10 +1,6 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.ConnectorDeployMode; -import de.fraunhofer.iais.eis.ConnectorStatus; -import de.fraunhofer.iais.eis.Language; -import de.fraunhofer.iais.eis.LogLevel; -import de.fraunhofer.iais.eis.SecurityProfile; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.BackendSource; import de.fraunhofer.isst.configmanager.model.config.BrokerStatus; import de.fraunhofer.isst.configmanager.model.routedeploymethod.DeployMethod; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/AbstractResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/AbstractResourceService.java new file mode 100644 index 00000000..dbcfee4a --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/AbstractResourceService.java @@ -0,0 +1,101 @@ +package de.fraunhofer.isst.configmanager.api.service.resources; + +import de.fraunhofer.iais.eis.BaseConnector; +import de.fraunhofer.iais.eis.Resource; +import de.fraunhofer.iais.eis.RouteStep; +import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +@FieldDefaults(level = AccessLevel.PROTECTED) +@Service +public abstract class AbstractResourceService { + + transient ConfigModelService configModelService; + transient DefaultConnectorClient connectorClient; + + @Autowired + public AbstractResourceService(final ConfigModelService configModelService, + final DefaultConnectorClient connectorClient) { + this.configModelService = configModelService; + this.connectorClient = connectorClient; + } + + /** + * Gets the {@link Resource} of a given resource ID. + * + * @param resourceId of the resource + * @return resource + */ + public Resource getResource(final URI resourceId) { + try { + return getResources().stream() + .dropWhile(res -> !res.getId().equals(resourceId)) + .findFirst() + .orElse(null); + } catch (Exception e) { + log.error(e.getMessage(), e); + return null; + } + } + + /** + * This method returns a list of all resources from the connector. + * + * @return list of resources from the connector + */ + public List getResources() { + final ArrayList resources = new ArrayList<>(); + + BaseConnector baseConnector = null; + try { + baseConnector = connectorClient.getSelfDeclaration(); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + if (baseConnector != null && baseConnector.getResourceCatalog() != null) { + for (final var resourceCatalog : baseConnector.getResourceCatalog()) { + if (resourceCatalog.getOfferedResource() != null) { + resources.addAll(resourceCatalog.getOfferedResource()); + } + } + } + return resources; + } + + /** + * Delete occurrence of a resource with resourceID from all SubRoutes. + * + * @param current current Node in AppRoute + * @param visited already visited AppRoutes + * @param resourceId ID of the Resource to delete + */ + public void deleteFromSubRoutes(final RouteStep current, final List visited, + final URI resourceId) { + if (current == null) { + return; + } + if (current.getAppRouteOutput() != null) { + current.getAppRouteOutput().removeIf(resource -> resource.getId().equals(resourceId)); + } + if (current.getHasSubRoute() == null) { + return; + } + for (final var subRoute : current.getHasSubRoute()) { + if (!visited.contains(subRoute)) { + visited.add(current); + deleteFromSubRoutes(subRoute, visited, resourceId); + } + } + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java new file mode 100644 index 00000000..4ace4ea5 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java @@ -0,0 +1,182 @@ +package de.fraunhofer.isst.configmanager.api.service.resources; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.util.RdfResource; +import de.fraunhofer.iais.eis.util.TypedLiteral; +import de.fraunhofer.iais.eis.util.Util; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Service; + +import java.net.URI; +import java.util.Objects; + +@Service +public class ResourceContractBuilder { + + public ContractOffer buildUsageUntilDeletion(final String startDate, + final String endDate, + final String deletionDate) { + return new ContractOfferBuilder() + ._permission_(Util.asList(new PermissionBuilder() + ._title_(Util.asList(new TypedLiteral("Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("usage-until-deletion"))) + ._action_(Util.asList(Action.USE)) + ._constraint_(Util.asList(new ConstraintBuilder() + ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) + ._operator_(BinaryOperator.AFTER) + ._rightOperand_(new RdfResource(startDate, + URI.create("xsd:dateTimeStamp"))) + .build(), new ConstraintBuilder() + ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) + ._operator_(BinaryOperator.BEFORE) + ._rightOperand_(new RdfResource(endDate, + URI.create("xsd:dateTimeStamp"))) + .build())) + ._postDuty_(Util.asList(new DutyBuilder() + ._action_(Util.asList(Action.DELETE)) + ._constraint_(Util.asList(new ConstraintBuilder() + ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) + ._operator_(BinaryOperator.TEMPORAL_EQUALS) + ._rightOperand_(new RdfResource(deletionDate, + URI.create("xsd:dateTimeStamp"))) + .build())) + .build())) + .build())) + .build(); + } + + public ContractOffer buildUsageDuringInterval(final String fromDate, + final String toDate) { + return new ContractOfferBuilder() + ._permission_(Util.asList(new PermissionBuilder() + ._title_(Util.asList(new TypedLiteral("Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("usage-during-interval"))) + ._action_(Util.asList(Action.USE)) + ._constraint_(Util.asList(new ConstraintBuilder() + ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) + ._operator_(BinaryOperator.AFTER) + ._rightOperand_(new RdfResource(fromDate, + URI.create("xsd:dateTimeStamp"))) + .build(), new ConstraintBuilder() + ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) + ._operator_(BinaryOperator.BEFORE) + ._rightOperand_(new RdfResource(toDate, + URI.create("xsd:dateTimeStamp"))) + .build())) + .build())) + .build(); + } + + public ContractOffer buildUsageLogging() { + return new ContractOfferBuilder() + ._permission_(Util.asList(new PermissionBuilder() + ._title_(Util.asList(new TypedLiteral("Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("usage-logging"))) + ._action_(Util.asList(Action.USE)) + ._postDuty_(Util.asList(new DutyBuilder() + ._action_(Util.asList(Action.LOG)) + .build())) + .build())) + .build(); + } + + public ContractOffer buidUsageNotification(final String url) { + return new ContractOfferBuilder() + ._permission_(Util.asList(new PermissionBuilder() + ._title_(Util.asList(new TypedLiteral("Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("usage-notification"))) + ._action_(Util.asList(Action.USE)) + ._postDuty_(Util.asList(new DutyBuilder() + ._action_(Util.asList(Action.NOTIFY)) + ._constraint_(Util.asList(new ConstraintBuilder() + ._leftOperand_(LeftOperand.ENDPOINT) + ._operator_(BinaryOperator.DEFINES_AS) + ._rightOperand_( + new RdfResource(url, URI.create("xsd:anyURI"))) + .build())) + .build())) + .build())) + .build(); + } + + public ContractOffer buildDurationUsage(final String number) { + return new ContractOfferBuilder() + ._permission_(Util.asList(new PermissionBuilder() + ._title_(Util.asList(new TypedLiteral("Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("duration-usage"))) + ._action_(Util.asList(Action.USE)) + ._constraint_(Util.asList(new ConstraintBuilder() + ._leftOperand_(LeftOperand.ELAPSED_TIME) + ._operator_(BinaryOperator.SHORTER_EQ) + ._rightOperand_(new RdfResource(number, URI.create("xsd:duration"))) + .build())) + .build())) + .build(); + } + + @NotNull + public BinaryOperator getBinaryOperator(final JsonNode jsonNode) { + final var operator = jsonNode.get("binaryoperator").asText(); + + BinaryOperator binaryOperator; + if ("<".equals(operator)) { + binaryOperator = BinaryOperator.LT; + } else if ("<=".equals(operator)) { + binaryOperator = BinaryOperator.LTEQ; + } else { + binaryOperator = BinaryOperator.EQ; + } + return binaryOperator; + } + + public ContractOffer buildNTimesUsage(final BinaryOperator binaryOperator, + final String number, + final String pipEndpoint) { + return new NotMoreThanNOfferBuilder() + ._permission_(Util.asList(new PermissionBuilder() + ._title_(Util.asList(new TypedLiteral("Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("n-times-usage"))) + ._action_(Util.asList(Action.USE)) + ._constraint_(Util.asList(new ConstraintBuilder() + ._leftOperand_(LeftOperand.COUNT) + ._operator_(binaryOperator) + ._rightOperand_(new RdfResource(number, URI.create("xsd:double"))) + ._pipEndpoint_( + URI.create(pipEndpoint)) + .build())) + .build())) + .build(); + } + + public ContractOffer buildProhibitAccess() { + return new ContractOfferBuilder() + ._prohibition_(Util.asList(new ProhibitionBuilder() + ._title_(Util.asList(new TypedLiteral("Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("prohibit-access"))) + ._action_(Util.asList(Action.USE)) + .build())) + .build(); + } + + public ContractOffer buildProvideAccess() { + return new ContractOfferBuilder() + ._permission_(Util.asList(new PermissionBuilder() + ._title_(Util.asList(new TypedLiteral("Usage Policy"))) + ._description_(Util.asList(new TypedLiteral("provide-access"))) + ._action_(Util.asList(Action.USE)) + .build())) + .build(); + } + + /** + * @param contractJson the contract offer + * @return json node + */ + public JsonNode getJsonNodeFromContract(final String contractJson) throws JsonProcessingException { + final var mapper = new ObjectMapper(); + return mapper.readTree(Objects.requireNonNull(contractJson)); + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java new file mode 100644 index 00000000..df4b6d62 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java @@ -0,0 +1,204 @@ +package de.fraunhofer.isst.configmanager.api.service.resources; + +import com.fasterxml.jackson.core.JsonProcessingException; +import de.fraunhofer.iais.eis.ContractOffer; +import de.fraunhofer.iais.eis.ResourceImpl; +import de.fraunhofer.iais.eis.RouteStep; +import de.fraunhofer.iais.eis.util.Util; +import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; +import de.fraunhofer.isst.configmanager.model.usagecontrol.Pattern; +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.net.URI; +import java.util.ArrayList; +import java.util.List; + +/** + * Service class for managing resource contracts. + */ +@Slf4j +@Service +@Transactional +@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) +public class ResourceContractService extends AbstractResourceService { + + transient ResourceContractBuilder resourceContractBuilder; + + @Autowired + public ResourceContractService(final ConfigModelService configModelService, + final DefaultConnectorClient connectorClient, + final ResourceContractBuilder resourceContractBuilder) { + + super(configModelService, connectorClient); + this.resourceContractBuilder = resourceContractBuilder; + } + + /** + * This method returns from a resource the contract offer. + * + * @param resourceId id of the resource + * @return contract offer + */ + public ContractOffer getResourceContract(final URI resourceId) { + for (final var resource : getResources()) { + if (resourceId.equals(resource.getId()) && resource.getContractOffer().get(0) != null) { + return resource.getContractOffer().get(0); + } + } + return null; + } + + /** + * This method updates the resource contract with the given parameters. + * + * @param resourceId id of the resource + * @param contractOffer the contract offer which will be updated + */ + public void updateResourceContractInAppRoute(final URI resourceId, + final ContractOffer contractOffer) { + // Update resource representation in app route + if (configModelService.getConfigModel().getAppRoute() == null) { + log.info("---- [ResourceService updateResourceContractInAppRoute] Could not find any app route"); + } else { + final ArrayList emptyList = new ArrayList<>(); + for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { + + if (appRoute == null) { + continue; + } + if (appRoute.getAppRouteOutput() != null) { + for (final var resource : appRoute.getAppRouteOutput()) { + if (resourceId.equals(resource.getId())) { + final var resourceImpl = (ResourceImpl) resource; + resourceImpl.setContractOffer(Util.asList(contractOffer)); + log.info("---- [ResourceService updateResourceContractInSubroutes] Updated" + + " resource contract in the app route"); + break; + } + } + } + if (appRoute.getHasSubRoute() == null) { + continue; + } + for (final var subRoute : appRoute.getHasSubRoute()) { + updateResourceContractInSubroutes(subRoute, emptyList, resourceId, + contractOffer); + } + } + configModelService.saveState(); + } + } + + /** + * @param routeStep route step + * @param visited list of route steps already managed + * @param resourceId id of the resource + * @param contractOffer the contract offer + */ + private void updateResourceContractInSubroutes(final RouteStep routeStep, + final List visited, + final URI resourceId, + final ContractOffer contractOffer) { + if (routeStep == null) { + return; + } + if (routeStep.getAppRouteOutput() != null) { + for (final var resource : routeStep.getAppRouteOutput()) { + if (resourceId.equals(resource.getId())) { + final var resourceImpl = (ResourceImpl) resource; + resourceImpl.setContractOffer(Util.asList(contractOffer)); + log.info("---- [ResourceService updateResourceContractInSubroutes] Updated resource" + + " contract in the subroute"); + break; + } + } + } + if (routeStep.getHasSubRoute() == null) { + return; + } + for (final var subRoute : routeStep.getHasSubRoute()) { + if (!visited.contains(subRoute)) { + visited.add(routeStep); + updateResourceContractInSubroutes(subRoute, visited, resourceId, contractOffer); + } + } + } + + /** + * @param pattern pattern to create appropriate contract offer + * @param contractJson the request body which holds the necessary information + * @return contract offer + */ + public ContractOffer getContractOffer(final Pattern pattern, final String contractJson) throws JsonProcessingException { + ContractOffer contractOffer = null; + + switch (pattern) { + case PROVIDE_ACCESS: + contractOffer = resourceContractBuilder.buildProvideAccess(); + break; + case PROHIBIT_ACCESS: + contractOffer = resourceContractBuilder.buildProhibitAccess(); + break; + case N_TIMES_USAGE: + if (contractJson != null && !contractJson.equals("{}")) { + final var jsonNode = resourceContractBuilder.getJsonNodeFromContract(contractJson); + + final var binaryOperator = resourceContractBuilder.getBinaryOperator(jsonNode); + final var number = jsonNode.get("number").asText(); + final var pipEndpoint = jsonNode.get("pipendpoint").asText(); + + contractOffer = resourceContractBuilder.buildNTimesUsage(binaryOperator, number, pipEndpoint); + break; + } + case DURATION_USAGE: + if (contractJson != null && !contractJson.equals("{}")) { + final var jsonNode = resourceContractBuilder.getJsonNodeFromContract(contractJson); + final var number = jsonNode.get("number").asText(); + + contractOffer = resourceContractBuilder.buildDurationUsage(number); + break; + } + case USAGE_NOTIFICATION: + if (contractJson != null && !contractJson.equals("{}")) { + final var jsonNode = resourceContractBuilder.getJsonNodeFromContract(contractJson); + final var url = jsonNode.get("url").asText(); + + contractOffer = resourceContractBuilder.buidUsageNotification(url); + break; + } + case USAGE_LOGGING: + contractOffer = resourceContractBuilder.buildUsageLogging(); + break; + + case USAGE_DURING_INTERVAL: + if (contractJson != null && !contractJson.equals("{}")) { + final var jsonNode = resourceContractBuilder.getJsonNodeFromContract(contractJson); + final var fromDate = jsonNode.get("fromDate").asText(); + final var toDate = jsonNode.get("toDate").asText(); + + contractOffer = resourceContractBuilder.buildUsageDuringInterval(fromDate, toDate); + break; + } + case USAGE_UNTIL_DELETION: + if (contractJson != null && !contractJson.equals("{}")) { + final var jsonNode = resourceContractBuilder.getJsonNodeFromContract(contractJson); + final var startDate = jsonNode.get("startDate").asText(); + final var endDate = jsonNode.get("endDate").asText(); + final var deletionDate = jsonNode.get("deletionDate").asText(); + + contractOffer = resourceContractBuilder.buildUsageUntilDeletion(startDate, endDate, deletionDate); + break; + } + default: + break; + } + return contractOffer; + } + +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java new file mode 100644 index 00000000..537eab7c --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java @@ -0,0 +1,245 @@ +package de.fraunhofer.isst.configmanager.api.service.resources; + +import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.util.Util; +import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; +import de.fraunhofer.isst.configmanager.api.service.EndpointService; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; +import de.fraunhofer.isst.configmanager.model.configlists.EndpointInformationRepository; +import de.fraunhofer.isst.configmanager.model.endpointinfo.EndpointInformation; +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.net.URI; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + + +/** + * Service class for managing resource representations. + */ +@Slf4j +@Service +@Transactional +@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) +public class ResourceRepresentationService extends AbstractResourceService { + + transient EndpointService endpointService; + transient EndpointInformationRepository endpointInformationRepository; + + @Autowired + public ResourceRepresentationService(final ConfigModelService configModelService, + final DefaultConnectorClient connectorClient, + final EndpointService endpointService, + final EndpointInformationRepository endpointInformationRepository) { + super(configModelService, connectorClient); + this.endpointService = endpointService; + this.endpointInformationRepository = endpointInformationRepository; + } + + /** + * @param representationId id of the representation + * @return representation implementation + */ + public RepresentationImpl getResourceRepresentationInCatalog(final URI representationId) { + return (RepresentationImpl) getResources() + .stream() + .map(DigitalContent::getRepresentation) + .flatMap(Collection::stream) + .filter(representation -> representation.getId().equals(representationId)) + .findAny() + .orElse(null); + } + + /** + * @param resourceId id of the resource + * @param representationId id of the representation to delete + */ + public void deleteResourceRepresentationFromAppRoute(final URI resourceId, + final URI representationId) { + if (configModelService.getConfigModel().getAppRoute() == null) { + log.info("---- [ResourceService deleteResourceRepresentationFromAppRoute] Could not find" + + " any app route to delete the resource"); + } else { + final ArrayList emptyList = new ArrayList<>(); + for (final var route : configModelService.getConfigModel().getAppRoute()) { + if (route == null) { + continue; + } + if (route.getAppRouteOutput() != null) { + for (final var resource : route.getAppRouteOutput()) { + if (resource.getRepresentation() != null) { + resource.getRepresentation().removeIf(representation -> + representation.getId().equals(representationId) + ); + } + } + } + if (route.getHasSubRoute() == null) { + continue; + } + for (final var subRoute : route.getHasSubRoute()) { + deleteRepresentationFromSubRoutes(subRoute, emptyList, resourceId, + representationId); + } + } + } + configModelService.saveState(); + } + + /** + * Delete occurrence of a resource representation with resourceID and representationID from. + * all SubRoutes + * + * @param current current Node in AppRoute + * @param visited already visited AppRoutes + * @param resourceId ID of the Resource for which the representation should be deleted + * @param representationId ID of the Representation to delete + */ + private void deleteRepresentationFromSubRoutes(final RouteStep current, + final List visited, + final URI resourceId, + final URI representationId) { + if (current == null) { + return; + } + if (current.getAppRouteOutput() != null) { + for (final var resource : current.getAppRouteOutput()) { + if (resource.getRepresentation() != null) { + resource.getRepresentation().removeIf(representation -> + representation.getId().equals(representationId) + ); + } + } + } + if (current.getHasSubRoute() == null) { + return; + } + for (final var subRoute : current.getHasSubRoute()) { + if (!visited.contains(subRoute)) { + visited.add(current); + deleteFromSubRoutes(subRoute, visited, resourceId); + } + } + } + + /** + * This method updates a backend connection. + * + * @param resourceId id of the resource + * @param endpointId id of the endpoint + */ + public void updateBackendConnection(final URI resourceId, final URI endpointId) { + if (configModelService.getConfigModel().getAppRoute() != null) { + RouteStepImpl foundRouteStep = null; + AppRouteImpl appRouteImpl = null; + for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { + for (final var routeStep : appRoute.getHasSubRoute()) { + for (final var resource : routeStep.getAppRouteOutput()) { + if (resourceId.equals(resource.getId())) { + appRouteImpl = (AppRouteImpl) appRoute; + foundRouteStep = (RouteStepImpl) routeStep; + break; + } + } + } + } + + // Set app route start and subroute start to the updated endpoint + if (appRouteImpl != null) { + final var endpoint = endpointService.getGenericEndpoint(endpointId); + if (endpoint != null) { + appRouteImpl.setAppRouteStart(Util.asList(endpoint)); + foundRouteStep.setAppRouteStart(Util.asList(endpoint)); + } + } + } + + // Set first entry of endpoint informations to the new endpoint + if (endpointInformationRepository.findAll().size() > 0) { + final var endpointInfo = endpointInformationRepository.findAll().get(0); + endpointInfo.setEndpointId(endpointId.toString()); + endpointInformationRepository.saveAndFlush(endpointInfo); + } else { + final var endpointInformation = new EndpointInformation(); + endpointInformation.setEndpointId(endpointId.toString()); + endpointInformationRepository.saveAndFlush(endpointInformation); + } + } + + /** + * This method returns the resource if it is exists in an app route. + * + * @param resourceId id of the resource + * @return resource + */ + public Resource getResourceInAppRoute(final URI resourceId) { + + Resource foundResource = null; + final ArrayList emptyList = new ArrayList<>(); + for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { + + if (appRoute == null) { + continue; + } + if (appRoute.getAppRouteOutput() != null) { + for (final var resource : appRoute.getAppRouteOutput()) { + if (resourceId.equals(resource.getId())) { + foundResource = resource; + log.info("---- [ResourceService getResourceInAppRoute] Resource is found in the app route"); + break; + } + } + } + if (appRoute.getHasSubRoute() == null) { + continue; + } + for (final var subRoute : appRoute.getHasSubRoute()) { + foundResource = getResourceInSubroutes(subRoute, emptyList, resourceId); + } + } + if (foundResource == null) { + log.info("---- [ResourceService getResourceInAppRoute] Could not find any resource" + + " in app routes and subroutes"); + } + return foundResource; + } + + /** + * @param routeStep routestep + * @param visited list of route steps already visited + * @param resourceId id of the resource + * @return resource + */ + private Resource getResourceInSubroutes(final RouteStep routeStep, + final List visited, + final URI resourceId) { + Resource foundResource = null; + if (routeStep == null) { + return null; + } + if (routeStep.getAppRouteOutput() != null) { + for (final var resource : routeStep.getAppRouteOutput()) { + if (resourceId.equals(resource.getId())) { + foundResource = resource; + log.info("---- [ResourceService getResourceInSubroutes] Resource is found in subroute"); + break; + } + } + } + if (routeStep.getHasSubRoute()!=null && !routeStep.getHasSubRoute().isEmpty()) { + for (final var subRoute : routeStep.getHasSubRoute()) { + if (!visited.contains(subRoute)) { + visited.add(routeStep); + foundResource = getResourceInSubroutes(subRoute, visited, resourceId); + } + } + } + return foundResource; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java new file mode 100644 index 00000000..31d6e00f --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java @@ -0,0 +1,275 @@ +package de.fraunhofer.isst.configmanager.api.service.resources; + +import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.util.TypedLiteral; +import de.fraunhofer.iais.eis.util.Util; +import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; +import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; +import de.fraunhofer.isst.configmanager.util.CalenderUtil; +import lombok.AccessLevel; +import lombok.experimental.FieldDefaults; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.IOException; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; + +/** + * Service class for managing resources. + */ +@Slf4j +@Service +@Transactional +@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) +public class ResourceService extends AbstractResourceService { + + transient DefaultResourceClient resourceClient; + + @Autowired + public ResourceService(final ConfigModelService configModelService, + final DefaultConnectorClient connectorClient, + final DefaultResourceClient resourceClient) { + super(configModelService, connectorClient); + this.resourceClient = resourceClient; + } + + + /** + * This method updates the content of the resource with the given parameters. + * + * @param title title of the resource + * @param description description of the resource + * @param language the language + * @param keywords the keywords + * @param version the version of the resource + * @param standardlicense the license of the resource + * @param publisher the publisher of the resource + * @param resourceImpl the resource implementation class to set the parameters + */ + public void updateResourceContent(final String title, final String description, + final String language, final List keywords, + final String version, final String standardlicense, + final String publisher, final ResourceImpl resourceImpl) { + if (title != null) { + resourceImpl.setTitle(Util.asList(new TypedLiteral(title))); + } + if (description != null) { + resourceImpl.setDescription(Util.asList(new TypedLiteral(description))); + } + if (language != null) { + resourceImpl.setLanguage(Util.asList(Language.valueOf(language))); + } + if (keywords != null) { + final ArrayList keys = new ArrayList<>(); + final var literal = new TypedLiteral(); + for (final var keyword : keywords) { + literal.setValue(keyword); + keys.add(literal); + } + resourceImpl.setKeyword(keys); + } + if (version != null) { + resourceImpl.setVersion(version); + } + if (standardlicense != null) { + resourceImpl.setStandardLicense(URI.create(standardlicense)); + } + if (publisher != null) { + resourceImpl.setPublisher(URI.create(publisher)); + } + } + + /** + * This method returns all offered resources of a connector as plain json String. + * + * @return list of resources from the connector + */ + public String getOfferedResourcesAsJsonString() { + try { + return resourceClient.getOfferedResourcesAsJsonString(); + } catch (IOException e) { + log.error(e.getMessage(), e); + return null; + } + } + + /** + * This method returns all requested resources of a connector as plain json String. + * + * @return list of resources from the connector + */ + public String getRequestedResourcesAsJsonString() { + try { + return resourceClient.getRequestedResourcesAsJsonString(); + } catch (IOException e) { + log.error(e.getMessage(), e); + return null; + } + } + + /** + * @param resourceId id of the resource + */ + public void deleteResourceFromAppRoute(final URI resourceId) { + if (configModelService.getConfigModel().getAppRoute() == null) { + log.info("---- [ResourceService deleteResourceFromAppRoute] Could not find any app route to delete the resource"); + } else { + final ArrayList emptyList = new ArrayList<>(); + for (final var route : configModelService.getConfigModel().getAppRoute()) { + if (route == null) { + continue; + } + if (route.getAppRouteOutput() != null) { + route.getAppRouteOutput().removeIf(resource -> resource.getId().equals(resourceId)); + } + if (route.getHasSubRoute() == null) { + continue; + } + + for (final var subRoute : route.getHasSubRoute()) { + deleteFromSubRoutes(subRoute, emptyList, resourceId); + } + } + } + configModelService.saveState(); + } + + /** + * @param title title of the resource + * @param description description of the resource + * @param language language of the resource + * @param keywords keywords for the resource + * @param version version of the resource + * @param standardlicense standard license for the resource + * @param publisher the publisher of the resource + * @return resource implementation + */ + public ResourceImpl createResource(final String title, final String description, + final String language, final List keywords, + final String version, final String standardlicense, + final String publisher) { + + final ArrayList keys = new ArrayList<>(); + final var literal = new TypedLiteral(); + for (final var keyword : keywords) { + literal.setValue(keyword); + keys.add(literal); + } + + // Create the resource with the given parameters + return (ResourceImpl) new ResourceBuilder() + ._title_(Util.asList(new TypedLiteral(title))) + ._description_(Util.asList(new TypedLiteral(description))) + ._language_(Util.asList(Language.valueOf(language))) + ._keyword_(keys) + ._version_(version) + ._standardLicense_(URI.create(standardlicense)) + ._publisher_(URI.create(publisher)) + ._created_(CalenderUtil.getGregorianNow()) + ._modified_(CalenderUtil.getGregorianNow()) + .build(); + } + + /** + * @param resourceId id of the resource + * @param title title of the resource + * @param description description of the resource + * @param language language of the resource + * @param keywords keywords for the resource + * @param version version of the resource + * @param standardlicense standard license for the resource + * @param publisher the publisher of the resource + * @return updated resource + */ + public ResourceImpl updateResource(final URI resourceId, final String title, + final String description, final String language, + final List keywords, final String version, + final String standardlicense, final String publisher) { + //Get a Resource and update if it exists + for (final var resource : getResources()) { + if (resource.getId().equals(resourceId)) { + final var resImpl = (ResourceImpl) resource; + updateResourceContent(title, description, language, keywords, version, + standardlicense, publisher, resImpl); + return resImpl; + } + } + return null; + } + + /** + * @param newResource new resource old version should be replaced with + */ + public void updateResourceInAppRoute(final ResourceImpl newResource) { + // Update the resource in the app route + if (configModelService.getConfigModel().getAppRoute() == null) { + log.info("---- [ResourceService updateResourceInAppRoute] Could not find any app route to update the resource"); + } else { + final ArrayList emptyList = new ArrayList<>(); + for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { + if (appRoute == null) { + continue; + } + if (appRoute.getAppRouteOutput() != null) { + for (final var resource : appRoute.getAppRouteOutput()) { + if (newResource.getId().equals(resource.getId())) { + final ArrayList output = + (ArrayList) appRoute.getAppRouteOutput(); + output.remove(resource); + output.add(newResource); + log.info("---- [ResourceService updateResourceInAppRoute] Updated resource in app route"); + break; + } + } + } + if (appRoute.getHasSubRoute() == null) { + continue; + } + for (final var subRoute : appRoute.getHasSubRoute()) { + updateResourceInSubroutes(subRoute, emptyList, newResource); + } + } + configModelService.saveState(); + } + } + + /** + * @param routeStep routestep + * @param visited list of route steps already managed + * @param newResource new resource old version should be replaced with + */ + private void updateResourceInSubroutes(final RouteStep routeStep, + final List visited, + final ResourceImpl newResource) { + if (routeStep == null) { + return; + } + if (routeStep.getAppRouteOutput() != null) { + for (final var resource : routeStep.getAppRouteOutput()) { + if (newResource.getId().equals(resource.getId())) { + final ArrayList output = + (ArrayList) routeStep.getAppRouteOutput(); + output.remove(resource); + output.add(newResource); + log.info("---- [ResourceService updateResourceInAppRoute] Updated resource in subroute"); + break; + } + } + } + if (routeStep.getHasSubRoute() == null) { + return; + } + for (final var subRoute : routeStep.getHasSubRoute()) { + if (!visited.contains(subRoute)) { + visited.add(routeStep); + updateResourceInSubroutes(subRoute, visited, newResource); + } + } + } + +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java index b28bad46..d12e2047 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java @@ -1,10 +1,6 @@ package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util; -import de.fraunhofer.iais.eis.Artifact; -import de.fraunhofer.iais.eis.BasicAuthenticationImpl; -import de.fraunhofer.iais.eis.GenericEndpoint; -import de.fraunhofer.iais.eis.Representation; -import de.fraunhofer.iais.eis.Resource; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.iais.eis.util.RdfResource; import de.fraunhofer.iais.eis.util.TypedLiteral; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java b/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java index 23444149..37b35f2e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java @@ -7,12 +7,7 @@ import lombok.NoArgsConstructor; import lombok.experimental.FieldDefaults; -import javax.persistence.Column; -import javax.persistence.Convert; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import javax.persistence.*; /** * Entity class for the configuration model. diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java b/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java index ad7c3a5e..fdaf81dd 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java @@ -4,11 +4,7 @@ import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.ElementCollection; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import javax.persistence.*; import java.net.URI; import java.util.List; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java index 8babab38..81270a6d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java @@ -6,14 +6,7 @@ import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; +import javax.persistence.*; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java b/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java index 91ae02c7..15d0b10d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java @@ -4,12 +4,7 @@ import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToMany; +import javax.persistence.*; import java.util.List; /** diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java b/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java index 6b661634..94639d37 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java @@ -7,12 +7,7 @@ import lombok.NoArgsConstructor; import lombok.experimental.FieldDefaults; -import javax.persistence.Column; -import javax.persistence.Convert; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.MappedSuperclass; +import javax.persistence.*; /** * The class helps to persist objects inherited from the endpoint from the information model. diff --git a/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java b/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java index c1312004..a5e87d1c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java @@ -1,10 +1,6 @@ package de.fraunhofer.isst.configmanager.util; -import de.fraunhofer.iais.eis.AppEndpoint; -import de.fraunhofer.iais.eis.AppEndpointBuilder; -import de.fraunhofer.iais.eis.AppEndpointType; -import de.fraunhofer.iais.eis.CustomMediaTypeBuilder; -import de.fraunhofer.iais.eis.Language; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; import lombok.experimental.UtilityClass; diff --git a/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java b/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java index af5a00f9..873c1bf5 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java @@ -2,7 +2,7 @@ import de.fraunhofer.isst.configmanager.api.controller.BrokerController; import de.fraunhofer.isst.configmanager.api.service.BrokerService; -import de.fraunhofer.isst.configmanager.api.service.ResourceService; +import de.fraunhofer.isst.configmanager.api.service.resources.ResourceService; import de.fraunhofer.isst.configmanager.connector.clients.DefaultBrokerClient; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; From 55c9eeb02c192c1a140a27bb0494aa352f1e748b Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Tue, 13 Apr 2021 16:40:47 +0200 Subject: [PATCH 044/157] refactor: clean up unused APIs (not used by UI) --- .../isst/configmanager/api/AppApi.java | 9 -- .../isst/configmanager/api/AppRouteApi.java | 49 +----- .../isst/configmanager/api/BrokerApi.java | 16 -- .../configmanager/api/ConfigModelApi.java | 5 - .../isst/configmanager/api/ConnectorApi.java | 26 ---- .../api/ConnectorRequestApi.java | 10 -- .../isst/configmanager/api/EndpointApi.java | 32 ---- .../isst/configmanager/api/ResourceApi.java | 8 - .../api/ResourceContractApi.java | 9 -- .../api/ResourceRepresentationApi.java | 26 ---- .../api/controller/AppController.java | 27 ---- .../api/controller/AppRouteController.java | 112 +------------- .../api/controller/BrokerController.java | 48 ------ .../api/controller/ConfigModelController.java | 23 --- .../api/controller/ConnectorController.java | 86 ----------- .../ConnectorRequestController.java | 28 ---- .../api/controller/EndpointController.java | 142 +----------------- .../ResourceContractController.java | 26 ---- .../api/controller/ResourceController.java | 30 ---- .../ResourceRepresentationController.java | 100 +----------- .../api/service/AppRouteService.java | 97 ------------ .../configmanager/api/service/AppService.java | 5 - .../api/service/BrokerService.java | 34 ----- .../api/service/ConnectorRequestService.java | 20 --- .../api/service/ConnectorService.java | 33 ---- .../api/service/ResourceService.java | 104 ------------- .../clients/DefaultConnectorClient.java | 10 -- .../clients/DefaultResourceClient.java | 23 --- .../clients/DataspaceConnectorClient.java | 35 ----- .../clients/DataspaceResourceClient.java | 63 -------- .../util/ResourceMapper.java | 25 --- .../api_test/BrokerUIAPITest.java | 13 -- 32 files changed, 10 insertions(+), 1264 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/AppApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/AppApi.java index 84875b02..4a201c0e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/AppApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/AppApi.java @@ -5,7 +5,6 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; public interface AppApi { @GetMapping(value = "/apps", produces = "application/ld+json") @@ -15,12 +14,4 @@ public interface AppApi { @ApiResponse(responseCode = "400", description = "Could not find customs apps"), @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity getApps(); - - @GetMapping(value = "/app", produces = "application/ld+json") - @Operation(summary = "Return an app") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Returns a custom app"), - @ApiResponse(responseCode = "400", description = "Can not find the custom app"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) - ResponseEntity getApp(@RequestParam(value = "id") String id); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java index 15007bfd..d9fd6322 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java @@ -23,14 +23,6 @@ public interface AppRouteApi { @ApiResponse(responseCode = "400", description = "Can not create an app route")}) ResponseEntity createAppRoute(@RequestParam("description") String description); - @PutMapping(value = "/approute", produces = "application/ld+json") - @Operation(summary = "Updates the given app route") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Created a new app route"), - @ApiResponse(responseCode = "400", description = "Can not update the app route")}) - ResponseEntity updateAppRoute(@RequestParam("routeId") URI routeId, - @RequestParam(value = "description", required = false) String description); - @DeleteMapping(value = "/approute", produces = "application/ld+json") @Operation(summary = "Deletes the given app route") @ApiResponses({ @@ -46,23 +38,6 @@ ResponseEntity updateAppRoute(@RequestParam("routeId") URI routeId, @ApiResponse(responseCode = "500", description = "Internal Server error")}) ResponseEntity getAppRoute(@RequestParam("routeId") URI routeId); - @GetMapping(value = "/approutes", produces = "application/ld+json") - @Operation(summary = "Returns all app routes") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Returns the list of the app routes"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) - ResponseEntity getAppRoutes(); - - // Interfaces for managing route steps - @GetMapping(value = "/approute/step", produces = "application/ld+json") - @Operation(summary = "Returns the specific route step") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully returned the specific route step"), - @ApiResponse(responseCode = "400", description = "Can not find the route step"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) - ResponseEntity getAppRouteStep(@RequestParam(value = "routeId") URI routeId, - @RequestParam(value = "routeStepId") URI routeStepId); - @PostMapping(value = "/approute/step", produces = "application/ld+json") @Operation(summary = "Creates a new subroute for the app route") @ApiResponses({ @@ -77,14 +52,6 @@ ResponseEntity createAppRouteStep(@RequestParam(value = "routeId") URI r @RequestParam(value = "endCoordinateY") int endCoordinateY, @RequestParam(value = "resourceId", required = false) URI resourceId); - @DeleteMapping(value = "/approute/step", produces = "application/ld+json") - @Operation(summary = "Deletes the specific route step") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully deleted the specific route step"), - @ApiResponse(responseCode = "400", description = "Can not delete the route step")}) - ResponseEntity deleteAppRouteStep(@RequestParam(value = "routeId") URI routeId, - @RequestParam(value = "routeStepId") URI routeStepId); - @GetMapping(value = "/approute/step/endpoint/info", produces = "application/ld+json") @Operation(summary = "Returns for a route step the specific endpoint information") @ApiResponses({ @@ -94,15 +61,6 @@ ResponseEntity deleteAppRouteStep(@RequestParam(value = "routeId") URI r ResponseEntity getEndpointInformation(@RequestParam(value = "routeId") URI routeId, @RequestParam(value = "endpointId") URI endpointId); - @GetMapping(value = "/approute/step/endpoints/info", produces = "application/ld+json") - @Operation(summary = "Returns all endpoints information") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully returned all endpoint information"), - @ApiResponse(responseCode = "400", description = "Can not find the endpoint information"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) - ResponseEntity getAllEndpointInfo(); - - // Interfaces for managing deploy methods of the routes @PutMapping(value = "/route/deploymethod", produces = "application/ld+json") @Operation(summary = "Updates the route deploy method for all routes") @@ -117,4 +75,11 @@ ResponseEntity getEndpointInformation(@RequestParam(value = "routeId") U @ApiResponse(responseCode = "200", description = "Successfully returned the route deploy method"), @ApiResponse(responseCode = "400", description = "Can not find the route deploy method")}) ResponseEntity getRouteDeployMethod(); + + @GetMapping(value = "/approutes", produces = "application/ld+json") + @Operation(summary = "Returns all app routes") + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Returns the list of the app routes"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) + ResponseEntity getAppRoutes(); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java index 82ecfcc0..f05dc370 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java @@ -44,22 +44,6 @@ ResponseEntity updateBroker(@RequestParam(value = "brokerUri") URI broke @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity getAllBrokers(); - @GetMapping(value = "/broker/list", produces = "application/ld+json") - @Operation(summary = "Returns a list of all broker uri's") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully returned a list of all broker uris"), - @ApiResponse(responseCode = "400", description = "Can not find the broker uris")}) - ResponseEntity getAllBrokerUris(); - - @GetMapping(value = "/broker", produces = "application/ld+json") - @Operation(summary = "Returns the specific broker") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully returned the specific broker"), - @ApiResponse(responseCode = "400", description = "Can not find the broker"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) - ResponseEntity getBroker(@RequestParam(value = "brokerUri") URI brokerUri); - - // APIs to be able to manage connector at broker @PostMapping(value = "/broker/register", produces = "application/ld+json") @Operation(summary = "Registers the connector with the broker") @ApiResponses({ diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ConfigModelApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConfigModelApi.java index 14cee406..1b05724a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ConfigModelApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConfigModelApi.java @@ -36,9 +36,4 @@ ResponseEntity updateConfigModel(@RequestParam(value = "loglevel", requi @ApiResponse(responseCode = "200", description = "Succesfully get the configuration model"), @ApiResponse(responseCode = "400", description = "Can not find the configuration model")}) ResponseEntity getConfigModel(); - - @GetMapping(value = "/configmodel/json", produces = "application/ld+json") - @Operation(summary = "Get the configuration model in json") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Succesfully get the configuration model in json")}) - ResponseEntity getConfigModelJson(); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java index 42ca4d15..5aaaffd8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java @@ -4,9 +4,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -26,23 +24,6 @@ public interface ConnectorApi { @ApiResponse(responseCode = "503", description = "Public connector endpoint not reachable.")}) ResponseEntity getConnectorStatus(); - @GetMapping(value = "/connector/json", produces = "application/ld+json") - @Operation(summary = "Get the connector in json") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully retrieved the connector in json")}) - ResponseEntity getConnectorJson(); - - @PostMapping(value = "/connector", produces = "application/ld+json") - @Operation(summary = "Create a new connector") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully created a new connector")}) - ResponseEntity createConnector(@RequestParam("title") String title, - @RequestParam("description") String description, - @RequestParam("endpointAccessURL") String endpointAccessURL, - @RequestParam("version") String version, - @RequestParam("curator") String curator, - @RequestParam("maintainer") String maintainer, - @RequestParam("inboundModelVersion") String inboundModelVersion, - @RequestParam("outboundModelVersion") String outboundModelVersion); - @PutMapping(value = "/connector", produces = "application/ld+json") @Operation(summary = "Update a connector") @ApiResponses({ @@ -56,11 +37,4 @@ ResponseEntity updateConnector(@RequestParam(value = "title", required = @RequestParam(value = "maintainer", required = false) String maintainer, @RequestParam(value = "inboundModelVersion", required = false) String inboundModelVersion, @RequestParam(value = "outboundModelVersion", required = false) String outboundModelVersion); - - @DeleteMapping(value = "/connector") - @Operation(summary = "Deletes the connector") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully deleted the connector"), - @ApiResponse(responseCode = "400", description = "Could not delete the connector")}) - ResponseEntity deleteConnector(); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java index 4a632852..eaebb7e4 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java @@ -5,7 +5,6 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; @@ -19,13 +18,4 @@ public interface ConnectorRequestApi { @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity requestMetadata(@RequestParam("recipientId") URI recipientId, @RequestParam(value = "requestedResourceId", required = false) URI requestedResourceId); - - @PostMapping(value = "/request/contract", produces = "application/ld+json") - @Operation(summary = "Send a contract request to another IDS connector.") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully send a contract request to another IDS connector"), - @ApiResponse(responseCode = "400", description = "Can not return the contract agreement id")}) - ResponseEntity requestContract(@RequestParam("recipientId") URI recipientId, - @RequestParam(value = "requestedArtifactId ") URI requestedArtifactId, - @RequestBody(required = false) String contractOffer); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java index 3f8d1266..e38927c3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java @@ -29,14 +29,6 @@ ResponseEntity createGenericEndpoint(@RequestParam(value = "accessURL") @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity getGenericEndpoints(); - @GetMapping(value = "/generic/endpoint", produces = "application/ld+json") - @Operation(summary = "Returns a specific generic endpoint") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Returned a specific backend connection"), - @ApiResponse(responseCode = "400", description = "Can not find the generic endpoint"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) - ResponseEntity getGenericEndpoint(@RequestParam(value = "endpointId") URI endpointId); - @DeleteMapping(value = "/generic/endpoint", produces = "application/ld+json") @Operation(summary = "Deletes a generic endpoint") @ApiResponses({ @@ -54,30 +46,6 @@ ResponseEntity updateGenericEndpoint(@RequestParam(value = "id") URI id, @RequestParam(value = "username", required = false) String username, @RequestParam(value = "password", required = false) String password); - @GetMapping(value = "/connector/endpoints", produces = "application/ld+json") - @Operation(summary = "Returns the connector endpoints") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully returned the connector endpoints"), - @ApiResponse(responseCode = "400", description = "Can not find the connector endpoints"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) - ResponseEntity getConnectorEndpoints(); - - @GetMapping(value = "/connector/endpoints/client", produces = "application/ld+json") - @Operation(summary = "Returns a list of connector endpoints") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully returned a list of connector endpoints"), - @ApiResponse(responseCode = "400", description = "Can not find the connector endpoints from the client")}) - ResponseEntity getConnectorEndpointsFromClient(@RequestParam("accessUrl") String accessUrl, - @RequestParam(value = "resourceId", required = false) String resourceId); - - @GetMapping(value = "/connector/endpoint", produces = "application/ld+json") - @Operation(summary = "Returns the connector endpoint") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully returned the connector endpoint"), - @ApiResponse(responseCode = "400", description = "Can not find the connector endpoint"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) - ResponseEntity getConnectorEndpoint(@RequestParam("connectorEndpointId") URI connectorEndpointId); - @PostMapping(value = "/connector/endpoint", produces = "application/ld+json") @Operation(summary = "Creates a new connector endpoint for the connector") @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully created the connector endpoint for the connector")}) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java index 0f97fca8..1d4e105d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java @@ -32,14 +32,6 @@ public interface ResourceApi { @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned all requested resources from the connector")}) ResponseEntity getRequestedResources(); - @GetMapping(value = "/resource/json", produces = "application/ld+json") - @Operation(summary = "Returns the specific resource from the connector in JSON format") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully returned the specific resource " - + "from the connector in JSON format"), - @ApiResponse(responseCode = "400", description = "Validation failed. Can not find the resource")}) - ResponseEntity getResourceInJson(@RequestParam(value = "resourceId") URI resourceId); - @PostMapping(value = "/resource", produces = "application/ld+json") @Operation(summary = "Creates a resource for the connector") @ApiResponses({ diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java index 2d502982..a30c0cf3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java @@ -5,7 +5,6 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; @@ -13,14 +12,6 @@ import java.net.URI; public interface ResourceContractApi { - @GetMapping(value = "/resource/contract", produces = "application/ld+json") - @Operation(summary = "Returns the contract from a resource") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully returned the contract from the resource"), - @ApiResponse(responseCode = "400", description = "Can not find the resource contract"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) - ResponseEntity getResourceContract(@RequestParam("resourceId") URI resourceId); - @PutMapping(value = "/resource/contract", produces = "application/ld+json") @Operation(summary = "Updates the contract in a resource") @ApiResponses({ diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java index ba92f25d..16625391 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java @@ -4,8 +4,6 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -39,28 +37,4 @@ ResponseEntity updateResourceRepresentation(@RequestParam("resourceId") @RequestParam(value = "filenameExtension", required = false) String filenameExtension, @RequestParam(value = "bytesize", required = false) Long bytesize, @RequestParam(value = "sourceType", required = false) String sourceType); - - @GetMapping(value = "/resource/representation", produces = "application/ld+json") - @Operation(summary = "Get the representation for a resource") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully get the representation for a resource"), - @ApiResponse(responseCode = "400", description = "Can not find the resource representation"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) - ResponseEntity getResourceRepresentation(@RequestParam("representationId") URI representationId); - - @GetMapping(value = "/resource/representation/json", produces = "application/ld+json") - @Operation(summary = "Get the representation for a resource in JSON format") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully get the representation for a resource in JSON format"), - @ApiResponse(responseCode = "400", description = "Can not find the resource representation")}) - ResponseEntity getResourceRepresentationInJson(@RequestParam("resourceId") URI resourceId, - @RequestParam("representationId") URI representationId); - - @DeleteMapping(value = "/resource/representation", produces = "application/ld+json") - @Operation(summary = "Deletes the representation for a resource") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully deleted the representation for a resource"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) - ResponseEntity deleteResourceRepresentation(@RequestParam("resourceId") URI resourceId, - @RequestParam("representationId") URI representationId); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppController.java index b7988b7c..270a7f6b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppController.java @@ -55,31 +55,4 @@ public ResponseEntity getApps() { return response; } - - /** - * This method returns a specific app. - * - * @param id id of the app - * @return a suitable http response depending on success - */ - @Override - public ResponseEntity getApp(final String id) { - log.info(">> GET /app id: " + id); - ResponseEntity response; - - final var customApp = appService.getApp(id); - - if (customApp != null) { - try { - response = ResponseEntity.ok(objectMapper.writeValueAsString(customApp)); - } catch (JsonProcessingException e) { - log.error(e.getMessage(), e); - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - } else { - response = ResponseEntity.badRequest().body("Can not find the custom app"); - } - - return response; - } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java index c3a24164..2c536804 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java @@ -16,8 +16,8 @@ import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; -import net.minidev.json.JSONArray; import net.minidev.json.JSONObject; +import org.json.JSONArray; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -90,31 +90,6 @@ public ResponseEntity createAppRoute(final String description) { return response; } - /** - * This method updates an app route. - * - * @param routeId id of the app route - * @param description description of the app route - * @return a suitable http response depending on success - */ - @Override - public ResponseEntity updateAppRoute(final URI routeId, final String description) { - log.info(">> PUT /approute routeId: " + routeId + " description: " + description); - ResponseEntity response; - - final boolean updated = appRouteService.updateAppRoute(routeId, description); - - if (updated) { - log.info("---- [AppRouteController updateAppRoute] App route with id: " + routeId + " is updated."); - response = ResponseEntity.ok(Utility.jsonMessage("message", "App route with id: " + routeId + " is updated.")); - } else { - log.info("---- [AppRouteController updateAppRoute] Could not update app route with id: " + routeId); - response = ResponseEntity.badRequest().body("Could not update app route with id: " + routeId); - } - - return response; - } - /** * This method deletes an app route. * @@ -245,63 +220,6 @@ public ResponseEntity createAppRouteStep(final URI routeId, final URI st return response; } - /** - * This method deletes a route step. - * - * @param routeId id of the app route - * @param routeStepId id of the route step - * @return a suitable http response depending on success - */ - @Override - public ResponseEntity deleteAppRouteStep(final URI routeId, final URI routeStepId) { - log.info(">> DELETE /approute/step routeId: " + routeId + " routeStepId: " + routeStepId); - ResponseEntity response; - - final boolean deleted = appRouteService.deleteAppRouteStep(routeId, routeStepId); - - if (deleted) { - log.info("---- [AppRouteController deleteAppRouteStep] Successfully deleted the route step with id:" + routeStepId); - response = ResponseEntity.ok("Successfully deleted the route step with id: " + routeStepId); - } else { - log.warn("---- [AppRouteController deleteAppRouteStep] Could not delete the route step"); - response = ResponseEntity.badRequest().body("---- Could not delete the route step"); - } - - return response; - } - - /** - * This method returns a specific route step. - * - * @param routeId id of the app route - * @param routeStepId id of the route step - * @return a suitable http response depending on success - */ - @Override - public ResponseEntity getAppRouteStep(final URI routeId, final URI routeStepId) { - log.info(">> GET /approute/step routeId: " + routeId + " routeStepId: " + routeStepId); - ResponseEntity response; - - final var routeStep = appRouteService.getSubroute(routeId, routeStepId); - - if (routeStep != null) { - try { - final var routeStepString = serializer.serialize(routeStep); - log.info("---- [AppRouteController getAppRouteStep] Route step found"); - response = ResponseEntity.ok(routeStepString); - } catch (IOException e) { - log.error("---- [AppRouteController getAppRouteStep] Problem while serializing route step!"); - log.error(e.getMessage(), e); - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Could not serialize the route step"); - } - } else { - log.warn("---- [AppRouteController getAppRouteStep] Route step is null"); - response = ResponseEntity.badRequest().body("Could not get the route step"); - } - - return response; - } - /** * This method returns information regarding the endpoint. * @@ -334,34 +252,6 @@ public ResponseEntity getEndpointInformation(final URI routeId, final UR return response; } - /** - * @return list of endpoint information - */ - @Override - public ResponseEntity getAllEndpointInfo() { - log.info(">> GET /approute/step/endpoints/info"); - ResponseEntity response; - - final var endpointInformations = appRouteService.getAllEndpointInfo(); - - if (endpointInformations != null) { - try { - final var endpointInfos = objectMapper.writeValueAsString(endpointInformations); - log.info("---- [AppRouteController getAllEndpointInfo] Returning all endpoint information"); - response = ResponseEntity.ok(endpointInfos); - } catch (JsonProcessingException e) { - log.error("---- [AppRouteController getAllEndpointInfo] Could not parse endpoint informations to JSON!"); - log.error(e.getMessage(), e); - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - } else { - log.info("---- [AppRouteController getAllEndpointInfo] Endpoint information list is null"); - response = ResponseEntity.badRequest().body("Could not get endpoint information"); - } - - return response; - } - /** * This method updates the route deploy method of all app route and route steps. * diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java index a6449777..b7f453d5 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java @@ -114,33 +114,6 @@ public ResponseEntity deleteBroker(final URI brokerUri) { return response; } - /** - * This method returns a broker with the given id. - * - * @param brokerId id of the broker - * @return a suitable http response depending on success - */ - @Override - public ResponseEntity getBroker(final URI brokerId) { - log.info(">> GET /broker brokerId: " + brokerId); - ResponseEntity response; - - final var broker = brokerService.getById(brokerId); - - if (broker != null) { - try { - response = ResponseEntity.ok(objectMapper.writeValueAsString(broker)); - } catch (IOException e) { - log.error(e.getMessage(), e); - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - } else { - response = ResponseEntity.badRequest().body("Could not get the specific broker"); - } - - return response; - } - /** * This method returns a list of all brokers as string. * @@ -163,27 +136,6 @@ public ResponseEntity getAllBrokers() { return response; } - /** - * This method returns a list of broker uri's. - * - * @return a suitable http response depending on success - */ - @Override - public ResponseEntity getAllBrokerUris() { - log.info(">> GET /broker/list"); - ResponseEntity response; - - final var brokerUris = brokerService.getAllBrokerUris(); - - if (brokerUris != null) { - response = ResponseEntity.ok(brokerUris.toString()); - } else { - response = ResponseEntity.badRequest().body("Could not return the uri list of brokers"); - } - - return response; - } - /** * This method registers a connector with a specific broker. * diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java index 3bfbae7a..365e332b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java @@ -131,27 +131,4 @@ public ResponseEntity getConfigModel() { return response; } - - /** - * This method returns the current configuration model as JSON string. - * - * @return a suitable http response depending on success - */ - @Override - public ResponseEntity getConfigModelJson() { - log.info(">> GET /configmodel/json"); - - final var configurationModel = configModelService.getConfigModel(); - - final var configModelJson = new JSONObject(); - configModelJson.put("loglevel", configurationModel.getConfigurationModelLogLevel()); - configModelJson.put("connectorStatus", configurationModel.getConnectorStatus()); - configModelJson.put("connectorDeployMode", configurationModel.getConnectorDeployMode()); - configModelJson.put("trustStore", configurationModel.getTrustStore().toString()); - configModelJson.put("trustStorePassword", configurationModel.getTrustStorePassword()); - configModelJson.put("keyStore", configurationModel.getKeyStore().toString()); - configModelJson.put("keyStorePassword", configurationModel.getKeyStorePassword()); - - return ResponseEntity.ok(configModelJson.toJSONString()); - } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java index 2001ce02..0c0c16e3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java @@ -1,6 +1,5 @@ package de.fraunhofer.isst.configmanager.api.controller; -import de.fraunhofer.iais.eis.BaseConnector; import de.fraunhofer.iais.eis.ConfigurationModelImpl; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.iais.eis.util.Util; @@ -10,7 +9,6 @@ import de.fraunhofer.isst.configmanager.api.service.ConnectorService; import de.fraunhofer.isst.configmanager.connector.clients.DefaultBrokerClient; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.util.Utility; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; @@ -114,67 +112,6 @@ public ResponseEntity getConnectorStatus() { return response; } - /** - * This method returns as response the base connector in JSON format. - * - * @return as response the connector in JSON format - */ - @Override - public ResponseEntity getConnectorJson() { - log.info(">> GET /connector/json"); - - final var baseConnector = (BaseConnector) configModelService.getConfigModel().getConnectorDescription(); - - final var baseConnectorJson = new JSONObject(); - baseConnectorJson.put("title", baseConnector.getTitle().get(0).getValue()); - baseConnectorJson.put("description", baseConnector.getDescription().get(0).getValue()); - baseConnectorJson.put("endpointAccessURL", baseConnector.getHasDefaultEndpoint().getAccessURL().toString()); - baseConnectorJson.put("version", baseConnector.getVersion()); - baseConnectorJson.put("curator", baseConnector.getCurator().toString()); - baseConnectorJson.put("maintainer", baseConnector.getMaintainer().toString()); - baseConnectorJson.put("inboundModelVersion", baseConnector.getInboundModelVersion().get(0)); - baseConnectorJson.put("outboundModelVersion", baseConnector.getOutboundModelVersion()); - baseConnectorJson.put("securityProfile", baseConnector.getSecurityProfile()); - - return ResponseEntity.ok(baseConnectorJson.toJSONString()); - } - - /** - * This method creates a connector description for the configuration model with the given - * parameters. - * - * @param title title of the connector - * @param description description of the connector - * @param endpointAccessURL access url of the connector endpoint - * @param version version of the connector - * @param curator curator of the connector - * @param maintainer maintainer of the connector - * @param inboundModelVersion the inbound model version of the connector - * @param outboundModelVersion the outbound model version of the connector - * @return http response message with the id of the created connector - */ - @Override - public ResponseEntity createConnector(final String title, final String description, - final String endpointAccessURL, - final String version, final String curator, - final String maintainer, - final String inboundModelVersion, - final String outboundModelVersion) { - log.info(">> POST /connector"); - - final var baseConnector = connectorService.createConnector(title, description, - endpointAccessURL, version, - curator, maintainer, inboundModelVersion, - outboundModelVersion); - - final var configModelImpl = (ConfigurationModelImpl) configModelService.getConfigModel(); - configModelImpl.setConnectorDescription(baseConnector); - configModelService.saveState(); - - return ResponseEntity.ok(Utility - .jsonMessage("message", "Successfully created a new connector with the id: " + baseConnector.getId().toString())); - } - /** * This method updates the connector description from the configuration model with the given * parameters. @@ -253,27 +190,4 @@ public ResponseEntity updateConnector(final String title, final String d return response; } - - /** - * This method deletes a connector from the configuration model. - * - * @return a suitable http response depending on success - */ - @Override - public ResponseEntity deleteConnector() { - log.info(">> DELETE /connector"); - ResponseEntity response; - - if (configModelService.getConfigModel().getConnectorDescription() != null) { - final var configModelImpl = (ConfigurationModelImpl) configModelService.getConfigModel(); - configModelImpl.setConnectorDescription(null); - configModelService.saveState(); - - response = ResponseEntity.ok(Utility.jsonMessage("message", "Successfully deleted the connector")); - } else { - response = ResponseEntity.badRequest().body("Could not delete the connector"); - } - - return response; - } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java index aac41844..8e54a08e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java @@ -5,7 +5,6 @@ import de.fraunhofer.isst.configmanager.api.service.ConnectorRequestService; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; -import net.minidev.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -76,31 +75,4 @@ public ResponseEntity requestMetadata(final URI recipientId, final URI r } return response; } - - @Override - public ResponseEntity requestContract(final URI recipientId, - final URI requestedArtifactId, - final String contractOffer) { - log.info(">> POST /request/contract recipientId: " + recipientId + " requestedArtifactId: " + requestedArtifactId + " contractOffer: " + contractOffer); - ResponseEntity response; - - final var contractAgreementId = connectorRequestService - .requestContractAgreement(recipientId.toString(), requestedArtifactId.toString(), contractOffer); - - if (contractAgreementId != null) { - final var jsonObject = new JSONObject(); - - if (contractAgreementId.contains("Failed")) { - jsonObject.put("message", contractAgreementId); - response = ResponseEntity.badRequest().body(jsonObject.toJSONString()); - } else { - jsonObject.put("agreementId", contractAgreementId); - response = ResponseEntity.ok(jsonObject.toJSONString()); - } - } else { - response = ResponseEntity.badRequest().body("Could not get agreement id for the contract"); - } - - return response; - } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java index 96f0222e..1661ead7 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java @@ -1,7 +1,6 @@ package de.fraunhofer.isst.configmanager.api.controller; -import com.fasterxml.jackson.databind.ObjectMapper; import de.fraunhofer.iais.eis.BaseConnectorImpl; import de.fraunhofer.iais.eis.ConfigurationModelImpl; import de.fraunhofer.iais.eis.ConnectorEndpoint; @@ -10,12 +9,10 @@ import de.fraunhofer.isst.configmanager.api.EndpointApi; import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; import de.fraunhofer.isst.configmanager.api.service.EndpointService; -import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; -import net.minidev.json.JSONArray; import net.minidev.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -39,22 +36,16 @@ public class EndpointController implements EndpointApi { transient Serializer serializer; - transient ObjectMapper objectMapper; transient ConfigModelService configModelService; transient EndpointService endpointService; - transient DefaultConnectorClient client; @Autowired public EndpointController(final Serializer serializer, - final ObjectMapper objectMapper, final ConfigModelService configModelService, - final EndpointService endpointService, - final DefaultConnectorClient client) { + final EndpointService endpointService) { this.serializer = serializer; - this.objectMapper = objectMapper; this.configModelService = configModelService; this.endpointService = endpointService; - this.client = client; } /** @@ -108,33 +99,6 @@ public ResponseEntity getGenericEndpoints() { return response; } - /** - * This method returns a generic endpoint. - * - * @param endpointId id of the generic endpoint - * @return a suitable http response depending on success - */ - @Override - public ResponseEntity getGenericEndpoint(final URI endpointId) { - log.info(">> GET /generic/endpoint endpointId: " + endpointId); - ResponseEntity response; - - final var genericEndpoint = endpointService.getGenericEndpoint(endpointId); - - if (genericEndpoint != null) { - try { - response = ResponseEntity.ok(serializer.serialize(genericEndpoint)); - } catch (IOException e) { - log.error(e.getMessage(), e); - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - } else { - response = ResponseEntity.badRequest().body("Could not get the generic endpoint"); - } - - return response; - } - /** * This method deletes a generic endpoint. * @@ -185,110 +149,6 @@ public ResponseEntity updateGenericEndpoint(final URI endpointId, return response; } - /** - * This method returns all connector endpoints. - * - * @return a suitable http response depending on success - */ - @Override - public ResponseEntity getConnectorEndpoints() { - log.info(">> GET /connector/endpoints"); - ResponseEntity response; - - if (configModelService.getConfigModel().getConnectorDescription() == null) { - response = ResponseEntity.badRequest().body("Could not get the connector"); - } else { - final var connector = configModelService.getConfigModel().getConnectorDescription(); - - if (connector.getHasEndpoint() == null) { - response = ResponseEntity.badRequest().body("Could not find any connector endpoints"); - } else { - try { - response = ResponseEntity.ok(serializer.serialize(connector.getHasEndpoint())); - } catch (IOException e) { - log.error(e.getMessage(), e); - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - } - } - - return response; - } - - /** - * This method returns a specific connector endpoint. - * - * @param connectorEndpointId id of the connector endpoint - * @return a suitable http response depending on success - */ - @Override - public ResponseEntity getConnectorEndpoint(final URI connectorEndpointId) { - log.info(">> GET /connector/endpoint connectorEndpointId: " + connectorEndpointId); - ResponseEntity response; - - if (configModelService.getConfigModel().getConnectorDescription() == null) { - response = ResponseEntity.badRequest().body("Could not get the connector"); - } else { - final var connector = configModelService.getConfigModel().getConnectorDescription(); - - if (connector.getHasEndpoint() == null) { - response = ResponseEntity.badRequest().body("Could not find any connector endpoints"); - } else { - final var connectorEndpoint = connector.getHasEndpoint() - .stream() - .filter(connectorEndpoint1 -> connectorEndpoint1.getId().equals(connectorEndpointId)) - .findAny() - .orElse(null); - - if (connectorEndpoint != null) { - try { - response = ResponseEntity.ok(serializer.serialize(connectorEndpoint)); - } catch (IOException e) { - log.error(e.getMessage(), e); - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - } else { - response = ResponseEntity.badRequest().body("Could not find any connector endpoint with id: " + connectorEndpointId); - } - } - } - - return response; - } - - /** - * This method identifies the connector by access url and resource id and then returns a list - * of connector endpoints. - * - * @param accessUrl access url of the connector - * @param resourceId id of the resource - * @return a suitable http response depending on success - */ - @Override - public ResponseEntity getConnectorEndpointsFromClient(final String accessUrl, final String resourceId) { - log.info(">> GET /connector/endpoints/client accessUrl: " + accessUrl + " resourceId: " + resourceId); - ResponseEntity response; - - try { - final var baseConnector = client.getBaseConnector(accessUrl, resourceId); - - if (baseConnector == null) { - response = ResponseEntity.badRequest().body("Could not determine the connector with the access url: " + accessUrl); - } else { - if (baseConnector.getHasEndpoint() == null) { - response = ResponseEntity.ok(objectMapper.writeValueAsString(new JSONArray())); - } else { - response = ResponseEntity.ok(serializer.serialize(baseConnector.getHasEndpoint())); - } - } - } catch (IOException e) { - log.error(e.getMessage(), e); - response = ResponseEntity.badRequest().body("Could not determine connector endpoints from client"); - } - - return response; - } - /** * This method creates a connector endpoint with given parameters. * diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java index f0ed125a..046e3b99 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java @@ -46,32 +46,6 @@ public ResourceContractController(final ResourceService resourceService, this.client = client; } - /** - * This method returns the contract from a specific resource. - * - * @param resourceId id of the resource - * @return a suitable http response depending on success - */ - @Override - public ResponseEntity getResourceContract(final URI resourceId) { - log.info(">> GET /resource/contract resourceId: " + resourceId); - ResponseEntity response; - - final var contractOffer = resourceService.getResourceContract(resourceId); - if (contractOffer != null) { - try { - response = ResponseEntity.ok(serializer.serialize(contractOffer)); - } catch (IOException e) { - log.error(e.getMessage(), e); - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - } else { - response = ResponseEntity.badRequest().body("Could not get the resource contract"); - } - - return response; - } - /** * This method updates the contract of a resource. * diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java index 938a9324..3eeb4915 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java @@ -102,36 +102,6 @@ public ResponseEntity getRequestedResources() { return ResponseEntity.ok(resourceService.getRequestedResourcesAsJsonString()); } - /** - * This method returns a specific resource in JSON format. - * - * @param resourceId if of the resource - * @return a suitable http response depending on success - */ - @Override - public ResponseEntity getResourceInJson(final URI resourceId) { - log.info(">> GET /resource/json resourceId: " + resourceId); - ResponseEntity response; - - if (ValidateApiInput.notValid(resourceId.toString())) { - response = ResponseEntity.badRequest().body("All validated parameter have undefined as value!"); - } else { - final var resource = resourceService.getResource(resourceId); - - final var resourceJson = new JSONObject(); - resourceJson.put("title", resource.getTitle().get(0).getValue()); - resourceJson.put("description", resource.getDescription().get(0).getValue()); - resourceJson.put("keyword", resource.getKeyword()); - resourceJson.put("version", resource.getVersion()); - resourceJson.put("standardlicense", resource.getStandardLicense().toString()); - resourceJson.put("publisher", resource.getPublisher().toString()); - - response = ResponseEntity.ok(resourceJson.toJSONString()); - } - - return response; - } - /** * This method deletes the resource from the connector and the app route with the given * parameter. diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java index 02d7ffa8..e8290d69 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java @@ -1,14 +1,12 @@ package de.fraunhofer.isst.configmanager.api.controller; -import de.fraunhofer.iais.eis.Artifact; import de.fraunhofer.iais.eis.ArtifactBuilder; import de.fraunhofer.iais.eis.IANAMediaTypeBuilder; import de.fraunhofer.iais.eis.Language; import de.fraunhofer.iais.eis.RepresentationBuilder; import de.fraunhofer.iais.eis.RepresentationImpl; import de.fraunhofer.iais.eis.ResourceImpl; -import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.api.ResourceRepresentationApi; import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; @@ -44,17 +42,14 @@ public class ResourceRepresentationController implements ResourceRepresentationA transient ConfigModelService configModelService; transient ResourceService resourceService; transient DefaultResourceClient client; - transient Serializer serializer; @Autowired public ResourceRepresentationController(final ConfigModelService configModelService, final ResourceService resourceService, - final DefaultResourceClient client, - final Serializer serializer) { + final DefaultResourceClient client) { this.client = client; this.configModelService = configModelService; this.resourceService = resourceService; - this.serializer = serializer; } /** @@ -219,97 +214,4 @@ public ResponseEntity updateResourceRepresentation(final URI resourceId, return response; } - - /** - * This method returns the specific representation from a resource with the given parameters. - * - * @param representationId id of the representation - * @return a suitable http response depending on success - */ - @Override - public ResponseEntity getResourceRepresentation(final URI representationId) { - log.info(">> GET /resource/representation representationId: " + representationId); - ResponseEntity response; - - final var representation = resourceService.getResourceRepresentationInCatalog(representationId); - - if (representation != null) { - try { - response = ResponseEntity.ok(serializer.serialize(representation)); - } catch (IOException e) { - log.error(e.getMessage(), e); - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - } else { - response = ResponseEntity.badRequest().body("Could not get resource representation"); - } - - return response; - } - - /** - * This method returns the specific representation from a resource in JSON format with the - * given parameters. - * - * @param resourceId id of the resource - * @param representationId id of the representation - * @return a suitable http response depending on success - */ - @Override - public ResponseEntity getResourceRepresentationInJson(final URI resourceId, - final URI representationId) { - log.info(">> GET /resource/representation/json resourceId: " + resourceId + " representationId: " + representationId); - ResponseEntity response = null; - - final var representationJson = new JSONObject(); - for (final var resource : resourceService.getResources()) { - if (resourceId.equals(resource.getId())) { - for (final var representation : resource.getRepresentation()) { - if (representationId.equals(representation.getId())) { - representationJson.clear(); - representationJson.put("language", representation.getLanguage()); - representationJson.put("filenameExtension", representation.getMediaType() - .getFilenameExtension()); - final var artifact = (Artifact) representation.getInstance().get(0); - representationJson.put("byteSize", artifact.getByteSize().toString()); - - response = ResponseEntity.ok(representationJson.toJSONString()); - } - } - } - } - if (response == null) { - response = ResponseEntity.badRequest().body("Could not get resource representation"); - } - - return response; - } - - /** - * This method deletes the resource representation with the given parameters. - * - * @param resourceId id of the resource - * @param representationId id of the representation - * @return a suitable http response depending on success - */ - @Override - public ResponseEntity deleteResourceRepresentation(final URI resourceId, - final URI representationId) { - log.info(">> DELETE /resource/representation resourceId: " + resourceId + " representationId: " + representationId); - ResponseEntity response; - - try { - final var clientResponse = client.deleteResourceRepresentation(resourceId.toString(), representationId.toString()); - resourceService.deleteResourceRepresentationFromAppRoute(resourceId, representationId); - final var jsonObject = new JSONObject(); - jsonObject.put("connectorResponse", clientResponse); - jsonObject.put("resourceID", resourceId.toString()); - jsonObject.put("representationID", representationId.toString()); - response = ResponseEntity.ok(jsonObject.toJSONString()); - } catch (IOException e) { - log.error(e.getMessage(), e); - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } - return response; - } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java index 3284f44c..6f8b60c7 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java @@ -10,7 +10,6 @@ import de.fraunhofer.iais.eis.ResourceImpl; import de.fraunhofer.iais.eis.RouteStep; import de.fraunhofer.iais.eis.RouteStepBuilder; -import de.fraunhofer.iais.eis.RouteStepImpl; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.model.configlists.CustomAppRepository; import de.fraunhofer.isst.configmanager.model.configlists.EndpointInformationRepository; @@ -97,45 +96,6 @@ public AppRoute createAppRoute(final String description) { return appRoute; } - /** - * This method updates the app route. - * - * @param routeId if of the app route - * @param description desciption of the app route - * @return true, if app route is updated - */ - public boolean updateAppRoute(final URI routeId, final String description) { - boolean updated = false; - - final var appRouteImpl = getAppRouteImpl(routeId); - - if (appRouteImpl != null) { - appRouteImpl.setAppRouteBroker(null); - appRouteImpl.setAppRouteStart(null); - appRouteImpl.setAppRouteEnd(null); - appRouteImpl.setAppRouteOutput(null); - appRouteImpl.setHasSubRoute(null); - appRouteImpl.setRouteConfiguration(null); - appRouteImpl.setRouteDescription(description); - - final var routeDeployMethod = routeDeployMethodRepository.findAll(); - - String deployMethod; - - if (routeDeployMethod.isEmpty()) { - deployMethod = "custom"; - } else { - deployMethod = routeDeployMethod.get(0).getDeployMethod().toString(); - } - - appRouteImpl.setRouteDeployMethod(deployMethod); - configModelService.saveState(); - updated = true; - } - - return updated; - } - /** * This method deletes an app route. * @@ -176,24 +136,6 @@ public List getAppRoutes() { return (List) configModelService.getConfigModel().getAppRoute(); } - /** - * This method returns the specific soubroute. - * - * @param routeId id of the app route - * @param routeStepId id of the subroute - * @return subroute - */ - public RouteStep getSubroute(final URI routeId, final URI routeStepId) { - RouteStepImpl routeStep = null; - final var appRouteImpl = getAppRouteImpl(routeId); - - if (appRouteImpl != null) { - routeStep = getSubrouteImpl(routeStepId, appRouteImpl); - } - - return routeStep; - } - /** * This method returns a specific app route with the given parameter. * @@ -205,18 +147,6 @@ private AppRouteImpl getAppRouteImpl(final URI routeId) { .stream().filter(appRoute -> appRoute.getId().equals(routeId)).findAny().orElse(null); } - /** - * This method returns a specific sub route with the given parameters. - * - * @param routeStepId id of the subroute - * @param appRouteImpl app route implementation - * @return sub route implementation - */ - private RouteStepImpl getSubrouteImpl(final URI routeStepId, final AppRouteImpl appRouteImpl) { - return (RouteStepImpl) appRouteImpl.getHasSubRoute().stream() - .filter(routeStep -> routeStep.getId().equals(routeStepId)).findAny().orElse(null); - } - public RouteStep createAppRouteStep(final URI routeId, final URI startId, final int startCoordinateX, final int startCoordinateY, final URI endID, final int endCoordinateX, @@ -365,31 +295,4 @@ public EndpointInformation getEndpointInformation(final URI routeId, final URI e return returnEndpointInfo; } - - /** - * @return all endpoint information - */ - public List getAllEndpointInfo() { - return endpointInformationRepository.findAll(); - } - - /** - * This method deletes a route step with the given parameters. - * - * @param routeId id of the app route - * @param routeStepId id of the route step - * @return true, if route step is deleted - */ - public boolean deleteAppRouteStep(final URI routeId, final URI routeStepId) { - boolean deleted = false; - final var appRouteImpl = getAppRouteImpl(routeId); - if (appRouteImpl != null) { - deleted = - appRouteImpl.getHasSubRoute().removeIf(routeStep -> routeStep.getId().equals(routeStepId)); - if (deleted) { - configModelService.saveState(); - } - } - return deleted; - } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java index 34613ac4..48e1cb48 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java @@ -73,9 +73,4 @@ public AppService(final CustomAppRepository customAppRepository) throws URISynta public List getApps() { return customAppRepository.findAll(); } - - public CustomApp getApp(final String id) { - final var appId = Long.valueOf(id); - return customAppRepository.findById(appId).orElse(null); - } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java index 56417cdc..8667fd47 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java @@ -86,21 +86,6 @@ public boolean updateBroker(final URI brokerUri, final String title) { return updated; } - /** - * The method returns a list of all broker uri's. - * - * @return list of all broker uri's - */ - public List getAllBrokerUris() { - final List brokerUris = new ArrayList<>(); - for (final var customBroker : customBrokerRepository.findAll()) { - if (customBroker != null) { - brokerUris.add(customBroker.getBrokerUri()); - } - } - return brokerUris; - } - /** * The method deletes the broker using the broker id. * @@ -151,25 +136,6 @@ public void setBrokerStatus(final URI brokerId, final BrokerStatus brokerStatus) } } - /** - * This method set a resource at a broker. - * - * @param brokerId id of the broker - * @param resourceId id of the resource - */ - public void setResourceAtBroker(final URI brokerId, final URI resourceId) { - final var customBroker = getById(brokerId); - if (customBroker != null) { - if (customBroker.getRegisteredResources() == null) { - customBroker.setRegisteredResources(new ArrayList<>()); - } - final var registeredResources = customBroker.getRegisteredResources(); - registeredResources.add(resourceId.toString()); - customBroker.setRegisteredResources(registeredResources); - customBrokerRepository.save(customBroker); - } - } - public void sentSelfDescToBroker(final URI brokerId) { final var customBroker = getById(brokerId); customBroker.setRegisteredResources( diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java index 681f31da..002f5641 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java @@ -80,24 +80,4 @@ public Resource requestResource(final URI recipientId, final URI requestedResour return null; } } - - /** - * This method requests the id of the contract agreement - * - * @param recipientId id of the recipient - * @param requestedArtifactId id of the requested artifact - * @param contractOffer contact offer for the requested resource - * @return string, contract acgreement id - */ - public String requestContractAgreement(final String recipientId, - final String requestedArtifactId, - final String contractOffer) { - - try { - return connectorClient.requestContractAgreement(recipientId, requestedArtifactId, contractOffer); - } catch (IOException e) { - log.error(e.getMessage(), e); - } - return null; - } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java index 72b0c90e..5b503ab2 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java @@ -1,6 +1,5 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.BaseConnector; import de.fraunhofer.iais.eis.BaseConnectorBuilder; import de.fraunhofer.iais.eis.BaseConnectorImpl; import de.fraunhofer.iais.eis.ConfigurationModelImpl; @@ -56,38 +55,6 @@ public ConnectorService(final ConfigModelService configModelService, } } - /** - * @param title the title of the connector - * @param description the description of the connector - * @param endpointAccessURL the access url to the connector - * @param version the version of the connector - * @param curator the curator of the connector - * @param maintainer the maintainer of the connector - * @param inboundedModelVersion the inbounded model version of the connector - * @param outboundedModelVersion the outbounded model version of the connector - * @return base connector - */ - public BaseConnector createConnector(final String title, - final String description, - final String endpointAccessURL, - final String version, - final String curator, - final String maintainer, - final String inboundedModelVersion, - final String outboundedModelVersion) { - - return new BaseConnectorBuilder() - ._title_(Util.asList(new TypedLiteral(title))) - ._description_(Util.asList(new TypedLiteral(description))) - ._hasEndpoint_(Util.asList(new ConnectorEndpointBuilder()._accessURL_(URI.create(endpointAccessURL)).build())) - ._version_(version) - ._curator_(URI.create(curator)) - ._maintainer_(URI.create(maintainer)) - ._inboundModelVersion_(Util.asList(inboundedModelVersion)) - ._outboundModelVersion_(outboundedModelVersion) - ._securityProfile_(SecurityProfile.BASE_SECURITY_PROFILE).build(); - } - /** * @param title title of the connector * @param description description of the connector diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java index b96df524..d891e97b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java @@ -10,14 +10,12 @@ import de.fraunhofer.iais.eis.ConstraintBuilder; import de.fraunhofer.iais.eis.ContractOffer; import de.fraunhofer.iais.eis.ContractOfferBuilder; -import de.fraunhofer.iais.eis.DigitalContent; import de.fraunhofer.iais.eis.DutyBuilder; import de.fraunhofer.iais.eis.Language; import de.fraunhofer.iais.eis.LeftOperand; import de.fraunhofer.iais.eis.NotMoreThanNOfferBuilder; import de.fraunhofer.iais.eis.PermissionBuilder; import de.fraunhofer.iais.eis.ProhibitionBuilder; -import de.fraunhofer.iais.eis.RepresentationImpl; import de.fraunhofer.iais.eis.Resource; import de.fraunhofer.iais.eis.ResourceBuilder; import de.fraunhofer.iais.eis.ResourceImpl; @@ -43,7 +41,6 @@ import java.io.IOException; import java.net.URI; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Objects; @@ -270,107 +267,6 @@ private void updateResourceContractInSubroutes(final RouteStep routeStep, } - /** - * This method returns from a resource the contract offer. - * - * @param resourceId id of the resource - * @return contract offer - */ - public ContractOffer getResourceContract(final URI resourceId) { - for (final var resource : getResources()) { - if (resourceId.equals(resource.getId()) && resource.getContractOffer().get(0) != null) { - return resource.getContractOffer().get(0); - } - } - return null; - } - - /** - * @param representationId id of the representation - * @return representation implementation - */ - public RepresentationImpl getResourceRepresentationInCatalog(final URI representationId) { - return (RepresentationImpl) getResources() - .stream() - .map(DigitalContent::getRepresentation) - .flatMap(Collection::stream) - .filter(representation -> representation.getId().equals(representationId)) - .findAny() - .orElse(null); - } - - /** - * @param resourceId id of the resource - * @param representationId id of the representation to delete - */ - public void deleteResourceRepresentationFromAppRoute(final URI resourceId, - final URI representationId) { - if (configModelService.getConfigModel().getAppRoute() == null) { - log.info("---- [ResourceService deleteResourceRepresentationFromAppRoute] Could not find any app route to delete the resource"); - } else { - final ArrayList emptyList = new ArrayList<>(); - for (final var route : configModelService.getConfigModel().getAppRoute()) { - if (route == null) { - continue; - } - if (route.getAppRouteOutput() != null) { - for (final var resource : route.getAppRouteOutput()) { - if (resource.getRepresentation() != null) { - resource.getRepresentation().removeIf(representation -> - representation.getId().equals(representationId) - ); - } - } - } - if (route.getHasSubRoute() == null) { - continue; - } - - for (final var subRoute : route.getHasSubRoute()) { - deleteRepresentationFromSubRoutes(subRoute, emptyList, resourceId, - representationId); - } - } - } - configModelService.saveState(); - } - - /** - * Delete occurrence of a resource representation with resourceID and representationID from. - * all SubRoutes - * - * @param current current Node in AppRoute - * @param visited already visited AppRoutes - * @param resourceId ID of the Resource for which the representation should be deleted - * @param representationId ID of the Representation to delete - */ - private void deleteRepresentationFromSubRoutes(final RouteStep current, - final List visited, - final URI resourceId, - final URI representationId) { - if (current == null) { - return; - } - if (current.getAppRouteOutput() != null) { - for (final var resource : current.getAppRouteOutput()) { - if (resource.getRepresentation() != null) { - resource.getRepresentation().removeIf(representation -> - representation.getId().equals(representationId) - ); - } - } - } - if (current.getHasSubRoute() == null) { - return; - } - for (final var subRoute : current.getHasSubRoute()) { - if (!visited.contains(subRoute)) { - visited.add(current); - deleteFromSubRoutes(subRoute, visited, resourceId); - } - } - } - /** * @param resourceId id of the resource */ diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java index 3cca2359..8a609034 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java @@ -65,14 +65,4 @@ public interface DefaultConnectorClient { * @throws IOException when an error occurs while sending the request */ BaseConnector getSelfDeclaration() throws IOException; - - /** - * Sends a contract request to a connector by building an ContractRequestMessage. - * - * @param recipientId id of the recipient - * @param requestedArtifactId id of the requested artifact - * @param contractOffer contract offer for the requested resource - * @return string, contract agreement id - */ - String requestContractAgreement(String recipientId, String requestedArtifactId, String contractOffer) throws IOException; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java index 83e47cb6..3cd5926d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java @@ -2,7 +2,6 @@ import de.fraunhofer.iais.eis.Representation; import de.fraunhofer.iais.eis.Resource; -import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.ResourceRepresentation; import okhttp3.Response; import java.io.IOException; @@ -48,16 +47,6 @@ public interface DefaultResourceClient { */ String deleteResource(URI resourceID) throws IOException; - /** - * Send a resource representation deletion request to a connector. - * - * @param resourceID ID of the Resource for which the representation is deleted - * @param representationID ID of the Representation to delete - * @return Response of the target Connector - * @throws IOException when an error occurs while sending the request - */ - String deleteResourceRepresentation(String resourceID, String representationID) throws IOException; - /** * Send a resource representation creation request to the connector. * @@ -83,18 +72,6 @@ String registerResourceRepresentation(String resourceID, Representation represen String updateResourceRepresentation(String resourceID, String representationID, Representation representation, String endpointId) throws IOException; - /** - * Updates a custom {@link ResourceRepresentation} at a connector. - * - * @param resourceID ID of the Resource for which the representation is updated - * @param representationID ID of the representation to be updated - * @param resourceRepresentation representation to be updated - * @return Response of the target Connector - * @throws IOException when an error occurs while sending the request - */ - String updateCustomResourceRepresentation(String resourceID, String representationID, - ResourceRepresentation resourceRepresentation) throws IOException; - /** * Updates a resource contract at a connector. * diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java index a77231f2..4db808da 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java @@ -167,41 +167,6 @@ public BaseConnector getBaseConnector(final String accessURL, final String resou return baseConnector; } - @Override - public String requestContractAgreement(final String recipientId, - final String requestedArtifactId, - final String contractOffer) throws IOException { - log.info("---- [DataspaceConnectorClient requestContractAgreement] Request contract agreement with recipient: {} and artifact: {}", recipientId, requestedArtifactId); - - final var builder = getRequestBuilder(); - final var urlBuilder = new HttpUrl.Builder() - .scheme(protocol) - .host(dataSpaceConnectorHost) - .port(dataSpaceConnectorPort) - .addPathSegments("admin/api/request/contract") - .addQueryParameter("recipient", recipientId) - .addQueryParameter("requestedArtifact", requestedArtifactId); - - final var url = urlBuilder.build(); - builder.url(url); - builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); - - if (contractOffer != null && !contractOffer.isBlank()) { - builder.post(RequestBody.create(contractOffer, okhttp3.MediaType.parse("application/ld+json"))); - } else { - builder.post(RequestBody.create(new byte[0], null)); - } - - final var request = builder.build(); - final var response = DispatchRequest.sendToDataspaceConnector(request); - - if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient requestContractAgreement] Could not request contract agreement"); - } - - return Objects.requireNonNull(response.body()).string(); - } - @Override public String getPolicyPattern(final String policy) throws IOException { log.info("---- [DataspaceConnectorClient getPolicyPattern] Get pattern for policy"); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java index 10d8442d..6b6bdcba 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java @@ -6,7 +6,6 @@ import de.fraunhofer.iais.eis.Resource; import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.BackendSource; -import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.ResourceRepresentation; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util.DispatchRequest; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util.ResourceMapper; import lombok.AccessLevel; @@ -168,36 +167,6 @@ public String deleteResource(final URI resourceID) throws IOException { return Objects.requireNonNull(response.body()).string(); } - @Override - public String deleteResourceRepresentation(final String resourceID, - final String representationID) throws IOException { - log.info(String.format( - "---- [DataspaceResourceClient deleteResourceRepresentation] Deleting representation %s from resource %s at %s", - representationID, - resourceID, - dataSpaceConnectorHost)); - - - final var mappedResourceID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); - final var mappedRepresentationID = dataSpaceConnectorResourceMapper.getMappedId(URI.create(representationID)); - dataSpaceConnectorResourceMapper.deleteResourceIDPair(URI.create(representationID)); - - final var builder = getRequestBuilder(); - builder.url(connectorBaseUrl + "admin/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); - builder.delete(); - builder.header("Authorization", - Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); - - final var request = builder.build(); - final var response = DispatchRequest.sendToDataspaceConnector(request); - - if (!response.isSuccessful()) { - log.warn("---- [DataspaceResourceClient deleteResourceRepresentation] Deleting Representation failed!"); - } - - return Objects.requireNonNull(response.body()).string(); - } - @Override public String registerResourceRepresentation(final String resourceID, final Representation representation, @@ -284,38 +253,6 @@ public String updateResourceRepresentation(final String resourceID, return Objects.requireNonNull(response.body()).string(); } - @Override - public String updateCustomResourceRepresentation(final String resourceID, - final String representationID, - final ResourceRepresentation resourceRepresentation) throws IOException { - log.info(String.format( - "---- [DataspaceResourceClient updateCustomResourceRepresentation] Updating representation %s for resource %s at %s", - representationID, - resourceID, - dataSpaceConnectorHost)); - - final var mappedResourceID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); - final var mappedRepresentationID = dataSpaceConnectorResourceMapper.getMappedId(URI.create(representationID)); - final var resourceJsonLD = MAPPER.writeValueAsString(resourceRepresentation); - - log.info("---- [DataspaceResourceClient updateCustomResourceRepresentation] Mapped representation: " + resourceJsonLD); - - final var builder = getRequestBuilder(); - builder.url(connectorBaseUrl + "admin/api/resources/" + mappedResourceID + "/" + mappedRepresentationID); - builder.put(RequestBody.create(resourceJsonLD, okhttp3.MediaType.parse("application/ld+json"))); - builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, - dataSpaceConnectorApiPassword)); - - final var request = builder.build(); - final var response = DispatchRequest.sendToDataspaceConnector(request); - - if (!response.isSuccessful()) { - log.warn("---- [DataspaceResourceClient updateCustomResourceRepresentation] Updating Resource-Representation failed!"); - } - - return Objects.requireNonNull(response.body()).string(); - } - @Override public String updateResourceContract(final String resourceID, final String contract) throws IOException { log.info(String.format( diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java index b28bad46..1842dfcb 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java @@ -47,17 +47,6 @@ public ResourceMapper(final ResourceIDPairRepository resourceIDPairRepository, this.endpointService = endpointService; } - /** - * The method return with the help of the uri from a resource the uuid. - * - * @param id of the resource - * @return uuid of the resource - */ - public UUID getMappedId(final URI id) { - final var pairs = resourceIDPairRepository.findByUri(id); - return pairs.isEmpty() ? null : pairs.get(0).getUuid(); - } - /** * The method cuts the last part of an uri. For example: * URI: https://w3id.org/idsa/autogen/configurationModel/9abd295d-b96f-49fa-8c10-a64179c24049 -> @@ -171,20 +160,6 @@ private BackendSource.Type resolveSourceType(final Representation representation return sourceType; } - /** - * The method deletes the ResourceIDPair object from the database. - * - * @param id of the resource - */ - public void deleteResourceIDPair(final URI id) { - final var pairs = resourceIDPairRepository.findByUri(id); - if (pairs.isEmpty()) { - return; - } - pairs.forEach(resourceIDPairRepository::delete); - resourceIDPairRepository.flush(); - } - /** * This method creates a new backend source for the representation. * diff --git a/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java b/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java index af5a00f9..97c09484 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java @@ -45,19 +45,6 @@ public class BrokerUIAPITest { @MockBean private ResourceService resourceService; - @Test - public void should_get_current_broker() throws Exception { - - CustomBroker broker = TestUtil.createCustomBroker(); - Mockito.when(brokerService.getById(broker.getBrokerUri())).thenReturn(broker); - - MvcResult result = this.mockMvc.perform(get("/api/ui/broker"). - param("brokerUri", broker.getBrokerUri().toString())).andReturn(); - - - assertEquals(200, result.getResponse().getStatus()); - } - @Test public void should_add_new_broker() throws Exception { From d5c16e91ad93150164790f80c183534b3f34226c Mon Sep 17 00:00:00 2001 From: omar Date: Tue, 13 Apr 2021 16:45:25 +0200 Subject: [PATCH 045/157] feat: add required parameter sourceType to createGenericEndpoint API --- .../java/de/fraunhofer/isst/configmanager/api/EndpointApi.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java index 3f8d1266..99ea1533 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java @@ -19,6 +19,7 @@ public interface EndpointApi { @ApiResponse(responseCode = "200", description = "Created a generic endpoint"), @ApiResponse(responseCode = "400", description = "Can not create the generic endpoint")}) ResponseEntity createGenericEndpoint(@RequestParam(value = "accessURL") String accessURL, + @RequestParam(value = "sourceType") String sourceType, @RequestParam(value = "username", required = false) String username, @RequestParam(value = "password", required = false) String password); From 793d1e9536732e49475051447e6d4ff0895669e9 Mon Sep 17 00:00:00 2001 From: omar Date: Tue, 13 Apr 2021 16:46:36 +0200 Subject: [PATCH 046/157] chore: set sourcetype property to generic endpoint --- .../configmanager/api/controller/EndpointController.java | 6 +++--- .../isst/configmanager/api/service/EndpointService.java | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java index 96f0222e..fedee49a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java @@ -67,12 +67,13 @@ public EndpointController(final Serializer serializer, */ @Override public ResponseEntity createGenericEndpoint(final String accessURL, + final String sourceType, final String username, final String password) { - log.info(">> POST /generic/endpoint accessURL: " + accessURL + " username: " + username); + log.info(">> POST /generic/endpoint accessURL: " + accessURL + "sourceType: " + sourceType + " username: " + username); ResponseEntity response; - final var genericEndpoint = endpointService.createGenericEndpoint(accessURL, username, password); + final var genericEndpoint = endpointService.createGenericEndpoint(accessURL, sourceType, username, password); if (genericEndpoint != null) { final var jsonObject = new JSONObject(); jsonObject.put("id", genericEndpoint.getId().toString()); @@ -308,7 +309,6 @@ public ResponseEntity createConnectorEndpoint(final String accessUrl) { final var connectorEndpoints = (ArrayList) baseConnector.getHasEndpoint(); final var connectorEndpoint = new ConnectorEndpointBuilder()._accessURL_(URI.create(accessUrl)).build(); - connectorEndpoints.add(connectorEndpoint); configModelService.saveState(); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java index 1328e7e8..73ba58ab 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java @@ -45,11 +45,14 @@ public EndpointService(final CustomGenericEndpointRepository customGenericEndpoi * @return generic endpoint */ public GenericEndpoint createGenericEndpoint(final String accessURL, + final String sourceType, final String username, final String password) { final var endpoint = new GenericEndpointBuilder()._accessURL_(URI.create(accessURL)).build(); final var endpointImpl = (GenericEndpointImpl) endpoint; + endpointImpl.setProperty("ids:sourceType", sourceType); + if (username != null && password != null) { endpointImpl .setGenericEndpointAuthentication( From 5d482c0ae4bd3ec2934e4328a304a7c139fcd31b Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Tue, 13 Apr 2021 16:58:04 +0200 Subject: [PATCH 047/157] refactor: APIs, re-added not yet used feature --- .../api/ConnectorRequestApi.java | 10 ++++++ .../ConnectorRequestController.java | 28 +++++++++++++++ .../api/service/ConnectorRequestService.java | 20 +++++++++++ .../clients/DefaultConnectorClient.java | 10 ++++++ .../clients/DataspaceConnectorClient.java | 35 +++++++++++++++++++ 5 files changed, 103 insertions(+) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java index eaebb7e4..4a632852 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java @@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; @@ -18,4 +19,13 @@ public interface ConnectorRequestApi { @ApiResponse(responseCode = "500", description = "Internal server error")}) ResponseEntity requestMetadata(@RequestParam("recipientId") URI recipientId, @RequestParam(value = "requestedResourceId", required = false) URI requestedResourceId); + + @PostMapping(value = "/request/contract", produces = "application/ld+json") + @Operation(summary = "Send a contract request to another IDS connector.") + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully send a contract request to another IDS connector"), + @ApiResponse(responseCode = "400", description = "Can not return the contract agreement id")}) + ResponseEntity requestContract(@RequestParam("recipientId") URI recipientId, + @RequestParam(value = "requestedArtifactId ") URI requestedArtifactId, + @RequestBody(required = false) String contractOffer); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java index 8e54a08e..ab31b6d6 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java @@ -10,6 +10,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import net.minidev.json.JSONObject; import java.io.IOException; import java.net.URI; @@ -75,4 +76,31 @@ public ResponseEntity requestMetadata(final URI recipientId, final URI r } return response; } + + @Override + public ResponseEntity requestContract(final URI recipientId, + final URI requestedArtifactId, + final String contractOffer) { + log.info(">> POST /request/contract recipientId: " + recipientId + " requestedArtifactId: " + requestedArtifactId + " contractOffer: " + contractOffer); + ResponseEntity response; + + final var contractAgreementId = connectorRequestService + .requestContractAgreement(recipientId.toString(), requestedArtifactId.toString(), contractOffer); + + if (contractAgreementId != null) { + final var jsonObject = new JSONObject(); + + if (contractAgreementId.contains("Failed")) { + jsonObject.put("message", contractAgreementId); + response = ResponseEntity.badRequest().body(jsonObject.toJSONString()); + } else { + jsonObject.put("agreementId", contractAgreementId); + response = ResponseEntity.ok(jsonObject.toJSONString()); + } + } else { + response = ResponseEntity.badRequest().body("Could not get agreement id for the contract"); + } + + return response; + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java index 002f5641..681f31da 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java @@ -80,4 +80,24 @@ public Resource requestResource(final URI recipientId, final URI requestedResour return null; } } + + /** + * This method requests the id of the contract agreement + * + * @param recipientId id of the recipient + * @param requestedArtifactId id of the requested artifact + * @param contractOffer contact offer for the requested resource + * @return string, contract acgreement id + */ + public String requestContractAgreement(final String recipientId, + final String requestedArtifactId, + final String contractOffer) { + + try { + return connectorClient.requestContractAgreement(recipientId, requestedArtifactId, contractOffer); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + return null; + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java index 8a609034..3cca2359 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java @@ -65,4 +65,14 @@ public interface DefaultConnectorClient { * @throws IOException when an error occurs while sending the request */ BaseConnector getSelfDeclaration() throws IOException; + + /** + * Sends a contract request to a connector by building an ContractRequestMessage. + * + * @param recipientId id of the recipient + * @param requestedArtifactId id of the requested artifact + * @param contractOffer contract offer for the requested resource + * @return string, contract agreement id + */ + String requestContractAgreement(String recipientId, String requestedArtifactId, String contractOffer) throws IOException; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java index 4db808da..db57cbb4 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java @@ -186,4 +186,39 @@ public String getPolicyPattern(final String policy) throws IOException { return Objects.requireNonNull(response.body()).string(); } + + @Override + public String requestContractAgreement(final String recipientId, + final String requestedArtifactId, + final String contractOffer) throws IOException { + log.info("---- [DataspaceConnectorClient requestContractAgreement] Request contract agreement with recipient: {} and artifact: {}", recipientId, requestedArtifactId); + + final var builder = getRequestBuilder(); + final var urlBuilder = new HttpUrl.Builder() + .scheme(protocol) + .host(dataSpaceConnectorHost) + .port(dataSpaceConnectorPort) + .addPathSegments("admin/api/request/contract") + .addQueryParameter("recipient", recipientId) + .addQueryParameter("requestedArtifact", requestedArtifactId); + + final var url = urlBuilder.build(); + builder.url(url); + builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + + if (contractOffer != null && !contractOffer.isBlank()) { + builder.post(RequestBody.create(contractOffer, okhttp3.MediaType.parse("application/ld+json"))); + } else { + builder.post(RequestBody.create(new byte[0], null)); + } + + final var request = builder.build(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + + if (!response.isSuccessful()) { + log.warn("---- [DataspaceConnectorClient requestContractAgreement] Could not request contract agreement"); + } + + return Objects.requireNonNull(response.body()).string(); + } } From 49824c55d8806fd018dd05b02cd8346879806de4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Tue, 13 Apr 2021 17:45:40 +0200 Subject: [PATCH 048/157] chore: add new api to request data (in progress) --- .../isst/configmanager/api/AppRouteApi.java | 6 +- .../isst/configmanager/api/BrokerApi.java | 6 +- .../isst/configmanager/api/ConnectorApi.java | 6 +- .../api/ConnectorRequestApi.java | 11 +++ .../isst/configmanager/api/EndpointApi.java | 6 +- .../isst/configmanager/api/ResourceApi.java | 6 +- .../api/ResourceRepresentationApi.java | 6 +- .../ConnectorRequestController.java | 71 ++++++++++++++++--- .../ResourceRepresentationController.java | 8 +-- .../api/service/AppRouteService.java | 12 +--- .../api/service/ConfigModelService.java | 12 +--- .../api/service/ConnectorRequestService.java | 44 ++++++++++-- .../api/service/ConnectorService.java | 7 +- .../api/service/EndpointService.java | 6 +- .../api/service/ResourceService.java | 21 +----- .../api/service/UtilService.java | 6 +- .../clients/DefaultConnectorClient.java | 14 ++++ .../clients/DefaultResourceClient.java | 2 +- .../clients/DataspaceConnectorClient.java | 44 +++++++++++- .../clients/DataspaceResourceClient.java | 16 +---- .../util/ResourceMapper.java | 6 +- .../model/config/ConfigModelObject.java | 7 +- .../model/config/CustomBroker.java | 6 +- .../model/config/QueryInput.java | 13 ++++ .../CustomGenericEndpointList.java | 9 +-- .../model/customapp/CustomApp.java | 7 +- .../customgenericendpoint/BackendConfig.java | 7 +- .../isst/configmanager/util/Utility.java | 6 +- 28 files changed, 202 insertions(+), 169 deletions(-) create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/model/config/QueryInput.java diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java index 15007bfd..a34bcb0c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java @@ -5,11 +5,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java index 82ecfcc0..fffae7c1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java @@ -4,11 +4,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java index 42ca4d15..e10f5c90 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java @@ -4,11 +4,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; public interface ConnectorApi { @GetMapping(value = "/connector", produces = "application/ld+json") diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java index 4a632852..3f482a4f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.api; +import de.fraunhofer.isst.configmanager.model.config.QueryInput; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; @@ -9,6 +10,7 @@ import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; +import java.util.UUID; public interface ConnectorRequestApi { @PostMapping(value = "/request/description", produces = "application/ld+json") @@ -28,4 +30,13 @@ ResponseEntity requestMetadata(@RequestParam("recipientId") URI recipien ResponseEntity requestContract(@RequestParam("recipientId") URI recipientId, @RequestParam(value = "requestedArtifactId ") URI requestedArtifactId, @RequestBody(required = false) String contractOffer); + + @PostMapping(value = "/request/artifact") + @Operation(summary = "Request data from another IDS connector.") + @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully requested data from another IDS connector.")}) + ResponseEntity requestData(@RequestParam("recipientId") URI recipientId, + @RequestParam(value = "requestedArtifactId ") URI requestedArtifactId, + @RequestParam(value = "contractId", required = false) URI contractId, + @RequestParam(value = "key") UUID key, + @RequestBody(required = false) QueryInput queryInput); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java index 3f8d1266..241054c1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java @@ -4,11 +4,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java index 0f97fca8..c4e89e18 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java @@ -4,11 +4,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.net.URI; import java.util.ArrayList; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java index ba92f25d..1c2057f8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java @@ -4,11 +4,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java index aac41844..4967b970 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java @@ -3,6 +3,7 @@ import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.isst.configmanager.api.ConnectorRequestApi; import de.fraunhofer.isst.configmanager.api.service.ConnectorRequestService; +import de.fraunhofer.isst.configmanager.model.config.QueryInput; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import net.minidev.json.JSONObject; @@ -14,6 +15,7 @@ import java.io.IOException; import java.net.URI; +import java.util.UUID; /** * The api class implements the ConnectorRequestApi and offers the possibilities to manage @@ -48,17 +50,12 @@ public ResponseEntity requestMetadata(final URI recipientId, final URI r ResponseEntity response; if (requestedResourceId != null) { - final var resource = connectorRequestService.requestResource(recipientId, requestedResourceId); - - if (resource != null) { - try { - response = ResponseEntity.ok(serializer.serialize(resource)); - } catch (IOException e) { - log.error(e.getMessage()); - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); - } + // JSON object contains key and the resource itself + final var validKeyAndResource = connectorRequestService.requestResource(recipientId, requestedResourceId); + if (validKeyAndResource != null) { + return ResponseEntity.ok(validKeyAndResource); } else { - response = ResponseEntity.badRequest().body("Could not get resource from the requested connector"); + response = ResponseEntity.badRequest().body("Could not get key and resource from the requested connector"); } } else { final var resources = connectorRequestService.requestResourcesFromConnector(recipientId); @@ -77,11 +74,18 @@ public ResponseEntity requestMetadata(final URI recipientId, final URI r return response; } + /** + * @param recipientId id of the recipient + * @param requestedArtifactId id of the requested artifact + * @param contractOffer the contract offer + * @return contract agreement id + */ @Override public ResponseEntity requestContract(final URI recipientId, final URI requestedArtifactId, final String contractOffer) { - log.info(">> POST /request/contract recipientId: " + recipientId + " requestedArtifactId: " + requestedArtifactId + " contractOffer: " + contractOffer); + log.info(">> POST /request/contract recipientId: " + recipientId + " requestedArtifactId: " + + requestedArtifactId + " contractOffer: " + contractOffer); ResponseEntity response; final var contractAgreementId = connectorRequestService @@ -103,4 +107,49 @@ public ResponseEntity requestContract(final URI recipientId, return response; } + + /** + * @param recipientId the target connector uri + * @param requestedArtifactId the requested artifact uri + * @param contractId the URI of the contract agreement + * @param key a {@link java.util.UUID} object + * @param queryInput the query to fetch data from backend systems + * @return requested data from an external connector + */ + @Override + public ResponseEntity requestData(final URI recipientId, + final URI requestedArtifactId, + final URI contractId, + final UUID key, + final QueryInput queryInput) { + + log.info(">> POST /request/artifact with recipient: {}, artifact: {}," + + " contract: {}, key: {} and queryInput: {} ", recipientId, requestedArtifactId, contractId, key, queryInput); + + ResponseEntity response = null; + + final var requestDataResponse = connectorRequestService.requestData(recipientId, requestedArtifactId, + contractId, key, queryInput); + + if (requestDataResponse != null) { + final var jsonObject = new JSONObject(); + jsonObject.put("message", requestDataResponse); + if (requestDataResponse.contains("Please check your DAT token.")) { + response = ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(jsonObject.toJSONString()); + } else if (requestDataResponse.contains("Your key is not valid.")) { + response = ResponseEntity.status(HttpStatus.FORBIDDEN).body(jsonObject.toJSONString()); + } else if (requestDataResponse.contains("Invalid input for headers or params.") + || requestDataResponse.contains("Could not parse query input from request body.")) { + response = ResponseEntity.badRequest().body(jsonObject.toJSONString()); + } else if (requestDataResponse.contains("Failed to build the ids message.") + || requestDataResponse.contains("Received invalid ids response message.") + || requestDataResponse.contains("Failed to send the ids message.") + || requestDataResponse.contains("Failed to read the ids response message.") + || requestDataResponse.contains("Could not update metadata.") + || requestDataResponse.contains("Failed to save data to database.")) { + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(jsonObject.toJSONString()); + } else response = ResponseEntity.ok(jsonObject.toJSONString()); + } + return response; + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java index 02d7ffa8..fde4f8aa 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java @@ -1,13 +1,7 @@ package de.fraunhofer.isst.configmanager.api.controller; -import de.fraunhofer.iais.eis.Artifact; -import de.fraunhofer.iais.eis.ArtifactBuilder; -import de.fraunhofer.iais.eis.IANAMediaTypeBuilder; -import de.fraunhofer.iais.eis.Language; -import de.fraunhofer.iais.eis.RepresentationBuilder; -import de.fraunhofer.iais.eis.RepresentationImpl; -import de.fraunhofer.iais.eis.ResourceImpl; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.api.ResourceRepresentationApi; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java index 3284f44c..1cff758f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java @@ -1,16 +1,6 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.AppRoute; -import de.fraunhofer.iais.eis.AppRouteBuilder; -import de.fraunhofer.iais.eis.AppRouteImpl; -import de.fraunhofer.iais.eis.BaseConnectorImpl; -import de.fraunhofer.iais.eis.ConfigurationModelImpl; -import de.fraunhofer.iais.eis.ConnectorEndpointBuilder; -import de.fraunhofer.iais.eis.Endpoint; -import de.fraunhofer.iais.eis.ResourceImpl; -import de.fraunhofer.iais.eis.RouteStep; -import de.fraunhofer.iais.eis.RouteStepBuilder; -import de.fraunhofer.iais.eis.RouteStepImpl; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.model.configlists.CustomAppRepository; import de.fraunhofer.isst.configmanager.model.configlists.EndpointInformationRepository; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java index ca956457..88d889d2 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java @@ -1,16 +1,6 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.BaseConnectorBuilder; -import de.fraunhofer.iais.eis.BasicAuthenticationBuilder; -import de.fraunhofer.iais.eis.ConfigurationModel; -import de.fraunhofer.iais.eis.ConfigurationModelBuilder; -import de.fraunhofer.iais.eis.ConfigurationModelImpl; -import de.fraunhofer.iais.eis.ConnectorDeployMode; -import de.fraunhofer.iais.eis.ConnectorStatus; -import de.fraunhofer.iais.eis.LogLevel; -import de.fraunhofer.iais.eis.ProxyBuilder; -import de.fraunhofer.iais.eis.ProxyImpl; -import de.fraunhofer.iais.eis.SecurityProfile; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; import de.fraunhofer.isst.configmanager.model.config.ConfigModelObject; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java index 681f31da..5ccf6ae7 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java @@ -3,6 +3,7 @@ import de.fraunhofer.iais.eis.Resource; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; +import de.fraunhofer.isst.configmanager.model.config.QueryInput; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -12,6 +13,7 @@ import java.net.URI; import java.util.ArrayList; import java.util.List; +import java.util.UUID; /** * Service class for managing external connector requests. @@ -25,7 +27,8 @@ public class ConnectorRequestService { private final transient DefaultConnectorClient connectorClient; @Autowired - public ConnectorRequestService(final DefaultResourceClient resourceClient, final DefaultConnectorClient connectorClient) { + public ConnectorRequestService(final DefaultResourceClient resourceClient, + final DefaultConnectorClient connectorClient) { this.resourceClient = resourceClient; this.connectorClient = connectorClient; } @@ -65,12 +68,15 @@ public List requestResourcesFromConnector(final URI recipientId) { * @param requestedResourceId id of the requested resource * @return resource */ - public Resource requestResource(final URI recipientId, final URI requestedResourceId) { - + public String requestResource(final URI recipientId, final URI requestedResourceId) { + String customResponse = ""; try { - final var resource = resourceClient.getRequestedResource(recipientId.toString(), requestedResourceId.toString()); - if (resource != null) { - return resource; + final var response = resourceClient.getRequestedResource(recipientId.toString(), requestedResourceId.toString()); + if (response != null) { + final var splitBody = response.split("\n", 2); + final var validationKey = splitBody[0].substring(12); + final var resource = splitBody[1].substring(10); + customResponse = "Validation Key: " + validationKey + "\nResource: " + resource; } else { log.info("Could not determine resource"); return null; @@ -79,6 +85,7 @@ public Resource requestResource(final URI recipientId, final URI requestedResour log.error(e.getMessage(), e); return null; } + return customResponse; } /** @@ -100,4 +107,29 @@ public String requestContractAgreement(final String recipientId, } return null; } + + /** + * Requests data from an external connector by building an ArtifactRequestMessage. + * + * @param recipientId The target connector uri + * @param requestedArtifactId The requested artifact uri + * @param contractId The URI of the contract agreement + * @param key a {@link java.util.UUID} object + * @param queryInput the query to fetch data from backend systems + * @return + */ + public String requestData(final URI recipientId, + final URI requestedArtifactId, + final URI contractId, + final UUID key, + final QueryInput queryInput) { + + try { + return connectorClient.requestData(recipientId.toString(), requestedArtifactId.toString(), contractId.toString(), + key.toString(), queryInput); + } catch (IOException e) { + log.error(e.getMessage(), e); + } + return null; + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java index 72b0c90e..d8622da8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java @@ -1,11 +1,6 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.BaseConnector; -import de.fraunhofer.iais.eis.BaseConnectorBuilder; -import de.fraunhofer.iais.eis.BaseConnectorImpl; -import de.fraunhofer.iais.eis.ConfigurationModelImpl; -import de.fraunhofer.iais.eis.ConnectorEndpointBuilder; -import de.fraunhofer.iais.eis.SecurityProfile; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.model.configlists.ConfigModelRepository; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java index 1328e7e8..d92525e9 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java @@ -1,10 +1,6 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.BasicAuthenticationBuilder; -import de.fraunhofer.iais.eis.Endpoint; -import de.fraunhofer.iais.eis.GenericEndpoint; -import de.fraunhofer.iais.eis.GenericEndpointBuilder; -import de.fraunhofer.iais.eis.GenericEndpointImpl; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.isst.configmanager.model.configlists.CustomGenericEndpointList; import de.fraunhofer.isst.configmanager.model.configlists.CustomGenericEndpointRepository; import de.fraunhofer.isst.configmanager.model.customgenericendpoint.CustomGenericEndpointObject; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java index b96df524..93e9ce42 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java @@ -3,26 +3,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import de.fraunhofer.iais.eis.Action; -import de.fraunhofer.iais.eis.AppRouteImpl; -import de.fraunhofer.iais.eis.BaseConnector; -import de.fraunhofer.iais.eis.BinaryOperator; -import de.fraunhofer.iais.eis.ConstraintBuilder; -import de.fraunhofer.iais.eis.ContractOffer; -import de.fraunhofer.iais.eis.ContractOfferBuilder; -import de.fraunhofer.iais.eis.DigitalContent; -import de.fraunhofer.iais.eis.DutyBuilder; -import de.fraunhofer.iais.eis.Language; -import de.fraunhofer.iais.eis.LeftOperand; -import de.fraunhofer.iais.eis.NotMoreThanNOfferBuilder; -import de.fraunhofer.iais.eis.PermissionBuilder; -import de.fraunhofer.iais.eis.ProhibitionBuilder; -import de.fraunhofer.iais.eis.RepresentationImpl; -import de.fraunhofer.iais.eis.Resource; -import de.fraunhofer.iais.eis.ResourceBuilder; -import de.fraunhofer.iais.eis.ResourceImpl; -import de.fraunhofer.iais.eis.RouteStep; -import de.fraunhofer.iais.eis.RouteStepImpl; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.util.RdfResource; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java index 8e5b24be..bd4f2316 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java @@ -1,10 +1,6 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.ConnectorDeployMode; -import de.fraunhofer.iais.eis.ConnectorStatus; -import de.fraunhofer.iais.eis.Language; -import de.fraunhofer.iais.eis.LogLevel; -import de.fraunhofer.iais.eis.SecurityProfile; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.BackendSource; import de.fraunhofer.isst.configmanager.model.config.BrokerStatus; import de.fraunhofer.isst.configmanager.model.routedeploymethod.DeployMethod; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java index 3cca2359..5508ee91 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java @@ -2,6 +2,7 @@ import de.fraunhofer.iais.eis.BaseConnector; import de.fraunhofer.iais.eis.ConfigurationModel; +import de.fraunhofer.isst.configmanager.model.config.QueryInput; import java.io.IOException; @@ -75,4 +76,17 @@ public interface DefaultConnectorClient { * @return string, contract agreement id */ String requestContractAgreement(String recipientId, String requestedArtifactId, String contractOffer) throws IOException; + + /** + * Requests data from an external connector. + * + * @param recipientId the target connector uri + * @param requestedArtifactId the requested artifact uri + * @param contractId the URI of the contract agreement + * @param key a unique validation key + * @param queryInput the query input to fetch data from the backend systems + * @return requested data or error message + */ + String requestData(String recipientId, String requestedArtifactId, String contractId, + String key, QueryInput queryInput) throws IOException; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java index 83e47cb6..1a1a6676 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java @@ -17,7 +17,7 @@ public interface DefaultResourceClient { * @param resourceId id of the resource * @return map from the id of the resource and the resource itself */ - Resource getRequestedResource(String accessURL, String resourceId) throws IOException; + String getRequestedResource(String accessURL, String resourceId) throws IOException; /** diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java index a77231f2..3c504eab 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java @@ -5,6 +5,7 @@ import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util.DispatchRequest; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util.ResourceMapper; +import de.fraunhofer.isst.configmanager.model.config.QueryInput; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; @@ -147,7 +148,7 @@ public BaseConnector getBaseConnector(final String accessURL, final String resou dataSpaceConnectorApiPassword)); builder.post(RequestBody.create(new byte[0], null)); - log.info("---- [DataspaceConnectorClient getBaseConnector] " + url.toString()); + log.info("---- [DataspaceConnectorClient getBaseConnector] " + url); final var request = builder.build(); final var response = DispatchRequest.sendToDataspaceConnector(request); @@ -202,6 +203,47 @@ public String requestContractAgreement(final String recipientId, return Objects.requireNonNull(response.body()).string(); } + @Override + public String requestData(String recipientId, String requestedArtifactId, String contractId, + String key, QueryInput queryInput) throws IOException { + + log.info("---- [DataspaceConnectorClient requestData] Request Data with recipient: {}, artifact: {}," + + " contract: {}, key: {} and queryInput: {} ", recipientId, requestedArtifactId, contractId, key, queryInput); + + final var builder = getRequestBuilder(); + final var urlBuilder = new HttpUrl.Builder() + .scheme(protocol) + .host(dataSpaceConnectorHost) + .port(dataSpaceConnectorPort) + .addPathSegments("admin/api/request/artifact") + .addQueryParameter("recipient", recipientId) + .addQueryParameter("requestedArtifact", requestedArtifactId) + .addQueryParameter("key", key); + + if (contractId != null && !contractId.isBlank()) { + urlBuilder.addQueryParameter("transferContract", contractId); + } + + final var url = urlBuilder.build(); + builder.url(url); + builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); + + if (queryInput != null) { + String query = MAPPER.writeValueAsString(queryInput); + builder.post(RequestBody.create(query, okhttp3.MediaType.parse("application/json"))); + } else { + builder.post(RequestBody.create(new byte[0], null)); + } + + final var request = builder.build(); + final var response = DispatchRequest.sendToDataspaceConnector(request); + + if (!response.isSuccessful()) { + log.warn("---- [DataspaceConnectorClient requestData] Could not request data"); + } + return Objects.requireNonNull(response.body()).string(); + } + @Override public String getPolicyPattern(final String policy) throws IOException { log.info("---- [DataspaceConnectorClient getPolicyPattern] Get pattern for policy"); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java index 10d8442d..2633e63a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java @@ -71,7 +71,7 @@ private JsonNode getJsonNodeOfBaseConnector() throws IOException { } @Override - public Resource getRequestedResource(final String accessURL, final String resourceId) throws IOException { + public String getRequestedResource(final String accessURL, final String resourceId) throws IOException { final var builder = getRequestBuilder(); final var urlBuilder = new HttpUrl.Builder() .scheme(protocol) @@ -93,19 +93,7 @@ public Resource getRequestedResource(final String accessURL, final String resour log.warn(String.format("---- [DataspaceResourceClient getRequestedResource] Could not get BaseConnector from %s!", dataSpaceConnectorHost)); } - final var body = Objects.requireNonNull(response.body()).string(); - final var splitBody = body.split("\n", 2); - final var resource = splitBody[1].substring(10); - - Resource deserializedResource = null; - try { - deserializedResource = SERIALIZER.deserialize(resource, Resource.class); - } catch (IOException e) { - log.error("---- [DataspaceResourceClient getRequestedResource] SERIALIZER.deserialize threw IOException"); - log.error(e.getMessage(), e); - } - - return deserializedResource; + return Objects.requireNonNull(response.body().string()); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java index b28bad46..d12e2047 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java @@ -1,10 +1,6 @@ package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util; -import de.fraunhofer.iais.eis.Artifact; -import de.fraunhofer.iais.eis.BasicAuthenticationImpl; -import de.fraunhofer.iais.eis.GenericEndpoint; -import de.fraunhofer.iais.eis.Representation; -import de.fraunhofer.iais.eis.Resource; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.iais.eis.util.RdfResource; import de.fraunhofer.iais.eis.util.TypedLiteral; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java b/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java index 23444149..37b35f2e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java @@ -7,12 +7,7 @@ import lombok.NoArgsConstructor; import lombok.experimental.FieldDefaults; -import javax.persistence.Column; -import javax.persistence.Convert; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import javax.persistence.*; /** * Entity class for the configuration model. diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java b/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java index ad7c3a5e..fdaf81dd 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java @@ -4,11 +4,7 @@ import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.ElementCollection; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import javax.persistence.*; import java.net.URI; import java.util.List; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/config/QueryInput.java b/src/main/java/de/fraunhofer/isst/configmanager/model/config/QueryInput.java new file mode 100644 index 00000000..b9352737 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/config/QueryInput.java @@ -0,0 +1,13 @@ +package de.fraunhofer.isst.configmanager.model.config; + +import lombok.Data; + +import java.util.HashMap; + +@Data +public class QueryInput { + + HashMap headers = new HashMap<>(); + HashMap params = new HashMap<>(); + HashMap pathVariables = new HashMap<>(); +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java index 8babab38..81270a6d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java @@ -6,14 +6,7 @@ import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; +import javax.persistence.*; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java b/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java index 91ae02c7..15d0b10d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java @@ -4,12 +4,7 @@ import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToMany; +import javax.persistence.*; import java.util.List; /** diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java b/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java index 6b661634..94639d37 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java @@ -7,12 +7,7 @@ import lombok.NoArgsConstructor; import lombok.experimental.FieldDefaults; -import javax.persistence.Column; -import javax.persistence.Convert; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.MappedSuperclass; +import javax.persistence.*; /** * The class helps to persist objects inherited from the endpoint from the information model. diff --git a/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java b/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java index c1312004..a5e87d1c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java @@ -1,10 +1,6 @@ package de.fraunhofer.isst.configmanager.util; -import de.fraunhofer.iais.eis.AppEndpoint; -import de.fraunhofer.iais.eis.AppEndpointBuilder; -import de.fraunhofer.iais.eis.AppEndpointType; -import de.fraunhofer.iais.eis.CustomMediaTypeBuilder; -import de.fraunhofer.iais.eis.Language; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; import lombok.experimental.UtilityClass; From c26e7bdc20e818e79a27c387c9a27f3b29d2d854 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Wed, 14 Apr 2021 11:00:10 +0200 Subject: [PATCH 049/157] refactor: small code adjustments --- .../resources/ResourceContractBuilder.java | 11 +++++++++- .../resources/ResourceContractService.java | 9 +++----- .../ResourceRepresentationService.java | 21 ++++++++++++------- .../service/resources/ResourceService.java | 6 +++++- 4 files changed, 31 insertions(+), 16 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java index 4ace4ea5..53683970 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java @@ -3,7 +3,16 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.Action; +import de.fraunhofer.iais.eis.BinaryOperator; +import de.fraunhofer.iais.eis.ConstraintBuilder; +import de.fraunhofer.iais.eis.ContractOffer; +import de.fraunhofer.iais.eis.ContractOfferBuilder; +import de.fraunhofer.iais.eis.DutyBuilder; +import de.fraunhofer.iais.eis.LeftOperand; +import de.fraunhofer.iais.eis.NotMoreThanNOfferBuilder; +import de.fraunhofer.iais.eis.PermissionBuilder; +import de.fraunhofer.iais.eis.ProhibitionBuilder; import de.fraunhofer.iais.eis.util.RdfResource; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java index df4b6d62..9221abb3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java @@ -64,7 +64,7 @@ public void updateResourceContractInAppRoute(final URI resourceId, final ContractOffer contractOffer) { // Update resource representation in app route if (configModelService.getConfigModel().getAppRoute() == null) { - log.info("---- [ResourceService updateResourceContractInAppRoute] Could not find any app route"); + log.info("---- [ResourceContractService updateResourceContractInAppRoute] Could not find any app route"); } else { final ArrayList emptyList = new ArrayList<>(); for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { @@ -77,8 +77,7 @@ public void updateResourceContractInAppRoute(final URI resourceId, if (resourceId.equals(resource.getId())) { final var resourceImpl = (ResourceImpl) resource; resourceImpl.setContractOffer(Util.asList(contractOffer)); - log.info("---- [ResourceService updateResourceContractInSubroutes] Updated" + - " resource contract in the app route"); + log.info("---- [ResourceContractService updateResourceContractInSubroutes] Updated resource contract in the app route"); break; } } @@ -113,8 +112,7 @@ private void updateResourceContractInSubroutes(final RouteStep routeStep, if (resourceId.equals(resource.getId())) { final var resourceImpl = (ResourceImpl) resource; resourceImpl.setContractOffer(Util.asList(contractOffer)); - log.info("---- [ResourceService updateResourceContractInSubroutes] Updated resource" + - " contract in the subroute"); + log.info("---- [ResourceContractService updateResourceContractInSubroutes] Updated resource contract in the subroute"); break; } } @@ -200,5 +198,4 @@ public ContractOffer getContractOffer(final Pattern pattern, final String contra } return contractOffer; } - } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java index 537eab7c..180be8a7 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java @@ -1,6 +1,11 @@ package de.fraunhofer.isst.configmanager.api.service.resources; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.AppRouteImpl; +import de.fraunhofer.iais.eis.DigitalContent; +import de.fraunhofer.iais.eis.RepresentationImpl; +import de.fraunhofer.iais.eis.Resource; +import de.fraunhofer.iais.eis.RouteStep; +import de.fraunhofer.iais.eis.RouteStepImpl; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; import de.fraunhofer.isst.configmanager.api.service.EndpointService; @@ -63,8 +68,8 @@ public RepresentationImpl getResourceRepresentationInCatalog(final URI represent public void deleteResourceRepresentationFromAppRoute(final URI resourceId, final URI representationId) { if (configModelService.getConfigModel().getAppRoute() == null) { - log.info("---- [ResourceService deleteResourceRepresentationFromAppRoute] Could not find" + - " any app route to delete the resource"); + log.info("---- [ResourceRepresentationService deleteResourceRepresentationFromAppRoute] Could not find" + + " any app route to delete the resource"); } else { final ArrayList emptyList = new ArrayList<>(); for (final var route : configModelService.getConfigModel().getAppRoute()) { @@ -191,7 +196,7 @@ public Resource getResourceInAppRoute(final URI resourceId) { for (final var resource : appRoute.getAppRouteOutput()) { if (resourceId.equals(resource.getId())) { foundResource = resource; - log.info("---- [ResourceService getResourceInAppRoute] Resource is found in the app route"); + log.info("---- [ResourceRepresentationService getResourceInAppRoute] Resource is found in the app route"); break; } } @@ -204,8 +209,8 @@ public Resource getResourceInAppRoute(final URI resourceId) { } } if (foundResource == null) { - log.info("---- [ResourceService getResourceInAppRoute] Could not find any resource" + - " in app routes and subroutes"); + log.info("---- [ResourceRepresentationService getResourceInAppRoute] Could not find any resource" + + " in app routes and subroutes"); } return foundResource; } @@ -227,12 +232,12 @@ private Resource getResourceInSubroutes(final RouteStep routeStep, for (final var resource : routeStep.getAppRouteOutput()) { if (resourceId.equals(resource.getId())) { foundResource = resource; - log.info("---- [ResourceService getResourceInSubroutes] Resource is found in subroute"); + log.info("---- [ResourceRepresentationService getResourceInSubroutes] Resource is found in subroute"); break; } } } - if (routeStep.getHasSubRoute()!=null && !routeStep.getHasSubRoute().isEmpty()) { + if (routeStep.getHasSubRoute() != null && !routeStep.getHasSubRoute().isEmpty()) { for (final var subRoute : routeStep.getHasSubRoute()) { if (!visited.contains(subRoute)) { visited.add(routeStep); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java index 31d6e00f..4de7e92a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java @@ -1,6 +1,10 @@ package de.fraunhofer.isst.configmanager.api.service.resources; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.Language; +import de.fraunhofer.iais.eis.Resource; +import de.fraunhofer.iais.eis.ResourceBuilder; +import de.fraunhofer.iais.eis.ResourceImpl; +import de.fraunhofer.iais.eis.RouteStep; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; From db73e8ee649b60b38132aadcfec29ffe7d31bb73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Wed, 14 Apr 2021 11:43:09 +0200 Subject: [PATCH 050/157] chore: add new api to request data (completed) --- .../ConnectorRequestController.java | 46 +++++++++---------- .../api/service/ConnectorRequestService.java | 13 +++--- .../clients/DefaultConnectorClient.java | 5 +- .../clients/DataspaceConnectorClient.java | 7 +-- 4 files changed, 36 insertions(+), 35 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java index 4967b970..9c015021 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java @@ -15,6 +15,7 @@ import java.io.IOException; import java.net.URI; +import java.util.Objects; import java.util.UUID; /** @@ -46,7 +47,7 @@ public ConnectorRequestController(final ConnectorRequestService connectorRequest */ @Override public ResponseEntity requestMetadata(final URI recipientId, final URI requestedResourceId) { - log.info(">> POST /request/description recipientId: " + recipientId + " requestedResourceId: " + requestedResourceId); + log.info(">> POST /request/description recipientId: {} and requestedResource: {}", recipientId, requestedResourceId); ResponseEntity response; if (requestedResourceId != null) { @@ -84,8 +85,10 @@ public ResponseEntity requestMetadata(final URI recipientId, final URI r public ResponseEntity requestContract(final URI recipientId, final URI requestedArtifactId, final String contractOffer) { - log.info(">> POST /request/contract recipientId: " + recipientId + " requestedArtifactId: " - + requestedArtifactId + " contractOffer: " + contractOffer); + log.info(">> POST /request/contract with recipient: {}, artifact: {}," + + " contract: {}", recipientId, requestedArtifactId, contractOffer); + + ResponseEntity response; final var contractAgreementId = connectorRequestService @@ -127,28 +130,23 @@ public ResponseEntity requestData(final URI recipientId, " contract: {}, key: {} and queryInput: {} ", recipientId, requestedArtifactId, contractId, key, queryInput); ResponseEntity response = null; - - final var requestDataResponse = connectorRequestService.requestData(recipientId, requestedArtifactId, - contractId, key, queryInput); - - if (requestDataResponse != null) { + try { + final var requestDataResponse = connectorRequestService.requestData(recipientId, requestedArtifactId, + contractId, key, queryInput); + final var clientResponseString = Objects.requireNonNull(requestDataResponse.body()).string(); final var jsonObject = new JSONObject(); - jsonObject.put("message", requestDataResponse); - if (requestDataResponse.contains("Please check your DAT token.")) { - response = ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(jsonObject.toJSONString()); - } else if (requestDataResponse.contains("Your key is not valid.")) { - response = ResponseEntity.status(HttpStatus.FORBIDDEN).body(jsonObject.toJSONString()); - } else if (requestDataResponse.contains("Invalid input for headers or params.") - || requestDataResponse.contains("Could not parse query input from request body.")) { - response = ResponseEntity.badRequest().body(jsonObject.toJSONString()); - } else if (requestDataResponse.contains("Failed to build the ids message.") - || requestDataResponse.contains("Received invalid ids response message.") - || requestDataResponse.contains("Failed to send the ids message.") - || requestDataResponse.contains("Failed to read the ids response message.") - || requestDataResponse.contains("Could not update metadata.") - || requestDataResponse.contains("Failed to save data to database.")) { - response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(jsonObject.toJSONString()); - } else response = ResponseEntity.ok(jsonObject.toJSONString()); + + if (requestDataResponse.isSuccessful() && !clientResponseString.contains("REJECTION")) { + final var splitBody = clientResponseString.split("\n", 2); + jsonObject.put("message", "Saved at: " + key); + jsonObject.put("data", splitBody[1].substring(10)); + response = ResponseEntity.ok(jsonObject.toJSONString()); + } else { + jsonObject.put("message", clientResponseString); + response = ResponseEntity.badRequest().body(clientResponseString); + } + } catch (IOException e) { + log.error(e.getMessage()); } return response; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java index 5ccf6ae7..a7151371 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java @@ -5,6 +5,7 @@ import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; import de.fraunhofer.isst.configmanager.model.config.QueryInput; import lombok.extern.slf4j.Slf4j; +import okhttp3.Response; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -116,13 +117,13 @@ public String requestContractAgreement(final String recipientId, * @param contractId The URI of the contract agreement * @param key a {@link java.util.UUID} object * @param queryInput the query to fetch data from backend systems - * @return + * @return response of data request */ - public String requestData(final URI recipientId, - final URI requestedArtifactId, - final URI contractId, - final UUID key, - final QueryInput queryInput) { + public Response requestData(final URI recipientId, + final URI requestedArtifactId, + final URI contractId, + final UUID key, + final QueryInput queryInput) { try { return connectorClient.requestData(recipientId.toString(), requestedArtifactId.toString(), contractId.toString(), diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java index 5508ee91..4bafa1ed 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java @@ -3,6 +3,7 @@ import de.fraunhofer.iais.eis.BaseConnector; import de.fraunhofer.iais.eis.ConfigurationModel; import de.fraunhofer.isst.configmanager.model.config.QueryInput; +import okhttp3.Response; import java.io.IOException; @@ -87,6 +88,6 @@ public interface DefaultConnectorClient { * @param queryInput the query input to fetch data from the backend systems * @return requested data or error message */ - String requestData(String recipientId, String requestedArtifactId, String contractId, - String key, QueryInput queryInput) throws IOException; + Response requestData(String recipientId, String requestedArtifactId, String contractId, + String key, QueryInput queryInput) throws IOException; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java index 3c504eab..433f0206 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java @@ -12,6 +12,7 @@ import okhttp3.Credentials; import okhttp3.HttpUrl; import okhttp3.RequestBody; +import okhttp3.Response; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.stereotype.Service; @@ -204,8 +205,8 @@ public String requestContractAgreement(final String recipientId, } @Override - public String requestData(String recipientId, String requestedArtifactId, String contractId, - String key, QueryInput queryInput) throws IOException { + public Response requestData(String recipientId, String requestedArtifactId, String contractId, + String key, QueryInput queryInput) throws IOException { log.info("---- [DataspaceConnectorClient requestData] Request Data with recipient: {}, artifact: {}," + " contract: {}, key: {} and queryInput: {} ", recipientId, requestedArtifactId, contractId, key, queryInput); @@ -241,7 +242,7 @@ public String requestData(String recipientId, String requestedArtifactId, String if (!response.isSuccessful()) { log.warn("---- [DataspaceConnectorClient requestData] Could not request data"); } - return Objects.requireNonNull(response.body()).string(); + return response; } @Override From 215b51ffba0bf748455217f4f66aa7b819fd98a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Wed, 14 Apr 2021 12:25:07 +0200 Subject: [PATCH 051/157] refactor/fix: instead of empty JsonArray an empty ArrayList is returned, this ensured that if no app routes were set, the routes page could not be loaded --- .../isst/configmanager/api/controller/AppRouteController.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java index 2c536804..3c75573d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import de.fraunhofer.iais.eis.AppRoute; import de.fraunhofer.iais.eis.AppRouteImpl; import de.fraunhofer.iais.eis.RouteStepImpl; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; @@ -26,6 +27,7 @@ import java.io.IOException; import java.net.URI; +import java.util.ArrayList; /** * The api class implements the AppRouteApi and offers the possibilities to manage @@ -160,7 +162,7 @@ public ResponseEntity getAppRoutes() { try { if (appRouteList == null) { log.info("---- [AppRouteController getAppRoutes] Returning empty list since no app routes are present"); - response = ResponseEntity.ok(objectMapper.writeValueAsString(new JSONArray())); + response = ResponseEntity.ok(serializer.serialize(new ArrayList())); } else { log.info("---- [AppRouteController getAppRoutes] Returning list of app routes"); response = ResponseEntity.ok(serializer.serialize(appRouteList)); From ef29cf2ddc43e004749511f735400b79e2b3b30c Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Wed, 14 Apr 2021 15:18:30 +0200 Subject: [PATCH 052/157] build: update version to 7.0.0 in pom --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e15fcb68..6ef0df59 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ de.fraunhofer.isst configurationmanager - 6.1.0-SNAPSHOT + 7.0.0 Configuration Manager Configuration Manager developed by the Fraunhofer ISST From 5909e575729772421ed0d3fa8abaa2a02d49d490 Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Wed, 14 Apr 2021 15:19:11 +0200 Subject: [PATCH 053/157] build: update version to 7.0.0 in dockerfile --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 69eb80a1..0ff9742c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,8 +12,8 @@ RUN mvn clean package FROM adoptopenjdk/openjdk11:jre-11.0.8_10-alpine RUN mkdir /app -COPY --from=maven /tmp/target/*.jar /app/configurationmanager-6.1.0-SNAPSHOT.jar +COPY --from=maven /tmp/target/*.jar /app/configurationmanager-7.0.0.jar WORKDIR /app/ -ENTRYPOINT ["java","-Dfile.encoding=UTF-8","-jar","configurationmanager-6.1.0-SNAPSHOT.jar"] +ENTRYPOINT ["java","-Dfile.encoding=UTF-8","-jar","configurationmanager-7.0.0.jar"] From 9adc6dbe860b47ebb827a034a77037a5400f5430 Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Wed, 14 Apr 2021 15:19:54 +0200 Subject: [PATCH 054/157] build: update version to 7.0.0 in App-Log --- .../fraunhofer/isst/configmanager/ConfigmanagerApplication.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java b/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java index a47005bd..6a10badd 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java @@ -28,7 +28,7 @@ @EnableScheduling @SpringBootApplication public class ConfigmanagerApplication { - public static final String CURRENT_VERSION = "6.1.0-SNAPSHOT"; + public static final String CURRENT_VERSION = "7.0.0"; public static void main(final String[] args) { log.info("---- [ConfigmanagerApplication] Starting ConfigManager " + CURRENT_VERSION); From c4f93fafcda139cdc1783343f1a6b37798e20a3f Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Wed, 14 Apr 2021 15:21:42 +0200 Subject: [PATCH 055/157] docs: update changelog --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 80e4bdb4..edc72477 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [6.1.0-SNAPSHOT] - UNRELEASED +## [7.0.0] - UNRELEASED ### Added - Minor Change: New API GET /api/ui/connector/status to return the accessibility-status of the Public-Connector-Endpoint - Minor Change: New API PUT /resource/contract/update to create the contract in the configmanager and update it at the dataspace connector @@ -24,6 +24,9 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - After editing the connector settings the broker will be updated with the new information - Updated recursion methods in ResourceService that caused problems +### Maintenance +- Major Change: Remove 20 unused APIs (unused by ConfigManager-UI project) + ## [6.0.0] - 2021-03-26 ### Added From 0109abc9fd6879c76e86590712fd09619ce1ea5c Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Wed, 14 Apr 2021 15:33:47 +0200 Subject: [PATCH 056/157] docs: update changelog with stat for API-refac. --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index edc72477..b6ff04ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Updated recursion methods in ResourceService that caused problems ### Maintenance -- Major Change: Remove 20 unused APIs (unused by ConfigManager-UI project) +- Major Change: Remove 20 unused APIs (= 1.150 lines of code) (unused by ConfigManager-UI project) ## [6.0.0] - 2021-03-26 From e329eea41007ae7a00a840d56841a3cbf74f894d Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Wed, 14 Apr 2021 16:06:09 +0200 Subject: [PATCH 057/157] refactor: merge dev into pull-request --- .../api/service/AppRouteService.java | 1 + .../api/service/ResourceService.java | 807 ------------------ 2 files changed, 1 insertion(+), 807 deletions(-) delete mode 100644 src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java index 6f8b60c7..823cff97 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java @@ -11,6 +11,7 @@ import de.fraunhofer.iais.eis.RouteStep; import de.fraunhofer.iais.eis.RouteStepBuilder; import de.fraunhofer.iais.eis.util.Util; +import de.fraunhofer.isst.configmanager.api.service.resources.ResourceService; import de.fraunhofer.isst.configmanager.model.configlists.CustomAppRepository; import de.fraunhofer.isst.configmanager.model.configlists.EndpointInformationRepository; import de.fraunhofer.isst.configmanager.model.configlists.RouteDeployMethodRepository; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java deleted file mode 100644 index d891e97b..00000000 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java +++ /dev/null @@ -1,807 +0,0 @@ -package de.fraunhofer.isst.configmanager.api.service; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import de.fraunhofer.iais.eis.Action; -import de.fraunhofer.iais.eis.AppRouteImpl; -import de.fraunhofer.iais.eis.BaseConnector; -import de.fraunhofer.iais.eis.BinaryOperator; -import de.fraunhofer.iais.eis.ConstraintBuilder; -import de.fraunhofer.iais.eis.ContractOffer; -import de.fraunhofer.iais.eis.ContractOfferBuilder; -import de.fraunhofer.iais.eis.DutyBuilder; -import de.fraunhofer.iais.eis.Language; -import de.fraunhofer.iais.eis.LeftOperand; -import de.fraunhofer.iais.eis.NotMoreThanNOfferBuilder; -import de.fraunhofer.iais.eis.PermissionBuilder; -import de.fraunhofer.iais.eis.ProhibitionBuilder; -import de.fraunhofer.iais.eis.Resource; -import de.fraunhofer.iais.eis.ResourceBuilder; -import de.fraunhofer.iais.eis.ResourceImpl; -import de.fraunhofer.iais.eis.RouteStep; -import de.fraunhofer.iais.eis.RouteStepImpl; -import de.fraunhofer.iais.eis.util.RdfResource; -import de.fraunhofer.iais.eis.util.TypedLiteral; -import de.fraunhofer.iais.eis.util.Util; -import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; -import de.fraunhofer.isst.configmanager.model.configlists.EndpointInformationRepository; -import de.fraunhofer.isst.configmanager.model.endpointinfo.EndpointInformation; -import de.fraunhofer.isst.configmanager.model.usagecontrol.Pattern; -import de.fraunhofer.isst.configmanager.util.CalenderUtil; -import lombok.AccessLevel; -import lombok.experimental.FieldDefaults; -import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.NotNull; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.io.IOException; -import java.net.URI; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -/** - * Service class for managing resources. - */ -@Slf4j -@Service -@Transactional -@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -public class ResourceService { - - transient ConfigModelService configModelService; - transient EndpointService endpointService; - transient EndpointInformationRepository endpointInformationRepository; - transient DefaultResourceClient resourceClient; - transient DefaultConnectorClient connectorClient; - - @Autowired - public ResourceService(final ConfigModelService configModelService, - final EndpointService endpointService, - final EndpointInformationRepository endpointInformationRepository, - final DefaultResourceClient resourceClient, - final DefaultConnectorClient connectorClient) { - this.configModelService = configModelService; - this.endpointService = endpointService; - this.endpointInformationRepository = endpointInformationRepository; - this.resourceClient = resourceClient; - this.connectorClient = connectorClient; - } - - /** - * Gets the {@link Resource} of a given resource ID. - * - * @param resourceId of the resource - * @return resource - */ - public Resource getResource(final URI resourceId) { - try { - return getResources().stream() - .dropWhile(res -> !res.getId().equals(resourceId)) - .findFirst() - .orElse(null); - } catch (Exception e) { - log.error(e.getMessage(), e); - return null; - } - } - - /** - * This method updates the content of the resource with the given parameters. - * - * @param title title of the resource - * @param description description of the resource - * @param language the language - * @param keywords the keywords - * @param version the version of the resource - * @param standardlicense the license of the resource - * @param publisher the publisher of the resource - * @param resourceImpl the resource implementation class to set the parameters - */ - public void updateResourceContent(final String title, final String description, - final String language, final List keywords, - final String version, final String standardlicense, - final String publisher, final ResourceImpl resourceImpl) { - if (title != null) { - resourceImpl.setTitle(Util.asList(new TypedLiteral(title))); - } - if (description != null) { - resourceImpl.setDescription(Util.asList(new TypedLiteral(description))); - } - if (language != null) { - resourceImpl.setLanguage(Util.asList(Language.valueOf(language))); - } - if (keywords != null) { - final ArrayList keys = new ArrayList<>(); - final var literal = new TypedLiteral(); - for (final var keyword : keywords) { - literal.setValue(keyword); - keys.add(literal); - } - resourceImpl.setKeyword(keys); - } - if (version != null) { - resourceImpl.setVersion(version); - } - if (standardlicense != null) { - resourceImpl.setStandardLicense(URI.create(standardlicense)); - } - if (publisher != null) { - resourceImpl.setPublisher(URI.create(publisher)); - } - } - - /** - * This method returns a list of all resources from the connector. - * - * @return list of resources from the connector - */ - public List getResources() { - final ArrayList resources = new ArrayList<>(); - - BaseConnector baseConnector = null; - try { - baseConnector = connectorClient.getSelfDeclaration(); - } catch (IOException e) { - log.error(e.getMessage(), e); - } - if (baseConnector != null && baseConnector.getResourceCatalog() != null) { - for (final var resourceCatalog : baseConnector.getResourceCatalog()) { - if (resourceCatalog.getOfferedResource() != null) { - resources.addAll(resourceCatalog.getOfferedResource()); - } - } - } - return resources; - } - - /** - * This method returns all offered resources of a connector as plain json String. - * - * @return list of resources from the connector - */ - public String getOfferedResourcesAsJsonString() { - try { - return resourceClient.getOfferedResourcesAsJsonString(); - } catch (IOException e) { - log.error(e.getMessage(), e); - return null; - } - } - - /** - * This method returns all requested resources of a connector as plain json String. - * - * @return list of resources from the connector - */ - public String getRequestedResourcesAsJsonString() { - try { - return resourceClient.getRequestedResourcesAsJsonString(); - } catch (IOException e) { - log.error(e.getMessage(), e); - return null; - } - } - - /** - * This method updates the resource contract with the given parameters. - * - * @param resourceId id of the resource - * @param contractOffer the contract offer which will be updated - */ - public void updateResourceContractInAppRoute(final URI resourceId, - final ContractOffer contractOffer) { - // Update resource representation in app route - if (configModelService.getConfigModel().getAppRoute() == null) { - log.info("---- [ResourceService updateResourceContractInAppRoute] Could not find any app route"); - } else { - final ArrayList emptyList = new ArrayList<>(); - for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { - - if (appRoute == null) { - continue; - } - - if (appRoute.getAppRouteOutput() != null) { - for (final var resource : appRoute.getAppRouteOutput()) { - if (resourceId.equals(resource.getId())) { - final var resourceImpl = (ResourceImpl) resource; - resourceImpl.setContractOffer(Util.asList(contractOffer)); - log.info("---- [ResourceService updateResourceContractInSubroutes] Updated resource contract in the app route"); - break; - } - } - } - - if (appRoute.getHasSubRoute() == null) { - continue; - } - - for (final var subRoute : appRoute.getHasSubRoute()) { - updateResourceContractInSubroutes(subRoute, emptyList, resourceId, - contractOffer); - } - } - configModelService.saveState(); - } - } - - /** - * @param routeStep route step - * @param visited list of route steps already managed - * @param resourceId id of the resource - * @param contractOffer the contract offer - */ - private void updateResourceContractInSubroutes(final RouteStep routeStep, - final List visited, - final URI resourceId, - final ContractOffer contractOffer) { - - if (routeStep == null) { - return; - } - - if (routeStep.getAppRouteOutput() != null) { - for (final var resource : routeStep.getAppRouteOutput()) { - if (resourceId.equals(resource.getId())) { - final var resourceImpl = (ResourceImpl) resource; - resourceImpl.setContractOffer(Util.asList(contractOffer)); - log.info("---- [ResourceService updateResourceContractInSubroutes] Updated resource contract in the subroute"); - break; - } - } - } - if (routeStep.getHasSubRoute() == null) { - return; - } - for (final var subRoute : routeStep.getHasSubRoute()) { - if (!visited.contains(subRoute)) { - visited.add(routeStep); - updateResourceContractInSubroutes(subRoute, visited, resourceId, contractOffer); - } - } - - } - - /** - * @param resourceId id of the resource - */ - public void deleteResourceFromAppRoute(final URI resourceId) { - if (configModelService.getConfigModel().getAppRoute() == null) { - log.info("---- [ResourceService deleteResourceFromAppRoute] Could not find any app route to delete the resource"); - } else { - final ArrayList emptyList = new ArrayList<>(); - for (final var route : configModelService.getConfigModel().getAppRoute()) { - if (route == null) { - continue; - } - if (route.getAppRouteOutput() != null) { - route.getAppRouteOutput().removeIf(resource -> resource.getId().equals(resourceId)); - } - if (route.getHasSubRoute() == null) { - continue; - } - - for (final var subRoute : route.getHasSubRoute()) { - deleteFromSubRoutes(subRoute, emptyList, resourceId); - } - } - } - configModelService.saveState(); - } - - /** - * Delete occurrence of a resource with resourceID from all SubRoutes. - * - * @param current current Node in AppRoute - * @param visited already visited AppRoutes - * @param resourceId ID of the Resource to delete - */ - private void deleteFromSubRoutes(final RouteStep current, final List visited, - final URI resourceId) { - if (current == null) { - return; - } - if (current.getAppRouteOutput() != null) { - current.getAppRouteOutput().removeIf(resource -> resource.getId().equals(resourceId)); - } - if (current.getHasSubRoute() == null) { - return; - } - for (final var subRoute : current.getHasSubRoute()) { - if (!visited.contains(subRoute)) { - visited.add(current); - deleteFromSubRoutes(subRoute, visited, resourceId); - } - } - } - - /** - * @param title title of the resource - * @param description description of the resource - * @param language language of the resource - * @param keywords keywords for the resource - * @param version version of the resource - * @param standardlicense standard license for the resource - * @param publisher the publisher of the resource - * @return resource implementation - */ - public ResourceImpl createResource(final String title, final String description, - final String language, final List keywords, - final String version, final String standardlicense, - final String publisher) { - - final ArrayList keys = new ArrayList<>(); - final var literal = new TypedLiteral(); - for (final var keyword : keywords) { - literal.setValue(keyword); - keys.add(literal); - } - - // Create the resource with the given parameters - return (ResourceImpl) new ResourceBuilder() - ._title_(Util.asList(new TypedLiteral(title))) - ._description_(Util.asList(new TypedLiteral(description))) - ._language_(Util.asList(Language.valueOf(language))) - ._keyword_(keys) - ._version_(version) - ._standardLicense_(URI.create(standardlicense)) - ._publisher_(URI.create(publisher)) - ._created_(CalenderUtil.getGregorianNow()) - ._modified_(CalenderUtil.getGregorianNow()) - .build(); - } - - public ResourceImpl updateResource(final URI resourceId, final String title, - final String description, final String language, - final List keywords, final String version, - final String standardlicense, final String publisher) { - //Get a Resource and update if it exists - for (final var resource : getResources()) { - if (resource.getId().equals(resourceId)) { - final var resImpl = (ResourceImpl) resource; - updateResourceContent(title, description, language, keywords, version, - standardlicense, publisher, resImpl); - return resImpl; - } - } - return null; - } - - /** - * @param newResource new resource old version should be replaced with - */ - public void updateResourceInAppRoute(final ResourceImpl newResource) { - // Update the resource in the app route - if (configModelService.getConfigModel().getAppRoute() == null) { - log.info("---- [ResourceService updateResourceInAppRoute] Could not find any app route to update the resource"); - } else { - final ArrayList emptyList = new ArrayList<>(); - for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { - - if (appRoute == null) { - continue; - } - - if (appRoute.getAppRouteOutput() != null) { - for (final var resource : appRoute.getAppRouteOutput()) { - if (newResource.getId().equals(resource.getId())) { - final ArrayList output = - (ArrayList) appRoute.getAppRouteOutput(); - output.remove(resource); - output.add(newResource); - log.info("---- [ResourceService updateResourceInAppRoute] Updated resource in app route"); - break; - } - } - } - - if (appRoute.getHasSubRoute() == null) { - continue; - } - - for (final var subRoute : appRoute.getHasSubRoute()) { - updateResourceInSubroutes(subRoute, emptyList, newResource); - } - } - configModelService.saveState(); - } - } - - /** - * @param routeStep routestep - * @param visited list of route steps already managed - * @param newResource new resource old version should be replaced with - */ - private void updateResourceInSubroutes(final RouteStep routeStep, - final List visited, - final ResourceImpl newResource) { - - if (routeStep == null) { - return; - } - if (routeStep.getAppRouteOutput() != null) { - for (final var resource : routeStep.getAppRouteOutput()) { - if (newResource.getId().equals(resource.getId())) { - final ArrayList output = - (ArrayList) routeStep.getAppRouteOutput(); - output.remove(resource); - output.add(newResource); - log.info("---- [ResourceService updateResourceInAppRoute] Updated resource in subroute"); - break; - } - } - } - if (routeStep.getHasSubRoute() == null) { - return; - } - for (final var subRoute : routeStep.getHasSubRoute()) { - if (!visited.contains(subRoute)) { - visited.add(routeStep); - updateResourceInSubroutes(subRoute, visited, newResource); - } - } - } - - /** - * This method updates a backend connection. - * - * @param resourceId id of the resource - * @param endpointId id of the endpoint - */ - public void updateBackendConnection(final URI resourceId, final URI endpointId) { - if (configModelService.getConfigModel().getAppRoute() != null) { - RouteStepImpl foundRouteStep = null; - AppRouteImpl appRouteImpl = null; - for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { - for (final var routeStep : appRoute.getHasSubRoute()) { - for (final var resource : routeStep.getAppRouteOutput()) { - if (resourceId.equals(resource.getId())) { - appRouteImpl = (AppRouteImpl) appRoute; - foundRouteStep = (RouteStepImpl) routeStep; - break; - } - } - } - } - - // Set app route start and subroute start to the updated endpoint - if (appRouteImpl != null) { - final var endpoint = endpointService.getGenericEndpoint(endpointId); - if (endpoint != null) { - appRouteImpl.setAppRouteStart(Util.asList(endpoint)); - foundRouteStep.setAppRouteStart(Util.asList(endpoint)); - } - } - } - - // Set first entry of endpoint informations to the new endpoint - if (endpointInformationRepository.findAll().size() > 0) { - final var endpointInfo = endpointInformationRepository.findAll().get(0); - endpointInfo.setEndpointId(endpointId.toString()); - endpointInformationRepository.saveAndFlush(endpointInfo); - } else { - final var endpointInformation = new EndpointInformation(); - endpointInformation.setEndpointId(endpointId.toString()); - endpointInformationRepository.saveAndFlush(endpointInformation); - } - } - - /** - * This method returns the resource if it is exists in an app route. - * - * @param resourceId id of the resource - * @return resource - */ - public Resource getResourceInAppRoute(final URI resourceId) { - - Resource foundResource = null; - final ArrayList emptyList = new ArrayList<>(); - for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { - - if (appRoute == null) { - continue; - } - - if (appRoute.getAppRouteOutput() != null) { - for (final var resource : appRoute.getAppRouteOutput()) { - if (resourceId.equals(resource.getId())) { - foundResource = resource; - log.info("---- [ResourceService getResourceInAppRoute] Resource is found in the app route"); - break; - } - } - } - - if (appRoute.getHasSubRoute() == null) { - continue; - } - - for (final var subRoute : appRoute.getHasSubRoute()) { - foundResource = getResourceInSubroutes(subRoute, emptyList, resourceId); - } - - } - if (foundResource == null) { - log.info("---- [ResourceService getResourceInAppRoute] Could not find any resource in app routes and subroutes"); - } - - return foundResource; - } - - /** - * @param routeStep routestep - * @param visited list of route steps already visited - * @param resourceId id of the resource - * @return resource - */ - private Resource getResourceInSubroutes(final RouteStep routeStep, - final List visited, - final URI resourceId) { - - Resource foundResource = null; - - if (routeStep == null) { - return null; - } - if (routeStep.getAppRouteOutput() != null) { - for (final var resource : routeStep.getAppRouteOutput()) { - if (resourceId.equals(resource.getId())) { - foundResource = resource; - log.info("---- [ResourceService getResourceInSubroutes] Resource is found in subroute"); - break; - } - } - } - - if (!routeStep.getHasSubRoute().isEmpty()) { - for (final var subRoute : routeStep.getHasSubRoute()) { - if (!visited.contains(subRoute)) { - visited.add(routeStep); - foundResource = getResourceInSubroutes(subRoute, visited, resourceId); - } - } - } - - return foundResource; - } - - /** - * @param pattern pattern to create appropriate contract offer - * @param contractJson the request body which holds the necessary information - * @return contract offer - */ - public ContractOffer getContractOffer(final Pattern pattern, final String contractJson) throws JsonProcessingException { - ContractOffer contractOffer = null; - - switch (pattern) { - case PROVIDE_ACCESS: - contractOffer = buildProvideAccess(); - break; - case PROHIBIT_ACCESS: - contractOffer = buildProhibitAccess(); - break; - case N_TIMES_USAGE: - if (contractJson != null && !contractJson.equals("{}")) { - final var jsonNode = getJsonNodeFromContract(contractJson); - - final var binaryOperator = getBinaryOperator(jsonNode); - final var number = jsonNode.get("number").asText(); - final var pipEndpoint = jsonNode.get("pipendpoint").asText(); - - contractOffer = buildNTimesUsage(binaryOperator, number, pipEndpoint); - break; - } - case DURATION_USAGE: - if (contractJson != null && !contractJson.equals("{}")) { - final var jsonNode = getJsonNodeFromContract(contractJson); - final var number = jsonNode.get("number").asText(); - - contractOffer = buildDurationUsage(number); - break; - } - case USAGE_NOTIFICATION: - if (contractJson != null && !contractJson.equals("{}")) { - final var jsonNode = getJsonNodeFromContract(contractJson); - final var url = jsonNode.get("url").asText(); - - contractOffer = buidUsageNotification(url); - break; - } - case USAGE_LOGGING: - contractOffer = buildUsageLogging(); - break; - - case USAGE_DURING_INTERVAL: - if (contractJson != null && !contractJson.equals("{}")) { - final var jsonNode = getJsonNodeFromContract(contractJson); - final var fromDate = jsonNode.get("fromDate").asText(); - final var toDate = jsonNode.get("toDate").asText(); - - contractOffer = buildUsageDuringInterval(fromDate, toDate); - break; - } - case USAGE_UNTIL_DELETION: - if (contractJson != null && !contractJson.equals("{}")) { - final var jsonNode = getJsonNodeFromContract(contractJson); - final var startDate = jsonNode.get("startDate").asText(); - final var endDate = jsonNode.get("endDate").asText(); - final var deletionDate = jsonNode.get("deletionDate").asText(); - - contractOffer = buildUsageUntilDeletion(startDate, endDate, deletionDate); - break; - } - default: - break; - } - return contractOffer; - } - - private ContractOffer buildUsageUntilDeletion(final String startDate, - final String endDate, - final String deletionDate) { - return new ContractOfferBuilder() - ._permission_(Util.asList(new PermissionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("usage-until-deletion"))) - ._action_(Util.asList(Action.USE)) - ._constraint_(Util.asList(new ConstraintBuilder() - ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) - ._operator_(BinaryOperator.AFTER) - ._rightOperand_(new RdfResource(startDate, - URI.create("xsd:dateTimeStamp"))) - .build(), new ConstraintBuilder() - ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) - ._operator_(BinaryOperator.BEFORE) - ._rightOperand_(new RdfResource(endDate, - URI.create("xsd:dateTimeStamp"))) - .build())) - ._postDuty_(Util.asList(new DutyBuilder() - ._action_(Util.asList(Action.DELETE)) - ._constraint_(Util.asList(new ConstraintBuilder() - ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) - ._operator_(BinaryOperator.TEMPORAL_EQUALS) - ._rightOperand_(new RdfResource(deletionDate, - URI.create("xsd:dateTimeStamp"))) - .build())) - .build())) - .build())) - .build(); - } - - private ContractOffer buildUsageDuringInterval(final String fromDate, - final String toDate) { - return new ContractOfferBuilder() - ._permission_(Util.asList(new PermissionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("usage-during-interval"))) - ._action_(Util.asList(Action.USE)) - ._constraint_(Util.asList(new ConstraintBuilder() - ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) - ._operator_(BinaryOperator.AFTER) - ._rightOperand_(new RdfResource(fromDate, - URI.create("xsd:dateTimeStamp"))) - .build(), new ConstraintBuilder() - ._leftOperand_(LeftOperand.POLICY_EVALUATION_TIME) - ._operator_(BinaryOperator.BEFORE) - ._rightOperand_(new RdfResource(toDate, - URI.create("xsd:dateTimeStamp"))) - .build())) - .build())) - .build(); - } - - private ContractOffer buildUsageLogging() { - return new ContractOfferBuilder() - ._permission_(Util.asList(new PermissionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("usage-logging"))) - ._action_(Util.asList(Action.USE)) - ._postDuty_(Util.asList(new DutyBuilder() - ._action_(Util.asList(Action.LOG)) - .build())) - .build())) - .build(); - } - - private ContractOffer buidUsageNotification(final String url) { - return new ContractOfferBuilder() - ._permission_(Util.asList(new PermissionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("usage-notification"))) - ._action_(Util.asList(Action.USE)) - ._postDuty_(Util.asList(new DutyBuilder() - ._action_(Util.asList(Action.NOTIFY)) - ._constraint_(Util.asList(new ConstraintBuilder() - ._leftOperand_(LeftOperand.ENDPOINT) - ._operator_(BinaryOperator.DEFINES_AS) - ._rightOperand_( - new RdfResource(url, URI.create("xsd:anyURI"))) - .build())) - .build())) - .build())) - .build(); - } - - private ContractOffer buildDurationUsage(final String number) { - return new ContractOfferBuilder() - ._permission_(Util.asList(new PermissionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("duration-usage"))) - ._action_(Util.asList(Action.USE)) - ._constraint_(Util.asList(new ConstraintBuilder() - ._leftOperand_(LeftOperand.ELAPSED_TIME) - ._operator_(BinaryOperator.SHORTER_EQ) - ._rightOperand_(new RdfResource(number, URI.create("xsd:duration"))) - .build())) - .build())) - .build(); - } - - @NotNull - private BinaryOperator getBinaryOperator(final JsonNode jsonNode) { - final var operator = jsonNode.get("binaryoperator").asText(); - - BinaryOperator binaryOperator; - if ("<".equals(operator)) { - binaryOperator = BinaryOperator.LT; - } else if ("<=".equals(operator)) { - binaryOperator = BinaryOperator.LTEQ; - } else { - binaryOperator = BinaryOperator.EQ; - } - return binaryOperator; - } - - private ContractOffer buildNTimesUsage(final BinaryOperator binaryOperator, - final String number, - final String pipEndpoint) { - return new NotMoreThanNOfferBuilder() - ._permission_(Util.asList(new PermissionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("n-times-usage"))) - ._action_(Util.asList(Action.USE)) - ._constraint_(Util.asList(new ConstraintBuilder() - ._leftOperand_(LeftOperand.COUNT) - ._operator_(binaryOperator) - ._rightOperand_(new RdfResource(number, URI.create("xsd:double"))) - ._pipEndpoint_( - URI.create(pipEndpoint)) - .build())) - .build())) - .build(); - } - - private ContractOffer buildProhibitAccess() { - return new ContractOfferBuilder() - ._prohibition_(Util.asList(new ProhibitionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("prohibit-access"))) - ._action_(Util.asList(Action.USE)) - .build())) - .build(); - } - - private ContractOffer buildProvideAccess() { - return new ContractOfferBuilder() - ._permission_(Util.asList(new PermissionBuilder() - ._title_(Util.asList(new TypedLiteral("Usage Policy"))) - ._description_(Util.asList(new TypedLiteral("provide-access"))) - ._action_(Util.asList(Action.USE)) - .build())) - .build(); - } - - /** - * @param contractJson the contract offer - * @return json node - */ - private JsonNode getJsonNodeFromContract(final String contractJson) throws JsonProcessingException { - final var mapper = new ObjectMapper(); - return mapper.readTree(Objects.requireNonNull(contractJson)); - } -} From 6ee107cd27e4555a07737bab647921b46c36b493 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Wed, 14 Apr 2021 16:22:52 +0200 Subject: [PATCH 058/157] refactor: small code adjustments --- .../isst/configmanager/api/AppRouteApi.java | 6 +++++- .../fraunhofer/isst/configmanager/api/BrokerApi.java | 6 +++++- .../isst/configmanager/api/EndpointApi.java | 6 +++++- .../isst/configmanager/api/ResourceApi.java | 6 +++++- .../api/controller/AppRouteController.java | 1 - .../api/service/ConfigModelService.java | 12 +++++++++++- .../configmanager/api/service/EndpointService.java | 6 +++++- .../isst/configmanager/api/service/UtilService.java | 6 +++++- .../dataspaceconnector/util/ResourceMapper.java | 6 +++++- .../model/config/ConfigModelObject.java | 7 ++++++- .../configmanager/model/config/CustomBroker.java | 6 +++++- .../model/configlists/CustomGenericEndpointList.java | 9 ++++++++- .../configmanager/model/customapp/CustomApp.java | 7 ++++++- .../model/customgenericendpoint/BackendConfig.java | 7 ++++++- .../fraunhofer/isst/configmanager/util/Utility.java | 6 +++++- 15 files changed, 82 insertions(+), 15 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java index 8dc6320f..d9fd6322 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java @@ -5,7 +5,11 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java index 6bce552a..f05dc370 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java @@ -4,7 +4,11 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java index d01e293a..e38927c3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java @@ -4,7 +4,11 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java index cc0a4340..1d4e105d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java @@ -4,7 +4,11 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; import java.util.ArrayList; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java index 3c75573d..dfdde780 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java @@ -18,7 +18,6 @@ import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; import net.minidev.json.JSONObject; -import org.json.JSONArray; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java index 88d889d2..ca956457 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java @@ -1,6 +1,16 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.BaseConnectorBuilder; +import de.fraunhofer.iais.eis.BasicAuthenticationBuilder; +import de.fraunhofer.iais.eis.ConfigurationModel; +import de.fraunhofer.iais.eis.ConfigurationModelBuilder; +import de.fraunhofer.iais.eis.ConfigurationModelImpl; +import de.fraunhofer.iais.eis.ConnectorDeployMode; +import de.fraunhofer.iais.eis.ConnectorStatus; +import de.fraunhofer.iais.eis.LogLevel; +import de.fraunhofer.iais.eis.ProxyBuilder; +import de.fraunhofer.iais.eis.ProxyImpl; +import de.fraunhofer.iais.eis.SecurityProfile; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; import de.fraunhofer.isst.configmanager.model.config.ConfigModelObject; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java index d92525e9..1328e7e8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java @@ -1,6 +1,10 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.BasicAuthenticationBuilder; +import de.fraunhofer.iais.eis.Endpoint; +import de.fraunhofer.iais.eis.GenericEndpoint; +import de.fraunhofer.iais.eis.GenericEndpointBuilder; +import de.fraunhofer.iais.eis.GenericEndpointImpl; import de.fraunhofer.isst.configmanager.model.configlists.CustomGenericEndpointList; import de.fraunhofer.isst.configmanager.model.configlists.CustomGenericEndpointRepository; import de.fraunhofer.isst.configmanager.model.customgenericendpoint.CustomGenericEndpointObject; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java index bd4f2316..8e5b24be 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java @@ -1,6 +1,10 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.ConnectorDeployMode; +import de.fraunhofer.iais.eis.ConnectorStatus; +import de.fraunhofer.iais.eis.Language; +import de.fraunhofer.iais.eis.LogLevel; +import de.fraunhofer.iais.eis.SecurityProfile; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.BackendSource; import de.fraunhofer.isst.configmanager.model.config.BrokerStatus; import de.fraunhofer.isst.configmanager.model.routedeploymethod.DeployMethod; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java index 86d840db..1842dfcb 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java @@ -1,6 +1,10 @@ package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.Artifact; +import de.fraunhofer.iais.eis.BasicAuthenticationImpl; +import de.fraunhofer.iais.eis.GenericEndpoint; +import de.fraunhofer.iais.eis.Representation; +import de.fraunhofer.iais.eis.Resource; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.iais.eis.util.RdfResource; import de.fraunhofer.iais.eis.util.TypedLiteral; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java b/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java index 37b35f2e..23444149 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java @@ -7,7 +7,12 @@ import lombok.NoArgsConstructor; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Convert; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; /** * Entity class for the configuration model. diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java b/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java index fdaf81dd..ad7c3a5e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java @@ -4,7 +4,11 @@ import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; import java.net.URI; import java.util.List; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java index 81270a6d..8babab38 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java @@ -6,7 +6,14 @@ import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java b/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java index 15d0b10d..91ae02c7 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java @@ -4,7 +4,12 @@ import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; import java.util.List; /** diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java b/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java index 94639d37..6b661634 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java @@ -7,7 +7,12 @@ import lombok.NoArgsConstructor; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Convert; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; /** * The class helps to persist objects inherited from the endpoint from the information model. diff --git a/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java b/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java index a5e87d1c..c1312004 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java @@ -1,6 +1,10 @@ package de.fraunhofer.isst.configmanager.util; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.AppEndpoint; +import de.fraunhofer.iais.eis.AppEndpointBuilder; +import de.fraunhofer.iais.eis.AppEndpointType; +import de.fraunhofer.iais.eis.CustomMediaTypeBuilder; +import de.fraunhofer.iais.eis.Language; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; import lombok.experimental.UtilityClass; From 9c7aaf3bfdc1041e7fdb969ae69f825d67028b66 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Wed, 14 Apr 2021 17:28:31 +0200 Subject: [PATCH 059/157] refactor: small code adjustments --- .../api/service/UtilService.java | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java index d02ac868..5fb35144 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java @@ -38,7 +38,7 @@ public String getSpecificEnum(final String enumName) { if (name.contains("loglevel")) { final var logLevels = LogLevel.values(); - for (LogLevel logLevel : logLevels) { + for (final var logLevel : logLevels) { var jsonObject = new JSONObject(); jsonObject.put("originalName", logLevel.name()); jsonObject.put("displayName", logLevel.getLabel().get(0).getValue()); @@ -48,7 +48,7 @@ public String getSpecificEnum(final String enumName) { } if (name.contains("connectorstatus")) { final var connectorStatuses = ConnectorStatus.values(); - for (ConnectorStatus connectorStatus : connectorStatuses) { + for (final var connectorStatus : connectorStatuses) { var jsonObject = new JSONObject(); jsonObject.put("originalName", connectorStatus.name()); jsonObject.put("displayName", connectorStatus.getLabel().get(0).getValue()); @@ -58,7 +58,7 @@ public String getSpecificEnum(final String enumName) { } if (name.contains("connectordeploymode")) { final var connectorDeployModes = ConnectorDeployMode.values(); - for (ConnectorDeployMode connectorDeployMode : connectorDeployModes) { + for (final var connectorDeployMode : connectorDeployModes) { var jsonObject = new JSONObject(); jsonObject.put("originalName", connectorDeployMode.name()); jsonObject.put("displayName", connectorDeployMode.getLabel().get(0).getValue()); @@ -68,19 +68,23 @@ public String getSpecificEnum(final String enumName) { } if (name.contains("language")) { final var languages = Language.values(); - for (Language language : languages) { + for (final var language : languages) { var jsonObject = new JSONObject(); jsonObject.put("originalName", language.name()); + + //Workaround for infomodel issue LT = LessThan if ("LT".equals(language.name())) { jsonObject.put("displayName", language.getLabel().get(1).getValue()); - } else jsonObject.put("displayName", language.getLabel().get(0).getValue()); + } else { + jsonObject.put("displayName", language.getLabel().get(0).getValue()); + } jsonArray.add(jsonObject); } sortedJsonArray = sortJsonArray(jsonArray); } if (name.contains("sourcetype")) { final var sourceTypes = BackendSource.Type.values(); - for (BackendSource.Type sourceType : sourceTypes) { + for (final var sourceType : sourceTypes) { var jsonObject = new JSONObject(); jsonObject.put("displayName", sourceType.name()); jsonArray.add(jsonObject); @@ -89,7 +93,7 @@ public String getSpecificEnum(final String enumName) { } if (name.contains("deploymethod")) { final var deployMethods = DeployMethod.values(); - for (DeployMethod deployMethod : deployMethods) { + for (final var deployMethod : deployMethods) { var jsonObject = new JSONObject(); jsonObject.put("displayName", deployMethod.name()); jsonArray.add(jsonObject); @@ -98,13 +102,15 @@ public String getSpecificEnum(final String enumName) { } if (name.contains("brokerstatus")) { final var brokerStatuses = BrokerStatus.values(); - for (BrokerStatus brokerStatus : brokerStatuses) { + for (final var brokerStatus : brokerStatuses) { var jsonObject = new JSONObject(); jsonObject.put("displayName", brokerStatus.name()); jsonArray.add(jsonObject); } sortedJsonArray = sortJsonArray(jsonArray); } + + assert sortedJsonArray != null; return sortedJsonArray.toJSONString(); } @@ -112,18 +118,19 @@ public String getSpecificEnum(final String enumName) { * @param jsonArray json array to be sorted * @return sorted json array */ - private JSONArray sortJsonArray(JSONArray jsonArray) { + private JSONArray sortJsonArray(final JSONArray jsonArray) { List jsonObjects = new ArrayList<>(); - JSONArray sortedJsonArray = new JSONArray(); + var sortedJsonArray = new JSONArray(); - for (Object o : jsonArray) { + for (final var o : jsonArray) { jsonObjects.add((JSONObject) o); } + jsonObjects.sort(new Comparator<>() { private static final String KEY_NAME = "displayName"; @Override - public int compare(JSONObject a, JSONObject b) { + public int compare(final JSONObject a, final JSONObject b) { String str1 = ""; String str2 = ""; try { From 2a80e85b3b2f1ac556bb10c1d7afc8d6b9c78728 Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Thu, 15 Apr 2021 08:05:31 +0200 Subject: [PATCH 060/157] docs: update changelog according to semver --- CHANGELOG.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 37748c03..7e323e79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,27 +6,27 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [7.0.0] - UNRELEASED +### Major Changes +- Remove 20 unused APIs (= 1.150 lines of code) (unused by ConfigManager-UI project) +- For the APIs of the enums, in addition to the technical name, such as DE for the language-dropdown, the written labels are now also supplied, e.g. German <-> DE. The structure of the API returns has changed accordingly + ### Added - Minor Change: New API GET /api/ui/connector/status to return the accessibility-status of the Public-Connector-Endpoint - Minor Change: New API PUT /resource/contract/update to create the contract in the configmanager and update it at the dataspace connector - Minor Change: New setting option to address the DSC via HTTP or HTTPS. dataspace.communication.ssl=true/false in application.properties and DATASPACE_COMMUNICATION_SSL=true/false in docker-compose environment. ### Changes -- Code and Architecture refactoring -- Docker: The Java version to be used is now fixed in the Dockerfile -- If running infomodel-deserialize throws IOException, these are now explicitly logged in the DataspaceConnectorClient -- Updated the Readme file -- Using labels instead of enum-names for better user experience +- Patch Change: Code and Architecture refactoring +- Patch Change: Docker, the Java version to be used is now fixed in the Dockerfile +- Patch Change: If running infomodel-deserialize throws IOException, these are now explicitly logged in the DataspaceConnectorClient +- Patch Change: Updated the Readme file ### Fixes -- POST /api​/ui​/broker​/register now return success:false if connector doesn't return 200 and GET /api​/ui​/brokers returns not registered in this case -- Resources are updated at broker after they have been edited -- Internal Database can be reached and viewed again at: http://localhost:8081/console -- After editing the connector settings the broker will be updated with the new information -- Updated recursion methods in ResourceService that caused problems - -### Maintenance -- Major Change: Remove 20 unused APIs (= 1.150 lines of code) (unused by ConfigManager-UI project) +- Patch Change: POST /api/ui/broker/register now return success:false if connector doesn't return 200 and GET /api/ui/brokers returns not registered in this case +- Patch Change: Resources are updated at broker after they have been edited +- Patch Change: Internal Database can be reached and viewed again at: http://localhost:8081/console +- Patch Change: After editing the connector settings the broker will be updated with the new information +- Patch Change: Updated recursion methods in ResourceService that caused problems ## [6.0.0] - 2021-03-26 From 6c6c94fc2041d8faa76914b530d1b35858cb74c9 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Thu, 15 Apr 2021 08:32:35 +0200 Subject: [PATCH 061/157] style: added custom banner at application startup instead of default banner --- CHANGELOG.md | 3 +++ src/main/resources/application.properties | 25 +++++++++++++---------- src/main/resources/banner.txt | 7 +++++++ 3 files changed, 24 insertions(+), 11 deletions(-) create mode 100644 src/main/resources/banner.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e323e79..653023ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,9 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Patch Change: After editing the connector settings the broker will be updated with the new information - Patch Change: Updated recursion methods in ResourceService that caused problems +### Miscellaneous +- Added custom banner at application startup instead of default banner + ## [6.0.0] - 2021-03-26 ### Added diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index bfaeb5be..3cfe158f 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,4 +1,4 @@ -### H2 ### +# H2 Database spring.datasource.url=jdbc:h2:file:./target/db/resources spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa @@ -10,16 +10,24 @@ spring.h2.console.settings.trace=false spring.h2.console.settings.web-allow-others=false spring.jpa.hibernate.ddl-auto=update -# swagger-ui custom path +# Swagger-UI springdoc.swagger-ui.path=/swagger-ui springdoc.swagger-ui.operations-sorter=method -# application information +# Application Settings application-version=@project.version@ default.enabled=true server.port=8081 -# enable client for dataspaceconnector +# Application Information +title=@project.name@ +version=@project.version@ +project_desc=@project.description@ +organization_name=@project.organization.name@ +licence=@licence_name@ +licence_url=@licence_url@ + +# Dataspace Connector settings dataspace.connector.enabled=true dataspace.connector.host=localhost dataspace.connector.port=8080 @@ -27,10 +35,5 @@ dataspace.connector.api.username=admin dataspace.connector.api.password=password dataspace.communication.ssl=true -#General Information -title=@project.name@ -version=@project.version@ -project_desc=@project.description@ -organization_name=@project.organization.name@ -licence=@licence_name@ -licence_url=@licence_url@ +# Miscellaneous Settings +spring.banner.location=classpath:banner.txt diff --git a/src/main/resources/banner.txt b/src/main/resources/banner.txt new file mode 100644 index 00000000..51bfee87 --- /dev/null +++ b/src/main/resources/banner.txt @@ -0,0 +1,7 @@ + ____ __ _ __ __ + / ___| ___ _ __ / _|(_) __ _ | \/ | __ _ _ __ __ _ __ _ ___ _ __ + | | / _ \ | '_ \ | |_ | | / _` || |\/| | / _` || '_ \ / _` | / _` | / _ \| '__| + | |___| (_) || | | || _|| || (_| || | | || (_| || | | || (_| || (_| || __/| | + \____|\___/ |_| |_||_| |_| \__, ||_| |_| \__,_||_| |_| \__,_| \__, | \___||_| + |___/ |___/ +IDS-ConfigurationManager ${application-version} From fe87e1e73b72736779a00c7c659311bba1383b07 Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Thu, 15 Apr 2021 08:41:56 +0200 Subject: [PATCH 062/157] docs: update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 530a48d7..34f64d4e 100644 --- a/README.md +++ b/README.md @@ -105,7 +105,7 @@ This is a list of currently implemented features, which is continuously updated. | ------ | ------ | ------ | ------ | ------ | | IDS Information Model Library | 4.0.2 | Apache 2.0 | Fraunhofer IAIS | [Sebastian Bader](mailto:sebastian.bader@iais.fraunhofer.de) | | IDS Information Model Serializer Library | 4.0.2 | Apache 2.0 | Fraunhofer IAIS | [Sebastian Bader](mailto:sebastian.bader@iais.fraunhofer.de) | -| [Dataspace Connector](https://github.com/International-Data-Spaces-Association/DataspaceConnector) | Recommended: 4.1.0 - 4.3.0 | Apache 2.0 | Fraunhofer ISST | [Julia Pampus](mailto:julia.pampus@isst.fraunhofer.de) | +| [Dataspace Connector](https://github.com/International-Data-Spaces-Association/DataspaceConnector) | Recommended: 4.1.0 - 4.3.1 | Apache 2.0 | Fraunhofer ISST | [Julia Pampus](mailto:julia.pampus@isst.fraunhofer.de) | | [Configuration Manager UI](https://github.com/International-Data-Spaces-Association/IDS-ConfigurationManager-UI) | latest | Apache 2.0 | Fraunhofer FKIE | [Bastian Weltjen](mailto:bastian.weltjen@fkie.fraunhofer.de) | --- From 1857ee619e182446ef9a3a91ec5a63c79cb47fb8 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Thu, 15 Apr 2021 09:27:40 +0200 Subject: [PATCH 063/157] chore: disabled Swagger-Petstore default playground --- CHANGELOG.md | 3 ++- pom.xml | 2 +- src/main/resources/application.properties | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 653023ad..30bb1fa7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,6 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Patch Change: Code and Architecture refactoring - Patch Change: Docker, the Java version to be used is now fixed in the Dockerfile - Patch Change: If running infomodel-deserialize throws IOException, these are now explicitly logged in the DataspaceConnectorClient -- Patch Change: Updated the Readme file ### Fixes - Patch Change: POST /api/ui/broker/register now return success:false if connector doesn't return 200 and GET /api/ui/brokers returns not registered in this case @@ -30,6 +29,8 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ### Miscellaneous - Added custom banner at application startup instead of default banner +- Updated Readme +- Disabled Swagger Petstore default playground ## [6.0.0] - 2021-03-26 diff --git a/pom.xml b/pom.xml index 6ef0df59..42541813 100644 --- a/pom.xml +++ b/pom.xml @@ -161,7 +161,7 @@ org.springdoc springdoc-openapi-ui - 1.5.3 + 1.5.7 diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 3cfe158f..2007fb49 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -13,6 +13,7 @@ spring.jpa.hibernate.ddl-auto=update # Swagger-UI springdoc.swagger-ui.path=/swagger-ui springdoc.swagger-ui.operations-sorter=method +springdoc.swagger-ui.disable-swagger-default-url=true # Application Settings application-version=@project.version@ From 3fe333315385e12fbd146efe49ba479b64c69873 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Thu, 15 Apr 2021 10:30:54 +0200 Subject: [PATCH 064/157] refactor: small code adjustments --- .../clients/DataspaceConnectorClient.java | 35 +++++-------------- 1 file changed, 9 insertions(+), 26 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java index c532c206..30e6adda 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java @@ -20,7 +20,7 @@ import java.util.Objects; /** - * An implementation of the interface DefaultConnectorClient for the DataspaceConnector. + * An implementation of the interface DefaultConnectorClient for the Dataspace Connector. */ @Slf4j @Service @@ -225,11 +225,14 @@ public String requestContractAgreement(final String recipientId, } @Override - public Response requestData(String recipientId, String requestedArtifactId, String contractId, - String key, QueryInput queryInput) throws IOException { + public Response requestData(final String recipientId, + final String requestedArtifactId, + final String contractId, + final String key, + final QueryInput queryInput) throws IOException { - log.info("---- [DataspaceConnectorClient requestData] Request Data with recipient: {}, artifact: {}," + - " contract: {}, key: {} and queryInput: {} ", recipientId, requestedArtifactId, contractId, key, queryInput); + log.info("---- [DataspaceConnectorClient requestData] Request Data with recipient: {}, artifact: {}," + + " contract: {}, key: {} and queryInput: {} ", recipientId, requestedArtifactId, contractId, key, queryInput); final var builder = getRequestBuilder(); final var urlBuilder = new HttpUrl.Builder() @@ -250,7 +253,7 @@ public Response requestData(String recipientId, String requestedArtifactId, Stri builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); if (queryInput != null) { - String query = MAPPER.writeValueAsString(queryInput); + final var query = MAPPER.writeValueAsString(queryInput); builder.post(RequestBody.create(query, okhttp3.MediaType.parse("application/json"))); } else { builder.post(RequestBody.create(new byte[0], null)); @@ -264,24 +267,4 @@ public Response requestData(String recipientId, String requestedArtifactId, Stri } return response; } - - @Override - public String getPolicyPattern(final String policy) throws IOException { - log.info("---- [DataspaceConnectorClient getPolicyPattern] Get pattern for policy"); - - final var builder = getRequestBuilder(); - builder.url(connectorBaseUrl + "/admin/api/example/policy-validation"); - builder.post(RequestBody.create(policy, okhttp3.MediaType.parse("application/ld+json"))); - builder.header("Authorization", - Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); - - final var request = builder.build(); - final var response = DispatchRequest.sendToDataspaceConnector(request); - - if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient getPolicyPattern] Pattern for policy could not be determined"); - } - - return Objects.requireNonNull(response.body()).string(); - } } From 1dc03d95773f859ff4dbe6f4d59c038a4f415fb1 Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Thu, 15 Apr 2021 11:06:50 +0200 Subject: [PATCH 065/157] docs: update changelog (add banner) --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 30bb1fa7..555b6b9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +``` + ____ __ _ __ __ + / ___| ___ _ __ / _|(_) __ _ | \/ | __ _ _ __ __ _ __ _ ___ _ __ + | | / _ \ | '_ \ | |_ | | / _` || |\/| | / _` || '_ \ / _` | / _` | / _ \| '__| + | |___| (_) || | | || _|| || (_| || | | || (_| || | | || (_| || (_| || __/| | + \____|\___/ |_| |_||_| |_| \__, ||_| |_| \__,_||_| |_| \__,_| \__, | \___||_| + |___/ |___/ +``` # Changelog All notable changes to this project will be documented in this file. From 6c360a61206b3f519e4560aa59f60a52fa1267d4 Mon Sep 17 00:00:00 2001 From: omar Date: Thu, 15 Apr 2021 11:32:37 +0200 Subject: [PATCH 066/157] chore: change proxyURI parameter type to URI in ConfigModelApi --- .../fraunhofer/isst/configmanager/api/ConfigModelApi.java | 2 +- .../api/controller/ConfigModelController.java | 2 +- .../configmanager/api/service/ConfigModelService.java | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ConfigModelApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConfigModelApi.java index 14cee406..bc280322 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ConfigModelApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConfigModelApi.java @@ -24,7 +24,7 @@ ResponseEntity updateConfigModel(@RequestParam(value = "loglevel", requi @RequestParam(value = "trustStorePassword", required = false) String trustStorePassword, @RequestParam(value = "keyStore", required = false) String keyStore, @RequestParam(value = "keyStorePassword", required = false) String keyStorePassword, - @RequestParam(value = "proxyUri", required = false) String proxyUri, + @RequestParam(value = "proxyUri", required = false) URI proxyUri, @RequestParam(value = "noProxyUri", required = false) ArrayList noProxyUriList, @RequestParam(value = "username", required = false) String username, @RequestParam(value = "password", required = false) String password); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java index 301f23f2..bfdb2fe6 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java @@ -67,7 +67,7 @@ public ResponseEntity updateConfigModel(final String loglevel, final String trustStorePassword, final String keyStore, final String keyStorePassword, - final String proxyUri, + final URI proxyUri, final ArrayList noProxyUriList, final String username, final String password) { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java index 88d889d2..d02a934d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java @@ -157,7 +157,7 @@ public boolean updateConfigurationModel(final String loglevel, final String trustStorePassword, final String keyStore, final String keyStorePassword, - final String proxyUri, + final URI proxyUri, final ArrayList noProxyUriList, final String username, final String password) { @@ -201,7 +201,7 @@ public boolean updateConfigurationModel(final String loglevel, * @param password password for the authentication * @param configmodelImpl configuration model implementation */ - public void updateProxySettings(final String proxyUri, final ArrayList noProxyUriList, + public void updateProxySettings(final URI proxyUri, final ArrayList noProxyUriList, final String username, final String password, final ConfigurationModelImpl configmodelImpl) { if ("null".equals(proxyUri)) { @@ -209,7 +209,7 @@ public void updateProxySettings(final String proxyUri, final ArrayList noPr } else { if (getConfigModelObject().getConfigurationModel().getConnectorProxy() == null) { final var proxy = new ProxyBuilder() - ._proxyURI_(URI.create(proxyUri)) + ._proxyURI_(proxyUri) ._noProxy_(noProxyUriList) ._proxyAuthentication_(new BasicAuthenticationBuilder() ._authUsername_(username)._authPassword_(password).build()) @@ -219,7 +219,7 @@ public void updateProxySettings(final String proxyUri, final ArrayList noPr final var proxyImpl = (ProxyImpl) getConfigModelObject().getConfigurationModel().getConnectorProxy().get(0); - proxyImpl.setProxyURI(URI.create(proxyUri)); + proxyImpl.setProxyURI(proxyUri); if (noProxyUriList != null) { proxyImpl.setNoProxy(noProxyUriList); } From d9f6e41410e6c78679ecba2822103422367cf741 Mon Sep 17 00:00:00 2001 From: omar Date: Thu, 15 Apr 2021 11:48:50 +0200 Subject: [PATCH 067/157] chore: change curator and maintainer parameter type to URI in ConnectorApi --- .../isst/configmanager/api/ConnectorApi.java | 8 ++++---- .../api/controller/ConnectorController.java | 8 ++++---- .../api/service/ConnectorService.java | 16 ++++++++-------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java index 6a77db4a..b8c10782 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java @@ -36,8 +36,8 @@ ResponseEntity createConnector(@RequestParam("title") String title, @RequestParam("description") String description, @RequestParam("endpointAccessURL") URI endpointAccessURL, @RequestParam("version") String version, - @RequestParam("curator") String curator, - @RequestParam("maintainer") String maintainer, + @RequestParam("curator") URI curator, + @RequestParam("maintainer") URI maintainer, @RequestParam("inboundModelVersion") String inboundModelVersion, @RequestParam("outboundModelVersion") String outboundModelVersion); @@ -52,8 +52,8 @@ ResponseEntity updateConnector(@RequestParam(value = "title", required = @RequestParam(value = "description", required = false) String description, @RequestParam(value = "endpoint", required = false) String endpoint, @RequestParam(value = "version", required = false) String version, - @RequestParam(value = "curator", required = false) String curator, - @RequestParam(value = "maintainer", required = false) String maintainer, + @RequestParam(value = "curator", required = false) URI curator, + @RequestParam(value = "maintainer", required = false) URI maintainer, @RequestParam(value = "inboundModelVersion", required = false) String inboundModelVersion, @RequestParam(value = "outboundModelVersion", required = false) String outboundModelVersion); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java index ae29f35f..4fbf14bf 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java @@ -157,8 +157,8 @@ public ResponseEntity getConnectorJson() { @Override public ResponseEntity createConnector(final String title, final String description, final URI endpointAccessURL, - final String version, final String curator, - final String maintainer, + final String version, final URI curator, + final URI maintainer, final String inboundModelVersion, final String outboundModelVersion) { log.info(">> POST /connector"); @@ -193,8 +193,8 @@ public ResponseEntity createConnector(final String title, final String d @Override public ResponseEntity updateConnector(final String title, final String description, final String endpointAccessURL, - final String version, final String curator, - final String maintainer, + final String version, final URI curator, + final URI maintainer, final String inboundModelVersion, final String outboundModelVersion) { log.info(">> PUT /connector title: " + title + " description: " + " endpointAccessURL: " + endpointAccessURL diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java index d1f9978f..625f3ef2 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java @@ -66,8 +66,8 @@ public BaseConnector createConnector(final String title, final String description, final URI endpointAccessURL, final String version, - final String curator, - final String maintainer, + final URI curator, + final URI maintainer, final String inboundedModelVersion, final String outboundedModelVersion) { @@ -76,8 +76,8 @@ public BaseConnector createConnector(final String title, ._description_(Util.asList(new TypedLiteral(description))) ._hasEndpoint_(Util.asList(new ConnectorEndpointBuilder()._accessURL_(endpointAccessURL).build())) ._version_(version) - ._curator_(URI.create(curator)) - ._maintainer_(URI.create(maintainer)) + ._curator_(curator) + ._maintainer_(maintainer) ._inboundModelVersion_(Util.asList(inboundedModelVersion)) ._outboundModelVersion_(outboundedModelVersion) ._securityProfile_(SecurityProfile.BASE_SECURITY_PROFILE).build(); @@ -98,8 +98,8 @@ public boolean updateConnector(final String title, final String description, final String endpointAccessURL, final String version, - final String curator, - final String maintainer, + final URI curator, + final URI maintainer, final String inboundModelVersion, final String outboundModelVersion) { @@ -121,10 +121,10 @@ public boolean updateConnector(final String title, connector.setVersion(version); } if (curator != null) { - connector.setCurator(URI.create(curator)); + connector.setCurator(curator); } if (maintainer != null) { - connector.setMaintainer(URI.create(maintainer)); + connector.setMaintainer(maintainer); } if (inboundModelVersion != null) { connector.setInboundModelVersion(Util.asList(inboundModelVersion)); From 2e208c08b3a39782db0b6db92177f3dab64248e7 Mon Sep 17 00:00:00 2001 From: omar Date: Thu, 15 Apr 2021 11:50:13 +0200 Subject: [PATCH 068/157] chore: change accessURL parameter type to URI in EndpointApi --- .../de/fraunhofer/isst/configmanager/api/EndpointApi.java | 2 +- .../isst/configmanager/api/controller/EndpointController.java | 2 +- .../isst/configmanager/api/service/EndpointService.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java index 929f4486..01aca806 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java @@ -46,7 +46,7 @@ ResponseEntity createGenericEndpoint(@RequestParam(value = "accessURL") @ApiResponse(responseCode = "200", description = "Updated a generic endpoint"), @ApiResponse(responseCode = "400", description = "Can not update the generic endpoint")}) ResponseEntity updateGenericEndpoint(@RequestParam(value = "id") URI id, - @RequestParam(value = "accessURL", required = false) String accessURL, + @RequestParam(value = "accessURL", required = false) URI accessURL, @RequestParam(value = "username", required = false) String username, @RequestParam(value = "password", required = false) String password); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java index f82b0cc4..84c1e033 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java @@ -167,7 +167,7 @@ public ResponseEntity deleteGenericEndpoint(final URI endpointId) { */ @Override public ResponseEntity updateGenericEndpoint(final URI endpointId, - final String accessURL, + final URI accessURL, final String username, final String password) { log.info(">> PUT /generic/endpoint endpointId: " + endpointId + " accessURL: " + accessURL); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java index 273e260e..77be9462 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java @@ -119,7 +119,7 @@ public boolean deleteGenericEndpoint(final URI id) { * @return true, if generic endpoint is updated */ public boolean updateGenericEndpoint(final URI id, - final String accessURL, + final URI accessURL, final String username, final String password) { @@ -131,7 +131,7 @@ public boolean updateGenericEndpoint(final URI id, final var genericEndpointNewImpl = (GenericEndpointImpl) genericEndpointNew; if (accessURL != null) { - genericEndpointNewImpl.setAccessURL(URI.create(accessURL)); + genericEndpointNewImpl.setAccessURL(accessURL); } final var basicAuthentication = genericEndpointNew.getGenericEndpointAuthentication(); From 4d52ac072ac7f88923488554d6660693a08b349b Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Thu, 15 Apr 2021 13:48:58 +0200 Subject: [PATCH 069/157] refactor: minor code adjustments --- .../isst/configmanager/api/controller/EndpointController.java | 2 +- .../isst/configmanager/api/service/ResourceService.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java index 84c1e033..02685b31 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java @@ -295,7 +295,7 @@ public ResponseEntity getConnectorEndpointsFromClient(final URI accessUr * @return a suitable http response depending on success */ @Override - public ResponseEntity createConnectorEndpoint(URI accessUrl) { + public ResponseEntity createConnectorEndpoint(final URI accessUrl) { log.info(">> POST /connector/endpoint accessUrl: " + accessUrl); final var configModelImpl = (ConfigurationModelImpl) configModelService.getConfigModel(); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java index 5c9b63ed..fd375dfe 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ResourceService.java @@ -89,7 +89,7 @@ public Resource getResource(final URI resourceId) { */ public void updateResourceContent(final String title, final String description, final String language, final List keywords, - final String version, URI standardlicense, + final String version, final URI standardlicense, final URI publisher, final ResourceImpl resourceImpl) { if (title != null) { resourceImpl.setTitle(Util.asList(new TypedLiteral(title))); From b5d6a36c69020e048f69ff3f1a6f894e1dfe1afe Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Thu, 15 Apr 2021 14:17:35 +0200 Subject: [PATCH 070/157] refactor: merge dev into brach 80 --- .../isst/configmanager/api/ConnectorApi.java | 8 +++++--- .../api/controller/ConnectorController.java | 8 +++++--- .../api/service/ConnectorService.java | 4 ++-- .../api/service/resources/ResourceService.java | 18 +++++++++--------- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java index 5aaaffd8..24d95203 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java @@ -8,6 +8,8 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestParam; +import java.net.URI; + public interface ConnectorApi { @GetMapping(value = "/connector", produces = "application/ld+json") @Operation(summary = "Get the Connector-Description") @@ -31,10 +33,10 @@ public interface ConnectorApi { @ApiResponse(responseCode = "400", description = "Failed to update the connector. The configuration model is not valid")}) ResponseEntity updateConnector(@RequestParam(value = "title", required = false) String title, @RequestParam(value = "description", required = false) String description, - @RequestParam(value = "endpoint", required = false) String endpoint, + @RequestParam(value = "endpoint", required = false) URI endpoint, @RequestParam(value = "version", required = false) String version, - @RequestParam(value = "curator", required = false) String curator, - @RequestParam(value = "maintainer", required = false) String maintainer, + @RequestParam(value = "curator", required = false) URI curator, + @RequestParam(value = "maintainer", required = false) URI maintainer, @RequestParam(value = "inboundModelVersion", required = false) String inboundModelVersion, @RequestParam(value = "outboundModelVersion", required = false) String outboundModelVersion); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java index 850e4cc7..6c8b600b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java @@ -128,9 +128,11 @@ public ResponseEntity getConnectorStatus() { * @return http response message with the id of the created connector */ @Override - public ResponseEntity updateConnector(final String title, final String description, - final String endpointAccessURL, - final String version, final URI curator, + public ResponseEntity updateConnector(final String title, + final String description, + final URI endpointAccessURL, + final String version, + final URI curator, final URI maintainer, final String inboundModelVersion, final String outboundModelVersion) { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java index 618d078c..8f7b324d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java @@ -68,7 +68,7 @@ public ConnectorService(final ConfigModelService configModelService, */ public boolean updateConnector(final String title, final String description, - final String endpointAccessURL, + final URI endpointAccessURL, final String version, final URI curator, final URI maintainer, @@ -87,7 +87,7 @@ public boolean updateConnector(final String title, } if (endpointAccessURL != null) { connector.setHasEndpoint(Util.asList(new ConnectorEndpointBuilder() - ._accessURL_(URI.create(endpointAccessURL)).build())); + ._accessURL_(endpointAccessURL).build())); } if (version != null) { connector.setVersion(version); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java index 4de7e92a..37b1ef0f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java @@ -57,8 +57,8 @@ public ResourceService(final ConfigModelService configModelService, */ public void updateResourceContent(final String title, final String description, final String language, final List keywords, - final String version, final String standardlicense, - final String publisher, final ResourceImpl resourceImpl) { + final String version, final URI standardlicense, + final URI publisher, final ResourceImpl resourceImpl) { if (title != null) { resourceImpl.setTitle(Util.asList(new TypedLiteral(title))); } @@ -81,10 +81,10 @@ public void updateResourceContent(final String title, final String description, resourceImpl.setVersion(version); } if (standardlicense != null) { - resourceImpl.setStandardLicense(URI.create(standardlicense)); + resourceImpl.setStandardLicense(standardlicense); } if (publisher != null) { - resourceImpl.setPublisher(URI.create(publisher)); + resourceImpl.setPublisher(publisher); } } @@ -155,8 +155,8 @@ public void deleteResourceFromAppRoute(final URI resourceId) { */ public ResourceImpl createResource(final String title, final String description, final String language, final List keywords, - final String version, final String standardlicense, - final String publisher) { + final String version, final URI standardlicense, + final URI publisher) { final ArrayList keys = new ArrayList<>(); final var literal = new TypedLiteral(); @@ -172,8 +172,8 @@ public ResourceImpl createResource(final String title, final String description, ._language_(Util.asList(Language.valueOf(language))) ._keyword_(keys) ._version_(version) - ._standardLicense_(URI.create(standardlicense)) - ._publisher_(URI.create(publisher)) + ._standardLicense_(standardlicense) + ._publisher_(publisher) ._created_(CalenderUtil.getGregorianNow()) ._modified_(CalenderUtil.getGregorianNow()) .build(); @@ -193,7 +193,7 @@ public ResourceImpl createResource(final String title, final String description, public ResourceImpl updateResource(final URI resourceId, final String title, final String description, final String language, final List keywords, final String version, - final String standardlicense, final String publisher) { + final URI standardlicense, final URI publisher) { //Get a Resource and update if it exists for (final var resource : getResources()) { if (resource.getId().equals(resourceId)) { From 3d4242918d9aaf4dd3892abb42d05194ced63d86 Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Thu, 15 Apr 2021 14:31:14 +0200 Subject: [PATCH 071/157] docs: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 555b6b9e..cfb15bb1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Patch Change: Internal Database can be reached and viewed again at: http://localhost:8081/console - Patch Change: After editing the connector settings the broker will be updated with the new information - Patch Change: Updated recursion methods in ResourceService that caused problems +- Patch Change: A percent sign within URLs in the UI no longer results in an error in the CM-Backend. ### Miscellaneous - Added custom banner at application startup instead of default banner From 954bb0afd2d9f7f90bb22d9c3f12bcd06f47c43c Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Mon, 19 Apr 2021 10:10:23 +0200 Subject: [PATCH 072/157] docs: add package-info classes --- .../configmanager/api/controller/package-info.java | 11 +++++++++++ .../isst/configmanager/api/package-info.java | 11 +++++++++++ .../configmanager/api/service/package-info.java | 11 +++++++++++ .../api/service/resources/package-info.java | 11 +++++++++++ .../isst/configmanager/config/package-info.java | 11 +++++++++++ .../connector/clients/package-info.java | 12 ++++++++++++ .../dataspaceconnector/clients/package-info.java | 13 +++++++++++++ .../dataspaceconnector/model/package-info.java | 11 +++++++++++ .../model/repos/package-info.java | 11 +++++++++++ .../dataspaceconnector/util/package-info.java | 11 +++++++++++ .../model/configlists/package-info.java | 11 +++++++++++ .../isst/configmanager/model/package-info.java | 8 ++++++++ .../isst/configmanager/util/package-info.java | 11 +++++++++++ 13 files changed, 143 insertions(+) create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/api/controller/package-info.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/api/package-info.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/api/service/package-info.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/package-info.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/config/package-info.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/connector/clients/package-info.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/package-info.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/package-info.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/repos/package-info.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/package-info.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/model/configlists/package-info.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/model/package-info.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/util/package-info.java diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/package-info.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/package-info.java new file mode 100644 index 00000000..4fc84cba --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/package-info.java @@ -0,0 +1,11 @@ +/** + * Controller classes of the different APIs. + *

+ * This package contains the corresponding controllers for the defined APIs. + *

+ * + * @version 7.0.0 (last changed at version) + * @since 7.0.0 (documented since) + * @author IDS-ConfigurationManager Contributors + */ +package de.fraunhofer.isst.configmanager.api.controller; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/package-info.java b/src/main/java/de/fraunhofer/isst/configmanager/api/package-info.java new file mode 100644 index 00000000..a123cc81 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/package-info.java @@ -0,0 +1,11 @@ +/** + * API classes for the UI. + *

+ * This package contains all API definitions which can be accessed by the UI. + *

+ * + * @version 7.0.0 (last changed at version) + * @since 7.0.0 (documented since) + * @author IDS-ConfigurationManager Contributors + */ +package de.fraunhofer.isst.configmanager.api; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/package-info.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/package-info.java new file mode 100644 index 00000000..25182718 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/package-info.java @@ -0,0 +1,11 @@ +/** + * Service classes for the API controllers. + *

+ * This package contains all service classes for the API controllers. + *

+ * + * @version 7.0.0 (last changed at version) + * @since 7.0.0 (documented since) + * @author IDS-ConfigurationManager Contributors + */ +package de.fraunhofer.isst.configmanager.api.service; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/package-info.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/package-info.java new file mode 100644 index 00000000..8a070424 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/package-info.java @@ -0,0 +1,11 @@ +/** + * Service classes for the resource controller. + *

+ * This package contains the corresponding service classes for the resource controllers. + *

+ * + * @version 7.0.0 (last changed at version) + * @since 7.0.0 (documented since) + * @author IDS-ConfigurationManager Contributors + */ +package de.fraunhofer.isst.configmanager.api.service.resources; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/config/package-info.java b/src/main/java/de/fraunhofer/isst/configmanager/config/package-info.java new file mode 100644 index 00000000..eb1c714a --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/config/package-info.java @@ -0,0 +1,11 @@ +/** + * Spring configuration classes. + *

+ * This package contains all security relevant classes for the configuration of e.g. Spring. + *

+ * + * @version 7.0.0 (last changed at version) + * @since 7.0.0 (documented since) + * @author IDS-ConfigurationManager Contributors + */ +package de.fraunhofer.isst.configmanager.config; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/package-info.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/package-info.java new file mode 100644 index 00000000..2efae638 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/package-info.java @@ -0,0 +1,12 @@ +/** + * Definition of the methods that all connectors must support. + *

+ * This package contains the interfaces for the different IDS-Connectors, + * which can be connected to the ConfigManager and must be addressed individually. + *

+ * + * @version 7.0.0 (last changed at version) + * @since 7.0.0 (documented since) + * @author IDS-ConfigurationManager Contributors + */ +package de.fraunhofer.isst.configmanager.connector.clients; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/package-info.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/package-info.java new file mode 100644 index 00000000..1e78a69a --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/package-info.java @@ -0,0 +1,13 @@ +/** + * Implementation of the IDS-Connector interface classes for establishing connection + * to the Dataspace Connector. + *

+ * This package contains the implementations of the required methods to establish a connection + * from the ConfigManager-backend to the Dataspace Connector. + *

+ * + * @version 7.0.0 (last changed at version) + * @since 7.0.0 (documented since) + * @author IDS-ConfigurationManager Contributors + */ +package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.clients; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/package-info.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/package-info.java new file mode 100644 index 00000000..8c739cfc --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/package-info.java @@ -0,0 +1,11 @@ +/** + * Model classes of the Dataspace Connector data storage. + *

+ * This package contains images of the Dataspace Connector data storage relevant for the ConfigManager. + *

+ * + * @version 7.0.0 (last changed at version) + * @since 7.0.0 (documented since) + * @author IDS-ConfigurationManager Contributors + */ +package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/repos/package-info.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/repos/package-info.java new file mode 100644 index 00000000..2172a359 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/repos/package-info.java @@ -0,0 +1,11 @@ +/** + * Interfaces of the required model classes of the Dataspace Connector data storage. + *

+ * This package contains interface classes of the Dataspace Connector data management schemes. + *

+ * + * @version 7.0.0 (last changed at version) + * @since 7.0.0 (documented since) + * @author IDS-ConfigurationManager Contributors + */ +package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.repos; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/package-info.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/package-info.java new file mode 100644 index 00000000..11407393 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/package-info.java @@ -0,0 +1,11 @@ +/** + * Helper classes for connecting to the Dataspace Connector. + *

+ * This package contains outsourced helper-methods which are needed to connect to the Dataspace Connector. + *

+ * + * @version 7.0.0 (last changed at version) + * @since 7.0.0 (documented since) + * @author IDS-ConfigurationManager Contributors + */ +package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/package-info.java b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/package-info.java new file mode 100644 index 00000000..7e0bbae4 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/package-info.java @@ -0,0 +1,11 @@ +/** + * JPA-Repo Interfaces. + *

+ * This package contains repo classes for storing data for the ConfigManager. + *

+ * + * @version 7.0.0 (last changed at version) + * @since 7.0.0 (documented since) + * @author IDS-ConfigurationManager Contributors + */ +package de.fraunhofer.isst.configmanager.model.configlists; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/package-info.java b/src/main/java/de/fraunhofer/isst/configmanager/model/package-info.java new file mode 100644 index 00000000..e131ef08 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/package-info.java @@ -0,0 +1,8 @@ +/** + * This package contains the ConfigManager internal data storage classes. + * + * @version 7.0.0 (last changed at version) + * @since 7.0.0 (documented since) + * @author IDS-ConfigurationManager Contributors + */ +package de.fraunhofer.isst.configmanager.model; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/util/package-info.java b/src/main/java/de/fraunhofer/isst/configmanager/util/package-info.java new file mode 100644 index 00000000..8e6dc87a --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/util/package-info.java @@ -0,0 +1,11 @@ +/** + * Helper classes for the ConfigManager. + *

+ * This package contains outsourced helper-methods which are needed by the ConfigManager. + *

+ * + * @version 7.0.0 (last changed at version) + * @since 7.0.0 (documented since) + * @author IDS-ConfigurationManager Contributors + */ +package de.fraunhofer.isst.configmanager.util; From deb71a6833b1ad235536256d39a294963f3ab4b0 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Mon, 19 Apr 2021 10:12:20 +0200 Subject: [PATCH 073/157] docs: update changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfb15bb1..fa9fc993 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,8 +38,9 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ### Miscellaneous - Added custom banner at application startup instead of default banner -- Updated Readme - Disabled Swagger Petstore default playground +- Docs: Updated Readme +- Docs: Add package-info files where appropriate ## [6.0.0] - 2021-03-26 From 4ea44318e8d80cca3e674d224032ee6fa744e43e Mon Sep 17 00:00:00 2001 From: omar Date: Tue, 13 Apr 2021 16:45:25 +0200 Subject: [PATCH 074/157] feat: add required parameter sourceType to createGenericEndpoint API --- .../java/de/fraunhofer/isst/configmanager/api/EndpointApi.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java index 475407b5..ddd5fe00 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java @@ -19,6 +19,7 @@ public interface EndpointApi { @ApiResponse(responseCode = "200", description = "Created a generic endpoint"), @ApiResponse(responseCode = "400", description = "Can not create the generic endpoint")}) ResponseEntity createGenericEndpoint(@RequestParam(value = "accessURL") URI accessURL, + @RequestParam(value = "sourceType") String sourceType, @RequestParam(value = "username", required = false) String username, @RequestParam(value = "password", required = false) String password); From 46664a0d809b7869f4e0b1e3e3cdca344614a6b0 Mon Sep 17 00:00:00 2001 From: omar Date: Tue, 13 Apr 2021 16:46:36 +0200 Subject: [PATCH 075/157] chore: set sourcetype property to generic endpoint --- .../configmanager/api/controller/EndpointController.java | 5 +++-- .../isst/configmanager/api/service/EndpointService.java | 3 +++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java index b9f57aa7..200b58cc 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java @@ -58,12 +58,13 @@ public EndpointController(final Serializer serializer, */ @Override public ResponseEntity createGenericEndpoint(final URI accessURL, + final String sourceType, final String username, final String password) { - log.info(">> POST /generic/endpoint accessURL: " + accessURL + " username: " + username); + log.info(">> POST /generic/endpoint accessURL: " + accessURL + "sourceType: " + sourceType + " username: " + username); ResponseEntity response; - final var genericEndpoint = endpointService.createGenericEndpoint(accessURL, username, password); + final var genericEndpoint = endpointService.createGenericEndpoint(accessURL, sourceType, username, password); if (genericEndpoint != null) { final var jsonObject = new JSONObject(); jsonObject.put("id", genericEndpoint.getId().toString()); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java index ac20dc75..8ff6ed10 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java @@ -45,12 +45,15 @@ public EndpointService(final CustomGenericEndpointRepository customGenericEndpoi * @return generic endpoint */ public GenericEndpoint createGenericEndpoint(final URI accessURL, + final String sourceType, final String username, final String password) { GenericEndpoint endpoint = null; endpoint = new GenericEndpointBuilder()._accessURL_(accessURL).build(); final var endpointImpl = (GenericEndpointImpl) endpoint; + endpointImpl.setProperty("ids:sourceType", sourceType); + if (username != null && password != null) { endpointImpl .setGenericEndpointAuthentication( From 5e236ead98680f7ae2159dd11315f0c3dbe277a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Mon, 19 Apr 2021 12:54:29 +0200 Subject: [PATCH 076/157] fix: removed produces part of api --- .../fraunhofer/isst/configmanager/api/ConnectorRequestApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java index 3f482a4f..39658387 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java @@ -13,7 +13,7 @@ import java.util.UUID; public interface ConnectorRequestApi { - @PostMapping(value = "/request/description", produces = "application/ld+json") + @PostMapping(value = "/request/description") @Operation(summary = "Request metadata from another IDS connector.") @ApiResponses({ @ApiResponse(responseCode = "200", description = "Successfully requested metadata from IDS connector"), From 2c570b4add909e70f64b0ad49b0db3fe925ae617 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Mon, 19 Apr 2021 13:18:20 +0200 Subject: [PATCH 077/157] fix: spelling --- .../isst/configmanager/api/service/ConnectorRequestService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java index a7151371..beac83d5 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java @@ -95,7 +95,7 @@ public String requestResource(final URI recipientId, final URI requestedResource * @param recipientId id of the recipient * @param requestedArtifactId id of the requested artifact * @param contractOffer contact offer for the requested resource - * @return string, contract acgreement id + * @return string, contract agreement id */ public String requestContractAgreement(final String recipientId, final String requestedArtifactId, From 2749c855075c5e8a08b79949047700eabc18db1e Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Mon, 19 Apr 2021 17:15:52 +0200 Subject: [PATCH 078/157] refactor: UtilService --- .../api/service/UtilService.java | 211 ++++++++++++------ 1 file changed, 140 insertions(+), 71 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java index 5fb35144..5d95acaa 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java @@ -4,12 +4,13 @@ import de.fraunhofer.iais.eis.ConnectorStatus; import de.fraunhofer.iais.eis.Language; import de.fraunhofer.iais.eis.LogLevel; - import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.BackendSource; import de.fraunhofer.isst.configmanager.model.config.BrokerStatus; import de.fraunhofer.isst.configmanager.model.routedeploymethod.DeployMethod; +import lombok.extern.slf4j.Slf4j; import net.minidev.json.JSONArray; import net.minidev.json.JSONObject; +import org.jetbrains.annotations.NotNull; import org.json.JSONException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -21,6 +22,7 @@ /** * The class can be used to define auxiliary methods that are needed again and again. */ +@Slf4j @Service @Transactional public class UtilService { @@ -32,86 +34,151 @@ public class UtilService { * @return enums as string */ public String getSpecificEnum(final String enumName) { - final var jsonArray = new JSONArray(); - JSONArray sortedJsonArray = null; final var name = enumName.toLowerCase(); + JSONArray sortedJsonArray = null; - if (name.contains("loglevel")) { - final var logLevels = LogLevel.values(); - for (final var logLevel : logLevels) { - var jsonObject = new JSONObject(); - jsonObject.put("originalName", logLevel.name()); - jsonObject.put("displayName", logLevel.getLabel().get(0).getValue()); - jsonArray.add(jsonObject); - } - sortedJsonArray = sortJsonArray(jsonArray); + switch (name) { + case "loglevel": sortedJsonArray = getLogLevel(); break; + case "connectorstatus": sortedJsonArray = getConnectorStatus(); break; + case "connectordeploymode": sortedJsonArray = getConnectorDeployMode(); break; + case "language": sortedJsonArray = getLanguage(); break; + case "sourcetype": sortedJsonArray = getSourceType(); break; + case "deploymethod": sortedJsonArray = getDeployMethod(); break; + case "brokerstatus": sortedJsonArray = getBrokerStatus(); break; + default: break; } - if (name.contains("connectorstatus")) { - final var connectorStatuses = ConnectorStatus.values(); - for (final var connectorStatus : connectorStatuses) { - var jsonObject = new JSONObject(); - jsonObject.put("originalName", connectorStatus.name()); - jsonObject.put("displayName", connectorStatus.getLabel().get(0).getValue()); - jsonArray.add(jsonObject); - } - sortedJsonArray = sortJsonArray(jsonArray); + + assert sortedJsonArray != null; + return sortedJsonArray.toJSONString(); + } + + @NotNull + private JSONArray getBrokerStatus() { + JSONArray sortedJsonArray; + + final var jsonArray = new JSONArray(); + final var brokerStatuses = BrokerStatus.values(); + + for (final var brokerStatus : brokerStatuses) { + var jsonObject = new JSONObject(); + jsonObject.put("displayName", brokerStatus.name()); + jsonArray.add(jsonObject); } - if (name.contains("connectordeploymode")) { - final var connectorDeployModes = ConnectorDeployMode.values(); - for (final var connectorDeployMode : connectorDeployModes) { - var jsonObject = new JSONObject(); - jsonObject.put("originalName", connectorDeployMode.name()); - jsonObject.put("displayName", connectorDeployMode.getLabel().get(0).getValue()); - jsonArray.add(jsonObject); - } - sortedJsonArray = sortJsonArray(jsonArray); + + sortedJsonArray = sortJsonArray(jsonArray); + return sortedJsonArray; + } + + @NotNull + private JSONArray getDeployMethod() { + JSONArray sortedJsonArray; + + final var jsonArray = new JSONArray(); + final var deployMethods = DeployMethod.values(); + + for (final var deployMethod : deployMethods) { + var jsonObject = new JSONObject(); + jsonObject.put("displayName", deployMethod.name()); + jsonArray.add(jsonObject); } - if (name.contains("language")) { - final var languages = Language.values(); - for (final var language : languages) { - var jsonObject = new JSONObject(); - jsonObject.put("originalName", language.name()); - - //Workaround for infomodel issue LT = LessThan - if ("LT".equals(language.name())) { - jsonObject.put("displayName", language.getLabel().get(1).getValue()); - } else { - jsonObject.put("displayName", language.getLabel().get(0).getValue()); - } - jsonArray.add(jsonObject); - } - sortedJsonArray = sortJsonArray(jsonArray); + + sortedJsonArray = sortJsonArray(jsonArray); + return sortedJsonArray; + } + + @NotNull + private JSONArray getSourceType() { + JSONArray sortedJsonArray; + + final var jsonArray = new JSONArray(); + final var sourceTypes = BackendSource.Type.values(); + + for (final var sourceType : sourceTypes) { + var jsonObject = new JSONObject(); + jsonObject.put("displayName", sourceType.name()); + jsonArray.add(jsonObject); } - if (name.contains("sourcetype")) { - final var sourceTypes = BackendSource.Type.values(); - for (final var sourceType : sourceTypes) { - var jsonObject = new JSONObject(); - jsonObject.put("displayName", sourceType.name()); - jsonArray.add(jsonObject); + + sortedJsonArray = sortJsonArray(jsonArray); + return sortedJsonArray; + } + + @NotNull + private JSONArray getLanguage() { + JSONArray sortedJsonArray; + + final var jsonArray = new JSONArray(); + final var languages = Language.values(); + + for (final var language : languages) { + var jsonObject = new JSONObject(); + jsonObject.put("originalName", language.name()); + + //Workaround for infomodel issue LT = LessThan + if ("LT".equals(language.name())) { + jsonObject.put("displayName", language.getLabel().get(1).getValue()); + } else { + jsonObject.put("displayName", language.getLabel().get(0).getValue()); } - sortedJsonArray = sortJsonArray(jsonArray); + jsonArray.add(jsonObject); } - if (name.contains("deploymethod")) { - final var deployMethods = DeployMethod.values(); - for (final var deployMethod : deployMethods) { - var jsonObject = new JSONObject(); - jsonObject.put("displayName", deployMethod.name()); - jsonArray.add(jsonObject); - } - sortedJsonArray = sortJsonArray(jsonArray); + + sortedJsonArray = sortJsonArray(jsonArray); + return sortedJsonArray; + } + + @NotNull + private JSONArray getConnectorDeployMode() { + JSONArray sortedJsonArray; + + final var jsonArray = new JSONArray(); + final var connectorDeployModes = ConnectorDeployMode.values(); + + for (final var connectorDeployMode : connectorDeployModes) { + var jsonObject = new JSONObject(); + jsonObject.put("originalName", connectorDeployMode.name()); + jsonObject.put("displayName", connectorDeployMode.getLabel().get(0).getValue()); + jsonArray.add(jsonObject); } - if (name.contains("brokerstatus")) { - final var brokerStatuses = BrokerStatus.values(); - for (final var brokerStatus : brokerStatuses) { - var jsonObject = new JSONObject(); - jsonObject.put("displayName", brokerStatus.name()); - jsonArray.add(jsonObject); - } - sortedJsonArray = sortJsonArray(jsonArray); + + sortedJsonArray = sortJsonArray(jsonArray); + return sortedJsonArray; + } + + @NotNull + private JSONArray getConnectorStatus() { + JSONArray sortedJsonArray; + + final var jsonArray = new JSONArray(); + final var connectorStatuses = ConnectorStatus.values(); + + for (final var connectorStatus : connectorStatuses) { + var jsonObject = new JSONObject(); + jsonObject.put("originalName", connectorStatus.name()); + jsonObject.put("displayName", connectorStatus.getLabel().get(0).getValue()); + jsonArray.add(jsonObject); } - assert sortedJsonArray != null; - return sortedJsonArray.toJSONString(); + sortedJsonArray = sortJsonArray(jsonArray); + return sortedJsonArray; + } + + @NotNull + private JSONArray getLogLevel() { + JSONArray sortedJsonArray; + + final var jsonArray = new JSONArray(); + final var logLevels = LogLevel.values(); + + for (final var logLevel : logLevels) { + var jsonObject = new JSONObject(); + jsonObject.put("originalName", logLevel.name()); + jsonObject.put("displayName", logLevel.getLabel().get(0).getValue()); + jsonArray.add(jsonObject); + } + + sortedJsonArray = sortJsonArray(jsonArray); + return sortedJsonArray; } /** @@ -120,6 +187,7 @@ public String getSpecificEnum(final String enumName) { */ private JSONArray sortJsonArray(final JSONArray jsonArray) { List jsonObjects = new ArrayList<>(); + var sortedJsonArray = new JSONArray(); for (final var o : jsonArray) { @@ -137,7 +205,7 @@ public int compare(final JSONObject a, final JSONObject b) { str1 = (String) a.get(KEY_NAME); str2 = (String) b.get(KEY_NAME); } catch (JSONException e) { - e.printStackTrace(); + log.error(e.getMessage(), e); } return str1.compareTo(str2); } @@ -146,6 +214,7 @@ public int compare(final JSONObject a, final JSONObject b) { for (int i = 0; i < jsonArray.size(); i++) { sortedJsonArray.add(i, jsonObjects.get(i)); } + return sortedJsonArray; } } From 31147b0d3e369f382aef917203d120a1c5ceea64 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Tue, 20 Apr 2021 09:58:02 +0200 Subject: [PATCH 079/157] refactor: small code refactorings --- .../isst/configmanager/api/AppRouteApi.java | 6 +++++- .../fraunhofer/isst/configmanager/api/BrokerApi.java | 6 +++++- .../isst/configmanager/api/ConnectorRequestApi.java | 4 +++- .../isst/configmanager/api/EndpointApi.java | 6 +++++- .../isst/configmanager/api/ResourceApi.java | 6 +++++- .../api/controller/ConnectorRequestController.java | 12 ++++++------ .../api/service/ConfigModelService.java | 12 +++++++++++- .../api/service/ConnectorRequestService.java | 9 +++++---- .../configmanager/api/service/EndpointService.java | 9 ++++++--- .../clients/DataspaceResourceClient.java | 2 +- .../dataspaceconnector/util/ResourceMapper.java | 6 +++++- .../model/config/ConfigModelObject.java | 7 ++++++- .../configmanager/model/config/CustomBroker.java | 6 +++++- .../isst/configmanager/model/config/QueryInput.java | 1 - .../model/configlists/CustomGenericEndpointList.java | 9 ++++++++- .../configmanager/model/customapp/CustomApp.java | 7 ++++++- .../model/customgenericendpoint/BackendConfig.java | 7 ++++++- .../fraunhofer/isst/configmanager/util/Utility.java | 6 +++++- 18 files changed, 93 insertions(+), 28 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java index 8dc6320f..d9fd6322 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java @@ -5,7 +5,11 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java index 6bce552a..f05dc370 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java @@ -4,7 +4,11 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java index 39658387..3da5b755 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java @@ -33,7 +33,9 @@ ResponseEntity requestContract(@RequestParam("recipientId") URI recipien @PostMapping(value = "/request/artifact") @Operation(summary = "Request data from another IDS connector.") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully requested data from another IDS connector.")}) + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "Successfully requested data from another IDS connector"), + @ApiResponse(responseCode = "400", description = "Can not request data from IDS connector")}) ResponseEntity requestData(@RequestParam("recipientId") URI recipientId, @RequestParam(value = "requestedArtifactId ") URI requestedArtifactId, @RequestParam(value = "contractId", required = false) URI contractId, diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java index 5fd966ec..475407b5 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java @@ -4,7 +4,11 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java index eafde71f..38664ffb 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java @@ -4,7 +4,11 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; import java.util.ArrayList; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java index b4a436fd..4ba28c13 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java @@ -6,12 +6,12 @@ import de.fraunhofer.isst.configmanager.model.config.QueryInput; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; +import net.minidev.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import net.minidev.json.JSONObject; import java.io.IOException; import java.net.URI; @@ -54,7 +54,7 @@ public ResponseEntity requestMetadata(final URI recipientId, final URI r // JSON object contains key and the resource itself final var validKeyAndResource = connectorRequestService.requestResource(recipientId, requestedResourceId); if (validKeyAndResource != null) { - return ResponseEntity.ok(validKeyAndResource); + response = ResponseEntity.ok(validKeyAndResource); } else { response = ResponseEntity.badRequest().body("Could not get key and resource from the requested connector"); } @@ -85,8 +85,8 @@ public ResponseEntity requestMetadata(final URI recipientId, final URI r public ResponseEntity requestContract(final URI recipientId, final URI requestedArtifactId, final String contractOffer) { - log.info(">> POST /request/contract with recipient: {}, artifact: {}," + - " contract: {}", recipientId, requestedArtifactId, contractOffer); + log.info(">> POST /request/contract with recipient: {}, artifact: {}, contract: {}", + recipientId, requestedArtifactId, contractOffer); ResponseEntity response; @@ -126,8 +126,8 @@ public ResponseEntity requestData(final URI recipientId, final UUID key, final QueryInput queryInput) { - log.info(">> POST /request/artifact with recipient: {}, artifact: {}," + - " contract: {}, key: {} and queryInput: {} ", recipientId, requestedArtifactId, contractId, key, queryInput); + log.info(">> POST /request/artifact with recipient: {}, artifact: {}, contract: {}, key: {} and queryInput: {} ", + recipientId, requestedArtifactId, contractId, key, queryInput); ResponseEntity response = null; try { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java index d02a934d..1f1851da 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java @@ -1,6 +1,16 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.BaseConnectorBuilder; +import de.fraunhofer.iais.eis.BasicAuthenticationBuilder; +import de.fraunhofer.iais.eis.ConfigurationModel; +import de.fraunhofer.iais.eis.ConfigurationModelBuilder; +import de.fraunhofer.iais.eis.ConfigurationModelImpl; +import de.fraunhofer.iais.eis.ConnectorDeployMode; +import de.fraunhofer.iais.eis.ConnectorStatus; +import de.fraunhofer.iais.eis.LogLevel; +import de.fraunhofer.iais.eis.ProxyBuilder; +import de.fraunhofer.iais.eis.ProxyImpl; +import de.fraunhofer.iais.eis.SecurityProfile; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; import de.fraunhofer.isst.configmanager.model.config.ConfigModelObject; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java index beac83d5..addbc02c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java @@ -53,7 +53,7 @@ public List requestResourcesFromConnector(final URI recipientId) { } return resourceList; } else { - log.info("Could not determine the resources of the connector"); + log.info("---- [ConnectorRequestService requestResourcesFromConnector] Could not determine the resources of the connector"); return null; } } catch (IOException e) { @@ -70,7 +70,8 @@ public List requestResourcesFromConnector(final URI recipientId) { * @return resource */ public String requestResource(final URI recipientId, final URI requestedResourceId) { - String customResponse = ""; + String customResponse; + try { final var response = resourceClient.getRequestedResource(recipientId.toString(), requestedResourceId.toString()); if (response != null) { @@ -79,7 +80,7 @@ public String requestResource(final URI recipientId, final URI requestedResource final var resource = splitBody[1].substring(10); customResponse = "Validation Key: " + validationKey + "\nResource: " + resource; } else { - log.info("Could not determine resource"); + log.info("---- [ConnectorRequestService requestResource] Could not determine resource"); return null; } } catch (IOException e) { @@ -90,7 +91,7 @@ public String requestResource(final URI recipientId, final URI requestedResource } /** - * This method requests the id of the contract agreement + * This method requests the id of the contract agreement. * * @param recipientId id of the recipient * @param requestedArtifactId id of the requested artifact diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java index a71fc41b..9eab8402 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java @@ -1,6 +1,10 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.BasicAuthenticationBuilder; +import de.fraunhofer.iais.eis.Endpoint; +import de.fraunhofer.iais.eis.GenericEndpoint; +import de.fraunhofer.iais.eis.GenericEndpointBuilder; +import de.fraunhofer.iais.eis.GenericEndpointImpl; import de.fraunhofer.isst.configmanager.model.configlists.CustomGenericEndpointList; import de.fraunhofer.isst.configmanager.model.configlists.CustomGenericEndpointRepository; import de.fraunhofer.isst.configmanager.model.customgenericendpoint.CustomGenericEndpointObject; @@ -43,8 +47,7 @@ public EndpointService(final CustomGenericEndpointRepository customGenericEndpoi public GenericEndpoint createGenericEndpoint(final URI accessURL, final String username, final String password) { - GenericEndpoint endpoint = null; - endpoint = new GenericEndpointBuilder()._accessURL_(accessURL).build(); + final var endpoint = new GenericEndpointBuilder()._accessURL_(accessURL).build(); final var endpointImpl = (GenericEndpointImpl) endpoint; if (username != null && password != null) { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java index eb81def3..e94b5a33 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java @@ -92,7 +92,7 @@ public String getRequestedResource(final String accessURL, final String resource log.warn(String.format("---- [DataspaceResourceClient getRequestedResource] Could not get BaseConnector from %s!", dataSpaceConnectorHost)); } - return Objects.requireNonNull(response.body().string()); + return Objects.requireNonNull(response.body()).string(); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java index 86d840db..1842dfcb 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java @@ -1,6 +1,10 @@ package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.Artifact; +import de.fraunhofer.iais.eis.BasicAuthenticationImpl; +import de.fraunhofer.iais.eis.GenericEndpoint; +import de.fraunhofer.iais.eis.Representation; +import de.fraunhofer.iais.eis.Resource; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.iais.eis.util.RdfResource; import de.fraunhofer.iais.eis.util.TypedLiteral; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java b/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java index 37b35f2e..23444149 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java @@ -7,7 +7,12 @@ import lombok.NoArgsConstructor; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Convert; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; /** * Entity class for the configuration model. diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java b/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java index fdaf81dd..ad7c3a5e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java @@ -4,7 +4,11 @@ import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; import java.net.URI; import java.util.List; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/config/QueryInput.java b/src/main/java/de/fraunhofer/isst/configmanager/model/config/QueryInput.java index b9352737..26e34034 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/config/QueryInput.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/config/QueryInput.java @@ -6,7 +6,6 @@ @Data public class QueryInput { - HashMap headers = new HashMap<>(); HashMap params = new HashMap<>(); HashMap pathVariables = new HashMap<>(); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java index 81270a6d..8babab38 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java @@ -6,7 +6,14 @@ import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java b/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java index 15d0b10d..91ae02c7 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java @@ -4,7 +4,12 @@ import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; import java.util.List; /** diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java b/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java index 94639d37..6b661634 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java @@ -7,7 +7,12 @@ import lombok.NoArgsConstructor; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Convert; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; /** * The class helps to persist objects inherited from the endpoint from the information model. diff --git a/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java b/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java index a5e87d1c..c1312004 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java @@ -1,6 +1,10 @@ package de.fraunhofer.isst.configmanager.util; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.AppEndpoint; +import de.fraunhofer.iais.eis.AppEndpointBuilder; +import de.fraunhofer.iais.eis.AppEndpointType; +import de.fraunhofer.iais.eis.CustomMediaTypeBuilder; +import de.fraunhofer.iais.eis.Language; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; import lombok.experimental.UtilityClass; From 5133ede48ae9d05b7cf4ce91f01abbcdb0a5502f Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Tue, 20 Apr 2021 10:05:33 +0200 Subject: [PATCH 080/157] docs: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa9fc993..91b71cad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Patch Change: After editing the connector settings the broker will be updated with the new information - Patch Change: Updated recursion methods in ResourceService that caused problems - Patch Change: A percent sign within URLs in the UI no longer results in an error in the CM-Backend. +- Patch Change: Refactored Swagger-UI API Documentation, added all actually possible return-status-codes for API calls ### Miscellaneous - Added custom banner at application startup instead of default banner From 7437d4fbbff54071edd435627ba48057071f6d8a Mon Sep 17 00:00:00 2001 From: omar Date: Tue, 20 Apr 2021 12:07:01 +0200 Subject: [PATCH 081/157] chore: add sourceType required parameter to updateGenericEndpoint route and methods --- .../de/fraunhofer/isst/configmanager/api/EndpointApi.java | 1 + .../configmanager/api/controller/EndpointController.java | 3 ++- .../isst/configmanager/api/service/EndpointService.java | 5 +++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java index ddd5fe00..595e9ad3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java @@ -44,6 +44,7 @@ ResponseEntity createGenericEndpoint(@RequestParam(value = "accessURL") @ApiResponse(responseCode = "400", description = "Can not update the generic endpoint")}) ResponseEntity updateGenericEndpoint(@RequestParam(value = "id") URI id, @RequestParam(value = "accessURL", required = false) URI accessURL, + @RequestParam(value = "sourceType") String sourceType, @RequestParam(value = "username", required = false) String username, @RequestParam(value = "password", required = false) String password); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java index 200b58cc..b1758acf 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java @@ -134,12 +134,13 @@ public ResponseEntity deleteGenericEndpoint(final URI endpointId) { @Override public ResponseEntity updateGenericEndpoint(final URI endpointId, final URI accessURL, + final String sourceType, final String username, final String password) { log.info(">> PUT /generic/endpoint endpointId: " + endpointId + " accessURL: " + accessURL); ResponseEntity response; - final var updated = endpointService.updateGenericEndpoint(endpointId, accessURL, username, password); + final var updated = endpointService.updateGenericEndpoint(endpointId, accessURL, sourceType, username, password); if (updated) { response = ResponseEntity.ok("Updated the generic endpoint with id: " + endpointId); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java index 8ff6ed10..d785a7dd 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java @@ -131,6 +131,7 @@ public boolean deleteGenericEndpoint(final URI id) { */ public boolean updateGenericEndpoint(final URI id, final URI accessURL, + final String sourceType, final String username, final String password) { @@ -138,9 +139,13 @@ public boolean updateGenericEndpoint(final URI id, final var genericEndpointold = getGenericEndpoint(id); final var genericEndpointNew = getGenericEndpoint(id); + + if (genericEndpointNew != null) { final var genericEndpointNewImpl = (GenericEndpointImpl) genericEndpointNew; + genericEndpointNewImpl.setProperty("ids:sourceType", sourceType); + if (accessURL != null) { genericEndpointNewImpl.setAccessURL(accessURL); } From 12913db8c66cd6a3d5f77bcc4295d12e2e1038c7 Mon Sep 17 00:00:00 2001 From: omar Date: Tue, 20 Apr 2021 12:10:57 +0200 Subject: [PATCH 082/157] chore: change sourceType parameter to be optional for updateGenericEndpoint --- .../de/fraunhofer/isst/configmanager/api/EndpointApi.java | 2 +- .../isst/configmanager/api/service/EndpointService.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java index 595e9ad3..3d23929c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java @@ -44,7 +44,7 @@ ResponseEntity createGenericEndpoint(@RequestParam(value = "accessURL") @ApiResponse(responseCode = "400", description = "Can not update the generic endpoint")}) ResponseEntity updateGenericEndpoint(@RequestParam(value = "id") URI id, @RequestParam(value = "accessURL", required = false) URI accessURL, - @RequestParam(value = "sourceType") String sourceType, + @RequestParam(value = "sourceType", required = false) String sourceType, @RequestParam(value = "username", required = false) String username, @RequestParam(value = "password", required = false) String password); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java index d785a7dd..96383d23 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java @@ -144,7 +144,9 @@ public boolean updateGenericEndpoint(final URI id, if (genericEndpointNew != null) { final var genericEndpointNewImpl = (GenericEndpointImpl) genericEndpointNew; - genericEndpointNewImpl.setProperty("ids:sourceType", sourceType); + if(sourceType != null){ + genericEndpointNewImpl.setProperty("ids:sourceType", sourceType); + } if (accessURL != null) { genericEndpointNewImpl.setAccessURL(accessURL); From bd07e689a0b86548a6d18780ece46e2c85483fc7 Mon Sep 17 00:00:00 2001 From: omar Date: Tue, 20 Apr 2021 12:19:10 +0200 Subject: [PATCH 083/157] chore: add sourceType required parameter to createGenericEndpoint --- .../de/fraunhofer/isst/configmanager/api/EndpointApi.java | 2 +- .../configmanager/api/controller/EndpointController.java | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java index 3d23929c..cf535f85 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java @@ -51,5 +51,5 @@ ResponseEntity updateGenericEndpoint(@RequestParam(value = "id") URI id, @PostMapping(value = "/connector/endpoint", produces = "application/ld+json") @Operation(summary = "Creates a new connector endpoint for the connector") @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully created the connector endpoint for the connector")}) - ResponseEntity createConnectorEndpoint(@RequestParam("accessUrl") URI accessUrl); + ResponseEntity createConnectorEndpoint(@RequestParam("accessUrl") URI accessUrl, @RequestParam(value = "sourceType", required = false) String sourceType); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java index b1758acf..263f5d67 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java @@ -155,11 +155,12 @@ public ResponseEntity updateGenericEndpoint(final URI endpointId, * This method creates a connector endpoint with given parameters. * * @param accessUrl access url of the endpoint + * @param sourceType source type of the endpoint * @return a suitable http response depending on success */ @Override - public ResponseEntity createConnectorEndpoint(final URI accessUrl) { - log.info(">> POST /connector/endpoint accessUrl: " + accessUrl); + public ResponseEntity createConnectorEndpoint(final URI accessUrl, final String sourceType) { + log.info(">> POST /connector/endpoint accessUrl: " + accessUrl + " sourceType: " + sourceType); final var configModelImpl = (ConfigurationModelImpl) configModelService.getConfigModel(); final var baseConnector = (BaseConnectorImpl) configModelImpl.getConnectorDescription(); @@ -171,6 +172,8 @@ public ResponseEntity createConnectorEndpoint(final URI accessUrl) { final var connectorEndpoints = (ArrayList) baseConnector.getHasEndpoint(); final var connectorEndpoint = new ConnectorEndpointBuilder()._accessURL_(accessUrl).build(); + connectorEndpoint.setProperty("ids:sourceType", sourceType); + connectorEndpoints.add(connectorEndpoint); configModelService.saveState(); From 0decd6bc709fef384bc929d75ba48909d5e7692d Mon Sep 17 00:00:00 2001 From: omar Date: Tue, 20 Apr 2021 12:20:20 +0200 Subject: [PATCH 084/157] chore: update method docs --- .../isst/configmanager/api/controller/EndpointController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java index 263f5d67..2c89d7f5 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java @@ -52,6 +52,7 @@ public EndpointController(final Serializer serializer, * This method creates a generic endpoint with the given parameters. * * @param accessURL access url of the parameter + * @param sourceType source type of the endpoint * @param username username for the authentication * @param password password for the authentication * @return a suitable http response depending on success @@ -127,6 +128,7 @@ public ResponseEntity deleteGenericEndpoint(final URI endpointId) { * * @param endpointId id of the generic endpoint * @param accessURL access url of the endpoint + * @param sourceType source type of the endpoint * @param username username for authentication * @param password password for authentication * @return a suitable http response depending on success From 43b577f1983f278e90c93471bd977ed1e5288260 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Tue, 20 Apr 2021 13:43:09 +0200 Subject: [PATCH 085/157] chore: removed source type from representation --- .../api/ResourceRepresentationApi.java | 6 ++---- .../ResourceRepresentationController.java | 19 +++++-------------- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java index 16625391..e42eb311 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java @@ -21,8 +21,7 @@ ResponseEntity createResourceRepresentation(@RequestParam("resourceId") @RequestParam("endpointId") URI endpointId, @RequestParam("language") String language, @RequestParam("filenameExtension") String filenameExtension, - @RequestParam("bytesize") Long bytesize, - @RequestParam("sourceType") String sourceType); + @RequestParam("bytesize") Long bytesize); @PutMapping(value = "/resource/representation", produces = "application/ld+json") @Operation(summary = "Updates the representation for a resource") @@ -35,6 +34,5 @@ ResponseEntity updateResourceRepresentation(@RequestParam("resourceId") @RequestParam(value = "endpointId") URI endpointId, @RequestParam(value = "language", required = false) String language, @RequestParam(value = "filenameExtension", required = false) String filenameExtension, - @RequestParam(value = "bytesize", required = false) Long bytesize, - @RequestParam(value = "sourceType", required = false) String sourceType); + @RequestParam(value = "bytesize", required = false) Long bytesize); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java index 433213de..21897e5b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java @@ -64,7 +64,6 @@ public ResourceRepresentationController(final ConfigModelService configModelServ * @param language the language * @param filenameExtension the extension of the file * @param bytesize the size of the representation - * @param sourceType the source type of the representation * @return a suitable http response depending on success */ @Override @@ -72,14 +71,12 @@ public ResponseEntity createResourceRepresentation(final URI resourceId, final URI endpointId, final String language, final String filenameExtension, - final Long bytesize, - final String sourceType) { + final Long bytesize) { log.info(">> POST /resource/representation resourceId: " + resourceId + " endpointId: " + endpointId + " language: " + language - + " filenameExtension: " + filenameExtension + " bytesize: " + bytesize - + " sourceType: " + sourceType); + + " filenameExtension: " + filenameExtension + " bytesize: " + bytesize); ResponseEntity response; - if (ValidateApiInput.notValid(resourceId.toString(), sourceType)) { + if (ValidateApiInput.notValid(resourceId.toString())) { response = ResponseEntity.badRequest().body("All validated parameter have undefined as value!"); } else { if (resourceRepresentationService.getResources() == null || resourceRepresentationService.getResources().isEmpty()) { @@ -90,7 +87,6 @@ public ResponseEntity createResourceRepresentation(final URI resourceId, ._mediaType_(new IANAMediaTypeBuilder()._filenameExtension_(filenameExtension).build()) ._instance_(Util.asList(new ArtifactBuilder() ._byteSize_(BigInteger.valueOf(bytesize)).build())).build(); - representation.setProperty("ids:sourceType", sourceType); final var jsonObject = new JSONObject(); @@ -124,7 +120,6 @@ public ResponseEntity createResourceRepresentation(final URI resourceId, * @param language the language * @param filenameExtension the extension of the file * @param bytesize the size of the representation - * @param sourceType the source type of the representation * @return a suitable http response depending on success */ @Override @@ -133,11 +128,10 @@ public ResponseEntity updateResourceRepresentation(final URI resourceId, final URI endpointId, final String language, final String filenameExtension, - final Long bytesize, - final String sourceType) { + final Long bytesize) { log.info(">> PUT /resource/representation resourceId: " + resourceId + " representationId: " + representationId + " endpointId: " + endpointId + " language: " + language + " filenameExtension: " - + filenameExtension + " bytesize: " + bytesize + " sourceType: " + sourceType); + + filenameExtension + " bytesize: " + bytesize); ResponseEntity response = null; final var oldResourceCatalog = (ResourceImpl) resourceRepresentationService.getResource(resourceId); @@ -168,9 +162,6 @@ public ResponseEntity updateResourceRepresentation(final URI resourceId, if (bytesize != null) { representationImpl.setInstance(Util.asList(new ArtifactBuilder()._byteSize_(BigInteger.valueOf(bytesize)).build())); } - if (sourceType != null) { - representationImpl.setProperty("ids:sourceType", sourceType); - } // Update representation in app route if (configModelService.getConfigModel().getAppRoute() != null) { for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { From 337a6a10ca1e540bbd581561c6792ce2e2f92640 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Tue, 20 Apr 2021 13:45:12 +0200 Subject: [PATCH 086/157] chore: updated the method: createBackendSource, instead of the representation, the generic endpoint will be used to get information about the source type --- .../api/controller/EndpointController.java | 2 +- .../clients/DataspaceResourceClient.java | 4 ++-- .../util/ResourceMapper.java | 18 ++++++++---------- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java index 2c89d7f5..e6438f3b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java @@ -62,7 +62,7 @@ public ResponseEntity createGenericEndpoint(final URI accessURL, final String sourceType, final String username, final String password) { - log.info(">> POST /generic/endpoint accessURL: " + accessURL + "sourceType: " + sourceType + " username: " + username); + log.info(">> POST /generic/endpoint accessURL: " + accessURL + " sourceType: " + sourceType + " username: " + username); ResponseEntity response; final var genericEndpoint = endpointService.createGenericEndpoint(accessURL, sourceType, username, password); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java index 6b6bdcba..7a4a9632 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java @@ -174,7 +174,7 @@ public String registerResourceRepresentation(final String resourceID, log.info(String.format("---- [DataspaceResourceClient registerResourceRepresentation] Registering resource at %s", dataSpaceConnectorHost)); final var mappedRepresentation = dataSpaceConnectorResourceMapper.mapRepresentation(representation); - final var backendSource = dataSpaceConnectorResourceMapper.createBackendSource(endpointId, representation); + final var backendSource = dataSpaceConnectorResourceMapper.createBackendSource(endpointId); mappedRepresentation.setSource(backendSource); final var mappedResourceID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); @@ -228,7 +228,7 @@ public String updateResourceRepresentation(final String resourceID, final var mappedResourceID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); final var mappedRepresentationID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(representationID)); final var mappedRepresentation = dataSpaceConnectorResourceMapper.mapRepresentation(representation); - final var backendSource = dataSpaceConnectorResourceMapper.createBackendSource(endpointId, representation); + final var backendSource = dataSpaceConnectorResourceMapper.createBackendSource(endpointId); mappedRepresentation.setSource(backendSource); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java index 1842dfcb..cfe99092 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java @@ -142,19 +142,19 @@ public ResourceRepresentation mapRepresentation(final Representation representat } /** - * The method resolves the source type of a representation. + * The method resolves the source type of a endpoint. * - * @param representation the representation, which holds the sourceType to get + * @param genericEndpoint the endpoint, which holds the sourceType to get * @return a source type */ - private BackendSource.Type resolveSourceType(final Representation representation) { + private BackendSource.Type resolveSourceType(final GenericEndpoint genericEndpoint) { BackendSource.Type sourceType; - final var typedLiteral = (TypedLiteral) representation.getProperties() + final var typedLiteral = (TypedLiteral) genericEndpoint.getProperties() .getOrDefault("https://w3id.org/idsa/core/sourceType", null); if (typedLiteral != null) { sourceType = BackendSource.Type.valueOf(typedLiteral.getValue()); } else { - final var propName = (String) representation.getProperties().get("ids:sourceType"); + final var propName = (String) genericEndpoint.getProperties().get("ids:sourceType"); sourceType = BackendSource.Type.valueOf(propName); } return sourceType; @@ -163,12 +163,10 @@ private BackendSource.Type resolveSourceType(final Representation representation /** * This method creates a new backend source for the representation. * - * @param endpointId id of the endpoint - * @param representation representation + * @param endpointId id of the endpoint * @return backend source */ - public BackendSource createBackendSource(final String endpointId, - final Representation representation) { + public BackendSource createBackendSource(final String endpointId) { final var backendSource = new BackendSource(); final var endpoint = (GenericEndpoint) endpointService.getGenericEndpoints() .stream() @@ -186,8 +184,8 @@ public BackendSource createBackendSource(final String endpointId, backendSource.setUrl(URI.create("https://example.com")); backendSource.setUsername(""); } + backendSource.setType(resolveSourceType(endpoint)); } - backendSource.setType(resolveSourceType(representation)); return backendSource; } } From 75f238535ff8d6f7b5deab999a6071f1551e6433 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Wed, 21 Apr 2021 08:59:13 +0200 Subject: [PATCH 087/157] fix: updateProxySettings string.equals(uri) --- .../isst/configmanager/api/service/ConfigModelService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java index 1f1851da..0ed5fa17 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java @@ -214,7 +214,7 @@ public boolean updateConfigurationModel(final String loglevel, public void updateProxySettings(final URI proxyUri, final ArrayList noProxyUriList, final String username, final String password, final ConfigurationModelImpl configmodelImpl) { - if ("null".equals(proxyUri)) { + if ("null".equals(proxyUri.toString())) { configmodelImpl.setConnectorProxy(null); } else { if (getConfigModelObject().getConfigurationModel().getConnectorProxy() == null) { From 4fdb2834db0045179c0a1937f4cd886a8c01a33e Mon Sep 17 00:00:00 2001 From: eakker Date: Wed, 21 Apr 2021 10:05:40 +0200 Subject: [PATCH 088/157] chore: add skeleton for AskCPL Formulas --- .../petrinet/evaluation/formula/FF.java | 22 ++++++++++++++++ .../petrinet/evaluation/formula/Formula.java | 8 ++++++ .../petrinet/evaluation/formula/TT.java | 21 +++++++++++++++ .../evaluation/formula/state/NodeALONG.java | 23 ++++++++++++++++ .../evaluation/formula/state/NodeAND.java | 23 ++++++++++++++++ .../evaluation/formula/state/NodeEV.java | 23 ++++++++++++++++ .../formula/state/NodeEXIST_MODAL.java | 25 ++++++++++++++++++ .../formula/state/NodeEXIST_NEXT.java | 22 ++++++++++++++++ .../formula/state/NodeEXIST_UNTIL.java | 23 ++++++++++++++++ .../formula/state/NodeExpression.java | 5 ++++ .../formula/state/NodeFORALL_MODAL.java | 26 +++++++++++++++++++ .../formula/state/NodeFORALL_NEXT.java | 24 +++++++++++++++++ .../formula/state/NodeFORALL_UNTIL.java | 23 ++++++++++++++++ .../evaluation/formula/state/NodeINV.java | 23 ++++++++++++++++ .../evaluation/formula/state/NodeMODAL.java | 25 ++++++++++++++++++ .../evaluation/formula/state/NodeNF.java | 23 ++++++++++++++++ .../evaluation/formula/state/NodeNOT.java | 23 ++++++++++++++++ .../evaluation/formula/state/NodeOR.java | 23 ++++++++++++++++ .../evaluation/formula/state/NodePOS.java | 24 +++++++++++++++++ .../formula/state/StateFormula.java | 6 +++++ .../formula/transition/ArcExpression.java | 4 +++ .../formula/transition/TransitionALONG.java | 23 ++++++++++++++++ .../formula/transition/TransitionAND.java | 23 ++++++++++++++++ .../formula/transition/TransitionEV.java | 23 ++++++++++++++++ .../transition/TransitionEXIST_MODAL.java | 25 ++++++++++++++++++ .../transition/TransitionEXIST_NEXT.java | 22 ++++++++++++++++ .../transition/TransitionEXIST_UNTIL.java | 23 ++++++++++++++++ .../transition/TransitionFORALL_MODAL.java | 25 ++++++++++++++++++ .../transition/TransitionFORALL_NEXT.java | 24 +++++++++++++++++ .../transition/TransitionFORALL_UNTIL.java | 23 ++++++++++++++++ .../formula/transition/TransitionFormula.java | 6 +++++ .../formula/transition/TransitionINV.java | 23 ++++++++++++++++ .../formula/transition/TransitionMODAL.java | 25 ++++++++++++++++++ .../formula/transition/TransitionNF.java | 23 ++++++++++++++++ .../formula/transition/TransitionNOT.java | 23 ++++++++++++++++ .../formula/transition/TransitionOR.java | 23 ++++++++++++++++ .../formula/transition/TransitionPOS.java | 24 +++++++++++++++++ 37 files changed, 777 insertions(+) create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/Formula.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/TT.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeExpression.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNF.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/StateFormula.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/ArcExpression.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFormula.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNF.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java new file mode 100644 index 00000000..c3a88508 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java @@ -0,0 +1,22 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula; + +import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.StateFormula; +import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFormula; +import org.hibernate.engine.transaction.spi.TransactionImplementor; + +public class FF implements StateFormula, TransitionFormula { + + public static FF FF(){ + return new FF(); + } + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "FF"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/Formula.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/Formula.java new file mode 100644 index 00000000..8eaefd2e --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/Formula.java @@ -0,0 +1,8 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula; + +public interface Formula { + + boolean evaluate(); + + String symbol(); +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/TT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/TT.java new file mode 100644 index 00000000..a66c9afb --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/TT.java @@ -0,0 +1,21 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula; + +import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.StateFormula; +import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFormula; + +public class TT implements StateFormula, TransitionFormula { + + public static TT TT(){ + return new TT(); + } + + @Override + public boolean evaluate() { + return true; + } + + @Override + public String symbol() { + return "TT"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java new file mode 100644 index 00000000..d0c53b4d --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java @@ -0,0 +1,23 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class NodeALONG implements StateFormula { + + public static NodeALONG nodeALONG(StateFormula parameter){ + return new NodeALONG(parameter); + } + + private StateFormula parameter; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "ALONG"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java new file mode 100644 index 00000000..929573bc --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java @@ -0,0 +1,23 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class NodeAND implements StateFormula { + + public static NodeAND nodeAND(StateFormula parameter1, StateFormula parameter2){ + return new NodeAND(parameter1, parameter2); + } + + private StateFormula parameter1, parameter2; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "AND"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java new file mode 100644 index 00000000..5fd8b16b --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java @@ -0,0 +1,23 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class NodeEV implements StateFormula { + + public static NodeEV nodeEV(StateFormula parameter){ + return new NodeEV(parameter); + } + + private StateFormula parameter; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "EV"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java new file mode 100644 index 00000000..c82fbed9 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java @@ -0,0 +1,25 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; + +import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFormula; +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class NodeEXIST_MODAL implements StateFormula { + + private static NodeEXIST_MODAL nodeEXIST_MODAL(StateFormula parameter1, TransitionFormula parameter2){ + return new NodeEXIST_MODAL(parameter1, parameter2); + } + + private StateFormula parameter1; + private TransitionFormula parameter2; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "EXIST_MODAL"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java new file mode 100644 index 00000000..9b09bb43 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java @@ -0,0 +1,22 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class NodeEXIST_NEXT implements StateFormula { + + public static NodeEXIST_NEXT nodeEXIST_NEXT(StateFormula parameter){ + return new NodeEXIST_NEXT(parameter); + } + private StateFormula parameter; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "EXIST_NEXT"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java new file mode 100644 index 00000000..234ff378 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java @@ -0,0 +1,23 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class NodeEXIST_UNTIL implements StateFormula { + + public static NodeEXIST_UNTIL nodeEXIST_UNTIL(StateFormula parameter1, StateFormula parameter2){ + return new NodeEXIST_UNTIL(parameter1, parameter2); + } + + private StateFormula parameter1, parameter2; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "EXIST_UNTIL"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeExpression.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeExpression.java new file mode 100644 index 00000000..48a93c83 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeExpression.java @@ -0,0 +1,5 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; + +public class NodeExpression { + +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java new file mode 100644 index 00000000..5de46e9a --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java @@ -0,0 +1,26 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; + +import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFormula; +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class NodeFORALL_MODAL implements StateFormula { + + public static NodeFORALL_MODAL nodeFORALL_MODAL(StateFormula parameter1, TransitionFormula parameter2){ + return new NodeFORALL_MODAL(parameter1, parameter2); + } + + private StateFormula parameter1; + + private TransitionFormula parameter2; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "FORALL_MODAL"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java new file mode 100644 index 00000000..69d204cb --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java @@ -0,0 +1,24 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class NodeFORALL_NEXT implements StateFormula { + + public static NodeFORALL_NEXT nodeFORALL_NEXT(StateFormula parameter){ + return new NodeFORALL_NEXT(parameter); + } + + private StateFormula parameter; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "FORALL_NEXT"; + } + +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java new file mode 100644 index 00000000..29d5e6c0 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java @@ -0,0 +1,23 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class NodeFORALL_UNTIL implements StateFormula { + + public NodeFORALL_UNTIL nodeFORALL_UNTIL(StateFormula parameter1, StateFormula parameter2){ + return new NodeFORALL_UNTIL(parameter1, parameter2); + } + + private StateFormula parameter1, parameter2; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "FORALL_UNTIL"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java new file mode 100644 index 00000000..e9aea84b --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java @@ -0,0 +1,23 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class NodeINV implements StateFormula { + + public static NodeINV nodeINV(StateFormula parameter){ + return new NodeINV(parameter); + } + + private StateFormula parameter; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "INV"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java new file mode 100644 index 00000000..66b10771 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java @@ -0,0 +1,25 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; + +import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFormula; +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class NodeMODAL implements StateFormula { + + public static NodeMODAL nodeMODAL(TransitionFormula parameter){ + return new NodeMODAL(parameter); + } + + private TransitionFormula parameter; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "MODAL"; + } + +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNF.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNF.java new file mode 100644 index 00000000..65ba867a --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNF.java @@ -0,0 +1,23 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class NodeNF implements StateFormula { + + public static NodeNF nodeNF(NodeExpression parameter){ + return new NodeNF(parameter); + } + + private NodeExpression parameter; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "NF"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java new file mode 100644 index 00000000..ed60151b --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java @@ -0,0 +1,23 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class NodeNOT implements StateFormula { + + public static NodeNOT nodeNOT(StateFormula parameter){ + return new NodeNOT(parameter); + } + + private StateFormula parameter; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "NOT"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java new file mode 100644 index 00000000..ece518e9 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java @@ -0,0 +1,23 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class NodeOR implements StateFormula { + + public static NodeOR nodeOR(StateFormula parameter1, StateFormula parameter2){ + return new NodeOR(parameter1, parameter2); + } + + private StateFormula parameter1, parameter2; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "OR"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java new file mode 100644 index 00000000..f1378cf1 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java @@ -0,0 +1,24 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class NodePOS implements StateFormula { + + public static NodePOS nodePOS(StateFormula parameter){ + return new NodePOS(parameter); + } + + private StateFormula parameter; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "POS"; + } + +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/StateFormula.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/StateFormula.java new file mode 100644 index 00000000..f7264912 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/StateFormula.java @@ -0,0 +1,6 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; + +import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.Formula; + +public interface StateFormula extends Formula { +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/ArcExpression.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/ArcExpression.java new file mode 100644 index 00000000..9084f13f --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/ArcExpression.java @@ -0,0 +1,4 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; + +public class ArcExpression { +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java new file mode 100644 index 00000000..056878da --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java @@ -0,0 +1,23 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class TransitionALONG implements TransitionFormula { + + public static TransitionALONG transitionALONG(TransitionFormula parameter){ + return new TransitionALONG(parameter); + } + + private TransitionFormula parameter; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "ALONG"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java new file mode 100644 index 00000000..6c586c65 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java @@ -0,0 +1,23 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class TransitionAND implements TransitionFormula { + + public static TransitionAND transitionAND(TransitionFormula parameter1, TransitionFormula parameter2){ + return new TransitionAND(parameter1, parameter2); + } + + private TransitionFormula parameter1, parameter2; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "AND"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java new file mode 100644 index 00000000..52ecde43 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java @@ -0,0 +1,23 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class TransitionEV implements TransitionFormula { + + public static TransitionEV transitionEV(TransitionFormula parameter){ + return new TransitionEV(parameter); + } + + private TransitionFormula parameter; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "EV"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java new file mode 100644 index 00000000..21a78ff2 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java @@ -0,0 +1,25 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; + +import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.StateFormula; +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class TransitionEXIST_MODAL implements TransitionFormula { + + private static TransitionEXIST_MODAL transitionEXIST_MODAL(TransitionFormula parameter1, StateFormula parameter2){ + return new TransitionEXIST_MODAL(parameter1, parameter2); + } + + private TransitionFormula parameter1; + private StateFormula parameter2; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "EXIST_MODAL"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java new file mode 100644 index 00000000..a2d9952f --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java @@ -0,0 +1,22 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class TransitionEXIST_NEXT implements TransitionFormula { + + public static TransitionEXIST_NEXT transitionEXIST_NEXT(TransitionFormula parameter){ + return new TransitionEXIST_NEXT(parameter); + } + private TransitionFormula parameter; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "EXIST_NEXT"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java new file mode 100644 index 00000000..dbff0aea --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java @@ -0,0 +1,23 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class TransitionEXIST_UNTIL implements TransitionFormula { + + public static TransitionEXIST_UNTIL transitionEXIST_UNTIL(TransitionFormula parameter1, TransitionFormula parameter2){ + return new TransitionEXIST_UNTIL(parameter1, parameter2); + } + + private TransitionFormula parameter1, parameter2; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "EXIST_UNTIL"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java new file mode 100644 index 00000000..230b242c --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java @@ -0,0 +1,25 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; + +import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.StateFormula; +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class TransitionFORALL_MODAL implements TransitionFormula { + + public static TransitionFORALL_MODAL transitionFORALL_MODAL(TransitionFormula parameter1, StateFormula parameter2){ + return new TransitionFORALL_MODAL(parameter1, parameter2); + } + + private TransitionFormula parameter1; + private StateFormula parameter2; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "FORALL_MODAL"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java new file mode 100644 index 00000000..c63ea340 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java @@ -0,0 +1,24 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class TransitionFORALL_NEXT implements TransitionFormula { + + public static TransitionFORALL_NEXT transitionFORALL_NEXT(TransitionFormula parameter){ + return new TransitionFORALL_NEXT(parameter); + } + + private TransitionFormula parameter; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "FORALL_NEXT"; + } + +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java new file mode 100644 index 00000000..5c5364bd --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java @@ -0,0 +1,23 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class TransitionFORALL_UNTIL implements TransitionFormula { + + public TransitionFORALL_UNTIL nodeFORALL_UNTIL(TransitionFormula parameter1, TransitionFormula parameter2){ + return new TransitionFORALL_UNTIL(parameter1, parameter2); + } + + private TransitionFormula parameter1, parameter2; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "FORALL_UNTIL"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFormula.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFormula.java new file mode 100644 index 00000000..990984dc --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFormula.java @@ -0,0 +1,6 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; + +import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.Formula; + +public interface TransitionFormula extends Formula { +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java new file mode 100644 index 00000000..710fc9a0 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java @@ -0,0 +1,23 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class TransitionINV implements TransitionFormula { + + public static TransitionINV transitionINV(TransitionFormula parameter){ + return new TransitionINV(parameter); + } + + private TransitionFormula parameter; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "INV"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java new file mode 100644 index 00000000..6305aab4 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java @@ -0,0 +1,25 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; + +import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.StateFormula; +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class TransitionMODAL implements TransitionFormula { + + public static TransitionMODAL transitionMODAL(StateFormula parameter){ + return new TransitionMODAL(parameter); + } + + private StateFormula parameter; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "MODAL"; + } + +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNF.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNF.java new file mode 100644 index 00000000..5755ea82 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNF.java @@ -0,0 +1,23 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class TransitionNF implements TransitionFormula { + + public static TransitionNF transitionNF(ArcExpression parameter){ + return new TransitionNF(parameter); + } + + private ArcExpression parameter; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "NF"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java new file mode 100644 index 00000000..9811690a --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java @@ -0,0 +1,23 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class TransitionNOT implements TransitionFormula { + + public static TransitionNOT nodeNOT(TransitionFormula parameter){ + return new TransitionNOT(parameter); + } + + private TransitionFormula parameter; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "NOT"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java new file mode 100644 index 00000000..7536ad14 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java @@ -0,0 +1,23 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class TransitionOR implements TransitionFormula { + + public static TransitionOR transitionOR(TransitionFormula parameter1, TransitionFormula parameter2){ + return new TransitionOR(parameter1, parameter2); + } + + private TransitionFormula parameter1, parameter2; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "OR"; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java new file mode 100644 index 00000000..31315ce5 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java @@ -0,0 +1,24 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class TransitionPOS implements TransitionFormula { + + public static TransitionPOS nodePOS(TransitionFormula parameter){ + return new TransitionPOS(parameter); + } + + private TransitionFormula parameter; + + @Override + public boolean evaluate() { + return false; + } + + @Override + public String symbol() { + return "POS"; + } + +} From b0a511d8aeb5cbab13995c0b4529d1b68fe7eeda Mon Sep 17 00:00:00 2001 From: eakker Date: Wed, 21 Apr 2021 12:35:01 +0200 Subject: [PATCH 089/157] chore: add some logic to the CTL-Formulas --- .../evaluation/formula/CTLEvaluator.java | 32 +++++++++++++++++++ .../petrinet/evaluation/formula/FF.java | 1 - .../evaluation/formula/state/NodeALONG.java | 5 ++- .../evaluation/formula/state/NodeAND.java | 2 +- .../evaluation/formula/state/NodeEV.java | 5 ++- .../formula/state/NodeEXIST_MODAL.java | 6 +++- .../formula/state/NodeEXIST_NEXT.java | 5 ++- .../formula/state/NodeEXIST_UNTIL.java | 3 ++ .../formula/state/NodeExpression.java | 9 ++++++ .../formula/state/NodeFORALL_MODAL.java | 3 ++ .../formula/state/NodeFORALL_NEXT.java | 4 ++- .../formula/state/NodeFORALL_UNTIL.java | 3 +- .../evaluation/formula/state/NodeINV.java | 5 ++- .../evaluation/formula/state/NodeMODAL.java | 2 ++ .../evaluation/formula/state/NodeNOT.java | 2 +- .../evaluation/formula/state/NodeOR.java | 2 +- .../evaluation/formula/state/NodePOS.java | 5 ++- .../formula/state/NodeSubExpression.java | 8 +++++ .../formula/transition/ArcExpression.java | 10 ++++++ .../formula/transition/ArcSubExpression.java | 8 +++++ .../{TransitionNF.java => TransitionAF.java} | 8 ++--- .../formula/transition/TransitionALONG.java | 5 ++- .../formula/transition/TransitionAND.java | 2 +- .../formula/transition/TransitionEV.java | 5 ++- .../transition/TransitionEXIST_MODAL.java | 6 +++- .../transition/TransitionEXIST_NEXT.java | 5 ++- .../transition/TransitionEXIST_UNTIL.java | 3 ++ .../transition/TransitionFORALL_MODAL.java | 3 ++ .../transition/TransitionFORALL_NEXT.java | 5 ++- .../transition/TransitionFORALL_UNTIL.java | 3 +- .../formula/transition/TransitionINV.java | 5 ++- .../formula/transition/TransitionMODAL.java | 2 ++ .../formula/transition/TransitionNOT.java | 4 +-- .../formula/transition/TransitionOR.java | 2 +- .../formula/transition/TransitionPOS.java | 7 ++-- .../builder/InfomodelPetriNetBuilderTest.java | 7 ++++ 36 files changed, 163 insertions(+), 29 deletions(-) create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeSubExpression.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/ArcSubExpression.java rename src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/{TransitionNF.java => TransitionAF.java} (62%) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java new file mode 100644 index 00000000..b43b1808 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java @@ -0,0 +1,32 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula; + +import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.StateFormula; +import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFormula; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; +import de.fraunhofer.isst.configmanager.petrinet.model.Place; +import de.fraunhofer.isst.configmanager.petrinet.model.Transition; + +public class CTLEvaluator { + + public static boolean evaluateNode(StateFormula ctlExpression, Place place){ + //TODO base evaluation on place + return ctlExpression.evaluate(); + } + + public static boolean evaluateTransition(TransitionFormula ctlExpression, Transition transition){ + //TODO base evaluation on transition + return ctlExpression.evaluate(); + } + + public static boolean evaluate(Formula ctlExpression, Node node){ + if(ctlExpression instanceof StateFormula && node instanceof Place){ + return evaluateNode((StateFormula) ctlExpression, (Place) node); + }else if(ctlExpression instanceof TransitionFormula && node instanceof Transition){ + return evaluateTransition((TransitionFormula) ctlExpression, (Transition) node); + }else{ + //cannot be evaluated + return false; + } + } + +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java index c3a88508..49cc242f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java @@ -2,7 +2,6 @@ import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.StateFormula; import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFormula; -import org.hibernate.engine.transaction.spi.TransactionImplementor; public class FF implements StateFormula, TransitionFormula { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java index d0c53b4d..000d5301 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java @@ -2,6 +2,9 @@ import lombok.AllArgsConstructor; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeEV.nodeEV; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeNOT.nodeNOT; + @AllArgsConstructor public class NodeALONG implements StateFormula { @@ -13,7 +16,7 @@ public static NodeALONG nodeALONG(StateFormula parameter){ @Override public boolean evaluate() { - return false; + return nodeNOT(nodeEV(nodeNOT(parameter))).evaluate(); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java index 929573bc..772f9387 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java @@ -13,7 +13,7 @@ public static NodeAND nodeAND(StateFormula parameter1, StateFormula parameter2){ @Override public boolean evaluate() { - return false; + return parameter1.evaluate() && parameter2.evaluate(); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java index 5fd8b16b..80a4a50b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java @@ -2,6 +2,9 @@ import lombok.AllArgsConstructor; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.TT.TT; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeFORALL_UNTIL.nodeFORALL_UNTIL; + @AllArgsConstructor public class NodeEV implements StateFormula { @@ -13,7 +16,7 @@ public static NodeEV nodeEV(StateFormula parameter){ @Override public boolean evaluate() { - return false; + return nodeFORALL_UNTIL(TT(), parameter).evaluate(); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java index c82fbed9..8b7f10bd 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java @@ -3,6 +3,10 @@ import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFormula; import lombok.AllArgsConstructor; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeAND.nodeAND; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeMODAL.nodeMODAL; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionMODAL.transitionMODAL; + @AllArgsConstructor public class NodeEXIST_MODAL implements StateFormula { @@ -15,7 +19,7 @@ private static NodeEXIST_MODAL nodeEXIST_MODAL(StateFormula parameter1, Transiti @Override public boolean evaluate() { - return false; + return transitionMODAL(nodeAND(parameter1, nodeMODAL(parameter2))).evaluate(); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java index 9b09bb43..3212a86d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java @@ -2,6 +2,9 @@ import lombok.AllArgsConstructor; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeMODAL.nodeMODAL; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionMODAL.transitionMODAL; + @AllArgsConstructor public class NodeEXIST_NEXT implements StateFormula { @@ -12,7 +15,7 @@ public static NodeEXIST_NEXT nodeEXIST_NEXT(StateFormula parameter){ @Override public boolean evaluate() { - return false; + return nodeMODAL(transitionMODAL(parameter)).evaluate(); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java index 234ff378..2010462d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java @@ -12,6 +12,9 @@ public static NodeEXIST_UNTIL nodeEXIST_UNTIL(StateFormula parameter1, StateForm private StateFormula parameter1, parameter2; @Override + //TODO + // True if a path exists, where parameter1 is true on each node of the path, + // and parameter2 is true on the final node of the path public boolean evaluate() { return false; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeExpression.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeExpression.java index 48a93c83..3d14aa24 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeExpression.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeExpression.java @@ -1,5 +1,14 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; +import lombok.AllArgsConstructor; + +@AllArgsConstructor public class NodeExpression { + public static NodeExpression nodeExpression(NodeSubExpression nodeSubExpression, String message){ + return new NodeExpression(nodeSubExpression, message); + } + + private NodeSubExpression subExpression; + private String message; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java index 5de46e9a..29821a1e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java @@ -14,6 +14,9 @@ public static NodeFORALL_MODAL nodeFORALL_MODAL(StateFormula parameter1, Transit private TransitionFormula parameter2; + //TODO + // parameter1, must be true for all successor states, parameter2 must + // be true for the transitions between the current state and its successors. @Override public boolean evaluate() { return false; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java index 69d204cb..d42c0f93 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java @@ -2,6 +2,8 @@ import lombok.AllArgsConstructor; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeNOT.nodeNOT; + @AllArgsConstructor public class NodeFORALL_NEXT implements StateFormula { @@ -13,7 +15,7 @@ public static NodeFORALL_NEXT nodeFORALL_NEXT(StateFormula parameter){ @Override public boolean evaluate() { - return false; + return nodeNOT(nodeFORALL_NEXT(nodeNOT(parameter))).evaluate(); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java index 29d5e6c0..aef9935c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java @@ -5,12 +5,13 @@ @AllArgsConstructor public class NodeFORALL_UNTIL implements StateFormula { - public NodeFORALL_UNTIL nodeFORALL_UNTIL(StateFormula parameter1, StateFormula parameter2){ + public static NodeFORALL_UNTIL nodeFORALL_UNTIL(StateFormula parameter1, StateFormula parameter2){ return new NodeFORALL_UNTIL(parameter1, parameter2); } private StateFormula parameter1, parameter2; + //TODO like EXIST_UNTIL for all paths @Override public boolean evaluate() { return false; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java index e9aea84b..a157cc62 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java @@ -2,6 +2,9 @@ import lombok.AllArgsConstructor; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeNOT.nodeNOT; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodePOS.nodePOS; + @AllArgsConstructor public class NodeINV implements StateFormula { @@ -13,7 +16,7 @@ public static NodeINV nodeINV(StateFormula parameter){ @Override public boolean evaluate() { - return false; + return nodeNOT(nodePOS(nodeNOT(parameter))).evaluate(); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java index 66b10771..aa9bbe49 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java @@ -12,6 +12,8 @@ public static NodeMODAL nodeMODAL(TransitionFormula parameter){ private TransitionFormula parameter; + //TODO + // MODAL, is true if parameter evaluates to true for a transition following the current state @Override public boolean evaluate() { return false; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java index ed60151b..c0c7e792 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java @@ -13,7 +13,7 @@ public static NodeNOT nodeNOT(StateFormula parameter){ @Override public boolean evaluate() { - return false; + return !parameter.evaluate(); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java index ece518e9..54d8fbb3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java @@ -13,7 +13,7 @@ public static NodeOR nodeOR(StateFormula parameter1, StateFormula parameter2){ @Override public boolean evaluate() { - return false; + return parameter1.evaluate() || parameter2.evaluate(); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java index f1378cf1..c51780dd 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java @@ -2,6 +2,9 @@ import lombok.AllArgsConstructor; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.TT.TT; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeEXIST_UNTIL.nodeEXIST_UNTIL; + @AllArgsConstructor public class NodePOS implements StateFormula { @@ -13,7 +16,7 @@ public static NodePOS nodePOS(StateFormula parameter){ @Override public boolean evaluate() { - return false; + return nodeEXIST_UNTIL(TT(), parameter).evaluate(); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeSubExpression.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeSubExpression.java new file mode 100644 index 00000000..b9af5cdc --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeSubExpression.java @@ -0,0 +1,8 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; + +import de.fraunhofer.isst.configmanager.petrinet.model.Place; + +@FunctionalInterface +public interface NodeSubExpression { + boolean evaluate(Place place); +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/ArcExpression.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/ArcExpression.java index 9084f13f..d4e1f78c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/ArcExpression.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/ArcExpression.java @@ -1,4 +1,14 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; +import lombok.AllArgsConstructor; + +@AllArgsConstructor public class ArcExpression { + + public static ArcExpression arcExpression(ArcSubExpression subExpression, String message){ + return new ArcExpression(subExpression, message); + } + + private ArcSubExpression subExpression; + private String message; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/ArcSubExpression.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/ArcSubExpression.java new file mode 100644 index 00000000..121fc4fd --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/ArcSubExpression.java @@ -0,0 +1,8 @@ +package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; + +import de.fraunhofer.isst.configmanager.petrinet.model.Transition; + +@FunctionalInterface +public interface ArcSubExpression { + boolean evaluate(Transition transition); +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNF.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java similarity index 62% rename from src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNF.java rename to src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java index 5755ea82..b5b47021 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNF.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java @@ -3,10 +3,10 @@ import lombok.AllArgsConstructor; @AllArgsConstructor -public class TransitionNF implements TransitionFormula { +public class TransitionAF implements TransitionFormula { - public static TransitionNF transitionNF(ArcExpression parameter){ - return new TransitionNF(parameter); + public static TransitionAF transitionAF(ArcExpression parameter){ + return new TransitionAF(parameter); } private ArcExpression parameter; @@ -18,6 +18,6 @@ public boolean evaluate() { @Override public String symbol() { - return "NF"; + return "AF"; } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java index 056878da..36d09359 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java @@ -2,6 +2,9 @@ import lombok.AllArgsConstructor; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionEV.transitionEV; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionNOT.transitionNOT; + @AllArgsConstructor public class TransitionALONG implements TransitionFormula { @@ -13,7 +16,7 @@ public static TransitionALONG transitionALONG(TransitionFormula parameter){ @Override public boolean evaluate() { - return false; + return transitionNOT(transitionEV(transitionNOT(parameter))).evaluate(); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java index 6c586c65..7a2282d0 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java @@ -13,7 +13,7 @@ public static TransitionAND transitionAND(TransitionFormula parameter1, Transiti @Override public boolean evaluate() { - return false; + return parameter1.evaluate() && parameter2.evaluate(); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java index 52ecde43..f2beccec 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java @@ -2,6 +2,9 @@ import lombok.AllArgsConstructor; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.TT.TT; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFORALL_UNTIL.transitionFORALL_UNTIL; + @AllArgsConstructor public class TransitionEV implements TransitionFormula { @@ -13,7 +16,7 @@ public static TransitionEV transitionEV(TransitionFormula parameter){ @Override public boolean evaluate() { - return false; + return transitionFORALL_UNTIL(TT(), parameter).evaluate(); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java index 21a78ff2..bfe47ba4 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java @@ -3,6 +3,10 @@ import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.StateFormula; import lombok.AllArgsConstructor; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeMODAL.nodeMODAL; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionAND.transitionAND; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionMODAL.transitionMODAL; + @AllArgsConstructor public class TransitionEXIST_MODAL implements TransitionFormula { @@ -15,7 +19,7 @@ private static TransitionEXIST_MODAL transitionEXIST_MODAL(TransitionFormula par @Override public boolean evaluate() { - return false; + return nodeMODAL(transitionAND(parameter1,transitionMODAL(parameter2))).evaluate(); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java index a2d9952f..438961f4 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java @@ -2,6 +2,9 @@ import lombok.AllArgsConstructor; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeMODAL.nodeMODAL; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionMODAL.transitionMODAL; + @AllArgsConstructor public class TransitionEXIST_NEXT implements TransitionFormula { @@ -12,7 +15,7 @@ public static TransitionEXIST_NEXT transitionEXIST_NEXT(TransitionFormula parame @Override public boolean evaluate() { - return false; + return transitionMODAL(nodeMODAL(parameter)).evaluate(); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java index dbff0aea..09aa303f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java @@ -11,6 +11,9 @@ public static TransitionEXIST_UNTIL transitionEXIST_UNTIL(TransitionFormula para private TransitionFormula parameter1, parameter2; + //TODO + // True if a path exists, where parameter1 is true on each transition of the path, + // and parameter2 is true on the final transition of the path @Override public boolean evaluate() { return false; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java index 230b242c..153e1cdb 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java @@ -13,6 +13,9 @@ public static TransitionFORALL_MODAL transitionFORALL_MODAL(TransitionFormula pa private TransitionFormula parameter1; private StateFormula parameter2; + //TODO + // parameter1, must be true for all successor transitions, parameter2 must + // be true for the states between the current transition and its successors. @Override public boolean evaluate() { return false; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java index c63ea340..e88f7f9f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java @@ -2,6 +2,9 @@ import lombok.AllArgsConstructor; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionEXIST_NEXT.transitionEXIST_NEXT; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionNOT.transitionNOT; + @AllArgsConstructor public class TransitionFORALL_NEXT implements TransitionFormula { @@ -13,7 +16,7 @@ public static TransitionFORALL_NEXT transitionFORALL_NEXT(TransitionFormula para @Override public boolean evaluate() { - return false; + return transitionNOT(transitionEXIST_NEXT(transitionNOT(parameter))).evaluate(); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java index 5c5364bd..babb53c4 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java @@ -5,12 +5,13 @@ @AllArgsConstructor public class TransitionFORALL_UNTIL implements TransitionFormula { - public TransitionFORALL_UNTIL nodeFORALL_UNTIL(TransitionFormula parameter1, TransitionFormula parameter2){ + public static TransitionFORALL_UNTIL transitionFORALL_UNTIL(TransitionFormula parameter1, TransitionFormula parameter2){ return new TransitionFORALL_UNTIL(parameter1, parameter2); } private TransitionFormula parameter1, parameter2; + //TODO like EXIST_UNTIL but requires conditions for all paths @Override public boolean evaluate() { return false; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java index 710fc9a0..89d4e00b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java @@ -2,6 +2,9 @@ import lombok.AllArgsConstructor; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionNOT.transitionNOT; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionPOS.transitionPOS; + @AllArgsConstructor public class TransitionINV implements TransitionFormula { @@ -13,7 +16,7 @@ public static TransitionINV transitionINV(TransitionFormula parameter){ @Override public boolean evaluate() { - return false; + return transitionNOT(transitionPOS(transitionNOT(parameter))).evaluate(); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java index 6305aab4..067da06c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java @@ -12,6 +12,8 @@ public static TransitionMODAL transitionMODAL(StateFormula parameter){ private StateFormula parameter; + //TODO + // MODAL, is true if parameter evaluates to true for a state following the current transition @Override public boolean evaluate() { return false; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java index 9811690a..a381b9ae 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java @@ -5,7 +5,7 @@ @AllArgsConstructor public class TransitionNOT implements TransitionFormula { - public static TransitionNOT nodeNOT(TransitionFormula parameter){ + public static TransitionNOT transitionNOT(TransitionFormula parameter){ return new TransitionNOT(parameter); } @@ -13,7 +13,7 @@ public static TransitionNOT nodeNOT(TransitionFormula parameter){ @Override public boolean evaluate() { - return false; + return !parameter.evaluate(); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java index 7536ad14..1ec89012 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java @@ -13,7 +13,7 @@ public static TransitionOR transitionOR(TransitionFormula parameter1, Transition @Override public boolean evaluate() { - return false; + return parameter1.evaluate() || parameter2.evaluate(); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java index 31315ce5..5c0f00fd 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java @@ -2,10 +2,13 @@ import lombok.AllArgsConstructor; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.TT.TT; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionEXIST_UNTIL.transitionEXIST_UNTIL; + @AllArgsConstructor public class TransitionPOS implements TransitionFormula { - public static TransitionPOS nodePOS(TransitionFormula parameter){ + public static TransitionPOS transitionPOS(TransitionFormula parameter){ return new TransitionPOS(parameter); } @@ -13,7 +16,7 @@ public static TransitionPOS nodePOS(TransitionFormula parameter){ @Override public boolean evaluate() { - return false; + return transitionEXIST_UNTIL(TT(), parameter).evaluate(); } @Override diff --git a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java index 73a78f75..61c607e7 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java @@ -2,6 +2,7 @@ import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; +import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionPOS; import de.fraunhofer.isst.configmanager.petrinet.simulator.PetriNetSimulator; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Disabled; @@ -14,6 +15,11 @@ import java.util.List; import java.util.concurrent.ThreadLocalRandom; +import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.*; + +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionNOT.transitionNOT; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.FF.FF; + /** * Test building a PetriNet from a randomly generated AppRoute */ @@ -59,6 +65,7 @@ void testBuildPetriNet() throws IOException { var graph = PetriNetSimulator.buildStepGraph(petriNet); log.info(String.valueOf(graph.getArcs().size())); log.info(GraphVizGenerator.generateGraphViz(graph)); + var formula = transitionNOT(FF()); } /** From b020547b8f95f3d1ebccee915bf07971fc3f7d77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Wed, 21 Apr 2021 13:16:16 +0200 Subject: [PATCH 090/157] refactor: logic of creating custom broker --- .../isst/configmanager/api/BrokerApi.java | 4 +--- .../api/controller/BrokerController.java | 12 ++---------- .../configmanager/api/service/BrokerService.java | 6 ++---- .../configmanager/api_test/BrokerUIAPITest.java | 16 ++-------------- .../isst/configmanager/util/TestUtil.java | 7 +++++++ 5 files changed, 14 insertions(+), 31 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java index f05dc370..c42bb984 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java @@ -16,9 +16,7 @@ public interface BrokerApi { // APIs to manage custom broker @PostMapping(value = "/broker", produces = "application/ld+json") @Operation(summary = "Creates a new broker") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Created a new broker"), - @ApiResponse(responseCode = "400", description = "Can not create the broker")}) + @ApiResponses({@ApiResponse(responseCode = "200", description = "Created a new broker")}) ResponseEntity createBroker(@RequestParam(value = "brokerUri") URI brokerUri, @RequestParam(value = "title", required = false) String title); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java index b7f453d5..97c3bcc2 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java @@ -57,17 +57,9 @@ public BrokerController(final BrokerService brokerService, @Override public ResponseEntity createBroker(final URI brokerUri, final String title) { log.info(">> POST /broker brokerUri: " + brokerUri + " title: " + title); - ResponseEntity response; - - final var brokerObject = brokerService.createCustomBroker(brokerUri, title); - - if (brokerObject != null) { - response = ResponseEntity.ok(Utility.jsonMessage("message", "Created a new broker with id: " + brokerUri)); - } else { - response = ResponseEntity.badRequest().body("Could not create a broker"); - } - return response; + brokerService.createCustomBroker(brokerUri, title); + return ResponseEntity.ok(Utility.jsonMessage("message", "Created a new broker with id: " + brokerUri)); } /** diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java index 40fe0ac7..5317f204 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java @@ -54,15 +54,13 @@ public BrokerService(final CustomBrokerRepository customBrokerRepository, * @param title title of the broker * @return custom broker */ - public CustomBroker createCustomBroker(final URI brokerUri, final String title) { + public void createCustomBroker(final URI brokerUri, final String title) { final var customBroker = new CustomBroker(brokerUri); if (title != null) { customBroker.setTitle(title); - customBroker.setBrokerStatus(BrokerStatus.UNREGISTERED); } + customBroker.setBrokerStatus(BrokerStatus.UNREGISTERED); customBrokerRepository.save(customBroker); - - return customBroker; } /** diff --git a/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java b/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java index 6050794a..30f9f294 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java @@ -2,10 +2,7 @@ import de.fraunhofer.isst.configmanager.api.controller.BrokerController; import de.fraunhofer.isst.configmanager.api.service.BrokerService; -import de.fraunhofer.isst.configmanager.api.service.resources.ResourceService; import de.fraunhofer.isst.configmanager.connector.clients.DefaultBrokerClient; -import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; import de.fraunhofer.isst.configmanager.model.config.CustomBroker; import de.fraunhofer.isst.configmanager.util.TestUtil; import org.junit.jupiter.api.Test; @@ -21,6 +18,7 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.doNothing; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -33,18 +31,9 @@ public class BrokerUIAPITest { @MockBean private transient BrokerService brokerService; - @MockBean - private DefaultConnectorClient defaultConnectorClient; - @MockBean private DefaultBrokerClient defaultBrokerClient; - @MockBean - private DefaultResourceClient defaultResourceClient; - - @MockBean - private ResourceService resourceService; - @Test public void should_add_new_broker() throws Exception { @@ -52,8 +41,7 @@ public void should_add_new_broker() throws Exception { requestParams.add("brokerUri", "https://example.com"); requestParams.add("title", "CustomBroker"); - CustomBroker broker = TestUtil.createCustomBroker(); - Mockito.when(brokerService.createCustomBroker(URI.create("https://example.com"), "CustomBroker")).thenReturn(broker); + doNothing().when(brokerService).createCustomBroker(URI.create("https://example.com"), "CustomBroker"); this.mockMvc.perform(post("/api/ui/broker").params(requestParams)).andExpect(status().isOk()); } diff --git a/src/test/java/de/fraunhofer/isst/configmanager/util/TestUtil.java b/src/test/java/de/fraunhofer/isst/configmanager/util/TestUtil.java index 4b4a574c..f589196a 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/util/TestUtil.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/util/TestUtil.java @@ -6,7 +6,14 @@ import java.util.ArrayList; import java.util.List; +/** + * Utility class for testing + */ public class TestUtil { + + /** + * @return custom broker + */ public static CustomBroker createCustomBroker() { CustomBroker customBroker = new CustomBroker(); customBroker.setBrokerUri(URI.create("https://example.com")); From 6585950c3099bd374de31b08739be4fc232ef856 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Wed, 21 Apr 2021 13:37:39 +0200 Subject: [PATCH 091/157] refactor: small code refactoring --- .../fraunhofer/isst/configmanager/api/service/BrokerService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java index 5317f204..2e2cd576 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java @@ -52,7 +52,6 @@ public BrokerService(final CustomBrokerRepository customBrokerRepository, * * @param brokerUri uri of the broker * @param title title of the broker - * @return custom broker */ public void createCustomBroker(final URI brokerUri, final String title) { final var customBroker = new CustomBroker(brokerUri); From c5de8fc65fe343eec198940567f4e76c1aeb36c8 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Wed, 21 Apr 2021 15:25:55 +0200 Subject: [PATCH 092/157] feat: add log guard levels to console log outputs --- CHANGELOG.md | 1 + .../ConfigmanagerApplication.java | 13 +- .../api/controller/AppController.java | 8 +- .../api/controller/AppRouteController.java | 134 +++++++++++++----- .../api/controller/BrokerController.java | 48 +++++-- .../api/controller/ConfigModelController.java | 15 +- .../api/controller/ConnectorController.java | 28 ++-- .../ConnectorRequestController.java | 20 ++- .../api/controller/EndpointController.java | 24 +++- .../ResourceContractController.java | 26 +++- .../api/controller/ResourceController.java | 50 +++++-- .../ResourceRepresentationController.java | 33 +++-- .../api/controller/UtilController.java | 12 +- .../configmanager/api/service/AppService.java | 8 +- .../api/service/BrokerService.java | 20 ++- .../api/service/ConfigModelService.java | 34 +++-- .../api/service/ConnectorRequestService.java | 16 ++- .../api/service/ConnectorService.java | 6 +- .../api/service/EndpointService.java | 12 +- .../resources/AbstractResourceService.java | 4 +- .../resources/ResourceContractService.java | 12 +- .../ResourceRepresentationService.java | 20 ++- .../service/resources/ResourceService.java | 16 ++- .../AbstractDataspaceConnectorClient.java | 7 +- .../clients/DataspaceBrokerClient.java | 26 ++-- .../clients/DataspaceConnectorClient.java | 77 ++++++---- .../clients/DataspaceResourceClient.java | 98 +++++++++---- .../configmanager/util/ValidateApiInput.java | 12 +- src/main/resources/log4j2.xml | 4 +- 29 files changed, 557 insertions(+), 227 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 91b71cad..b13c3843 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Patch Change: Code and Architecture refactoring - Patch Change: Docker, the Java version to be used is now fixed in the Dockerfile - Patch Change: If running infomodel-deserialize throws IOException, these are now explicitly logged in the DataspaceConnectorClient +- Patch Change: Added Log-Guard levels at console log-outputs and switched spring log level to warn ### Fixes - Patch Change: POST /api/ui/broker/register now return success:false if connector doesn't return 200 and GET /api/ui/brokers returns not registered in this case diff --git a/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java b/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java index 6a10badd..8386de00 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java @@ -31,8 +31,10 @@ public class ConfigmanagerApplication { public static final String CURRENT_VERSION = "7.0.0"; public static void main(final String[] args) { - log.info("---- [ConfigmanagerApplication] Starting ConfigManager " + CURRENT_VERSION); - log.info("---- [ConfigmanagerApplication] Used JVM charset (should be UTF-8): " + Charset.defaultCharset()); + if (log.isInfoEnabled()) { + log.info("---- [ConfigmanagerApplication] Starting ConfigManager " + CURRENT_VERSION); + log.info("---- [ConfigmanagerApplication] Used JVM charset (should be UTF-8): " + Charset.defaultCharset()); + } SpringApplication.run(ConfigmanagerApplication.class, args); } @@ -98,7 +100,10 @@ public void logInfoStillAlive() { final var maxHeapSize = Runtime.getRuntime().maxMemory() / mb; final var freeHeapSize = Runtime.getRuntime().freeMemory() / mb; final var threadCount = Thread.activeCount(); - log.info("[ConfigManager " + CURRENT_VERSION + "] Heap Size Stats: Used " + Math.toIntExact(currentHeapSize) + " MB - Free " + Math.toIntExact(freeHeapSize) + " MB - Max " + Math.toIntExact(maxHeapSize) + " MB - Running Threads: " + threadCount); - log.info("[ConfigManager " + CURRENT_VERSION + "] Waiting for API call..."); + + if (log.isInfoEnabled()) { + log.info("[ConfigManager " + CURRENT_VERSION + "] Heap Size Stats: Used " + Math.toIntExact(currentHeapSize) + " MB - Free " + Math.toIntExact(freeHeapSize) + " MB - Max " + Math.toIntExact(maxHeapSize) + " MB - Running Threads: " + threadCount); + log.info("[ConfigManager " + CURRENT_VERSION + "] Waiting for API call..."); + } } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppController.java index 270a7f6b..b2c25fef 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppController.java @@ -37,7 +37,9 @@ public AppController(final AppService appService, final ObjectMapper objectMappe */ @Override public ResponseEntity getApps() { - log.info(">> GET /apps"); + if (log.isInfoEnabled()) { + log.info(">> GET /apps"); + } ResponseEntity response; final var customAppList = appService.getApps(); @@ -46,7 +48,9 @@ public ResponseEntity getApps() { try { response = ResponseEntity.ok(objectMapper.writeValueAsString(customAppList)); } catch (JsonProcessingException e) { - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error(e.getMessage(), e); + } response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } else { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java index dfdde780..b963b4f3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java @@ -72,7 +72,10 @@ public AppRouteController(final ConfigModelService configModelService, */ @Override public ResponseEntity createAppRoute(final String description) { - log.info(">> POST /approute description: " + description); + if (log.isInfoEnabled()) { + log.info(">> POST /approute description: " + description); + } + ResponseEntity response; final var appRoute = appRouteService.createAppRoute(description); @@ -81,10 +84,15 @@ public ResponseEntity createAppRoute(final String description) { final var jsonObject = new JSONObject(); jsonObject.put("id", appRoute.getId().toString()); jsonObject.put("message", "Created a new app route successfully"); - log.info("---- [AppRouteController createAppRoute] Created app route successfully"); + + if (log.isInfoEnabled()) { + log.info("---- [AppRouteController createAppRoute] Created app route successfully"); + } response = ResponseEntity.ok(jsonObject.toJSONString()); } else { - log.info("---- [AppRouteController createAppRoute] Could not create app route"); + if (log.isInfoEnabled()) { + log.info("---- [AppRouteController createAppRoute] Could not create app route"); + } response = ResponseEntity.badRequest().body("Can not create an app route"); } @@ -99,16 +107,25 @@ public ResponseEntity createAppRoute(final String description) { */ @Override public ResponseEntity deleteAppRoute(final URI routeId) { - log.info(">> DELETE /approute routeId: " + routeId); + if (log.isInfoEnabled()) { + log.info(">> DELETE /approute routeId: " + routeId); + } + ResponseEntity response; final boolean deleted = appRouteService.deleteAppRoute(routeId); if (deleted) { - log.info("---- [AppRouteController deleteAppRoute] App route with id: " + routeId + " is deleted."); + if (log.isInfoEnabled()) { + log.info("---- [AppRouteController deleteAppRoute] App route with id: " + routeId + " is deleted."); + } + response = ResponseEntity.ok(Utility.jsonMessage("message", "App route with id: " + routeId + " is deleted.")); } else { - log.info("---- [AppRouteController deleteAppRoute] Could not delete app route with id: " + routeId); + if (log.isInfoEnabled()) { + log.info("---- [AppRouteController deleteAppRoute] Could not delete app route with id: " + routeId); + } + response = ResponseEntity.badRequest().body("Could not delete app route with id: " + routeId); } @@ -123,7 +140,10 @@ public ResponseEntity deleteAppRoute(final URI routeId) { */ @Override public ResponseEntity getAppRoute(final URI routeId) { - log.info(">> GET /approute routeId: " + routeId); + if (log.isInfoEnabled()) { + log.info(">> GET /approute routeId: " + routeId); + } + ResponseEntity response; final var appRoute = appRouteService.getAppRoute(routeId); @@ -131,15 +151,21 @@ public ResponseEntity getAppRoute(final URI routeId) { if (appRoute != null) { try { final var appRouteString = serializer.serialize(appRoute); - log.info("---- [AppRouteController getAppRoute] Returning app route"); + if (log.isInfoEnabled()) { + log.info("---- [AppRouteController getAppRoute] Returning app route"); + } response = ResponseEntity.ok(appRouteString); } catch (IOException e) { - log.error("---- [AppRouteController getAppRoute] Problem while serializing app route!"); - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error("---- [AppRouteController getAppRoute] Problem while serializing app route!"); + log.error(e.getMessage(), e); + } response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Could not serialize app route to jsonld"); } } else { - log.info("---- [AppRouteController getAppRoute] Could not get app route with id: " + routeId); + if (log.isInfoEnabled()) { + log.info("---- [AppRouteController getAppRoute] Could not get app route with id: " + routeId); + } response = ResponseEntity.badRequest().body("Could not get app route with id: " + routeId); } @@ -153,22 +179,30 @@ public ResponseEntity getAppRoute(final URI routeId) { */ @Override public ResponseEntity getAppRoutes() { - log.info(">> GET /approutes"); + if (log.isInfoEnabled()) { + log.info(">> GET /approutes"); + } ResponseEntity response; final var appRouteList = appRouteService.getAppRoutes(); try { if (appRouteList == null) { - log.info("---- [AppRouteController getAppRoutes] Returning empty list since no app routes are present"); + if (log.isInfoEnabled()) { + log.info("---- [AppRouteController getAppRoutes] Returning empty list since no app routes are present"); + } response = ResponseEntity.ok(serializer.serialize(new ArrayList())); } else { - log.info("---- [AppRouteController getAppRoutes] Returning list of app routes"); + if (log.isInfoEnabled()) { + log.info("---- [AppRouteController getAppRoutes] Returning list of app routes"); + } response = ResponseEntity.ok(serializer.serialize(appRouteList)); } } catch (IOException e) { - log.error("---- [AppRouteController getAppRoutes] Problem while serializing app routes list!"); - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error("---- [AppRouteController getAppRoutes] Problem while serializing app routes list!"); + log.error(e.getMessage(), e); + } response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } @@ -195,11 +229,13 @@ public ResponseEntity createAppRouteStep(final URI routeId, final URI st final int endCoordinateX, final int endCoordinateY, final URI resourceId) { - log.info(">> POST /approute/step routeId: " + routeId + " startId: " + startId - + " startCoordinateX: " + startCoordinateX - + " startCoordinateY: " + startCoordinateY + " endID: " + endID - + " endCoordinateX: " + endCoordinateX - + " endCoordinateY: " + endCoordinateY + " resourceId: " + resourceId); + if (log.isInfoEnabled()) { + log.info(">> POST /approute/step routeId: " + routeId + " startId: " + startId + + " startCoordinateX: " + startCoordinateX + + " startCoordinateY: " + startCoordinateY + " endID: " + endID + + " endCoordinateX: " + endCoordinateX + + " endCoordinateY: " + endCoordinateY + " resourceId: " + resourceId); + } ResponseEntity response; final var routeStep = appRouteService.createAppRouteStep(routeId, startId, @@ -211,10 +247,14 @@ public ResponseEntity createAppRouteStep(final URI routeId, final URI st jsonObject.put("routeStepId", routeStep.getId().toString()); jsonObject.put("message", "Successfully created the route step"); - log.info("---- [AppRouteController createAppRouteStep] Successfully created the route step"); + if (log.isInfoEnabled()) { + log.info("---- [AppRouteController createAppRouteStep] Successfully created the route step"); + } response = ResponseEntity.ok(jsonObject.toJSONString()); } else { - log.warn("---- [AppRouteController createAppRouteStep] Could not create the route step"); + if (log.isWarnEnabled()) { + log.warn("---- [AppRouteController createAppRouteStep] Could not create the route step"); + } response = ResponseEntity.badRequest().body("Could not create the route step"); } @@ -230,7 +270,9 @@ public ResponseEntity createAppRouteStep(final URI routeId, final URI st */ @Override public ResponseEntity getEndpointInformation(final URI routeId, final URI endpointId) { - log.info(">> GET /approute/step/endpoint/info routeId: " + routeId + " endpointId: " + endpointId); + if (log.isInfoEnabled()) { + log.info(">> GET /approute/step/endpoint/info routeId: " + routeId + " endpointId: " + endpointId); + } ResponseEntity response; final var endpointInformation = appRouteService.getEndpointInformation(routeId, endpointId); @@ -238,15 +280,21 @@ public ResponseEntity getEndpointInformation(final URI routeId, final UR if (endpointInformation != null) { try { final var endpointInfo = objectMapper.writeValueAsString(endpointInformation); - log.info("---- [AppRouteController getEndpointInformation Returning endpoint information"); + if (log.isInfoEnabled()) { + log.info("---- [AppRouteController getEndpointInformation Returning endpoint information"); + } response = ResponseEntity.ok(endpointInfo); } catch (JsonProcessingException e) { - log.error("---- [AppRouteController getEndpointInformation Could not parse endpoint Information to JSON!"); - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error("---- [AppRouteController getEndpointInformation Could not parse endpoint Information to JSON!"); + log.error(e.getMessage(), e); + } response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Could not parse endpoint information to JSON"); } } else { - log.warn("---- [AppRouteController getEndpointInformation] Endpoint Information is null"); + if (log.isWarnEnabled()) { + log.warn("---- [AppRouteController getEndpointInformation] Endpoint Information is null"); + } response = ResponseEntity.badRequest().body("Could not get endpoint information"); } @@ -261,7 +309,9 @@ public ResponseEntity getEndpointInformation(final URI routeId, final UR */ @Override public ResponseEntity updateRouteDeployMethod(final DeployMethod deployMethod) { - log.info(">> PUT /route/deploymethod deployMethod: " + deployMethod); + if (log.isInfoEnabled()) { + log.info(">> PUT /route/deploymethod deployMethod: " + deployMethod); + } ResponseEntity response; if (routeDeployMethodRepository.count() != 0) { @@ -273,11 +323,15 @@ public ResponseEntity updateRouteDeployMethod(final DeployMethod deployM // Updates the deploy method from the app routes and route steps updateDeployMethodFromRoutes(deployMethod); - log.info("---- [AppRouteController updateRouteDeployMethod] Updated successfully the route deploy method"); + if (log.isInfoEnabled()) { + log.info("---- [AppRouteController updateRouteDeployMethod] Updated successfully the route deploy method"); + } response = ResponseEntity.ok("Updated successfully the route deploy method"); } else { - log.warn("---- [AppRouteController updateRouteDeployMethod] Could not update the route deploy method"); + if (log.isWarnEnabled()) { + log.warn("---- [AppRouteController updateRouteDeployMethod] Could not update the route deploy method"); + } response = ResponseEntity.badRequest().body("Could not update the route deploy method"); } @@ -291,17 +345,23 @@ public ResponseEntity updateRouteDeployMethod(final DeployMethod deployM */ @Override public ResponseEntity getRouteDeployMethod() { - log.info(">> GET /route/deploymethod"); + if (log.isInfoEnabled()) { + log.info(">> GET /route/deploymethod"); + } ResponseEntity response; final var routeDeployMethods = routeDeployMethodRepository.findAll(); try { - log.info("---- [AppRouteController getRouteDeployMethod] Returning the deploy route method"); + if (log.isInfoEnabled()) { + log.info("---- [AppRouteController getRouteDeployMethod] Returning the deploy route method"); + } response = ResponseEntity.ok(objectMapper.writeValueAsString(routeDeployMethods)); } catch (JsonProcessingException e) { - log.error("---- [AppRouteController getRouteDeployMethod] Could not get deploy method from the app routes!"); - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error("---- [AppRouteController getRouteDeployMethod] Could not get deploy method from the app routes!"); + log.error(e.getMessage(), e); + } response = ResponseEntity.badRequest().body("Could not get deploy method from the app routes"); } @@ -314,7 +374,9 @@ public ResponseEntity getRouteDeployMethod() { * @param deployMethod deploy method of the route */ private void updateDeployMethodFromRoutes(final DeployMethod deployMethod) { - log.info("---- [AppRouteController updateDeployMethodFromRoutes] Updating deploymethod for every app route and route step..."); + if (log.isInfoEnabled()) { + log.info("---- [AppRouteController updateDeployMethodFromRoutes] Updating deploymethod for every app route and route step..."); + } final var appRouteList = configModelService.getConfigModel().getAppRoute(); if (appRouteList != null) { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java index 97c3bcc2..80ad434f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java @@ -56,7 +56,9 @@ public BrokerController(final BrokerService brokerService, */ @Override public ResponseEntity createBroker(final URI brokerUri, final String title) { - log.info(">> POST /broker brokerUri: " + brokerUri + " title: " + title); + if (log.isInfoEnabled()) { + log.info(">> POST /broker brokerUri: " + brokerUri + " title: " + title); + } brokerService.createCustomBroker(brokerUri, title); return ResponseEntity.ok(Utility.jsonMessage("message", "Created a new broker with id: " + brokerUri)); @@ -71,7 +73,9 @@ public ResponseEntity createBroker(final URI brokerUri, final String tit */ @Override public ResponseEntity updateBroker(final URI brokerId, final String title) { - log.info(">> PUT /broker brokerId: " + brokerId + " title: " + title); + if (log.isInfoEnabled()) { + log.info(">> PUT /broker brokerId: " + brokerId + " title: " + title); + } ResponseEntity response; if (brokerService.updateBroker(brokerId, title)) { @@ -94,7 +98,9 @@ public ResponseEntity updateBroker(final URI brokerId, final String titl */ @Override public ResponseEntity deleteBroker(final URI brokerUri) { - log.info(">> DELETE /broker brokerUri " + brokerUri); + if (log.isInfoEnabled()) { + log.info(">> DELETE /broker brokerUri " + brokerUri); + } ResponseEntity response; if (brokerService.deleteBroker(brokerUri)) { @@ -113,7 +119,9 @@ public ResponseEntity deleteBroker(final URI brokerUri) { */ @Override public ResponseEntity getAllBrokers() { - log.info(">> GET /brokers"); + if (log.isInfoEnabled()) { + log.info(">> GET /brokers"); + } ResponseEntity response; final var brokers = brokerService.getCustomBrokers(); @@ -136,7 +144,9 @@ public ResponseEntity getAllBrokers() { */ @Override public ResponseEntity registerConnector(final URI brokerUri) { - log.info(">> POST /broker/register brokerUri: " + brokerUri); + if (log.isInfoEnabled()) { + log.info(">> POST /broker/register brokerUri: " + brokerUri); + } ResponseEntity response; final var broker = brokerService.getById(brokerUri); @@ -155,7 +165,9 @@ public ResponseEntity registerConnector(final URI brokerUri) { } response = ResponseEntity.ok(jsonObject.toJSONString()); } catch (IOException e) { - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error(e.getMessage(), e); + } jsonObject.put(success, false); response = ResponseEntity.ok(jsonObject.toJSONString()); } @@ -174,7 +186,9 @@ public ResponseEntity registerConnector(final URI brokerUri) { */ @Override public ResponseEntity unregisterConnector(final URI brokerUri) { - log.info(">> POST /broker/unregister brokerUri: " + brokerUri); + if (log.isInfoEnabled()) { + log.info(">> POST /broker/unregister brokerUri: " + brokerUri); + } ResponseEntity response; final var broker = brokerService.getById(brokerUri); @@ -194,7 +208,9 @@ public ResponseEntity unregisterConnector(final URI brokerUri) { } response = ResponseEntity.ok(jsonObject.toJSONString()); } catch (IOException e) { - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error(e.getMessage(), e); + } jsonObject.put(success, false); response = ResponseEntity.ok(jsonObject.toJSONString()); } @@ -213,7 +229,9 @@ public ResponseEntity unregisterConnector(final URI brokerUri) { */ @Override public ResponseEntity updateConnector(final URI brokerUri) { - log.info(">> POST /broker/update brokerUri: " + brokerUri); + if (log.isInfoEnabled()) { + log.info(">> POST /broker/update brokerUri: " + brokerUri); + } ResponseEntity response; final var broker = brokerService.getById(brokerUri); @@ -247,7 +265,9 @@ public ResponseEntity updateConnector(final URI brokerUri) { */ @Override public ResponseEntity updateResourceAtBroker(final URI brokerUri, final URI resourceId) { - log.info(">> POST /broker/update/resource brokerUri: " + brokerUri + " resourceId: " + resourceId); + if (log.isInfoEnabled()) { + log.info(">> POST /broker/update/resource brokerUri: " + brokerUri + " resourceId: " + resourceId); + } ResponseEntity response; response = updateConnector(brokerUri); @@ -287,7 +307,9 @@ public ResponseEntity updateResourceAtBroker(final URI brokerUri, final */ @Override public ResponseEntity deleteResourceAtBroker(final URI brokerUri, final URI resourceId) { - log.info(">> POST /broker/delete/resource brokerUri: " + brokerUri + " resourceId: " + resourceId); + if (log.isInfoEnabled()) { + log.info(">> POST /broker/delete/resource brokerUri: " + brokerUri + " resourceId: " + resourceId); + } final var response = updateConnector(brokerUri); @@ -329,7 +351,9 @@ public ResponseEntity deleteResourceAtBroker(final URI brokerUri, final */ @Override public ResponseEntity getRegisterStatusForResource(final URI resourceId) { - log.info(">> GET /broker/resource/information resourceId: " + resourceId); + if (log.isInfoEnabled()) { + log.info(">> GET /broker/resource/information resourceId: " + resourceId); + } ResponseEntity response; final var jsonObject = brokerService.getRegisStatusForResource(resourceId); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java index 218d08b9..e4d00c25 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java @@ -71,9 +71,10 @@ public ResponseEntity updateConfigModel(final String loglevel, final ArrayList noProxyUriList, final String username, final String password) { - - log.info(">> PUT /configmodel loglevel: " + loglevel + " connectorDeployMode: " + connectorDeployMode + " trustStore: " + trustStore - + " keyStore: " + keyStore + " proxyUri: " + proxyUri + " username: " + username); + if (log.isInfoEnabled()) { + log.info(">> PUT /configmodel loglevel: " + loglevel + " connectorDeployMode: " + connectorDeployMode + " trustStore: " + trustStore + + " keyStore: " + keyStore + " proxyUri: " + proxyUri + " username: " + username); + } ResponseEntity response; @@ -102,7 +103,9 @@ public ResponseEntity updateConfigModel(final String loglevel, response = ResponseEntity.badRequest().body(jsonObject.toJSONString()); } } catch (IOException e) { - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error(e.getMessage(), e); + } response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } else { @@ -119,7 +122,9 @@ public ResponseEntity updateConfigModel(final String loglevel, */ @Override public ResponseEntity getConfigModel() { - log.info(">> GET /configmodel"); + if (log.isInfoEnabled()) { + log.info(">> GET /configmodel"); + } ResponseEntity response; try { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java index 6c8b600b..73f02d34 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java @@ -64,7 +64,9 @@ public ConnectorController(final ConnectorService connectorService, */ @Override public ResponseEntity getConnector() { - log.info(">> GET /connector"); + if (log.isInfoEnabled()) { + log.info(">> GET /connector"); + } ResponseEntity response; final var connector = configModelService.getConfigModel().getConnectorDescription(); @@ -90,7 +92,9 @@ public ResponseEntity getConnector() { */ @Override public ResponseEntity getConnectorStatus() { - log.info(">> GET /connector/status"); + if (log.isInfoEnabled()) { + log.info(">> GET /connector/status"); + } ResponseEntity response; final var json = new JSONObject(); @@ -98,13 +102,17 @@ public ResponseEntity getConnectorStatus() { try { client.getConnectorStatus(); - log.info("---- [ConnectorController getConnectorStatus] Could connect to the Connector!"); + if (log.isInfoEnabled()) { + log.info("---- [ConnectorController getConnectorStatus] Could connect to the Connector!"); + } json.put("status", "Public connector endpoint reachable."); response = new ResponseEntity<>(json.toString(), HttpStatus.OK); } catch (Exception e) { //Error case does not need to be processed further here - log.warn("---- [ConnectorController getConnectorStatus] Could not connect to the Connector!"); + if (log.isWarnEnabled()) { + log.warn("---- [ConnectorController getConnectorStatus] Could not connect to the Connector!"); + } json.put("status", "Public connector endpoint not reachable."); response = new ResponseEntity<>(json.toString(), HttpStatus.SERVICE_UNAVAILABLE); @@ -136,9 +144,11 @@ public ResponseEntity updateConnector(final String title, final URI maintainer, final String inboundModelVersion, final String outboundModelVersion) { - log.info(">> PUT /connector title: " + title + " description: " + " endpointAccessURL: " + endpointAccessURL - + " version: " + version + " curator: " + curator + " maintainer: " + maintainer + " inboundModelVersion: " - + inboundModelVersion + " outboundModelVersion: " + outboundModelVersion); + if (log.isInfoEnabled()) { + log.info(">> PUT /connector title: " + title + " description: " + " endpointAccessURL: " + endpointAccessURL + + " version: " + version + " curator: " + curator + " maintainer: " + maintainer + " inboundModelVersion: " + + inboundModelVersion + " outboundModelVersion: " + outboundModelVersion); + } ResponseEntity response; @@ -183,7 +193,9 @@ public ResponseEntity updateConnector(final String title, response = ResponseEntity.badRequest().body(jsonObject.toJSONString()); } } catch (IOException e) { - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error(e.getMessage(), e); + } jsonObject.put("connectorResponse", "Failed to send the new configuration to the client"); response = ResponseEntity.badRequest().body(jsonObject.toJSONString()); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java index 4ba28c13..f2ac8b83 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java @@ -47,7 +47,9 @@ public ConnectorRequestController(final ConnectorRequestService connectorRequest */ @Override public ResponseEntity requestMetadata(final URI recipientId, final URI requestedResourceId) { - log.info(">> POST /request/description recipientId: {} and requestedResource: {}", recipientId, requestedResourceId); + if (log.isInfoEnabled()) { + log.info(">> POST /request/description recipientId: {} and requestedResource: {}", recipientId, requestedResourceId); + } ResponseEntity response; if (requestedResourceId != null) { @@ -85,8 +87,10 @@ public ResponseEntity requestMetadata(final URI recipientId, final URI r public ResponseEntity requestContract(final URI recipientId, final URI requestedArtifactId, final String contractOffer) { - log.info(">> POST /request/contract with recipient: {}, artifact: {}, contract: {}", - recipientId, requestedArtifactId, contractOffer); + if (log.isInfoEnabled()) { + log.info(">> POST /request/contract with recipient: {}, artifact: {}, contract: {}", + recipientId, requestedArtifactId, contractOffer); + } ResponseEntity response; @@ -126,8 +130,10 @@ public ResponseEntity requestData(final URI recipientId, final UUID key, final QueryInput queryInput) { - log.info(">> POST /request/artifact with recipient: {}, artifact: {}, contract: {}, key: {} and queryInput: {} ", - recipientId, requestedArtifactId, contractId, key, queryInput); + if (log.isInfoEnabled()) { + log.info(">> POST /request/artifact with recipient: {}, artifact: {}, contract: {}, key: {} and queryInput: {} ", + recipientId, requestedArtifactId, contractId, key, queryInput); + } ResponseEntity response = null; try { @@ -146,7 +152,9 @@ public ResponseEntity requestData(final URI recipientId, response = ResponseEntity.badRequest().body(clientResponseString); } } catch (IOException e) { - log.error(e.getMessage()); + if (log.isErrorEnabled()) { + log.error(e.getMessage()); + } } return response; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java index b9f57aa7..9aec6373 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java @@ -60,7 +60,9 @@ public EndpointController(final Serializer serializer, public ResponseEntity createGenericEndpoint(final URI accessURL, final String username, final String password) { - log.info(">> POST /generic/endpoint accessURL: " + accessURL + " username: " + username); + if (log.isInfoEnabled()) { + log.info(">> POST /generic/endpoint accessURL: " + accessURL + " username: " + username); + } ResponseEntity response; final var genericEndpoint = endpointService.createGenericEndpoint(accessURL, username, password); @@ -84,7 +86,9 @@ public ResponseEntity createGenericEndpoint(final URI accessURL, */ @Override public ResponseEntity getGenericEndpoints() { - log.info(">> GET /generic/endpoints"); + if (log.isInfoEnabled()) { + log.info(">> GET /generic/endpoints"); + } ResponseEntity response; final var endpoints = endpointService.getGenericEndpoints(); @@ -92,7 +96,9 @@ public ResponseEntity getGenericEndpoints() { try { response = ResponseEntity.ok(serializer.serialize(endpoints)); } catch (IOException e) { - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error(e.getMessage(), e); + } response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } @@ -107,7 +113,9 @@ public ResponseEntity getGenericEndpoints() { */ @Override public ResponseEntity deleteGenericEndpoint(final URI endpointId) { - log.info(">> DELETE /generic/endpoint endpointId: " + endpointId); + if (log.isInfoEnabled()) { + log.info(">> DELETE /generic/endpoint endpointId: " + endpointId); + } ResponseEntity response; final var deleted = endpointService.deleteGenericEndpoint(endpointId); @@ -135,7 +143,9 @@ public ResponseEntity updateGenericEndpoint(final URI endpointId, final URI accessURL, final String username, final String password) { - log.info(">> PUT /generic/endpoint endpointId: " + endpointId + " accessURL: " + accessURL); + if (log.isInfoEnabled()) { + log.info(">> PUT /generic/endpoint endpointId: " + endpointId + " accessURL: " + accessURL); + } ResponseEntity response; final var updated = endpointService.updateGenericEndpoint(endpointId, accessURL, username, password); @@ -157,7 +167,9 @@ public ResponseEntity updateGenericEndpoint(final URI endpointId, */ @Override public ResponseEntity createConnectorEndpoint(final URI accessUrl) { - log.info(">> POST /connector/endpoint accessUrl: " + accessUrl); + if (log.isInfoEnabled()) { + log.info(">> POST /connector/endpoint accessUrl: " + accessUrl); + } final var configModelImpl = (ConfigurationModelImpl) configModelService.getConfigModel(); final var baseConnector = (BaseConnectorImpl) configModelImpl.getConnectorDescription(); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java index ea3352ae..59ce1f06 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java @@ -55,7 +55,9 @@ public ResourceContractController(final ResourceContractService resourceContract */ @Override public ResponseEntity updateResourceContract(final URI resourceId, final String contractJson) { - log.info(">> PUT /resource/contract resourceId: " + resourceId + " contractJson: " + contractJson); + if (log.isInfoEnabled()) { + log.info(">> PUT /resource/contract resourceId: " + resourceId + " contractJson: " + contractJson); + } ResponseEntity response; if ("{}".equals(contractJson) && ValidateApiInput.notValid(resourceId.toString())) { @@ -80,7 +82,9 @@ public ResponseEntity updateResourceContract(final URI resourceId, final jsonObject.put("connectorResponse", clientResponse); response = ResponseEntity.ok(jsonObject.toJSONString()); } catch (IOException e) { - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error(e.getMessage(), e); + } jsonObject.put("message", "Problems while updating the contract at the connector"); response = ResponseEntity.badRequest().body(jsonObject.toJSONString()); } @@ -88,7 +92,9 @@ public ResponseEntity updateResourceContract(final URI resourceId, final response = ResponseEntity.badRequest().body("Could not update the resource contract"); } } catch (IOException e) { - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error(e.getMessage(), e); + } response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); } } @@ -106,8 +112,10 @@ public ResponseEntity updateResourceContract(final URI resourceId, final public ResponseEntity updateContractForResource(final URI resourceId, final Pattern pattern, final String contractJson) { - log.info(">> PUT /resource/contract/update resourceId: " + resourceId + "pattern" + pattern.toString() - + " contractJson: " + contractJson); + if (log.isInfoEnabled()) { + log.info(">> PUT /resource/contract/update resourceId: " + resourceId + "pattern" + pattern.toString() + + " contractJson: " + contractJson); + } ResponseEntity response; @@ -118,7 +126,9 @@ public ResponseEntity updateContractForResource(final URI resourceId, try { contractOffer = resourceContractService.getContractOffer(pattern, contractJson); } catch (JsonProcessingException e) { - log.error(e.getMessage()); + if (log.isErrorEnabled()) { + log.error(e.getMessage()); + } } // Update the resource contract @@ -137,7 +147,9 @@ public ResponseEntity updateContractForResource(final URI resourceId, jsonObject.put("connectorResponse", connectorResponse); response = ResponseEntity.ok(jsonObject.toJSONString()); } catch (IOException e) { - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error(e.getMessage(), e); + } jsonObject.put("message", "Problems while updating the contract at the connector"); response = ResponseEntity.badRequest().body(jsonObject.toJSONString()); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java index cd8fa2a6..c2ad4fe8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java @@ -62,7 +62,9 @@ public ResourceController(final ResourceService resourceService, */ @Override public ResponseEntity getResource(final URI resourceId) { - log.info(">> GET /resource resourceId: " + resourceId); + if (log.isInfoEnabled()) { + log.info(">> GET /resource resourceId: " + resourceId); + } ResponseEntity response; if (ValidateApiInput.notValid(resourceId.toString())) { @@ -92,13 +94,17 @@ public ResponseEntity getResource(final URI resourceId) { */ @Override public ResponseEntity getResources() { - log.info(">> GET /resources"); + if (log.isInfoEnabled()) { + log.info(">> GET /resources"); + } return ResponseEntity.ok(resourceService.getOfferedResourcesAsJsonString()); } @Override public ResponseEntity getRequestedResources() { - log.info(">> GET /resources/requested"); + if (log.isInfoEnabled()) { + log.info(">> GET /resources/requested"); + } return ResponseEntity.ok(resourceService.getRequestedResourcesAsJsonString()); } @@ -112,7 +118,9 @@ public ResponseEntity getRequestedResources() { */ @Override public ResponseEntity deleteResource(final URI resourceId) { - log.info(">> DELETE /resource resourceId: " + resourceId); + if (log.isInfoEnabled()) { + log.info(">> DELETE /resource resourceId: " + resourceId); + } ResponseEntity response; if (ValidateApiInput.notValid(resourceId.toString())) { @@ -128,7 +136,9 @@ public ResponseEntity deleteResource(final URI resourceId) { response = ResponseEntity.ok(jsonObject.toJSONString()); } catch (IOException e) { - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error(e.getMessage(), e); + } response = ResponseEntity.badRequest().body("Could not send delete request to connector"); } @@ -159,9 +169,11 @@ public ResponseEntity createResource(final String title, final String version, final URI standardlicense, final URI publisher) { - log.info(">> POST /resource title: " + title + " description: " + description - + " language: " + language + " keywords: " + keywords + " version: " + version - + " standardlicense: " + standardlicense + " publisher: " + publisher); + if (log.isInfoEnabled()) { + log.info(">> POST /resource title: " + title + " description: " + description + + " language: " + language + " keywords: " + keywords + " version: " + version + + " standardlicense: " + standardlicense + " publisher: " + publisher); + } ResponseEntity response; if (ValidateApiInput.notValid(title, description, language, version, standardlicense.toString(), publisher.toString())) { @@ -179,7 +191,11 @@ public ResponseEntity createResource(final String title, response = ResponseEntity.ok(jsonObject.toJSONString()); } catch (IOException e) { jsonObject.put("message", "Could not register resource at connector"); - log.error(e.getMessage(), e); + + if (log.isErrorEnabled()) { + log.error(e.getMessage(), e); + } + response = ResponseEntity.badRequest().body(jsonObject.toJSONString()); } } @@ -211,9 +227,11 @@ public ResponseEntity updateResource(final URI resourceId, final String version, final URI standardlicense, final URI publisher) { - log.info(">> PUT /resource title: " + title + " description: " + description + " language: " - + language + " keywords: " + keywords + " version: " + version - + " standardlicense: " + standardlicense + " publisher: " + publisher); + if (log.isInfoEnabled()) { + log.info(">> PUT /resource title: " + title + " description: " + description + " language: " + + language + " keywords: " + keywords + " version: " + version + + " standardlicense: " + standardlicense + " publisher: " + publisher); + } ResponseEntity response; if (ValidateApiInput.notValid(resourceId.toString(), title, description, language, version, standardlicense.toString(), publisher.toString())) { @@ -235,7 +253,9 @@ public ResponseEntity updateResource(final URI resourceId, try { brokerClient.updateAtBroker(brokerId); } catch (IOException e) { - log.warn(String.format("Error while updating at broker: %s", e.getMessage()), e); + if (log.isWarnEnabled()) { + log.warn(String.format("Error while updating at broker: %s", e.getMessage()), e); + } } }); }); @@ -252,7 +272,9 @@ public ResponseEntity updateResource(final URI resourceId, .body(String.format("No resource with ID %s was found!", resourceId)); } } catch (IOException e) { - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error(e.getMessage(), e); + } response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage()); } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java index 433213de..f53976f4 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java @@ -43,17 +43,14 @@ public class ResourceRepresentationController implements ResourceRepresentationA transient ConfigModelService configModelService; transient ResourceRepresentationService resourceRepresentationService; transient DefaultResourceClient client; - transient Serializer serializer; @Autowired public ResourceRepresentationController(final ConfigModelService configModelService, final ResourceRepresentationService resourceRepresentationService, - final DefaultResourceClient client, - final Serializer serializer) { + final DefaultResourceClient client) { this.client = client; this.configModelService = configModelService; this.resourceRepresentationService = resourceRepresentationService; - this.serializer = serializer; } /** @@ -74,9 +71,11 @@ public ResponseEntity createResourceRepresentation(final URI resourceId, final String filenameExtension, final Long bytesize, final String sourceType) { - log.info(">> POST /resource/representation resourceId: " + resourceId + " endpointId: " + endpointId + " language: " + language - + " filenameExtension: " + filenameExtension + " bytesize: " + bytesize - + " sourceType: " + sourceType); + if (log.isInfoEnabled()) { + log.info(">> POST /resource/representation resourceId: " + resourceId + " endpointId: " + endpointId + " language: " + language + + " filenameExtension: " + filenameExtension + " bytesize: " + bytesize + + " sourceType: " + sourceType); + } ResponseEntity response; if (ValidateApiInput.notValid(resourceId.toString(), sourceType)) { @@ -105,7 +104,9 @@ public ResponseEntity createResourceRepresentation(final URI resourceId, jsonObject.put("connectorResponse", clientResponse); response = ResponseEntity.ok(jsonObject.toJSONString()); } catch (IOException e) { - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error(e.getMessage(), e); + } jsonObject.put("message", "Could not register the resource representation at the connector"); response = ResponseEntity.badRequest().body(jsonObject.toJSONString()); } @@ -135,9 +136,11 @@ public ResponseEntity updateResourceRepresentation(final URI resourceId, final String filenameExtension, final Long bytesize, final String sourceType) { - log.info(">> PUT /resource/representation resourceId: " + resourceId + " representationId: " - + representationId + " endpointId: " + endpointId + " language: " + language + " filenameExtension: " - + filenameExtension + " bytesize: " + bytesize + " sourceType: " + sourceType); + if (log.isInfoEnabled()) { + log.info(">> PUT /resource/representation resourceId: " + resourceId + " representationId: " + + representationId + " endpointId: " + endpointId + " language: " + language + " filenameExtension: " + + filenameExtension + " bytesize: " + bytesize + " sourceType: " + sourceType); + } ResponseEntity response = null; final var oldResourceCatalog = (ResourceImpl) resourceRepresentationService.getResource(resourceId); @@ -147,7 +150,9 @@ public ResponseEntity updateResourceRepresentation(final URI resourceId, oldResourceCatalog.setRepresentation(null); if (configModelService.getConfigModel().getAppRoute() == null) { - log.info("---- [ResourceRepresentationController updateResourceRepresentation] No AppRoute in ConfigModel!"); + if (log.isInfoEnabled()) { + log.info("---- [ResourceRepresentationController updateResourceRepresentation] No AppRoute in ConfigModel!"); + } } else { final var oldResourceRoute = (ResourceImpl) resourceRepresentationService.getResourceInAppRoute(resourceId); if (oldResourceRoute != null) { @@ -208,7 +213,9 @@ public ResponseEntity updateResourceRepresentation(final URI resourceId, } } catch (IOException e) { configModelService.saveState(); - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error(e.getMessage(), e); + } } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/UtilController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/UtilController.java index 2ac2e6c0..a902b645 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/UtilController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/UtilController.java @@ -37,7 +37,9 @@ public UtilController(final UtilService utilService, final DefaultConnectorClien */ @Override public ResponseEntity getSpecificEnum(final String enumName) { - log.info(">> GET /api/ui/enum " + enumName); + if (log.isInfoEnabled()) { + log.info(">> GET /api/ui/enum " + enumName); + } ResponseEntity response; final var enums = utilService.getSpecificEnum(enumName); @@ -59,7 +61,9 @@ public ResponseEntity getSpecificEnum(final String enumName) { */ @Override public ResponseEntity getPolicyPattern(final String policy) { - log.info(">> GET /api/ui/policy-pattern " + policy); + if (log.isInfoEnabled()) { + log.info(">> GET /api/ui/policy-pattern " + policy); + } ResponseEntity response; String pattern; @@ -72,7 +76,9 @@ public ResponseEntity getPolicyPattern(final String policy) { response = ResponseEntity.badRequest().body("Could not find any pattern for the given policy"); } } catch (IOException e) { - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error(e.getMessage(), e); + } response = ResponseEntity.badRequest().body("Failed to determine policy pattern at the client"); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java index 48e1cb48..afd9ab63 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java @@ -35,13 +35,17 @@ public AppService(final CustomAppRepository customAppRepository) throws URISynta // If db is empty dummy apps will be created if (customAppRepository.count() == 0) { - log.info("---- [AppService] No custom app is found! Creating custom apps."); + if (log.isInfoEnabled()) { + log.info("---- [AppService] No custom app is found! Creating custom apps."); + } final List customAppList = new ArrayList<>(); final var customApp1 = new CustomApp(); final var appName = System.getenv("CUSTOM_APP_NAME"); customApp1.setTitle(Objects.requireNonNullElse(appName, "Custom App 1")); - log.info("---- [AppService] Created custom app with title: " + customApp1.getTitle()); + if (log.isInfoEnabled()) { + log.info("---- [AppService] Created custom app with title: " + customApp1.getTitle()); + } final List customAppEndpoints = new ArrayList<>(); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java index 2e2cd576..1e2ae5b1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java @@ -38,7 +38,9 @@ public BrokerService(final CustomBrokerRepository customBrokerRepository, // If no broker is found in the database, a default broker is created at this point. if (customBrokerRepository.count() == 0) { - log.info("---- [BrokerService] Db is empty! Creating custom broker"); + if (log.isInfoEnabled()) { + log.info("---- [BrokerService] Db is empty! Creating custom broker"); + } final var customBroker = new CustomBroker(); customBroker.setBrokerUri(URI.create("https://broker.ids.isst.fraunhofer.de/infrastructure")); customBroker.setTitle("IDS Broker"); @@ -97,7 +99,9 @@ public boolean deleteBroker(final URI id) { customBrokerRepository.delete(customBroker); deleted = true; } else { - log.warn(String.format("---- [BrokerService deleteBroker] Tried to delete a Broker, but no config with id %s exists!", id.toString())); + if (log.isWarnEnabled()) { + log.warn(String.format("---- [BrokerService deleteBroker] Tried to delete a Broker, but no config with id %s exists!", id.toString())); + } } return deleted; } @@ -159,7 +163,9 @@ public void deleteResourceAtBroker(final URI brokerUri, final URI resourceId) { final var customBroker = getById(brokerUri); if (customBroker != null) { if (customBroker.getRegisteredResources() == null) { - log.info("---- [BrokerService deleteResourceAtBroker] Could not found any resource to delete"); + if (log.isInfoEnabled()) { + log.info("---- [BrokerService deleteResourceAtBroker] Could not found any resource to delete"); + } } else { final var registeredResources = customBroker.getRegisteredResources(); registeredResources.removeIf(s -> s.equals(resourceId.toString())); @@ -179,7 +185,9 @@ public JSONArray getRegisStatusForResource(final URI resourceId) { final var customBrokers = customBrokerRepository.findAll(); if (customBrokers.isEmpty()) { - log.info("---- [BrokerService getRegisStatusForResource] Could not find any broker"); + if (log.isInfoEnabled()) { + log.info("---- [BrokerService getRegisStatusForResource] Could not find any broker"); + } } else { final var jsonArray = new JSONArray(); final var jsonObject = new JSONObject(); @@ -209,7 +217,9 @@ public JSONArray getRegisteredBroker() { final var jsonArray = new JSONArray(); final var customBrokers = customBrokerRepository.findAll(); if (customBrokers.isEmpty()) { - log.info("---- [BrokerService getRegisteredBroker] Could not find any broker"); + if (log.isInfoEnabled()) { + log.info("---- [BrokerService getRegisteredBroker] Could not find any broker"); + } } else { final var jsonObject = new JSONObject(); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java index 0ed5fa17..633c398f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java @@ -45,28 +45,36 @@ public class ConfigModelService { public ConfigModelService(final ConfigModelRepository configModelRepository, final DefaultConnectorClient client) { this.configModelRepository = configModelRepository; - log.warn("---- [ConfigModelService] Initial StartUp! Trying to get current Configuration from Connector!"); + if (log.isWarnEnabled()) { + log.warn("---- [ConfigModelService] Initial StartUp! Trying to get current Configuration from Connector!"); + } try { final var connectorConfiguration = client.getConfiguration(); updateConfigModel(connectorConfiguration); - log.info("---- [ConfigModelService] Received configuration from running Connector!"); + if (log.isInfoEnabled()) { + log.info("---- [ConfigModelService] Received configuration from running Connector!"); + } } catch (IOException e) { - log.warn("---- [ConfigModelService] Could not get Configmodel from Connector! Using old Config if " - + "available! Error establishing connection to connector: " + e.getMessage()); + if (log.isWarnEnabled()) { + log.warn("---- [ConfigModelService] Could not get Configmodel from Connector! Using old Config if " + + "available! Error establishing connection to connector: " + e.getMessage()); + } if (configModelRepository.findAll().size() > 0) { configModelObject = configModelRepository.findAll().get(0); } else { - log.warn("---- [ConfigModelService] Connector Config not reachable and no old config available! Using new placeholder Config."); - createConfigModel( - "NO_LOGGING", - "TEST_DEPLOYMENT", - "http://truststore", - "password", - "http://keystore", - "password" - ); + if (log.isWarnEnabled()) { + log.warn("---- [ConfigModelService] Connector Config not reachable and no old config available! Using new placeholder Config."); + createConfigModel( + "NO_LOGGING", + "TEST_DEPLOYMENT", + "http://truststore", + "password", + "http://keystore", + "password" + ); + } } } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java index addbc02c..8200a0ee 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java @@ -53,11 +53,15 @@ public List requestResourcesFromConnector(final URI recipientId) { } return resourceList; } else { - log.info("---- [ConnectorRequestService requestResourcesFromConnector] Could not determine the resources of the connector"); + if (log.isInfoEnabled()) { + log.info("---- [ConnectorRequestService requestResourcesFromConnector] Could not determine the resources of the connector"); + } return null; } } catch (IOException e) { - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error(e.getMessage(), e); + } return null; } } @@ -80,7 +84,9 @@ public String requestResource(final URI recipientId, final URI requestedResource final var resource = splitBody[1].substring(10); customResponse = "Validation Key: " + validationKey + "\nResource: " + resource; } else { - log.info("---- [ConnectorRequestService requestResource] Could not determine resource"); + if (log.isInfoEnabled()) { + log.info("---- [ConnectorRequestService requestResource] Could not determine resource"); + } return null; } } catch (IOException e) { @@ -105,7 +111,9 @@ public String requestContractAgreement(final String recipientId, try { return connectorClient.requestContractAgreement(recipientId, requestedArtifactId, contractOffer); } catch (IOException e) { - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error(e.getMessage(), e); + } } return null; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java index 8f7b324d..26874fe3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java @@ -38,8 +38,10 @@ public ConnectorService(final ConfigModelService configModelService, // If no connector is found in the database, a default connector is created at this point. if (configModelRepository.findAll().get(0).getConfigurationModel().getConnectorDescription() == null) { - log.info("---- [ConnectorService] No connector description is found in the configuration model! Creating" - + " default connector description"); + if (log.isInfoEnabled()) { + log.info("---- [ConnectorService] No connector description is found in the configuration model! Creating" + + " default connector description"); + } final var connector = new BaseConnectorBuilder() ._inboundModelVersion_(new ArrayList<>(List.of("3.1.0"))) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java index 9eab8402..b28e1f01 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java @@ -56,7 +56,9 @@ public GenericEndpoint createGenericEndpoint(final URI accessURL, new BasicAuthenticationBuilder()._authUsername_(username)._authPassword_(password).build() ); } else { - log.info("---- [EndpointService createGenericEndpoint] No authentication was created because username and password were not entered."); + if (log.isInfoEnabled()) { + log.info("---- [EndpointService createGenericEndpoint] No authentication was created because username and password were not entered."); + } } final var customGenericEndpointObject = new CustomGenericEndpointObject(endpoint); @@ -81,9 +83,13 @@ public List getGenericEndpoints() { try { customGenericEndpointList = customGenericEndpointRepository.findAll().stream().findAny().get(); genericEndpoints = (ArrayList) customGenericEndpointList.getEndpoints(); - log.info("---- [EndpointService getGenericEndpoints] Generic endpoints found: " + genericEndpoints.size()); + if (log.isInfoEnabled()) { + log.info("---- [EndpointService getGenericEndpoints] Generic endpoints found: " + genericEndpoints.size()); + } } catch (NoSuchElementException e) { - log.info("---- [EndpointService getGenericEndpoints] No generic endpoints found!"); + if (log.isInfoEnabled()) { + log.info("---- [EndpointService getGenericEndpoints] No generic endpoints found!"); + } } return genericEndpoints; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/AbstractResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/AbstractResourceService.java index dbcfee4a..a86a5d46 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/AbstractResourceService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/AbstractResourceService.java @@ -61,7 +61,9 @@ public List getResources() { try { baseConnector = connectorClient.getSelfDeclaration(); } catch (IOException e) { - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error(e.getMessage(), e); + } } if (baseConnector != null && baseConnector.getResourceCatalog() != null) { for (final var resourceCatalog : baseConnector.getResourceCatalog()) { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java index 9221abb3..d9c22af3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java @@ -64,7 +64,9 @@ public void updateResourceContractInAppRoute(final URI resourceId, final ContractOffer contractOffer) { // Update resource representation in app route if (configModelService.getConfigModel().getAppRoute() == null) { - log.info("---- [ResourceContractService updateResourceContractInAppRoute] Could not find any app route"); + if (log.isInfoEnabled()) { + log.info("---- [ResourceContractService updateResourceContractInAppRoute] Could not find any app route"); + } } else { final ArrayList emptyList = new ArrayList<>(); for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { @@ -77,7 +79,9 @@ public void updateResourceContractInAppRoute(final URI resourceId, if (resourceId.equals(resource.getId())) { final var resourceImpl = (ResourceImpl) resource; resourceImpl.setContractOffer(Util.asList(contractOffer)); - log.info("---- [ResourceContractService updateResourceContractInSubroutes] Updated resource contract in the app route"); + if (log.isInfoEnabled()) { + log.info("---- [ResourceContractService updateResourceContractInSubroutes] Updated resource contract in the app route"); + } break; } } @@ -112,7 +116,9 @@ private void updateResourceContractInSubroutes(final RouteStep routeStep, if (resourceId.equals(resource.getId())) { final var resourceImpl = (ResourceImpl) resource; resourceImpl.setContractOffer(Util.asList(contractOffer)); - log.info("---- [ResourceContractService updateResourceContractInSubroutes] Updated resource contract in the subroute"); + if (log.isInfoEnabled()) { + log.info("---- [ResourceContractService updateResourceContractInSubroutes] Updated resource contract in the subroute"); + } break; } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java index 180be8a7..e7b62cb1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java @@ -68,8 +68,10 @@ public RepresentationImpl getResourceRepresentationInCatalog(final URI represent public void deleteResourceRepresentationFromAppRoute(final URI resourceId, final URI representationId) { if (configModelService.getConfigModel().getAppRoute() == null) { - log.info("---- [ResourceRepresentationService deleteResourceRepresentationFromAppRoute] Could not find" - + " any app route to delete the resource"); + if (log.isInfoEnabled()) { + log.info("---- [ResourceRepresentationService deleteResourceRepresentationFromAppRoute] Could not find" + + " any app route to delete the resource"); + } } else { final ArrayList emptyList = new ArrayList<>(); for (final var route : configModelService.getConfigModel().getAppRoute()) { @@ -196,7 +198,9 @@ public Resource getResourceInAppRoute(final URI resourceId) { for (final var resource : appRoute.getAppRouteOutput()) { if (resourceId.equals(resource.getId())) { foundResource = resource; - log.info("---- [ResourceRepresentationService getResourceInAppRoute] Resource is found in the app route"); + if (log.isInfoEnabled()) { + log.info("---- [ResourceRepresentationService getResourceInAppRoute] Resource is found in the app route"); + } break; } } @@ -209,8 +213,10 @@ public Resource getResourceInAppRoute(final URI resourceId) { } } if (foundResource == null) { - log.info("---- [ResourceRepresentationService getResourceInAppRoute] Could not find any resource" - + " in app routes and subroutes"); + if (log.isInfoEnabled()) { + log.info("---- [ResourceRepresentationService getResourceInAppRoute] Could not find any resource" + + " in app routes and subroutes"); + } } return foundResource; } @@ -232,7 +238,9 @@ private Resource getResourceInSubroutes(final RouteStep routeStep, for (final var resource : routeStep.getAppRouteOutput()) { if (resourceId.equals(resource.getId())) { foundResource = resource; - log.info("---- [ResourceRepresentationService getResourceInSubroutes] Resource is found in subroute"); + if (log.isInfoEnabled()) { + log.info("---- [ResourceRepresentationService getResourceInSubroutes] Resource is found in subroute"); + } break; } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java index 37b1ef0f..2cecdd74 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java @@ -121,7 +121,9 @@ public String getRequestedResourcesAsJsonString() { */ public void deleteResourceFromAppRoute(final URI resourceId) { if (configModelService.getConfigModel().getAppRoute() == null) { - log.info("---- [ResourceService deleteResourceFromAppRoute] Could not find any app route to delete the resource"); + if (log.isInfoEnabled()) { + log.info("---- [ResourceService deleteResourceFromAppRoute] Could not find any app route to delete the resource"); + } } else { final ArrayList emptyList = new ArrayList<>(); for (final var route : configModelService.getConfigModel().getAppRoute()) { @@ -212,7 +214,9 @@ public ResourceImpl updateResource(final URI resourceId, final String title, public void updateResourceInAppRoute(final ResourceImpl newResource) { // Update the resource in the app route if (configModelService.getConfigModel().getAppRoute() == null) { - log.info("---- [ResourceService updateResourceInAppRoute] Could not find any app route to update the resource"); + if (log.isInfoEnabled()) { + log.info("---- [ResourceService updateResourceInAppRoute] Could not find any app route to update the resource"); + } } else { final ArrayList emptyList = new ArrayList<>(); for (final var appRoute : configModelService.getConfigModel().getAppRoute()) { @@ -226,7 +230,9 @@ public void updateResourceInAppRoute(final ResourceImpl newResource) { (ArrayList) appRoute.getAppRouteOutput(); output.remove(resource); output.add(newResource); - log.info("---- [ResourceService updateResourceInAppRoute] Updated resource in app route"); + if (log.isInfoEnabled()) { + log.info("---- [ResourceService updateResourceInAppRoute] Updated resource in app route"); + } break; } } @@ -260,7 +266,9 @@ private void updateResourceInSubroutes(final RouteStep routeStep, (ArrayList) routeStep.getAppRouteOutput(); output.remove(resource); output.add(newResource); - log.info("---- [ResourceService updateResourceInAppRoute] Updated resource in subroute"); + if (log.isInfoEnabled()) { + log.info("---- [ResourceService updateResourceInAppRoute] Updated resource in subroute"); + } break; } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/AbstractDataspaceConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/AbstractDataspaceConnectorClient.java index ac489fea..abeb0281 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/AbstractDataspaceConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/AbstractDataspaceConnectorClient.java @@ -43,9 +43,10 @@ public AbstractDataspaceConnectorClient(final ResourceMapper dataSpaceConnectorR public void setProtocol(final @Value("${dataspace.communication.ssl}") String https) { protocol = Boolean.parseBoolean(https) ? "https" : "http"; connectorBaseUrl = protocol + "://" + dataSpaceConnectorHost + ":" + dataSpaceConnectorPort + "/"; - - log.info("---- [AbstractDataspaceConnectorClient extended by " + this.getClass().getSimpleName() + " setProtocol]" - + " Communication Protocol with DataspaceConnector is: " + protocol); + if (log.isInfoEnabled()) { + log.info("---- [AbstractDataspaceConnectorClient extended by " + this.getClass().getSimpleName() + " setProtocol]" + + " Communication Protocol with DataspaceConnector is: " + protocol); + } } @NotNull diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceBrokerClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceBrokerClient.java index 0d807d4b..5decf8f4 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceBrokerClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceBrokerClient.java @@ -53,10 +53,12 @@ public Response updateAtBroker(final String brokerURI) throws IOException { @Override public Response unregisterAtBroker(final String brokerURI) throws IOException { - log.info(String.format( - "---- [DataspaceBrokerClient unregisterAtBroker] unregistering connector %s at broker %s", - dataSpaceConnectorHost, - brokerURI)); + if (log.isInfoEnabled()) { + log.info(String.format( + "---- [DataspaceBrokerClient unregisterAtBroker] unregistering connector %s at broker %s", + dataSpaceConnectorHost, + brokerURI)); + } final var builder = getRequestBuilder(); builder.url(new HttpUrl.Builder() @@ -77,7 +79,9 @@ public Response unregisterAtBroker(final String brokerURI) throws IOException { @Override public Response updateResourceAtBroker(final String brokerUri, final URI resourceID) throws IOException { - log.info(String.format("---- [DataspaceBrokerClient updateResourceAtBroker] updating resource at Broker %s", brokerUri)); + if (log.isInfoEnabled()) { + log.info(String.format("---- [DataspaceBrokerClient updateResourceAtBroker] updating resource at Broker %s", brokerUri)); + } final var path = resourceID.getPath(); final var idStr = path.substring(path.lastIndexOf('/') + 1); @@ -98,7 +102,9 @@ public Response updateResourceAtBroker(final String brokerUri, final URI resourc final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceBrokerClient updateResourceAtBroker] Updating Resource at Broker failed!"); + if (log.isWarnEnabled()) { + log.warn("---- [DataspaceBrokerClient updateResourceAtBroker] Updating Resource at Broker failed!"); + } } return response; @@ -106,7 +112,9 @@ public Response updateResourceAtBroker(final String brokerUri, final URI resourc @Override public Response deleteResourceAtBroker(final String brokerUri, final URI resourceID) throws IOException { - log.info(String.format("---- [DataspaceBrokerClient deleteResourceAtBroker] Deleting resource %s at Broker %s", resourceID, brokerUri)); + if (log.isInfoEnabled()) { + log.info(String.format("---- [DataspaceBrokerClient deleteResourceAtBroker] Deleting resource %s at Broker %s", resourceID, brokerUri)); + } final var path = resourceID.getPath(); final var idStr = path.substring(path.lastIndexOf('/') + 1); @@ -126,7 +134,9 @@ public Response deleteResourceAtBroker(final String brokerUri, final URI resourc final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceBrokerClient deleteResourceAtBroker] Deleting Resource at Broker failed!"); + if (log.isWarnEnabled()) { + log.warn("---- [DataspaceBrokerClient deleteResourceAtBroker] Deleting Resource at Broker failed!"); + } } return response; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java index 30e6adda..99b72702 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java @@ -55,11 +55,13 @@ public ConfigurationModel getConfiguration() throws IOException { final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient getConfiguration] Could not get ConfigurationModel from {} with user {}. Response: {} - {}", - connectorUrl, - dataSpaceConnectorApiUsername, - response.code(), - response.message()); + if (log.isWarnEnabled()) { + log.warn("---- [DataspaceConnectorClient getConfiguration] Could not get ConfigurationModel from {} with user {}. Response: {} - {}", + connectorUrl, + dataSpaceConnectorApiUsername, + response.code(), + response.message()); + } } final var body = Objects.requireNonNull(response.body()).string(); @@ -68,8 +70,10 @@ public ConfigurationModel getConfiguration() throws IOException { try { configurationModel = SERIALIZER.deserialize(body, ConfigurationModel.class); } catch (IOException e) { - log.error("---- [DataspaceConnectorClient getConfiguration] SERIALIZER.deserialize threw IOException"); - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error("---- [DataspaceConnectorClient getConfiguration] SERIALIZER.deserialize threw IOException"); + log.error(e.getMessage(), e); + } } return configurationModel; @@ -89,7 +93,9 @@ public BaseConnector getSelfDeclaration() throws IOException { final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient getSelfDeclaration] Could not get BaseConnector"); + if (log.isWarnEnabled()) { + log.warn("---- [DataspaceConnectorClient getSelfDeclaration] Could not get BaseConnector"); + } } final var body = Objects.requireNonNull(response.body()).string(); @@ -98,8 +104,10 @@ public BaseConnector getSelfDeclaration() throws IOException { try { baseConnector = SERIALIZER.deserialize(body, BaseConnector.class); } catch (IOException e) { - log.error("---- [DataspaceConnectorClient getSelfDeclaration] SERIALIZER.deserialize threw IOException"); - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error("---- [DataspaceConnectorClient getSelfDeclaration] SERIALIZER.deserialize threw IOException"); + log.error(e.getMessage(), e); + } } return baseConnector; @@ -107,7 +115,9 @@ public BaseConnector getSelfDeclaration() throws IOException { @Override public boolean sendConfiguration(final String configurationModel) throws IOException { - log.info(String.format("---- [DataspaceConnectorClient sendConfiguration] sending new configuration to %s", dataSpaceConnectorHost)); + if (log.isInfoEnabled()) { + log.info(String.format("---- [DataspaceConnectorClient sendConfiguration] sending new configuration to %s", dataSpaceConnectorHost)); + } final var builder = getRequestBuilder(); builder.url(connectorBaseUrl + "admin/api/configuration"); @@ -122,7 +132,9 @@ public boolean sendConfiguration(final String configurationModel) throws IOExcep var success = true; if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient sendConfiguration] Updating ConfigurationModel failed!"); + if (log.isWarnEnabled()) { + log.warn("---- [DataspaceConnectorClient sendConfiguration] Updating ConfigurationModel failed!"); + } success = false; } @@ -149,12 +161,16 @@ public BaseConnector getBaseConnector(final String accessURL, final String resou dataSpaceConnectorApiPassword)); builder.post(RequestBody.create(new byte[0], null)); - log.info("---- [DataspaceConnectorClient getBaseConnector] " + url.toString()); + if (log.isInfoEnabled()) { + log.info("---- [DataspaceConnectorClient getBaseConnector] " + url.toString()); + } final var request = builder.build(); final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient getBaseConnector] Could not get BaseConnector Info!"); + if (log.isWarnEnabled()) { + log.warn("---- [DataspaceConnectorClient getBaseConnector] Could not get BaseConnector Info!"); + } } final var body = Objects.requireNonNull(response.body()).string(); @@ -162,8 +178,10 @@ public BaseConnector getBaseConnector(final String accessURL, final String resou try { baseConnector = SERIALIZER.deserialize(body, BaseConnector.class); } catch (IOException e) { - log.error("---- [DataspaceConnectorClient getBaseConnector] SERIALIZER.deserialize threw IOException"); - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error("---- [DataspaceConnectorClient getBaseConnector] SERIALIZER.deserialize threw IOException"); + log.error(e.getMessage(), e); + } } return baseConnector; @@ -171,7 +189,9 @@ public BaseConnector getBaseConnector(final String accessURL, final String resou @Override public String getPolicyPattern(final String policy) throws IOException { - log.info("---- [DataspaceConnectorClient getPolicyPattern] Get pattern for policy"); + if (log.isInfoEnabled()) { + log.info("---- [DataspaceConnectorClient getPolicyPattern] Get pattern for policy"); + } final var builder = getRequestBuilder(); builder.url(connectorBaseUrl + "/admin/api/example/policy-validation"); @@ -183,7 +203,9 @@ public String getPolicyPattern(final String policy) throws IOException { final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient getPolicyPattern] Pattern for policy could not be determined"); + if (log.isWarnEnabled()) { + log.warn("---- [DataspaceConnectorClient getPolicyPattern] Pattern for policy could not be determined"); + } } return Objects.requireNonNull(response.body()).string(); @@ -193,7 +215,9 @@ public String getPolicyPattern(final String policy) throws IOException { public String requestContractAgreement(final String recipientId, final String requestedArtifactId, final String contractOffer) throws IOException { - log.info("---- [DataspaceConnectorClient requestContractAgreement] Request contract agreement with recipient: {} and artifact: {}", recipientId, requestedArtifactId); + if (log.isInfoEnabled()) { + log.info("---- [DataspaceConnectorClient requestContractAgreement] Request contract agreement with recipient: {} and artifact: {}", recipientId, requestedArtifactId); + } final var builder = getRequestBuilder(); final var urlBuilder = new HttpUrl.Builder() @@ -218,7 +242,9 @@ public String requestContractAgreement(final String recipientId, final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient requestContractAgreement] Could not request contract agreement"); + if (log.isWarnEnabled()) { + log.warn("---- [DataspaceConnectorClient requestContractAgreement] Could not request contract agreement"); + } } return Objects.requireNonNull(response.body()).string(); @@ -230,9 +256,10 @@ public Response requestData(final String recipientId, final String contractId, final String key, final QueryInput queryInput) throws IOException { - - log.info("---- [DataspaceConnectorClient requestData] Request Data with recipient: {}, artifact: {}," - + " contract: {}, key: {} and queryInput: {} ", recipientId, requestedArtifactId, contractId, key, queryInput); + if (log.isInfoEnabled()) { + log.info("---- [DataspaceConnectorClient requestData] Request Data with recipient: {}, artifact: {}," + + " contract: {}, key: {} and queryInput: {} ", recipientId, requestedArtifactId, contractId, key, queryInput); + } final var builder = getRequestBuilder(); final var urlBuilder = new HttpUrl.Builder() @@ -263,7 +290,9 @@ public Response requestData(final String recipientId, final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceConnectorClient requestData] Could not request data"); + if (log.isWarnEnabled()) { + log.warn("---- [DataspaceConnectorClient requestData] Could not request data"); + } } return response; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java index e94b5a33..b1e81638 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java @@ -60,7 +60,9 @@ private JsonNode getJsonNodeOfBaseConnector() throws IOException { final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceResourceClient getJsonNodeOfBaseConnector] Could not get BaseConnector"); + if (log.isWarnEnabled()) { + log.warn("---- [DataspaceResourceClient getJsonNodeOfBaseConnector] Could not get BaseConnector"); + } } final var body = Objects.requireNonNull(response.body()).string(); @@ -89,7 +91,9 @@ public String getRequestedResource(final String accessURL, final String resource final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn(String.format("---- [DataspaceResourceClient getRequestedResource] Could not get BaseConnector from %s!", dataSpaceConnectorHost)); + if (log.isWarnEnabled()) { + log.warn(String.format("---- [DataspaceResourceClient getRequestedResource] Could not get BaseConnector from %s!", dataSpaceConnectorHost)); + } } return Objects.requireNonNull(response.body()).string(); @@ -97,12 +101,16 @@ public String getRequestedResource(final String accessURL, final String resource @Override public String registerResource(final Resource resource) throws IOException { - log.info("---- [DataspaceResourceClient registerResource] Registering resource..."); + if (log.isInfoEnabled()) { + log.info("---- [DataspaceResourceClient registerResource] Registering resource..."); + } final var mappedResource = dataSpaceConnectorResourceMapper.getMetadata(resource); final var resourceJsonLD = MAPPER.writeValueAsString(mappedResource); - log.info("---- [DataspaceResourceClient registerResource] New resource: " + resourceJsonLD); + if (log.isInfoEnabled()) { + log.info("---- [DataspaceResourceClient registerResource] New resource: " + resourceJsonLD); + } final var builder = getRequestBuilder(); final var path = resource.getId().getPath(); @@ -120,13 +128,17 @@ public String registerResource(final Resource resource) throws IOException { builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, dataSpaceConnectorApiPassword)); - log.info("---- [DataspaceResourceClient registerResource] " + url.toString()); + if (log.isInfoEnabled()) { + log.info("---- [DataspaceResourceClient registerResource] " + url.toString()); + } final var request = builder.build(); final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceResourceClient registerResource] Registering Resource failed!"); + if (log.isWarnEnabled()) { + log.warn("---- [DataspaceResourceClient registerResource] Registering Resource failed!"); + } } return Objects.requireNonNull(response.body()).string(); @@ -134,8 +146,10 @@ public String registerResource(final Resource resource) throws IOException { @Override public String deleteResource(final URI resourceID) throws IOException { - log.info(String.format("---- [DataspaceResourceClient deleteResource] deleting resource %s at %s", resourceID, - dataSpaceConnectorHost)); + if (log.isInfoEnabled()) { + log.info(String.format("---- [DataspaceResourceClient deleteResource] deleting resource %s at %s", resourceID, + dataSpaceConnectorHost)); + } final var path = resourceID.getPath(); final var idStr = path.substring(path.lastIndexOf('/') + 1); @@ -149,7 +163,9 @@ public String deleteResource(final URI resourceID) throws IOException { final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceResourceClient deleteResource] Deleting Resource failed!"); + if (log.isWarnEnabled()) { + log.warn("---- [DataspaceResourceClient deleteResource] Deleting Resource failed!"); + } } return Objects.requireNonNull(response.body()).string(); @@ -159,7 +175,9 @@ public String deleteResource(final URI resourceID) throws IOException { public String registerResourceRepresentation(final String resourceID, final Representation representation, final String endpointId) throws IOException { - log.info(String.format("---- [DataspaceResourceClient registerResourceRepresentation] Registering resource at %s", dataSpaceConnectorHost)); + if (log.isInfoEnabled()) { + log.info(String.format("---- [DataspaceResourceClient registerResourceRepresentation] Registering resource at %s", dataSpaceConnectorHost)); + } final var mappedRepresentation = dataSpaceConnectorResourceMapper.mapRepresentation(representation); final var backendSource = dataSpaceConnectorResourceMapper.createBackendSource(endpointId, representation); @@ -169,7 +187,9 @@ public String registerResourceRepresentation(final String resourceID, final var mappedRepresentationID = dataSpaceConnectorResourceMapper.readUUIDFromURI(representation.getId()); final var resourceJsonLD = MAPPER.writeValueAsString(mappedRepresentation); - log.info("---- [DataspaceResourceClient registerResourceRepresentation] Mapped representation: " + resourceJsonLD); + if (log.isInfoEnabled()) { + log.info("---- [DataspaceResourceClient registerResourceRepresentation] Mapped representation: " + resourceJsonLD); + } final var builder = getRequestBuilder(); builder.url(new HttpUrl.Builder() @@ -187,16 +207,22 @@ public String registerResourceRepresentation(final String resourceID, final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceResourceClient registerResourceRepresentation] Registering Representation failed!"); + if (log.isWarnEnabled()) { + log.warn("---- [DataspaceResourceClient registerResourceRepresentation] Registering Representation failed!"); + } } final var body = Objects.requireNonNull(response.body()).string(); final var uuid = dataSpaceConnectorResourceMapper.createFromResponse(body, representation.getId()); if (uuid == null) { - log.warn("---- [DataspaceResourceClient registerResourceRepresentation] Could not parse ID from response!"); + if (log.isWarnEnabled()) { + log.warn("---- [DataspaceResourceClient registerResourceRepresentation] Could not parse ID from response!"); + } } else { - log.info("---- [DataspaceResourceClient registerResourceRepresentation] UUID is : " + uuid); + if (log.isInfoEnabled()) { + log.info("---- [DataspaceResourceClient registerResourceRepresentation] UUID is : " + uuid); + } } return body; @@ -207,11 +233,13 @@ public String updateResourceRepresentation(final String resourceID, final String representationID, final Representation representation, final String endpointId) throws IOException { - log.info(String.format( - "---- [DataspaceResourceClient updateResourceRepresentation] Updating representation %s for resource %s at %s", - representationID, - resourceID, - dataSpaceConnectorHost)); + if (log.isInfoEnabled()) { + log.info(String.format( + "---- [DataspaceResourceClient updateResourceRepresentation] Updating representation %s for resource %s at %s", + representationID, + resourceID, + dataSpaceConnectorHost)); + } final var mappedResourceID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); final var mappedRepresentationID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(representationID)); @@ -222,7 +250,9 @@ public String updateResourceRepresentation(final String resourceID, final var resourceJsonLD = MAPPER.writeValueAsString(mappedRepresentation); - log.info("---- [DataspaceResourceClient updateResourceRepresentation] Mapped representation: " + resourceJsonLD); + if (log.isInfoEnabled()) { + log.info("---- [DataspaceResourceClient updateResourceRepresentation] Mapped representation: " + resourceJsonLD); + } final var builder = getRequestBuilder(); @@ -235,7 +265,9 @@ public String updateResourceRepresentation(final String resourceID, final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceResourceClient updateResourceRepresentation] Updating Representation failed!"); + if (log.isWarnEnabled()) { + log.warn("---- [DataspaceResourceClient updateResourceRepresentation] Updating Representation failed!"); + } } return Objects.requireNonNull(response.body()).string(); @@ -243,9 +275,11 @@ public String updateResourceRepresentation(final String resourceID, @Override public String updateResourceContract(final String resourceID, final String contract) throws IOException { - log.info(String.format( - "---- [DataspaceResourceClient updateResourceContract] updating contract for resource at %s", - dataSpaceConnectorHost)); + if (log.isInfoEnabled()) { + log.info(String.format( + "---- [DataspaceResourceClient updateResourceContract] updating contract for resource at %s", + dataSpaceConnectorHost)); + } final var mappedResourceID = dataSpaceConnectorResourceMapper.readUUIDFromURI(URI.create(resourceID)); @@ -259,7 +293,9 @@ public String updateResourceContract(final String resourceID, final String contr final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceResourceClient updateResourceContract] Updating contract failed!"); + if (log.isWarnEnabled()) { + log.warn("---- [DataspaceResourceClient updateResourceContract] Updating contract failed!"); + } } return Objects.requireNonNull(response.body()).string(); @@ -267,7 +303,9 @@ public String updateResourceContract(final String resourceID, final String contr @Override public Response updateResource(final URI resourceID, final Resource resource) throws IOException { - log.info(String.format("---- [DataspaceResourceClient updateResource] updating resource at %s", dataSpaceConnectorHost)); + if (log.isInfoEnabled()) { + log.info(String.format("---- [DataspaceResourceClient updateResource] updating resource at %s", dataSpaceConnectorHost)); + } final var mappedResource = dataSpaceConnectorResourceMapper.getMetadata(resource); final var path = resourceID.getPath(); @@ -293,7 +331,9 @@ public Response updateResource(final URI resourceID, final Resource resource) th backendSource.setUsername(source.get("username").asText()); backendSource.setPassword(source.get("password").asText()); } catch (Exception e) { - log.error(e.getMessage(), e); + if (log.isErrorEnabled()) { + log.error(e.getMessage(), e); + } } mappedResource.getRepresentations().get(0).setSource(backendSource); @@ -308,7 +348,9 @@ public Response updateResource(final URI resourceID, final Resource resource) th final var response = DispatchRequest.sendToDataspaceConnector(request); if (!response.isSuccessful()) { - log.warn("---- [DataspaceResourceClient updateResource] Updating Resource failed!"); + if (log.isWarnEnabled()) { + log.warn("---- [DataspaceResourceClient updateResource] Updating Resource failed!"); + } } return response; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/util/ValidateApiInput.java b/src/main/java/de/fraunhofer/isst/configmanager/util/ValidateApiInput.java index fe1c271c..80224a7e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/util/ValidateApiInput.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/util/ValidateApiInput.java @@ -9,14 +9,20 @@ @UtilityClass public class ValidateApiInput { public static boolean notValid(final String... parameter) { - log.info("---- [ValidateApiInput] Validating API Input ..."); + if (log.isInfoEnabled()) { + log.info("---- [ValidateApiInput] Validating API Input ..."); + } final var validationResult = Arrays.stream(parameter).dropWhile("undefined"::equals).count() == 0; if (validationResult) { - log.error("---- [ValidateApiInput] Validating API Input ... Input is NOT valid!"); + if (log.isErrorEnabled()) { + log.error("---- [ValidateApiInput] Validating API Input ... Input is NOT valid!"); + } } else { - log.info("---- [ValidateApiInput] Validating API Input ... Input is valid! "); + if (log.isInfoEnabled()) { + log.info("---- [ValidateApiInput] Validating API Input ... Input is valid! "); + } } return validationResult; diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml index 7ad44b4d..9d92222f 100644 --- a/src/main/resources/log4j2.xml +++ b/src/main/resources/log4j2.xml @@ -23,7 +23,7 @@ - + @@ -33,4 +33,4 @@ - \ No newline at end of file + From c6bf0a254349c8c8b011a8b4b21e862d42719e38 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Wed, 21 Apr 2021 17:00:36 +0200 Subject: [PATCH 093/157] refactor: small code refactorings --- pom.xml | 5 - .../ConfigmanagerApplication.java | 8 +- .../api/controller/AppController.java | 2 +- .../api/controller/AppRouteController.java | 2 +- .../api/controller/BrokerController.java | 2 +- .../api/controller/ConfigModelController.java | 2 +- .../api/controller/ConnectorController.java | 2 +- .../api/controller/EndpointController.java | 2 +- .../ResourceContractController.java | 2 +- .../api/controller/ResourceController.java | 2 +- .../ResourceRepresentationController.java | 3 +- .../resources/AbstractResourceService.java | 2 +- .../resources/ResourceContractService.java | 15 --- .../ResourceRepresentationService.java | 99 +------------------ .../clients/DataspaceBrokerClient.java | 14 +-- .../clients/DataspaceConnectorClient.java | 46 ++++----- .../clients/DataspaceResourceClient.java | 56 ++++------- .../endpointinfo/EndpointInformation.java | 2 +- 18 files changed, 60 insertions(+), 206 deletions(-) diff --git a/pom.xml b/pom.xml index 42541813..2a3aad95 100644 --- a/pom.xml +++ b/pom.xml @@ -231,11 +231,6 @@ maven-snapshots https://maven.iais.fraunhofer.de/artifactory/eis-ids-public - - - - - diff --git a/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java b/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java index 8386de00..a8d630dc 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java @@ -35,6 +35,7 @@ public static void main(final String[] args) { log.info("---- [ConfigmanagerApplication] Starting ConfigManager " + CURRENT_VERSION); log.info("---- [ConfigmanagerApplication] Used JVM charset (should be UTF-8): " + Charset.defaultCharset()); } + SpringApplication.run(ConfigmanagerApplication.class, args); } @@ -47,6 +48,7 @@ public static void main(final String[] args) { @Bean public OpenAPI customOpenAPI() throws IOException { final var properties = new Properties(); + try (InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("application.properties")) { // This function may crash (e.g. ill-formatted file). Let it bubble up. properties.load(inputStream); @@ -87,14 +89,14 @@ public Serializer getSerializer() { public ObjectMapper getObjectMapper() { final var objectMapper = new ObjectMapper(); final var ptv = BasicPolymorphicTypeValidator.builder().build(); + objectMapper.activateDefaultTyping(ptv); + return objectMapper; } - @Scheduled(fixedRate = 60_000) + @Scheduled(fixedRate = 60_000, initialDelay = 30_000) public void logInfoStillAlive() { - - System.gc(); final var mb = 1024L * 1024L; final var currentHeapSize = Runtime.getRuntime().totalMemory() / mb; final var maxHeapSize = Runtime.getRuntime().maxMemory() / mb; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppController.java index b2c25fef..90be9564 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppController.java @@ -17,8 +17,8 @@ @Slf4j @RestController @RequestMapping("/api/ui") -@Tag(name = "App Management", description = "Endpoints for managing the app in the configuration manager") @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) +@Tag(name = "App Management", description = "Endpoints for managing the app in the configuration manager") public class AppController implements AppApi { transient AppService appService; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java index b963b4f3..e00c7f09 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java @@ -35,8 +35,8 @@ @Slf4j @RestController @RequestMapping("/api/ui") -@Tag(name = "App Route Management", description = "Endpoints for managing the app routes in the configuration manager") @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) +@Tag(name = "App Route Management", description = "Endpoints for managing the app routes in the configuration manager") public class AppRouteController implements AppRouteApi { transient ConfigModelService configModelService; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java index 80ad434f..38a1922c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java @@ -30,8 +30,8 @@ @Slf4j @RestController @RequestMapping("/api/ui") -@Tag(name = "Broker Management", description = "Endpoints for managing the brokers in the configuration manager") @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) +@Tag(name = "Broker Management", description = "Endpoints for managing the brokers in the configuration manager") public class BrokerController implements BrokerApi { transient BrokerService brokerService; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java index e4d00c25..4b4d4388 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConfigModelController.java @@ -28,8 +28,8 @@ @Slf4j @RestController @RequestMapping("/api/ui") -@Tag(name = "Configmodel Management", description = "Endpoints for managing the configuration model") @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) +@Tag(name = "Configmodel Management", description = "Endpoints for managing the configuration model") public class ConfigModelController implements ConfigModelApi { transient Serializer serializer; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java index 73f02d34..21fe1e5f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorController.java @@ -31,8 +31,8 @@ @Slf4j @RestController @RequestMapping("/api/ui") -@Tag(name = "Connector Management", description = "Endpoints for managing the connectors in the configuration manager") @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) +@Tag(name = "Connector Management", description = "Endpoints for managing the connectors in the configuration manager") public class ConnectorController implements ConnectorApi { transient ConnectorService connectorService; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java index 9aec6373..0dc4cf6c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java @@ -31,8 +31,8 @@ @Slf4j @RestController @RequestMapping("/api/ui") -@Tag(name = "Endpoints Management", description = "Different endpoint types can be managed here") @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) +@Tag(name = "Endpoints Management", description = "Different endpoint types can be managed here") public class EndpointController implements EndpointApi { transient Serializer serializer; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java index 59ce1f06..020d2df8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java @@ -29,8 +29,8 @@ @Slf4j @RestController @RequestMapping("/api/ui") -@Tag(name = "Resource contracts Management", description = "Endpoints for managing the contracts of a resource") @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) +@Tag(name = "Resource contracts Management", description = "Endpoints for managing the contracts of a resource") public class ResourceContractController implements ResourceContractApi { transient ResourceContractService resourceContractService; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java index c2ad4fe8..9dd3cf71 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java @@ -31,8 +31,8 @@ @Slf4j @RestController @RequestMapping("/api/ui") -@Tag(name = "Resource Management", description = "Endpoints for managing the resource in the configuration manager") @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) +@Tag(name = "Resource Management", description = "Endpoints for managing the resource in the configuration manager") public class ResourceController implements ResourceApi { transient ResourceService resourceService; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java index f53976f4..a27d20ff 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java @@ -7,7 +7,6 @@ import de.fraunhofer.iais.eis.RepresentationBuilder; import de.fraunhofer.iais.eis.RepresentationImpl; import de.fraunhofer.iais.eis.ResourceImpl; -import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.api.ResourceRepresentationApi; import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; @@ -36,8 +35,8 @@ @Slf4j @RestController @RequestMapping("/api/ui") -@Tag(name = "Resource representation Management", description = "Endpoints for managing the representation of a resource") @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) +@Tag(name = "Resource representation Management", description = "Endpoints for managing the representation of a resource") public class ResourceRepresentationController implements ResourceRepresentationApi { transient ConfigModelService configModelService; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/AbstractResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/AbstractResourceService.java index a86a5d46..b16530a4 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/AbstractResourceService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/AbstractResourceService.java @@ -17,8 +17,8 @@ import java.util.List; @Slf4j -@FieldDefaults(level = AccessLevel.PROTECTED) @Service +@FieldDefaults(level = AccessLevel.PROTECTED) public abstract class AbstractResourceService { transient ConfigModelService configModelService; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java index d9c22af3..36376f17 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java @@ -39,21 +39,6 @@ public ResourceContractService(final ConfigModelService configModelService, this.resourceContractBuilder = resourceContractBuilder; } - /** - * This method returns from a resource the contract offer. - * - * @param resourceId id of the resource - * @return contract offer - */ - public ContractOffer getResourceContract(final URI resourceId) { - for (final var resource : getResources()) { - if (resourceId.equals(resource.getId()) && resource.getContractOffer().get(0) != null) { - return resource.getContractOffer().get(0); - } - } - return null; - } - /** * This method updates the resource contract with the given parameters. * diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java index e7b62cb1..3eb0f00f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java @@ -1,8 +1,6 @@ package de.fraunhofer.isst.configmanager.api.service.resources; import de.fraunhofer.iais.eis.AppRouteImpl; -import de.fraunhofer.iais.eis.DigitalContent; -import de.fraunhofer.iais.eis.RepresentationImpl; import de.fraunhofer.iais.eis.Resource; import de.fraunhofer.iais.eis.RouteStep; import de.fraunhofer.iais.eis.RouteStepImpl; @@ -21,7 +19,6 @@ import java.net.URI; import java.util.ArrayList; -import java.util.Collection; import java.util.List; @@ -47,94 +44,6 @@ public ResourceRepresentationService(final ConfigModelService configModelService this.endpointInformationRepository = endpointInformationRepository; } - /** - * @param representationId id of the representation - * @return representation implementation - */ - public RepresentationImpl getResourceRepresentationInCatalog(final URI representationId) { - return (RepresentationImpl) getResources() - .stream() - .map(DigitalContent::getRepresentation) - .flatMap(Collection::stream) - .filter(representation -> representation.getId().equals(representationId)) - .findAny() - .orElse(null); - } - - /** - * @param resourceId id of the resource - * @param representationId id of the representation to delete - */ - public void deleteResourceRepresentationFromAppRoute(final URI resourceId, - final URI representationId) { - if (configModelService.getConfigModel().getAppRoute() == null) { - if (log.isInfoEnabled()) { - log.info("---- [ResourceRepresentationService deleteResourceRepresentationFromAppRoute] Could not find" - + " any app route to delete the resource"); - } - } else { - final ArrayList emptyList = new ArrayList<>(); - for (final var route : configModelService.getConfigModel().getAppRoute()) { - if (route == null) { - continue; - } - if (route.getAppRouteOutput() != null) { - for (final var resource : route.getAppRouteOutput()) { - if (resource.getRepresentation() != null) { - resource.getRepresentation().removeIf(representation -> - representation.getId().equals(representationId) - ); - } - } - } - if (route.getHasSubRoute() == null) { - continue; - } - for (final var subRoute : route.getHasSubRoute()) { - deleteRepresentationFromSubRoutes(subRoute, emptyList, resourceId, - representationId); - } - } - } - configModelService.saveState(); - } - - /** - * Delete occurrence of a resource representation with resourceID and representationID from. - * all SubRoutes - * - * @param current current Node in AppRoute - * @param visited already visited AppRoutes - * @param resourceId ID of the Resource for which the representation should be deleted - * @param representationId ID of the Representation to delete - */ - private void deleteRepresentationFromSubRoutes(final RouteStep current, - final List visited, - final URI resourceId, - final URI representationId) { - if (current == null) { - return; - } - if (current.getAppRouteOutput() != null) { - for (final var resource : current.getAppRouteOutput()) { - if (resource.getRepresentation() != null) { - resource.getRepresentation().removeIf(representation -> - representation.getId().equals(representationId) - ); - } - } - } - if (current.getHasSubRoute() == null) { - return; - } - for (final var subRoute : current.getHasSubRoute()) { - if (!visited.contains(subRoute)) { - visited.add(current); - deleteFromSubRoutes(subRoute, visited, resourceId); - } - } - } - /** * This method updates a backend connection. * @@ -212,11 +121,9 @@ public Resource getResourceInAppRoute(final URI resourceId) { foundResource = getResourceInSubroutes(subRoute, emptyList, resourceId); } } - if (foundResource == null) { - if (log.isInfoEnabled()) { - log.info("---- [ResourceRepresentationService getResourceInAppRoute] Could not find any resource" - + " in app routes and subroutes"); - } + if (foundResource == null && log.isInfoEnabled()) { + log.info("---- [ResourceRepresentationService getResourceInAppRoute] Could not find any resource" + + " in app routes and subroutes"); } return foundResource; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceBrokerClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceBrokerClient.java index 5decf8f4..c496203e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceBrokerClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceBrokerClient.java @@ -19,8 +19,8 @@ @Slf4j @Service -@ConditionalOnExpression("${dataspace.connector.enabled:false}") @FieldDefaults(level = AccessLevel.PRIVATE) +@ConditionalOnExpression("${dataspace.connector.enabled:false}") public class DataspaceBrokerClient extends AbstractDataspaceConnectorClient implements DefaultBrokerClient { public DataspaceBrokerClient(final ResourceMapper dataSpaceConnectorResourceMapper) { @@ -101,10 +101,8 @@ public Response updateResourceAtBroker(final String brokerUri, final URI resourc final var request = builder.build(); final var response = DispatchRequest.sendToDataspaceConnector(request); - if (!response.isSuccessful()) { - if (log.isWarnEnabled()) { - log.warn("---- [DataspaceBrokerClient updateResourceAtBroker] Updating Resource at Broker failed!"); - } + if (!response.isSuccessful() && log.isWarnEnabled()) { + log.warn("---- [DataspaceBrokerClient updateResourceAtBroker] Updating Resource at Broker failed!"); } return response; @@ -133,10 +131,8 @@ public Response deleteResourceAtBroker(final String brokerUri, final URI resourc final var request = builder.build(); final var response = DispatchRequest.sendToDataspaceConnector(request); - if (!response.isSuccessful()) { - if (log.isWarnEnabled()) { - log.warn("---- [DataspaceBrokerClient deleteResourceAtBroker] Deleting Resource at Broker failed!"); - } + if (!response.isSuccessful() && log.isWarnEnabled()) { + log.warn("---- [DataspaceBrokerClient deleteResourceAtBroker] Deleting Resource at Broker failed!"); } return response; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java index 99b72702..a6bb3bda 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java @@ -24,8 +24,8 @@ */ @Slf4j @Service -@ConditionalOnExpression("${dataspace.connector.enabled:false}") @FieldDefaults(level = AccessLevel.PRIVATE) +@ConditionalOnExpression("${dataspace.connector.enabled:false}") public class DataspaceConnectorClient extends AbstractDataspaceConnectorClient implements DefaultConnectorClient { public DataspaceConnectorClient(final ResourceMapper dataSpaceConnectorResourceMapper) { @@ -54,14 +54,12 @@ public ConfigurationModel getConfiguration() throws IOException { final var request = builder.build(); final var response = DispatchRequest.sendToDataspaceConnector(request); - if (!response.isSuccessful()) { - if (log.isWarnEnabled()) { - log.warn("---- [DataspaceConnectorClient getConfiguration] Could not get ConfigurationModel from {} with user {}. Response: {} - {}", - connectorUrl, - dataSpaceConnectorApiUsername, - response.code(), - response.message()); - } + if (!response.isSuccessful() && log.isWarnEnabled()) { + log.warn("---- [DataspaceConnectorClient getConfiguration] Could not get ConfigurationModel from {} with user {}. Response: {} - {}", + connectorUrl, + dataSpaceConnectorApiUsername, + response.code(), + response.message()); } final var body = Objects.requireNonNull(response.body()).string(); @@ -92,10 +90,8 @@ public BaseConnector getSelfDeclaration() throws IOException { final var request = builder.build(); final var response = DispatchRequest.sendToDataspaceConnector(request); - if (!response.isSuccessful()) { - if (log.isWarnEnabled()) { - log.warn("---- [DataspaceConnectorClient getSelfDeclaration] Could not get BaseConnector"); - } + if (!response.isSuccessful() && log.isWarnEnabled()) { + log.warn("---- [DataspaceConnectorClient getSelfDeclaration] Could not get BaseConnector"); } final var body = Objects.requireNonNull(response.body()).string(); @@ -167,10 +163,8 @@ public BaseConnector getBaseConnector(final String accessURL, final String resou final var request = builder.build(); final var response = DispatchRequest.sendToDataspaceConnector(request); - if (!response.isSuccessful()) { - if (log.isWarnEnabled()) { - log.warn("---- [DataspaceConnectorClient getBaseConnector] Could not get BaseConnector Info!"); - } + if (!response.isSuccessful() && log.isWarnEnabled()) { + log.warn("---- [DataspaceConnectorClient getBaseConnector] Could not get BaseConnector Info!"); } final var body = Objects.requireNonNull(response.body()).string(); @@ -202,10 +196,8 @@ public String getPolicyPattern(final String policy) throws IOException { final var request = builder.build(); final var response = DispatchRequest.sendToDataspaceConnector(request); - if (!response.isSuccessful()) { - if (log.isWarnEnabled()) { - log.warn("---- [DataspaceConnectorClient getPolicyPattern] Pattern for policy could not be determined"); - } + if (!response.isSuccessful() && log.isWarnEnabled()) { + log.warn("---- [DataspaceConnectorClient getPolicyPattern] Pattern for policy could not be determined"); } return Objects.requireNonNull(response.body()).string(); @@ -241,10 +233,8 @@ public String requestContractAgreement(final String recipientId, final var request = builder.build(); final var response = DispatchRequest.sendToDataspaceConnector(request); - if (!response.isSuccessful()) { - if (log.isWarnEnabled()) { - log.warn("---- [DataspaceConnectorClient requestContractAgreement] Could not request contract agreement"); - } + if (!response.isSuccessful() && log.isWarnEnabled()) { + log.warn("---- [DataspaceConnectorClient requestContractAgreement] Could not request contract agreement"); } return Objects.requireNonNull(response.body()).string(); @@ -289,10 +279,8 @@ public Response requestData(final String recipientId, final var request = builder.build(); final var response = DispatchRequest.sendToDataspaceConnector(request); - if (!response.isSuccessful()) { - if (log.isWarnEnabled()) { - log.warn("---- [DataspaceConnectorClient requestData] Could not request data"); - } + if (!response.isSuccessful() && log.isWarnEnabled()) { + log.warn("---- [DataspaceConnectorClient requestData] Could not request data"); } return response; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java index b1e81638..282135c4 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java @@ -25,8 +25,8 @@ @Slf4j @Service -@ConditionalOnExpression("${dataspace.connector.enabled:false}") @FieldDefaults(level = AccessLevel.PRIVATE) +@ConditionalOnExpression("${dataspace.connector.enabled:false}") public class DataspaceResourceClient extends AbstractDataspaceConnectorClient implements DefaultResourceClient { public DataspaceResourceClient(final ResourceMapper dataSpaceConnectorResourceMapper) { @@ -59,10 +59,8 @@ private JsonNode getJsonNodeOfBaseConnector() throws IOException { final var request = builder.build(); final var response = DispatchRequest.sendToDataspaceConnector(request); - if (!response.isSuccessful()) { - if (log.isWarnEnabled()) { - log.warn("---- [DataspaceResourceClient getJsonNodeOfBaseConnector] Could not get BaseConnector"); - } + if (!response.isSuccessful() && log.isWarnEnabled()) { + log.warn("---- [DataspaceResourceClient getJsonNodeOfBaseConnector] Could not get BaseConnector"); } final var body = Objects.requireNonNull(response.body()).string(); @@ -90,10 +88,8 @@ public String getRequestedResource(final String accessURL, final String resource final var request = builder.build(); final var response = DispatchRequest.sendToDataspaceConnector(request); - if (!response.isSuccessful()) { - if (log.isWarnEnabled()) { - log.warn(String.format("---- [DataspaceResourceClient getRequestedResource] Could not get BaseConnector from %s!", dataSpaceConnectorHost)); - } + if (!response.isSuccessful() && log.isWarnEnabled()) { + log.warn(String.format("---- [DataspaceResourceClient getRequestedResource] Could not get BaseConnector from %s!", dataSpaceConnectorHost)); } return Objects.requireNonNull(response.body()).string(); @@ -135,10 +131,8 @@ public String registerResource(final Resource resource) throws IOException { final var request = builder.build(); final var response = DispatchRequest.sendToDataspaceConnector(request); - if (!response.isSuccessful()) { - if (log.isWarnEnabled()) { - log.warn("---- [DataspaceResourceClient registerResource] Registering Resource failed!"); - } + if (!response.isSuccessful() && log.isWarnEnabled()) { + log.warn("---- [DataspaceResourceClient registerResource] Registering Resource failed!"); } return Objects.requireNonNull(response.body()).string(); @@ -162,10 +156,8 @@ public String deleteResource(final URI resourceID) throws IOException { final var request = builder.build(); final var response = DispatchRequest.sendToDataspaceConnector(request); - if (!response.isSuccessful()) { - if (log.isWarnEnabled()) { - log.warn("---- [DataspaceResourceClient deleteResource] Deleting Resource failed!"); - } + if (!response.isSuccessful() && log.isWarnEnabled()) { + log.warn("---- [DataspaceResourceClient deleteResource] Deleting Resource failed!"); } return Objects.requireNonNull(response.body()).string(); @@ -215,14 +207,10 @@ public String registerResourceRepresentation(final String resourceID, final var body = Objects.requireNonNull(response.body()).string(); final var uuid = dataSpaceConnectorResourceMapper.createFromResponse(body, representation.getId()); - if (uuid == null) { - if (log.isWarnEnabled()) { - log.warn("---- [DataspaceResourceClient registerResourceRepresentation] Could not parse ID from response!"); - } - } else { - if (log.isInfoEnabled()) { - log.info("---- [DataspaceResourceClient registerResourceRepresentation] UUID is : " + uuid); - } + if (uuid == null && log.isWarnEnabled()) { + log.warn("---- [DataspaceResourceClient registerResourceRepresentation] Could not parse ID from response!"); + } else if (log.isInfoEnabled()) { + log.info("---- [DataspaceResourceClient registerResourceRepresentation] UUID is : " + uuid); } return body; @@ -264,10 +252,8 @@ public String updateResourceRepresentation(final String resourceID, final var request = builder.build(); final var response = DispatchRequest.sendToDataspaceConnector(request); - if (!response.isSuccessful()) { - if (log.isWarnEnabled()) { - log.warn("---- [DataspaceResourceClient updateResourceRepresentation] Updating Representation failed!"); - } + if (!response.isSuccessful() && log.isWarnEnabled()) { + log.warn("---- [DataspaceResourceClient updateResourceRepresentation] Updating Representation failed!"); } return Objects.requireNonNull(response.body()).string(); @@ -292,10 +278,8 @@ public String updateResourceContract(final String resourceID, final String contr final var request = builder.build(); final var response = DispatchRequest.sendToDataspaceConnector(request); - if (!response.isSuccessful()) { - if (log.isWarnEnabled()) { - log.warn("---- [DataspaceResourceClient updateResourceContract] Updating contract failed!"); - } + if (!response.isSuccessful() && log.isWarnEnabled()) { + log.warn("---- [DataspaceResourceClient updateResourceContract] Updating contract failed!"); } return Objects.requireNonNull(response.body()).string(); @@ -347,10 +331,8 @@ public Response updateResource(final URI resourceID, final Resource resource) th final var request = builder.build(); final var response = DispatchRequest.sendToDataspaceConnector(request); - if (!response.isSuccessful()) { - if (log.isWarnEnabled()) { - log.warn("---- [DataspaceResourceClient updateResource] Updating Resource failed!"); - } + if (!response.isSuccessful() && log.isWarnEnabled()) { + log.warn("---- [DataspaceResourceClient updateResource] Updating Resource failed!"); } return response; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/endpointinfo/EndpointInformation.java b/src/main/java/de/fraunhofer/isst/configmanager/model/endpointinfo/EndpointInformation.java index 47dd3854..ac34e477 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/endpointinfo/EndpointInformation.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/endpointinfo/EndpointInformation.java @@ -12,8 +12,8 @@ /** * Entity class for persisting the endpoint with the coordinates. */ -@Entity @Data +@Entity @FieldDefaults(level = AccessLevel.PRIVATE) public class EndpointInformation { @Id From 3c7a0e66ba1759e3bc48ff1c9054ec8ff569c0a5 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Wed, 21 Apr 2021 17:21:10 +0200 Subject: [PATCH 094/157] refactor: remove ResourceIDPair functionality (not needed) --- .../clients/DataspaceResourceClient.java | 17 ++-------- .../model/ResourceIDPair.java | 30 ----------------- .../model/repos/ResourceIDPairRepository.java | 23 ------------- .../model/repos/package-info.java | 11 ------- .../util/ResourceMapper.java | 33 +------------------ 5 files changed, 4 insertions(+), 110 deletions(-) delete mode 100644 src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/ResourceIDPair.java delete mode 100644 src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/repos/ResourceIDPairRepository.java delete mode 100644 src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/repos/package-info.java diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java index 282135c4..db32020a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java @@ -198,22 +198,11 @@ public String registerResourceRepresentation(final String resourceID, final var request = builder.build(); final var response = DispatchRequest.sendToDataspaceConnector(request); - if (!response.isSuccessful()) { - if (log.isWarnEnabled()) { - log.warn("---- [DataspaceResourceClient registerResourceRepresentation] Registering Representation failed!"); - } - } - - final var body = Objects.requireNonNull(response.body()).string(); - final var uuid = dataSpaceConnectorResourceMapper.createFromResponse(body, representation.getId()); - - if (uuid == null && log.isWarnEnabled()) { - log.warn("---- [DataspaceResourceClient registerResourceRepresentation] Could not parse ID from response!"); - } else if (log.isInfoEnabled()) { - log.info("---- [DataspaceResourceClient registerResourceRepresentation] UUID is : " + uuid); + if (!response.isSuccessful() && log.isWarnEnabled()) { + log.warn("---- [DataspaceResourceClient registerResourceRepresentation] Registering Representation failed!"); } - return body; + return Objects.requireNonNull(response.body()).string(); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/ResourceIDPair.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/ResourceIDPair.java deleted file mode 100644 index 74fd697e..00000000 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/ResourceIDPair.java +++ /dev/null @@ -1,30 +0,0 @@ -package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model; - -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.experimental.FieldDefaults; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import java.net.URI; -import java.util.UUID; - -/** - * The class helps to store the resource uri and the uuid in the object. This is needed because - * the implementation refers to the dataspace connector and there the uuid is used for the unique identification. - */ -@Getter -@Entity -@NoArgsConstructor -@AllArgsConstructor -@FieldDefaults(level = AccessLevel.PRIVATE) -public class ResourceIDPair { - @Id - UUID uuid; - - @Column(unique = true) - URI uri; -} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/repos/ResourceIDPairRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/repos/ResourceIDPairRepository.java deleted file mode 100644 index b90f4206..00000000 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/repos/ResourceIDPairRepository.java +++ /dev/null @@ -1,23 +0,0 @@ -package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.repos; - -import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.ResourceIDPair; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.net.URI; -import java.util.List; -import java.util.UUID; - -/** - * This repo persists an ResourceIDPair object internally in the H2 database, which helps to - * store the resource once - * with the uri and once with the uuid. - */ -public interface ResourceIDPairRepository extends JpaRepository { - - /** - * @param uri of the resource - * @return list of ResourceIDPair objects - */ - List findByUri(URI uri); - -} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/repos/package-info.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/repos/package-info.java deleted file mode 100644 index 2172a359..00000000 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/model/repos/package-info.java +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Interfaces of the required model classes of the Dataspace Connector data storage. - *

- * This package contains interface classes of the Dataspace Connector data management schemes. - *

- * - * @version 7.0.0 (last changed at version) - * @since 7.0.0 (documented since) - * @author IDS-ConfigurationManager Contributors - */ -package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.repos; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java index 1842dfcb..d66d2d56 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java @@ -10,10 +10,8 @@ import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.isst.configmanager.api.service.EndpointService; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.BackendSource; -import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.ResourceIDPair; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.ResourceMetadata; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.ResourceRepresentation; -import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.repos.ResourceIDPairRepository; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import org.springframework.stereotype.Service; @@ -23,7 +21,6 @@ import java.net.URI; import java.util.List; import java.util.UUID; -import java.util.regex.Pattern; import java.util.stream.Collectors; /** @@ -36,14 +33,10 @@ public class ResourceMapper { static Serializer serializer = new Serializer(); - static Pattern uuidRegex = Pattern.compile("[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}"); transient EndpointService endpointService; - transient ResourceIDPairRepository resourceIDPairRepository; - public ResourceMapper(final ResourceIDPairRepository resourceIDPairRepository, - final EndpointService endpointService) { - this.resourceIDPairRepository = resourceIDPairRepository; + public ResourceMapper(final EndpointService endpointService) { this.endpointService = endpointService; } @@ -61,30 +54,6 @@ public UUID readUUIDFromURI(final URI id) { return UUID.fromString(idStr); } - /** - * This method takes the response from the connector and generates a ResourceIDPair, which - * holds the uri and the uuid. This is be persisted in the database and finally the method returns the - * extracted uuid from the response. - * - * @param response of the connector - * @param id of the resource - * @return uuid - */ - public UUID createFromResponse(final String response, final URI id) { - final var matcher = uuidRegex.matcher(response); - UUID uuid = null; - - if (matcher.find()) { - final var uuidString = matcher.group(0); - uuid = UUID.fromString(uuidString); - - final var pair = new ResourceIDPair(uuid, id); - resourceIDPairRepository.saveAndFlush(pair); - } - - return uuid; - } - /** * The method helps to map resource metadata from the information model to resource metadata * from the dataspace connector. From 1a7387ccd6db6afab5c80e4902db69a2ca199dc1 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Thu, 22 Apr 2021 09:19:29 +0200 Subject: [PATCH 095/157] build: pom dependency maintenance --- CHANGELOG.md | 9 +++++ pom.xml | 102 ++++++++++++++++++++++++++------------------------- 2 files changed, 62 insertions(+), 49 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b13c3843..50542038 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,15 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Patch Change: A percent sign within URLs in the UI no longer results in an error in the CM-Backend. - Patch Change: Refactored Swagger-UI API Documentation, added all actually possible return-status-codes for API calls +### Dependency Maintenance +- Add: org.apache.logging.log4j:log4j-web 2.14.1 (Apache 2.0) +- Upgrade: org.springframework.boot:spring-boot-starter-parent 2.4.2 -> 2.4.5 +- Upgrade: org.springframework.security:spring-security-test 5.4.2 -> 5.4.6 +- Upgrade: org.projectlombok:lombok 1.18.18 -> 1.18.20 +- Upgrade: junit:junit 4.13.1 -> 4.13.2 +- Exclude: com.vaadin.external.google:android-json from org.springframework.boot:spring-boot-starter-test +- Remove: io.jsonwebtoken:jjwt 0.9.1 + ### Miscellaneous - Added custom banner at application startup instead of default banner - Disabled Swagger Petstore default playground diff --git a/pom.xml b/pom.xml index 2a3aad95..171379d9 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ org.springframework.boot spring-boot-starter-parent - 2.4.2 + 2.4.5 @@ -38,11 +38,20 @@ - + org.springframework.boot - spring-boot-starter-data-jpa + spring-boot-devtools + runtime + true + + + + + + org.springframework.boot + spring-boot-starter-security org.springframework.boot @@ -51,11 +60,11 @@ - + org.springframework.boot - spring-boot-starter-data-rest + spring-boot-starter-data-jpa org.springframework.boot @@ -64,11 +73,11 @@ - + org.springframework.boot - spring-boot-starter-security + spring-boot-starter-web org.springframework.boot @@ -77,11 +86,11 @@ - + org.springframework.boot - spring-boot-starter-web + spring-boot-starter-data-rest org.springframework.boot @@ -89,26 +98,28 @@ - - org.springframework.boot - spring-boot-starter-log4j2 - - + org.springframework.boot - spring-boot-devtools - runtime + spring-boot-configuration-processor true - + org.springframework.boot - spring-boot-configuration-processor - true + spring-boot-starter-log4j2 + + + + + + org.json + json + 20210307 @@ -126,6 +137,10 @@ org.springframework.boot spring-boot-starter-logging + + com.vaadin.external.google + android-json + @@ -134,10 +149,18 @@ org.springframework.security spring-security-test - 5.4.2 + 5.4.6 test + + + + org.springdoc + springdoc-openapi-ui + 1.5.7 + + @@ -152,35 +175,19 @@ org.projectlombok lombok - 1.18.18 + 1.18.20 true - - - - org.springdoc - springdoc-openapi-ui - 1.5.7 - - junit junit - 4.13.1 + 4.13.2 test - - - - io.jsonwebtoken - jjwt - 0.9.1 - - @@ -189,6 +196,14 @@ 4.9.1 + + + + org.apache.logging.log4j + log4j-web + 2.14.1 + + de.fraunhofer.iais.eis.ids.infomodel @@ -202,16 +217,6 @@ 4.0.2 - - - - - org.json - json - 20210307 - - - de.fraunhofer.iais.eis.ids infomodel-serializer @@ -249,5 +254,4 @@ https://maven.pkg.github.com/International-Data-Spaces-Association/IDS-ConfigurationManager - From ccb8f7a39aed23adad4de10ece968eee28329eff Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Thu, 22 Apr 2021 09:59:10 +0200 Subject: [PATCH 096/157] refactor: UtilService - remove @NotNull annotation (return can not be null) --- .../isst/configmanager/api/service/UtilService.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java index 5d95acaa..0e41b92c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java @@ -10,7 +10,6 @@ import lombok.extern.slf4j.Slf4j; import net.minidev.json.JSONArray; import net.minidev.json.JSONObject; -import org.jetbrains.annotations.NotNull; import org.json.JSONException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -52,7 +51,6 @@ public String getSpecificEnum(final String enumName) { return sortedJsonArray.toJSONString(); } - @NotNull private JSONArray getBrokerStatus() { JSONArray sortedJsonArray; @@ -69,7 +67,6 @@ private JSONArray getBrokerStatus() { return sortedJsonArray; } - @NotNull private JSONArray getDeployMethod() { JSONArray sortedJsonArray; @@ -86,7 +83,6 @@ private JSONArray getDeployMethod() { return sortedJsonArray; } - @NotNull private JSONArray getSourceType() { JSONArray sortedJsonArray; @@ -103,7 +99,6 @@ private JSONArray getSourceType() { return sortedJsonArray; } - @NotNull private JSONArray getLanguage() { JSONArray sortedJsonArray; @@ -127,7 +122,6 @@ private JSONArray getLanguage() { return sortedJsonArray; } - @NotNull private JSONArray getConnectorDeployMode() { JSONArray sortedJsonArray; @@ -145,7 +139,6 @@ private JSONArray getConnectorDeployMode() { return sortedJsonArray; } - @NotNull private JSONArray getConnectorStatus() { JSONArray sortedJsonArray; @@ -163,7 +156,6 @@ private JSONArray getConnectorStatus() { return sortedJsonArray; } - @NotNull private JSONArray getLogLevel() { JSONArray sortedJsonArray; From 00f3eefc236efccf97a58a37d3e7829db7c48c68 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Thu, 22 Apr 2021 10:26:19 +0200 Subject: [PATCH 097/157] refactor: model-package structure (configmodellists -> repositories) --- .../configmanager/api/controller/AppRouteController.java | 2 +- .../isst/configmanager/api/service/AppRouteService.java | 6 +++--- .../isst/configmanager/api/service/AppService.java | 2 +- .../isst/configmanager/api/service/BrokerService.java | 2 +- .../isst/configmanager/api/service/ConfigModelService.java | 2 +- .../isst/configmanager/api/service/ConnectorService.java | 2 +- .../isst/configmanager/api/service/EndpointService.java | 4 ++-- .../service/resources/ResourceRepresentationService.java | 2 +- .../CustomGenericEndpointList.java | 2 +- .../ConfigModelRepository.java | 2 +- .../{configlists => repositories}/CustomAppRepository.java | 2 +- .../CustomBrokerRepository.java | 2 +- .../CustomGenericEndpointRepository.java | 3 ++- .../EndpointInformationRepository.java | 2 +- .../RouteDeployMethodRepository.java | 2 +- .../model/{configlists => repositories}/package-info.java | 2 +- 16 files changed, 20 insertions(+), 19 deletions(-) rename src/main/java/de/fraunhofer/isst/configmanager/model/{configlists => customgenericendpoint}/CustomGenericEndpointList.java (94%) rename src/main/java/de/fraunhofer/isst/configmanager/model/{configlists => repositories}/ConfigModelRepository.java (82%) rename src/main/java/de/fraunhofer/isst/configmanager/model/{configlists => repositories}/CustomAppRepository.java (81%) rename src/main/java/de/fraunhofer/isst/configmanager/model/{configlists => repositories}/CustomBrokerRepository.java (81%) rename src/main/java/de/fraunhofer/isst/configmanager/model/{configlists => repositories}/CustomGenericEndpointRepository.java (65%) rename src/main/java/de/fraunhofer/isst/configmanager/model/{configlists => repositories}/EndpointInformationRepository.java (83%) rename src/main/java/de/fraunhofer/isst/configmanager/model/{configlists => repositories}/RouteDeployMethodRepository.java (83%) rename src/main/java/de/fraunhofer/isst/configmanager/model/{configlists => repositories}/package-info.java (80%) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java index e00c7f09..17a4bcd3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java @@ -9,7 +9,7 @@ import de.fraunhofer.isst.configmanager.api.AppRouteApi; import de.fraunhofer.isst.configmanager.api.service.AppRouteService; import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; -import de.fraunhofer.isst.configmanager.model.configlists.RouteDeployMethodRepository; +import de.fraunhofer.isst.configmanager.model.repositories.RouteDeployMethodRepository; import de.fraunhofer.isst.configmanager.model.routedeploymethod.DeployMethod; import de.fraunhofer.isst.configmanager.model.routedeploymethod.RouteDeployMethod; import de.fraunhofer.isst.configmanager.util.Utility; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java index 823cff97..41f12a7b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java @@ -12,9 +12,9 @@ import de.fraunhofer.iais.eis.RouteStepBuilder; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.api.service.resources.ResourceService; -import de.fraunhofer.isst.configmanager.model.configlists.CustomAppRepository; -import de.fraunhofer.isst.configmanager.model.configlists.EndpointInformationRepository; -import de.fraunhofer.isst.configmanager.model.configlists.RouteDeployMethodRepository; +import de.fraunhofer.isst.configmanager.model.repositories.CustomAppRepository; +import de.fraunhofer.isst.configmanager.model.repositories.EndpointInformationRepository; +import de.fraunhofer.isst.configmanager.model.repositories.RouteDeployMethodRepository; import de.fraunhofer.isst.configmanager.model.customapp.CustomApp; import de.fraunhofer.isst.configmanager.model.endpointinfo.EndpointInformation; import lombok.AccessLevel; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java index afd9ab63..7bc6150f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java @@ -2,7 +2,7 @@ import de.fraunhofer.iais.eis.AppEndpointType; import de.fraunhofer.iais.eis.Language; -import de.fraunhofer.isst.configmanager.model.configlists.CustomAppRepository; +import de.fraunhofer.isst.configmanager.model.repositories.CustomAppRepository; import de.fraunhofer.isst.configmanager.model.customapp.CustomApp; import de.fraunhofer.isst.configmanager.model.customapp.CustomAppEndpoint; import de.fraunhofer.isst.configmanager.util.Utility; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java index 1e2ae5b1..4f5a7712 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java @@ -4,7 +4,7 @@ import de.fraunhofer.isst.configmanager.api.service.resources.ResourceService; import de.fraunhofer.isst.configmanager.model.config.BrokerStatus; import de.fraunhofer.isst.configmanager.model.config.CustomBroker; -import de.fraunhofer.isst.configmanager.model.configlists.CustomBrokerRepository; +import de.fraunhofer.isst.configmanager.model.repositories.CustomBrokerRepository; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java index 633c398f..50488840 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java @@ -14,7 +14,7 @@ import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; import de.fraunhofer.isst.configmanager.model.config.ConfigModelObject; -import de.fraunhofer.isst.configmanager.model.configlists.ConfigModelRepository; +import de.fraunhofer.isst.configmanager.model.repositories.ConfigModelRepository; import lombok.AccessLevel; import lombok.Getter; import lombok.experimental.FieldDefaults; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java index 26874fe3..b343fe52 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java @@ -7,7 +7,7 @@ import de.fraunhofer.iais.eis.SecurityProfile; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; -import de.fraunhofer.isst.configmanager.model.configlists.ConfigModelRepository; +import de.fraunhofer.isst.configmanager.model.repositories.ConfigModelRepository; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java index b28e1f01..1c0a4aac 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java @@ -5,8 +5,8 @@ import de.fraunhofer.iais.eis.GenericEndpoint; import de.fraunhofer.iais.eis.GenericEndpointBuilder; import de.fraunhofer.iais.eis.GenericEndpointImpl; -import de.fraunhofer.isst.configmanager.model.configlists.CustomGenericEndpointList; -import de.fraunhofer.isst.configmanager.model.configlists.CustomGenericEndpointRepository; +import de.fraunhofer.isst.configmanager.model.customgenericendpoint.CustomGenericEndpointList; +import de.fraunhofer.isst.configmanager.model.repositories.CustomGenericEndpointRepository; import de.fraunhofer.isst.configmanager.model.customgenericendpoint.CustomGenericEndpointObject; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java index 3eb0f00f..e56b115a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java @@ -8,7 +8,7 @@ import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; import de.fraunhofer.isst.configmanager.api.service.EndpointService; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.model.configlists.EndpointInformationRepository; +import de.fraunhofer.isst.configmanager.model.repositories.EndpointInformationRepository; import de.fraunhofer.isst.configmanager.model.endpointinfo.EndpointInformation; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java b/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/CustomGenericEndpointList.java similarity index 94% rename from src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java rename to src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/CustomGenericEndpointList.java index 8babab38..9089ddac 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointList.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/CustomGenericEndpointList.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.model.configlists; +package de.fraunhofer.isst.configmanager.model.customgenericendpoint; import de.fraunhofer.iais.eis.Endpoint; import de.fraunhofer.isst.configmanager.model.customgenericendpoint.CustomGenericEndpointObject; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/ConfigModelRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/ConfigModelRepository.java similarity index 82% rename from src/main/java/de/fraunhofer/isst/configmanager/model/configlists/ConfigModelRepository.java rename to src/main/java/de/fraunhofer/isst/configmanager/model/repositories/ConfigModelRepository.java index afcf913f..118ee28e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/ConfigModelRepository.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/ConfigModelRepository.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.model.configlists; +package de.fraunhofer.isst.configmanager.model.repositories; import de.fraunhofer.isst.configmanager.model.config.ConfigModelObject; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomAppRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/CustomAppRepository.java similarity index 81% rename from src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomAppRepository.java rename to src/main/java/de/fraunhofer/isst/configmanager/model/repositories/CustomAppRepository.java index 1ac9ab7b..dcc59381 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomAppRepository.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/CustomAppRepository.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.model.configlists; +package de.fraunhofer.isst.configmanager.model.repositories; import de.fraunhofer.isst.configmanager.model.customapp.CustomApp; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomBrokerRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/CustomBrokerRepository.java similarity index 81% rename from src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomBrokerRepository.java rename to src/main/java/de/fraunhofer/isst/configmanager/model/repositories/CustomBrokerRepository.java index 0bfd39ac..63c195f0 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomBrokerRepository.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/CustomBrokerRepository.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.model.configlists; +package de.fraunhofer.isst.configmanager.model.repositories; import de.fraunhofer.isst.configmanager.model.config.CustomBroker; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/CustomGenericEndpointRepository.java similarity index 65% rename from src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointRepository.java rename to src/main/java/de/fraunhofer/isst/configmanager/model/repositories/CustomGenericEndpointRepository.java index 01aeadbc..b183d368 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/CustomGenericEndpointRepository.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/CustomGenericEndpointRepository.java @@ -1,5 +1,6 @@ -package de.fraunhofer.isst.configmanager.model.configlists; +package de.fraunhofer.isst.configmanager.model.repositories; +import de.fraunhofer.isst.configmanager.model.customgenericendpoint.CustomGenericEndpointList; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/EndpointInformationRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/EndpointInformationRepository.java similarity index 83% rename from src/main/java/de/fraunhofer/isst/configmanager/model/configlists/EndpointInformationRepository.java rename to src/main/java/de/fraunhofer/isst/configmanager/model/repositories/EndpointInformationRepository.java index 372be07a..4818daa9 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/EndpointInformationRepository.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/EndpointInformationRepository.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.model.configlists; +package de.fraunhofer.isst.configmanager.model.repositories; import de.fraunhofer.isst.configmanager.model.endpointinfo.EndpointInformation; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/RouteDeployMethodRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/RouteDeployMethodRepository.java similarity index 83% rename from src/main/java/de/fraunhofer/isst/configmanager/model/configlists/RouteDeployMethodRepository.java rename to src/main/java/de/fraunhofer/isst/configmanager/model/repositories/RouteDeployMethodRepository.java index 17196639..d7a7848a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/RouteDeployMethodRepository.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/RouteDeployMethodRepository.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.model.configlists; +package de.fraunhofer.isst.configmanager.model.repositories; import de.fraunhofer.isst.configmanager.model.routedeploymethod.RouteDeployMethod; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/package-info.java b/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/package-info.java similarity index 80% rename from src/main/java/de/fraunhofer/isst/configmanager/model/configlists/package-info.java rename to src/main/java/de/fraunhofer/isst/configmanager/model/repositories/package-info.java index 7e0bbae4..562a4b1c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/configlists/package-info.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/package-info.java @@ -8,4 +8,4 @@ * @since 7.0.0 (documented since) * @author IDS-ConfigurationManager Contributors */ -package de.fraunhofer.isst.configmanager.model.configlists; +package de.fraunhofer.isst.configmanager.model.repositories; From e42912fc8e08f2739670618ac26acb483253ff97 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Thu, 22 Apr 2021 10:51:22 +0200 Subject: [PATCH 098/157] refactor: refactor data model architecture structure --- CHANGELOG.md | 1 + .../isst/configmanager/api/AppRouteApi.java | 4 +-- .../api/ConnectorRequestApi.java | 2 +- .../api/ResourceContractApi.java | 4 +-- .../api/controller/AppRouteController.java | 27 +++++++++---------- .../api/controller/BrokerController.java | 6 ++--- .../ConnectorRequestController.java | 2 +- .../ResourceContractController.java | 10 +++---- .../api/service/AppRouteService.java | 14 +++++----- .../configmanager/api/service/AppService.java | 6 ++--- .../api/service/BrokerService.java | 20 +++++++------- .../api/service/ConfigModelService.java | 4 +-- .../api/service/ConnectorRequestService.java | 2 +- .../api/service/ConnectorService.java | 2 +- .../api/service/EndpointService.java | 6 ++--- .../api/service/UtilService.java | 8 +++--- .../resources/ResourceContractService.java | 8 +++--- .../ResourceRepresentationService.java | 4 +-- .../clients/DefaultConnectorClient.java | 2 +- .../clients/DataspaceConnectorClient.java | 2 +- .../entities}/ConfigModelObject.java | 4 +-- .../entities}/CustomApp.java | 2 +- .../entities}/CustomAppEndpoint.java | 4 +-- .../entities}/CustomBroker.java | 5 ++-- .../entities}/CustomGenericEndpointList.java | 3 +-- .../CustomGenericEndpointObject.java | 3 ++- .../entities}/EndpointInformation.java | 2 +- .../entities}/RouteDeployMethod.java | 4 +-- .../data/entities/package-info.java | 11 ++++++++ .../data/enums/BrokerRegistrationStatus.java | 9 +++++++ .../enums/RouteDeployMethod.java} | 4 +-- .../enums/UsagePolicyName.java} | 6 ++--- .../repositories/ConfigModelRepository.java | 4 +-- .../repositories/CustomAppRepository.java | 4 +-- .../repositories/CustomBrokerRepository.java | 4 +-- .../CustomGenericEndpointRepository.java | 4 +-- .../EndpointInformationRepository.java | 4 +-- .../RouteDeployMethodRepository.java | 4 +-- .../repositories/package-info.java | 2 +- .../util}/BackendConfig.java | 3 +-- .../util}/ConfigModelConverter.java | 2 +- .../util}/EndpointConverter.java | 2 +- .../config => data/util}/QueryInput.java | 2 +- .../model/config/BrokerStatus.java | 9 ------- .../configmanager/model/package-info.java | 8 ------ .../api_test/BrokerUIAPITest.java | 2 +- .../isst/configmanager/util/TestUtil.java | 2 +- 47 files changed, 125 insertions(+), 122 deletions(-) rename src/main/java/de/fraunhofer/isst/configmanager/{model/config => data/entities}/ConfigModelObject.java (87%) rename src/main/java/de/fraunhofer/isst/configmanager/{model/customapp => data/entities}/CustomApp.java (91%) rename src/main/java/de/fraunhofer/isst/configmanager/{model/customapp => data/entities}/CustomAppEndpoint.java (76%) rename src/main/java/de/fraunhofer/isst/configmanager/{model/config => data/entities}/CustomBroker.java (81%) rename src/main/java/de/fraunhofer/isst/configmanager/{model/customgenericendpoint => data/entities}/CustomGenericEndpointList.java (87%) rename src/main/java/de/fraunhofer/isst/configmanager/{model/customgenericendpoint => data/entities}/CustomGenericEndpointObject.java (80%) rename src/main/java/de/fraunhofer/isst/configmanager/{model/endpointinfo => data/entities}/EndpointInformation.java (93%) rename src/main/java/de/fraunhofer/isst/configmanager/{model/routedeploymethod => data/entities}/RouteDeployMethod.java (79%) create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/data/entities/package-info.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/data/enums/BrokerRegistrationStatus.java rename src/main/java/de/fraunhofer/isst/configmanager/{model/routedeploymethod/DeployMethod.java => data/enums/RouteDeployMethod.java} (52%) rename src/main/java/de/fraunhofer/isst/configmanager/{model/usagecontrol/Pattern.java => data/enums/UsagePolicyName.java} (94%) rename src/main/java/de/fraunhofer/isst/configmanager/{model => data}/repositories/ConfigModelRepository.java (61%) rename src/main/java/de/fraunhofer/isst/configmanager/{model => data}/repositories/CustomAppRepository.java (60%) rename src/main/java/de/fraunhofer/isst/configmanager/{model => data}/repositories/CustomBrokerRepository.java (61%) rename src/main/java/de/fraunhofer/isst/configmanager/{model => data}/repositories/CustomGenericEndpointRepository.java (65%) rename src/main/java/de/fraunhofer/isst/configmanager/{model => data}/repositories/EndpointInformationRepository.java (61%) rename src/main/java/de/fraunhofer/isst/configmanager/{model => data}/repositories/RouteDeployMethodRepository.java (60%) rename src/main/java/de/fraunhofer/isst/configmanager/{model => data}/repositories/package-info.java (80%) rename src/main/java/de/fraunhofer/isst/configmanager/{model/customgenericendpoint => data/util}/BackendConfig.java (86%) rename src/main/java/de/fraunhofer/isst/configmanager/{model/converter => data/util}/ConfigModelConverter.java (96%) rename src/main/java/de/fraunhofer/isst/configmanager/{model/converter => data/util}/EndpointConverter.java (96%) rename src/main/java/de/fraunhofer/isst/configmanager/{model/config => data/util}/QueryInput.java (82%) delete mode 100644 src/main/java/de/fraunhofer/isst/configmanager/model/config/BrokerStatus.java delete mode 100644 src/main/java/de/fraunhofer/isst/configmanager/model/package-info.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 50542038..5715ae1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Patch Change: Docker, the Java version to be used is now fixed in the Dockerfile - Patch Change: If running infomodel-deserialize throws IOException, these are now explicitly logged in the DataspaceConnectorClient - Patch Change: Added Log-Guard levels at console log-outputs and switched spring log level to warn +- Patch Change: Refactored Model/Data-Architecture ### Fixes - Patch Change: POST /api/ui/broker/register now return success:false if connector doesn't return 200 and GET /api/ui/brokers returns not registered in this case diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java index d9fd6322..7a6e2eb9 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java @@ -1,6 +1,6 @@ package de.fraunhofer.isst.configmanager.api; -import de.fraunhofer.isst.configmanager.model.routedeploymethod.DeployMethod; +import de.fraunhofer.isst.configmanager.data.enums.RouteDeployMethod; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; @@ -67,7 +67,7 @@ ResponseEntity getEndpointInformation(@RequestParam(value = "routeId") U @ApiResponses({ @ApiResponse(responseCode = "200", description = "Successfully updated the route deploy method"), @ApiResponse(responseCode = "400", description = "Can not update the route deploy method")}) - ResponseEntity updateRouteDeployMethod(@RequestParam("deployMethod") DeployMethod deployMethod); + ResponseEntity updateRouteDeployMethod(@RequestParam("deployMethod") RouteDeployMethod routeDeployMethod); @GetMapping(value = "/route/deploymethod", produces = "application/ld+json") @Operation(summary = "Returns the route deploy method for all routes") diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java index 3da5b755..59dd4f59 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java @@ -1,6 +1,6 @@ package de.fraunhofer.isst.configmanager.api; -import de.fraunhofer.isst.configmanager.model.config.QueryInput; +import de.fraunhofer.isst.configmanager.data.util.QueryInput; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java index a30c0cf3..25582822 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java @@ -1,6 +1,6 @@ package de.fraunhofer.isst.configmanager.api; -import de.fraunhofer.isst.configmanager.model.usagecontrol.Pattern; +import de.fraunhofer.isst.configmanager.data.enums.UsagePolicyName; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; @@ -27,7 +27,7 @@ ResponseEntity updateResourceContract(@RequestParam("resourceId") URI re @ApiResponse(responseCode = "200", description = "Successfully updated the contract in the resource"), @ApiResponse(responseCode = "400", description = "Can not update the resource contract")}) ResponseEntity updateContractForResource(@RequestParam("resourceId") URI resourceId, - @RequestParam("pattern") Pattern pattern, + @RequestParam("pattern") UsagePolicyName usagePolicyName, @RequestBody(required = false) String contractJson); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java index 17a4bcd3..3847fb11 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java @@ -9,9 +9,8 @@ import de.fraunhofer.isst.configmanager.api.AppRouteApi; import de.fraunhofer.isst.configmanager.api.service.AppRouteService; import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; -import de.fraunhofer.isst.configmanager.model.repositories.RouteDeployMethodRepository; -import de.fraunhofer.isst.configmanager.model.routedeploymethod.DeployMethod; -import de.fraunhofer.isst.configmanager.model.routedeploymethod.RouteDeployMethod; +import de.fraunhofer.isst.configmanager.data.repositories.RouteDeployMethodRepository; +import de.fraunhofer.isst.configmanager.data.enums.RouteDeployMethod; import de.fraunhofer.isst.configmanager.util.Utility; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AccessLevel; @@ -58,8 +57,8 @@ public AppRouteController(final ConfigModelService configModelService, this.objectMapper = objectMapper; if (routeDeployMethodRepository.count() == 0) { - final var routeDeployMethod = new RouteDeployMethod(); - routeDeployMethod.setDeployMethod(DeployMethod.NONE); + final var routeDeployMethod = new de.fraunhofer.isst.configmanager.data.entities.RouteDeployMethod(); + routeDeployMethod.setRouteDeployMethod(RouteDeployMethod.NONE); routeDeployMethodRepository.save(routeDeployMethod); } } @@ -304,24 +303,24 @@ public ResponseEntity getEndpointInformation(final URI routeId, final UR /** * This method updates the route deploy method of all app route and route steps. * - * @param deployMethod route deploy method + * @param routeDeployMethod route deploy method * @return a suitable http response depending on success */ @Override - public ResponseEntity updateRouteDeployMethod(final DeployMethod deployMethod) { + public ResponseEntity updateRouteDeployMethod(final RouteDeployMethod routeDeployMethod) { if (log.isInfoEnabled()) { - log.info(">> PUT /route/deploymethod deployMethod: " + deployMethod); + log.info(">> PUT /route/deploymethod deployMethod: " + routeDeployMethod); } ResponseEntity response; if (routeDeployMethodRepository.count() != 0) { final var existingDeployMethod = routeDeployMethodRepository.findAll().get(0); - existingDeployMethod.setDeployMethod(deployMethod); + existingDeployMethod.setRouteDeployMethod(routeDeployMethod); routeDeployMethodRepository.save(existingDeployMethod); // Updates the deploy method from the app routes and route steps - updateDeployMethodFromRoutes(deployMethod); + updateDeployMethodFromRoutes(routeDeployMethod); if (log.isInfoEnabled()) { log.info("---- [AppRouteController updateRouteDeployMethod] Updated successfully the route deploy method"); @@ -371,9 +370,9 @@ public ResponseEntity getRouteDeployMethod() { /** * This method updates the deploy method from every app route and route step. * - * @param deployMethod deploy method of the route + * @param routeDeployMethod deploy method of the route */ - private void updateDeployMethodFromRoutes(final DeployMethod deployMethod) { + private void updateDeployMethodFromRoutes(final RouteDeployMethod routeDeployMethod) { if (log.isInfoEnabled()) { log.info("---- [AppRouteController updateDeployMethodFromRoutes] Updating deploymethod for every app route and route step..."); } @@ -384,14 +383,14 @@ private void updateDeployMethodFromRoutes(final DeployMethod deployMethod) { for (final var appRoute : appRouteList) { if (appRoute != null) { final var appRouteImpl = (AppRouteImpl) appRoute; - appRouteImpl.setRouteDeployMethod(deployMethod.toString()); + appRouteImpl.setRouteDeployMethod(routeDeployMethod.toString()); // Update deploy method from route steps if (appRoute.getHasSubRoute() != null) { for (final var routeStep : appRoute.getHasSubRoute()) { if (routeStep != null) { final var routeStepImpl = (RouteStepImpl) routeStep; - routeStepImpl.setRouteDeployMethod(deployMethod.toString()); + routeStepImpl.setRouteDeployMethod(routeDeployMethod.toString()); } } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java index 38a1922c..636a8165 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/BrokerController.java @@ -5,7 +5,7 @@ import de.fraunhofer.isst.configmanager.api.BrokerApi; import de.fraunhofer.isst.configmanager.api.service.BrokerService; import de.fraunhofer.isst.configmanager.connector.clients.DefaultBrokerClient; -import de.fraunhofer.isst.configmanager.model.config.BrokerStatus; +import de.fraunhofer.isst.configmanager.data.enums.BrokerRegistrationStatus; import de.fraunhofer.isst.configmanager.util.Utility; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AccessLevel; @@ -158,7 +158,7 @@ public ResponseEntity registerConnector(final URI brokerUri) { final var clientResponse = client.updateAtBroker(brokerUri.toString()); if (clientResponse.isSuccessful()) { brokerService.sentSelfDescToBroker(brokerUri); - brokerService.setBrokerStatus(brokerUri, BrokerStatus.REGISTERED); + brokerService.setBrokerStatus(brokerUri, BrokerRegistrationStatus.REGISTERED); jsonObject.put(success, true); } else { jsonObject.put(success, false); @@ -201,7 +201,7 @@ public ResponseEntity unregisterConnector(final URI brokerUri) { final var clientResponseString = Objects.requireNonNull(clientResponse.body()).string(); if (clientResponse.isSuccessful() && !clientResponseString.contains("RejectionMessage")) { brokerService.unregisteredAtBroker(brokerUri); - brokerService.setBrokerStatus(brokerUri, BrokerStatus.UNREGISTERED); + brokerService.setBrokerStatus(brokerUri, BrokerRegistrationStatus.UNREGISTERED); jsonObject.put(success, true); } else { jsonObject.put(success, false); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java index f2ac8b83..6c95adef 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ConnectorRequestController.java @@ -3,7 +3,7 @@ import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.isst.configmanager.api.ConnectorRequestApi; import de.fraunhofer.isst.configmanager.api.service.ConnectorRequestService; -import de.fraunhofer.isst.configmanager.model.config.QueryInput; +import de.fraunhofer.isst.configmanager.data.util.QueryInput; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import net.minidev.json.JSONObject; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java index 020d2df8..81d07304 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java @@ -6,7 +6,7 @@ import de.fraunhofer.isst.configmanager.api.ResourceContractApi; import de.fraunhofer.isst.configmanager.api.service.resources.ResourceContractService; import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; -import de.fraunhofer.isst.configmanager.model.usagecontrol.Pattern; +import de.fraunhofer.isst.configmanager.data.enums.UsagePolicyName; import de.fraunhofer.isst.configmanager.util.ValidateApiInput; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AccessLevel; @@ -104,16 +104,16 @@ public ResponseEntity updateResourceContract(final URI resourceId, final /** * @param resourceId id of the resource - * @param pattern the pattern of the contract + * @param usagePolicyName the pattern of the contract * @param contractJson the created contract for the resource * @return a suitable http response depending on success */ @Override public ResponseEntity updateContractForResource(final URI resourceId, - final Pattern pattern, + final UsagePolicyName usagePolicyName, final String contractJson) { if (log.isInfoEnabled()) { - log.info(">> PUT /resource/contract/update resourceId: " + resourceId + "pattern" + pattern.toString() + log.info(">> PUT /resource/contract/update resourceId: " + resourceId + "pattern" + usagePolicyName.toString() + " contractJson: " + contractJson); } @@ -124,7 +124,7 @@ public ResponseEntity updateContractForResource(final URI resourceId, } else { ContractOffer contractOffer = null; try { - contractOffer = resourceContractService.getContractOffer(pattern, contractJson); + contractOffer = resourceContractService.getContractOffer(usagePolicyName, contractJson); } catch (JsonProcessingException e) { if (log.isErrorEnabled()) { log.error(e.getMessage()); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java index 41f12a7b..7b31060e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java @@ -12,11 +12,11 @@ import de.fraunhofer.iais.eis.RouteStepBuilder; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.api.service.resources.ResourceService; -import de.fraunhofer.isst.configmanager.model.repositories.CustomAppRepository; -import de.fraunhofer.isst.configmanager.model.repositories.EndpointInformationRepository; -import de.fraunhofer.isst.configmanager.model.repositories.RouteDeployMethodRepository; -import de.fraunhofer.isst.configmanager.model.customapp.CustomApp; -import de.fraunhofer.isst.configmanager.model.endpointinfo.EndpointInformation; +import de.fraunhofer.isst.configmanager.data.repositories.CustomAppRepository; +import de.fraunhofer.isst.configmanager.data.repositories.EndpointInformationRepository; +import de.fraunhofer.isst.configmanager.data.repositories.RouteDeployMethodRepository; +import de.fraunhofer.isst.configmanager.data.entities.CustomApp; +import de.fraunhofer.isst.configmanager.data.entities.EndpointInformation; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; @@ -81,7 +81,7 @@ public AppRoute createAppRoute(final String description) { if (routeDeployMethod.isEmpty()) { deployMethod = "custom"; } else { - deployMethod = routeDeployMethod.get(0).getDeployMethod().toString(); + deployMethod = routeDeployMethod.get(0).getRouteDeployMethod().toString(); } final var appRoute = new AppRouteBuilder() @@ -191,7 +191,7 @@ public RouteStep createAppRouteStep(final URI routeId, final URI startId, if (routeDeployMethod.isEmpty()) { deployMethod = "custom"; } else { - deployMethod = routeDeployMethod.get(0).getDeployMethod().toString(); + deployMethod = routeDeployMethod.get(0).getRouteDeployMethod().toString(); } // Create route step diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java index 7bc6150f..2d836251 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java @@ -2,9 +2,9 @@ import de.fraunhofer.iais.eis.AppEndpointType; import de.fraunhofer.iais.eis.Language; -import de.fraunhofer.isst.configmanager.model.repositories.CustomAppRepository; -import de.fraunhofer.isst.configmanager.model.customapp.CustomApp; -import de.fraunhofer.isst.configmanager.model.customapp.CustomAppEndpoint; +import de.fraunhofer.isst.configmanager.data.repositories.CustomAppRepository; +import de.fraunhofer.isst.configmanager.data.entities.CustomApp; +import de.fraunhofer.isst.configmanager.data.entities.CustomAppEndpoint; import de.fraunhofer.isst.configmanager.util.Utility; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java index 4f5a7712..26687b1e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java @@ -2,9 +2,9 @@ import de.fraunhofer.iais.eis.Resource; import de.fraunhofer.isst.configmanager.api.service.resources.ResourceService; -import de.fraunhofer.isst.configmanager.model.config.BrokerStatus; -import de.fraunhofer.isst.configmanager.model.config.CustomBroker; -import de.fraunhofer.isst.configmanager.model.repositories.CustomBrokerRepository; +import de.fraunhofer.isst.configmanager.data.enums.BrokerRegistrationStatus; +import de.fraunhofer.isst.configmanager.data.entities.CustomBroker; +import de.fraunhofer.isst.configmanager.data.repositories.CustomBrokerRepository; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; @@ -44,7 +44,7 @@ public BrokerService(final CustomBrokerRepository customBrokerRepository, final var customBroker = new CustomBroker(); customBroker.setBrokerUri(URI.create("https://broker.ids.isst.fraunhofer.de/infrastructure")); customBroker.setTitle("IDS Broker"); - customBroker.setBrokerStatus(BrokerStatus.UNREGISTERED); + customBroker.setBrokerRegistrationStatus(BrokerRegistrationStatus.UNREGISTERED); customBrokerRepository.save(customBroker); } } @@ -60,7 +60,7 @@ public void createCustomBroker(final URI brokerUri, final String title) { if (title != null) { customBroker.setTitle(title); } - customBroker.setBrokerStatus(BrokerStatus.UNREGISTERED); + customBroker.setBrokerRegistrationStatus(BrokerRegistrationStatus.UNREGISTERED); customBrokerRepository.save(customBroker); } @@ -128,12 +128,12 @@ public CustomBroker getById(final URI id) { * This method is responsible for setting the broker status. * * @param brokerId id of the broker - * @param brokerStatus broker status + * @param brokerRegistrationStatus broker status */ - public void setBrokerStatus(final URI brokerId, final BrokerStatus brokerStatus) { + public void setBrokerStatus(final URI brokerId, final BrokerRegistrationStatus brokerRegistrationStatus) { final var customBroker = getById(brokerId); if (customBroker != null) { - customBroker.setBrokerStatus(brokerStatus); + customBroker.setBrokerRegistrationStatus(brokerRegistrationStatus); customBrokerRepository.save(customBroker); } } @@ -198,7 +198,7 @@ public JSONArray getRegisStatusForResource(final URI resourceId) { jsonObject.clear(); jsonObject.put("brokerId", customBroker.getBrokerUri().toString()); jsonObject.put("brokerStatus", - customBroker.getBrokerStatus().toString()); + customBroker.getBrokerRegistrationStatus().toString()); jsonObject.put("resourceId", resourceId.toString()); jsonArray.add(jsonObject); } @@ -224,7 +224,7 @@ public JSONArray getRegisteredBroker() { final var jsonObject = new JSONObject(); for (final var broker : customBrokers) { - if (BrokerStatus.REGISTERED.equals(broker.getBrokerStatus())) { + if (BrokerRegistrationStatus.REGISTERED.equals(broker.getBrokerRegistrationStatus())) { jsonObject.clear(); jsonObject.put("brokerId", broker.getBrokerUri().toString()); jsonArray.add(jsonObject); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java index 50488840..6fb71058 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java @@ -13,8 +13,8 @@ import de.fraunhofer.iais.eis.SecurityProfile; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.model.config.ConfigModelObject; -import de.fraunhofer.isst.configmanager.model.repositories.ConfigModelRepository; +import de.fraunhofer.isst.configmanager.data.entities.ConfigModelObject; +import de.fraunhofer.isst.configmanager.data.repositories.ConfigModelRepository; import lombok.AccessLevel; import lombok.Getter; import lombok.experimental.FieldDefaults; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java index 8200a0ee..0f73fdf8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorRequestService.java @@ -3,7 +3,7 @@ import de.fraunhofer.iais.eis.Resource; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; -import de.fraunhofer.isst.configmanager.model.config.QueryInput; +import de.fraunhofer.isst.configmanager.data.util.QueryInput; import lombok.extern.slf4j.Slf4j; import okhttp3.Response; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java index b343fe52..88d49218 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java @@ -7,7 +7,7 @@ import de.fraunhofer.iais.eis.SecurityProfile; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; -import de.fraunhofer.isst.configmanager.model.repositories.ConfigModelRepository; +import de.fraunhofer.isst.configmanager.data.repositories.ConfigModelRepository; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java index 1c0a4aac..c33d101a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java @@ -5,9 +5,9 @@ import de.fraunhofer.iais.eis.GenericEndpoint; import de.fraunhofer.iais.eis.GenericEndpointBuilder; import de.fraunhofer.iais.eis.GenericEndpointImpl; -import de.fraunhofer.isst.configmanager.model.customgenericendpoint.CustomGenericEndpointList; -import de.fraunhofer.isst.configmanager.model.repositories.CustomGenericEndpointRepository; -import de.fraunhofer.isst.configmanager.model.customgenericendpoint.CustomGenericEndpointObject; +import de.fraunhofer.isst.configmanager.data.entities.CustomGenericEndpointList; +import de.fraunhofer.isst.configmanager.data.repositories.CustomGenericEndpointRepository; +import de.fraunhofer.isst.configmanager.data.entities.CustomGenericEndpointObject; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java index 0e41b92c..7113e9d2 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java @@ -5,8 +5,8 @@ import de.fraunhofer.iais.eis.Language; import de.fraunhofer.iais.eis.LogLevel; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.model.BackendSource; -import de.fraunhofer.isst.configmanager.model.config.BrokerStatus; -import de.fraunhofer.isst.configmanager.model.routedeploymethod.DeployMethod; +import de.fraunhofer.isst.configmanager.data.enums.BrokerRegistrationStatus; +import de.fraunhofer.isst.configmanager.data.enums.RouteDeployMethod; import lombok.extern.slf4j.Slf4j; import net.minidev.json.JSONArray; import net.minidev.json.JSONObject; @@ -55,7 +55,7 @@ private JSONArray getBrokerStatus() { JSONArray sortedJsonArray; final var jsonArray = new JSONArray(); - final var brokerStatuses = BrokerStatus.values(); + final var brokerStatuses = BrokerRegistrationStatus.values(); for (final var brokerStatus : brokerStatuses) { var jsonObject = new JSONObject(); @@ -71,7 +71,7 @@ private JSONArray getDeployMethod() { JSONArray sortedJsonArray; final var jsonArray = new JSONArray(); - final var deployMethods = DeployMethod.values(); + final var deployMethods = RouteDeployMethod.values(); for (final var deployMethod : deployMethods) { var jsonObject = new JSONObject(); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java index 36376f17..005a56aa 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java @@ -7,7 +7,7 @@ import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.model.usagecontrol.Pattern; +import de.fraunhofer.isst.configmanager.data.enums.UsagePolicyName; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; @@ -120,14 +120,14 @@ private void updateResourceContractInSubroutes(final RouteStep routeStep, } /** - * @param pattern pattern to create appropriate contract offer + * @param usagePolicyName pattern to create appropriate contract offer * @param contractJson the request body which holds the necessary information * @return contract offer */ - public ContractOffer getContractOffer(final Pattern pattern, final String contractJson) throws JsonProcessingException { + public ContractOffer getContractOffer(final UsagePolicyName usagePolicyName, final String contractJson) throws JsonProcessingException { ContractOffer contractOffer = null; - switch (pattern) { + switch (usagePolicyName) { case PROVIDE_ACCESS: contractOffer = resourceContractBuilder.buildProvideAccess(); break; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java index e56b115a..5e75f67e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java @@ -8,8 +8,8 @@ import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; import de.fraunhofer.isst.configmanager.api.service.EndpointService; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.model.repositories.EndpointInformationRepository; -import de.fraunhofer.isst.configmanager.model.endpointinfo.EndpointInformation; +import de.fraunhofer.isst.configmanager.data.repositories.EndpointInformationRepository; +import de.fraunhofer.isst.configmanager.data.entities.EndpointInformation; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java index 4bafa1ed..91d9c772 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultConnectorClient.java @@ -2,7 +2,7 @@ import de.fraunhofer.iais.eis.BaseConnector; import de.fraunhofer.iais.eis.ConfigurationModel; -import de.fraunhofer.isst.configmanager.model.config.QueryInput; +import de.fraunhofer.isst.configmanager.data.util.QueryInput; import okhttp3.Response; import java.io.IOException; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java index a6bb3bda..12904097 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceConnectorClient.java @@ -5,7 +5,7 @@ import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util.DispatchRequest; import de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util.ResourceMapper; -import de.fraunhofer.isst.configmanager.model.config.QueryInput; +import de.fraunhofer.isst.configmanager.data.util.QueryInput; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/ConfigModelObject.java similarity index 87% rename from src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java rename to src/main/java/de/fraunhofer/isst/configmanager/data/entities/ConfigModelObject.java index 23444149..007cf1ea 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/config/ConfigModelObject.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/ConfigModelObject.java @@ -1,7 +1,7 @@ -package de.fraunhofer.isst.configmanager.model.config; +package de.fraunhofer.isst.configmanager.data.entities; import de.fraunhofer.iais.eis.ConfigurationModel; -import de.fraunhofer.isst.configmanager.model.converter.ConfigModelConverter; +import de.fraunhofer.isst.configmanager.data.util.ConfigModelConverter; import lombok.AccessLevel; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomApp.java similarity index 91% rename from src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java rename to src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomApp.java index 91ae02c7..c86d1a4f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomApp.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomApp.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.model.customapp; +package de.fraunhofer.isst.configmanager.data.entities; import lombok.AccessLevel; import lombok.Data; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomAppEndpoint.java b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomAppEndpoint.java similarity index 76% rename from src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomAppEndpoint.java rename to src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomAppEndpoint.java index efcff2f6..55c9b2c4 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/customapp/CustomAppEndpoint.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomAppEndpoint.java @@ -1,7 +1,7 @@ -package de.fraunhofer.isst.configmanager.model.customapp; +package de.fraunhofer.isst.configmanager.data.entities; import de.fraunhofer.iais.eis.AppEndpoint; -import de.fraunhofer.isst.configmanager.model.customgenericendpoint.BackendConfig; +import de.fraunhofer.isst.configmanager.data.util.BackendConfig; import lombok.NoArgsConstructor; import javax.persistence.Entity; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomBroker.java similarity index 81% rename from src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java rename to src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomBroker.java index ad7c3a5e..92cf52b0 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/config/CustomBroker.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomBroker.java @@ -1,5 +1,6 @@ -package de.fraunhofer.isst.configmanager.model.config; +package de.fraunhofer.isst.configmanager.data.entities; +import de.fraunhofer.isst.configmanager.data.enums.BrokerRegistrationStatus; import lombok.AccessLevel; import lombok.Data; import lombok.experimental.FieldDefaults; @@ -27,7 +28,7 @@ public class CustomBroker { String title; - BrokerStatus brokerStatus; + BrokerRegistrationStatus brokerRegistrationStatus; @ElementCollection List registeredResources; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/CustomGenericEndpointList.java b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomGenericEndpointList.java similarity index 87% rename from src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/CustomGenericEndpointList.java rename to src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomGenericEndpointList.java index 9089ddac..cb26a503 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/CustomGenericEndpointList.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomGenericEndpointList.java @@ -1,7 +1,6 @@ -package de.fraunhofer.isst.configmanager.model.customgenericendpoint; +package de.fraunhofer.isst.configmanager.data.entities; import de.fraunhofer.iais.eis.Endpoint; -import de.fraunhofer.isst.configmanager.model.customgenericendpoint.CustomGenericEndpointObject; import lombok.AccessLevel; import lombok.Data; import lombok.experimental.FieldDefaults; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/CustomGenericEndpointObject.java b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomGenericEndpointObject.java similarity index 80% rename from src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/CustomGenericEndpointObject.java rename to src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomGenericEndpointObject.java index 823c3b1b..bc625343 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/CustomGenericEndpointObject.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomGenericEndpointObject.java @@ -1,6 +1,7 @@ -package de.fraunhofer.isst.configmanager.model.customgenericendpoint; +package de.fraunhofer.isst.configmanager.data.entities; import de.fraunhofer.iais.eis.GenericEndpoint; +import de.fraunhofer.isst.configmanager.data.util.BackendConfig; import lombok.NoArgsConstructor; import javax.persistence.Entity; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/endpointinfo/EndpointInformation.java b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/EndpointInformation.java similarity index 93% rename from src/main/java/de/fraunhofer/isst/configmanager/model/endpointinfo/EndpointInformation.java rename to src/main/java/de/fraunhofer/isst/configmanager/data/entities/EndpointInformation.java index ac34e477..6c67c7f3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/endpointinfo/EndpointInformation.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/EndpointInformation.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.model.endpointinfo; +package de.fraunhofer.isst.configmanager.data.entities; import lombok.AccessLevel; import lombok.Data; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/routedeploymethod/RouteDeployMethod.java b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/RouteDeployMethod.java similarity index 79% rename from src/main/java/de/fraunhofer/isst/configmanager/model/routedeploymethod/RouteDeployMethod.java rename to src/main/java/de/fraunhofer/isst/configmanager/data/entities/RouteDeployMethod.java index e6b6c3ce..3ace7b19 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/routedeploymethod/RouteDeployMethod.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/RouteDeployMethod.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.model.routedeploymethod; +package de.fraunhofer.isst.configmanager.data.entities; import lombok.AccessLevel; import lombok.Data; @@ -21,5 +21,5 @@ public class RouteDeployMethod { @GeneratedValue(strategy = GenerationType.AUTO) Long id; - DeployMethod deployMethod; + de.fraunhofer.isst.configmanager.data.enums.RouteDeployMethod routeDeployMethod; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/data/entities/package-info.java b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/package-info.java new file mode 100644 index 00000000..fcd81176 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/package-info.java @@ -0,0 +1,11 @@ +/** + * Entities to be persisted. + *

+ * This package contains entity classes which are persisted in the DB. + *

+ * + * @version 7.0.0 (last changed at version) + * @since 7.0.0 (documented since) + * @author IDS-ConfigurationManager Contributors + */ +package de.fraunhofer.isst.configmanager.data.entities; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/data/enums/BrokerRegistrationStatus.java b/src/main/java/de/fraunhofer/isst/configmanager/data/enums/BrokerRegistrationStatus.java new file mode 100644 index 00000000..acc022aa --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/enums/BrokerRegistrationStatus.java @@ -0,0 +1,9 @@ +package de.fraunhofer.isst.configmanager.data.enums; + +/** + * Enums for the broker status. + */ +public enum BrokerRegistrationStatus { + REGISTERED, + UNREGISTERED +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/routedeploymethod/DeployMethod.java b/src/main/java/de/fraunhofer/isst/configmanager/data/enums/RouteDeployMethod.java similarity index 52% rename from src/main/java/de/fraunhofer/isst/configmanager/model/routedeploymethod/DeployMethod.java rename to src/main/java/de/fraunhofer/isst/configmanager/data/enums/RouteDeployMethod.java index 7255e4ef..0b85baa1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/routedeploymethod/DeployMethod.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/enums/RouteDeployMethod.java @@ -1,9 +1,9 @@ -package de.fraunhofer.isst.configmanager.model.routedeploymethod; +package de.fraunhofer.isst.configmanager.data.enums; /** * Enums for the route deploy methods. */ -public enum DeployMethod { +public enum RouteDeployMethod { NONE, CAMEL, KAFKA, diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/usagecontrol/Pattern.java b/src/main/java/de/fraunhofer/isst/configmanager/data/enums/UsagePolicyName.java similarity index 94% rename from src/main/java/de/fraunhofer/isst/configmanager/model/usagecontrol/Pattern.java rename to src/main/java/de/fraunhofer/isst/configmanager/data/enums/UsagePolicyName.java index 99f16d46..5fa8d948 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/usagecontrol/Pattern.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/enums/UsagePolicyName.java @@ -1,6 +1,6 @@ -package de.fraunhofer.isst.configmanager.model.usagecontrol; +package de.fraunhofer.isst.configmanager.data.enums; -public enum Pattern { +public enum UsagePolicyName { /** * Standard pattern to allow unrestricted access. @@ -38,7 +38,7 @@ public enum Pattern { private final String pattern; - Pattern(final String string) { + UsagePolicyName(final String string) { pattern = string; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/ConfigModelRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/data/repositories/ConfigModelRepository.java similarity index 61% rename from src/main/java/de/fraunhofer/isst/configmanager/model/repositories/ConfigModelRepository.java rename to src/main/java/de/fraunhofer/isst/configmanager/data/repositories/ConfigModelRepository.java index 118ee28e..214a5d2e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/ConfigModelRepository.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/repositories/ConfigModelRepository.java @@ -1,6 +1,6 @@ -package de.fraunhofer.isst.configmanager.model.repositories; +package de.fraunhofer.isst.configmanager.data.repositories; -import de.fraunhofer.isst.configmanager.model.config.ConfigModelObject; +import de.fraunhofer.isst.configmanager.data.entities.ConfigModelObject; import org.springframework.data.jpa.repository.JpaRepository; /** diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/CustomAppRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/data/repositories/CustomAppRepository.java similarity index 60% rename from src/main/java/de/fraunhofer/isst/configmanager/model/repositories/CustomAppRepository.java rename to src/main/java/de/fraunhofer/isst/configmanager/data/repositories/CustomAppRepository.java index dcc59381..85ade671 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/CustomAppRepository.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/repositories/CustomAppRepository.java @@ -1,6 +1,6 @@ -package de.fraunhofer.isst.configmanager.model.repositories; +package de.fraunhofer.isst.configmanager.data.repositories; -import de.fraunhofer.isst.configmanager.model.customapp.CustomApp; +import de.fraunhofer.isst.configmanager.data.entities.CustomApp; import org.springframework.data.jpa.repository.JpaRepository; /** diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/CustomBrokerRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/data/repositories/CustomBrokerRepository.java similarity index 61% rename from src/main/java/de/fraunhofer/isst/configmanager/model/repositories/CustomBrokerRepository.java rename to src/main/java/de/fraunhofer/isst/configmanager/data/repositories/CustomBrokerRepository.java index 63c195f0..2b9fe4eb 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/CustomBrokerRepository.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/repositories/CustomBrokerRepository.java @@ -1,6 +1,6 @@ -package de.fraunhofer.isst.configmanager.model.repositories; +package de.fraunhofer.isst.configmanager.data.repositories; -import de.fraunhofer.isst.configmanager.model.config.CustomBroker; +import de.fraunhofer.isst.configmanager.data.entities.CustomBroker; import org.springframework.data.jpa.repository.JpaRepository; /** diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/CustomGenericEndpointRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/data/repositories/CustomGenericEndpointRepository.java similarity index 65% rename from src/main/java/de/fraunhofer/isst/configmanager/model/repositories/CustomGenericEndpointRepository.java rename to src/main/java/de/fraunhofer/isst/configmanager/data/repositories/CustomGenericEndpointRepository.java index b183d368..e0098c96 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/CustomGenericEndpointRepository.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/repositories/CustomGenericEndpointRepository.java @@ -1,6 +1,6 @@ -package de.fraunhofer.isst.configmanager.model.repositories; +package de.fraunhofer.isst.configmanager.data.repositories; -import de.fraunhofer.isst.configmanager.model.customgenericendpoint.CustomGenericEndpointList; +import de.fraunhofer.isst.configmanager.data.entities.CustomGenericEndpointList; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/EndpointInformationRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/data/repositories/EndpointInformationRepository.java similarity index 61% rename from src/main/java/de/fraunhofer/isst/configmanager/model/repositories/EndpointInformationRepository.java rename to src/main/java/de/fraunhofer/isst/configmanager/data/repositories/EndpointInformationRepository.java index 4818daa9..8b4bb604 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/EndpointInformationRepository.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/repositories/EndpointInformationRepository.java @@ -1,6 +1,6 @@ -package de.fraunhofer.isst.configmanager.model.repositories; +package de.fraunhofer.isst.configmanager.data.repositories; -import de.fraunhofer.isst.configmanager.model.endpointinfo.EndpointInformation; +import de.fraunhofer.isst.configmanager.data.entities.EndpointInformation; import org.springframework.data.jpa.repository.JpaRepository; /** diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/RouteDeployMethodRepository.java b/src/main/java/de/fraunhofer/isst/configmanager/data/repositories/RouteDeployMethodRepository.java similarity index 60% rename from src/main/java/de/fraunhofer/isst/configmanager/model/repositories/RouteDeployMethodRepository.java rename to src/main/java/de/fraunhofer/isst/configmanager/data/repositories/RouteDeployMethodRepository.java index d7a7848a..388fcdb9 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/RouteDeployMethodRepository.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/repositories/RouteDeployMethodRepository.java @@ -1,6 +1,6 @@ -package de.fraunhofer.isst.configmanager.model.repositories; +package de.fraunhofer.isst.configmanager.data.repositories; -import de.fraunhofer.isst.configmanager.model.routedeploymethod.RouteDeployMethod; +import de.fraunhofer.isst.configmanager.data.entities.RouteDeployMethod; import org.springframework.data.jpa.repository.JpaRepository; /** diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/package-info.java b/src/main/java/de/fraunhofer/isst/configmanager/data/repositories/package-info.java similarity index 80% rename from src/main/java/de/fraunhofer/isst/configmanager/model/repositories/package-info.java rename to src/main/java/de/fraunhofer/isst/configmanager/data/repositories/package-info.java index 562a4b1c..ead9d884 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/repositories/package-info.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/repositories/package-info.java @@ -8,4 +8,4 @@ * @since 7.0.0 (documented since) * @author IDS-ConfigurationManager Contributors */ -package de.fraunhofer.isst.configmanager.model.repositories; +package de.fraunhofer.isst.configmanager.data.repositories; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java b/src/main/java/de/fraunhofer/isst/configmanager/data/util/BackendConfig.java similarity index 86% rename from src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java rename to src/main/java/de/fraunhofer/isst/configmanager/data/util/BackendConfig.java index 6b661634..2e8cc019 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/customgenericendpoint/BackendConfig.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/util/BackendConfig.java @@ -1,7 +1,6 @@ -package de.fraunhofer.isst.configmanager.model.customgenericendpoint; +package de.fraunhofer.isst.configmanager.data.util; import de.fraunhofer.iais.eis.Endpoint; -import de.fraunhofer.isst.configmanager.model.converter.EndpointConverter; import lombok.AccessLevel; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/converter/ConfigModelConverter.java b/src/main/java/de/fraunhofer/isst/configmanager/data/util/ConfigModelConverter.java similarity index 96% rename from src/main/java/de/fraunhofer/isst/configmanager/model/converter/ConfigModelConverter.java rename to src/main/java/de/fraunhofer/isst/configmanager/data/util/ConfigModelConverter.java index 99ea3131..1a7a738e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/converter/ConfigModelConverter.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/util/ConfigModelConverter.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.model.converter; +package de.fraunhofer.isst.configmanager.data.util; import de.fraunhofer.iais.eis.ConfigurationModel; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/converter/EndpointConverter.java b/src/main/java/de/fraunhofer/isst/configmanager/data/util/EndpointConverter.java similarity index 96% rename from src/main/java/de/fraunhofer/isst/configmanager/model/converter/EndpointConverter.java rename to src/main/java/de/fraunhofer/isst/configmanager/data/util/EndpointConverter.java index c5165213..0d6b2a36 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/converter/EndpointConverter.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/util/EndpointConverter.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.model.converter; +package de.fraunhofer.isst.configmanager.data.util; import de.fraunhofer.iais.eis.Endpoint; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/config/QueryInput.java b/src/main/java/de/fraunhofer/isst/configmanager/data/util/QueryInput.java similarity index 82% rename from src/main/java/de/fraunhofer/isst/configmanager/model/config/QueryInput.java rename to src/main/java/de/fraunhofer/isst/configmanager/data/util/QueryInput.java index 26e34034..f2aacf6c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/config/QueryInput.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/util/QueryInput.java @@ -1,4 +1,4 @@ -package de.fraunhofer.isst.configmanager.model.config; +package de.fraunhofer.isst.configmanager.data.util; import lombok.Data; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/config/BrokerStatus.java b/src/main/java/de/fraunhofer/isst/configmanager/model/config/BrokerStatus.java deleted file mode 100644 index f4ee1a5d..00000000 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/config/BrokerStatus.java +++ /dev/null @@ -1,9 +0,0 @@ -package de.fraunhofer.isst.configmanager.model.config; - -/** - * Enums for the broker status. - */ -public enum BrokerStatus { - REGISTERED, - UNREGISTERED -} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/model/package-info.java b/src/main/java/de/fraunhofer/isst/configmanager/model/package-info.java deleted file mode 100644 index e131ef08..00000000 --- a/src/main/java/de/fraunhofer/isst/configmanager/model/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * This package contains the ConfigManager internal data storage classes. - * - * @version 7.0.0 (last changed at version) - * @since 7.0.0 (documented since) - * @author IDS-ConfigurationManager Contributors - */ -package de.fraunhofer.isst.configmanager.model; diff --git a/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java b/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java index 30f9f294..357dc40c 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java @@ -3,7 +3,7 @@ import de.fraunhofer.isst.configmanager.api.controller.BrokerController; import de.fraunhofer.isst.configmanager.api.service.BrokerService; import de.fraunhofer.isst.configmanager.connector.clients.DefaultBrokerClient; -import de.fraunhofer.isst.configmanager.model.config.CustomBroker; +import de.fraunhofer.isst.configmanager.data.entities.CustomBroker; import de.fraunhofer.isst.configmanager.util.TestUtil; import org.junit.jupiter.api.Test; import org.mockito.Mockito; diff --git a/src/test/java/de/fraunhofer/isst/configmanager/util/TestUtil.java b/src/test/java/de/fraunhofer/isst/configmanager/util/TestUtil.java index f589196a..87b64ce9 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/util/TestUtil.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/util/TestUtil.java @@ -1,6 +1,6 @@ package de.fraunhofer.isst.configmanager.util; -import de.fraunhofer.isst.configmanager.model.config.CustomBroker; +import de.fraunhofer.isst.configmanager.data.entities.CustomBroker; import java.net.URI; import java.util.ArrayList; From 7a56b23cfb87ae0d8638935ea48e0b786d3020a3 Mon Sep 17 00:00:00 2001 From: eakker Date: Fri, 23 Apr 2021 12:26:43 +0200 Subject: [PATCH 099/157] chore: add method to print out built AskCTL Formula --- .../petrinet/evaluation/formula/FF.java | 5 +++++ .../petrinet/evaluation/formula/Formula.java | 2 ++ .../petrinet/evaluation/formula/TT.java | 5 +++++ .../evaluation/formula/state/NodeALONG.java | 5 +++++ .../petrinet/evaluation/formula/state/NodeAND.java | 5 +++++ .../petrinet/evaluation/formula/state/NodeEV.java | 5 +++++ .../evaluation/formula/state/NodeEXIST_MODAL.java | 5 +++++ .../evaluation/formula/state/NodeEXIST_NEXT.java | 5 +++++ .../evaluation/formula/state/NodeEXIST_UNTIL.java | 5 +++++ .../evaluation/formula/state/NodeFORALL_MODAL.java | 5 +++++ .../evaluation/formula/state/NodeFORALL_NEXT.java | 5 +++++ .../evaluation/formula/state/NodeFORALL_UNTIL.java | 5 +++++ .../petrinet/evaluation/formula/state/NodeINV.java | 5 +++++ .../evaluation/formula/state/NodeMODAL.java | 4 ++++ .../petrinet/evaluation/formula/state/NodeNF.java | 5 +++++ .../petrinet/evaluation/formula/state/NodeNOT.java | 5 +++++ .../petrinet/evaluation/formula/state/NodeOR.java | 5 +++++ .../petrinet/evaluation/formula/state/NodePOS.java | 5 +++++ .../evaluation/formula/transition/TransitionAF.java | 5 +++++ .../formula/transition/TransitionALONG.java | 5 +++++ .../formula/transition/TransitionAND.java | 5 +++++ .../evaluation/formula/transition/TransitionEV.java | 5 +++++ .../formula/transition/TransitionEXIST_MODAL.java | 5 +++++ .../formula/transition/TransitionEXIST_NEXT.java | 5 +++++ .../formula/transition/TransitionEXIST_UNTIL.java | 5 +++++ .../formula/transition/TransitionFORALL_MODAL.java | 5 +++++ .../formula/transition/TransitionFORALL_NEXT.java | 5 +++++ .../formula/transition/TransitionFORALL_UNTIL.java | 5 +++++ .../formula/transition/TransitionINV.java | 5 +++++ .../formula/transition/TransitionMODAL.java | 5 +++++ .../formula/transition/TransitionNOT.java | 5 +++++ .../evaluation/formula/transition/TransitionOR.java | 5 +++++ .../formula/transition/TransitionPOS.java | 5 +++++ .../builder/InfomodelPetriNetBuilderTest.java | 13 ++++++++++++- 34 files changed, 173 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java index 49cc242f..da889f46 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java @@ -18,4 +18,9 @@ public boolean evaluate() { public String symbol() { return "FF"; } + + @Override + public String writeFormula() { + return symbol(); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/Formula.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/Formula.java index 8eaefd2e..0784c066 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/Formula.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/Formula.java @@ -5,4 +5,6 @@ public interface Formula { boolean evaluate(); String symbol(); + + String writeFormula(); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/TT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/TT.java index a66c9afb..0f5bf9f1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/TT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/TT.java @@ -18,4 +18,9 @@ public boolean evaluate() { public String symbol() { return "TT"; } + + @Override + public String writeFormula() { + return symbol(); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java index 000d5301..aab922f5 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java @@ -23,4 +23,9 @@ public boolean evaluate() { public String symbol() { return "ALONG"; } + + @Override + public String writeFormula() { + return String.format("%s(%s)", symbol(), parameter.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java index 772f9387..dbd823a8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java @@ -20,4 +20,9 @@ public boolean evaluate() { public String symbol() { return "AND"; } + + @Override + public String writeFormula() { + return String.format("%s(%s, %s)", symbol(), parameter1.writeFormula(), parameter2.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java index 80a4a50b..12d39e94 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java @@ -23,4 +23,9 @@ public boolean evaluate() { public String symbol() { return "EV"; } + + @Override + public String writeFormula() { + return String.format("%s(%s)", symbol(), parameter.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java index 8b7f10bd..f2846d55 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java @@ -26,4 +26,9 @@ public boolean evaluate() { public String symbol() { return "EXIST_MODAL"; } + + @Override + public String writeFormula() { + return String.format("%s(%s, %s)", symbol(), parameter1.writeFormula(), parameter2.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java index 3212a86d..774aa0ab 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java @@ -22,4 +22,9 @@ public boolean evaluate() { public String symbol() { return "EXIST_NEXT"; } + + @Override + public String writeFormula() { + return String.format("%s(%s)", symbol(), parameter.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java index 2010462d..c7721be1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java @@ -23,4 +23,9 @@ public boolean evaluate() { public String symbol() { return "EXIST_UNTIL"; } + + @Override + public String writeFormula() { + return String.format("%s(%s, %s)", symbol(), parameter1.writeFormula(), parameter2.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java index 29821a1e..03b2b126 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java @@ -26,4 +26,9 @@ public boolean evaluate() { public String symbol() { return "FORALL_MODAL"; } + + @Override + public String writeFormula() { + return String.format("%s(%s, %s)", symbol(), parameter1.writeFormula(), parameter2.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java index d42c0f93..cff01fa7 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java @@ -23,4 +23,9 @@ public String symbol() { return "FORALL_NEXT"; } + @Override + public String writeFormula() { + return String.format("%s(%s)", symbol(), parameter.writeFormula()); + } + } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java index aef9935c..5daa4356 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java @@ -21,4 +21,9 @@ public boolean evaluate() { public String symbol() { return "FORALL_UNTIL"; } + + @Override + public String writeFormula() { + return String.format("%s(%s, %s)", symbol(), parameter1.writeFormula(), parameter2.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java index a157cc62..43bb3384 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java @@ -23,4 +23,9 @@ public boolean evaluate() { public String symbol() { return "INV"; } + + @Override + public String writeFormula() { + return String.format("%s(%s)", symbol(), parameter.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java index aa9bbe49..5d5a4b67 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java @@ -24,4 +24,8 @@ public String symbol() { return "MODAL"; } + @Override + public String writeFormula() { + return String.format("%s(%s)", symbol(), parameter.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNF.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNF.java index 65ba867a..ef1471bc 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNF.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNF.java @@ -20,4 +20,9 @@ public boolean evaluate() { public String symbol() { return "NF"; } + + @Override + public String writeFormula() { + return String.format("%s(%s)", symbol(), "expression"); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java index c0c7e792..7467be80 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java @@ -20,4 +20,9 @@ public boolean evaluate() { public String symbol() { return "NOT"; } + + @Override + public String writeFormula() { + return String.format("%s(%s)", symbol(), parameter.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java index 54d8fbb3..6e2ed873 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java @@ -20,4 +20,9 @@ public boolean evaluate() { public String symbol() { return "OR"; } + + @Override + public String writeFormula() { + return String.format("%s(%s, %s)", symbol(), parameter1.writeFormula(), parameter2.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java index c51780dd..316577d6 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java @@ -24,4 +24,9 @@ public String symbol() { return "POS"; } + @Override + public String writeFormula() { + return String.format("%s(%s)", symbol(), parameter.writeFormula()); + } + } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java index b5b47021..6836843c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java @@ -20,4 +20,9 @@ public boolean evaluate() { public String symbol() { return "AF"; } + + @Override + public String writeFormula() { + return String.format("%s(%s)", symbol(), "expression"); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java index 36d09359..73981002 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java @@ -23,4 +23,9 @@ public boolean evaluate() { public String symbol() { return "ALONG"; } + + @Override + public String writeFormula() { + return String.format("%s(%s)", symbol(), parameter.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java index 7a2282d0..8621eb7f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java @@ -20,4 +20,9 @@ public boolean evaluate() { public String symbol() { return "AND"; } + + @Override + public String writeFormula() { + return String.format("%s(%s, %s)", symbol(), parameter1.writeFormula(), parameter2.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java index f2beccec..67a10b12 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java @@ -23,4 +23,9 @@ public boolean evaluate() { public String symbol() { return "EV"; } + + @Override + public String writeFormula() { + return String.format("%s(%s)", symbol(), parameter.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java index bfe47ba4..2ddd0f59 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java @@ -26,4 +26,9 @@ public boolean evaluate() { public String symbol() { return "EXIST_MODAL"; } + + @Override + public String writeFormula() { + return String.format("%s(%s, %s)", symbol(), parameter1.writeFormula(), parameter2.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java index 438961f4..33a3b584 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java @@ -22,4 +22,9 @@ public boolean evaluate() { public String symbol() { return "EXIST_NEXT"; } + + @Override + public String writeFormula() { + return String.format("%s(%s)", symbol(), parameter.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java index 09aa303f..1bba9c93 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java @@ -23,4 +23,9 @@ public boolean evaluate() { public String symbol() { return "EXIST_UNTIL"; } + + @Override + public String writeFormula() { + return String.format("%s(%s, %s)", symbol(), parameter1.writeFormula(), parameter2.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java index 153e1cdb..213774f6 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java @@ -25,4 +25,9 @@ public boolean evaluate() { public String symbol() { return "FORALL_MODAL"; } + + @Override + public String writeFormula() { + return String.format("%s(%s, %s)", symbol(), parameter1.writeFormula(), parameter2.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java index e88f7f9f..9c25e8c2 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java @@ -24,4 +24,9 @@ public String symbol() { return "FORALL_NEXT"; } + @Override + public String writeFormula() { + return String.format("%s(%s)", symbol(), parameter.writeFormula()); + } + } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java index babb53c4..c3c71517 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java @@ -21,4 +21,9 @@ public boolean evaluate() { public String symbol() { return "FORALL_UNTIL"; } + + @Override + public String writeFormula() { + return String.format("%s(%s, %s)", symbol(), parameter1.writeFormula(), parameter2.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java index 89d4e00b..c9b759c1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java @@ -23,4 +23,9 @@ public boolean evaluate() { public String symbol() { return "INV"; } + + @Override + public String writeFormula() { + return String.format("%s(%s)", symbol(), parameter.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java index 067da06c..d09c4187 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java @@ -24,4 +24,9 @@ public String symbol() { return "MODAL"; } + @Override + public String writeFormula() { + return String.format("%s(%s)", symbol(), parameter.writeFormula()); + } + } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java index a381b9ae..56824d5b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java @@ -20,4 +20,9 @@ public boolean evaluate() { public String symbol() { return "NOT"; } + + @Override + public String writeFormula() { + return String.format("%s(%s)", symbol(), parameter.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java index 1ec89012..b68d0685 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java @@ -20,4 +20,9 @@ public boolean evaluate() { public String symbol() { return "OR"; } + + @Override + public String writeFormula() { + return String.format("%s(%s, %s)", symbol(), parameter1.writeFormula(), parameter2.writeFormula()); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java index 5c0f00fd..28a243be 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java @@ -24,4 +24,9 @@ public String symbol() { return "POS"; } + @Override + public String writeFormula() { + return String.format("%s(%s)", symbol(), parameter.writeFormula()); + } + } diff --git a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java index 61c607e7..26f029b9 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java @@ -2,6 +2,7 @@ import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; +import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeExpression; import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionPOS; import de.fraunhofer.isst.configmanager.petrinet.simulator.PetriNetSimulator; import lombok.extern.slf4j.Slf4j; @@ -17,8 +18,13 @@ import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.*; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeAND.nodeAND; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeMODAL.nodeMODAL; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeNF.nodeNF; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeOR.nodeOR; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionNOT.transitionNOT; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.FF.FF; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.TT.TT; /** * Test building a PetriNet from a randomly generated AppRoute @@ -65,7 +71,6 @@ void testBuildPetriNet() throws IOException { var graph = PetriNetSimulator.buildStepGraph(petriNet); log.info(String.valueOf(graph.getArcs().size())); log.info(GraphVizGenerator.generateGraphViz(graph)); - var formula = transitionNOT(FF()); } /** @@ -83,4 +88,10 @@ public static ArrayList randomSubList(List input) { } return newList; } + + @Test + public void testFormula(){ + var formula = nodeAND(nodeMODAL(transitionNOT(FF())), nodeOR(nodeNF(NodeExpression.nodeExpression(x -> true, "testMsg")),TT())); + log.info(formula.writeFormula()); + } } From cddbd47b3565395ca6d98666380699f4eb9afaaf Mon Sep 17 00:00:00 2001 From: eakker Date: Fri, 23 Apr 2021 14:27:15 +0200 Subject: [PATCH 100/157] chore: pass node when evaluation expressions, evaluate Place and Transition Expressions --- .../petrinet/evaluation/formula/CTLEvaluator.java | 4 ++-- .../isst/configmanager/petrinet/evaluation/formula/FF.java | 3 ++- .../configmanager/petrinet/evaluation/formula/Formula.java | 4 +++- .../isst/configmanager/petrinet/evaluation/formula/TT.java | 3 ++- .../petrinet/evaluation/formula/state/NodeALONG.java | 5 +++-- .../petrinet/evaluation/formula/state/NodeAND.java | 5 +++-- .../petrinet/evaluation/formula/state/NodeEV.java | 5 +++-- .../petrinet/evaluation/formula/state/NodeEXIST_MODAL.java | 5 +++-- .../petrinet/evaluation/formula/state/NodeEXIST_NEXT.java | 5 +++-- .../petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java | 3 ++- .../petrinet/evaluation/formula/state/NodeExpression.java | 2 ++ .../evaluation/formula/state/NodeFORALL_MODAL.java | 3 ++- .../petrinet/evaluation/formula/state/NodeFORALL_NEXT.java | 5 +++-- .../evaluation/formula/state/NodeFORALL_UNTIL.java | 3 ++- .../petrinet/evaluation/formula/state/NodeINV.java | 5 +++-- .../petrinet/evaluation/formula/state/NodeMODAL.java | 3 ++- .../petrinet/evaluation/formula/state/NodeNF.java | 6 ++++-- .../petrinet/evaluation/formula/state/NodeNOT.java | 5 +++-- .../petrinet/evaluation/formula/state/NodeOR.java | 5 +++-- .../petrinet/evaluation/formula/state/NodePOS.java | 5 +++-- .../evaluation/formula/transition/ArcExpression.java | 2 ++ .../evaluation/formula/transition/TransitionAF.java | 7 +++++-- .../evaluation/formula/transition/TransitionALONG.java | 5 +++-- .../evaluation/formula/transition/TransitionAND.java | 5 +++-- .../evaluation/formula/transition/TransitionEV.java | 5 +++-- .../formula/transition/TransitionEXIST_MODAL.java | 5 +++-- .../formula/transition/TransitionEXIST_NEXT.java | 5 +++-- .../formula/transition/TransitionEXIST_UNTIL.java | 3 ++- .../formula/transition/TransitionFORALL_MODAL.java | 3 ++- .../formula/transition/TransitionFORALL_NEXT.java | 5 +++-- .../formula/transition/TransitionFORALL_UNTIL.java | 3 ++- .../evaluation/formula/transition/TransitionINV.java | 5 +++-- .../evaluation/formula/transition/TransitionMODAL.java | 3 ++- .../evaluation/formula/transition/TransitionNOT.java | 5 +++-- .../evaluation/formula/transition/TransitionOR.java | 5 +++-- .../evaluation/formula/transition/TransitionPOS.java | 5 +++-- 36 files changed, 98 insertions(+), 57 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java index b43b1808..8d3d1494 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java @@ -10,12 +10,12 @@ public class CTLEvaluator { public static boolean evaluateNode(StateFormula ctlExpression, Place place){ //TODO base evaluation on place - return ctlExpression.evaluate(); + return ctlExpression.evaluate(place); } public static boolean evaluateTransition(TransitionFormula ctlExpression, Transition transition){ //TODO base evaluation on transition - return ctlExpression.evaluate(); + return ctlExpression.evaluate(transition); } public static boolean evaluate(Formula ctlExpression, Node node){ diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java index da889f46..cb7bcc81 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java @@ -2,6 +2,7 @@ import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.StateFormula; import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFormula; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; public class FF implements StateFormula, TransitionFormula { @@ -10,7 +11,7 @@ public static FF FF(){ } @Override - public boolean evaluate() { + public boolean evaluate(Node node) { return false; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/Formula.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/Formula.java index 0784c066..aa426061 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/Formula.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/Formula.java @@ -1,8 +1,10 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; + public interface Formula { - boolean evaluate(); + boolean evaluate(Node node); String symbol(); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/TT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/TT.java index 0f5bf9f1..dcaa018d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/TT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/TT.java @@ -2,6 +2,7 @@ import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.StateFormula; import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFormula; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; public class TT implements StateFormula, TransitionFormula { @@ -10,7 +11,7 @@ public static TT TT(){ } @Override - public boolean evaluate() { + public boolean evaluate(Node node) { return true; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java index aab922f5..7754311b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeEV.nodeEV; @@ -15,8 +16,8 @@ public static NodeALONG nodeALONG(StateFormula parameter){ private StateFormula parameter; @Override - public boolean evaluate() { - return nodeNOT(nodeEV(nodeNOT(parameter))).evaluate(); + public boolean evaluate(Node node) { + return nodeNOT(nodeEV(nodeNOT(parameter))).evaluate(node); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java index dbd823a8..bd464e99 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; @AllArgsConstructor @@ -12,8 +13,8 @@ public static NodeAND nodeAND(StateFormula parameter1, StateFormula parameter2){ private StateFormula parameter1, parameter2; @Override - public boolean evaluate() { - return parameter1.evaluate() && parameter2.evaluate(); + public boolean evaluate(Node node) { + return parameter1.evaluate(node) && parameter2.evaluate(node); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java index 12d39e94..103afe88 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.TT.TT; @@ -15,8 +16,8 @@ public static NodeEV nodeEV(StateFormula parameter){ private StateFormula parameter; @Override - public boolean evaluate() { - return nodeFORALL_UNTIL(TT(), parameter).evaluate(); + public boolean evaluate(Node node) { + return nodeFORALL_UNTIL(TT(), parameter).evaluate(node); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java index f2846d55..62682849 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java @@ -1,6 +1,7 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFormula; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeAND.nodeAND; @@ -18,8 +19,8 @@ private static NodeEXIST_MODAL nodeEXIST_MODAL(StateFormula parameter1, Transiti private TransitionFormula parameter2; @Override - public boolean evaluate() { - return transitionMODAL(nodeAND(parameter1, nodeMODAL(parameter2))).evaluate(); + public boolean evaluate(Node node) { + return transitionMODAL(nodeAND(parameter1, nodeMODAL(parameter2))).evaluate(node); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java index 774aa0ab..ab1fade2 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeMODAL.nodeMODAL; @@ -14,8 +15,8 @@ public static NodeEXIST_NEXT nodeEXIST_NEXT(StateFormula parameter){ private StateFormula parameter; @Override - public boolean evaluate() { - return nodeMODAL(transitionMODAL(parameter)).evaluate(); + public boolean evaluate(Node node) { + return nodeMODAL(transitionMODAL(parameter)).evaluate(node); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java index c7721be1..a52e6ea3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; @AllArgsConstructor @@ -15,7 +16,7 @@ public static NodeEXIST_UNTIL nodeEXIST_UNTIL(StateFormula parameter1, StateForm //TODO // True if a path exists, where parameter1 is true on each node of the path, // and parameter2 is true on the final node of the path - public boolean evaluate() { + public boolean evaluate(Node node) { return false; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeExpression.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeExpression.java index 3d14aa24..905ee09e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeExpression.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeExpression.java @@ -1,8 +1,10 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; import lombok.AllArgsConstructor; +import lombok.Getter; @AllArgsConstructor +@Getter public class NodeExpression { public static NodeExpression nodeExpression(NodeSubExpression nodeSubExpression, String message){ diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java index 03b2b126..f3ebab7b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java @@ -1,6 +1,7 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFormula; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; @AllArgsConstructor @@ -18,7 +19,7 @@ public static NodeFORALL_MODAL nodeFORALL_MODAL(StateFormula parameter1, Transit // parameter1, must be true for all successor states, parameter2 must // be true for the transitions between the current state and its successors. @Override - public boolean evaluate() { + public boolean evaluate(Node node) { return false; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java index cff01fa7..0ac4adc4 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeNOT.nodeNOT; @@ -14,8 +15,8 @@ public static NodeFORALL_NEXT nodeFORALL_NEXT(StateFormula parameter){ private StateFormula parameter; @Override - public boolean evaluate() { - return nodeNOT(nodeFORALL_NEXT(nodeNOT(parameter))).evaluate(); + public boolean evaluate(Node node) { + return nodeNOT(nodeFORALL_NEXT(nodeNOT(parameter))).evaluate(node); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java index 5daa4356..7f58ce9f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; @AllArgsConstructor @@ -13,7 +14,7 @@ public static NodeFORALL_UNTIL nodeFORALL_UNTIL(StateFormula parameter1, StateFo //TODO like EXIST_UNTIL for all paths @Override - public boolean evaluate() { + public boolean evaluate(Node node) { return false; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java index 43bb3384..67bfd63c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeNOT.nodeNOT; @@ -15,8 +16,8 @@ public static NodeINV nodeINV(StateFormula parameter){ private StateFormula parameter; @Override - public boolean evaluate() { - return nodeNOT(nodePOS(nodeNOT(parameter))).evaluate(); + public boolean evaluate(Node node) { + return nodeNOT(nodePOS(nodeNOT(parameter))).evaluate(node); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java index 5d5a4b67..ef1defbb 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java @@ -1,6 +1,7 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFormula; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; @AllArgsConstructor @@ -15,7 +16,7 @@ public static NodeMODAL nodeMODAL(TransitionFormula parameter){ //TODO // MODAL, is true if parameter evaluates to true for a transition following the current state @Override - public boolean evaluate() { + public boolean evaluate(Node node) { return false; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNF.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNF.java index ef1471bc..66280b79 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNF.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNF.java @@ -1,5 +1,7 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; +import de.fraunhofer.isst.configmanager.petrinet.model.Place; import lombok.AllArgsConstructor; @AllArgsConstructor @@ -12,8 +14,8 @@ public static NodeNF nodeNF(NodeExpression parameter){ private NodeExpression parameter; @Override - public boolean evaluate() { - return false; + public boolean evaluate(Node node) { + return node instanceof Place && parameter.getSubExpression().evaluate((Place) node); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java index 7467be80..5417e5ec 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; @AllArgsConstructor @@ -12,8 +13,8 @@ public static NodeNOT nodeNOT(StateFormula parameter){ private StateFormula parameter; @Override - public boolean evaluate() { - return !parameter.evaluate(); + public boolean evaluate(Node node) { + return !parameter.evaluate(node); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java index 6e2ed873..dfbed573 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; @AllArgsConstructor @@ -12,8 +13,8 @@ public static NodeOR nodeOR(StateFormula parameter1, StateFormula parameter2){ private StateFormula parameter1, parameter2; @Override - public boolean evaluate() { - return parameter1.evaluate() || parameter2.evaluate(); + public boolean evaluate(Node node) { + return parameter1.evaluate(node) || parameter2.evaluate(node); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java index 316577d6..03cc2aed 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.TT.TT; @@ -15,8 +16,8 @@ public static NodePOS nodePOS(StateFormula parameter){ private StateFormula parameter; @Override - public boolean evaluate() { - return nodeEXIST_UNTIL(TT(), parameter).evaluate(); + public boolean evaluate(Node node) { + return nodeEXIST_UNTIL(TT(), parameter).evaluate(node); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/ArcExpression.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/ArcExpression.java index d4e1f78c..b6b01a25 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/ArcExpression.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/ArcExpression.java @@ -1,8 +1,10 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; import lombok.AllArgsConstructor; +import lombok.Getter; @AllArgsConstructor +@Getter public class ArcExpression { public static ArcExpression arcExpression(ArcSubExpression subExpression, String message){ diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java index 6836843c..b479fe05 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java @@ -1,5 +1,8 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; +import de.fraunhofer.isst.configmanager.petrinet.model.Place; +import de.fraunhofer.isst.configmanager.petrinet.model.Transition; import lombok.AllArgsConstructor; @AllArgsConstructor @@ -12,8 +15,8 @@ public static TransitionAF transitionAF(ArcExpression parameter){ private ArcExpression parameter; @Override - public boolean evaluate() { - return false; + public boolean evaluate(Node node) { + return node instanceof Transition && parameter.getSubExpression().evaluate((Transition) node); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java index 73981002..b3dc3211 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionEV.transitionEV; @@ -15,8 +16,8 @@ public static TransitionALONG transitionALONG(TransitionFormula parameter){ private TransitionFormula parameter; @Override - public boolean evaluate() { - return transitionNOT(transitionEV(transitionNOT(parameter))).evaluate(); + public boolean evaluate(Node node) { + return transitionNOT(transitionEV(transitionNOT(parameter))).evaluate(node); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java index 8621eb7f..46bcbf7b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; @AllArgsConstructor @@ -12,8 +13,8 @@ public static TransitionAND transitionAND(TransitionFormula parameter1, Transiti private TransitionFormula parameter1, parameter2; @Override - public boolean evaluate() { - return parameter1.evaluate() && parameter2.evaluate(); + public boolean evaluate(Node node) { + return parameter1.evaluate(node) && parameter2.evaluate(node); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java index 67a10b12..ac19f09a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.TT.TT; @@ -15,8 +16,8 @@ public static TransitionEV transitionEV(TransitionFormula parameter){ private TransitionFormula parameter; @Override - public boolean evaluate() { - return transitionFORALL_UNTIL(TT(), parameter).evaluate(); + public boolean evaluate(Node node) { + return transitionFORALL_UNTIL(TT(), parameter).evaluate(node); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java index 2ddd0f59..82db2c35 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java @@ -1,6 +1,7 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.StateFormula; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeMODAL.nodeMODAL; @@ -18,8 +19,8 @@ private static TransitionEXIST_MODAL transitionEXIST_MODAL(TransitionFormula par private StateFormula parameter2; @Override - public boolean evaluate() { - return nodeMODAL(transitionAND(parameter1,transitionMODAL(parameter2))).evaluate(); + public boolean evaluate(Node node) { + return nodeMODAL(transitionAND(parameter1,transitionMODAL(parameter2))).evaluate(node); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java index 33a3b584..7dba0eac 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeMODAL.nodeMODAL; @@ -14,8 +15,8 @@ public static TransitionEXIST_NEXT transitionEXIST_NEXT(TransitionFormula parame private TransitionFormula parameter; @Override - public boolean evaluate() { - return transitionMODAL(nodeMODAL(parameter)).evaluate(); + public boolean evaluate(Node node) { + return transitionMODAL(nodeMODAL(parameter)).evaluate(node); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java index 1bba9c93..0c2ce67a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; @AllArgsConstructor @@ -15,7 +16,7 @@ public static TransitionEXIST_UNTIL transitionEXIST_UNTIL(TransitionFormula para // True if a path exists, where parameter1 is true on each transition of the path, // and parameter2 is true on the final transition of the path @Override - public boolean evaluate() { + public boolean evaluate(Node node) { return false; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java index 213774f6..22969d53 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java @@ -1,6 +1,7 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.StateFormula; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; @AllArgsConstructor @@ -17,7 +18,7 @@ public static TransitionFORALL_MODAL transitionFORALL_MODAL(TransitionFormula pa // parameter1, must be true for all successor transitions, parameter2 must // be true for the states between the current transition and its successors. @Override - public boolean evaluate() { + public boolean evaluate(Node node) { return false; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java index 9c25e8c2..cd080dc5 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionEXIST_NEXT.transitionEXIST_NEXT; @@ -15,8 +16,8 @@ public static TransitionFORALL_NEXT transitionFORALL_NEXT(TransitionFormula para private TransitionFormula parameter; @Override - public boolean evaluate() { - return transitionNOT(transitionEXIST_NEXT(transitionNOT(parameter))).evaluate(); + public boolean evaluate(Node node) { + return transitionNOT(transitionEXIST_NEXT(transitionNOT(parameter))).evaluate(node); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java index c3c71517..cb4ef7bb 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; @AllArgsConstructor @@ -13,7 +14,7 @@ public static TransitionFORALL_UNTIL transitionFORALL_UNTIL(TransitionFormula pa //TODO like EXIST_UNTIL but requires conditions for all paths @Override - public boolean evaluate() { + public boolean evaluate(Node node) { return false; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java index c9b759c1..3aa17513 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionNOT.transitionNOT; @@ -15,8 +16,8 @@ public static TransitionINV transitionINV(TransitionFormula parameter){ private TransitionFormula parameter; @Override - public boolean evaluate() { - return transitionNOT(transitionPOS(transitionNOT(parameter))).evaluate(); + public boolean evaluate(Node node) { + return transitionNOT(transitionPOS(transitionNOT(parameter))).evaluate(node); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java index d09c4187..75cb8c9d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java @@ -1,6 +1,7 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.StateFormula; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; @AllArgsConstructor @@ -15,7 +16,7 @@ public static TransitionMODAL transitionMODAL(StateFormula parameter){ //TODO // MODAL, is true if parameter evaluates to true for a state following the current transition @Override - public boolean evaluate() { + public boolean evaluate(Node node) { return false; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java index 56824d5b..a535acca 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; @AllArgsConstructor @@ -12,8 +13,8 @@ public static TransitionNOT transitionNOT(TransitionFormula parameter){ private TransitionFormula parameter; @Override - public boolean evaluate() { - return !parameter.evaluate(); + public boolean evaluate(Node node) { + return !parameter.evaluate(node); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java index b68d0685..94d756f5 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; @AllArgsConstructor @@ -12,8 +13,8 @@ public static TransitionOR transitionOR(TransitionFormula parameter1, Transition private TransitionFormula parameter1, parameter2; @Override - public boolean evaluate() { - return parameter1.evaluate() || parameter2.evaluate(); + public boolean evaluate(Node node) { + return parameter1.evaluate(node) || parameter2.evaluate(node); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java index 28a243be..8fbbdd01 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java @@ -1,5 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.TT.TT; @@ -15,8 +16,8 @@ public static TransitionPOS transitionPOS(TransitionFormula parameter){ private TransitionFormula parameter; @Override - public boolean evaluate() { - return transitionEXIST_UNTIL(TT(), parameter).evaluate(); + public boolean evaluate(Node node) { + return transitionEXIST_UNTIL(TT(), parameter).evaluate(node); } @Override From 514689890190af5374b8332b54fe107d414d63f1 Mon Sep 17 00:00:00 2001 From: eakker Date: Fri, 23 Apr 2021 14:38:58 +0200 Subject: [PATCH 101/157] chore: evaluate MODAL operator --- .../petrinet/evaluation/formula/state/NodeMODAL.java | 8 +++++++- .../evaluation/formula/transition/TransitionMODAL.java | 9 ++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java index ef1defbb..d1f853c4 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java @@ -1,7 +1,9 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFormula; +import de.fraunhofer.isst.configmanager.petrinet.model.Arc; import de.fraunhofer.isst.configmanager.petrinet.model.Node; +import de.fraunhofer.isst.configmanager.petrinet.model.Place; import lombok.AllArgsConstructor; @AllArgsConstructor @@ -17,7 +19,11 @@ public static NodeMODAL nodeMODAL(TransitionFormula parameter){ // MODAL, is true if parameter evaluates to true for a transition following the current state @Override public boolean evaluate(Node node) { - return false; + return node instanceof Place && + node.getSourceArcs().stream() + .map(Arc::getTarget) + .map(transition -> parameter.evaluate(transition)) + .reduce(false, (a,b) -> a || b); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java index 75cb8c9d..cf3a1cef 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java @@ -1,7 +1,10 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.StateFormula; +import de.fraunhofer.isst.configmanager.petrinet.model.Arc; import de.fraunhofer.isst.configmanager.petrinet.model.Node; +import de.fraunhofer.isst.configmanager.petrinet.model.Place; +import de.fraunhofer.isst.configmanager.petrinet.model.Transition; import lombok.AllArgsConstructor; @AllArgsConstructor @@ -17,7 +20,11 @@ public static TransitionMODAL transitionMODAL(StateFormula parameter){ // MODAL, is true if parameter evaluates to true for a state following the current transition @Override public boolean evaluate(Node node) { - return false; + return node instanceof Transition && + node.getSourceArcs().stream() + .map(Arc::getTarget) + .map(place -> parameter.evaluate(place)) + .reduce(false, (a,b) -> a || b); } @Override From c8e369311e525d9fc26c325fe14481f3e06d1449 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Mon, 26 Apr 2021 10:16:29 +0200 Subject: [PATCH 102/157] refactor: code refactoring (remove @ApiResponses, protected constructors..) --- .../ConfigmanagerApplication.java | 5 +- .../isst/configmanager/api/AppApi.java | 8 ++- .../isst/configmanager/api/AppRouteApi.java | 45 +++++++--------- .../isst/configmanager/api/BrokerApi.java | 51 ++++++++----------- .../configmanager/api/ConfigModelApi.java | 13 ++--- .../isst/configmanager/api/ConnectorApi.java | 18 +++---- .../api/ConnectorRequestApi.java | 18 +++---- .../isst/configmanager/api/EndpointApi.java | 23 ++++----- .../isst/configmanager/api/ResourceApi.java | 31 +++++------ .../api/ResourceContractApi.java | 13 ++--- .../api/ResourceRepresentationApi.java | 15 +++--- .../isst/configmanager/api/UtilApi.java | 11 ++-- .../ResourceContractController.java | 49 +++++++++++------- .../api/controller/ResourceController.java | 1 - .../api/service/AppRouteService.java | 2 +- .../configmanager/api/service/AppService.java | 4 +- .../api/service/BrokerService.java | 4 +- .../api/service/ConnectorService.java | 2 +- .../api/service/UtilService.java | 6 +-- .../resources/AbstractResourceService.java | 2 +- .../resources/ResourceContractService.java | 10 ++-- .../AbstractDataspaceConnectorClient.java | 2 +- .../util/ResourceMapper.java | 4 +- 23 files changed, 152 insertions(+), 185 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java b/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java index a8d630dc..864bd802 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplication.java @@ -16,7 +16,6 @@ import org.springframework.scheduling.annotation.Scheduled; import java.io.IOException; -import java.io.InputStream; import java.nio.charset.Charset; import java.util.Properties; @@ -49,7 +48,7 @@ public static void main(final String[] args) { public OpenAPI customOpenAPI() throws IOException { final var properties = new Properties(); - try (InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("application.properties")) { + try (var inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("application.properties")) { // This function may crash (e.g. ill-formatted file). Let it bubble up. properties.load(inputStream); } @@ -103,6 +102,8 @@ public void logInfoStillAlive() { final var freeHeapSize = Runtime.getRuntime().freeMemory() / mb; final var threadCount = Thread.activeCount(); + System.gc(); //Called manually as a precaution, so that the GC is eventually executed + if (log.isInfoEnabled()) { log.info("[ConfigManager " + CURRENT_VERSION + "] Heap Size Stats: Used " + Math.toIntExact(currentHeapSize) + " MB - Free " + Math.toIntExact(freeHeapSize) + " MB - Max " + Math.toIntExact(maxHeapSize) + " MB - Running Threads: " + threadCount); log.info("[ConfigManager " + CURRENT_VERSION + "] Waiting for API call..."); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/AppApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/AppApi.java index 4a201c0e..e468c396 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/AppApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/AppApi.java @@ -2,16 +2,14 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; public interface AppApi { @GetMapping(value = "/apps", produces = "application/ld+json") @Operation(summary = "Returns a list of all apps") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Returns a list of custom apps"), - @ApiResponse(responseCode = "400", description = "Could not find customs apps"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) + @ApiResponse(responseCode = "200", description = "Returns a list of custom apps") + @ApiResponse(responseCode = "400", description = "Could not find customs apps") + @ApiResponse(responseCode = "500", description = "Internal server error") ResponseEntity getApps(); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java index 7a6e2eb9..68b1f952 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java @@ -3,7 +3,6 @@ import de.fraunhofer.isst.configmanager.data.enums.RouteDeployMethod; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -18,31 +17,27 @@ public interface AppRouteApi { // Interfaces for managing app routes @PostMapping(value = "/approute", produces = "application/ld+json") @Operation(summary = "Creates a new app route") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Created a new app route"), - @ApiResponse(responseCode = "400", description = "Can not create an app route")}) + @ApiResponse(responseCode = "200", description = "Created a new app route") + @ApiResponse(responseCode = "400", description = "Can not create an app route") ResponseEntity createAppRoute(@RequestParam("description") String description); @DeleteMapping(value = "/approute", produces = "application/ld+json") @Operation(summary = "Deletes the given app route") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully deleted the app route"), - @ApiResponse(responseCode = "400", description = "Can not delete the app route")}) + @ApiResponse(responseCode = "200", description = "Successfully deleted the app route") + @ApiResponse(responseCode = "400", description = "Can not delete the app route") ResponseEntity deleteAppRoute(@RequestParam("routeId") URI routeId); @GetMapping(value = "/approute", produces = "application/ld+json") @Operation(summary = "Returns the given app route") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully get the app route"), - @ApiResponse(responseCode = "400", description = "Can not find the app route"), - @ApiResponse(responseCode = "500", description = "Internal Server error")}) + @ApiResponse(responseCode = "200", description = "Successfully get the app route") + @ApiResponse(responseCode = "400", description = "Can not find the app route") + @ApiResponse(responseCode = "500", description = "Internal Server error") ResponseEntity getAppRoute(@RequestParam("routeId") URI routeId); @PostMapping(value = "/approute/step", produces = "application/ld+json") @Operation(summary = "Creates a new subroute for the app route") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully created a new subroute for the app route"), - @ApiResponse(responseCode = "400", description = "Can not create the route step")}) + @ApiResponse(responseCode = "200", description = "Successfully created a new subroute for the app route") + @ApiResponse(responseCode = "400", description = "Can not create the route step") ResponseEntity createAppRouteStep(@RequestParam(value = "routeId") URI routeId, @RequestParam(value = "startId") URI startId, @RequestParam(value = "startCoordinateX") int startCoordinateX, @@ -54,32 +49,28 @@ ResponseEntity createAppRouteStep(@RequestParam(value = "routeId") URI r @GetMapping(value = "/approute/step/endpoint/info", produces = "application/ld+json") @Operation(summary = "Returns for a route step the specific endpoint information") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully returned for a route step the specific endpoint information"), - @ApiResponse(responseCode = "400", description = "Can not find the endpoint information"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) + @ApiResponse(responseCode = "200", description = "Successfully returned for a route step the specific endpoint information") + @ApiResponse(responseCode = "400", description = "Can not find the endpoint information") + @ApiResponse(responseCode = "500", description = "Internal server error") ResponseEntity getEndpointInformation(@RequestParam(value = "routeId") URI routeId, @RequestParam(value = "endpointId") URI endpointId); // Interfaces for managing deploy methods of the routes @PutMapping(value = "/route/deploymethod", produces = "application/ld+json") @Operation(summary = "Updates the route deploy method for all routes") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully updated the route deploy method"), - @ApiResponse(responseCode = "400", description = "Can not update the route deploy method")}) + @ApiResponse(responseCode = "200", description = "Successfully updated the route deploy method") + @ApiResponse(responseCode = "400", description = "Can not update the route deploy method") ResponseEntity updateRouteDeployMethod(@RequestParam("deployMethod") RouteDeployMethod routeDeployMethod); @GetMapping(value = "/route/deploymethod", produces = "application/ld+json") @Operation(summary = "Returns the route deploy method for all routes") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully returned the route deploy method"), - @ApiResponse(responseCode = "400", description = "Can not find the route deploy method")}) + @ApiResponse(responseCode = "200", description = "Successfully returned the route deploy method") + @ApiResponse(responseCode = "400", description = "Can not find the route deploy method") ResponseEntity getRouteDeployMethod(); @GetMapping(value = "/approutes", produces = "application/ld+json") @Operation(summary = "Returns all app routes") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Returns the list of the app routes"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) + @ApiResponse(responseCode = "200", description = "Returns the list of the app routes") + @ApiResponse(responseCode = "500", description = "Internal server error") ResponseEntity getAppRoutes(); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java index c42bb984..db713611 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java @@ -2,7 +2,6 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -16,76 +15,68 @@ public interface BrokerApi { // APIs to manage custom broker @PostMapping(value = "/broker", produces = "application/ld+json") @Operation(summary = "Creates a new broker") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Created a new broker")}) + @ApiResponse(responseCode = "200", description = "Created a new broker") ResponseEntity createBroker(@RequestParam(value = "brokerUri") URI brokerUri, @RequestParam(value = "title", required = false) String title); @PutMapping(value = "/broker", produces = "application/ld+json") @Operation(summary = "Updates a broker") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Updated the broker"), - @ApiResponse(responseCode = "400", description = "Can not update the broker")}) + @ApiResponse(responseCode = "200", description = "Updated the broker") + @ApiResponse(responseCode = "400", description = "Can not update the broker") ResponseEntity updateBroker(@RequestParam(value = "brokerUri") URI brokerUri, @RequestParam(value = "title", required = false) String title); @DeleteMapping(value = "/broker", produces = "application/ld+json") @Operation(summary = "Deletes a broker") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Deleted the broker"), - @ApiResponse(responseCode = "400", description = "Can not delete the broker")}) + @ApiResponse(responseCode = "200", description = "Deleted the broker") + @ApiResponse(responseCode = "400", description = "Can not delete the broker") ResponseEntity deleteBroker(@RequestParam(value = "brokerUri") URI brokerUri); @GetMapping(value = "/brokers", produces = "application/ld+json") @Operation(summary = "Returns the list of all brokers") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully returned the list of all brokers"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) + @ApiResponse(responseCode = "200", description = "Successfully returned the list of all brokers") + @ApiResponse(responseCode = "500", description = "Internal server error") ResponseEntity getAllBrokers(); @PostMapping(value = "/broker/register", produces = "application/ld+json") @Operation(summary = "Registers the connector with the broker") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully registered the connector with the broker"), - @ApiResponse(responseCode = "400", description = "Can not find the broker to register the connector")}) + @ApiResponse(responseCode = "200", description = "Successfully registered the connector with the broker") + @ApiResponse(responseCode = "400", description = "Can not find the broker to register the connector") ResponseEntity registerConnector(@RequestParam(value = "brokerUri") URI brokerUri); @PostMapping(value = "/broker/unregister", produces = "application/ld+json") @Operation(summary = "Unregisters the connector with the broker") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully unregistered the connector with the broker"), - @ApiResponse(responseCode = "400", description = "Can not find the broker to unregister the connector")}) + @ApiResponse(responseCode = "200", description = "Successfully unregistered the connector with the broker") + @ApiResponse(responseCode = "400", description = "Can not find the broker to unregister the connector") ResponseEntity unregisterConnector(@RequestParam(value = "brokerUri") URI brokerUri); @PostMapping(value = "/broker/update", produces = "application/ld+json") @Operation(summary = "Updates the self description at the broker") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully updated the self description at the broker"), - @ApiResponse(responseCode = "400", description = "Can not find the broker to update the connector"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) + @ApiResponse(responseCode = "200", description = "Successfully updated the self description at the broker") + @ApiResponse(responseCode = "400", description = "Can not find the broker to update the connector") + @ApiResponse(responseCode = "500", description = "Internal server error") ResponseEntity updateConnector(@RequestParam(value = "brokerUri") URI brokerUri); // APIs to manage the resources at broker @PostMapping(value = "/broker/update/resource", produces = "application/ld+json") @Operation(summary = "Updates a resource at the broker") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully updated the resource at the broker"), - @ApiResponse(responseCode = "400", description = "Can not find the broker to update the connector"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) + @ApiResponse(responseCode = "200", description = "Successfully updated the resource at the broker") + @ApiResponse(responseCode = "400", description = "Can not find the broker to update the connector") + @ApiResponse(responseCode = "500", description = "Internal server error") ResponseEntity updateResourceAtBroker(@RequestParam(value = "brokerUri") URI brokerUri, @RequestParam("resourceId") URI resourceId); @PostMapping(value = "/broker/delete/resource", produces = "application/ld+json") @Operation(summary = "Deletes a resource at the broker") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully deleted the resource at the broker"), - @ApiResponse(responseCode = "400", description = "Can not find the broker to update the connector"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) + @ApiResponse(responseCode = "200", description = "Successfully deleted the resource at the broker") + @ApiResponse(responseCode = "400", description = "Can not find the broker to update the connector") + @ApiResponse(responseCode = "500", description = "Internal server error") ResponseEntity deleteResourceAtBroker(@RequestParam(value = "brokerUri") URI brokerUri, @RequestParam("resourceId") URI resourceId); @GetMapping(value = "/broker/resource/information", produces = "application/ld+json") @Operation(summary = "Returns information about registration status for resources") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned information about registration status for resources")}) + @ApiResponse(responseCode = "200", description = "Successfully returned information about registration status for resources") ResponseEntity getRegisterStatusForResource(@RequestParam("resourceId") URI resourceId); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ConfigModelApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConfigModelApi.java index 8fa20b68..709f00cf 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ConfigModelApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConfigModelApi.java @@ -2,7 +2,6 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PutMapping; @@ -14,10 +13,9 @@ public interface ConfigModelApi { @PutMapping(value = "/configmodel") @Operation(summary = "Updates the configuration model") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully updated the configuration model at the client"), - @ApiResponse(responseCode = "400", description = "Can not update the configuration model at the client"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) + @ApiResponse(responseCode = "200", description = "Successfully updated the configuration model at the client") + @ApiResponse(responseCode = "400", description = "Can not update the configuration model at the client") + @ApiResponse(responseCode = "500", description = "Internal server error") ResponseEntity updateConfigModel(@RequestParam(value = "loglevel", required = false) String loglevel, @RequestParam(value = "connectorDeployMode", required = false) String connectorDeployMode, @RequestParam(value = "trustStore", required = false) String trustStore, @@ -32,8 +30,7 @@ ResponseEntity updateConfigModel(@RequestParam(value = "loglevel", requi @GetMapping(value = "/configmodel", produces = "application/ld+json") @Operation(summary = "Get the configuration model") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Succesfully get the configuration model"), - @ApiResponse(responseCode = "400", description = "Can not find the configuration model")}) + @ApiResponse(responseCode = "200", description = "Succesfully get the configuration model") + @ApiResponse(responseCode = "400", description = "Can not find the configuration model") ResponseEntity getConfigModel(); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java index 24d95203..399fb027 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorApi.java @@ -2,7 +2,6 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PutMapping; @@ -13,24 +12,21 @@ public interface ConnectorApi { @GetMapping(value = "/connector", produces = "application/ld+json") @Operation(summary = "Get the Connector-Description") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully retrieved the connector"), - @ApiResponse(responseCode = "404", description = "Can not find a connector description"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) + @ApiResponse(responseCode = "200", description = "Successfully retrieved the connector") + @ApiResponse(responseCode = "404", description = "Can not find a connector description") + @ApiResponse(responseCode = "500", description = "Internal server error") ResponseEntity getConnector(); @GetMapping(value = "/connector/status", produces = "application/ld+json") @Operation(summary = "Get the accessibility-status of the Public Connector Endpoint (Connector Self-description)") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Public connector endpoint reachable."), - @ApiResponse(responseCode = "503", description = "Public connector endpoint not reachable.")}) + @ApiResponse(responseCode = "200", description = "Public connector endpoint reachable.") + @ApiResponse(responseCode = "503", description = "Public connector endpoint not reachable.") ResponseEntity getConnectorStatus(); @PutMapping(value = "/connector", produces = "application/ld+json") @Operation(summary = "Update a connector") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully updated the connector description of the configuration model"), - @ApiResponse(responseCode = "400", description = "Failed to update the connector. The configuration model is not valid")}) + @ApiResponse(responseCode = "200", description = "Successfully updated the connector description of the configuration model") + @ApiResponse(responseCode = "400", description = "Failed to update the connector. The configuration model is not valid") ResponseEntity updateConnector(@RequestParam(value = "title", required = false) String title, @RequestParam(value = "description", required = false) String description, @RequestParam(value = "endpoint", required = false) URI endpoint, diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java index 59dd4f59..5a39e7f1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ConnectorRequestApi.java @@ -3,7 +3,6 @@ import de.fraunhofer.isst.configmanager.data.util.QueryInput; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -15,27 +14,24 @@ public interface ConnectorRequestApi { @PostMapping(value = "/request/description") @Operation(summary = "Request metadata from another IDS connector.") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully requested metadata from IDS connector"), - @ApiResponse(responseCode = "400", description = "Can not request metadata from IDS connector"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) + @ApiResponse(responseCode = "200", description = "Successfully requested metadata from IDS connector") + @ApiResponse(responseCode = "400", description = "Can not request metadata from IDS connector") + @ApiResponse(responseCode = "500", description = "Internal server error") ResponseEntity requestMetadata(@RequestParam("recipientId") URI recipientId, @RequestParam(value = "requestedResourceId", required = false) URI requestedResourceId); @PostMapping(value = "/request/contract", produces = "application/ld+json") @Operation(summary = "Send a contract request to another IDS connector.") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully send a contract request to another IDS connector"), - @ApiResponse(responseCode = "400", description = "Can not return the contract agreement id")}) + @ApiResponse(responseCode = "200", description = "Successfully send a contract request to another IDS connector") + @ApiResponse(responseCode = "400", description = "Can not return the contract agreement id") ResponseEntity requestContract(@RequestParam("recipientId") URI recipientId, @RequestParam(value = "requestedArtifactId ") URI requestedArtifactId, @RequestBody(required = false) String contractOffer); @PostMapping(value = "/request/artifact") @Operation(summary = "Request data from another IDS connector.") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully requested data from another IDS connector"), - @ApiResponse(responseCode = "400", description = "Can not request data from IDS connector")}) + @ApiResponse(responseCode = "200", description = "Successfully requested data from another IDS connector") + @ApiResponse(responseCode = "400", description = "Can not request data from IDS connector") ResponseEntity requestData(@RequestParam("recipientId") URI recipientId, @RequestParam(value = "requestedArtifactId ") URI requestedArtifactId, @RequestParam(value = "contractId", required = false) URI contractId, diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java index 475407b5..697cad24 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java @@ -2,7 +2,6 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -15,32 +14,28 @@ public interface EndpointApi { @PostMapping(value = "/generic/endpoint", produces = "application/ld+json") @Operation(summary = "Creates a generic endpoint") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Created a generic endpoint"), - @ApiResponse(responseCode = "400", description = "Can not create the generic endpoint")}) + @ApiResponse(responseCode = "200", description = "Created a generic endpoint") + @ApiResponse(responseCode = "400", description = "Can not create the generic endpoint") ResponseEntity createGenericEndpoint(@RequestParam(value = "accessURL") URI accessURL, @RequestParam(value = "username", required = false) String username, @RequestParam(value = "password", required = false) String password); @GetMapping(value = "/generic/endpoints", produces = "application/ld+json") @Operation(summary = "Returns a list of generic endpoints") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Returned a list of generic endpoints"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) + @ApiResponse(responseCode = "200", description = "Returned a list of generic endpoints") + @ApiResponse(responseCode = "500", description = "Internal server error") ResponseEntity getGenericEndpoints(); @DeleteMapping(value = "/generic/endpoint", produces = "application/ld+json") @Operation(summary = "Deletes a generic endpoint") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Deleted a generic endpoint"), - @ApiResponse(responseCode = "400", description = "Can not delete the generic endpoint")}) + @ApiResponse(responseCode = "200", description = "Deleted a generic endpoint") + @ApiResponse(responseCode = "400", description = "Can not delete the generic endpoint") ResponseEntity deleteGenericEndpoint(@RequestParam(value = "endpointId") URI endpointId); @PutMapping(value = "/generic/endpoint", produces = "application/ld+json") @Operation(summary = "Updates a generic endpoint") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Updated a generic endpoint"), - @ApiResponse(responseCode = "400", description = "Can not update the generic endpoint")}) + @ApiResponse(responseCode = "200", description = "Updated a generic endpoint") + @ApiResponse(responseCode = "400", description = "Can not update the generic endpoint") ResponseEntity updateGenericEndpoint(@RequestParam(value = "id") URI id, @RequestParam(value = "accessURL", required = false) URI accessURL, @RequestParam(value = "username", required = false) String username, @@ -48,6 +43,6 @@ ResponseEntity updateGenericEndpoint(@RequestParam(value = "id") URI id, @PostMapping(value = "/connector/endpoint", produces = "application/ld+json") @Operation(summary = "Creates a new connector endpoint for the connector") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully created the connector endpoint for the connector")}) + @ApiResponse(responseCode = "200", description = "Successfully created the connector endpoint for the connector") ResponseEntity createConnectorEndpoint(@RequestParam("accessUrl") URI accessUrl); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java index 38664ffb..2a2b1e03 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java @@ -2,7 +2,6 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -16,27 +15,25 @@ public interface ResourceApi { @GetMapping(value = "/resource", produces = "application/ld+json") @Operation(summary = "Returns the specific resource from the connector") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully returned the specifc resource from the connector"), - @ApiResponse(responseCode = "400", description = "Can not find the resource"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) + @ApiResponse(responseCode = "200", description = "Successfully returned the specifc resource from the connector") + @ApiResponse(responseCode = "400", description = "Can not find the resource") + @ApiResponse(responseCode = "500", description = "Internal server error") ResponseEntity getResource(@RequestParam(value = "resourceId") URI resourceId); @GetMapping(value = "/resources", produces = "application/ld+json") @Operation(summary = "Returns all resources from the connector") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned all resources from the connector")}) + @ApiResponse(responseCode = "200", description = "Successfully returned all resources from the connector") ResponseEntity getResources(); @GetMapping(value = "/resources/requested", produces = "application/ld+json") @Operation(summary = "Returns all requested resources from the connector") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully returned all requested resources from the connector")}) + @ApiResponse(responseCode = "200", description = "Successfully returned all requested resources from the connector") ResponseEntity getRequestedResources(); @PostMapping(value = "/resource", produces = "application/ld+json") @Operation(summary = "Creates a resource for the connector") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully created a resource for the connector"), - @ApiResponse(responseCode = "400", description = "Can not create the resource")}) + @ApiResponse(responseCode = "200", description = "Successfully created a resource for the connector") + @ApiResponse(responseCode = "400", description = "Can not create the resource") ResponseEntity createResource(@RequestParam("title") String title, @RequestParam("description") String description, @RequestParam("language") String language, @@ -47,11 +44,10 @@ ResponseEntity createResource(@RequestParam("title") String title, @PutMapping(value = "/resource", produces = "application/ld+json") @Operation(summary = "Updates the specific resource at the connector") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully updated the specific resource at the connector"), - @ApiResponse(responseCode = "400", description = "Validation failed. Can not update the resource"), - @ApiResponse(responseCode = "404", description = "Can not find the resource"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) + @ApiResponse(responseCode = "200", description = "Successfully updated the specific resource at the connector") + @ApiResponse(responseCode = "400", description = "Validation failed. Can not update the resource") + @ApiResponse(responseCode = "404", description = "Can not find the resource") + @ApiResponse(responseCode = "500", description = "Internal server error") ResponseEntity updateResource(@RequestParam("resourceId") URI resourceId, @RequestParam(value = "title", required = false) String title, @RequestParam(value = "description", required = false) String description, @@ -63,8 +59,7 @@ ResponseEntity updateResource(@RequestParam("resourceId") URI resourceId @DeleteMapping(value = "/resource") @Operation(summary = "Deletes the specific resource from the connector") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully deleted the specific resource from the connector"), - @ApiResponse(responseCode = "400", description = "Can not delete the resource")}) + @ApiResponse(responseCode = "200", description = "Successfully deleted the specific resource from the connector") + @ApiResponse(responseCode = "400", description = "Can not delete the resource") ResponseEntity deleteResource(@RequestParam(value = "resourceId") URI resourceId); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java index 25582822..e205fdc8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceContractApi.java @@ -3,7 +3,6 @@ import de.fraunhofer.isst.configmanager.data.enums.UsagePolicyName; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -14,18 +13,16 @@ public interface ResourceContractApi { @PutMapping(value = "/resource/contract", produces = "application/ld+json") @Operation(summary = "Updates the contract in a resource") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully updated the contract in the resource"), - @ApiResponse(responseCode = "400", description = "Can not update the resource contract"), - @ApiResponse(responseCode = "500", description = "Internal server error")}) + @ApiResponse(responseCode = "200", description = "Successfully updated the contract in the resource") + @ApiResponse(responseCode = "400", description = "Can not update the resource contract") + @ApiResponse(responseCode = "500", description = "Internal server error") ResponseEntity updateResourceContract(@RequestParam("resourceId") URI resourceId, @RequestBody String contractJson); @PutMapping(value = "/resource/contract/update", produces = "application/ld+json") @Operation(summary = "Updates the contract in a resource") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully updated the contract in the resource"), - @ApiResponse(responseCode = "400", description = "Can not update the resource contract")}) + @ApiResponse(responseCode = "200", description = "Successfully updated the contract in the resource") + @ApiResponse(responseCode = "400", description = "Can not update the resource contract") ResponseEntity updateContractForResource(@RequestParam("resourceId") URI resourceId, @RequestParam("pattern") UsagePolicyName usagePolicyName, @RequestBody(required = false) String contractJson); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java index 16625391..6b05152a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceRepresentationApi.java @@ -2,7 +2,6 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; @@ -13,10 +12,9 @@ public interface ResourceRepresentationApi { @PostMapping(value = "/resource/representation", produces = "application/ld+json") @Operation(summary = "Creates a representation for a resource") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully created a representation for a resource"), - @ApiResponse(responseCode = "400", description = "Can not create the resource representation"), - @ApiResponse(responseCode = "404", description = "Can not find the resource to create the representation")}) + @ApiResponse(responseCode = "200", description = "Successfully created a representation for a resource") + @ApiResponse(responseCode = "400", description = "Can not create the resource representation") + @ApiResponse(responseCode = "404", description = "Can not find the resource to create the representation") ResponseEntity createResourceRepresentation(@RequestParam("resourceId") URI resourceId, @RequestParam("endpointId") URI endpointId, @RequestParam("language") String language, @@ -26,10 +24,9 @@ ResponseEntity createResourceRepresentation(@RequestParam("resourceId") @PutMapping(value = "/resource/representation", produces = "application/ld+json") @Operation(summary = "Updates the representation for a resource") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully updated the representation for a resource"), - @ApiResponse(responseCode = "400", description = "Can not update the resource representation"), - @ApiResponse(responseCode = "404", description = "Can not find the resource to update the representation")}) + @ApiResponse(responseCode = "200", description = "Successfully updated the representation for a resource") + @ApiResponse(responseCode = "400", description = "Can not update the resource representation") + @ApiResponse(responseCode = "404", description = "Can not find the resource to update the representation") ResponseEntity updateResourceRepresentation(@RequestParam("resourceId") URI resourceId, @RequestParam(value = "representationId") URI representationId, @RequestParam(value = "endpointId") URI endpointId, diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/UtilApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/UtilApi.java index 76308418..6e4eeab8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/UtilApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/UtilApi.java @@ -2,7 +2,6 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -12,15 +11,13 @@ public interface UtilApi { @GetMapping(value = "/api/ui/enum/{enumName}") @Operation(summary = "Get the specific enum") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully get the enums"), - @ApiResponse(responseCode = "400", description = "Can not find the enums")}) + @ApiResponse(responseCode = "200", description = "Successfully get the enums") + @ApiResponse(responseCode = "400", description = "Can not find the enums") ResponseEntity getSpecificEnum(@PathVariable String enumName); @PostMapping(value = "/policy-pattern") @Operation(summary = "Get pattern of policy") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "Successfully get the pattern of policy"), - @ApiResponse(responseCode = "400", description = "Can not find the policy pattern")}) + @ApiResponse(responseCode = "200", description = "Successfully get the pattern of policy") + @ApiResponse(responseCode = "400", description = "Can not find the policy pattern") ResponseEntity getPolicyPattern(@RequestBody String policy); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java index 81d07304..9760e38f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceContractController.java @@ -13,6 +13,7 @@ import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; import net.minidev.json.JSONObject; +import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -71,23 +72,11 @@ public ResponseEntity updateResourceContract(final URI resourceId, final if (contractOffer != null) { final var jsonObject = new JSONObject(); - try { - jsonObject.put("resourceID", resourceId.toString()); - jsonObject.put("contractID", contractOffer.getId().toString()); - - final var clientResponse = client.updateResourceContract(resourceId.toString(), contractJson); - - resourceContractService.updateResourceContractInAppRoute(resourceId, contractOffer); - - jsonObject.put("connectorResponse", clientResponse); - response = ResponseEntity.ok(jsonObject.toJSONString()); - } catch (IOException e) { - if (log.isErrorEnabled()) { - log.error(e.getMessage(), e); - } - jsonObject.put("message", "Problems while updating the contract at the connector"); - response = ResponseEntity.badRequest().body(jsonObject.toJSONString()); - } + response = updateResourceContract( + resourceId, + contractJson, + contractOffer, + jsonObject); } else { response = ResponseEntity.badRequest().body("Could not update the resource contract"); } @@ -102,6 +91,32 @@ public ResponseEntity updateResourceContract(final URI resourceId, final return response; } + @NotNull + private ResponseEntity updateResourceContract(final URI resourceId, + final String contractJson, + final ContractOffer contractOffer, + final JSONObject jsonObject) { + ResponseEntity response; + try { + jsonObject.put("resourceID", resourceId.toString()); + jsonObject.put("contractID", contractOffer.getId().toString()); + + final var clientResponse = client.updateResourceContract(resourceId.toString(), contractJson); + + resourceContractService.updateResourceContractInAppRoute(resourceId, contractOffer); + + jsonObject.put("connectorResponse", clientResponse); + response = ResponseEntity.ok(jsonObject.toJSONString()); + } catch (IOException e) { + if (log.isErrorEnabled()) { + log.error(e.getMessage(), e); + } + jsonObject.put("message", "Problems while updating the contract at the connector"); + response = ResponseEntity.badRequest().body(jsonObject.toJSONString()); + } + return response; + } + /** * @param resourceId id of the resource * @param usagePolicyName the pattern of the contract diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java index 9dd3cf71..b5dd003f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java @@ -244,7 +244,6 @@ public ResponseEntity updateResource(final URI resourceId, if (updatedResource != null) { final var clientResponse = client.updateResource(resourceId, updatedResource); if (clientResponse.isSuccessful()) { - //TODO move broker registrations to a parallel thread so it won't slow down response times final var registered = brokerService.getRegisStatusForResource(resourceId); registered.iterator().forEachRemaining(elem -> { final var asJsonObject = (JSONObject) elem; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java index 7b31060e..8fc066b3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java @@ -104,7 +104,7 @@ public AppRoute createAppRoute(final String description) { * @return true, if app route is deleted */ public boolean deleteAppRoute(final URI routeId) { - boolean deleted = false; + var deleted = false; final var appRoute = getAppRoute(routeId); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java index 2d836251..9169d78c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java @@ -50,14 +50,14 @@ public AppService(final CustomAppRepository customAppRepository) throws URISynta final List customAppEndpoints = new ArrayList<>(); final var appEndpoint = Utility.createAppEndpoint(AppEndpointType.INPUT_ENDPOINT, - new BigInteger("80"), "documentation", "information", + BigInteger.valueOf(80), "documentation", "information", "http://app1", "iPath", "oPath", Language.DE, "PDF", "path"); final var customAppEndpoint = new CustomAppEndpoint(appEndpoint); final var appEndpoint2 = Utility.createAppEndpoint(AppEndpointType.OUTPUT_ENDPOINT, - new BigInteger("81"), + BigInteger.valueOf(81), "documentation", "information", "http://app2", "iPath", "oPath", Language.DE, "JSON", "path"); final var customAppEndpoint2 = new CustomAppEndpoint(appEndpoint2); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java index 26687b1e..afc4b7d1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java @@ -72,7 +72,7 @@ public void createCustomBroker(final URI brokerUri, final String title) { * @return true, when broker is updated */ public boolean updateBroker(final URI brokerUri, final String title) { - boolean updated = false; + var updated = false; final var broker = getById(brokerUri); if (broker != null) { @@ -93,7 +93,7 @@ public boolean updateBroker(final URI brokerUri, final String title) { * @return true, if broker is deleted */ public boolean deleteBroker(final URI id) { - boolean deleted = false; + var deleted = false; final var customBroker = getById(id); if (customBroker != null) { customBrokerRepository.delete(customBroker); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java index 88d49218..007aecae 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java @@ -77,7 +77,7 @@ public boolean updateConnector(final String title, final String inboundModelVersion, final String outboundModelVersion) { - boolean updated = false; + var updated = false; final var connector = (BaseConnectorImpl) configModelService.getConfigModel().getConnectorDescription(); if (connector != null) { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java index 7113e9d2..7d09c2f3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/UtilService.java @@ -191,8 +191,8 @@ private JSONArray sortJsonArray(final JSONArray jsonArray) { @Override public int compare(final JSONObject a, final JSONObject b) { - String str1 = ""; - String str2 = ""; + var str1 = ""; + var str2 = ""; try { str1 = (String) a.get(KEY_NAME); str2 = (String) b.get(KEY_NAME); @@ -203,7 +203,7 @@ public int compare(final JSONObject a, final JSONObject b) { } }); - for (int i = 0; i < jsonArray.size(); i++) { + for (var i = 0; i < jsonArray.size(); i++) { sortedJsonArray.add(i, jsonObjects.get(i)); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/AbstractResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/AbstractResourceService.java index b16530a4..ccbca704 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/AbstractResourceService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/AbstractResourceService.java @@ -25,7 +25,7 @@ public abstract class AbstractResourceService { transient DefaultConnectorClient connectorClient; @Autowired - public AbstractResourceService(final ConfigModelService configModelService, + protected AbstractResourceService(final ConfigModelService configModelService, final DefaultConnectorClient connectorClient) { this.configModelService = configModelService; this.connectorClient = connectorClient; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java index 005a56aa..a73b51d1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractService.java @@ -143,24 +143,24 @@ public ContractOffer getContractOffer(final UsagePolicyName usagePolicyName, fin final var pipEndpoint = jsonNode.get("pipendpoint").asText(); contractOffer = resourceContractBuilder.buildNTimesUsage(binaryOperator, number, pipEndpoint); - break; } + break; case DURATION_USAGE: if (contractJson != null && !contractJson.equals("{}")) { final var jsonNode = resourceContractBuilder.getJsonNodeFromContract(contractJson); final var number = jsonNode.get("number").asText(); contractOffer = resourceContractBuilder.buildDurationUsage(number); - break; } + break; case USAGE_NOTIFICATION: if (contractJson != null && !contractJson.equals("{}")) { final var jsonNode = resourceContractBuilder.getJsonNodeFromContract(contractJson); final var url = jsonNode.get("url").asText(); contractOffer = resourceContractBuilder.buidUsageNotification(url); - break; } + break; case USAGE_LOGGING: contractOffer = resourceContractBuilder.buildUsageLogging(); break; @@ -172,8 +172,8 @@ public ContractOffer getContractOffer(final UsagePolicyName usagePolicyName, fin final var toDate = jsonNode.get("toDate").asText(); contractOffer = resourceContractBuilder.buildUsageDuringInterval(fromDate, toDate); - break; } + break; case USAGE_UNTIL_DELETION: if (contractJson != null && !contractJson.equals("{}")) { final var jsonNode = resourceContractBuilder.getJsonNodeFromContract(contractJson); @@ -182,8 +182,8 @@ public ContractOffer getContractOffer(final UsagePolicyName usagePolicyName, fin final var deletionDate = jsonNode.get("deletionDate").asText(); contractOffer = resourceContractBuilder.buildUsageUntilDeletion(startDate, endDate, deletionDate); - break; } + break; default: break; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/AbstractDataspaceConnectorClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/AbstractDataspaceConnectorClient.java index abeb0281..778996d5 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/AbstractDataspaceConnectorClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/AbstractDataspaceConnectorClient.java @@ -35,7 +35,7 @@ public abstract class AbstractDataspaceConnectorClient { String connectorBaseUrl = ""; - public AbstractDataspaceConnectorClient(final ResourceMapper dataSpaceConnectorResourceMapper) { + protected AbstractDataspaceConnectorClient(final ResourceMapper dataSpaceConnectorResourceMapper) { this.dataSpaceConnectorResourceMapper = dataSpaceConnectorResourceMapper; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java index d66d2d56..9912f095 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java @@ -100,11 +100,13 @@ private List mapRepresentations(final List Date: Mon, 26 Apr 2021 10:41:26 +0200 Subject: [PATCH 103/157] refactor: make use of isEmpty --- .../isst/configmanager/api/service/AppRouteService.java | 4 ++-- .../isst/configmanager/api/service/ConfigModelService.java | 2 +- .../api/service/resources/ResourceRepresentationService.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java index 8fc066b3..cbdfa4e4 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java @@ -255,7 +255,7 @@ private Endpoint getEndpoint(final URI endpointId) { } } // Search endpoint in the backend repository and in list of connector endpoints - if (endpoint == null && endpointService.getGenericEndpoints().size() != 0 && endpointId.toString().contains("genericEndpoint")) { + if (endpoint == null && !endpointService.getGenericEndpoints().isEmpty() && endpointId.toString().contains("genericEndpoint")) { final var genericEndpoint = endpointService.getGenericEndpoint(endpointId); if (genericEndpoint != null) { @@ -263,7 +263,7 @@ private Endpoint getEndpoint(final URI endpointId) { } } - if (endpoint == null && configModelService.getConfigModel().getConnectorDescription().getHasEndpoint().size() != 0 + if (endpoint == null && !configModelService.getConfigModel().getConnectorDescription().getHasEndpoint().isEmpty() && endpointId.toString().contains("connectorEndpoint")) { endpoint = configModelService.getConfigModel().getConnectorDescription().getHasEndpoint() diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java index 6fb71058..ffa115c1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java @@ -61,7 +61,7 @@ public ConfigModelService(final ConfigModelRepository configModelRepository, + "available! Error establishing connection to connector: " + e.getMessage()); } - if (configModelRepository.findAll().size() > 0) { + if (!configModelRepository.findAll().isEmpty()) { configModelObject = configModelRepository.findAll().get(0); } else { if (log.isWarnEnabled()) { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java index 5e75f67e..5502b6db 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java @@ -77,7 +77,7 @@ public void updateBackendConnection(final URI resourceId, final URI endpointId) } // Set first entry of endpoint informations to the new endpoint - if (endpointInformationRepository.findAll().size() > 0) { + if (!endpointInformationRepository.findAll().isEmpty()) { final var endpointInfo = endpointInformationRepository.findAll().get(0); endpointInfo.setEndpointId(endpointId.toString()); endpointInformationRepository.saveAndFlush(endpointInfo); From 273fd0dbec9ea65092edb4ba13c4fa27e68e828b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Mon, 26 Apr 2021 12:34:10 +0200 Subject: [PATCH 104/157] fix: logging info --- .../controller/ResourceRepresentationController.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java index 2f611894..45920608 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java @@ -67,12 +67,10 @@ public ResponseEntity createResourceRepresentation(final URI resourceId, final URI endpointId, final String language, final String filenameExtension, - final Long bytesize, - final String sourceType) { + final Long bytesize) { if (log.isInfoEnabled()) { log.info(">> POST /resource/representation resourceId: " + resourceId + " endpointId: " + endpointId + " language: " + language - + " filenameExtension: " + filenameExtension + " bytesize: " + bytesize - + " sourceType: " + sourceType); + + " filenameExtension: " + filenameExtension + " bytesize: " + bytesize); } ResponseEntity response; @@ -130,11 +128,11 @@ public ResponseEntity updateResourceRepresentation(final URI resourceId, final URI endpointId, final String language, final String filenameExtension, - final Long bytesize) + final Long bytesize){ if (log.isInfoEnabled()) { log.info(">> PUT /resource/representation resourceId: " + resourceId + " representationId: " + representationId + " endpointId: " + endpointId + " language: " + language + " filenameExtension: " - + filenameExtension + " bytesize: " + bytesize + " sourceType: " + sourceType); + + filenameExtension + " bytesize: " + bytesize); } ResponseEntity response = null; From 66414937014c880791103445fc50de94e080fcee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Mon, 26 Apr 2021 12:37:14 +0200 Subject: [PATCH 105/157] fix: small changes --- .../java/de/fraunhofer/isst/configmanager/api/EndpointApi.java | 2 +- .../isst/configmanager/api/controller/EndpointController.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java index 1ec16ff1..98e5c503 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java @@ -45,6 +45,6 @@ ResponseEntity updateGenericEndpoint(@RequestParam(value = "id") URI id, @PostMapping(value = "/connector/endpoint", produces = "application/ld+json") @Operation(summary = "Creates a new connector endpoint for the connector") - @ApiResponses({@ApiResponse(responseCode = "200", description = "Successfully created the connector endpoint for the connector")}) + @ApiResponse(responseCode = "200", description = "Successfully created the connector endpoint for the connector") ResponseEntity createConnectorEndpoint(@RequestParam("accessUrl") URI accessUrl, @RequestParam(value = "sourceType", required = false) String sourceType); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java index 0e8f7bf7..51943ec3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java @@ -172,7 +172,7 @@ public ResponseEntity updateGenericEndpoint(final URI endpointId, */ public ResponseEntity createConnectorEndpoint(final URI accessUrl, final String sourceType) { if (log.isInfoEnabled()) { - log.info(">> POST /connector/endpoint accessUrl: " + accessUrl + " sourceType: " + sourceType) + log.info(">> POST /connector/endpoint accessUrl: " + accessUrl + " sourceType: " + sourceType); } final var configModelImpl = (ConfigurationModelImpl) configModelService.getConfigModel(); From ae5785ce58a0b770c449fcd5a9a366ba4693afff Mon Sep 17 00:00:00 2001 From: omar Date: Tue, 27 Apr 2021 10:21:06 +0200 Subject: [PATCH 106/157] docs: ResourceController --- .../configmanager/api/controller/ResourceController.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java index b5dd003f..8585e4cd 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java @@ -100,6 +100,11 @@ public ResponseEntity getResources() { return ResponseEntity.ok(resourceService.getOfferedResourcesAsJsonString()); } + /** + * This method returns a http response with all requested resources + * + * @return response with requested resources from the connector + */ @Override public ResponseEntity getRequestedResources() { if (log.isInfoEnabled()) { From 8e413631140d45fd83eb5cc6d67998ffb3c513f4 Mon Sep 17 00:00:00 2001 From: omar Date: Tue, 27 Apr 2021 11:07:58 +0200 Subject: [PATCH 107/157] docs: add docs to ResourceContractBuilder --- .../resources/ResourceContractBuilder.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java index 53683970..e44d9f80 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java @@ -22,9 +22,19 @@ import java.net.URI; import java.util.Objects; +/** + * This class builds ContractOffer objects + */ @Service public class ResourceContractBuilder { + /** + * This method creates a usage until deletion ContractOffer + * @param startDate start date of contract + * @param endDate end date of contract + * @param deletionDate deletion date of contract + * @return ContractOffer object with a usage until deletion policy + */ public ContractOffer buildUsageUntilDeletion(final String startDate, final String endDate, final String deletionDate) { @@ -57,6 +67,12 @@ public ContractOffer buildUsageUntilDeletion(final String startDate, .build(); } + /** + * This method creates a usage during interval ContractOffer + * @param fromDate permission is valid after fromDate + * @param toDate permission is valid before toDate + * @return ContractOffer object with a usage during interval policy + */ public ContractOffer buildUsageDuringInterval(final String fromDate, final String toDate) { return new ContractOfferBuilder() @@ -79,6 +95,10 @@ public ContractOffer buildUsageDuringInterval(final String fromDate, .build(); } + /** + * This method creates a logging ContractOffer + * @return ContractOffer object with logging PostDuty + */ public ContractOffer buildUsageLogging() { return new ContractOfferBuilder() ._permission_(Util.asList(new PermissionBuilder() @@ -92,6 +112,11 @@ public ContractOffer buildUsageLogging() { .build(); } + /** + * This method create a usage notification ContractOffer + * @param url url to where usage should be notified + * @return ContractOffer object with usage notification policy + */ public ContractOffer buidUsageNotification(final String url) { return new ContractOfferBuilder() ._permission_(Util.asList(new PermissionBuilder() @@ -111,6 +136,11 @@ public ContractOffer buidUsageNotification(final String url) { .build(); } + /** + * This method creates a duration usage ContractOffer + * @param number usage duration time + * @return ContractOffer object with duration usage policy + */ public ContractOffer buildDurationUsage(final String number) { return new ContractOfferBuilder() ._permission_(Util.asList(new PermissionBuilder() @@ -126,6 +156,11 @@ public ContractOffer buildDurationUsage(final String number) { .build(); } + /** + * This method reads a jsonNode and returns the corresponding BinaryOperator + * @param jsonNode jsonNode to parse + * @return BinaryOperator + */ @NotNull public BinaryOperator getBinaryOperator(final JsonNode jsonNode) { final var operator = jsonNode.get("binaryoperator").asText(); @@ -141,6 +176,13 @@ public BinaryOperator getBinaryOperator(final JsonNode jsonNode) { return binaryOperator; } + /** + * This method creates a n times usage ContractOffer + * @param binaryOperator operator for the constraint + * @param number how many times the usage should be allowed + * @param pipEndpoint PIP endpoint of constraint + * @return ContractOffer object with n times usage policy + */ public ContractOffer buildNTimesUsage(final BinaryOperator binaryOperator, final String number, final String pipEndpoint) { @@ -160,6 +202,10 @@ public ContractOffer buildNTimesUsage(final BinaryOperator binaryOperator, .build(); } + /** + * This method creates a prohibit access contract offer + * @return ContractOffer with prohibition of access + */ public ContractOffer buildProhibitAccess() { return new ContractOfferBuilder() ._prohibition_(Util.asList(new ProhibitionBuilder() @@ -170,6 +216,10 @@ public ContractOffer buildProhibitAccess() { .build(); } + /** + * This method creates a provide access contract offer + * @return ContractOffer with access permission + */ public ContractOffer buildProvideAccess() { return new ContractOfferBuilder() ._permission_(Util.asList(new PermissionBuilder() From 4d4db221605c2e31403737ce88d6732582175754 Mon Sep 17 00:00:00 2001 From: omar Date: Tue, 27 Apr 2021 13:09:09 +0200 Subject: [PATCH 108/157] docs: update docs for BrokerService --- .../configmanager/api/service/BrokerService.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java index afc4b7d1..a05efdd7 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java @@ -138,6 +138,11 @@ public void setBrokerStatus(final URI brokerId, final BrokerRegistrationStatus b } } + /** + * This method registers resources at a broker + * + * @param brokerId broker uri + */ public void sentSelfDescToBroker(final URI brokerId) { final var customBroker = getById(brokerId); customBroker.setRegisteredResources( @@ -147,6 +152,11 @@ public void sentSelfDescToBroker(final URI brokerId) { customBrokerRepository.save(customBroker); } + /** + * This methods unregisters the resources at a broker + * + * @param brokerId broker uri + */ public void unregisteredAtBroker(final URI brokerId) { final var customBroker = getById(brokerId); customBroker.setRegisteredResources(new ArrayList<>()); @@ -211,6 +221,8 @@ public JSONArray getRegisStatusForResource(final URI resourceId) { } /** + * This method returns a JSONArray with the currently registered brokers + * * @return json array of all registered broker */ public JSONArray getRegisteredBroker() { From 83e7d59f466208c3f1627009993024005e81f6cf Mon Sep 17 00:00:00 2001 From: eakker Date: Wed, 28 Apr 2021 09:00:15 +0200 Subject: [PATCH 109/157] feat: add possibility to calcuate all possible paths of a petrinet --- .../petrinet/simulator/NetArc.java | 8 +- .../petrinet/simulator/PetriNetSimulator.java | 73 ++++++++++++++++++- .../petrinet/simulator/StepGraph.java | 5 +- .../builder/InfomodelPetriNetBuilderTest.java | 1 + 4 files changed, 81 insertions(+), 6 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/NetArc.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/NetArc.java index 34e02a48..090a730d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/NetArc.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/NetArc.java @@ -1,17 +1,21 @@ package de.fraunhofer.isst.configmanager.petrinet.simulator; import de.fraunhofer.isst.configmanager.petrinet.model.PetriNet; +import de.fraunhofer.isst.configmanager.petrinet.model.Transition; import lombok.Getter; +import java.net.URI; + /** * Arc connecting Steps in a PetriNet execution inside the {@link StepGraph} */ @Getter public class NetArc { - public NetArc(PetriNet source, PetriNet target){ + public NetArc(PetriNet source, PetriNet target, URI usedTransition){ this.source = source; this.target = target; + this.usedTransition = usedTransition; } /** @@ -25,4 +29,6 @@ public NetArc(PetriNet source, PetriNet target){ */ private PetriNet target; + private URI usedTransition; + } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java index e19d6ea6..61b32cb3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java @@ -55,7 +55,7 @@ private static boolean makeStep(PetriNet petriNet){ * @param petriNet the initial PetriNet */ public static void simulateNet(PetriNet petriNet){ - int i = 0;; + int i = 0; log.info("Starting Simulation!"); log.info(GraphVizGenerator.generateGraphViz(petriNet)); while(makeStep(petriNet)){ @@ -105,7 +105,7 @@ private static void doTransition(PetriNet petriNet, Node node){ * @return the StepGraph with all reachable states of the given PetriNet */ public static StepGraph buildStepGraph(PetriNet petriNet){ - var stepGraph = new StepGraph(); + var stepGraph = new StepGraph(petriNet); stepGraph.getSteps().add(petriNet); for(var node : getPossibleTransitions(petriNet)){ addStepToStepGraph(petriNet, petriNet.deepCopy(), node, stepGraph); @@ -134,11 +134,11 @@ private static void addStepToStepGraph(PetriNet parent, PetriNet copy, Node tran doTransition(copy, transitionCopy); for(var net : stepGraph.getSteps()){ if (net.equals(copy)){ - stepGraph.getArcs().add(new NetArc(parent, net)); + stepGraph.getArcs().add(new NetArc(parent, net, transition.getID())); return; } } - stepGraph.getArcs().add(new NetArc(parent, copy)); + stepGraph.getArcs().add(new NetArc(parent, copy, transition.getID())); stepGraph.getSteps().add(copy); for(var node : getPossibleTransitions(copy)){ addStepToStepGraph(copy, copy.deepCopy(), node, stepGraph); @@ -161,4 +161,69 @@ private static boolean isPossible(Node node){ return false; } + /** + * @param stepGraph a stepGraph + * @return enumerate all possible paths of the petri net + */ + public static List> enumPaths(StepGraph stepGraph){ + List> paths = new ArrayList<>(); + var initiallyMarkedNodes = stepGraph.getInitial().getNodes().stream() + .filter(node -> node instanceof Place) + .filter(node -> ((Place) node).getMarkers() > 0) + .collect(Collectors.toList()); + for(var place : initiallyMarkedNodes){ + paths.addAll(enumPathsForNode(place, stepGraph, paths)); + } + return paths; + } + + /** + * @param node node from which paths should start + * @param stepGraph stepGraph of the PetriNet + * @param foundPaths already found Paths + * @return List of all Paths in the PetriNet starting from node + */ + private static List> enumPathsForNode(Node node, StepGraph stepGraph, List> foundPaths){ + if(foundPaths.stream().map(list -> list.get(0).equals(node)).reduce(false, Boolean::logicalOr)){ + //paths already calculated + return List.of(); + } + List> pathList = new ArrayList<>(); + if(node instanceof Place){ + //calculate all transitions that can follow this node + var followingTransitions = node.getSourceArcs().stream().map(Arc::getTarget) + .filter(trans -> stepGraph.getArcs().stream() + .map(NetArc::getUsedTransition) + .anyMatch(used -> used.equals(trans.getID()))) + .collect(Collectors.toList()); + //if no transitions following return a path of length 1 + if(followingTransitions.isEmpty()){ + return List.of(List.of(node)); + } + for(var trans : followingTransitions){ + //else create a path (node, [transitionPath]) for each path starting from each transition + var calc = enumPathsForNode(trans, stepGraph, pathList); + for(var list : calc){ + List startingFromThis = new ArrayList<>(); + startingFromThis.add(node); + startingFromThis.addAll(list); + pathList.add(startingFromThis); + } + pathList.addAll(calc); + } + }else if(node instanceof Transition){ + //if a transition is reachable all following places are reachable + for(var place : node.getSourceArcs().stream().map(Arc::getTarget).collect(Collectors.toList())){ + var calc = enumPathsForNode(place, stepGraph, pathList); + for(var list : calc){ + List startingFromThis = new ArrayList<>(); + startingFromThis.add(node); + startingFromThis.addAll(list); + pathList.add(startingFromThis); + } + pathList.addAll(calc); + } + } + return pathList; + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/StepGraph.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/StepGraph.java index 7895cf97..fe0028d2 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/StepGraph.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/StepGraph.java @@ -12,11 +12,14 @@ @Getter public class StepGraph { - public StepGraph(){ + public StepGraph(PetriNet initial){ + this.initial = initial; steps = new HashSet<>(); arcs = new HashSet<>(); } + private PetriNet initial; + /** * Each Step a PetriNet can make is represented as a PetriNet */ diff --git a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java index 26f029b9..ca4bda22 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java @@ -71,6 +71,7 @@ void testBuildPetriNet() throws IOException { var graph = PetriNetSimulator.buildStepGraph(petriNet); log.info(String.valueOf(graph.getArcs().size())); log.info(GraphVizGenerator.generateGraphViz(graph)); + log.info(PetriNetSimulator.enumPaths(graph).toString()); } /** From 0d173c23d646e8259803a5e62d5ee198ce74ec08 Mon Sep 17 00:00:00 2001 From: eakker Date: Wed, 28 Apr 2021 10:06:32 +0200 Subject: [PATCH 110/157] chore: add path to evaluation operators, easier way to enumerate all paths --- .../evaluation/formula/CTLEvaluator.java | 17 +-- .../petrinet/evaluation/formula/FF.java | 4 +- .../petrinet/evaluation/formula/Formula.java | 4 +- .../petrinet/evaluation/formula/TT.java | 4 +- .../evaluation/formula/state/NodeALONG.java | 6 +- .../evaluation/formula/state/NodeAND.java | 6 +- .../evaluation/formula/state/NodeEV.java | 6 +- .../formula/state/NodeEXIST_MODAL.java | 6 +- .../formula/state/NodeEXIST_NEXT.java | 6 +- .../formula/state/NodeEXIST_UNTIL.java | 4 +- .../formula/state/NodeFORALL_MODAL.java | 4 +- .../formula/state/NodeFORALL_NEXT.java | 6 +- .../formula/state/NodeFORALL_UNTIL.java | 4 +- .../evaluation/formula/state/NodeINV.java | 6 +- .../evaluation/formula/state/NodeMODAL.java | 6 +- .../evaluation/formula/state/NodeNF.java | 4 +- .../evaluation/formula/state/NodeNOT.java | 6 +- .../evaluation/formula/state/NodeOR.java | 6 +- .../evaluation/formula/state/NodePOS.java | 6 +- .../formula/transition/TransitionAF.java | 4 +- .../formula/transition/TransitionALONG.java | 6 +- .../formula/transition/TransitionAND.java | 6 +- .../formula/transition/TransitionEV.java | 6 +- .../transition/TransitionEXIST_MODAL.java | 6 +- .../transition/TransitionEXIST_NEXT.java | 6 +- .../transition/TransitionEXIST_UNTIL.java | 4 +- .../transition/TransitionFORALL_MODAL.java | 4 +- .../transition/TransitionFORALL_NEXT.java | 6 +- .../transition/TransitionFORALL_UNTIL.java | 4 +- .../formula/transition/TransitionINV.java | 6 +- .../formula/transition/TransitionMODAL.java | 6 +- .../formula/transition/TransitionNOT.java | 6 +- .../formula/transition/TransitionOR.java | 6 +- .../formula/transition/TransitionPOS.java | 6 +- .../petrinet/simulator/PetriNetSimulator.java | 104 +++++++++--------- .../builder/InfomodelPetriNetBuilderTest.java | 3 +- 36 files changed, 186 insertions(+), 114 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java index 8d3d1494..cde7bbe1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java @@ -6,23 +6,26 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Place; import de.fraunhofer.isst.configmanager.petrinet.model.Transition; +import java.util.List; + public class CTLEvaluator { - public static boolean evaluateNode(StateFormula ctlExpression, Place place){ + public static boolean evaluateNode(StateFormula ctlExpression, Place place, List> paths){ //TODO base evaluation on place - return ctlExpression.evaluate(place); + return ctlExpression.evaluate(place, paths); } - public static boolean evaluateTransition(TransitionFormula ctlExpression, Transition transition){ + public static boolean evaluateTransition(TransitionFormula ctlExpression, Transition transition, List> paths){ //TODO base evaluation on transition - return ctlExpression.evaluate(transition); + return ctlExpression.evaluate(transition, paths); } - public static boolean evaluate(Formula ctlExpression, Node node){ + public static boolean evaluate(Formula ctlExpression, Node node, List> paths){ + if(ctlExpression instanceof StateFormula && node instanceof Place){ - return evaluateNode((StateFormula) ctlExpression, (Place) node); + return evaluateNode((StateFormula) ctlExpression, (Place) node, paths); }else if(ctlExpression instanceof TransitionFormula && node instanceof Transition){ - return evaluateTransition((TransitionFormula) ctlExpression, (Transition) node); + return evaluateTransition((TransitionFormula) ctlExpression, (Transition) node, paths); }else{ //cannot be evaluated return false; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java index cb7bcc81..4f508c4e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java @@ -4,6 +4,8 @@ import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFormula; import de.fraunhofer.isst.configmanager.petrinet.model.Node; +import java.util.List; + public class FF implements StateFormula, TransitionFormula { public static FF FF(){ @@ -11,7 +13,7 @@ public static FF FF(){ } @Override - public boolean evaluate(Node node) { + public boolean evaluate(Node node, List> paths) { return false; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/Formula.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/Formula.java index aa426061..4ff17a8e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/Formula.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/Formula.java @@ -2,9 +2,11 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; +import java.util.List; + public interface Formula { - boolean evaluate(Node node); + boolean evaluate(Node node, List> paths); String symbol(); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/TT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/TT.java index dcaa018d..2c3c2bc0 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/TT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/TT.java @@ -4,6 +4,8 @@ import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFormula; import de.fraunhofer.isst.configmanager.petrinet.model.Node; +import java.util.List; + public class TT implements StateFormula, TransitionFormula { public static TT TT(){ @@ -11,7 +13,7 @@ public static TT TT(){ } @Override - public boolean evaluate(Node node) { + public boolean evaluate(Node node, List> paths) { return true; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java index 7754311b..fc96fd09 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java @@ -3,6 +3,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeEV.nodeEV; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeNOT.nodeNOT; @@ -16,8 +18,8 @@ public static NodeALONG nodeALONG(StateFormula parameter){ private StateFormula parameter; @Override - public boolean evaluate(Node node) { - return nodeNOT(nodeEV(nodeNOT(parameter))).evaluate(node); + public boolean evaluate(Node node, List> paths) { + return nodeNOT(nodeEV(nodeNOT(parameter))).evaluate(node, paths); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java index bd464e99..df9298b8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java @@ -3,6 +3,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + @AllArgsConstructor public class NodeAND implements StateFormula { @@ -13,8 +15,8 @@ public static NodeAND nodeAND(StateFormula parameter1, StateFormula parameter2){ private StateFormula parameter1, parameter2; @Override - public boolean evaluate(Node node) { - return parameter1.evaluate(node) && parameter2.evaluate(node); + public boolean evaluate(Node node, List> paths) { + return parameter1.evaluate(node, paths) && parameter2.evaluate(node, paths); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java index 103afe88..cf14e62b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java @@ -3,6 +3,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.TT.TT; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeFORALL_UNTIL.nodeFORALL_UNTIL; @@ -16,8 +18,8 @@ public static NodeEV nodeEV(StateFormula parameter){ private StateFormula parameter; @Override - public boolean evaluate(Node node) { - return nodeFORALL_UNTIL(TT(), parameter).evaluate(node); + public boolean evaluate(Node node, List> paths) { + return nodeFORALL_UNTIL(TT(), parameter).evaluate(node, paths); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java index 62682849..d1b26562 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java @@ -4,6 +4,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeAND.nodeAND; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeMODAL.nodeMODAL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionMODAL.transitionMODAL; @@ -19,8 +21,8 @@ private static NodeEXIST_MODAL nodeEXIST_MODAL(StateFormula parameter1, Transiti private TransitionFormula parameter2; @Override - public boolean evaluate(Node node) { - return transitionMODAL(nodeAND(parameter1, nodeMODAL(parameter2))).evaluate(node); + public boolean evaluate(Node node, List> paths) { + return transitionMODAL(nodeAND(parameter1, nodeMODAL(parameter2))).evaluate(node, paths); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java index ab1fade2..7c3dc820 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java @@ -3,6 +3,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeMODAL.nodeMODAL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionMODAL.transitionMODAL; @@ -15,8 +17,8 @@ public static NodeEXIST_NEXT nodeEXIST_NEXT(StateFormula parameter){ private StateFormula parameter; @Override - public boolean evaluate(Node node) { - return nodeMODAL(transitionMODAL(parameter)).evaluate(node); + public boolean evaluate(Node node, List> paths) { + return nodeMODAL(transitionMODAL(parameter)).evaluate(node, paths); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java index a52e6ea3..e37fe8ab 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java @@ -3,6 +3,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + @AllArgsConstructor public class NodeEXIST_UNTIL implements StateFormula { @@ -16,7 +18,7 @@ public static NodeEXIST_UNTIL nodeEXIST_UNTIL(StateFormula parameter1, StateForm //TODO // True if a path exists, where parameter1 is true on each node of the path, // and parameter2 is true on the final node of the path - public boolean evaluate(Node node) { + public boolean evaluate(Node node, List> paths) { return false; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java index f3ebab7b..ca56eee2 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java @@ -4,6 +4,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + @AllArgsConstructor public class NodeFORALL_MODAL implements StateFormula { @@ -19,7 +21,7 @@ public static NodeFORALL_MODAL nodeFORALL_MODAL(StateFormula parameter1, Transit // parameter1, must be true for all successor states, parameter2 must // be true for the transitions between the current state and its successors. @Override - public boolean evaluate(Node node) { + public boolean evaluate(Node node, List> paths) { return false; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java index 0ac4adc4..6e7da2e8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java @@ -3,6 +3,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeNOT.nodeNOT; @AllArgsConstructor @@ -15,8 +17,8 @@ public static NodeFORALL_NEXT nodeFORALL_NEXT(StateFormula parameter){ private StateFormula parameter; @Override - public boolean evaluate(Node node) { - return nodeNOT(nodeFORALL_NEXT(nodeNOT(parameter))).evaluate(node); + public boolean evaluate(Node node, List> paths) { + return nodeNOT(nodeFORALL_NEXT(nodeNOT(parameter))).evaluate(node, paths); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java index 7f58ce9f..ba7fd0c2 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java @@ -3,6 +3,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + @AllArgsConstructor public class NodeFORALL_UNTIL implements StateFormula { @@ -14,7 +16,7 @@ public static NodeFORALL_UNTIL nodeFORALL_UNTIL(StateFormula parameter1, StateFo //TODO like EXIST_UNTIL for all paths @Override - public boolean evaluate(Node node) { + public boolean evaluate(Node node, List> paths) { return false; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java index 67bfd63c..b8a21419 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java @@ -3,6 +3,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeNOT.nodeNOT; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodePOS.nodePOS; @@ -16,8 +18,8 @@ public static NodeINV nodeINV(StateFormula parameter){ private StateFormula parameter; @Override - public boolean evaluate(Node node) { - return nodeNOT(nodePOS(nodeNOT(parameter))).evaluate(node); + public boolean evaluate(Node node, List> paths) { + return nodeNOT(nodePOS(nodeNOT(parameter))).evaluate(node, paths); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java index d1f853c4..99adc514 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java @@ -6,6 +6,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Place; import lombok.AllArgsConstructor; +import java.util.List; + @AllArgsConstructor public class NodeMODAL implements StateFormula { @@ -18,11 +20,11 @@ public static NodeMODAL nodeMODAL(TransitionFormula parameter){ //TODO // MODAL, is true if parameter evaluates to true for a transition following the current state @Override - public boolean evaluate(Node node) { + public boolean evaluate(Node node, List> paths) { return node instanceof Place && node.getSourceArcs().stream() .map(Arc::getTarget) - .map(transition -> parameter.evaluate(transition)) + .map(transition -> parameter.evaluate(transition, paths)) .reduce(false, (a,b) -> a || b); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNF.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNF.java index 66280b79..0d7c75b6 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNF.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNF.java @@ -4,6 +4,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Place; import lombok.AllArgsConstructor; +import java.util.List; + @AllArgsConstructor public class NodeNF implements StateFormula { @@ -14,7 +16,7 @@ public static NodeNF nodeNF(NodeExpression parameter){ private NodeExpression parameter; @Override - public boolean evaluate(Node node) { + public boolean evaluate(Node node, List> paths) { return node instanceof Place && parameter.getSubExpression().evaluate((Place) node); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java index 5417e5ec..59c84ca2 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java @@ -3,6 +3,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + @AllArgsConstructor public class NodeNOT implements StateFormula { @@ -13,8 +15,8 @@ public static NodeNOT nodeNOT(StateFormula parameter){ private StateFormula parameter; @Override - public boolean evaluate(Node node) { - return !parameter.evaluate(node); + public boolean evaluate(Node node, List> paths) { + return !parameter.evaluate(node, paths); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java index dfbed573..7bd63eb1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java @@ -3,6 +3,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + @AllArgsConstructor public class NodeOR implements StateFormula { @@ -13,8 +15,8 @@ public static NodeOR nodeOR(StateFormula parameter1, StateFormula parameter2){ private StateFormula parameter1, parameter2; @Override - public boolean evaluate(Node node) { - return parameter1.evaluate(node) || parameter2.evaluate(node); + public boolean evaluate(Node node, List> paths) { + return parameter1.evaluate(node, paths) || parameter2.evaluate(node, paths); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java index 03cc2aed..40227dd6 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java @@ -3,6 +3,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.TT.TT; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeEXIST_UNTIL.nodeEXIST_UNTIL; @@ -16,8 +18,8 @@ public static NodePOS nodePOS(StateFormula parameter){ private StateFormula parameter; @Override - public boolean evaluate(Node node) { - return nodeEXIST_UNTIL(TT(), parameter).evaluate(node); + public boolean evaluate(Node node, List> paths) { + return nodeEXIST_UNTIL(TT(), parameter).evaluate(node, paths); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java index b479fe05..502ab22c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java @@ -5,6 +5,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Transition; import lombok.AllArgsConstructor; +import java.util.List; + @AllArgsConstructor public class TransitionAF implements TransitionFormula { @@ -15,7 +17,7 @@ public static TransitionAF transitionAF(ArcExpression parameter){ private ArcExpression parameter; @Override - public boolean evaluate(Node node) { + public boolean evaluate(Node node, List> paths) { return node instanceof Transition && parameter.getSubExpression().evaluate((Transition) node); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java index b3dc3211..256e90fa 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java @@ -3,6 +3,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionEV.transitionEV; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionNOT.transitionNOT; @@ -16,8 +18,8 @@ public static TransitionALONG transitionALONG(TransitionFormula parameter){ private TransitionFormula parameter; @Override - public boolean evaluate(Node node) { - return transitionNOT(transitionEV(transitionNOT(parameter))).evaluate(node); + public boolean evaluate(Node node, List> paths) { + return transitionNOT(transitionEV(transitionNOT(parameter))).evaluate(node, paths); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java index 46bcbf7b..94b8d4a1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java @@ -3,6 +3,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + @AllArgsConstructor public class TransitionAND implements TransitionFormula { @@ -13,8 +15,8 @@ public static TransitionAND transitionAND(TransitionFormula parameter1, Transiti private TransitionFormula parameter1, parameter2; @Override - public boolean evaluate(Node node) { - return parameter1.evaluate(node) && parameter2.evaluate(node); + public boolean evaluate(Node node, List> paths) { + return parameter1.evaluate(node, paths) && parameter2.evaluate(node, paths); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java index ac19f09a..81ac4167 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java @@ -3,6 +3,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.TT.TT; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFORALL_UNTIL.transitionFORALL_UNTIL; @@ -16,8 +18,8 @@ public static TransitionEV transitionEV(TransitionFormula parameter){ private TransitionFormula parameter; @Override - public boolean evaluate(Node node) { - return transitionFORALL_UNTIL(TT(), parameter).evaluate(node); + public boolean evaluate(Node node, List> paths) { + return transitionFORALL_UNTIL(TT(), parameter).evaluate(node, paths); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java index 82db2c35..f32ec078 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java @@ -4,6 +4,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeMODAL.nodeMODAL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionAND.transitionAND; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionMODAL.transitionMODAL; @@ -19,8 +21,8 @@ private static TransitionEXIST_MODAL transitionEXIST_MODAL(TransitionFormula par private StateFormula parameter2; @Override - public boolean evaluate(Node node) { - return nodeMODAL(transitionAND(parameter1,transitionMODAL(parameter2))).evaluate(node); + public boolean evaluate(Node node, List> paths) { + return nodeMODAL(transitionAND(parameter1,transitionMODAL(parameter2))).evaluate(node, paths); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java index 7dba0eac..c46de472 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java @@ -3,6 +3,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeMODAL.nodeMODAL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionMODAL.transitionMODAL; @@ -15,8 +17,8 @@ public static TransitionEXIST_NEXT transitionEXIST_NEXT(TransitionFormula parame private TransitionFormula parameter; @Override - public boolean evaluate(Node node) { - return transitionMODAL(nodeMODAL(parameter)).evaluate(node); + public boolean evaluate(Node node, List> paths) { + return transitionMODAL(nodeMODAL(parameter)).evaluate(node, paths); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java index 0c2ce67a..cf199451 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java @@ -3,6 +3,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + @AllArgsConstructor public class TransitionEXIST_UNTIL implements TransitionFormula { @@ -16,7 +18,7 @@ public static TransitionEXIST_UNTIL transitionEXIST_UNTIL(TransitionFormula para // True if a path exists, where parameter1 is true on each transition of the path, // and parameter2 is true on the final transition of the path @Override - public boolean evaluate(Node node) { + public boolean evaluate(Node node, List> paths) { return false; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java index 22969d53..436f4f8b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java @@ -4,6 +4,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + @AllArgsConstructor public class TransitionFORALL_MODAL implements TransitionFormula { @@ -18,7 +20,7 @@ public static TransitionFORALL_MODAL transitionFORALL_MODAL(TransitionFormula pa // parameter1, must be true for all successor transitions, parameter2 must // be true for the states between the current transition and its successors. @Override - public boolean evaluate(Node node) { + public boolean evaluate(Node node, List> paths) { return false; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java index cd080dc5..bb9cc602 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java @@ -3,6 +3,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionEXIST_NEXT.transitionEXIST_NEXT; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionNOT.transitionNOT; @@ -16,8 +18,8 @@ public static TransitionFORALL_NEXT transitionFORALL_NEXT(TransitionFormula para private TransitionFormula parameter; @Override - public boolean evaluate(Node node) { - return transitionNOT(transitionEXIST_NEXT(transitionNOT(parameter))).evaluate(node); + public boolean evaluate(Node node, List> paths) { + return transitionNOT(transitionEXIST_NEXT(transitionNOT(parameter))).evaluate(node, paths); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java index cb4ef7bb..c7a7f8e1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java @@ -3,6 +3,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + @AllArgsConstructor public class TransitionFORALL_UNTIL implements TransitionFormula { @@ -14,7 +16,7 @@ public static TransitionFORALL_UNTIL transitionFORALL_UNTIL(TransitionFormula pa //TODO like EXIST_UNTIL but requires conditions for all paths @Override - public boolean evaluate(Node node) { + public boolean evaluate(Node node, List> paths) { return false; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java index 3aa17513..905397c0 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java @@ -3,6 +3,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionNOT.transitionNOT; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionPOS.transitionPOS; @@ -16,8 +18,8 @@ public static TransitionINV transitionINV(TransitionFormula parameter){ private TransitionFormula parameter; @Override - public boolean evaluate(Node node) { - return transitionNOT(transitionPOS(transitionNOT(parameter))).evaluate(node); + public boolean evaluate(Node node, List> paths) { + return transitionNOT(transitionPOS(transitionNOT(parameter))).evaluate(node, paths); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java index cf3a1cef..3b66ed61 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java @@ -7,6 +7,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Transition; import lombok.AllArgsConstructor; +import java.util.List; + @AllArgsConstructor public class TransitionMODAL implements TransitionFormula { @@ -19,11 +21,11 @@ public static TransitionMODAL transitionMODAL(StateFormula parameter){ //TODO // MODAL, is true if parameter evaluates to true for a state following the current transition @Override - public boolean evaluate(Node node) { + public boolean evaluate(Node node, List> paths) { return node instanceof Transition && node.getSourceArcs().stream() .map(Arc::getTarget) - .map(place -> parameter.evaluate(place)) + .map(place -> parameter.evaluate(place, paths)) .reduce(false, (a,b) -> a || b); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java index a535acca..94c8f424 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java @@ -3,6 +3,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + @AllArgsConstructor public class TransitionNOT implements TransitionFormula { @@ -13,8 +15,8 @@ public static TransitionNOT transitionNOT(TransitionFormula parameter){ private TransitionFormula parameter; @Override - public boolean evaluate(Node node) { - return !parameter.evaluate(node); + public boolean evaluate(Node node, List> paths) { + return !parameter.evaluate(node, paths); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java index 94d756f5..51a476e7 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java @@ -3,6 +3,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + @AllArgsConstructor public class TransitionOR implements TransitionFormula { @@ -13,8 +15,8 @@ public static TransitionOR transitionOR(TransitionFormula parameter1, Transition private TransitionFormula parameter1, parameter2; @Override - public boolean evaluate(Node node) { - return parameter1.evaluate(node) || parameter2.evaluate(node); + public boolean evaluate(Node node, List> paths) { + return parameter1.evaluate(node, paths) || parameter2.evaluate(node, paths); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java index 8fbbdd01..ed157e0a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java @@ -3,6 +3,8 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import lombok.AllArgsConstructor; +import java.util.List; + import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.TT.TT; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionEXIST_UNTIL.transitionEXIST_UNTIL; @@ -16,8 +18,8 @@ public static TransitionPOS transitionPOS(TransitionFormula parameter){ private TransitionFormula parameter; @Override - public boolean evaluate(Node node) { - return transitionEXIST_UNTIL(TT(), parameter).evaluate(node); + public boolean evaluate(Node node, List> paths) { + return transitionEXIST_UNTIL(TT(), parameter).evaluate(node, paths); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java index 61b32cb3..f2a41455 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java @@ -5,6 +5,7 @@ import lombok.extern.slf4j.Slf4j; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -162,68 +163,69 @@ private static boolean isPossible(Node node){ } /** - * @param stepGraph a stepGraph - * @return enumerate all possible paths of the petri net + * @param stepGraph PetriNet StepGraph + * @return all paths possible in given petriNet */ - public static List> enumPaths(StepGraph stepGraph){ - List> paths = new ArrayList<>(); - var initiallyMarkedNodes = stepGraph.getInitial().getNodes().stream() - .filter(node -> node instanceof Place) - .filter(node -> ((Place) node).getMarkers() > 0) - .collect(Collectors.toList()); - for(var place : initiallyMarkedNodes){ - paths.addAll(enumPathsForNode(place, stepGraph, paths)); + public static List> getAllPaths(StepGraph stepGraph){ + List> len1 =getPathsOfLength1(stepGraph); + List> lenN = new ArrayList<>(len1); + List> allPaths = new ArrayList<>(len1); + while(!lenN.isEmpty()){ + lenN = getPathsOfLengthNplus1(len1, lenN); + if(!lenN.isEmpty()){ + allPaths.addAll(lenN); + } } - return paths; + for(var node : stepGraph.getInitial().getNodes()){ + allPaths.add(List.of(node)); + } + allPaths.sort(Comparator.comparingInt(List::size)); + return allPaths; } /** - * @param node node from which paths should start - * @param stepGraph stepGraph of the PetriNet - * @param foundPaths already found Paths - * @return List of all Paths in the PetriNet starting from node + * @param stepGraph PetriNet StepGraph + * @return all possible paths of length 1 (either Place -> Transition or Transition -> Place) */ - private static List> enumPathsForNode(Node node, StepGraph stepGraph, List> foundPaths){ - if(foundPaths.stream().map(list -> list.get(0).equals(node)).reduce(false, Boolean::logicalOr)){ - //paths already calculated - return List.of(); - } - List> pathList = new ArrayList<>(); - if(node instanceof Place){ - //calculate all transitions that can follow this node - var followingTransitions = node.getSourceArcs().stream().map(Arc::getTarget) - .filter(trans -> stepGraph.getArcs().stream() - .map(NetArc::getUsedTransition) - .anyMatch(used -> used.equals(trans.getID()))) - .collect(Collectors.toList()); - //if no transitions following return a path of length 1 - if(followingTransitions.isEmpty()){ - return List.of(List.of(node)); + private static List> getPathsOfLength1(StepGraph stepGraph){ + List> paths = new ArrayList<>(); + for(var node : stepGraph.getInitial().getNodes()){ + if(node instanceof Place){ + var followingTransitions = node.getSourceArcs().stream().map(Arc::getTarget) + .filter(trans -> stepGraph.getArcs().stream() + .map(NetArc::getUsedTransition) + .anyMatch(used -> used.equals(trans.getID()))) + .collect(Collectors.toList()); + for(var succ : followingTransitions){ + paths.add(List.of(node, succ)); + } } - for(var trans : followingTransitions){ - //else create a path (node, [transitionPath]) for each path starting from each transition - var calc = enumPathsForNode(trans, stepGraph, pathList); - for(var list : calc){ - List startingFromThis = new ArrayList<>(); - startingFromThis.add(node); - startingFromThis.addAll(list); - pathList.add(startingFromThis); + if(node instanceof Transition){ + for(var succ : node.getSourceArcs().stream().map(Arc::getTarget).collect(Collectors.toSet())){ + paths.add(List.of(node, succ)); } - pathList.addAll(calc); } - }else if(node instanceof Transition){ - //if a transition is reachable all following places are reachable - for(var place : node.getSourceArcs().stream().map(Arc::getTarget).collect(Collectors.toList())){ - var calc = enumPathsForNode(place, stepGraph, pathList); - for(var list : calc){ - List startingFromThis = new ArrayList<>(); - startingFromThis.add(node); - startingFromThis.addAll(list); - pathList.add(startingFromThis); + } + return paths; + } + + /** + * @param pathsLen1 set of possible paths of length 1 + * @param pathsLenN all possible paths of length n (stop considering as soon as path gets circular (first = last)) + * @return all possible paths of length n+1 + */ + private static List> getPathsOfLengthNplus1(List> pathsLen1, List> pathsLenN){ + List> pathsLenNplus1 = new ArrayList<>(); + for(var pathN : pathsLenN){ + for(var path1 : pathsLen1){ + if(pathN.get(pathN.size()-1).equals(path1.get(0)) && !pathN.get(0).equals(pathN.get(pathN.size()-1))){ + var pathNplus1 = new ArrayList<>(pathN); + pathNplus1.add(path1.get(path1.size()-1)); + pathsLenNplus1.add(pathNplus1); } - pathList.addAll(calc); } } - return pathList; + return pathsLenNplus1; } + } diff --git a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java index ca4bda22..46a72b23 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java @@ -71,7 +71,7 @@ void testBuildPetriNet() throws IOException { var graph = PetriNetSimulator.buildStepGraph(petriNet); log.info(String.valueOf(graph.getArcs().size())); log.info(GraphVizGenerator.generateGraphViz(graph)); - log.info(PetriNetSimulator.enumPaths(graph).toString()); + log.info(PetriNetSimulator.getAllPaths(graph).toString()); } /** @@ -91,6 +91,7 @@ public static ArrayList randomSubList(List input) { } @Test + @Disabled public void testFormula(){ var formula = nodeAND(nodeMODAL(transitionNOT(FF())), nodeOR(nodeNF(NodeExpression.nodeExpression(x -> true, "testMsg")),TT())); log.info(formula.writeFormula()); From e4943fa623b75ee2c5761965cedfdfc80bd72f15 Mon Sep 17 00:00:00 2001 From: eakker Date: Wed, 28 Apr 2021 11:06:41 +0200 Subject: [PATCH 111/157] chore: add last operator implementations, check for circles when enumerating possible paths --- .../evaluation/formula/CTLEvaluator.java | 4 ++-- .../formula/state/NodeEXIST_UNTIL.java | 11 ++++++++++- .../formula/state/NodeFORALL_MODAL.java | 16 ++++++++++++++-- .../formula/state/NodeFORALL_UNTIL.java | 14 ++++++++++++-- .../evaluation/formula/state/NodeMODAL.java | 1 - .../formula/transition/TransitionAF.java | 1 - .../transition/TransitionEXIST_UNTIL.java | 11 ++++++++++- .../transition/TransitionFORALL_MODAL.java | 16 ++++++++++++++-- .../transition/TransitionFORALL_UNTIL.java | 14 ++++++++++++-- .../formula/transition/TransitionMODAL.java | 2 -- .../configmanager/petrinet/simulator/NetArc.java | 1 - .../petrinet/simulator/PetriNetSimulator.java | 10 ++++++---- .../builder/InfomodelPetriNetBuilderTest.java | 8 ++++++-- 13 files changed, 86 insertions(+), 23 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java index cde7bbe1..bf853d18 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java @@ -11,12 +11,12 @@ public class CTLEvaluator { public static boolean evaluateNode(StateFormula ctlExpression, Place place, List> paths){ - //TODO base evaluation on place + //base evaluation on place return ctlExpression.evaluate(place, paths); } public static boolean evaluateTransition(TransitionFormula ctlExpression, Transition transition, List> paths){ - //TODO base evaluation on transition + //base evaluation on transition return ctlExpression.evaluate(transition, paths); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java index e37fe8ab..bf413b0b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java @@ -1,6 +1,7 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; import de.fraunhofer.isst.configmanager.petrinet.model.Node; +import de.fraunhofer.isst.configmanager.petrinet.model.Place; import lombok.AllArgsConstructor; import java.util.List; @@ -15,10 +16,18 @@ public static NodeEXIST_UNTIL nodeEXIST_UNTIL(StateFormula parameter1, StateForm private StateFormula parameter1, parameter2; @Override - //TODO // True if a path exists, where parameter1 is true on each node of the path, // and parameter2 is true on the final node of the path public boolean evaluate(Node node, List> paths) { + if(!(node instanceof Place)) return false; + check: for(var path: paths){ + if(path.get(0).equals(node)){ + for(int i = 0; i> paths) { - return false; + if(!(node instanceof Place)) return false; + var followingTransitions = paths.stream().filter(path -> path.size() == 2 && path.get(0) == node).map(path -> path.get(1)).collect(Collectors.toSet()); + var followingPlaces = followingTransitions.stream().map(Node::getSourceArcs).flatMap(Collection::stream).map(Arc::getTarget).collect(Collectors.toSet()); + for(var place : followingPlaces){ + if(!parameter1.evaluate(place, paths)) return false; + } + for(var transition : followingTransitions){ + if(!parameter2.evaluate(transition, paths)) return false; + } + return true; } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java index ba7fd0c2..cfb2d5bb 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java @@ -1,6 +1,7 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state; import de.fraunhofer.isst.configmanager.petrinet.model.Node; +import de.fraunhofer.isst.configmanager.petrinet.model.Place; import lombok.AllArgsConstructor; import java.util.List; @@ -14,10 +15,19 @@ public static NodeFORALL_UNTIL nodeFORALL_UNTIL(StateFormula parameter1, StateFo private StateFormula parameter1, parameter2; - //TODO like EXIST_UNTIL for all paths + //like EXIST_UNTIL for all paths @Override public boolean evaluate(Node node, List> paths) { - return false; + if(!(node instanceof Place)) return false; + for(var path: paths){ + if(path.get(0).equals(node)){ + for(int i = 0; i> paths) { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java index 502ab22c..8dccd008 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java @@ -1,7 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; import de.fraunhofer.isst.configmanager.petrinet.model.Node; -import de.fraunhofer.isst.configmanager.petrinet.model.Place; import de.fraunhofer.isst.configmanager.petrinet.model.Transition; import lombok.AllArgsConstructor; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java index cf199451..77ba10d8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java @@ -1,6 +1,7 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; import de.fraunhofer.isst.configmanager.petrinet.model.Node; +import de.fraunhofer.isst.configmanager.petrinet.model.Transition; import lombok.AllArgsConstructor; import java.util.List; @@ -14,11 +15,19 @@ public static TransitionEXIST_UNTIL transitionEXIST_UNTIL(TransitionFormula para private TransitionFormula parameter1, parameter2; - //TODO // True if a path exists, where parameter1 is true on each transition of the path, // and parameter2 is true on the final transition of the path @Override public boolean evaluate(Node node, List> paths) { + if(!(node instanceof Transition)) return false; + check: for(var path: paths){ + if(path.get(0).equals(node)){ + for(int i = 0; i> paths) { - return false; + if(!(node instanceof Transition)) return false; + var followingPlaces = node.getSourceArcs().stream().map(Arc::getTarget).collect(Collectors.toSet()); + followingPlaces.retainAll(paths.stream().filter(path -> paths.size() == 2).map(path -> path.get(0)).collect(Collectors.toSet())); + var followingTransitions = paths.stream().filter(path -> path.size() == 2).filter(path -> followingPlaces.contains(path.get(0))).map(path -> path.get(1)).collect(Collectors.toSet()); + for(var transition : followingTransitions){ + if(!parameter1.evaluate(transition, paths)) return false; + } + for(var place : followingPlaces){ + if(!parameter2.evaluate(place, paths)) return false; + } + return true; } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java index c7a7f8e1..f981fc29 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java @@ -1,6 +1,7 @@ package de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition; import de.fraunhofer.isst.configmanager.petrinet.model.Node; +import de.fraunhofer.isst.configmanager.petrinet.model.Transition; import lombok.AllArgsConstructor; import java.util.List; @@ -14,10 +15,19 @@ public static TransitionFORALL_UNTIL transitionFORALL_UNTIL(TransitionFormula pa private TransitionFormula parameter1, parameter2; - //TODO like EXIST_UNTIL but requires conditions for all paths + //like EXIST_UNTIL but requires conditions for all paths @Override public boolean evaluate(Node node, List> paths) { - return false; + if(!(node instanceof Transition)) return false; + for(var path: paths){ + if(path.get(0).equals(node)){ + for(int i = 0; i> paths) { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/NetArc.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/NetArc.java index 090a730d..fc800ef4 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/NetArc.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/NetArc.java @@ -1,7 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.simulator; import de.fraunhofer.isst.configmanager.petrinet.model.PetriNet; -import de.fraunhofer.isst.configmanager.petrinet.model.Transition; import lombok.Getter; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java index f2a41455..5eebf568 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java @@ -170,15 +170,14 @@ public static List> getAllPaths(StepGraph stepGraph){ List> len1 =getPathsOfLength1(stepGraph); List> lenN = new ArrayList<>(len1); List> allPaths = new ArrayList<>(len1); + int i = 1; while(!lenN.isEmpty()){ + log.info("Calculating paths of length " + ++i); lenN = getPathsOfLengthNplus1(len1, lenN); if(!lenN.isEmpty()){ allPaths.addAll(lenN); } } - for(var node : stepGraph.getInitial().getNodes()){ - allPaths.add(List.of(node)); - } allPaths.sort(Comparator.comparingInt(List::size)); return allPaths; } @@ -218,7 +217,7 @@ private static List> getPathsOfLengthNplus1(List> pathsLen List> pathsLenNplus1 = new ArrayList<>(); for(var pathN : pathsLenN){ for(var path1 : pathsLen1){ - if(pathN.get(pathN.size()-1).equals(path1.get(0)) && !pathN.get(0).equals(pathN.get(pathN.size()-1))){ + if(pathN.get(pathN.size()-1).equals(path1.get(0)) && circleFree(pathN)){ var pathNplus1 = new ArrayList<>(pathN); pathNplus1.add(path1.get(path1.size()-1)); pathsLenNplus1.add(pathNplus1); @@ -228,4 +227,7 @@ private static List> getPathsOfLengthNplus1(List> pathsLen return pathsLenNplus1; } + private static boolean circleFree(List list){ + return list.stream().distinct().count() == list.size(); + } } diff --git a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java index 46a72b23..d6d7b9f4 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java @@ -3,7 +3,7 @@ import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeExpression; -import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionPOS; +import de.fraunhofer.isst.configmanager.petrinet.model.Place; import de.fraunhofer.isst.configmanager.petrinet.simulator.PetriNetSimulator; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Disabled; @@ -71,7 +71,11 @@ void testBuildPetriNet() throws IOException { var graph = PetriNetSimulator.buildStepGraph(petriNet); log.info(String.valueOf(graph.getArcs().size())); log.info(GraphVizGenerator.generateGraphViz(graph)); - log.info(PetriNetSimulator.getAllPaths(graph).toString()); + var allPaths = PetriNetSimulator.getAllPaths(graph); + log.info(allPaths.toString()); + var formula = nodeAND(nodeMODAL(transitionNOT(FF())), nodeOR(nodeNF(NodeExpression.nodeExpression(x -> true, "testMsg")),TT())); + log.info("Formula: " + formula.writeFormula()); + log.info("Result: " + CTLEvaluator.evaluate(formula,graph.getInitial().getNodes().stream().filter(node -> node instanceof Place).findAny().get(), allPaths)); } /** From c10a8c325ede062f6783b41997d253c0b38d9cc5 Mon Sep 17 00:00:00 2001 From: eakker Date: Fri, 30 Apr 2021 10:55:00 +0200 Subject: [PATCH 112/157] fix: only check transitions in Transition EXIST/FORALL_UNTIL (and only for places in Node EXIST/FORALL_UNTIL) --- .../petrinet/evaluation/formula/CTLEvaluator.java | 1 - .../evaluation/formula/state/NodeEXIST_UNTIL.java | 4 ++-- .../evaluation/formula/state/NodeFORALL_NEXT.java | 3 ++- .../evaluation/formula/state/NodeFORALL_UNTIL.java | 4 ++-- .../formula/transition/TransitionEXIST_UNTIL.java | 4 ++-- .../formula/transition/TransitionFORALL_UNTIL.java | 4 ++-- .../petrinet/builder/InfomodelPetriNetBuilderTest.java | 8 +++++++- 7 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java index bf853d18..2925301e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java @@ -21,7 +21,6 @@ public static boolean evaluateTransition(TransitionFormula ctlExpression, Transi } public static boolean evaluate(Formula ctlExpression, Node node, List> paths){ - if(ctlExpression instanceof StateFormula && node instanceof Place){ return evaluateNode((StateFormula) ctlExpression, (Place) node, paths); }else if(ctlExpression instanceof TransitionFormula && node instanceof Transition){ diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java index bf413b0b..ca90a956 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java @@ -21,8 +21,8 @@ public static NodeEXIST_UNTIL nodeEXIST_UNTIL(StateFormula parameter1, StateForm public boolean evaluate(Node node, List> paths) { if(!(node instanceof Place)) return false; check: for(var path: paths){ - if(path.get(0).equals(node)){ - for(int i = 0; i> paths) { - return nodeNOT(nodeFORALL_NEXT(nodeNOT(parameter))).evaluate(node, paths); + return nodeNOT(nodeEXIST_NEXT(nodeNOT(parameter))).evaluate(node, paths); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java index cfb2d5bb..646378e4 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java @@ -20,8 +20,8 @@ public static NodeFORALL_UNTIL nodeFORALL_UNTIL(StateFormula parameter1, StateFo public boolean evaluate(Node node, List> paths) { if(!(node instanceof Place)) return false; for(var path: paths){ - if(path.get(0).equals(node)){ - for(int i = 0; i> paths) { if(!(node instanceof Transition)) return false; check: for(var path: paths){ - if(path.get(0).equals(node)){ - for(int i = 0; i> paths) { if(!(node instanceof Transition)) return false; for(var path: paths){ - if(path.get(0).equals(node)){ - for(int i = 0; i true, "testMsg")),TT())); - log.info("Formula: " + formula.writeFormula()); + var formula2 = nodeAND(nodeFORALL_NEXT(nodeMODAL(transitionAF(arcExpression(x -> true,"")))), TT()); + log.info("Formula 1: " + formula.writeFormula()); log.info("Result: " + CTLEvaluator.evaluate(formula,graph.getInitial().getNodes().stream().filter(node -> node instanceof Place).findAny().get(), allPaths)); + log.info("Formula 2: " + formula2.writeFormula()); + log.info("Result: " + CTLEvaluator.evaluate(formula2,graph.getInitial().getNodes().stream().filter(node -> node instanceof Place).findAny().get(), allPaths)); } /** From c9330cd05e6ae13acfe2f4b56d569d274c2621fe Mon Sep 17 00:00:00 2001 From: eakker Date: Fri, 30 Apr 2021 14:20:19 +0200 Subject: [PATCH 113/157] chore: add test for example petrinet, create ContextObject to be integrated with transitions --- .../petrinet/model/ContextObject.java | 12 ++ .../petrinet/model/Transition.java | 3 + .../petrinet/model/TransitionImpl.java | 15 ++- .../petrinet/simulator/PetriNetSimulator.java | 1 - .../builder/InfomodelPetriNetBuilderTest.java | 109 +++++++++++++++++- 5 files changed, 133 insertions(+), 7 deletions(-) create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/ContextObject.java diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/ContextObject.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/ContextObject.java new file mode 100644 index 00000000..43251e0b --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/ContextObject.java @@ -0,0 +1,12 @@ +package de.fraunhofer.isst.configmanager.petrinet.model; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public class ContextObject { + + public ContextObject deepCopy(){ + return new ContextObject(); + } + +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/Transition.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/Transition.java index 37dbe07d..2e76819c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/Transition.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/Transition.java @@ -14,4 +14,7 @@ @JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = "@type") @JsonSubTypes({@JsonSubTypes.Type(TransitionImpl.class)}) public interface Transition extends Node{ + + ContextObject getContext(); + } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/TransitionImpl.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/TransitionImpl.java index cdeffdbd..062ccebc 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/TransitionImpl.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/TransitionImpl.java @@ -15,6 +15,8 @@ public class TransitionImpl implements Transition { private transient URI id; + private transient ContextObject contextObject; + @JsonIgnore private transient Set sourceArcs; @@ -27,6 +29,13 @@ public TransitionImpl(URI id){ this.targetArcs = new HashSet<>(); } + public void setContextObject(ContextObject contextObject){ + this.contextObject = contextObject; + } + + @Override + public ContextObject getContext() { return contextObject; } + @Override public URI getID() { return id; @@ -49,7 +58,9 @@ public boolean isComplementOf(Node other) { @Override public Node deepCopy() { - return new TransitionImpl(this.getID()); + var copy = new TransitionImpl(this.getID()); + copy.setContextObject(this.contextObject); + return copy; } @Override @@ -57,7 +68,7 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; TransitionImpl trans = (TransitionImpl) o; - return Objects.equals(id, trans.id); + return Objects.equals(id, trans.id) && Objects.equals(contextObject, trans.contextObject); } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java index 5eebf568..29eb8270 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java @@ -125,7 +125,6 @@ public static StepGraph buildStepGraph(PetriNet petriNet){ * (if it doesn't already contain an equal PetriNet) */ private static void addStepToStepGraph(PetriNet parent, PetriNet copy, Node transition, StepGraph stepGraph){ - log.info("Adding Step!"); Node transitionCopy = null; for(var node : copy.getNodes()){ if(node.getID().equals(transition.getID())){ diff --git a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java index 4a055565..21668823 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java @@ -3,7 +3,7 @@ import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeExpression; -import de.fraunhofer.isst.configmanager.petrinet.model.Place; +import de.fraunhofer.isst.configmanager.petrinet.model.*; import de.fraunhofer.isst.configmanager.petrinet.simulator.PetriNetSimulator; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Disabled; @@ -11,14 +11,13 @@ import java.io.IOException; import java.net.URI; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; import java.util.concurrent.ThreadLocalRandom; import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.*; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeAND.nodeAND; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeEXIST_UNTIL.nodeEXIST_UNTIL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeFORALL_NEXT.nodeFORALL_NEXT; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeMODAL.nodeMODAL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeNF.nodeNF; @@ -78,10 +77,112 @@ void testBuildPetriNet() throws IOException { log.info(allPaths.toString()); var formula = nodeAND(nodeMODAL(transitionNOT(FF())), nodeOR(nodeNF(NodeExpression.nodeExpression(x -> true, "testMsg")),TT())); var formula2 = nodeAND(nodeFORALL_NEXT(nodeMODAL(transitionAF(arcExpression(x -> true,"")))), TT()); + var formula3 = nodeEXIST_UNTIL(nodeMODAL(TT()), nodeNF(NodeExpression.nodeExpression(x -> x.getSourceArcs().isEmpty(), ""))); log.info("Formula 1: " + formula.writeFormula()); log.info("Result: " + CTLEvaluator.evaluate(formula,graph.getInitial().getNodes().stream().filter(node -> node instanceof Place).findAny().get(), allPaths)); log.info("Formula 2: " + formula2.writeFormula()); log.info("Result: " + CTLEvaluator.evaluate(formula2,graph.getInitial().getNodes().stream().filter(node -> node instanceof Place).findAny().get(), allPaths)); + log.info("Formula 3: " + formula3.writeFormula()); + log.info("Result: " + CTLEvaluator.evaluate(formula3,graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("place://source"))).findAny().get(), allPaths)); + } + + @Test + @Disabled + void testExamplePetriNet(){ + var nodes = new HashSet(); + //create nodes + var start = new PlaceImpl(URI.create("place://start")); + start.setMarkers(1); + var copy = new PlaceImpl(URI.create("place://copy")); + var init = new PlaceImpl(URI.create("place://init")); + var dat1 = new PlaceImpl(URI.create("place://data1")); + var dat2 = new PlaceImpl(URI.create("place://data2")); + var con1 = new PlaceImpl(URI.create("place://control1")); + var con2 = new PlaceImpl(URI.create("place://control2")); + var con3 = new PlaceImpl(URI.create("place://control3")); + var con4 = new PlaceImpl(URI.create("place://control4")); + var sample = new PlaceImpl(URI.create("place://sample")); + var mean = new PlaceImpl(URI.create("place://mean")); + var med = new PlaceImpl(URI.create("place://median")); + var rules = new PlaceImpl(URI.create("place://rules")); + var stor1 = new PlaceImpl(URI.create("place://stored1")); + var stor2 = new PlaceImpl(URI.create("place://stored2")); + var stor3 = new PlaceImpl(URI.create("place://stored3")); + var stor4 = new PlaceImpl(URI.create("place://stored4")); + var end = new PlaceImpl(URI.create("place://end")); + nodes.addAll(List.of(start, copy, init, dat1, dat2, con1, con2, con3, con4, sample, mean, med, rules, stor1, stor2, stor3, stor4, end)); + var initTrans = new TransitionImpl(URI.create("trans://init")); + var getData = new TransitionImpl(URI.create("trans://getData")); + var copyData = new TransitionImpl(URI.create("trans://copyData")); + var extract = new TransitionImpl(URI.create("trans://extractSample")); + var calcMean = new TransitionImpl(URI.create("trans://calcMean")); + var calcMed = new TransitionImpl(URI.create("trans://calcMedian")); + var calcRules = new TransitionImpl(URI.create("trans://calcAPrioriRules")); + var store1 = new TransitionImpl(URI.create("trans://storeData1")); + var store2 = new TransitionImpl(URI.create("trans://storeData2")); + var store3 = new TransitionImpl(URI.create("trans://storeData3")); + var store4 = new TransitionImpl(URI.create("trans://storeData4")); + var endTrans = new TransitionImpl(URI.create("trans://end")); + nodes.addAll(List.of(initTrans, getData, copyData, extract, calcMean, calcMed, calcRules, store1, store2, store3, store4, endTrans)); + //create arcs + var arcs = new HashSet(); + arcs.add(new ArcImpl(start, initTrans)); + arcs.add(new ArcImpl(initTrans, copy)); + arcs.add(new ArcImpl(initTrans, copy)); + arcs.add(new ArcImpl(initTrans, init)); + arcs.add(new ArcImpl(init, getData)); + arcs.add(new ArcImpl(getData, dat1)); + arcs.add(new ArcImpl(copy, copyData)); + arcs.add(new ArcImpl(dat1, copyData)); + arcs.add(new ArcImpl(copyData, dat1)); + arcs.add(new ArcImpl(copyData, dat2)); + arcs.add(new ArcImpl(getData, con1)); + arcs.add(new ArcImpl(getData, con2)); + arcs.add(new ArcImpl(getData, con3)); + arcs.add(new ArcImpl(getData, con4)); + arcs.add(new ArcImpl(dat2, extract)); + arcs.add(new ArcImpl(dat2, calcMean)); + arcs.add(new ArcImpl(dat2, calcMed)); + arcs.add(new ArcImpl(dat2, calcRules)); + arcs.add(new ArcImpl(con1, extract)); + arcs.add(new ArcImpl(con2, calcMean)); + arcs.add(new ArcImpl(con3, calcMed)); + arcs.add(new ArcImpl(con4, calcRules)); + arcs.add(new ArcImpl(extract, sample)); + arcs.add(new ArcImpl(calcMean, mean)); + arcs.add(new ArcImpl(calcMed, med)); + arcs.add(new ArcImpl(calcRules, rules)); + arcs.add(new ArcImpl(extract, copy)); + arcs.add(new ArcImpl(calcMean, copy)); + arcs.add(new ArcImpl(calcMed, copy)); + arcs.add(new ArcImpl(calcRules, copy)); + arcs.add(new ArcImpl(sample, store1)); + arcs.add(new ArcImpl(mean, store2)); + arcs.add(new ArcImpl(med, store3)); + arcs.add(new ArcImpl(rules, store4)); + arcs.add(new ArcImpl(store1, stor1)); + arcs.add(new ArcImpl(store2, stor2)); + arcs.add(new ArcImpl(store3, stor3)); + arcs.add(new ArcImpl(store4, stor4)); + arcs.add(new ArcImpl(stor1, endTrans)); + arcs.add(new ArcImpl(stor2, endTrans)); + arcs.add(new ArcImpl(stor3, endTrans)); + arcs.add(new ArcImpl(stor4, endTrans)); + arcs.add(new ArcImpl(endTrans, end)); + //create petriNet and visualize + var petriNet = new PetriNetImpl(URI.create("https://petrinet"), nodes, arcs); + log.info(GraphVizGenerator.generateGraphViz(petriNet)); + //build stepGraph and visualize + var graph = PetriNetSimulator.buildStepGraph(petriNet); + log.info(GraphVizGenerator.generateGraphViz(graph)); + log.info(String.format("%d possible states!", graph.getSteps().size())); + //find valid paths and visualize + var allPaths = PetriNetSimulator.getAllPaths(graph); + log.info(String.format("Found %d valid Paths!", allPaths.size())); + //create formula and evaluate on start node (exists path from start to end) + var formula = nodeEXIST_UNTIL(nodeMODAL(TT()), nodeNF(NodeExpression.nodeExpression(x -> x.getSourceArcs().isEmpty(), ""))); + log.info("Evaluating Formula: " + formula.writeFormula()); + log.info("Result: " + CTLEvaluator.evaluate(formula,graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("place://start"))).findAny().get(), allPaths)); } /** From e4be22f3785894d38c06ed2d80497e156509ef28 Mon Sep 17 00:00:00 2001 From: eakker Date: Tue, 4 May 2021 11:04:07 +0200 Subject: [PATCH 114/157] chore: add context, read, write, erase to ContextObject --- .../petrinet/model/ContextObject.java | 23 ++++++++++++++++++- .../petrinet/model/TransitionImpl.java | 2 +- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/ContextObject.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/ContextObject.java index 43251e0b..08f15de1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/ContextObject.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/ContextObject.java @@ -1,12 +1,33 @@ package de.fraunhofer.isst.configmanager.petrinet.model; import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; @AllArgsConstructor +@Getter public class ContextObject { + private List context; + private String read, write, erase; + public ContextObject deepCopy(){ - return new ContextObject(); + return new ContextObject(context, read, write, erase); } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ContextObject that = (ContextObject) o; + return Objects.equals(context, that.context) && Objects.equals(read, that.read) && Objects.equals(write, that.write) && Objects.equals(erase, that.erase); + } + + @Override + public int hashCode() { + return Objects.hash(new ArrayList<>(context), read, write, erase); + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/TransitionImpl.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/TransitionImpl.java index 062ccebc..33e872e5 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/TransitionImpl.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/TransitionImpl.java @@ -59,7 +59,7 @@ public boolean isComplementOf(Node other) { @Override public Node deepCopy() { var copy = new TransitionImpl(this.getID()); - copy.setContextObject(this.contextObject); + if(this.contextObject != null) copy.setContextObject(this.contextObject.deepCopy()); return copy; } From a5f09da81e9f5ad8ccc54bacc27748930280cc03 Mon Sep 17 00:00:00 2001 From: eakker Date: Tue, 4 May 2021 11:59:45 +0200 Subject: [PATCH 115/157] chore: add ContextObjects to Example PetriNet, add new formula --- .../builder/InfomodelPetriNetBuilderTest.java | 61 +++++++++++++++++-- 1 file changed, 56 insertions(+), 5 deletions(-) diff --git a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java index 21668823..0412a234 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java @@ -18,15 +18,26 @@ import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeAND.nodeAND; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeEXIST_UNTIL.nodeEXIST_UNTIL; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeExpression.nodeExpression; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeFORALL_MODAL.nodeFORALL_MODAL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeFORALL_NEXT.nodeFORALL_NEXT; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeFORALL_UNTIL.nodeFORALL_UNTIL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeMODAL.nodeMODAL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeNF.nodeNF; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeNOT.nodeNOT; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeOR.nodeOR; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodePOS.nodePOS; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.ArcExpression.arcExpression; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionAF.transitionAF; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionAND.transitionAND; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionEXIST_UNTIL.transitionEXIST_UNTIL; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFORALL_UNTIL.transitionFORALL_UNTIL; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionMODAL.transitionMODAL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionNOT.transitionNOT; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.FF.FF; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.TT.TT; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionOR.transitionOR; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionPOS.transitionPOS; /** * Test building a PetriNet from a randomly generated AppRoute @@ -75,9 +86,9 @@ void testBuildPetriNet() throws IOException { log.info(GraphVizGenerator.generateGraphViz(graph)); var allPaths = PetriNetSimulator.getAllPaths(graph); log.info(allPaths.toString()); - var formula = nodeAND(nodeMODAL(transitionNOT(FF())), nodeOR(nodeNF(NodeExpression.nodeExpression(x -> true, "testMsg")),TT())); + var formula = nodeAND(nodeMODAL(transitionNOT(FF())), nodeOR(nodeNF(nodeExpression(x -> true, "testMsg")),TT())); var formula2 = nodeAND(nodeFORALL_NEXT(nodeMODAL(transitionAF(arcExpression(x -> true,"")))), TT()); - var formula3 = nodeEXIST_UNTIL(nodeMODAL(TT()), nodeNF(NodeExpression.nodeExpression(x -> x.getSourceArcs().isEmpty(), ""))); + var formula3 = nodeEXIST_UNTIL(nodeMODAL(TT()), nodeNF(nodeExpression(x -> x.getSourceArcs().isEmpty(), ""))); log.info("Formula 1: " + formula.writeFormula()); log.info("Result: " + CTLEvaluator.evaluate(formula,graph.getInitial().getNodes().stream().filter(node -> node instanceof Place).findAny().get(), allPaths)); log.info("Formula 2: " + formula2.writeFormula()); @@ -112,17 +123,29 @@ void testExamplePetriNet(){ var end = new PlaceImpl(URI.create("place://end")); nodes.addAll(List.of(start, copy, init, dat1, dat2, con1, con2, con3, con4, sample, mean, med, rules, stor1, stor2, stor3, stor4, end)); var initTrans = new TransitionImpl(URI.create("trans://init")); + initTrans.setContextObject(new ContextObject(List.of(), null, null, null)); var getData = new TransitionImpl(URI.create("trans://getData")); + getData.setContextObject(new ContextObject(List.of(), null, "data", null)); var copyData = new TransitionImpl(URI.create("trans://copyData")); + copyData.setContextObject(new ContextObject(List.of("france"), "data", "data", null)); var extract = new TransitionImpl(URI.create("trans://extractSample")); + extract.setContextObject(new ContextObject(List.of("france"), "data", "sample", "data")); var calcMean = new TransitionImpl(URI.create("trans://calcMean")); + calcMean.setContextObject(new ContextObject(List.of("france"), "data", "mean", "data")); var calcMed = new TransitionImpl(URI.create("trans://calcMedian")); + calcMed.setContextObject(new ContextObject(List.of("france"), "data", "median", "data")); var calcRules = new TransitionImpl(URI.create("trans://calcAPrioriRules")); + calcRules.setContextObject(new ContextObject(List.of("france", "high_performance"), "data", "rules", "data")); var store1 = new TransitionImpl(URI.create("trans://storeData1")); + store1.setContextObject(new ContextObject(List.of(), "sample", null, "sample")); var store2 = new TransitionImpl(URI.create("trans://storeData2")); + store2.setContextObject(new ContextObject(List.of(), "mean", null, "mean")); var store3 = new TransitionImpl(URI.create("trans://storeData3")); + store3.setContextObject(new ContextObject(List.of(), "median", null, "median")); var store4 = new TransitionImpl(URI.create("trans://storeData4")); + store4.setContextObject(new ContextObject(List.of(), "rules", null, "rules")); var endTrans = new TransitionImpl(URI.create("trans://end")); + endTrans.setContextObject(new ContextObject(List.of(), null, null, null)); nodes.addAll(List.of(initTrans, getData, copyData, extract, calcMean, calcMed, calcRules, store1, store2, store3, store4, endTrans)); //create arcs var arcs = new HashSet(); @@ -180,9 +203,37 @@ void testExamplePetriNet(){ var allPaths = PetriNetSimulator.getAllPaths(graph); log.info(String.format("Found %d valid Paths!", allPaths.size())); //create formula and evaluate on start node (exists path from start to end) - var formula = nodeEXIST_UNTIL(nodeMODAL(TT()), nodeNF(NodeExpression.nodeExpression(x -> x.getSourceArcs().isEmpty(), ""))); + var formula = nodePOS(nodeNF(nodeExpression(x -> x.getSourceArcs().isEmpty(), ""))); log.info("Evaluating Formula: " + formula.writeFormula()); - log.info("Result: " + CTLEvaluator.evaluate(formula,graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("place://start"))).findAny().get(), allPaths)); + log.info("Result: " + CTLEvaluator.evaluate(formula, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("place://start"))).findAny().get(), allPaths)); + var formulaFrance = nodeMODAL( + transitionNOT( + transitionFORALL_UNTIL( + transitionAND( + transitionAF(arcExpression(transition -> + {if(transition.getContext().getRead() != null && transition.getContext().getRead().equals("data")) { return transition.getContext().getContext().contains("france"); } return true;}, "") + ), + transitionPOS( + transitionOR( + transitionMODAL(nodeNF(nodeExpression(node -> node.getID().equals(URI.create("place://end")), ""))), + transitionAF(arcExpression(transition -> transition.getContext().getErase() != null && transition.getContext().getErase().equals("data"), ""))) + )), + transitionAND( + transitionAF(arcExpression(transition -> + {if(transition.getContext().getRead() != null && transition.getContext().getRead().equals("data")) { + return transition.getContext().getContext().contains("france"); + } return true;}, "")), + transitionPOS( + transitionOR( + transitionMODAL(nodeNF(nodeExpression(node -> node.getID().equals(URI.create("place://end")), ""))), + transitionAF(arcExpression(transition -> transition.getContext().getErase() != null && transition.getContext().getErase().equals("data"), ""))) + ) + ) + ) + ) + ); + log.info("Formula France: " + formulaFrance.writeFormula()); + log.info("Result: " + CTLEvaluator.evaluate(formulaFrance, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("place://start"))).findAny().get(), allPaths)); } /** @@ -204,7 +255,7 @@ public static ArrayList randomSubList(List input) { @Test @Disabled public void testFormula(){ - var formula = nodeAND(nodeMODAL(transitionNOT(FF())), nodeOR(nodeNF(NodeExpression.nodeExpression(x -> true, "testMsg")),TT())); + var formula = nodeAND(nodeMODAL(transitionNOT(FF())), nodeOR(nodeNF(nodeExpression(x -> true, "testMsg")),TT())); log.info(formula.writeFormula()); } } From 5130a4ffc9cdf6b0cfd3889b4bc1507878c04ff4 Mon Sep 17 00:00:00 2001 From: eakker Date: Wed, 5 May 2021 13:59:38 +0200 Subject: [PATCH 116/157] chore: add path filtering and path calculation for the StepGraph -- add TODOs to EXIST/FORALL_UNTIL operators to use filtered lists --- .../formula/state/NodeEXIST_UNTIL.java | 1 + .../formula/state/NodeFORALL_UNTIL.java | 1 + .../transition/TransitionEXIST_UNTIL.java | 1 + .../transition/TransitionFORALL_UNTIL.java | 1 + .../petrinet/model/PlaceImpl.java | 7 ++ .../petrinet/simulator/PetriNetSimulator.java | 64 ++++++++++++++++++- .../builder/InfomodelPetriNetBuilderTest.java | 7 +- 7 files changed, 80 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java index ca90a956..348a4c40 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java @@ -18,6 +18,7 @@ public static NodeEXIST_UNTIL nodeEXIST_UNTIL(StateFormula parameter1, StateForm @Override // True if a path exists, where parameter1 is true on each node of the path, // and parameter2 is true on the final node of the path + //TODO fix evaluation: use filtered paths public boolean evaluate(Node node, List> paths) { if(!(node instanceof Place)) return false; check: for(var path: paths){ diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java index 646378e4..bb9ea079 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java @@ -16,6 +16,7 @@ public static NodeFORALL_UNTIL nodeFORALL_UNTIL(StateFormula parameter1, StateFo private StateFormula parameter1, parameter2; //like EXIST_UNTIL for all paths + //TODO fix evaluation: use filtered paths @Override public boolean evaluate(Node node, List> paths) { if(!(node instanceof Place)) return false; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java index 0837aa21..537e099b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java @@ -17,6 +17,7 @@ public static TransitionEXIST_UNTIL transitionEXIST_UNTIL(TransitionFormula para // True if a path exists, where parameter1 is true on each transition of the path, // and parameter2 is true on the final transition of the path + //TODO fix evaluation: use filtered paths @Override public boolean evaluate(Node node, List> paths) { if(!(node instanceof Transition)) return false; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java index 92d03842..9f8e236a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java @@ -16,6 +16,7 @@ public static TransitionFORALL_UNTIL transitionFORALL_UNTIL(TransitionFormula pa private TransitionFormula parameter1, parameter2; //like EXIST_UNTIL but requires conditions for all paths + //TODO fix evaluation: use filtered paths @Override public boolean evaluate(Node node, List> paths) { if(!(node instanceof Transition)) return false; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/PlaceImpl.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/PlaceImpl.java index c5cd9fa5..df9e2e2b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/PlaceImpl.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/PlaceImpl.java @@ -72,4 +72,11 @@ public boolean equals(Object o) { Objects.equals(id, place.id); } + public boolean equalsExceptMarking(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + PlaceImpl place = (PlaceImpl) o; + return Objects.equals(id, place.id); + } + } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java index 29eb8270..f67392b0 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java @@ -4,7 +4,9 @@ import de.fraunhofer.isst.configmanager.petrinet.model.*; import lombok.extern.slf4j.Slf4j; +import java.net.URI; import java.util.ArrayList; +import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -178,7 +180,7 @@ public static List> getAllPaths(StepGraph stepGraph){ } } allPaths.sort(Comparator.comparingInt(List::size)); - return allPaths; + return filterPaths(allPaths); } /** @@ -229,4 +231,64 @@ private static List> getPathsOfLengthNplus1(List> pathsLen private static boolean circleFree(List list){ return list.stream().distinct().count() == list.size(); } + + public static List> calculatePaths(StepGraph stepGraph){ + List> len1 =calcPathsOfLength1(stepGraph); + List> lenN = new ArrayList<>(len1); + lenN = lenN.stream().filter(path -> path.get(0).equals(stepGraph.getInitial())).collect(Collectors.toList()); + List> allPaths = new ArrayList<>(lenN); + int i = 1; + while(!lenN.isEmpty()){ + log.info("Calculating paths of length " + ++i); + lenN = calcPathsOfLengthNplus1(len1, lenN); + log.info(String.format("Length %d: %d", i, lenN.size())); + if(!lenN.isEmpty()){ + allPaths.addAll(lenN); + } + } + allPaths.sort(Comparator.comparingInt(List::size)); + return allPaths; + } + + private static List> calcPathsOfLength1(StepGraph stepGraph){ + List> paths = new ArrayList<>(); + for(var arc : stepGraph.getArcs()){ + var sourcePart = new ArrayList<>(); + sourcePart.add(arc.getSource()); + sourcePart.add(arc.getUsedTransition()); + paths.add(sourcePart); + var targetPart = new ArrayList<>(); + targetPart.add(arc.getUsedTransition()); + targetPart.add(arc.getTarget()); + paths.add(targetPart); + } + return paths; + } + + private static List> calcPathsOfLengthNplus1(List> len1, List> lenN){ + List> pathsLenNplus1 = new ArrayList<>(); + for(var pathN : lenN){ + for(var path1 : len1){ + if(pathN.get(pathN.size()-1).equals(path1.get(0)) && circleFree(pathN)){ + var pathNplus1 = new ArrayList<>(pathN); + pathNplus1.add(path1.get(path1.size()-1)); + pathsLenNplus1.add(pathNplus1); + } + } + } + return pathsLenNplus1; + } + + private static List> filterPaths(List> paths){ + List> filtered = new ArrayList<>(List.copyOf(paths)); + var filteredCopy = new ArrayList<>(filtered); + for(var pathY : filteredCopy){ + for(var pathX : paths){ + if(pathX.get(0).equals(pathY.get(0)) && !pathX.equals(pathY) && Collections.indexOfSubList(pathY, pathX) != -1){ + filtered.remove(pathX); + } + } + } + return filtered; + } } diff --git a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java index 0412a234..d4287c13 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java @@ -122,6 +122,7 @@ void testExamplePetriNet(){ var stor4 = new PlaceImpl(URI.create("place://stored4")); var end = new PlaceImpl(URI.create("place://end")); nodes.addAll(List.of(start, copy, init, dat1, dat2, con1, con2, con3, con4, sample, mean, med, rules, stor1, stor2, stor3, stor4, end)); + //create transitions with context var initTrans = new TransitionImpl(URI.create("trans://init")); initTrans.setContextObject(new ContextObject(List.of(), null, null, null)); var getData = new TransitionImpl(URI.create("trans://getData")); @@ -197,9 +198,12 @@ void testExamplePetriNet(){ log.info(GraphVizGenerator.generateGraphViz(petriNet)); //build stepGraph and visualize var graph = PetriNetSimulator.buildStepGraph(petriNet); - log.info(GraphVizGenerator.generateGraphViz(graph)); + //log.info(GraphVizGenerator.generateGraphViz(graph)); log.info(String.format("%d possible states!", graph.getSteps().size())); //find valid paths and visualize + var transitionList = PetriNetSimulator.getAllPaths(graph); + log.info("Transitions: " + transitionList.size()); + /* var allPaths = PetriNetSimulator.getAllPaths(graph); log.info(String.format("Found %d valid Paths!", allPaths.size())); //create formula and evaluate on start node (exists path from start to end) @@ -234,6 +238,7 @@ void testExamplePetriNet(){ ); log.info("Formula France: " + formulaFrance.writeFormula()); log.info("Result: " + CTLEvaluator.evaluate(formulaFrance, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("place://start"))).findAny().get(), allPaths)); + */ } /** From dcce4abe3f9138b640984f6d7a85ab5b277582fd Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Thu, 6 May 2021 10:43:58 +0200 Subject: [PATCH 117/157] refactor: code refactoring (mainly petrinet classes) --- .../api/service/BrokerService.java | 4 +- .../resources/ResourceContractBuilder.java | 29 ++- .../data/enums/UsagePolicyName.java | 14 +- .../petrinet/builder/GraphVizGenerator.java | 66 +++-- .../builder/InfomodelPetriNetBuilder.java | 99 ++++--- .../evaluation/formula/CTLEvaluator.java | 21 +- .../petrinet/evaluation/formula/FF.java | 4 +- .../petrinet/evaluation/formula/TT.java | 4 +- .../evaluation/formula/state/NodeALONG.java | 7 +- .../evaluation/formula/state/NodeAND.java | 9 +- .../evaluation/formula/state/NodeEV.java | 7 +- .../formula/state/NodeEXIST_MODAL.java | 10 +- .../formula/state/NodeEXIST_NEXT.java | 6 +- .../formula/state/NodeEXIST_UNTIL.java | 30 ++- .../formula/state/NodeExpression.java | 10 +- .../formula/state/NodeFORALL_MODAL.java | 34 ++- .../formula/state/NodeFORALL_NEXT.java | 7 +- .../formula/state/NodeFORALL_UNTIL.java | 29 ++- .../evaluation/formula/state/NodeINV.java | 7 +- .../evaluation/formula/state/NodeMODAL.java | 9 +- .../evaluation/formula/state/NodeNF.java | 7 +- .../evaluation/formula/state/NodeNOT.java | 7 +- .../evaluation/formula/state/NodeOR.java | 9 +- .../evaluation/formula/state/NodePOS.java | 7 +- .../formula/transition/ArcExpression.java | 10 +- .../formula/transition/TransitionAF.java | 7 +- .../formula/transition/TransitionALONG.java | 9 +- .../formula/transition/TransitionAND.java | 9 +- .../formula/transition/TransitionEV.java | 7 +- .../transition/TransitionEXIST_MODAL.java | 10 +- .../transition/TransitionEXIST_NEXT.java | 6 +- .../transition/TransitionEXIST_UNTIL.java | 29 ++- .../transition/TransitionFORALL_MODAL.java | 35 ++- .../transition/TransitionFORALL_NEXT.java | 7 +- .../transition/TransitionFORALL_UNTIL.java | 29 ++- .../formula/transition/TransitionINV.java | 7 +- .../formula/transition/TransitionMODAL.java | 9 +- .../formula/transition/TransitionNOT.java | 7 +- .../formula/transition/TransitionOR.java | 8 +- .../formula/transition/TransitionPOS.java | 7 +- .../configmanager/petrinet/model/ArcImpl.java | 41 +-- .../petrinet/model/ContextObject.java | 23 +- .../configmanager/petrinet/model/HasId.java | 2 +- .../configmanager/petrinet/model/Node.java | 6 +- .../petrinet/model/PetriNet.java | 13 +- .../petrinet/model/PetriNetImpl.java | 56 ++-- .../configmanager/petrinet/model/Place.java | 8 +- .../petrinet/model/PlaceImpl.java | 46 ++-- .../petrinet/model/Transition.java | 4 +- .../petrinet/model/TransitionImpl.java | 32 ++- .../petrinet/simulator/NetArc.java | 14 +- .../petrinet/simulator/PetriNetSimulator.java | 246 +++++++++++------- .../petrinet/simulator/StepGraph.java | 19 +- .../ConfigmanagerApplicationTests.java | 1 - .../api_test/BrokerUIAPITest.java | 15 +- .../builder/InfomodelPetriNetBuilderTest.java | 99 ++++--- .../isst/configmanager/util/TestUtil.java | 5 +- 57 files changed, 749 insertions(+), 513 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java index a05efdd7..94194ead 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java @@ -139,7 +139,7 @@ public void setBrokerStatus(final URI brokerId, final BrokerRegistrationStatus b } /** - * This method registers resources at a broker + * This method registers resources at a broker. * * @param brokerId broker uri */ @@ -221,7 +221,7 @@ public JSONArray getRegisStatusForResource(final URI resourceId) { } /** - * This method returns a JSONArray with the currently registered brokers + * This method returns a JSONArray with the currently registered brokers. * * @return json array of all registered broker */ diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java index e44d9f80..3926f755 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java @@ -23,13 +23,14 @@ import java.util.Objects; /** - * This class builds ContractOffer objects + * This class builds ContractOffer objects. */ @Service public class ResourceContractBuilder { /** - * This method creates a usage until deletion ContractOffer + * This method creates a usage until deletion ContractOffer. + * * @param startDate start date of contract * @param endDate end date of contract * @param deletionDate deletion date of contract @@ -68,7 +69,8 @@ public ContractOffer buildUsageUntilDeletion(final String startDate, } /** - * This method creates a usage during interval ContractOffer + * This method creates a usage during interval ContractOffer. + * * @param fromDate permission is valid after fromDate * @param toDate permission is valid before toDate * @return ContractOffer object with a usage during interval policy @@ -96,7 +98,8 @@ public ContractOffer buildUsageDuringInterval(final String fromDate, } /** - * This method creates a logging ContractOffer + * This method creates a logging ContractOffer. + * * @return ContractOffer object with logging PostDuty */ public ContractOffer buildUsageLogging() { @@ -113,7 +116,8 @@ public ContractOffer buildUsageLogging() { } /** - * This method create a usage notification ContractOffer + * This method create a usage notification ContractOffer. + * * @param url url to where usage should be notified * @return ContractOffer object with usage notification policy */ @@ -137,7 +141,8 @@ public ContractOffer buidUsageNotification(final String url) { } /** - * This method creates a duration usage ContractOffer + * This method creates a duration usage ContractOffer. + * * @param number usage duration time * @return ContractOffer object with duration usage policy */ @@ -157,7 +162,8 @@ public ContractOffer buildDurationUsage(final String number) { } /** - * This method reads a jsonNode and returns the corresponding BinaryOperator + * This method reads a jsonNode and returns the corresponding BinaryOperator. + * * @param jsonNode jsonNode to parse * @return BinaryOperator */ @@ -177,7 +183,8 @@ public BinaryOperator getBinaryOperator(final JsonNode jsonNode) { } /** - * This method creates a n times usage ContractOffer + * This method creates a n times usage ContractOffer. + * * @param binaryOperator operator for the constraint * @param number how many times the usage should be allowed * @param pipEndpoint PIP endpoint of constraint @@ -203,7 +210,8 @@ public ContractOffer buildNTimesUsage(final BinaryOperator binaryOperator, } /** - * This method creates a prohibit access contract offer + * This method creates a prohibit access contract offer. + * * @return ContractOffer with prohibition of access */ public ContractOffer buildProhibitAccess() { @@ -217,7 +225,8 @@ public ContractOffer buildProhibitAccess() { } /** - * This method creates a provide access contract offer + * This method creates a provide access contract offer. + * * @return ContractOffer with access permission */ public ContractOffer buildProvideAccess() { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/data/enums/UsagePolicyName.java b/src/main/java/de/fraunhofer/isst/configmanager/data/enums/UsagePolicyName.java index 5fa8d948..90411e14 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/data/enums/UsagePolicyName.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/enums/UsagePolicyName.java @@ -7,32 +7,32 @@ public enum UsagePolicyName { */ PROVIDE_ACCESS("PROVIDE_ACCESS"), /** - * Default pattern if no other is detected. v2.0: NO_POLICY("no-policy") + * Default pattern if no other is detected. v2.0: NO_POLICY("no-policy"). */ PROHIBIT_ACCESS("PROHIBIT_ACCESS"), /** - * Type: NotMoreThanN v2.0: COUNT_ACCESS("count-access") https://github.com/International-Data-Spaces-Association/InformationModel/blob/master/examples/contracts-and-usage-policy/templates/NTimesUsageTemplates/N_TIMES_USAGE_OFFER_TEMPLATE.jsonld + * Type: NotMoreThanN v2.0: COUNT_ACCESS("count-access") https://github.com/International-Data-Spaces-Association/InformationModel/blob/master/examples/contracts-and-usage-policy/templates/NTimesUsageTemplates/N_TIMES_USAGE_OFFER_TEMPLATE.jsonld. */ N_TIMES_USAGE("N_TIMES_USAGE"), /** - * Type: DurationOffer https://github.com/International-Data-Spaces-Association/InformationModel/blob/master/examples/contracts-and-usage-policy/templates/TimeRestrictedUsageTemplates/DURATION_USAGE_OFFER_TEMPLATE.jsonld + * Type: DurationOffer https://github.com/International-Data-Spaces-Association/InformationModel/blob/master/examples/contracts-and-usage-policy/templates/TimeRestrictedUsageTemplates/DURATION_USAGE_OFFER_TEMPLATE.jsonld. */ DURATION_USAGE("DURATION_USAGE"), /** - * Type: IntervalUsage v2.0: TIME_INTERVAL("time-interval") https://github.com/International-Data-Spaces-Association/InformationModel/blob/master/examples/contracts-and-usage-policy/templates/TimeRestrictedUsageTemplates/USAGE_DURING_INTERVAL_OFFER_TEMPLATE.jsonld + * Type: IntervalUsage v2.0: TIME_INTERVAL("time-interval") https://github.com/International-Data-Spaces-Association/InformationModel/blob/master/examples/contracts-and-usage-policy/templates/TimeRestrictedUsageTemplates/USAGE_DURING_INTERVAL_OFFER_TEMPLATE.jsonld. */ USAGE_DURING_INTERVAL("USAGE_DURING_INTERVAL"), /** * Type: DeleteAfterInterval v2.0: DELETE_AFTER("delete-after") - * https://github.com/International-Data-Spaces-Association/InformationModel/blob/master/examples/contracts-and-usage-policy/templates/TimeRestrictedUsageTemplates/USAGE_UNTIL_DELETION_OFFER_TEMPLATE.jsonld + * https://github.com/International-Data-Spaces-Association/InformationModel/blob/master/examples/contracts-and-usage-policy/templates/TimeRestrictedUsageTemplates/USAGE_UNTIL_DELETION_OFFER_TEMPLATE.jsonld. */ USAGE_UNTIL_DELETION("USAGE_UNTIL_DELETION"), /** - * Type: Logging v2.0: LOG_ACCESS("log-access") https://github.com/International-Data-Spaces-Association/InformationModel/blob/master/examples/contracts-and-usage-policy/templates/UsageLoggingTemplates/USAGE_LOGGING_OFFER_TEMPLATE.jsonld + * Type: Logging v2.0: LOG_ACCESS("log-access") https://github.com/International-Data-Spaces-Association/InformationModel/blob/master/examples/contracts-and-usage-policy/templates/UsageLoggingTemplates/USAGE_LOGGING_OFFER_TEMPLATE.jsonld. */ USAGE_LOGGING("USAGE_LOGGING"), /** - * Type: Notification https://github.com/International-Data-Spaces-Association/InformationModel/blob/master/examples/contracts-and-usage-policy/templates/UsageNotificationTemplates/USAGE_NOTIFICATION_OFFER_TEMPLATE.jsonld + * Type: Notification https://github.com/International-Data-Spaces-Association/InformationModel/blob/master/examples/contracts-and-usage-policy/templates/UsageNotificationTemplates/USAGE_NOTIFICATION_OFFER_TEMPLATE.jsonld. */ USAGE_NOTIFICATION("USAGE_NOTIFICATION"); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/builder/GraphVizGenerator.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/builder/GraphVizGenerator.java index 25768f1a..b2f79c7b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/builder/GraphVizGenerator.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/builder/GraphVizGenerator.java @@ -4,6 +4,7 @@ import de.fraunhofer.isst.configmanager.petrinet.model.PlaceImpl; import de.fraunhofer.isst.configmanager.petrinet.model.TransitionImpl; import de.fraunhofer.isst.configmanager.petrinet.simulator.StepGraph; +import lombok.experimental.UtilityClass; import java.util.ArrayList; import java.util.HashMap; @@ -13,35 +14,40 @@ * Images can be generated from the given String using GraphViz (https://graphviz.org/) * or by pasting the String into GraphViz online (https://dreampuf.github.io/GraphvizOnline) */ +@UtilityClass public class GraphVizGenerator { - + /** - * Generate a GraphViz Dot String representation for the given {@link PetriNet} + * Generate a GraphViz Dot String representation for the given {@link PetriNet}. * * @param petriNet The PetriNet for which the Graph representation should be built. * @return a DOT String, used for visualizing the PetriNet with GraphViz */ - public static String generateGraphViz(PetriNet petriNet){ + public static String generateGraphViz(final PetriNet petriNet) { final var s = new StringBuilder(); s.append("digraph graphname {"); - for(var node : petriNet.getNodes()){ - if(node instanceof TransitionImpl){ + + for (final var node : petriNet.getNodes()) { + if (node instanceof TransitionImpl) { //transitions will be drawn as boxes s.append(node.getID().hashCode() + " [shape=box, label=\"" + node.getID() + "\"];"); - }else { + } else { //nodes will be drawn as circles and coloured red, if there have markers s.append(node.getID().hashCode() + "[label=\"" + node.getID() + "\""); - if(((PlaceImpl) node).getMarkers() > 0){ + + if (((PlaceImpl) node).getMarkers() > 0) { s.append(", color=red"); } s.append("];"); s.append(node.getID().hashCode() + "[label=\"" + node.getID() + "\"];"); } } - for(var arc : petriNet.getArcs()){ + + for (final var arc : petriNet.getArcs()) { //a directed edge will be drawn for every arc s.append(arc.getSource().getID().hashCode() + " -> " + arc.getTarget().getID().hashCode() + ";"); } + s.append("}"); return s.toString(); } @@ -51,37 +57,46 @@ public static String generateGraphViz(PetriNet petriNet){ * The StepGraph for which the Graph representation should be built. * @return a DOT String, used for visualizing the StepGraph with GraphViz. */ - public static String generateGraphViz(StepGraph stepGraph){ - var someId = String.valueOf(stepGraph.getSteps().stream().findAny().get().getNodes().stream().findAny().get().getID().hashCode()); - var graphArcs = new ArrayList(); - StringBuilder s = new StringBuilder(); + public static String generateGraphViz(final StepGraph stepGraph) { + final var someId = String.valueOf(stepGraph.getSteps().stream().findAny().get().getNodes().stream().findAny().get().getID().hashCode()); + final var graphArcs = new ArrayList(); + final var s = new StringBuilder(); + final var idMap = new HashMap(); + + var i = 0; + s.append("digraph graphname {"); //the StepGraph will be a compound graph from all PetriNet subgraphs it contains s.append("compound=true;"); - var i = 0; - var idMap = new HashMap(); - for(var petriNet : stepGraph.getSteps()){ + + + for (var petriNet : stepGraph.getSteps()) { //generate the graph for every PetriNet in the StepGraph var petriString = generateGraphViz(petriNet); //the PetriNet Graphs will be subgraphs and have different names petriString = petriString.replace("digraph", "subgraph"); petriString = petriString.replace("graphname", "cluster"+i); - for(var node : petriNet.getNodes()){ + + for (final var node : petriNet.getNodes()) { //nodes must have unique names too (or DOT will draw them as the same node) petriString = petriString.replace(String.valueOf(node.getID().hashCode()), node.getID().hashCode()+String.valueOf(i)); } + s.append(petriString); idMap.put(petriNet, i); i++; } - for(var arc : stepGraph.getArcs()){ + + for (final var arc : stepGraph.getArcs()) { //build a GraphvizArc for each NetArc in the StepGraph graphArcs.add(new GraphvizArc(idMap.get(arc.getSource()), idMap.get(arc.getTarget()))); } - for(var arc : graphArcs){ + + for (final var arc : graphArcs) { //draw the GraphVizArcs as directed edges between the PetriNet Subgraphs s.append(someId + arc.getSource() + " -> " + someId + arc.getTarget() + "[ltail=cluster"+arc.getSource()+",lhead=cluster"+arc.getTarget()+"];"); } + s.append("}"); return s.toString(); } @@ -89,27 +104,28 @@ public static String generateGraphViz(StepGraph stepGraph){ /** * Utility Subclass, representing Petri Net Arcs */ - public static class GraphvizArc{ - private int source, target; + public static class GraphvizArc { + private int source; + private int target; - public GraphvizArc(int source, int target){ + public GraphvizArc(final int source, final int target) { this.source = source; this.target = target; } - public int getSource(){ + public int getSource() { return source; } - public int getTarget(){ + public int getTarget() { return target; } - public void setSource(int source){ + public void setSource(final int source) { this.source = source; } - public void setTarget(int target){ + public void setTarget(final int target) { this.target = target; } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilder.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilder.java index e0678532..06150e07 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilder.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilder.java @@ -3,7 +3,16 @@ import de.fraunhofer.iais.eis.AppRoute; import de.fraunhofer.iais.eis.Endpoint; import de.fraunhofer.iais.eis.RouteStep; -import de.fraunhofer.isst.configmanager.petrinet.model.*; +import de.fraunhofer.isst.configmanager.petrinet.model.Arc; +import de.fraunhofer.isst.configmanager.petrinet.model.ArcImpl; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; +import de.fraunhofer.isst.configmanager.petrinet.model.PetriNet; +import de.fraunhofer.isst.configmanager.petrinet.model.PetriNetImpl; +import de.fraunhofer.isst.configmanager.petrinet.model.Place; +import de.fraunhofer.isst.configmanager.petrinet.model.PlaceImpl; +import de.fraunhofer.isst.configmanager.petrinet.model.Transition; +import de.fraunhofer.isst.configmanager.petrinet.model.TransitionImpl; +import lombok.experimental.UtilityClass; import java.net.URI; import java.util.HashMap; @@ -14,6 +23,7 @@ /** * Provide static methods, to generate a Petri Net (https://en.wikipedia.org/wiki/Petri_net) from an Infomodel AppRoute. */ +@UtilityClass public class InfomodelPetriNetBuilder { /** @@ -23,44 +33,49 @@ public class InfomodelPetriNetBuilder { * @param appRoute an Infomodel {@link AppRoute} * @return a Petri Net created from the AppRoute */ - public static PetriNet petriNetFromAppRoute(AppRoute appRoute, boolean includeAppRoute){ + public static PetriNet petriNetFromAppRoute(final AppRoute appRoute, + final boolean includeAppRoute) { //create sets for places, transitions and arcs - var places = new HashMap(); - var transitions = new HashMap(); - var arcs = new HashSet(); + final var places = new HashMap(); + final var transitions = new HashMap(); + final var arcs = new HashSet(); - if(includeAppRoute){ + if (includeAppRoute){ //create initial place from AppRoute - var place = new PlaceImpl(appRoute.getId()); + final var place = new PlaceImpl(appRoute.getId()); places.put(place.getID(), place); //for every AppRouteStart create a Transition and add AppRouteStart -> AppRoute - for(var endpoint : appRoute.getAppRouteStart()){ - var trans = getTransition(transitions, endpoint); - var arc = new ArcImpl(trans, place); + for (final var endpoint : appRoute.getAppRouteStart()) { + final var trans = getTransition(transitions, endpoint); + final var arc = new ArcImpl(trans, place); + arcs.add(arc); } //for every AppRouteEnd create a Transition and add AppRoute -> AppRouteEnd - for(var endpoint : appRoute.getAppRouteEnd()){ - var trans = getTransition(transitions, endpoint); - var arc = new ArcImpl(place, trans); + for (final var endpoint : appRoute.getAppRouteEnd()) { + final var trans = getTransition(transitions, endpoint); + final var arc = new ArcImpl(place, trans); + arcs.add(arc); } } //add every SubRoute of the AppRoute to the PetriNet - for(var subroute : appRoute.getHasSubRoute()){ + for (final var subroute : appRoute.getHasSubRoute()) { addSubRouteToPetriNet(subroute, arcs, places, transitions); } //create a PetriNet with all Arcs, Transitions and Places from the AppRoute - var nodes = new HashSet(); + final var nodes = new HashSet(); nodes.addAll(places.values()); nodes.addAll(transitions.values()); - var petriNet = new PetriNetImpl(appRoute.getId(), nodes, arcs); + + final var petriNet = new PetriNetImpl(appRoute.getId(), nodes, arcs); addFirstAndLastNode(petriNet); + return petriNet; } @@ -72,28 +87,31 @@ public static PetriNet petriNetFromAppRoute(AppRoute appRoute, boolean includeAp * @param places list of places of the current Petri Net * @param transitions list of transitions of the current Petri Net */ - private static void addSubRouteToPetriNet(RouteStep subRoute, Set arcs, Map places, Map transitions){ + private static void addSubRouteToPetriNet(final RouteStep subRoute, + final Set arcs, + final Map places, + final Map transitions) { //if a place with subroutes ID already exists in the map, the SubRoute was already added to the Petri Net - if(places.containsKey(subRoute.getId())){ + if (places.containsKey(subRoute.getId())) { return; } //create a new place from the subRoute - var place = new PlaceImpl(subRoute.getId()); + final var place = new PlaceImpl(subRoute.getId()); places.put(place.getID(), place); //for every AppRouteStart create a transition and add AppRouteStart -> SubRoute - for(var endpoint : subRoute.getAppRouteStart()){ - var trans = getTransition(transitions, endpoint); - var arc = new ArcImpl(trans, place); + for (final var endpoint : subRoute.getAppRouteStart()) { + final var trans = getTransition(transitions, endpoint); + final var arc = new ArcImpl(trans, place); arcs.add(arc); } //for every AppRouteEnd create a transition and add SubRoute -> AppRouteEnd - for(var endpoint : subRoute.getAppRouteEnd()){ - var trans = getTransition(transitions, endpoint); - var arc = new ArcImpl(place, trans); + for (final var endpoint : subRoute.getAppRouteEnd()) { + final var trans = getTransition(transitions, endpoint); + final var arc = new ArcImpl(place, trans); arcs.add(arc); } } @@ -105,35 +123,38 @@ private static void addSubRouteToPetriNet(RouteStep subRoute, Set arcs, Map * @param endpoint the endpoint for which the transition should be found * @return the existing transition with id from the map, or a new transition */ - private static Transition getTransition(Map transitions, Endpoint endpoint){ - if(transitions.containsKey(endpoint.getId())){ + private static Transition getTransition(final Map transitions, + final Endpoint endpoint){ + if (transitions.containsKey(endpoint.getId())) { return transitions.get(endpoint.getId()); - }else{ - var trans = new TransitionImpl(endpoint.getId()); + } else { + final var trans = new TransitionImpl(endpoint.getId()); transitions.put(trans.getID(), trans); return trans; } } - + /** * Add a source node to every transition without input and a sink node to every transition without output. * * @param petriNet */ - private static void addFirstAndLastNode(PetriNet petriNet){ - var first = new PlaceImpl(URI.create("place://source")); + private static void addFirstAndLastNode(final PetriNet petriNet) { + final var first = new PlaceImpl(URI.create("place://source")); + final var last = new PlaceImpl(URI.create("place://sink")); + first.setMarkers(1); - var last = new PlaceImpl(URI.create("place://sink")); - for(var node : petriNet.getNodes()){ - if(node instanceof TransitionImpl){ + + for (final var node : petriNet.getNodes()) { + if (node instanceof TransitionImpl) { //if node has no arc with itself as target, add arc: first->node - if(node.getTargetArcs().isEmpty()){ - var arc = new ArcImpl(first, node); + if (node.getTargetArcs().isEmpty()) { + final var arc = new ArcImpl(first, node); petriNet.getArcs().add(arc); } //if node has no arc with itself as source, add arc: node->last - if(node.getSourceArcs().isEmpty()){ - var arc = new ArcImpl(node, last); + if (node.getSourceArcs().isEmpty()) { + final var arc = new ArcImpl(node, last); petriNet.getArcs().add(arc); } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java index 2925301e..d8597268 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/CTLEvaluator.java @@ -5,27 +5,36 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import de.fraunhofer.isst.configmanager.petrinet.model.Place; import de.fraunhofer.isst.configmanager.petrinet.model.Transition; +import lombok.experimental.UtilityClass; import java.util.List; +@UtilityClass public class CTLEvaluator { - public static boolean evaluateNode(StateFormula ctlExpression, Place place, List> paths){ + public static boolean evaluateNode(final StateFormula ctlExpression, + final Place place, + final List> paths) { //base evaluation on place return ctlExpression.evaluate(place, paths); } - public static boolean evaluateTransition(TransitionFormula ctlExpression, Transition transition, List> paths){ + public static boolean evaluateTransition(final TransitionFormula ctlExpression, + final Transition transition, + final List> paths) { //base evaluation on transition return ctlExpression.evaluate(transition, paths); } - public static boolean evaluate(Formula ctlExpression, Node node, List> paths){ - if(ctlExpression instanceof StateFormula && node instanceof Place){ + public static boolean evaluate(final Formula ctlExpression, + final Node node, + final List> paths) { + + if (ctlExpression instanceof StateFormula && node instanceof Place) { return evaluateNode((StateFormula) ctlExpression, (Place) node, paths); - }else if(ctlExpression instanceof TransitionFormula && node instanceof Transition){ + } else if (ctlExpression instanceof TransitionFormula && node instanceof Transition){ return evaluateTransition((TransitionFormula) ctlExpression, (Transition) node, paths); - }else{ + } else { //cannot be evaluated return false; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java index 4f508c4e..57a4c1b3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/FF.java @@ -8,12 +8,12 @@ public class FF implements StateFormula, TransitionFormula { - public static FF FF(){ + public static FF FF() { return new FF(); } @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return false; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/TT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/TT.java index 2c3c2bc0..6827ce53 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/TT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/TT.java @@ -8,12 +8,12 @@ public class TT implements StateFormula, TransitionFormula { - public static TT TT(){ + public static TT TT() { return new TT(); } @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return true; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java index fc96fd09..34fd320a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeALONG.java @@ -10,15 +10,14 @@ @AllArgsConstructor public class NodeALONG implements StateFormula { + private StateFormula parameter; - public static NodeALONG nodeALONG(StateFormula parameter){ + public static NodeALONG nodeALONG(final StateFormula parameter) { return new NodeALONG(parameter); } - private StateFormula parameter; - @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return nodeNOT(nodeEV(nodeNOT(parameter))).evaluate(node, paths); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java index df9298b8..bcd27bd3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeAND.java @@ -8,14 +8,15 @@ @AllArgsConstructor public class NodeAND implements StateFormula { - public static NodeAND nodeAND(StateFormula parameter1, StateFormula parameter2){ + private StateFormula parameter1; + private StateFormula parameter2; + + public static NodeAND nodeAND(final StateFormula parameter1, final StateFormula parameter2) { return new NodeAND(parameter1, parameter2); } - private StateFormula parameter1, parameter2; - @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return parameter1.evaluate(node, paths) && parameter2.evaluate(node, paths); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java index cf14e62b..d7cfd673 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEV.java @@ -10,15 +10,14 @@ @AllArgsConstructor public class NodeEV implements StateFormula { + private StateFormula parameter; - public static NodeEV nodeEV(StateFormula parameter){ + public static NodeEV nodeEV(final StateFormula parameter) { return new NodeEV(parameter); } - private StateFormula parameter; - @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return nodeFORALL_UNTIL(TT(), parameter).evaluate(node, paths); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java index d1b26562..4ab984cf 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_MODAL.java @@ -12,16 +12,16 @@ @AllArgsConstructor public class NodeEXIST_MODAL implements StateFormula { + private StateFormula parameter1; + private TransitionFormula parameter2; - private static NodeEXIST_MODAL nodeEXIST_MODAL(StateFormula parameter1, TransitionFormula parameter2){ + private static NodeEXIST_MODAL nodeEXIST_MODAL(final StateFormula parameter1, + final TransitionFormula parameter2) { return new NodeEXIST_MODAL(parameter1, parameter2); } - private StateFormula parameter1; - private TransitionFormula parameter2; - @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return transitionMODAL(nodeAND(parameter1, nodeMODAL(parameter2))).evaluate(node, paths); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java index 7c3dc820..cf9c3184 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_NEXT.java @@ -10,14 +10,14 @@ @AllArgsConstructor public class NodeEXIST_NEXT implements StateFormula { + private StateFormula parameter; - public static NodeEXIST_NEXT nodeEXIST_NEXT(StateFormula parameter){ + public static NodeEXIST_NEXT nodeEXIST_NEXT(final StateFormula parameter) { return new NodeEXIST_NEXT(parameter); } - private StateFormula parameter; @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return nodeMODAL(transitionMODAL(parameter)).evaluate(node, paths); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java index 348a4c40..3532662d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java @@ -9,24 +9,34 @@ @AllArgsConstructor public class NodeEXIST_UNTIL implements StateFormula { - public static NodeEXIST_UNTIL nodeEXIST_UNTIL(StateFormula parameter1, StateFormula parameter2){ + private StateFormula parameter1; + private StateFormula parameter2; + + public static NodeEXIST_UNTIL nodeEXIST_UNTIL(final StateFormula parameter1, + final StateFormula parameter2) { return new NodeEXIST_UNTIL(parameter1, parameter2); } - private StateFormula parameter1, parameter2; - @Override // True if a path exists, where parameter1 is true on each node of the path, // and parameter2 is true on the final node of the path //TODO fix evaluation: use filtered paths - public boolean evaluate(Node node, List> paths) { - if(!(node instanceof Place)) return false; - check: for(var path: paths){ - if(path.get(0).equals(node) && path.size()%2==1){ - for(int i = 0; i> paths) { + if (!(node instanceof Place)) { + return false; + } + + check: for (final var path: paths) { + if (path.get(0).equals(node) && path.size() % 2 == 1) { + for (var i = 0; i < path.size() - 1; i += 2) { + if(!parameter1.evaluate(path.get(i), paths)) { + continue check; + } + } + + if (parameter2.evaluate(path.get(path.size() - 1), paths)) { + return true; } - if(parameter2.evaluate(path.get(path.size()-1), paths)) return true; } } return false; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeExpression.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeExpression.java index 905ee09e..b53bec16 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeExpression.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeExpression.java @@ -3,14 +3,14 @@ import lombok.AllArgsConstructor; import lombok.Getter; -@AllArgsConstructor @Getter +@AllArgsConstructor public class NodeExpression { + private NodeSubExpression subExpression; + private String message; - public static NodeExpression nodeExpression(NodeSubExpression nodeSubExpression, String message){ + public static NodeExpression nodeExpression(final NodeSubExpression nodeSubExpression, + final String message){ return new NodeExpression(nodeSubExpression, message); } - - private NodeSubExpression subExpression; - private String message; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java index c137b6d7..42cfff39 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_MODAL.java @@ -12,27 +12,35 @@ @AllArgsConstructor public class NodeFORALL_MODAL implements StateFormula { + private StateFormula parameter1; + private TransitionFormula parameter2; - public static NodeFORALL_MODAL nodeFORALL_MODAL(StateFormula parameter1, TransitionFormula parameter2){ + public static NodeFORALL_MODAL nodeFORALL_MODAL(final StateFormula parameter1, + final TransitionFormula parameter2){ return new NodeFORALL_MODAL(parameter1, parameter2); } - private StateFormula parameter1; - - private TransitionFormula parameter2; - // parameter1, must be true for all successor states, parameter2 must // be true for the transitions between the current state and its successors. @Override - public boolean evaluate(Node node, List> paths) { - if(!(node instanceof Place)) return false; - var followingTransitions = paths.stream().filter(path -> path.size() == 2 && path.get(0) == node).map(path -> path.get(1)).collect(Collectors.toSet()); - var followingPlaces = followingTransitions.stream().map(Node::getSourceArcs).flatMap(Collection::stream).map(Arc::getTarget).collect(Collectors.toSet()); - for(var place : followingPlaces){ - if(!parameter1.evaluate(place, paths)) return false; + public boolean evaluate(final Node node, final List> paths) { + if (!(node instanceof Place)) { + return false; } - for(var transition : followingTransitions){ - if(!parameter2.evaluate(transition, paths)) return false; + + final var followingTransitions = paths.stream().filter(path -> path.size() == 2 && path.get(0) == node).map(path -> path.get(1)).collect(Collectors.toSet()); + final var followingPlaces = followingTransitions.stream().map(Node::getSourceArcs).flatMap(Collection::stream).map(Arc::getTarget).collect(Collectors.toSet()); + + for (final var place : followingPlaces) { + if (!parameter1.evaluate(place, paths)) { + return false; + } + } + + for (final var transition : followingTransitions){ + if (!parameter2.evaluate(transition, paths)) { + return false; + } } return true; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java index 74f1d3e0..7488bf72 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_NEXT.java @@ -10,15 +10,14 @@ @AllArgsConstructor public class NodeFORALL_NEXT implements StateFormula { + private StateFormula parameter; - public static NodeFORALL_NEXT nodeFORALL_NEXT(StateFormula parameter){ + public static NodeFORALL_NEXT nodeFORALL_NEXT(final StateFormula parameter){ return new NodeFORALL_NEXT(parameter); } - private StateFormula parameter; - @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return nodeNOT(nodeEXIST_NEXT(nodeNOT(parameter))).evaluate(node, paths); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java index bb9ea079..4a12e6ec 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java @@ -8,24 +8,33 @@ @AllArgsConstructor public class NodeFORALL_UNTIL implements StateFormula { + private StateFormula parameter1; + private StateFormula parameter2; - public static NodeFORALL_UNTIL nodeFORALL_UNTIL(StateFormula parameter1, StateFormula parameter2){ + public static NodeFORALL_UNTIL nodeFORALL_UNTIL(final StateFormula parameter1, + final StateFormula parameter2){ return new NodeFORALL_UNTIL(parameter1, parameter2); } - private StateFormula parameter1, parameter2; - //like EXIST_UNTIL for all paths //TODO fix evaluation: use filtered paths @Override - public boolean evaluate(Node node, List> paths) { - if(!(node instanceof Place)) return false; - for(var path: paths){ - if(path.get(0).equals(node) && path.size()%2==1){ - for(int i = 0; i> paths) { + if (!(node instanceof Place)) { + return false; + } + + for (final var path: paths) { + if (path.get(0).equals(node) && path.size() % 2 == 1) { + for (var i = 0; i < path.size() - 1; i += 2) { + if (!parameter1.evaluate(path.get(i), paths)) { + return false; + } + } + + if (!parameter2.evaluate(path.get(path.size() - 1), paths)) { + return false; } - if(!parameter2.evaluate(path.get(path.size()-1), paths)) return false; } } return true; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java index b8a21419..8a833921 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeINV.java @@ -10,15 +10,14 @@ @AllArgsConstructor public class NodeINV implements StateFormula { + private StateFormula parameter; - public static NodeINV nodeINV(StateFormula parameter){ + public static NodeINV nodeINV(final StateFormula parameter){ return new NodeINV(parameter); } - private StateFormula parameter; - @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return nodeNOT(nodePOS(nodeNOT(parameter))).evaluate(node, paths); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java index 7ef083e1..f294f5da 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeMODAL.java @@ -10,21 +10,20 @@ @AllArgsConstructor public class NodeMODAL implements StateFormula { + private TransitionFormula parameter; - public static NodeMODAL nodeMODAL(TransitionFormula parameter){ + public static NodeMODAL nodeMODAL(final TransitionFormula parameter){ return new NodeMODAL(parameter); } - private TransitionFormula parameter; - // MODAL, is true if parameter evaluates to true for a transition following the current state @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return node instanceof Place && node.getSourceArcs().stream() .map(Arc::getTarget) .map(transition -> parameter.evaluate(transition, paths)) - .reduce(false, (a,b) -> a || b); + .reduce(false, (a, b) -> a || b); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNF.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNF.java index 0d7c75b6..bc6cabb7 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNF.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNF.java @@ -8,15 +8,14 @@ @AllArgsConstructor public class NodeNF implements StateFormula { + private NodeExpression parameter; - public static NodeNF nodeNF(NodeExpression parameter){ + public static NodeNF nodeNF(final NodeExpression parameter){ return new NodeNF(parameter); } - private NodeExpression parameter; - @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return node instanceof Place && parameter.getSubExpression().evaluate((Place) node); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java index 59c84ca2..5ec08233 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeNOT.java @@ -7,15 +7,14 @@ @AllArgsConstructor public class NodeNOT implements StateFormula { + private StateFormula parameter; - public static NodeNOT nodeNOT(StateFormula parameter){ + public static NodeNOT nodeNOT(final StateFormula parameter){ return new NodeNOT(parameter); } - private StateFormula parameter; - @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return !parameter.evaluate(node, paths); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java index 7bd63eb1..1f715012 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeOR.java @@ -7,15 +7,16 @@ @AllArgsConstructor public class NodeOR implements StateFormula { + private StateFormula parameter1; + private StateFormula parameter2; - public static NodeOR nodeOR(StateFormula parameter1, StateFormula parameter2){ + public static NodeOR nodeOR(final StateFormula parameter1, + final StateFormula parameter2){ return new NodeOR(parameter1, parameter2); } - private StateFormula parameter1, parameter2; - @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return parameter1.evaluate(node, paths) || parameter2.evaluate(node, paths); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java index 40227dd6..9322ee0c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodePOS.java @@ -10,15 +10,14 @@ @AllArgsConstructor public class NodePOS implements StateFormula { + private StateFormula parameter; - public static NodePOS nodePOS(StateFormula parameter){ + public static NodePOS nodePOS(final StateFormula parameter) { return new NodePOS(parameter); } - private StateFormula parameter; - @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return nodeEXIST_UNTIL(TT(), parameter).evaluate(node, paths); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/ArcExpression.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/ArcExpression.java index b6b01a25..6f3d3d6f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/ArcExpression.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/ArcExpression.java @@ -3,14 +3,14 @@ import lombok.AllArgsConstructor; import lombok.Getter; -@AllArgsConstructor @Getter +@AllArgsConstructor public class ArcExpression { + private ArcSubExpression subExpression; + private String message; - public static ArcExpression arcExpression(ArcSubExpression subExpression, String message){ + public static ArcExpression arcExpression(final ArcSubExpression subExpression, + final String message) { return new ArcExpression(subExpression, message); } - - private ArcSubExpression subExpression; - private String message; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java index 8dccd008..c30451d8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAF.java @@ -8,15 +8,14 @@ @AllArgsConstructor public class TransitionAF implements TransitionFormula { + private ArcExpression parameter; - public static TransitionAF transitionAF(ArcExpression parameter){ + public static TransitionAF transitionAF(final ArcExpression parameter){ return new TransitionAF(parameter); } - private ArcExpression parameter; - @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return node instanceof Transition && parameter.getSubExpression().evaluate((Transition) node); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java index 256e90fa..0a20e40b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionALONG.java @@ -10,15 +10,14 @@ @AllArgsConstructor public class TransitionALONG implements TransitionFormula { - - public static TransitionALONG transitionALONG(TransitionFormula parameter){ + private TransitionFormula parameter; + + public static TransitionALONG transitionALONG(final TransitionFormula parameter){ return new TransitionALONG(parameter); } - private TransitionFormula parameter; - @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return transitionNOT(transitionEV(transitionNOT(parameter))).evaluate(node, paths); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java index 94b8d4a1..44177592 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionAND.java @@ -7,15 +7,16 @@ @AllArgsConstructor public class TransitionAND implements TransitionFormula { + private TransitionFormula parameter1; + private TransitionFormula parameter2; - public static TransitionAND transitionAND(TransitionFormula parameter1, TransitionFormula parameter2){ + public static TransitionAND transitionAND(final TransitionFormula parameter1, + final TransitionFormula parameter2) { return new TransitionAND(parameter1, parameter2); } - private TransitionFormula parameter1, parameter2; - @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return parameter1.evaluate(node, paths) && parameter2.evaluate(node, paths); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java index 81ac4167..235e61d7 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEV.java @@ -10,15 +10,14 @@ @AllArgsConstructor public class TransitionEV implements TransitionFormula { + private TransitionFormula parameter; - public static TransitionEV transitionEV(TransitionFormula parameter){ + public static TransitionEV transitionEV(final TransitionFormula parameter) { return new TransitionEV(parameter); } - private TransitionFormula parameter; - @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return transitionFORALL_UNTIL(TT(), parameter).evaluate(node, paths); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java index f32ec078..a3dba05c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_MODAL.java @@ -12,16 +12,16 @@ @AllArgsConstructor public class TransitionEXIST_MODAL implements TransitionFormula { + private TransitionFormula parameter1; + private StateFormula parameter2; - private static TransitionEXIST_MODAL transitionEXIST_MODAL(TransitionFormula parameter1, StateFormula parameter2){ + private static TransitionEXIST_MODAL transitionEXIST_MODAL(final TransitionFormula parameter1, + final StateFormula parameter2){ return new TransitionEXIST_MODAL(parameter1, parameter2); } - private TransitionFormula parameter1; - private StateFormula parameter2; - @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return nodeMODAL(transitionAND(parameter1,transitionMODAL(parameter2))).evaluate(node, paths); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java index c46de472..e5a65521 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_NEXT.java @@ -10,14 +10,14 @@ @AllArgsConstructor public class TransitionEXIST_NEXT implements TransitionFormula { + private TransitionFormula parameter; - public static TransitionEXIST_NEXT transitionEXIST_NEXT(TransitionFormula parameter){ + public static TransitionEXIST_NEXT transitionEXIST_NEXT(final TransitionFormula parameter) { return new TransitionEXIST_NEXT(parameter); } - private TransitionFormula parameter; @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return transitionMODAL(nodeMODAL(parameter)).evaluate(node, paths); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java index 537e099b..52a4258b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java @@ -8,25 +8,34 @@ @AllArgsConstructor public class TransitionEXIST_UNTIL implements TransitionFormula { + private TransitionFormula parameter1; + private TransitionFormula parameter2; - public static TransitionEXIST_UNTIL transitionEXIST_UNTIL(TransitionFormula parameter1, TransitionFormula parameter2){ + public static TransitionEXIST_UNTIL transitionEXIST_UNTIL(final TransitionFormula parameter1, + final TransitionFormula parameter2) { return new TransitionEXIST_UNTIL(parameter1, parameter2); } - private TransitionFormula parameter1, parameter2; - // True if a path exists, where parameter1 is true on each transition of the path, // and parameter2 is true on the final transition of the path //TODO fix evaluation: use filtered paths @Override - public boolean evaluate(Node node, List> paths) { - if(!(node instanceof Transition)) return false; - check: for(var path: paths){ - if(path.get(0).equals(node) && paths.size()%2==1){ - for(int i = 0; i> paths) { + if (!(node instanceof Transition)) { + return false; + } + + check: for (final var path: paths){ + if (path.get(0).equals(node) && paths.size() % 2 == 1) { + for (var i = 0; i < path.size() - 1; i += 2){ + if (!parameter1.evaluate(path.get(i), paths)) { + continue check; + } + } + + if(parameter2.evaluate(path.get(path.size()-1), paths)) { + return true; } - if(parameter2.evaluate(path.get(path.size()-1), paths)) return true; } } return false; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java index a41d77be..542e9aaf 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_MODAL.java @@ -11,27 +11,38 @@ @AllArgsConstructor public class TransitionFORALL_MODAL implements TransitionFormula { + private TransitionFormula parameter1; + private StateFormula parameter2; - public static TransitionFORALL_MODAL transitionFORALL_MODAL(TransitionFormula parameter1, StateFormula parameter2){ + public static TransitionFORALL_MODAL transitionFORALL_MODAL(final TransitionFormula parameter1, + final StateFormula parameter2){ return new TransitionFORALL_MODAL(parameter1, parameter2); } - private TransitionFormula parameter1; - private StateFormula parameter2; - // parameter1, must be true for all successor transitions, parameter2 must // be true for the states between the current transition and its successors. @Override - public boolean evaluate(Node node, List> paths) { - if(!(node instanceof Transition)) return false; - var followingPlaces = node.getSourceArcs().stream().map(Arc::getTarget).collect(Collectors.toSet()); + public boolean evaluate(final Node node, final List> paths) { + if (!(node instanceof Transition)) { + return false; + } + + final var followingPlaces = node.getSourceArcs().stream().map(Arc::getTarget).collect(Collectors.toSet()); + followingPlaces.retainAll(paths.stream().filter(path -> paths.size() == 2).map(path -> path.get(0)).collect(Collectors.toSet())); - var followingTransitions = paths.stream().filter(path -> path.size() == 2).filter(path -> followingPlaces.contains(path.get(0))).map(path -> path.get(1)).collect(Collectors.toSet()); - for(var transition : followingTransitions){ - if(!parameter1.evaluate(transition, paths)) return false; + + final var followingTransitions = paths.stream().filter(path -> path.size() == 2).filter(path -> followingPlaces.contains(path.get(0))).map(path -> path.get(1)).collect(Collectors.toSet()); + + for (final var transition : followingTransitions) { + if (!parameter1.evaluate(transition, paths)) { + return false; + } } - for(var place : followingPlaces){ - if(!parameter2.evaluate(place, paths)) return false; + + for (final var place : followingPlaces) { + if (!parameter2.evaluate(place, paths)) { + return false; + } } return true; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java index bb9cc602..5a23868c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_NEXT.java @@ -10,15 +10,14 @@ @AllArgsConstructor public class TransitionFORALL_NEXT implements TransitionFormula { + private TransitionFormula parameter; - public static TransitionFORALL_NEXT transitionFORALL_NEXT(TransitionFormula parameter){ + public static TransitionFORALL_NEXT transitionFORALL_NEXT(final TransitionFormula parameter){ return new TransitionFORALL_NEXT(parameter); } - private TransitionFormula parameter; - @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return transitionNOT(transitionEXIST_NEXT(transitionNOT(parameter))).evaluate(node, paths); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java index 9f8e236a..784190d7 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java @@ -8,24 +8,33 @@ @AllArgsConstructor public class TransitionFORALL_UNTIL implements TransitionFormula { + private TransitionFormula parameter1; + private TransitionFormula parameter2; - public static TransitionFORALL_UNTIL transitionFORALL_UNTIL(TransitionFormula parameter1, TransitionFormula parameter2){ + public static TransitionFORALL_UNTIL transitionFORALL_UNTIL(final TransitionFormula parameter1, + final TransitionFormula parameter2){ return new TransitionFORALL_UNTIL(parameter1, parameter2); } - private TransitionFormula parameter1, parameter2; - //like EXIST_UNTIL but requires conditions for all paths //TODO fix evaluation: use filtered paths @Override - public boolean evaluate(Node node, List> paths) { - if(!(node instanceof Transition)) return false; - for(var path: paths){ - if(path.get(0).equals(node) && path.size()%2==1){ - for(int i = 0; i> paths) { + if (!(node instanceof Transition)) { + return false; + } + + for (final var path: paths) { + if (path.get(0).equals(node) && path.size() % 2 == 1) { + for (var i = 0; i < path.size() - 1; i += 2) { + if (!parameter1.evaluate(path.get(i), paths)) { + return false; + } + } + + if (!parameter2.evaluate(path.get(path.size() - 1), paths)) { + return false; } - if(!parameter2.evaluate(path.get(path.size()-1), paths)) return false; } } return true; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java index 905397c0..214eee67 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionINV.java @@ -10,15 +10,14 @@ @AllArgsConstructor public class TransitionINV implements TransitionFormula { + private TransitionFormula parameter; - public static TransitionINV transitionINV(TransitionFormula parameter){ + public static TransitionINV transitionINV(final TransitionFormula parameter){ return new TransitionINV(parameter); } - private TransitionFormula parameter; - @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return transitionNOT(transitionPOS(transitionNOT(parameter))).evaluate(node, paths); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java index d8e85cc2..a4ee9726 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionMODAL.java @@ -10,21 +10,20 @@ @AllArgsConstructor public class TransitionMODAL implements TransitionFormula { + private StateFormula parameter; - public static TransitionMODAL transitionMODAL(StateFormula parameter){ + public static TransitionMODAL transitionMODAL(final StateFormula parameter){ return new TransitionMODAL(parameter); } - private StateFormula parameter; - // MODAL, is true if parameter evaluates to true for a state following the current transition @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return node instanceof Transition && node.getSourceArcs().stream() .map(Arc::getTarget) .map(place -> parameter.evaluate(place, paths)) - .reduce(false, (a,b) -> a || b); + .reduce(false, (a, b) -> a || b); } @Override diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java index 94c8f424..e7436559 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionNOT.java @@ -7,15 +7,14 @@ @AllArgsConstructor public class TransitionNOT implements TransitionFormula { + private TransitionFormula parameter; - public static TransitionNOT transitionNOT(TransitionFormula parameter){ + public static TransitionNOT transitionNOT(final TransitionFormula parameter){ return new TransitionNOT(parameter); } - private TransitionFormula parameter; - @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return !parameter.evaluate(node, paths); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java index 51a476e7..c9d036dd 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionOR.java @@ -7,15 +7,15 @@ @AllArgsConstructor public class TransitionOR implements TransitionFormula { + private TransitionFormula parameter1; + private TransitionFormula parameter2; - public static TransitionOR transitionOR(TransitionFormula parameter1, TransitionFormula parameter2){ + public static TransitionOR transitionOR(final TransitionFormula parameter1, final TransitionFormula parameter2){ return new TransitionOR(parameter1, parameter2); } - private TransitionFormula parameter1, parameter2; - @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return parameter1.evaluate(node, paths) || parameter2.evaluate(node, paths); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java index ed157e0a..d874ac0c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionPOS.java @@ -10,15 +10,14 @@ @AllArgsConstructor public class TransitionPOS implements TransitionFormula { + private TransitionFormula parameter; - public static TransitionPOS transitionPOS(TransitionFormula parameter){ + public static TransitionPOS transitionPOS(final TransitionFormula parameter){ return new TransitionPOS(parameter); } - private TransitionFormula parameter; - @Override - public boolean evaluate(Node node, List> paths) { + public boolean evaluate(final Node node, final List> paths) { return transitionEXIST_UNTIL(TT(), parameter).evaluate(node, paths); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/ArcImpl.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/ArcImpl.java index 0003c383..e887f348 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/ArcImpl.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/ArcImpl.java @@ -1,18 +1,19 @@ package de.fraunhofer.isst.configmanager.petrinet.model; /** - * Implementation class of the {@link Arc} interface + * Implementation class of the {@link Arc} interface. */ public class ArcImpl implements Arc { - private Node source, target; + private Node source; + private Node target; - public ArcImpl(Node source, Node target){ - if(source.isComplementOf(target)){ + public ArcImpl(final Node source, final Node target){ + if (source.isComplementOf(target)) { this.source = source; source.getSourceArcs().add(this); this.target = target; target.getTargetArcs().add(this); - }else{ + } else { throw new IllegalArgumentException( String.format( "Node source is of type %s, target should be another Type!", @@ -33,13 +34,13 @@ public Node getTarget() { } @Override - public void setSource(Node source) { - if(target.isComplementOf(source)){ + public void setSource(final Node source) { + if (target.isComplementOf(source)) { //if given node is a different type as current target: set as source this.source.getSourceArcs().remove(this); this.source = source; source.getSourceArcs().add(this); - }else{ + } else { //if given node is same type as current target: throw an Exception throw new IllegalArgumentException( String.format( @@ -51,13 +52,13 @@ public void setSource(Node source) { } @Override - public void setTarget(Node target) { - if(source.isComplementOf(target)){ + public void setTarget(final Node target) { + if (source.isComplementOf(target)){ //if given node is a different type as current source: set as target this.target.getTargetArcs().remove(this); this.target = target; target.getTargetArcs().add(this); - }else{ + } else { //if given node is same type as current source: throw an Exception throw new IllegalArgumentException( String.format( @@ -69,12 +70,18 @@ public void setTarget(Node target) { } @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ArcImpl arc = (ArcImpl) o; - return source.equals(arc.source) && - target.equals(arc.target); + public boolean equals(final Object o) { + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } + + final var arc = (ArcImpl) o; + + return source.equals(arc.source) && target.equals(arc.target); } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/ContextObject.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/ContextObject.java index 08f15de1..deda3a6b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/ContextObject.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/ContextObject.java @@ -7,22 +7,31 @@ import java.util.List; import java.util.Objects; -@AllArgsConstructor @Getter +@AllArgsConstructor public class ContextObject { private List context; - private String read, write, erase; + private String read; + private String write; + private String erase; - public ContextObject deepCopy(){ + public ContextObject deepCopy() { return new ContextObject(context, read, write, erase); } @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ContextObject that = (ContextObject) o; + public boolean equals(final Object o) { + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } + + final var that = (ContextObject) o; + return Objects.equals(context, that.context) && Objects.equals(read, that.read) && Objects.equals(write, that.write) && Objects.equals(erase, that.erase); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/HasId.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/HasId.java index c53fe48a..7d65f073 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/HasId.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/HasId.java @@ -3,7 +3,7 @@ import java.net.URI; /** - * Interface, implemented by every component of the PetriNet that has an ID + * Interface, implemented by every component of the PetriNet that has an ID. */ public interface HasId { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/Node.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/Node.java index b1faaaa5..f9f027cf 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/Node.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/Node.java @@ -11,9 +11,9 @@ * Places are regular Nodes, while Transitions decide, * which Steps can be made in the PetriNet. */ -@JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = "@type") @JsonSubTypes({@JsonSubTypes.Type(Transition.class), @JsonSubTypes.Type(Place.class)}) -public interface Node extends HasId{ +@JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = "@type") +public interface Node extends HasId { /** * @return get all {@link Arc}, where this node is the source (this -> other) @@ -30,7 +30,7 @@ public interface Node extends HasId{ * @return true if this node has a different type (eg. other=place, this=transition) */ boolean isComplementOf(Node other); - + /* * create a deep copy of the Node. * @return a deep copy of the Node diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/PetriNet.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/PetriNet.java index bedd3345..fd352289 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/PetriNet.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/PetriNet.java @@ -13,33 +13,32 @@ * * Arcs can either connect Node->Transition or Transition->Node. */ -@JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = "@type") @JsonSubTypes({@JsonSubTypes.Type(PetriNetImpl.class)}) +@JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = "@type") public interface PetriNet { - + /** * Getter for the Nodes of the PetriNet. * @return Nodes of the PetriNet */ Set getNodes(); - + /** * Getter for the Arcs of the PetriNet. * @return Nodes of the PetriNet */ Set getArcs(); - + /** * Create a copy of the PetriNet, copy its Nodes and Arcs in the process. * @return a deep copy of the current PetriNet */ PetriNet deepCopy(); - + /** - * Equals Method for PetriNets + * Equals Method for PetriNets. * @param other another object * @return true if this equals the given object */ boolean equals(Object other); - } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/PetriNetImpl.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/PetriNetImpl.java index 4de5eb9c..462ba77d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/PetriNetImpl.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/PetriNetImpl.java @@ -1,6 +1,6 @@ package de.fraunhofer.isst.configmanager.petrinet.model; -import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.AllArgsConstructor; import lombok.SneakyThrows; import java.net.URI; @@ -11,19 +11,13 @@ /** * Implementation class of the {@link PetriNet} interface. */ +@AllArgsConstructor public class PetriNetImpl implements PetriNet, HasId { - - private static final ObjectMapper mapper = new ObjectMapper(); + private transient URI id; private transient Set nodes; private transient Set arcs; - - public PetriNetImpl(URI id, Set nodes, Set arcs) { - this.id = id; - this.nodes = nodes; - this.arcs = arcs; - } - + @Override public Set getNodes() { return nodes; @@ -37,12 +31,14 @@ public Set getArcs() { @Override @SneakyThrows public PetriNet deepCopy() { - var nodeCopy = new HashSet(); - for (var node : nodes) { + final var nodeCopy = new HashSet(); + for (final var node : nodes) { nodeCopy.add(node.deepCopy()); } - var arcCopy = new HashSet(); - for (var arc : arcs) { + + final var arcCopy = new HashSet(); + + for (final var arc : arcs) { arcCopy.add( new ArcImpl( nodeById(arc.getSource().getID(), nodeCopy), @@ -59,27 +55,35 @@ public URI getID() { } /** - * Get a node by its id (if it exists) + * Get a node by its id (if it exists). * @param id the ID of the Node to search for * @param nodes a Set of Nodes * @return the node with the given id (if it exists) */ - private static Node nodeById(URI id, Set nodes) { - for (var node : nodes) { - if (node.getID().equals(id)) return node; + private static Node nodeById(final URI id, final Set nodes) { + for (final var node : nodes) { + if (node.getID().equals(id)) { + return node; + } } return null; } @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - PetriNetImpl petriNet = (PetriNetImpl) o; - var eq1 = Objects.equals(id, petriNet.id); - var eq2 = nodes.stream().map(s -> petriNet.nodes.stream().filter(n -> n.getID().equals(s.getID())).anyMatch(n -> n.equals(s))).reduce(true, (a, b) -> a && b); - var eq3 = arcs.stream().map(s -> petriNet.arcs.stream().anyMatch(n -> n.equals(s))).reduce(true, (a, b) -> a && b); + public boolean equals(final Object o) { + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } + + final var petriNet = (PetriNetImpl) o; + final var eq1 = Objects.equals(id, petriNet.id); + final var eq2 = nodes.stream().map(s -> petriNet.nodes.stream().filter(n -> n.getID().equals(s.getID())).anyMatch(n -> n.equals(s))).reduce(true, (a, b) -> a && b); + final var eq3 = arcs.stream().map(s -> petriNet.arcs.stream().anyMatch(n -> n.equals(s))).reduce(true, (a, b) -> a && b); + return eq1 && eq2 && eq3; } - } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/Place.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/Place.java index 46a7d9cf..f714473b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/Place.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/Place.java @@ -7,18 +7,18 @@ * Places are one type of node of a petri net. They can contain markers, which decide, * which transitions can be used to take a step forward in the PetriNet. */ -@JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = "@type") @JsonSubTypes({@JsonSubTypes.Type(PlaceImpl.class)}) +@JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = "@type") public interface Place extends Node { - + /** - * Getter for the number of markers on this place node + * Getter for the number of markers on this place node. * @return number of markers */ int getMarkers(); /** - * Setter for markers on this place node + * Setter for markers on this place node. * @param markers the number of markers this place should have */ void setMarkers(int markers); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/PlaceImpl.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/PlaceImpl.java index df9e2e2b..94c615fc 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/PlaceImpl.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/PlaceImpl.java @@ -8,7 +8,7 @@ import java.util.Set; /** - * Implementation class of the {@link Place} interface + * Implementation class of the {@link Place} interface. */ public class PlaceImpl implements Place { @@ -21,7 +21,7 @@ public class PlaceImpl implements Place { @JsonIgnore private transient Set targetArcs; - public PlaceImpl(URI id){ + public PlaceImpl(final URI id) { this.id = id; this.sourceArcs = new HashSet<>(); this.targetArcs = new HashSet<>(); @@ -39,16 +39,18 @@ public Set getSourceArcs() { } @Override - public Set getTargetArcs() { return targetArcs; } + public Set getTargetArcs() { + return targetArcs; + } @Override - public boolean isComplementOf(Node other) { + public boolean isComplementOf(final Node other) { return Transition.class.isAssignableFrom(other.getClass()); } @Override public Node deepCopy() { - var copy = new PlaceImpl(this.getID()); + final var copy = new PlaceImpl(this.getID()); copy.setMarkers(this.getMarkers()); return copy; } @@ -59,23 +61,35 @@ public int getMarkers() { } @Override - public void setMarkers(int markers) { + public void setMarkers(final int markers) { this.markers = markers; } @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - PlaceImpl place = (PlaceImpl) o; - return markers == place.markers && - Objects.equals(id, place.id); + public boolean equals(final Object o) { + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } + + final var place = (PlaceImpl) o; + + return markers == place.markers && Objects.equals(id, place.id); } - public boolean equalsExceptMarking(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - PlaceImpl place = (PlaceImpl) o; + public boolean equalsExceptMarking(final Object o) { + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } + + final var place = (PlaceImpl) o; return Objects.equals(id, place.id); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/Transition.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/Transition.java index 2e76819c..225a0c75 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/Transition.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/Transition.java @@ -11,9 +11,9 @@ * * X -> T -> O ==> O -> T -> X */ -@JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = "@type") @JsonSubTypes({@JsonSubTypes.Type(TransitionImpl.class)}) -public interface Transition extends Node{ +@JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = "@type") +public interface Transition extends Node { ContextObject getContext(); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/TransitionImpl.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/TransitionImpl.java index 33e872e5..2f6644c9 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/TransitionImpl.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/TransitionImpl.java @@ -23,18 +23,20 @@ public class TransitionImpl implements Transition { @JsonIgnore private transient Set targetArcs; - public TransitionImpl(URI id){ + public TransitionImpl(final URI id) { this.id = id; this.sourceArcs = new HashSet<>(); this.targetArcs = new HashSet<>(); } - public void setContextObject(ContextObject contextObject){ + public void setContextObject(final ContextObject contextObject) { this.contextObject = contextObject; } @Override - public ContextObject getContext() { return contextObject; } + public ContextObject getContext() { + return contextObject; + } @Override public URI getID() { @@ -52,22 +54,32 @@ public Set getTargetArcs() { } @Override - public boolean isComplementOf(Node other) { + public boolean isComplementOf(final Node other) { return Place.class.isAssignableFrom(other.getClass()); } @Override public Node deepCopy() { - var copy = new TransitionImpl(this.getID()); - if(this.contextObject != null) copy.setContextObject(this.contextObject.deepCopy()); + final var copy = new TransitionImpl(this.getID()); + if (this.contextObject != null) { + copy.setContextObject(this.contextObject.deepCopy()); + } + return copy; } @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - TransitionImpl trans = (TransitionImpl) o; + public boolean equals(final Object o) { + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } + + final var trans = (TransitionImpl) o; + return Objects.equals(id, trans.id) && Objects.equals(contextObject, trans.contextObject); } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/NetArc.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/NetArc.java index fc800ef4..e439a195 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/NetArc.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/NetArc.java @@ -6,17 +6,10 @@ import java.net.URI; /** - * Arc connecting Steps in a PetriNet execution inside the {@link StepGraph} + * Arc connecting Steps in a PetriNet execution inside the {@link StepGraph}. */ @Getter public class NetArc { - - public NetArc(PetriNet source, PetriNet target, URI usedTransition){ - this.source = source; - this.target = target; - this.usedTransition = usedTransition; - } - /** * PetriNet from which target is reachable, using a transition. */ @@ -30,4 +23,9 @@ public NetArc(PetriNet source, PetriNet target, URI usedTransition){ private URI usedTransition; + public NetArc(final PetriNet source, final PetriNet target, final URI usedTransition) { + this.source = source; + this.target = target; + this.usedTransition = usedTransition; + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java index f67392b0..21447bc6 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java @@ -1,10 +1,16 @@ package de.fraunhofer.isst.configmanager.petrinet.simulator; import de.fraunhofer.isst.configmanager.petrinet.builder.GraphVizGenerator; -import de.fraunhofer.isst.configmanager.petrinet.model.*; +import de.fraunhofer.isst.configmanager.petrinet.model.Arc; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; +import de.fraunhofer.isst.configmanager.petrinet.model.PetriNet; +import de.fraunhofer.isst.configmanager.petrinet.model.Place; +import de.fraunhofer.isst.configmanager.petrinet.model.PlaceImpl; +import de.fraunhofer.isst.configmanager.petrinet.model.Transition; +import de.fraunhofer.isst.configmanager.petrinet.model.TransitionImpl; +import lombok.experimental.UtilityClass; import lombok.extern.slf4j.Slf4j; -import java.net.URI; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -19,6 +25,7 @@ * marker generating circle, so the PetriNet has an infinite amount of reachable states) */ @Slf4j +@UtilityClass public class PetriNetSimulator { /** * Make a step in the current petriNet, finding all transitions that can be used @@ -28,14 +35,16 @@ public class PetriNetSimulator { * @param petriNet the current step in the petrinet * @return true if something in the petrinet changed after taking the transitions */ - private static boolean makeStep(PetriNet petriNet){ + private static boolean makeStep(final PetriNet petriNet){ var changed = false; - var nodesLosingMarkers = new ArrayList(); - var nodesGainingMarkers = new ArrayList(); - for(var node : petriNet.getNodes()){ - if(node instanceof TransitionImpl){ - var allPreviousHaveMarker = isPossible(node); - if(allPreviousHaveMarker){ + final var nodesLosingMarkers = new ArrayList(); + final var nodesGainingMarkers = new ArrayList(); + + for (final var node : petriNet.getNodes()) { + if (node instanceof TransitionImpl) { + final var allPreviousHaveMarker = isPossible(node); + + if (allPreviousHaveMarker) { nodesLosingMarkers.addAll(node.getTargetArcs().stream() .map(Arc::getSource).collect(Collectors.toList())); nodesGainingMarkers.addAll(node.getSourceArcs().stream() @@ -44,12 +53,11 @@ private static boolean makeStep(PetriNet petriNet){ } } } - nodesGainingMarkers.stream().distinct().forEach(node -> { - ((PlaceImpl) node).setMarkers(((PlaceImpl) node).getMarkers() + 1); - }); - nodesLosingMarkers.stream().distinct().forEach(node -> { - ((PlaceImpl) node).setMarkers(((PlaceImpl) node).getMarkers() - 1); - }); + + nodesGainingMarkers.stream().distinct().forEach(node -> ((PlaceImpl) node).setMarkers(((PlaceImpl) node).getMarkers() + 1)); + + nodesLosingMarkers.stream().distinct().forEach(node -> ((PlaceImpl) node).setMarkers(((PlaceImpl) node).getMarkers() - 1)); + return changed; } @@ -57,16 +65,22 @@ private static boolean makeStep(PetriNet petriNet){ * For a given initial PetriNet: execute a step as long as something changes * @param petriNet the initial PetriNet */ - public static void simulateNet(PetriNet petriNet){ - int i = 0; - log.info("Starting Simulation!"); - log.info(GraphVizGenerator.generateGraphViz(petriNet)); - while(makeStep(petriNet)){ - log.info("Something changed!"); - i++; + public static void simulateNet(final PetriNet petriNet){ + if (log.isInfoEnabled()) { + log.info("Starting Simulation!"); log.info(GraphVizGenerator.generateGraphViz(petriNet)); } - log.info("Nothing changed! Finished simulation of PetriNet!"); + + while (makeStep(petriNet)) { + if (log.isInfoEnabled()) { + log.info("Something changed!"); + log.info(GraphVizGenerator.generateGraphViz(petriNet)); + } + } + + if (log.isInfoEnabled()) { + log.info("Nothing changed! Finished simulation of PetriNet!"); + } } /** @@ -74,11 +88,15 @@ public static void simulateNet(PetriNet petriNet){ * @param petriNet a given PetriNet * @return List of Transition nodes, for which all previous nodes have markers */ - private static List getPossibleTransitions(PetriNet petriNet){ - var possible = new ArrayList(); - for(var node : petriNet.getNodes()){ - if(isPossible(node)) possible.add(node); + private static List getPossibleTransitions(final PetriNet petriNet){ + final var possible = new ArrayList(); + + for (final var node : petriNet.getNodes()) { + if (isPossible(node)) { + possible.add(node); + } } + return possible; } @@ -87,17 +105,19 @@ private static List getPossibleTransitions(PetriNet petriNet){ * @param petriNet a given PetriNet * @param node a given Node of the PetriNet */ - private static void doTransition(PetriNet petriNet, Node node){ - if(!isPossible(node)){ + private static void doTransition(final PetriNet petriNet, final Node node){ + if (!isPossible(node)){ return; } - for(var arc : node.getTargetArcs()){ - var place = (PlaceImpl) arc.getSource(); - place.setMarkers(place.getMarkers()-1); + + for (final var arc : node.getTargetArcs()) { + final var place = (PlaceImpl) arc.getSource(); + place.setMarkers(place.getMarkers() - 1); } - for(var arc : node.getSourceArcs()){ - var place = (PlaceImpl) arc.getTarget(); - place.setMarkers(place.getMarkers()+1); + + for (final var arc : node.getSourceArcs()) { + final var place = (PlaceImpl) arc.getTarget(); + place.setMarkers(place.getMarkers() + 1); } } @@ -107,12 +127,14 @@ private static void doTransition(PetriNet petriNet, Node node){ * @param petriNet the initial PetriNet * @return the StepGraph with all reachable states of the given PetriNet */ - public static StepGraph buildStepGraph(PetriNet petriNet){ - var stepGraph = new StepGraph(petriNet); + public static StepGraph buildStepGraph(final PetriNet petriNet){ + final var stepGraph = new StepGraph(petriNet); stepGraph.getSteps().add(petriNet); - for(var node : getPossibleTransitions(petriNet)){ + + for (final var node : getPossibleTransitions(petriNet)) { addStepToStepGraph(petriNet, petriNet.deepCopy(), node, stepGraph); } + return stepGraph; } @@ -126,23 +148,31 @@ public static StepGraph buildStepGraph(PetriNet petriNet){ * @param stepGraph the stepgraph the resulting PetriNet will be added to * (if it doesn't already contain an equal PetriNet) */ - private static void addStepToStepGraph(PetriNet parent, PetriNet copy, Node transition, StepGraph stepGraph){ + private static void addStepToStepGraph(final PetriNet parent, + final PetriNet copy, + final Node transition, + final StepGraph stepGraph){ Node transitionCopy = null; - for(var node : copy.getNodes()){ - if(node.getID().equals(transition.getID())){ + + for (final var node : copy.getNodes()) { + if (node.getID().equals(transition.getID())) { transitionCopy = node; } } + doTransition(copy, transitionCopy); - for(var net : stepGraph.getSteps()){ + + for (final var net : stepGraph.getSteps()) { if (net.equals(copy)){ stepGraph.getArcs().add(new NetArc(parent, net, transition.getID())); return; } } + stepGraph.getArcs().add(new NetArc(parent, copy, transition.getID())); stepGraph.getSteps().add(copy); - for(var node : getPossibleTransitions(copy)){ + + for (final var node : getPossibleTransitions(copy)) { addStepToStepGraph(copy, copy.deepCopy(), node, stepGraph); } } @@ -152,14 +182,15 @@ private static void addStepToStepGraph(PetriNet parent, PetriNet copy, Node tran * @param node a given Node * @return true if it is a transition ready to be used */ - private static boolean isPossible(Node node){ - if(node instanceof TransitionImpl) { + private static boolean isPossible(final Node node) { + if (node instanceof TransitionImpl) { return node.getTargetArcs().stream() .map(Arc::getSource) - .map(place -> (PlaceImpl) place) + .map(PlaceImpl.class::cast) .map(PlaceImpl::getMarkers) .allMatch(markers -> markers > 0); } + return false; } @@ -167,19 +198,26 @@ private static boolean isPossible(Node node){ * @param stepGraph PetriNet StepGraph * @return all paths possible in given petriNet */ - public static List> getAllPaths(StepGraph stepGraph){ - List> len1 =getPathsOfLength1(stepGraph); + public static List> getAllPaths(final StepGraph stepGraph){ + final var len1 = getPathsOfLength1(stepGraph); List> lenN = new ArrayList<>(len1); - List> allPaths = new ArrayList<>(len1); - int i = 1; - while(!lenN.isEmpty()){ - log.info("Calculating paths of length " + ++i); + final List> allPaths = new ArrayList<>(len1); + + var i = 1; + + while (!lenN.isEmpty()) { + if (log.isInfoEnabled()) { + log.info("Calculating paths of length " + ++i); + } lenN = getPathsOfLengthNplus1(len1, lenN); - if(!lenN.isEmpty()){ + + if (!lenN.isEmpty()) { allPaths.addAll(lenN); } } + allPaths.sort(Comparator.comparingInt(List::size)); + return filterPaths(allPaths); } @@ -187,21 +225,24 @@ public static List> getAllPaths(StepGraph stepGraph){ * @param stepGraph PetriNet StepGraph * @return all possible paths of length 1 (either Place -> Transition or Transition -> Place) */ - private static List> getPathsOfLength1(StepGraph stepGraph){ - List> paths = new ArrayList<>(); - for(var node : stepGraph.getInitial().getNodes()){ - if(node instanceof Place){ - var followingTransitions = node.getSourceArcs().stream().map(Arc::getTarget) + private static List> getPathsOfLength1(final StepGraph stepGraph){ + final List> paths = new ArrayList<>(); + + for (final var node : stepGraph.getInitial().getNodes()) { + if (node instanceof Place) { + final var followingTransitions = node.getSourceArcs().stream().map(Arc::getTarget) .filter(trans -> stepGraph.getArcs().stream() .map(NetArc::getUsedTransition) .anyMatch(used -> used.equals(trans.getID()))) .collect(Collectors.toList()); - for(var succ : followingTransitions){ + + for (final var succ : followingTransitions) { paths.add(List.of(node, succ)); } } - if(node instanceof Transition){ - for(var succ : node.getSourceArcs().stream().map(Arc::getTarget).collect(Collectors.toSet())){ + + if (node instanceof Transition) { + for(final var succ : node.getSourceArcs().stream().map(Arc::getTarget).collect(Collectors.toSet())){ paths.add(List.of(node, succ)); } } @@ -214,50 +255,69 @@ private static List> getPathsOfLength1(StepGraph stepGraph){ * @param pathsLenN all possible paths of length n (stop considering as soon as path gets circular (first = last)) * @return all possible paths of length n+1 */ - private static List> getPathsOfLengthNplus1(List> pathsLen1, List> pathsLenN){ - List> pathsLenNplus1 = new ArrayList<>(); - for(var pathN : pathsLenN){ - for(var path1 : pathsLen1){ - if(pathN.get(pathN.size()-1).equals(path1.get(0)) && circleFree(pathN)){ - var pathNplus1 = new ArrayList<>(pathN); + private static List> getPathsOfLengthNplus1(final List> pathsLen1, + final List> pathsLenN) { + final List> pathsLenNplus1 = new ArrayList<>(); + + for (final var pathN : pathsLenN) { + for (final var path1 : pathsLen1) { + if (pathN.get(pathN.size() - 1).equals(path1.get(0)) && circleFree(pathN)) { + final var pathNplus1 = new ArrayList<>(pathN); + pathNplus1.add(path1.get(path1.size()-1)); pathsLenNplus1.add(pathNplus1); } } } + return pathsLenNplus1; } - private static boolean circleFree(List list){ + private static boolean circleFree(final List list){ return list.stream().distinct().count() == list.size(); } - public static List> calculatePaths(StepGraph stepGraph){ - List> len1 =calcPathsOfLength1(stepGraph); + public static List> calculatePaths(final StepGraph stepGraph) { + final var len1 =calcPathsOfLength1(stepGraph); List> lenN = new ArrayList<>(len1); + lenN = lenN.stream().filter(path -> path.get(0).equals(stepGraph.getInitial())).collect(Collectors.toList()); - List> allPaths = new ArrayList<>(lenN); - int i = 1; - while(!lenN.isEmpty()){ - log.info("Calculating paths of length " + ++i); + + final List> allPaths = new ArrayList<>(lenN); + + var i = 1; + + while (!lenN.isEmpty()) { + if (log.isInfoEnabled()) { + log.info("Calculating paths of length " + ++i); + } + lenN = calcPathsOfLengthNplus1(len1, lenN); - log.info(String.format("Length %d: %d", i, lenN.size())); - if(!lenN.isEmpty()){ + + if (log.isInfoEnabled()) { + log.info(String.format("Length %d: %d", i, lenN.size())); + } + + if (!lenN.isEmpty()) { allPaths.addAll(lenN); } } + allPaths.sort(Comparator.comparingInt(List::size)); + return allPaths; } - private static List> calcPathsOfLength1(StepGraph stepGraph){ - List> paths = new ArrayList<>(); - for(var arc : stepGraph.getArcs()){ - var sourcePart = new ArrayList<>(); + private static List> calcPathsOfLength1(final StepGraph stepGraph) { + final List> paths = new ArrayList<>(); + + for (final var arc : stepGraph.getArcs()) { + final var sourcePart = new ArrayList<>(); sourcePart.add(arc.getSource()); sourcePart.add(arc.getUsedTransition()); paths.add(sourcePart); - var targetPart = new ArrayList<>(); + + final var targetPart = new ArrayList<>(); targetPart.add(arc.getUsedTransition()); targetPart.add(arc.getTarget()); paths.add(targetPart); @@ -265,12 +325,14 @@ private static List> calcPathsOfLength1(StepGraph stepGraph){ return paths; } - private static List> calcPathsOfLengthNplus1(List> len1, List> lenN){ - List> pathsLenNplus1 = new ArrayList<>(); - for(var pathN : lenN){ - for(var path1 : len1){ + private static List> calcPathsOfLengthNplus1(final List> len1, + final List> lenN){ + final List> pathsLenNplus1 = new ArrayList<>(); + + for (final var pathN : lenN) { + for (final var path1 : len1) { if(pathN.get(pathN.size()-1).equals(path1.get(0)) && circleFree(pathN)){ - var pathNplus1 = new ArrayList<>(pathN); + final var pathNplus1 = new ArrayList<>(pathN); pathNplus1.add(path1.get(path1.size()-1)); pathsLenNplus1.add(pathNplus1); } @@ -279,11 +341,13 @@ private static List> calcPathsOfLengthNplus1(List> len return pathsLenNplus1; } - private static List> filterPaths(List> paths){ - List> filtered = new ArrayList<>(List.copyOf(paths)); - var filteredCopy = new ArrayList<>(filtered); - for(var pathY : filteredCopy){ - for(var pathX : paths){ + private static List> filterPaths(final List> paths) { + final List> filtered = new ArrayList<>(List.copyOf(paths)); + + final var filteredCopy = new ArrayList<>(filtered); + + for (final var pathY : filteredCopy) { + for (final var pathX : paths) { if(pathX.get(0).equals(pathY.get(0)) && !pathX.equals(pathY) && Collections.indexOfSubList(pathY, pathX) != -1){ filtered.remove(pathX); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/StepGraph.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/StepGraph.java index fe0028d2..a208f7c1 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/StepGraph.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/StepGraph.java @@ -7,26 +7,25 @@ import java.util.Set; /** - * Graph containing every Step a Petri Net can make in its execution + * Graph containing every Step a Petri Net can make in its execution. */ @Getter public class StepGraph { - - public StepGraph(PetriNet initial){ - this.initial = initial; - steps = new HashSet<>(); - arcs = new HashSet<>(); - } - private PetriNet initial; /** - * Each Step a PetriNet can make is represented as a PetriNet + * Each Step a PetriNet can make is represented as a PetriNet. */ private Set steps; /** - * Arc which Steps are reachable from given Steps + * Arc which Steps are reachable from given Steps. */ private Set arcs; + + public StepGraph(final PetriNet initial) { + this.initial = initial; + steps = new HashSet<>(); + arcs = new HashSet<>(); + } } diff --git a/src/test/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplicationTests.java b/src/test/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplicationTests.java index 4dbb57cf..e5423126 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplicationTests.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/ConfigmanagerApplicationTests.java @@ -9,5 +9,4 @@ class ConfigmanagerApplicationTests { @Test void contextLoads() { } - } diff --git a/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java b/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java index 357dc40c..6c81b200 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/api_test/BrokerUIAPITest.java @@ -19,11 +19,14 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.doNothing; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @WebMvcTest(BrokerController.class) -public class BrokerUIAPITest { +class BrokerUIAPITest { @Autowired private transient MockMvc mockMvc; @@ -35,7 +38,7 @@ public class BrokerUIAPITest { private DefaultBrokerClient defaultBrokerClient; @Test - public void should_add_new_broker() throws Exception { + void should_add_new_broker() throws Exception { LinkedMultiValueMap requestParams = new LinkedMultiValueMap<>(); requestParams.add("brokerUri", "https://example.com"); @@ -47,7 +50,7 @@ public void should_add_new_broker() throws Exception { } @Test - public void should_update_broker() throws Exception { + void should_update_broker() throws Exception { CustomBroker broker = TestUtil.createCustomBroker(); @@ -62,7 +65,7 @@ public void should_update_broker() throws Exception { } @Test - public void should_return_broker_list() throws Exception { + void should_return_broker_list() throws Exception { List brokers = TestUtil.brokers(); Mockito.when(brokerService.getCustomBrokers()).thenReturn(brokers); @@ -72,7 +75,7 @@ public void should_return_broker_list() throws Exception { } @Test - public void should_delete_a_broker() throws Exception { + void should_delete_a_broker() throws Exception { CustomBroker customBroker = TestUtil.createCustomBroker(); Mockito.when(brokerService.deleteBroker(Mockito.any(URI.class))).thenReturn(true); diff --git a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java index d4287c13..f105610c 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java @@ -1,9 +1,20 @@ package de.fraunhofer.isst.configmanager.petrinet.builder; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.AppRouteBuilder; +import de.fraunhofer.iais.eis.Endpoint; +import de.fraunhofer.iais.eis.EndpointBuilder; +import de.fraunhofer.iais.eis.RouteStep; +import de.fraunhofer.iais.eis.RouteStepBuilder; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; -import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeExpression; -import de.fraunhofer.isst.configmanager.petrinet.model.*; +import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.CTLEvaluator; +import de.fraunhofer.isst.configmanager.petrinet.model.Arc; +import de.fraunhofer.isst.configmanager.petrinet.model.ArcImpl; +import de.fraunhofer.isst.configmanager.petrinet.model.ContextObject; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; +import de.fraunhofer.isst.configmanager.petrinet.model.PetriNetImpl; +import de.fraunhofer.isst.configmanager.petrinet.model.Place; +import de.fraunhofer.isst.configmanager.petrinet.model.PlaceImpl; +import de.fraunhofer.isst.configmanager.petrinet.model.TransitionImpl; import de.fraunhofer.isst.configmanager.petrinet.simulator.PetriNetSimulator; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Disabled; @@ -11,33 +22,24 @@ import java.io.IOException; import java.net.URI; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; import java.util.concurrent.ThreadLocalRandom; -import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.*; - +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.FF.FF; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.TT.TT; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeAND.nodeAND; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeEXIST_UNTIL.nodeEXIST_UNTIL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeExpression.nodeExpression; -import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeFORALL_MODAL.nodeFORALL_MODAL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeFORALL_NEXT.nodeFORALL_NEXT; -import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeFORALL_UNTIL.nodeFORALL_UNTIL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeMODAL.nodeMODAL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeNF.nodeNF; -import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeNOT.nodeNOT; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeOR.nodeOR; -import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodePOS.nodePOS; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.ArcExpression.arcExpression; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionAF.transitionAF; -import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionAND.transitionAND; -import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionEXIST_UNTIL.transitionEXIST_UNTIL; -import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFORALL_UNTIL.transitionFORALL_UNTIL; -import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionMODAL.transitionMODAL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionNOT.transitionNOT; -import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.FF.FF; -import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.TT.TT; -import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionOR.transitionOR; -import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionPOS.transitionPOS; /** * Test building a PetriNet from a randomly generated AppRoute @@ -77,24 +79,37 @@ void testBuildPetriNet() throws IOException { //build a petriNet from the generated AppRoute and log generated GraphViz representation var petriNet = InfomodelPetriNetBuilder.petriNetFromAppRoute(appRoute, false); var ser = new Serializer(); - log.info(ser.serialize(appRoute)); - log.info(GraphVizGenerator.generateGraphViz(petriNet)); + if (log.isInfoEnabled()) { + log.info(ser.serialize(appRoute)); + log.info(GraphVizGenerator.generateGraphViz(petriNet)); + } //build a full Graph of all possible steps in the PetriNet and log generated GraphViz representation var graph = PetriNetSimulator.buildStepGraph(petriNet); - log.info(String.valueOf(graph.getArcs().size())); - log.info(GraphVizGenerator.generateGraphViz(graph)); + + if (log.isInfoEnabled()) { + log.info(String.valueOf(graph.getArcs().size())); + log.info(GraphVizGenerator.generateGraphViz(graph)); + } + var allPaths = PetriNetSimulator.getAllPaths(graph); - log.info(allPaths.toString()); + + if (log.isInfoEnabled()) { + log.info(allPaths.toString()); + } + var formula = nodeAND(nodeMODAL(transitionNOT(FF())), nodeOR(nodeNF(nodeExpression(x -> true, "testMsg")),TT())); var formula2 = nodeAND(nodeFORALL_NEXT(nodeMODAL(transitionAF(arcExpression(x -> true,"")))), TT()); var formula3 = nodeEXIST_UNTIL(nodeMODAL(TT()), nodeNF(nodeExpression(x -> x.getSourceArcs().isEmpty(), ""))); - log.info("Formula 1: " + formula.writeFormula()); - log.info("Result: " + CTLEvaluator.evaluate(formula,graph.getInitial().getNodes().stream().filter(node -> node instanceof Place).findAny().get(), allPaths)); - log.info("Formula 2: " + formula2.writeFormula()); - log.info("Result: " + CTLEvaluator.evaluate(formula2,graph.getInitial().getNodes().stream().filter(node -> node instanceof Place).findAny().get(), allPaths)); - log.info("Formula 3: " + formula3.writeFormula()); - log.info("Result: " + CTLEvaluator.evaluate(formula3,graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("place://source"))).findAny().get(), allPaths)); + + if (log.isInfoEnabled()) { + log.info("Formula 1: " + formula.writeFormula()); + log.info("Result: " + CTLEvaluator.evaluate(formula, graph.getInitial().getNodes().stream().filter(node -> node instanceof Place).findAny().get(), allPaths)); + log.info("Formula 2: " + formula2.writeFormula()); + log.info("Result: " + CTLEvaluator.evaluate(formula2, graph.getInitial().getNodes().stream().filter(node -> node instanceof Place).findAny().get(), allPaths)); + log.info("Formula 3: " + formula3.writeFormula()); + log.info("Result: " + CTLEvaluator.evaluate(formula3, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("place://source"))).findAny().get(), allPaths)); + } } @Test @@ -195,14 +210,26 @@ void testExamplePetriNet(){ arcs.add(new ArcImpl(endTrans, end)); //create petriNet and visualize var petriNet = new PetriNetImpl(URI.create("https://petrinet"), nodes, arcs); - log.info(GraphVizGenerator.generateGraphViz(petriNet)); + + if (log.isInfoEnabled()) { + log.info(GraphVizGenerator.generateGraphViz(petriNet)); + } + //build stepGraph and visualize var graph = PetriNetSimulator.buildStepGraph(petriNet); - //log.info(GraphVizGenerator.generateGraphViz(graph)); - log.info(String.format("%d possible states!", graph.getSteps().size())); + + if (log.isInfoEnabled()) { + //log.info(GraphVizGenerator.generateGraphViz(graph)); + log.info(String.format("%d possible states!", graph.getSteps().size())); + } + //find valid paths and visualize var transitionList = PetriNetSimulator.getAllPaths(graph); - log.info("Transitions: " + transitionList.size()); + + if (log.isInfoEnabled()) { + log.info("Transitions: " + transitionList.size()); + } + /* var allPaths = PetriNetSimulator.getAllPaths(graph); log.info(String.format("Found %d valid Paths!", allPaths.size())); @@ -259,8 +286,10 @@ public static ArrayList randomSubList(List input) { @Test @Disabled - public void testFormula(){ + void testFormula(){ var formula = nodeAND(nodeMODAL(transitionNOT(FF())), nodeOR(nodeNF(nodeExpression(x -> true, "testMsg")),TT())); - log.info(formula.writeFormula()); + if (log.isInfoEnabled()) { + log.info(formula.writeFormula()); + } } } diff --git a/src/test/java/de/fraunhofer/isst/configmanager/util/TestUtil.java b/src/test/java/de/fraunhofer/isst/configmanager/util/TestUtil.java index 87b64ce9..85ae1264 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/util/TestUtil.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/util/TestUtil.java @@ -1,6 +1,7 @@ package de.fraunhofer.isst.configmanager.util; import de.fraunhofer.isst.configmanager.data.entities.CustomBroker; +import lombok.experimental.UtilityClass; import java.net.URI; import java.util.ArrayList; @@ -9,13 +10,14 @@ /** * Utility class for testing */ +@UtilityClass public class TestUtil { /** * @return custom broker */ public static CustomBroker createCustomBroker() { - CustomBroker customBroker = new CustomBroker(); + final var customBroker = new CustomBroker(); customBroker.setBrokerUri(URI.create("https://example.com")); customBroker.setTitle("CustomBroker"); return customBroker; @@ -25,7 +27,6 @@ public static CustomBroker createCustomBroker() { * @return list of brokers */ public static List brokers() { - List brokers = new ArrayList<>(); brokers.add(createCustomBroker()); return brokers; From 6ce64312f76bdff486a8b18d3559f2f0a1b9699f Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Thu, 6 May 2021 13:19:59 +0200 Subject: [PATCH 118/157] build: infomodel-java-classes 4.0.6 and breaking adjustments --- pom.xml | 4 ++-- .../configmanager/api/service/ConfigModelService.java | 9 +++++++-- .../petrinet/builder/InfomodelPetriNetBuilderTest.java | 8 +++++--- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 171379d9..e4fba115 100644 --- a/pom.xml +++ b/pom.xml @@ -208,7 +208,7 @@ de.fraunhofer.iais.eis.ids.infomodel java - 4.0.2 + 4.0.6 @@ -220,7 +220,7 @@ de.fraunhofer.iais.eis.ids infomodel-serializer - 4.0.2 + 4.0.6 de.fraunhofer.iais.eis.ids.infomodel diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java index ffa115c1..79690b37 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java @@ -6,6 +6,7 @@ import de.fraunhofer.iais.eis.ConfigurationModelBuilder; import de.fraunhofer.iais.eis.ConfigurationModelImpl; import de.fraunhofer.iais.eis.ConnectorDeployMode; +import de.fraunhofer.iais.eis.ConnectorEndpointBuilder; import de.fraunhofer.iais.eis.ConnectorStatus; import de.fraunhofer.iais.eis.LogLevel; import de.fraunhofer.iais.eis.ProxyBuilder; @@ -113,12 +114,16 @@ public void createConfigModel(final String loglevel, final String keyStore, final String keyStorePassword) { + final var connectorEndpointBuilder = new ConnectorEndpointBuilder(); + connectorEndpointBuilder._accessURL_(URI.create("https://example.com")); + final var connector = new BaseConnectorBuilder() - ._inboundModelVersion_(new ArrayList<>(List.of("3.1.0"))) - ._outboundModelVersion_("3.1.0") + ._inboundModelVersion_(new ArrayList<>(List.of("4.0.6"))) + ._outboundModelVersion_("4.0.6") ._securityProfile_(SecurityProfile.BASE_SECURITY_PROFILE) ._maintainer_(URI.create("https://example.com")) ._curator_(URI.create("https://example.com")) + ._hasDefaultEndpoint_(connectorEndpointBuilder.build()) .build(); final var configurationModel = new ConfigurationModelBuilder() diff --git a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java index f105610c..1915a0b7 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java @@ -68,11 +68,13 @@ void testBuildPetriNet() throws IOException { } var subroutes = new ArrayList(); for (int i = 0; i < ThreadLocalRandom.current().nextInt(MINIMUM_SUBROUTE,MAXIMUM_SUBROUTE); i++){ - subroutes.add(new RouteStepBuilder(URI.create("http://subroute" + i))._appRouteStart_(randomSubList(endpointlist))._appRouteEnd_(randomSubList(endpointlist)).build()); + subroutes.add(new RouteStepBuilder(URI.create("http://subroute" + i)) + ._appRouteStart_((ArrayList) randomSubList(endpointlist)) + ._appRouteEnd_((ArrayList) randomSubList(endpointlist)).build()); } var appRoute = new AppRouteBuilder(URI.create("http://approute")) - ._appRouteStart_(randomSubList(endpointlist)) - ._appRouteEnd_(randomSubList(endpointlist)) + ._appRouteStart_((ArrayList) randomSubList(endpointlist)) + ._appRouteEnd_((ArrayList) randomSubList(endpointlist)) ._hasSubRoute_(subroutes) .build(); From 29cca374f00b711028caa60c9a63d2a6943f9a38 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Thu, 6 May 2021 14:13:13 +0200 Subject: [PATCH 119/157] feat: trying several times to reach the connector when starting the CM --- .../api/service/ConfigModelService.java | 60 +++++++++++++------ 1 file changed, 42 insertions(+), 18 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java index ffa115c1..7a015ad5 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java @@ -27,6 +27,7 @@ import java.net.URI; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.TimeUnit; /** * Service class for the configuration model. @@ -45,40 +46,63 @@ public class ConfigModelService { public ConfigModelService(final ConfigModelRepository configModelRepository, final DefaultConnectorClient client) { this.configModelRepository = configModelRepository; - if (log.isWarnEnabled()) { - log.warn("---- [ConfigModelService] Initial StartUp! Trying to get current Configuration from Connector!"); + if (log.isInfoEnabled()) { + log.info("---- [ConfigModelService] ConfigManager StartUp! Trying to get current Configuration from Connector!"); } try { - final var connectorConfiguration = client.getConfiguration(); - updateConfigModel(connectorConfiguration); + getConnectorConfig(client); if (log.isInfoEnabled()) { log.info("---- [ConfigModelService] Received configuration from running Connector!"); } - } catch (IOException e) { - if (log.isWarnEnabled()) { - log.warn("---- [ConfigModelService] Could not get Configmodel from Connector! Using old Config if " - + "available! Error establishing connection to connector: " + e.getMessage()); + } catch (InterruptedException e) { + if (log.isInfoEnabled()) { + log.info("---- [ConfigModelService] Could not get Configmodel from Connector! Using old Config if available!"); } if (!configModelRepository.findAll().isEmpty()) { configModelObject = configModelRepository.findAll().get(0); } else { - if (log.isWarnEnabled()) { - log.warn("---- [ConfigModelService] Connector Config not reachable and no old config available! Using new placeholder Config."); - createConfigModel( - "NO_LOGGING", - "TEST_DEPLOYMENT", - "http://truststore", - "password", - "http://keystore", - "password" - ); + if (log.isInfoEnabled()) { + log.info("---- [ConfigModelService] Connector Config not reachable and no old config available! Using new placeholder Config."); } + + createConfigModel( + "NO_LOGGING", + "TEST_DEPLOYMENT", + "http://truststore", + "password", + "http://keystore", + "password" + ); } } } + private void getConnectorConfig(final DefaultConnectorClient client) throws InterruptedException { + ConfigurationModel connectorConfiguration = null; + + for (var i = 1; i < 10; i++) { + try { + if (log.isInfoEnabled()) { + log.info("---- [ConfigModelService] Try to reach the connector: " + i + "/10"); + } + connectorConfiguration = client.getConfiguration(); + updateConfigModel(connectorConfiguration); + break; + } catch (IOException e) { + if (log.isInfoEnabled()) { + log.info("---- [ConfigModelService] Could not reach the connector, starting next try in 5 seconds."); + } + TimeUnit.SECONDS.sleep(5); + } + } + + if (connectorConfiguration == null) { + throw new InterruptedException(); + } + } + // private void getOfferedResources() { // // BaseConnector baseConnector = null; From 7e8a06d21e45a86e5deecb09ad481ad8ac8a11fa Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Thu, 6 May 2021 14:14:18 +0200 Subject: [PATCH 120/157] fix: wrong count in connection-retry --- .../isst/configmanager/api/service/ConfigModelService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java index 7a015ad5..72c461a3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java @@ -82,7 +82,7 @@ public ConfigModelService(final ConfigModelRepository configModelRepository, private void getConnectorConfig(final DefaultConnectorClient client) throws InterruptedException { ConfigurationModel connectorConfiguration = null; - for (var i = 1; i < 10; i++) { + for (var i = 1; i <= 10; i++) { try { if (log.isInfoEnabled()) { log.info("---- [ConfigModelService] Try to reach the connector: " + i + "/10"); From b581607971a95b2df3313e58c304864bab216de9 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Thu, 6 May 2021 15:11:38 +0200 Subject: [PATCH 121/157] build: infomodel util 4.0.6 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index e4fba115..a14aee97 100644 --- a/pom.xml +++ b/pom.xml @@ -212,9 +212,9 @@ - de.fraunhofer.iais.eis.ids.infomodel + de.fraunhofer.iais.eis.infomodel util - 4.0.2 + 4.0.6 From a2f60f43d799d4628a7d75bfbac619852cfe81d6 Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Thu, 6 May 2021 15:47:47 +0200 Subject: [PATCH 122/157] docs: changelog, added new changes --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5715ae1c..cd663fcb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Minor Change: New API GET /api/ui/connector/status to return the accessibility-status of the Public-Connector-Endpoint - Minor Change: New API PUT /resource/contract/update to create the contract in the configmanager and update it at the dataspace connector - Minor Change: New setting option to address the DSC via HTTP or HTTPS. dataspace.communication.ssl=true/false in application.properties and DATASPACE_COMMUNICATION_SSL=true/false in docker-compose environment. +- Minor Change: The CM now tries to reach the connector max 10 times during startup, with a pause of 5 seconds each time, instead of just try once. ### Changes - Patch Change: Code and Architecture refactoring @@ -39,6 +40,10 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Patch Change: A percent sign within URLs in the UI no longer results in an error in the CM-Backend. - Patch Change: Refactored Swagger-UI API Documentation, added all actually possible return-status-codes for API calls +### Infomodel Maintenance +- Patch Change: Upgraded infomodel-java-artifacts 4.0.2 -> 4.0.6 +- Used infomodel artifacts: java, util, serializer + ### Dependency Maintenance - Add: org.apache.logging.log4j:log4j-web 2.14.1 (Apache 2.0) - Upgrade: org.springframework.boot:spring-boot-starter-parent 2.4.2 -> 2.4.5 From 8e29e8f86055e92943ac02db3466f3fdb8e39c52 Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Thu, 6 May 2021 16:03:48 +0200 Subject: [PATCH 123/157] dependabot: enable dependency update pull requests --- .github/dependabot.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..90a1b5ae --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,8 @@ +version: 2 +updates: + - package-ecosystem: "maven" + directory: "/" + schedule: + interval: "daily" + target-branch: "development" + open-pull-requests-limit: 10 From 059a1629c3d3e67c4e1946c8ebbc3f54f4bb2ff5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 6 May 2021 14:04:07 +0000 Subject: [PATCH 124/157] build(deps): bump springdoc-openapi-ui from 1.5.7 to 1.5.8 Bumps [springdoc-openapi-ui](https://github.com/springdoc/springdoc-openapi) from 1.5.7 to 1.5.8. - [Release notes](https://github.com/springdoc/springdoc-openapi/releases) - [Changelog](https://github.com/springdoc/springdoc-openapi/blob/master/CHANGELOG.md) - [Commits](https://github.com/springdoc/springdoc-openapi/compare/v1.5.7...v1.5.8) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a14aee97..29110b49 100644 --- a/pom.xml +++ b/pom.xml @@ -158,7 +158,7 @@ org.springdoc springdoc-openapi-ui - 1.5.7 + 1.5.8 From 3f71a41b23b67018e9a8861d4b62b80bb4bbd9b3 Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Thu, 6 May 2021 16:15:08 +0200 Subject: [PATCH 125/157] docs: update changelog (dependency update) --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd663fcb..5f825f3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Upgrade: org.springframework.security:spring-security-test 5.4.2 -> 5.4.6 - Upgrade: org.projectlombok:lombok 1.18.18 -> 1.18.20 - Upgrade: junit:junit 4.13.1 -> 4.13.2 +- Upgrade: org.springdoc:springdoc-openapi-ui 1.5.7 -> 1.5.8 - Exclude: com.vaadin.external.google:android-json from org.springframework.boot:spring-boot-starter-test - Remove: io.jsonwebtoken:jjwt 0.9.1 From 8a228359716152fad8aafeb5734df6b73d2c7330 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Thu, 6 May 2021 17:34:05 +0200 Subject: [PATCH 126/157] feat: add postgresql dependency --- pom.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pom.xml b/pom.xml index 29110b49..05c31a9d 100644 --- a/pom.xml +++ b/pom.xml @@ -204,6 +204,15 @@ 2.14.1 + + + + org.postgresql + postgresql + 42.2.20 + + + de.fraunhofer.iais.eis.ids.infomodel From abcdf72c88bbafb3bc3b852b7665ecfa365e70f6 Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Fri, 7 May 2021 10:40:06 +0200 Subject: [PATCH 127/157] docs: changelog, move infomodel to major changes --- CHANGELOG.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f825f3c..8e597a0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,11 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Remove 20 unused APIs (= 1.150 lines of code) (unused by ConfigManager-UI project) - For the APIs of the enums, in addition to the technical name, such as DE for the language-dropdown, the written labels are now also supplied, e.g. German <-> DE. The structure of the API returns has changed accordingly +### Major Change: Infomodel Maintenance +- Major Change: Upgraded infomodel-java-artifacts 4.0.2 -> 4.0.6 +- Used infomodel artifacts: java, util, serializer +- Changes the structure of the API-enums-returns like country abbreviations. These now have the URI form "http://.../code/EN" instead of simply returning an abbreviation like "EN". + ### Added - Minor Change: New API GET /api/ui/connector/status to return the accessibility-status of the Public-Connector-Endpoint - Minor Change: New API PUT /resource/contract/update to create the contract in the configmanager and update it at the dataspace connector @@ -40,10 +45,6 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Patch Change: A percent sign within URLs in the UI no longer results in an error in the CM-Backend. - Patch Change: Refactored Swagger-UI API Documentation, added all actually possible return-status-codes for API calls -### Infomodel Maintenance -- Patch Change: Upgraded infomodel-java-artifacts 4.0.2 -> 4.0.6 -- Used infomodel artifacts: java, util, serializer - ### Dependency Maintenance - Add: org.apache.logging.log4j:log4j-web 2.14.1 (Apache 2.0) - Upgrade: org.springframework.boot:spring-boot-starter-parent 2.4.2 -> 2.4.5 From 0ed8e2484b3d62f935c94a96541bdc0dfa83733b Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Fri, 7 May 2021 10:41:43 +0200 Subject: [PATCH 128/157] docs: changelog, update fixes --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e597a0e..f574c97b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Patch Change: Updated recursion methods in ResourceService that caused problems - Patch Change: A percent sign within URLs in the UI no longer results in an error in the CM-Backend. - Patch Change: Refactored Swagger-UI API Documentation, added all actually possible return-status-codes for API calls +- Patch Change: IDS Resources Duration Policy in (h) in edit mode is poluted with xml-coding (2^^xsd:duration instead of 2), fixed by upgrading infomodel dependencies ### Dependency Maintenance - Add: org.apache.logging.log4j:log4j-web 2.14.1 (Apache 2.0) From 2fe072d3d56071cc11fe80d0a094d91dab11f1d3 Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Fri, 7 May 2021 10:47:39 +0200 Subject: [PATCH 129/157] dependabot: increase maximum number pull-requests --- .github/dependabot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 90a1b5ae..c13d6492 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,4 +5,4 @@ updates: schedule: interval: "daily" target-branch: "development" - open-pull-requests-limit: 10 + open-pull-requests-limit: 30 From 4f1a08fca43c388a253f840cecd681972ce9783c Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Fri, 7 May 2021 10:50:35 +0200 Subject: [PATCH 130/157] docs: changelog, add dependabot --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f574c97b..8beec56b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - Patch Change: IDS Resources Duration Policy in (h) in edit mode is poluted with xml-coding (2^^xsd:duration instead of 2), fixed by upgrading infomodel dependencies ### Dependency Maintenance +- Dependabot: Dependabot will now automatically suggest pull requests for updates to dependencies. - Add: org.apache.logging.log4j:log4j-web 2.14.1 (Apache 2.0) - Upgrade: org.springframework.boot:spring-boot-starter-parent 2.4.2 -> 2.4.5 - Upgrade: org.springframework.security:spring-security-test 5.4.2 -> 5.4.6 From e5839392237799bc1c65bec1c0099dfa6787243f Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Tue, 11 May 2021 13:36:19 +0200 Subject: [PATCH 131/157] docs: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8beec56b..d9a4df89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,7 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ### Dependency Maintenance - Dependabot: Dependabot will now automatically suggest pull requests for updates to dependencies. - Add: org.apache.logging.log4j:log4j-web 2.14.1 (Apache 2.0) +- Add: org.postgresql:postgresql 42.2.20 (BSD-2-Clause) - Upgrade: org.springframework.boot:spring-boot-starter-parent 2.4.2 -> 2.4.5 - Upgrade: org.springframework.security:spring-security-test 5.4.2 -> 5.4.6 - Upgrade: org.projectlombok:lombok 1.18.18 -> 1.18.20 From 81c57b0c7f39cdc79bcb86b2a5d1cfa785f7abe8 Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Tue, 11 May 2021 16:51:30 +0200 Subject: [PATCH 132/157] docs: readme, remove badges --- README.md | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 34f64d4e..a88a64cc 100644 --- a/README.md +++ b/README.md @@ -2,19 +2,15 @@

-
-
-# IDS - Configuration Manager +# IDS-Configuration Manager The configuration manager is the administrative part of a connector. It main task is to manage and validate the configuration model, followed by the deployment of the connector. The configuration model is an extensible domain model From 91a91f209cd5ca82b1fa94ce7ee9ede5c83d343f Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Wed, 12 May 2021 08:27:43 +0200 Subject: [PATCH 133/157] docs: readme, update used infomodel artifacts --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a88a64cc..0bbda50f 100644 --- a/README.md +++ b/README.md @@ -99,8 +99,8 @@ This is a list of currently implemented features, which is continuously updated. | Library/Component | Version | License | Owner | Contact | | ------ | ------ | ------ | ------ | ------ | -| IDS Information Model Library | 4.0.2 | Apache 2.0 | Fraunhofer IAIS | [Sebastian Bader](mailto:sebastian.bader@iais.fraunhofer.de) | -| IDS Information Model Serializer Library | 4.0.2 | Apache 2.0 | Fraunhofer IAIS | [Sebastian Bader](mailto:sebastian.bader@iais.fraunhofer.de) | +| IDS Information Model Library | 4.0.6 | Apache 2.0 | Fraunhofer IAIS | [Sebastian Bader](mailto:sebastian.bader@iais.fraunhofer.de) | +| IDS Information Model Serializer Library | 4.0.6 | Apache 2.0 | Fraunhofer IAIS | [Sebastian Bader](mailto:sebastian.bader@iais.fraunhofer.de) | | [Dataspace Connector](https://github.com/International-Data-Spaces-Association/DataspaceConnector) | Recommended: 4.1.0 - 4.3.1 | Apache 2.0 | Fraunhofer ISST | [Julia Pampus](mailto:julia.pampus@isst.fraunhofer.de) | | [Configuration Manager UI](https://github.com/International-Data-Spaces-Association/IDS-ConfigurationManager-UI) | latest | Apache 2.0 | Fraunhofer FKIE | [Bastian Weltjen](mailto:bastian.weltjen@fkie.fraunhofer.de) | From c3469207e647afc05403079573d83d43f0c01ee9 Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Wed, 12 May 2021 14:03:47 +0200 Subject: [PATCH 134/157] fix: dont sleep after 10 fails to reach Connector --- .../api/service/ConfigModelService.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java index 73c71e37..e88ce6c9 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java @@ -82,20 +82,23 @@ public ConfigModelService(final ConfigModelRepository configModelRepository, private void getConnectorConfig(final DefaultConnectorClient client) throws InterruptedException { ConfigurationModel connectorConfiguration = null; + final var connectionAttemps = 10; - for (var i = 1; i <= 10; i++) { + for (var i = 1; i <= connectionAttemps; i++) { try { if (log.isInfoEnabled()) { - log.info("---- [ConfigModelService] Try to reach the connector: " + i + "/10"); + log.info("---- [ConfigModelService] Try to reach the connector: " + i + "/" + connectionAttemps); } connectorConfiguration = client.getConfiguration(); updateConfigModel(connectorConfiguration); break; } catch (IOException e) { - if (log.isInfoEnabled()) { - log.info("---- [ConfigModelService] Could not reach the connector, starting next try in 5 seconds."); + if (i < connectionAttemps) { + if (log.isInfoEnabled()) { + log.info("---- [ConfigModelService] Could not reach the connector, starting next try in 5 seconds."); + } + TimeUnit.SECONDS.sleep(5); } - TimeUnit.SECONDS.sleep(5); } } From 806e7788d7174d151c784711f65626a05457efe0 Mon Sep 17 00:00:00 2001 From: eakker Date: Fri, 14 May 2021 11:11:06 +0200 Subject: [PATCH 135/157] chore: evaluate EXIST operators using filtered lists, make circlefree check public --- .../evaluation/formula/state/NodeEXIST_UNTIL.java | 8 ++++---- .../formula/transition/TransitionEXIST_UNTIL.java | 7 ++++--- .../petrinet/simulator/PetriNetSimulator.java | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java index 3532662d..cdb93d6d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java @@ -29,11 +29,11 @@ public boolean evaluate(final Node node, final List> paths) { check: for (final var path: paths) { if (path.get(0).equals(node) && path.size() % 2 == 1) { for (var i = 0; i < path.size() - 1; i += 2) { - if(!parameter1.evaluate(path.get(i), paths)) { - continue check; - } + var res1 = parameter1.evaluate(path.get(i), paths); + var res2 = parameter2.evaluate(path.get(i), paths); + if(res2) return true; + if(!res1) continue check; } - if (parameter2.evaluate(path.get(path.size() - 1), paths)) { return true; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java index 52a4258b..d69d3855 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java @@ -28,9 +28,10 @@ public boolean evaluate(final Node node, final List> paths) { check: for (final var path: paths){ if (path.get(0).equals(node) && paths.size() % 2 == 1) { for (var i = 0; i < path.size() - 1; i += 2){ - if (!parameter1.evaluate(path.get(i), paths)) { - continue check; - } + var res1 = parameter1.evaluate(path.get(i), paths); + var res2 = parameter2.evaluate(path.get(i), paths); + if(res2) return true; + if(!res1) continue check; } if(parameter2.evaluate(path.get(path.size()-1), paths)) { diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java index 21447bc6..5617a6ac 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java @@ -273,7 +273,7 @@ private static List> getPathsOfLengthNplus1(final List> pa return pathsLenNplus1; } - private static boolean circleFree(final List list){ + public static boolean circleFree(final List list){ return list.stream().distinct().count() == list.size(); } From f142d6af058f5c5fcd83b25247a4aeeb9c840332 Mon Sep 17 00:00:00 2001 From: eakker Date: Fri, 14 May 2021 11:43:36 +0200 Subject: [PATCH 136/157] chore: evaluate FORALL operators for circlefree paths using filtered lists, check paths of even length in EXIST operator --- .../formula/state/NodeEXIST_UNTIL.java | 25 ++++++++++------- .../formula/state/NodeFORALL_UNTIL.java | 26 +++++++++++------ .../transition/TransitionEXIST_UNTIL.java | 28 +++++++++++-------- .../transition/TransitionFORALL_UNTIL.java | 26 +++++++++++------ 4 files changed, 67 insertions(+), 38 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java index cdb93d6d..0e4a03a7 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java @@ -27,16 +27,21 @@ public boolean evaluate(final Node node, final List> paths) { } check: for (final var path: paths) { - if (path.get(0).equals(node) && path.size() % 2 == 1) { - for (var i = 0; i < path.size() - 1; i += 2) { - var res1 = parameter1.evaluate(path.get(i), paths); - var res2 = parameter2.evaluate(path.get(i), paths); - if(res2) return true; - if(!res1) continue check; - } - if (parameter2.evaluate(path.get(path.size() - 1), paths)) { - return true; - } + int offset; + if(!path.get(0).equals(node)) continue; + if (path.size() % 2 == 1) { + offset = 1; + }else { + offset = 2; + } + for (var i = 0; i < path.size() - offset; i += 2) { + var res1 = parameter1.evaluate(path.get(i), paths); + var res2 = parameter2.evaluate(path.get(i), paths); + if(res2) return true; + if(!res1) continue check; + } + if (parameter2.evaluate(path.get(path.size() - offset), paths)) { + return true; } } return false; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java index 4a12e6ec..de3a857f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java @@ -2,6 +2,7 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import de.fraunhofer.isst.configmanager.petrinet.model.Place; +import de.fraunhofer.isst.configmanager.petrinet.simulator.PetriNetSimulator; import lombok.AllArgsConstructor; import java.util.List; @@ -24,17 +25,26 @@ public boolean evaluate(final Node node, final List> paths) { return false; } - for (final var path: paths) { - if (path.get(0).equals(node) && path.size() % 2 == 1) { - for (var i = 0; i < path.size() - 1; i += 2) { - if (!parameter1.evaluate(path.get(i), paths)) { - return false; - } + check: for (final var path: paths) { + int offset; + if(PetriNetSimulator.circleFree(path)){ + if(!path.get(0).equals(node)) continue; + if (path.size() % 2 == 1) { + offset = 1; + }else { + offset = 2; } - - if (!parameter2.evaluate(path.get(path.size() - 1), paths)) { + for (var i = 0; i < path.size() - offset; i += 2) { + var res1 = parameter1.evaluate(path.get(i), paths); + var res2 = parameter2.evaluate(path.get(i), paths); + if(res2) continue check; + if(!res1) return false; + } + if (!parameter2.evaluate(path.get(path.size() - offset), paths)) { return false; } + }else{ + //TODO path contains circle } } return true; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java index d69d3855..60639597 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionEXIST_UNTIL.java @@ -25,18 +25,22 @@ public boolean evaluate(final Node node, final List> paths) { return false; } - check: for (final var path: paths){ - if (path.get(0).equals(node) && paths.size() % 2 == 1) { - for (var i = 0; i < path.size() - 1; i += 2){ - var res1 = parameter1.evaluate(path.get(i), paths); - var res2 = parameter2.evaluate(path.get(i), paths); - if(res2) return true; - if(!res1) continue check; - } - - if(parameter2.evaluate(path.get(path.size()-1), paths)) { - return true; - } + check: for (final var path: paths) { + int offset; + if(!path.get(0).equals(node)) continue; + if (path.size() % 2 == 1) { + offset = 1; + }else { + offset = 2; + } + for (var i = 0; i < path.size() - offset; i += 2) { + var res1 = parameter1.evaluate(path.get(i), paths); + var res2 = parameter2.evaluate(path.get(i), paths); + if(res2) return true; + if(!res1) continue check; + } + if (parameter2.evaluate(path.get(path.size() - offset), paths)) { + return true; } } return false; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java index 784190d7..22756a89 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java @@ -2,6 +2,7 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import de.fraunhofer.isst.configmanager.petrinet.model.Transition; +import de.fraunhofer.isst.configmanager.petrinet.simulator.PetriNetSimulator; import lombok.AllArgsConstructor; import java.util.List; @@ -24,17 +25,26 @@ public boolean evaluate(final Node node, final List> paths) { return false; } - for (final var path: paths) { - if (path.get(0).equals(node) && path.size() % 2 == 1) { - for (var i = 0; i < path.size() - 1; i += 2) { - if (!parameter1.evaluate(path.get(i), paths)) { - return false; - } + check: for (final var path: paths) { + int offset; + if(PetriNetSimulator.circleFree(path)){ + if(!path.get(0).equals(node)) continue; + if (path.size() % 2 == 1) { + offset = 1; + }else { + offset = 2; } - - if (!parameter2.evaluate(path.get(path.size() - 1), paths)) { + for (var i = 0; i < path.size() - offset; i += 2) { + var res1 = parameter1.evaluate(path.get(i), paths); + var res2 = parameter2.evaluate(path.get(i), paths); + if(res2) continue check; + if(!res1) return false; + } + if (!parameter2.evaluate(path.get(path.size() - offset), paths)) { return false; } + }else{ + //TODO path contains circle } } return true; From 5df18427be71c9d474913a28fa79eb5f8249a0ed Mon Sep 17 00:00:00 2001 From: eakker Date: Fri, 14 May 2021 15:48:17 +0200 Subject: [PATCH 137/157] chore: evaluate FORALL (except for final case of circle where all nodes fulfill param1), add example formula for read data --- .../formula/state/NodeEXIST_UNTIL.java | 2 +- .../formula/state/NodeFORALL_UNTIL.java | 15 ++++- .../transition/TransitionEXIST_UNTIL.java | 2 +- .../transition/TransitionFORALL_UNTIL.java | 15 ++++- .../petrinet/simulator/PetriNetSimulator.java | 2 + .../builder/InfomodelPetriNetBuilderTest.java | 60 ++++++------------- 6 files changed, 49 insertions(+), 47 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java index 0e4a03a7..bc0282ce 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeEXIST_UNTIL.java @@ -34,7 +34,7 @@ public boolean evaluate(final Node node, final List> paths) { }else { offset = 2; } - for (var i = 0; i < path.size() - offset; i += 2) { + for (var i = 2; i < path.size() - offset; i += 2) { var res1 = parameter1.evaluate(path.get(i), paths); var res2 = parameter2.evaluate(path.get(i), paths); if(res2) return true; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java index de3a857f..2bcb01b9 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java @@ -4,10 +4,12 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Place; import de.fraunhofer.isst.configmanager.petrinet.simulator.PetriNetSimulator; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import java.util.List; @AllArgsConstructor +@Slf4j public class NodeFORALL_UNTIL implements StateFormula { private StateFormula parameter1; private StateFormula parameter2; @@ -26,15 +28,15 @@ public boolean evaluate(final Node node, final List> paths) { } check: for (final var path: paths) { + if(!path.get(0).equals(node)) continue; int offset; if(PetriNetSimulator.circleFree(path)){ - if(!path.get(0).equals(node)) continue; if (path.size() % 2 == 1) { offset = 1; }else { offset = 2; } - for (var i = 0; i < path.size() - offset; i += 2) { + for (var i = 2; i < path.size() - offset; i += 2) { var res1 = parameter1.evaluate(path.get(i), paths); var res2 = parameter2.evaluate(path.get(i), paths); if(res2) continue check; @@ -45,6 +47,15 @@ public boolean evaluate(final Node node, final List> paths) { } }else{ //TODO path contains circle + //if something on the circle fulfills param2 accept, if something does not fulfill param1 reject + for (var i = 2; i> paths) { }else { offset = 2; } - for (var i = 0; i < path.size() - offset; i += 2) { + for (var i = 2; i < path.size() - offset; i += 2) { var res1 = parameter1.evaluate(path.get(i), paths); var res2 = parameter2.evaluate(path.get(i), paths); if(res2) return true; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java index 22756a89..2733d080 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java @@ -4,10 +4,12 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Transition; import de.fraunhofer.isst.configmanager.petrinet.simulator.PetriNetSimulator; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import java.util.List; @AllArgsConstructor +@Slf4j public class TransitionFORALL_UNTIL implements TransitionFormula { private TransitionFormula parameter1; private TransitionFormula parameter2; @@ -26,15 +28,15 @@ public boolean evaluate(final Node node, final List> paths) { } check: for (final var path: paths) { + if(!path.get(0).equals(node)) continue; int offset; if(PetriNetSimulator.circleFree(path)){ - if(!path.get(0).equals(node)) continue; if (path.size() % 2 == 1) { offset = 1; }else { offset = 2; } - for (var i = 0; i < path.size() - offset; i += 2) { + for (var i = 2; i < path.size() - offset; i += 2) { var res1 = parameter1.evaluate(path.get(i), paths); var res2 = parameter2.evaluate(path.get(i), paths); if(res2) continue check; @@ -45,6 +47,15 @@ public boolean evaluate(final Node node, final List> paths) { } }else{ //TODO path contains circle + //if something on the circle fulfills param2 accept, if something does not fulfill param1 reject + for (var i = 2; i> filterPaths(final List> paths) { } } } + //put circlefree paths at beginnig of list, so they get checked first + filtered.sort((o1, o2) -> Boolean.compare(circleFree(o2), circleFree(o1))); return filtered; } } diff --git a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java index 1915a0b7..11012515 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java @@ -36,10 +36,18 @@ import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeFORALL_NEXT.nodeFORALL_NEXT; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeMODAL.nodeMODAL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeNF.nodeNF; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeNOT.nodeNOT; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeOR.nodeOR; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodePOS.nodePOS; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.ArcExpression.arcExpression; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionAF.transitionAF; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionAND.transitionAND; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionEXIST_UNTIL.transitionEXIST_UNTIL; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFORALL_UNTIL.transitionFORALL_UNTIL; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionMODAL.transitionMODAL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionNOT.transitionNOT; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionOR.transitionOR; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionPOS.transitionPOS; /** * Test building a PetriNet from a randomly generated AppRoute @@ -145,11 +153,11 @@ void testExamplePetriNet(){ var getData = new TransitionImpl(URI.create("trans://getData")); getData.setContextObject(new ContextObject(List.of(), null, "data", null)); var copyData = new TransitionImpl(URI.create("trans://copyData")); - copyData.setContextObject(new ContextObject(List.of("france"), "data", "data", null)); + copyData.setContextObject(new ContextObject(List.of(""), "data", "data", null)); var extract = new TransitionImpl(URI.create("trans://extractSample")); extract.setContextObject(new ContextObject(List.of("france"), "data", "sample", "data")); var calcMean = new TransitionImpl(URI.create("trans://calcMean")); - calcMean.setContextObject(new ContextObject(List.of("france"), "data", "mean", "data")); + calcMean.setContextObject(new ContextObject(List.of(""), "data", "mean", "data")); var calcMed = new TransitionImpl(URI.create("trans://calcMedian")); calcMed.setContextObject(new ContextObject(List.of("france"), "data", "median", "data")); var calcRules = new TransitionImpl(URI.create("trans://calcAPrioriRules")); @@ -225,49 +233,19 @@ void testExamplePetriNet(){ log.info(String.format("%d possible states!", graph.getSteps().size())); } - //find valid paths and visualize - var transitionList = PetriNetSimulator.getAllPaths(graph); - - if (log.isInfoEnabled()) { - log.info("Transitions: " + transitionList.size()); - } - - /* var allPaths = PetriNetSimulator.getAllPaths(graph); + log.info(PetriNetSimulator.circleFree(allPaths.get(0))+ " "); log.info(String.format("Found %d valid Paths!", allPaths.size())); //create formula and evaluate on start node (exists path from start to end) - var formula = nodePOS(nodeNF(nodeExpression(x -> x.getSourceArcs().isEmpty(), ""))); - log.info("Evaluating Formula: " + formula.writeFormula()); - log.info("Result: " + CTLEvaluator.evaluate(formula, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("place://start"))).findAny().get(), allPaths)); - var formulaFrance = nodeMODAL( - transitionNOT( - transitionFORALL_UNTIL( - transitionAND( - transitionAF(arcExpression(transition -> - {if(transition.getContext().getRead() != null && transition.getContext().getRead().equals("data")) { return transition.getContext().getContext().contains("france"); } return true;}, "") - ), - transitionPOS( - transitionOR( - transitionMODAL(nodeNF(nodeExpression(node -> node.getID().equals(URI.create("place://end")), ""))), - transitionAF(arcExpression(transition -> transition.getContext().getErase() != null && transition.getContext().getErase().equals("data"), ""))) - )), - transitionAND( - transitionAF(arcExpression(transition -> - {if(transition.getContext().getRead() != null && transition.getContext().getRead().equals("data")) { - return transition.getContext().getContext().contains("france"); - } return true;}, "")), - transitionPOS( - transitionOR( - transitionMODAL(nodeNF(nodeExpression(node -> node.getID().equals(URI.create("place://end")), ""))), - transitionAF(arcExpression(transition -> transition.getContext().getErase() != null && transition.getContext().getErase().equals("data"), ""))) - ) - ) - ) - ) - ); + var endReachable = nodePOS(nodeNF(nodeExpression(x -> x.getSourceArcs().isEmpty(), ""))); + log.info("Evaluating Formula: " + endReachable.writeFormula()); + log.info("Result: " + CTLEvaluator.evaluate(endReachable, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("place://start"))).findAny().get(), allPaths)); + var formulaFrance = transitionNOT(transitionFORALL_UNTIL(transitionAF(arcExpression(x -> x.getContext().getRead() == null || x.getContext().getRead().equals("data") && x.getContext().getContext().contains("france"), "")), transitionAF(arcExpression(x -> x.getSourceArcs().isEmpty() || x.getContext().getWrite() != null && x.getContext().getWrite().equals("data") || x.getContext().getErase() != null && x.getContext().getErase().equals("data") , "")))); log.info("Formula France: " + formulaFrance.writeFormula()); - log.info("Result: " + CTLEvaluator.evaluate(formulaFrance, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("place://start"))).findAny().get(), allPaths)); - */ + log.info("Result: " + CTLEvaluator.evaluate(formulaFrance, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("trans://getData"))).findAny().get(), allPaths)); + var formulaDataUsage = nodeMODAL(transitionPOS(transitionAF(arcExpression(x -> x.getContext().getRead() != null && x.getContext().getRead().equals("data"), "")))); + log.info("Formula Data: " + formulaDataUsage.writeFormula()); + log.info("Result: " + CTLEvaluator.evaluate(formulaDataUsage, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("place://start"))).findAny().get(), allPaths)); } /** From 3d094bf48d6327953fb530a539543610874fc5b6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 May 2021 06:53:04 +0000 Subject: [PATCH 138/157] build(deps-dev): bump spring-security-test from 5.4.6 to 5.5.0 Bumps [spring-security-test](https://github.com/spring-projects/spring-security) from 5.4.6 to 5.5.0. - [Release notes](https://github.com/spring-projects/spring-security/releases) - [Changelog](https://github.com/spring-projects/spring-security/blob/main/RELEASE.adoc) - [Commits](https://github.com/spring-projects/spring-security/compare/5.4.6...5.5.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 05c31a9d..cf418cbb 100644 --- a/pom.xml +++ b/pom.xml @@ -149,7 +149,7 @@ org.springframework.security spring-security-test - 5.4.6 + 5.5.0 test From bfb8c3b19637caa5ddb3aaa06c4128b400aac946 Mon Sep 17 00:00:00 2001 From: eakker Date: Tue, 18 May 2021 10:18:10 +0200 Subject: [PATCH 139/157] chore: add formula to check if data is read more than once --- .../transition/TransitionFORALL_UNTIL.java | 17 ++++++++++--- .../builder/InfomodelPetriNetBuilderTest.java | 24 +++++++++++++++++-- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java index 2733d080..752c72f9 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/transition/TransitionFORALL_UNTIL.java @@ -6,6 +6,7 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import java.util.ArrayList; import java.util.List; @AllArgsConstructor @@ -40,9 +41,13 @@ public boolean evaluate(final Node node, final List> paths) { var res1 = parameter1.evaluate(path.get(i), paths); var res2 = parameter2.evaluate(path.get(i), paths); if(res2) continue check; - if(!res1) return false; + if(!res1){ + log.info(path.get(i).toString()); + return false; + } } if (!parameter2.evaluate(path.get(path.size() - offset), paths)) { + log.info(path.get(path.size() - offset).toString()); return false; } }else{ @@ -52,10 +57,16 @@ public boolean evaluate(final Node node, final List> paths) { var res1 = parameter1.evaluate(path.get(i), paths); var res2 = parameter2.evaluate(path.get(i), paths); if(res2) continue check; - if(!res1) return false; + if(!res1){ + log.info(path.get(i).toString()); + return false; + } } //if everything on circle fulfills param1 but not param2: complicated case - log.info("test"); + var lastTransition = path.get(path.size()-1) instanceof Transition ? path.get(path.size()-1) : path.get(path.size()-2); + var newPaths = new ArrayList<>(paths); + newPaths.remove(path); + if(!this.evaluate(lastTransition, newPaths)) return false; } } return true; diff --git a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java index 11012515..e2c39aab 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java @@ -42,6 +42,7 @@ import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.ArcExpression.arcExpression; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionAF.transitionAF; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionAND.transitionAND; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionEV.transitionEV; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionEXIST_UNTIL.transitionEXIST_UNTIL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFORALL_UNTIL.transitionFORALL_UNTIL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionMODAL.transitionMODAL; @@ -157,7 +158,7 @@ void testExamplePetriNet(){ var extract = new TransitionImpl(URI.create("trans://extractSample")); extract.setContextObject(new ContextObject(List.of("france"), "data", "sample", "data")); var calcMean = new TransitionImpl(URI.create("trans://calcMean")); - calcMean.setContextObject(new ContextObject(List.of(""), "data", "mean", "data")); + calcMean.setContextObject(new ContextObject(List.of("france"), "data", "mean", "data")); var calcMed = new TransitionImpl(URI.create("trans://calcMedian")); calcMed.setContextObject(new ContextObject(List.of("france"), "data", "median", "data")); var calcRules = new TransitionImpl(URI.create("trans://calcAPrioriRules")); @@ -240,12 +241,31 @@ void testExamplePetriNet(){ var endReachable = nodePOS(nodeNF(nodeExpression(x -> x.getSourceArcs().isEmpty(), ""))); log.info("Evaluating Formula: " + endReachable.writeFormula()); log.info("Result: " + CTLEvaluator.evaluate(endReachable, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("place://start"))).findAny().get(), allPaths)); - var formulaFrance = transitionNOT(transitionFORALL_UNTIL(transitionAF(arcExpression(x -> x.getContext().getRead() == null || x.getContext().getRead().equals("data") && x.getContext().getContext().contains("france"), "")), transitionAF(arcExpression(x -> x.getSourceArcs().isEmpty() || x.getContext().getWrite() != null && x.getContext().getWrite().equals("data") || x.getContext().getErase() != null && x.getContext().getErase().equals("data") , "")))); + var formulaFrance = transitionPOS(transitionAND(transitionAF(arcExpression(x -> x.getContext().getRead() != null && x.getContext().getRead().equals("data") && !x.getContext().getContext().contains("france"), "")), transitionEV(transitionOR(transitionAF(arcExpression(x -> x.getContext().getWrite() != null && x.getContext().getWrite().equals("data") || x.getContext().getErase() != null && x.getContext().getErase().equals("data"), "")), transitionMODAL(nodeNF(nodeExpression(x -> x.getSourceArcs().isEmpty(), " "))))))); log.info("Formula France: " + formulaFrance.writeFormula()); log.info("Result: " + CTLEvaluator.evaluate(formulaFrance, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("trans://getData"))).findAny().get(), allPaths)); var formulaDataUsage = nodeMODAL(transitionPOS(transitionAF(arcExpression(x -> x.getContext().getRead() != null && x.getContext().getRead().equals("data"), "")))); log.info("Formula Data: " + formulaDataUsage.writeFormula()); log.info("Result: " + CTLEvaluator.evaluate(formulaDataUsage, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("place://start"))).findAny().get(), allPaths)); + var formulaUseAndDelete = transitionPOS( + transitionAND( + transitionAF(arcExpression(x -> x.getContext().getRead() != null && x.getContext().getRead().equals("data"), "")), + transitionPOS( + transitionAND( + transitionAF(arcExpression(x -> x.getContext().getRead() != null || x.getContext().getRead().equals("data"), "")), + transitionEV( + transitionOR( + transitionAF(arcExpression(x -> x.getContext().getWrite() != null && x.getContext().getWrite().equals("data") || x.getContext().getErase() != null && x.getContext().getErase().equals("data"), "")), + transitionMODAL(nodeNF(nodeExpression(x -> x.getSourceArcs().isEmpty(), " "))) + ) + ) + ) + + ) + ) + ); + log.info("Formula Use And Delete: " + formulaUseAndDelete.writeFormula()); + log.info("Result: " + CTLEvaluator.evaluate(formulaUseAndDelete, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("trans://getData"))).findAny().get(), allPaths)); } /** From a0f52b0ca3686a48425d789b1bcde976002af354 Mon Sep 17 00:00:00 2001 From: eakker Date: Tue, 18 May 2021 12:57:51 +0200 Subject: [PATCH 140/157] chore: add FORALL evaluation to NodeFORALL_UNTIL, add comments to test formulas --- .../evaluation/formula/state/NodeFORALL_UNTIL.java | 7 ++++++- .../petrinet/builder/InfomodelPetriNetBuilderTest.java | 5 ++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java index 2bcb01b9..206bfcc6 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java @@ -2,10 +2,12 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import de.fraunhofer.isst.configmanager.petrinet.model.Place; +import de.fraunhofer.isst.configmanager.petrinet.model.Transition; import de.fraunhofer.isst.configmanager.petrinet.simulator.PetriNetSimulator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import java.util.ArrayList; import java.util.List; @AllArgsConstructor @@ -55,7 +57,10 @@ public boolean evaluate(final Node node, final List> paths) { if(!res1) return false; } //if everything on circle fulfills param1 but not param2: complicated case - log.info("test"); + var lastPlace = path.get(path.size()-1) instanceof Place ? path.get(path.size()-1) : path.get(path.size()-2); + var newPaths = new ArrayList<>(paths); + newPaths.remove(path); + if(!this.evaluate(lastPlace, newPaths)) return false; } } return true; diff --git a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java index e2c39aab..27bea4b8 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java @@ -237,16 +237,19 @@ void testExamplePetriNet(){ var allPaths = PetriNetSimulator.getAllPaths(graph); log.info(PetriNetSimulator.circleFree(allPaths.get(0))+ " "); log.info(String.format("Found %d valid Paths!", allPaths.size())); - //create formula and evaluate on start node (exists path from start to end) + //an end node is reachable var endReachable = nodePOS(nodeNF(nodeExpression(x -> x.getSourceArcs().isEmpty(), ""))); log.info("Evaluating Formula: " + endReachable.writeFormula()); log.info("Result: " + CTLEvaluator.evaluate(endReachable, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("place://start"))).findAny().get(), allPaths)); + //a transition is reachable, which reads data without 'france' in context, after that transition data is overwritten or erased (or an end is reached) var formulaFrance = transitionPOS(transitionAND(transitionAF(arcExpression(x -> x.getContext().getRead() != null && x.getContext().getRead().equals("data") && !x.getContext().getContext().contains("france"), "")), transitionEV(transitionOR(transitionAF(arcExpression(x -> x.getContext().getWrite() != null && x.getContext().getWrite().equals("data") || x.getContext().getErase() != null && x.getContext().getErase().equals("data"), "")), transitionMODAL(nodeNF(nodeExpression(x -> x.getSourceArcs().isEmpty(), " "))))))); log.info("Formula France: " + formulaFrance.writeFormula()); log.info("Result: " + CTLEvaluator.evaluate(formulaFrance, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("trans://getData"))).findAny().get(), allPaths)); + //a transition is reachable, which reads data var formulaDataUsage = nodeMODAL(transitionPOS(transitionAF(arcExpression(x -> x.getContext().getRead() != null && x.getContext().getRead().equals("data"), "")))); log.info("Formula Data: " + formulaDataUsage.writeFormula()); log.info("Result: " + CTLEvaluator.evaluate(formulaDataUsage, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("place://start"))).findAny().get(), allPaths)); + //a transition is reachable, which is reading data. From there another transition is reachable, which also reads data, from this the end or a transition which overwrites or erases data is reachable. var formulaUseAndDelete = transitionPOS( transitionAND( transitionAF(arcExpression(x -> x.getContext().getRead() != null && x.getContext().getRead().equals("data"), "")), From cef7e0165e5edc28e967973ab2a071f539a7997b Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Wed, 19 May 2021 09:26:13 +0200 Subject: [PATCH 141/157] docs: update changelog --- CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9a4df89..dc1d8005 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,7 @@ All notable changes to this project will be documented in this file. -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres -to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [7.0.0] - UNRELEASED ### Major Changes From a55e8e74f71017906904a332166d4022065ee8b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Wed, 19 May 2021 12:03:50 +0200 Subject: [PATCH 142/157] fixed bug regarding updating backend connections --- .../api/service/EndpointService.java | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java index 663c8089..ebaadbea 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java @@ -142,14 +142,15 @@ public boolean updateGenericEndpoint(final URI id, var updated = false; final var genericEndpointold = getGenericEndpoint(id); - final var genericEndpointNew = getGenericEndpoint(id); - - + final var genericEndpointNew = new GenericEndpointBuilder(genericEndpointold.getId()) + ._accessURL_(genericEndpointold.getAccessURL()) + ._genericEndpointAuthentication_(genericEndpointold.getGenericEndpointAuthentication()) + .build(); if (genericEndpointNew != null) { final var genericEndpointNewImpl = (GenericEndpointImpl) genericEndpointNew; - if(sourceType != null){ + if (sourceType != null) { genericEndpointNewImpl.setProperty("ids:sourceType", sourceType); } @@ -177,14 +178,17 @@ public boolean updateGenericEndpoint(final URI id, } } - final var index = this.getGenericEndpoints().indexOf(genericEndpointold); + final var customGenericEndpoints = + customGenericEndpointList.getCustomGenericEndpointObjects(); - if (index != -1) { - this.getGenericEndpoints().set(index, genericEndpointNew); - customGenericEndpointList = customGenericEndpointRepository.saveAndFlush(customGenericEndpointList); - updated = true; - } + for (int i = 0; i < customGenericEndpoints.size(); i++) { + if (id.equals(customGenericEndpoints.get(i).getEndpoint().getId())) { + customGenericEndpoints.set(i, new CustomGenericEndpointObject(genericEndpointNew)); + customGenericEndpointList = customGenericEndpointRepository.saveAndFlush(customGenericEndpointList); + updated = true; + } + } return updated; } } From 15c934dc37f9e496856fd53a87be07630e8240c5 Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Wed, 19 May 2021 14:56:04 +0200 Subject: [PATCH 143/157] docs: update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc1d8005..314a546b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,7 +50,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - Add: org.apache.logging.log4j:log4j-web 2.14.1 (Apache 2.0) - Add: org.postgresql:postgresql 42.2.20 (BSD-2-Clause) - Upgrade: org.springframework.boot:spring-boot-starter-parent 2.4.2 -> 2.4.5 -- Upgrade: org.springframework.security:spring-security-test 5.4.2 -> 5.4.6 +- Upgrade: org.springframework.security:spring-security-test 5.4.2 -> 5.5.0 - Upgrade: org.projectlombok:lombok 1.18.18 -> 1.18.20 - Upgrade: junit:junit 4.13.1 -> 4.13.2 - Upgrade: org.springdoc:springdoc-openapi-ui 1.5.7 -> 1.5.8 From a35a86e12ee7cf63bd770f6ef8757e339380f6bb Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Wed, 19 May 2021 15:38:18 +0200 Subject: [PATCH 144/157] refactor: small code adjustments --- .../isst/configmanager/api/EndpointApi.java | 3 ++- .../api/controller/EndpointController.java | 2 +- .../api/service/EndpointService.java | 22 +++++++++---------- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java index 98e5c503..a14af829 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java @@ -46,5 +46,6 @@ ResponseEntity updateGenericEndpoint(@RequestParam(value = "id") URI id, @PostMapping(value = "/connector/endpoint", produces = "application/ld+json") @Operation(summary = "Creates a new connector endpoint for the connector") @ApiResponse(responseCode = "200", description = "Successfully created the connector endpoint for the connector") - ResponseEntity createConnectorEndpoint(@RequestParam("accessUrl") URI accessUrl, @RequestParam(value = "sourceType", required = false) String sourceType); + ResponseEntity createConnectorEndpoint(@RequestParam("accessUrl") URI accessUrl, + @RequestParam(value = "sourceType", required = false) String sourceType); } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java index 51943ec3..33577cc0 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/EndpointController.java @@ -174,7 +174,7 @@ public ResponseEntity createConnectorEndpoint(final URI accessUrl, final if (log.isInfoEnabled()) { log.info(">> POST /connector/endpoint accessUrl: " + accessUrl + " sourceType: " + sourceType); } - + final var configModelImpl = (ConfigurationModelImpl) configModelService.getConfigModel(); final var baseConnector = (BaseConnectorImpl) configModelImpl.getConnectorDescription(); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java index ebaadbea..411c871c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java @@ -39,9 +39,10 @@ public EndpointService(final CustomGenericEndpointRepository customGenericEndpoi /** * This method creates a generic endpoint with the given parameters. * - * @param accessURL access url of the endpoint - * @param username username for the authentication - * @param password password for the authentication + * @param accessURL access url of the endpoint + * @param sourceType the source type of the representation + * @param username username for the authentication + * @param password password for the authentication * @return generic endpoint */ public GenericEndpoint createGenericEndpoint(final URI accessURL, @@ -128,10 +129,11 @@ public boolean deleteGenericEndpoint(final URI id) { /** * This method updates a generic endpoint with the given parameters. * - * @param id id of the generic endpoint - * @param accessURL access url of the endpoint - * @param username username for the authentication - * @param password password for the authentication + * @param id id of the generic endpoint + * @param accessURL access url of the endpoint + * @param sourceType the source type of the representation + * @param username username for the authentication + * @param password password for the authentication * @return true, if generic endpoint is updated */ public boolean updateGenericEndpoint(final URI id, @@ -178,15 +180,13 @@ public boolean updateGenericEndpoint(final URI id, } } - final var customGenericEndpoints = - customGenericEndpointList.getCustomGenericEndpointObjects(); + final var customGenericEndpoints = customGenericEndpointList.getCustomGenericEndpointObjects(); - for (int i = 0; i < customGenericEndpoints.size(); i++) { + for (var i = 0; i < customGenericEndpoints.size(); i++) { if (id.equals(customGenericEndpoints.get(i).getEndpoint().getId())) { customGenericEndpoints.set(i, new CustomGenericEndpointObject(genericEndpointNew)); customGenericEndpointList = customGenericEndpointRepository.saveAndFlush(customGenericEndpointList); updated = true; - } } return updated; From 13a4692c033603a5648d9651b66dac8ae981615f Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Wed, 19 May 2021 15:54:06 +0200 Subject: [PATCH 145/157] docs: update changelog for source-type --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 314a546b..4f096edd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ### Major Changes - Remove 20 unused APIs (= 1.150 lines of code) (unused by ConfigManager-UI project) - For the APIs of the enums, in addition to the technical name, such as DE for the language-dropdown, the written labels are now also supplied, e.g. German <-> DE. The structure of the API returns has changed accordingly +- Specification of a source-type of a backend-connection for API POST/PUT /generic/endpoint new and mandatory, removed parameter for API POST/PUT /resource/representation ### Major Change: Infomodel Maintenance - Major Change: Upgraded infomodel-java-artifacts 4.0.2 -> 4.0.6 From fffac1d2af7b9db7cf4f1f03b8fc5bece57db004 Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Wed, 19 May 2021 16:59:20 +0200 Subject: [PATCH 146/157] feat: set connector connection attemps in app.props --- .../api/service/ConfigModelService.java | 12 ++++++++---- src/main/resources/application.properties | 1 + src/test/resources/application.properties | 3 +-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java index e88ce6c9..ac4eed6c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java @@ -21,6 +21,7 @@ import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -40,18 +41,21 @@ public class ConfigModelService { final transient ConfigModelRepository configModelRepository; + + @Getter ConfigModelObject configModelObject; @Autowired public ConfigModelService(final ConfigModelRepository configModelRepository, - final DefaultConnectorClient client) { + final DefaultConnectorClient client, + final @Value("${dataspace.connector.connectionattemps}") Integer connectionAttemps) { this.configModelRepository = configModelRepository; if (log.isInfoEnabled()) { log.info("---- [ConfigModelService] ConfigManager StartUp! Trying to get current Configuration from Connector!"); } try { - getConnectorConfig(client); + getConnectorConfig(client, connectionAttemps); if (log.isInfoEnabled()) { log.info("---- [ConfigModelService] Received configuration from running Connector!"); @@ -80,9 +84,9 @@ public ConfigModelService(final ConfigModelRepository configModelRepository, } } - private void getConnectorConfig(final DefaultConnectorClient client) throws InterruptedException { + private void getConnectorConfig(final DefaultConnectorClient client, + final Integer connectionAttemps) throws InterruptedException { ConfigurationModel connectorConfiguration = null; - final var connectionAttemps = 10; for (var i = 1; i <= connectionAttemps; i++) { try { diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 2007fb49..34180f33 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -34,6 +34,7 @@ dataspace.connector.host=localhost dataspace.connector.port=8080 dataspace.connector.api.username=admin dataspace.connector.api.password=password +dataspace.connector.connectionattemps=10 dataspace.communication.ssl=true # Miscellaneous Settings diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index 67cfd0d0..591b8475 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -24,6 +24,5 @@ dataspace.connector.host=localhost dataspace.connector.port=8080 dataspace.connector.api.username=admin dataspace.connector.api.password=password - -# connector to dataspace connector +dataspace.connector.connectionattemps=2 dataspace.communication.ssl=true From 6e7679bbb18b556ba42ffcf6f730f860ffc50cc4 Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Wed, 19 May 2021 17:03:00 +0200 Subject: [PATCH 147/157] docs: update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f096edd..3c4984ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,7 +27,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - Minor Change: New API GET /api/ui/connector/status to return the accessibility-status of the Public-Connector-Endpoint - Minor Change: New API PUT /resource/contract/update to create the contract in the configmanager and update it at the dataspace connector - Minor Change: New setting option to address the DSC via HTTP or HTTPS. dataspace.communication.ssl=true/false in application.properties and DATASPACE_COMMUNICATION_SSL=true/false in docker-compose environment. -- Minor Change: The CM now tries to reach the connector max 10 times during startup, with a pause of 5 seconds each time, instead of just try once. +- Minor Change: The CM now tries to reach the connector several times during startup, with a pause of 5 seconds each time, instead of just try once. The number of tries can be set individually via application.properties or docker-compose e.g. dataspace.connector.connectionattemps=5. ### Changes - Patch Change: Code and Architecture refactoring From 6b8f80f15142cdac9e7067ace0fba0df7dfe51b0 Mon Sep 17 00:00:00 2001 From: eakker Date: Thu, 20 May 2021 13:19:51 +0200 Subject: [PATCH 148/157] feat: add evaluation for parallel executions in petrinets --- .../petrinet/model/InnerPlace.java | 41 ++++ .../petrinet/simulator/ParallelEvaluator.java | 18 ++ .../petrinet/simulator/PetriNetSimulator.java | 54 +++++- .../builder/InfomodelPetriNetBuilderTest.java | 177 ++++++++++-------- 4 files changed, 200 insertions(+), 90 deletions(-) create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/InnerPlace.java create mode 100644 src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/ParallelEvaluator.java diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/InnerPlace.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/InnerPlace.java new file mode 100644 index 00000000..5bc3a120 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/InnerPlace.java @@ -0,0 +1,41 @@ +package de.fraunhofer.isst.configmanager.petrinet.model; + +import lombok.Getter; +import lombok.Setter; + +import java.net.URI; +import java.util.Objects; + +@Getter +@Setter +public class InnerPlace extends PlaceImpl{ + + private Transition originalTrans; + + public InnerPlace(URI id, Transition originalTrans) { + super(id); + this.originalTrans = originalTrans; + } + + @Override + public Node deepCopy() { + final var copy = new InnerPlace(this.getID(), this.originalTrans); + copy.setMarkers(this.getMarkers()); + return copy; + } + + @Override + public boolean equals(final Object o) { + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } + + final var place = (InnerPlace) o; + + return originalTrans.equals(place.originalTrans) && getMarkers() == place.getMarkers() && Objects.equals(getID(), place.getID()); + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/ParallelEvaluator.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/ParallelEvaluator.java new file mode 100644 index 00000000..4a9b5b57 --- /dev/null +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/ParallelEvaluator.java @@ -0,0 +1,18 @@ +package de.fraunhofer.isst.configmanager.petrinet.simulator; + +import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.ArcExpression; +import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.ArcSubExpression; +import de.fraunhofer.isst.configmanager.petrinet.model.Node; +import de.fraunhofer.isst.configmanager.petrinet.model.Transition; + +import java.util.List; + +public class ParallelEvaluator { + + public static boolean nParallelTransitionsWithCondition(ArcSubExpression condition, int n, List> parallelSets){ + for(var set: parallelSets){ + if(set.size() >= n && set.stream().filter(condition::evaluate).count() >= n) return true; + } + return false; + } +} diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java index 2537d924..a3681002 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java @@ -1,16 +1,11 @@ package de.fraunhofer.isst.configmanager.petrinet.simulator; import de.fraunhofer.isst.configmanager.petrinet.builder.GraphVizGenerator; -import de.fraunhofer.isst.configmanager.petrinet.model.Arc; -import de.fraunhofer.isst.configmanager.petrinet.model.Node; -import de.fraunhofer.isst.configmanager.petrinet.model.PetriNet; -import de.fraunhofer.isst.configmanager.petrinet.model.Place; -import de.fraunhofer.isst.configmanager.petrinet.model.PlaceImpl; -import de.fraunhofer.isst.configmanager.petrinet.model.Transition; -import de.fraunhofer.isst.configmanager.petrinet.model.TransitionImpl; +import de.fraunhofer.isst.configmanager.petrinet.model.*; import lombok.experimental.UtilityClass; import lombok.extern.slf4j.Slf4j; +import java.net.URI; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -153,7 +148,6 @@ private static void addStepToStepGraph(final PetriNet parent, final Node transition, final StepGraph stepGraph){ Node transitionCopy = null; - for (final var node : copy.getNodes()) { if (node.getID().equals(transition.getID())) { transitionCopy = node; @@ -341,6 +335,50 @@ private static List> calcPathsOfLengthNplus1(final List trans instanceof Transition).collect(Collectors.toList()); + for(var transition : transitions){ + unfolded.getNodes().remove(transition); + var transpart1 = new TransitionImpl(URI.create(String.format("%s_start", transition.getID().toString()))); + var transpart2 = new TransitionImpl(URI.create(String.format("%s_end", transition.getID().toString()))); + var transplace = new InnerPlace(URI.create(String.format("%s_place", transition.getID().toString())), (Transition) transition); + unfolded.getNodes().add(transpart1); + unfolded.getNodes().add(transpart2); + unfolded.getNodes().add(transplace); + var innerArc1 = new ArcImpl(transpart1, transplace); + var innerArc2 = new ArcImpl(transplace, transpart2); + unfolded.getArcs().add(innerArc1); + unfolded.getArcs().add(innerArc2); + var targetArcs = transition.getTargetArcs(); + var sourceArcs = transition.getSourceArcs(); + unfolded.getArcs().removeAll(targetArcs); + unfolded.getArcs().removeAll(sourceArcs); + for(var arc : targetArcs){ + var newArc = new ArcImpl(arc.getSource(), transpart1); + unfolded.getArcs().add(newArc); + } + for(var arc : sourceArcs){ + var newArc = new ArcImpl(transpart2, arc.getTarget()); + unfolded.getArcs().add(newArc); + } + } + return unfolded; + } + + public static List> getParallelSets(StepGraph stepGraph){ + List> parallelSets = new ArrayList<>(); + for(var step : stepGraph.getSteps()){ + var parallelTrans = step.getNodes().stream().filter(node -> node instanceof InnerPlace) + .filter(place -> ((InnerPlace) place).getMarkers() > 0) + .map(place -> ((InnerPlace) place).getOriginalTrans()) + .distinct() + .collect(Collectors.toList()); + if(parallelTrans.size() >= 2) parallelSets.add(parallelTrans); + } + return parallelSets; + } + private static List> filterPaths(final List> paths) { final List> filtered = new ArrayList<>(List.copyOf(paths)); diff --git a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java index 27bea4b8..1f875675 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java @@ -7,14 +7,8 @@ import de.fraunhofer.iais.eis.RouteStepBuilder; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.CTLEvaluator; -import de.fraunhofer.isst.configmanager.petrinet.model.Arc; -import de.fraunhofer.isst.configmanager.petrinet.model.ArcImpl; -import de.fraunhofer.isst.configmanager.petrinet.model.ContextObject; -import de.fraunhofer.isst.configmanager.petrinet.model.Node; -import de.fraunhofer.isst.configmanager.petrinet.model.PetriNetImpl; -import de.fraunhofer.isst.configmanager.petrinet.model.Place; -import de.fraunhofer.isst.configmanager.petrinet.model.PlaceImpl; -import de.fraunhofer.isst.configmanager.petrinet.model.TransitionImpl; +import de.fraunhofer.isst.configmanager.petrinet.model.*; +import de.fraunhofer.isst.configmanager.petrinet.simulator.ParallelEvaluator; import de.fraunhofer.isst.configmanager.petrinet.simulator.PetriNetSimulator; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Disabled; @@ -31,6 +25,7 @@ import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.FF.FF; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.TT.TT; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeAND.nodeAND; +import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeEV.nodeEV; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeEXIST_UNTIL.nodeEXIST_UNTIL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeExpression.nodeExpression; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeFORALL_NEXT.nodeFORALL_NEXT; @@ -126,6 +121,97 @@ void testBuildPetriNet() throws IOException { @Test @Disabled void testExamplePetriNet(){ + var petriNet = buildPaperNet(); + + if (log.isInfoEnabled()) { + log.info(GraphVizGenerator.generateGraphViz(petriNet)); + } + + //build stepGraph and visualize + var graph = PetriNetSimulator.buildStepGraph(petriNet); + + if (log.isInfoEnabled()) { + //log.info(GraphVizGenerator.generateGraphViz(graph)); + log.info(String.format("%d possible states!", graph.getSteps().size())); + } + + var allPaths = PetriNetSimulator.getAllPaths(graph); + log.info(String.format("Found %d valid Paths!", allPaths.size())); + //an end node is eventually reachable + var endReachable = nodeEV(nodeNF(nodeExpression(x -> x.getSourceArcs().isEmpty(), ""))); + log.info("Evaluating Formula: " + endReachable.writeFormula()); + //log.info("Result: " + CTLEvaluator.evaluate(endReachable, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("place://start"))).findAny().get(), allPaths)); + //a transition is reachable, which reads data without 'france' in context, after that transition data is overwritten or erased (or an end is reached) + var formulaFrance = transitionPOS(transitionAND(transitionAF(arcExpression(x -> x.getContext().getRead() != null && x.getContext().getRead().equals("data") && !x.getContext().getContext().contains("france"), "")), transitionEV(transitionOR(transitionAF(arcExpression(x -> x.getContext().getWrite() != null && x.getContext().getWrite().equals("data") || x.getContext().getErase() != null && x.getContext().getErase().equals("data"), "")), transitionMODAL(nodeNF(nodeExpression(x -> x.getSourceArcs().isEmpty(), " "))))))); + log.info("Formula France: " + formulaFrance.writeFormula()); + log.info("Result: " + CTLEvaluator.evaluate(formulaFrance, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("trans://getData"))).findAny().get(), allPaths)); + //a transition is reachable, which reads data + var formulaDataUsage = nodeMODAL(transitionPOS(transitionAF(arcExpression(x -> x.getContext().getRead() != null && x.getContext().getRead().equals("data"), "")))); + log.info("Formula Data: " + formulaDataUsage.writeFormula()); + log.info("Result: " + CTLEvaluator.evaluate(formulaDataUsage, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("place://start"))).findAny().get(), allPaths)); + //a transition is reachable, which is reading data. From there another transition is reachable, which also reads data, from this the end or a transition which overwrites or erases data is reachable. + var formulaUseAndDelete = transitionPOS( + transitionAND( + transitionAF(arcExpression(x -> x.getContext().getRead() != null && x.getContext().getRead().equals("data"), "")), + transitionPOS( + transitionAND( + transitionAF(arcExpression(x -> x.getContext().getRead() != null || x.getContext().getRead().equals("data"), "")), + transitionEV( + transitionOR( + transitionAF(arcExpression(x -> x.getContext().getWrite() != null && x.getContext().getWrite().equals("data") || x.getContext().getErase() != null && x.getContext().getErase().equals("data"), "")), + transitionMODAL(nodeNF(nodeExpression(x -> x.getSourceArcs().isEmpty(), " "))) + ) + ) + ) + + ) + ) + ); + log.info("Formula Use And Delete: " + formulaUseAndDelete.writeFormula()); + log.info("Result: " + CTLEvaluator.evaluate(formulaUseAndDelete, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("trans://getData"))).findAny().get(), allPaths)); + } + + @Test + @Disabled + void testUnfoldNet(){ + var petriNet = buildPaperNet(); + var unfolded = PetriNetSimulator.getUnfoldedPetriNet(petriNet); + log.info(GraphVizGenerator.generateGraphViz(unfolded)); + log.info(String.valueOf(unfolded.deepCopy().equals(unfolded))); + var unfoldedGraph = PetriNetSimulator.buildStepGraph(unfolded); + log.info(String.format("Step Graph has %d possible combinations!", unfoldedGraph.getSteps().size())); + log.info("Getting parallel sets..."); + var parallelSets = PetriNetSimulator.getParallelSets(unfoldedGraph); + log.info(String.format("Found %d possible parallel executions!", parallelSets.size())); + log.info(String.format("3 parallel reading Transitions: %s", ParallelEvaluator.nParallelTransitionsWithCondition(x -> x.getContext().getRead() != null && x.getContext().getRead().equals("data"), 3, parallelSets))); + } + + /** + * @param input A List + * @param Generic Type for given list + * @return a random sublist with a size between MINIMUM_STARTEND and MAXIMUM_STARTEND + */ + public static ArrayList randomSubList(List input) { + var newSize = ThreadLocalRandom.current().nextInt(MINIMUM_STARTEND,MAXIMUM_STARTEND); + var list = new ArrayList<>(input); + Collections.shuffle(list); + ArrayList newList = new ArrayList<>(); + for(int i = 0; i< newSize; i++){ + newList.add(list.get(i)); + } + return newList; + } + + @Test + @Disabled + void testFormula(){ + var formula = nodeAND(nodeMODAL(transitionNOT(FF())), nodeOR(nodeNF(nodeExpression(x -> true, "testMsg")),TT())); + if (log.isInfoEnabled()) { + log.info(formula.writeFormula()); + } + } + + private PetriNet buildPaperNet(){ var nodes = new HashSet(); //create nodes var start = new PlaceImpl(URI.create("place://start")); @@ -220,79 +306,6 @@ void testExamplePetriNet(){ arcs.add(new ArcImpl(stor4, endTrans)); arcs.add(new ArcImpl(endTrans, end)); //create petriNet and visualize - var petriNet = new PetriNetImpl(URI.create("https://petrinet"), nodes, arcs); - - if (log.isInfoEnabled()) { - log.info(GraphVizGenerator.generateGraphViz(petriNet)); - } - - //build stepGraph and visualize - var graph = PetriNetSimulator.buildStepGraph(petriNet); - - if (log.isInfoEnabled()) { - //log.info(GraphVizGenerator.generateGraphViz(graph)); - log.info(String.format("%d possible states!", graph.getSteps().size())); - } - - var allPaths = PetriNetSimulator.getAllPaths(graph); - log.info(PetriNetSimulator.circleFree(allPaths.get(0))+ " "); - log.info(String.format("Found %d valid Paths!", allPaths.size())); - //an end node is reachable - var endReachable = nodePOS(nodeNF(nodeExpression(x -> x.getSourceArcs().isEmpty(), ""))); - log.info("Evaluating Formula: " + endReachable.writeFormula()); - log.info("Result: " + CTLEvaluator.evaluate(endReachable, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("place://start"))).findAny().get(), allPaths)); - //a transition is reachable, which reads data without 'france' in context, after that transition data is overwritten or erased (or an end is reached) - var formulaFrance = transitionPOS(transitionAND(transitionAF(arcExpression(x -> x.getContext().getRead() != null && x.getContext().getRead().equals("data") && !x.getContext().getContext().contains("france"), "")), transitionEV(transitionOR(transitionAF(arcExpression(x -> x.getContext().getWrite() != null && x.getContext().getWrite().equals("data") || x.getContext().getErase() != null && x.getContext().getErase().equals("data"), "")), transitionMODAL(nodeNF(nodeExpression(x -> x.getSourceArcs().isEmpty(), " "))))))); - log.info("Formula France: " + formulaFrance.writeFormula()); - log.info("Result: " + CTLEvaluator.evaluate(formulaFrance, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("trans://getData"))).findAny().get(), allPaths)); - //a transition is reachable, which reads data - var formulaDataUsage = nodeMODAL(transitionPOS(transitionAF(arcExpression(x -> x.getContext().getRead() != null && x.getContext().getRead().equals("data"), "")))); - log.info("Formula Data: " + formulaDataUsage.writeFormula()); - log.info("Result: " + CTLEvaluator.evaluate(formulaDataUsage, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("place://start"))).findAny().get(), allPaths)); - //a transition is reachable, which is reading data. From there another transition is reachable, which also reads data, from this the end or a transition which overwrites or erases data is reachable. - var formulaUseAndDelete = transitionPOS( - transitionAND( - transitionAF(arcExpression(x -> x.getContext().getRead() != null && x.getContext().getRead().equals("data"), "")), - transitionPOS( - transitionAND( - transitionAF(arcExpression(x -> x.getContext().getRead() != null || x.getContext().getRead().equals("data"), "")), - transitionEV( - transitionOR( - transitionAF(arcExpression(x -> x.getContext().getWrite() != null && x.getContext().getWrite().equals("data") || x.getContext().getErase() != null && x.getContext().getErase().equals("data"), "")), - transitionMODAL(nodeNF(nodeExpression(x -> x.getSourceArcs().isEmpty(), " "))) - ) - ) - ) - - ) - ) - ); - log.info("Formula Use And Delete: " + formulaUseAndDelete.writeFormula()); - log.info("Result: " + CTLEvaluator.evaluate(formulaUseAndDelete, graph.getInitial().getNodes().stream().filter(node -> node.getID().equals(URI.create("trans://getData"))).findAny().get(), allPaths)); - } - - /** - * @param input A List - * @param Generic Type for given list - * @return a random sublist with a size between MINIMUM_STARTEND and MAXIMUM_STARTEND - */ - public static ArrayList randomSubList(List input) { - var newSize = ThreadLocalRandom.current().nextInt(MINIMUM_STARTEND,MAXIMUM_STARTEND); - var list = new ArrayList<>(input); - Collections.shuffle(list); - ArrayList newList = new ArrayList<>(); - for(int i = 0; i< newSize; i++){ - newList.add(list.get(i)); - } - return newList; - } - - @Test - @Disabled - void testFormula(){ - var formula = nodeAND(nodeMODAL(transitionNOT(FF())), nodeOR(nodeNF(nodeExpression(x -> true, "testMsg")),TT())); - if (log.isInfoEnabled()) { - log.info(formula.writeFormula()); - } + return new PetriNetImpl(URI.create("https://petrinet"), nodes, arcs); } } From 0854cfffc7723bdc0b7f3586c8ed47427aab8017 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 May 2021 06:54:34 +0000 Subject: [PATCH 149/157] build(deps): bump spring-boot-starter-parent from 2.4.5 to 2.5.0 Bumps [spring-boot-starter-parent](https://github.com/spring-projects/spring-boot) from 2.4.5 to 2.5.0. - [Release notes](https://github.com/spring-projects/spring-boot/releases) - [Commits](https://github.com/spring-projects/spring-boot/compare/v2.4.5...v2.5.0) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cf418cbb..189c0af6 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ org.springframework.boot spring-boot-starter-parent - 2.4.5 + 2.5.0 From 4ae0496f942f85cd0483cd02a07f829465ced887 Mon Sep 17 00:00:00 2001 From: eakker Date: Fri, 21 May 2021 11:25:05 +0200 Subject: [PATCH 150/157] feat: add Enum to mark Transitions as APP or CONTROL, optimize building of StepGraph --- .../isst/configmanager/api/AppRouteApi.java | 6 +--- .../isst/configmanager/api/BrokerApi.java | 6 +--- .../isst/configmanager/api/EndpointApi.java | 6 +--- .../isst/configmanager/api/ResourceApi.java | 6 +--- .../api/controller/AppRouteController.java | 2 +- .../ResourceRepresentationController.java | 7 +---- .../api/service/AppRouteService.java | 15 ++-------- .../configmanager/api/service/AppService.java | 2 +- .../api/service/BrokerService.java | 2 +- .../api/service/ConfigModelService.java | 13 +-------- .../api/service/ConnectorService.java | 6 +--- .../api/service/EndpointService.java | 8 ++--- .../resources/ResourceContractBuilder.java | 11 +------ .../ResourceRepresentationService.java | 2 +- .../service/resources/ResourceService.java | 6 +--- .../util/ResourceMapper.java | 6 +--- .../data/entities/ConfigModelObject.java | 7 +---- .../data/entities/CustomApp.java | 7 +---- .../data/entities/CustomBroker.java | 6 +--- .../entities/CustomGenericEndpointList.java | 9 +----- .../data/util/BackendConfig.java | 7 +---- .../builder/InfomodelPetriNetBuilder.java | 10 +------ .../formula/state/NodeFORALL_UNTIL.java | 1 - .../petrinet/model/ContextObject.java | 8 ++++- .../petrinet/model/PetriNetImpl.java | 26 +++++++++-------- .../petrinet/simulator/ParallelEvaluator.java | 13 ++++++--- .../petrinet/simulator/PetriNetSimulator.java | 2 +- .../isst/configmanager/util/Utility.java | 6 +--- .../builder/InfomodelPetriNetBuilderTest.java | 29 +++++++++---------- 29 files changed, 70 insertions(+), 165 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java index 68b1f952..6ad1f47c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java @@ -4,11 +4,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java index db713611..4c80fc1f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java @@ -3,11 +3,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java index a14af829..a7fee3a7 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/EndpointApi.java @@ -3,11 +3,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java index 2a2b1e03..0ef8e728 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java @@ -3,11 +3,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import java.net.URI; import java.util.ArrayList; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java index 3847fb11..cb45b75b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/AppRouteController.java @@ -9,8 +9,8 @@ import de.fraunhofer.isst.configmanager.api.AppRouteApi; import de.fraunhofer.isst.configmanager.api.service.AppRouteService; import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; -import de.fraunhofer.isst.configmanager.data.repositories.RouteDeployMethodRepository; import de.fraunhofer.isst.configmanager.data.enums.RouteDeployMethod; +import de.fraunhofer.isst.configmanager.data.repositories.RouteDeployMethodRepository; import de.fraunhofer.isst.configmanager.util.Utility; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AccessLevel; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java index 45920608..3d7ef69d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java @@ -1,12 +1,7 @@ package de.fraunhofer.isst.configmanager.api.controller; -import de.fraunhofer.iais.eis.ArtifactBuilder; -import de.fraunhofer.iais.eis.IANAMediaTypeBuilder; -import de.fraunhofer.iais.eis.Language; -import de.fraunhofer.iais.eis.RepresentationBuilder; -import de.fraunhofer.iais.eis.RepresentationImpl; -import de.fraunhofer.iais.eis.ResourceImpl; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.api.ResourceRepresentationApi; import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java index cbdfa4e4..ee0697cc 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java @@ -1,22 +1,13 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.AppRoute; -import de.fraunhofer.iais.eis.AppRouteBuilder; -import de.fraunhofer.iais.eis.AppRouteImpl; -import de.fraunhofer.iais.eis.BaseConnectorImpl; -import de.fraunhofer.iais.eis.ConfigurationModelImpl; -import de.fraunhofer.iais.eis.ConnectorEndpointBuilder; -import de.fraunhofer.iais.eis.Endpoint; -import de.fraunhofer.iais.eis.ResourceImpl; -import de.fraunhofer.iais.eis.RouteStep; -import de.fraunhofer.iais.eis.RouteStepBuilder; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.api.service.resources.ResourceService; +import de.fraunhofer.isst.configmanager.data.entities.CustomApp; +import de.fraunhofer.isst.configmanager.data.entities.EndpointInformation; import de.fraunhofer.isst.configmanager.data.repositories.CustomAppRepository; import de.fraunhofer.isst.configmanager.data.repositories.EndpointInformationRepository; import de.fraunhofer.isst.configmanager.data.repositories.RouteDeployMethodRepository; -import de.fraunhofer.isst.configmanager.data.entities.CustomApp; -import de.fraunhofer.isst.configmanager.data.entities.EndpointInformation; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java index 9169d78c..39f99d03 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppService.java @@ -2,9 +2,9 @@ import de.fraunhofer.iais.eis.AppEndpointType; import de.fraunhofer.iais.eis.Language; -import de.fraunhofer.isst.configmanager.data.repositories.CustomAppRepository; import de.fraunhofer.isst.configmanager.data.entities.CustomApp; import de.fraunhofer.isst.configmanager.data.entities.CustomAppEndpoint; +import de.fraunhofer.isst.configmanager.data.repositories.CustomAppRepository; import de.fraunhofer.isst.configmanager.util.Utility; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java index 94194ead..4b6f8b6c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/BrokerService.java @@ -2,8 +2,8 @@ import de.fraunhofer.iais.eis.Resource; import de.fraunhofer.isst.configmanager.api.service.resources.ResourceService; -import de.fraunhofer.isst.configmanager.data.enums.BrokerRegistrationStatus; import de.fraunhofer.isst.configmanager.data.entities.CustomBroker; +import de.fraunhofer.isst.configmanager.data.enums.BrokerRegistrationStatus; import de.fraunhofer.isst.configmanager.data.repositories.CustomBrokerRepository; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java index ac4eed6c..264c5ad9 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java @@ -1,17 +1,6 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.BaseConnectorBuilder; -import de.fraunhofer.iais.eis.BasicAuthenticationBuilder; -import de.fraunhofer.iais.eis.ConfigurationModel; -import de.fraunhofer.iais.eis.ConfigurationModelBuilder; -import de.fraunhofer.iais.eis.ConfigurationModelImpl; -import de.fraunhofer.iais.eis.ConnectorDeployMode; -import de.fraunhofer.iais.eis.ConnectorEndpointBuilder; -import de.fraunhofer.iais.eis.ConnectorStatus; -import de.fraunhofer.iais.eis.LogLevel; -import de.fraunhofer.iais.eis.ProxyBuilder; -import de.fraunhofer.iais.eis.ProxyImpl; -import de.fraunhofer.iais.eis.SecurityProfile; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; import de.fraunhofer.isst.configmanager.data.entities.ConfigModelObject; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java index 007aecae..29337968 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java @@ -1,10 +1,6 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.BaseConnectorBuilder; -import de.fraunhofer.iais.eis.BaseConnectorImpl; -import de.fraunhofer.iais.eis.ConfigurationModelImpl; -import de.fraunhofer.iais.eis.ConnectorEndpointBuilder; -import de.fraunhofer.iais.eis.SecurityProfile; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.data.repositories.ConfigModelRepository; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java index 411c871c..44f3225a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java @@ -1,13 +1,9 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.BasicAuthenticationBuilder; -import de.fraunhofer.iais.eis.Endpoint; -import de.fraunhofer.iais.eis.GenericEndpoint; -import de.fraunhofer.iais.eis.GenericEndpointBuilder; -import de.fraunhofer.iais.eis.GenericEndpointImpl; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.isst.configmanager.data.entities.CustomGenericEndpointList; -import de.fraunhofer.isst.configmanager.data.repositories.CustomGenericEndpointRepository; import de.fraunhofer.isst.configmanager.data.entities.CustomGenericEndpointObject; +import de.fraunhofer.isst.configmanager.data.repositories.CustomGenericEndpointRepository; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java index 3926f755..784b618a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java @@ -3,16 +3,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import de.fraunhofer.iais.eis.Action; -import de.fraunhofer.iais.eis.BinaryOperator; -import de.fraunhofer.iais.eis.ConstraintBuilder; -import de.fraunhofer.iais.eis.ContractOffer; -import de.fraunhofer.iais.eis.ContractOfferBuilder; -import de.fraunhofer.iais.eis.DutyBuilder; -import de.fraunhofer.iais.eis.LeftOperand; -import de.fraunhofer.iais.eis.NotMoreThanNOfferBuilder; -import de.fraunhofer.iais.eis.PermissionBuilder; -import de.fraunhofer.iais.eis.ProhibitionBuilder; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.util.RdfResource; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java index 5502b6db..512165a8 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceRepresentationService.java @@ -8,8 +8,8 @@ import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; import de.fraunhofer.isst.configmanager.api.service.EndpointService; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.data.repositories.EndpointInformationRepository; import de.fraunhofer.isst.configmanager.data.entities.EndpointInformation; +import de.fraunhofer.isst.configmanager.data.repositories.EndpointInformationRepository; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java index 2cecdd74..0fbb571b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java @@ -1,10 +1,6 @@ package de.fraunhofer.isst.configmanager.api.service.resources; -import de.fraunhofer.iais.eis.Language; -import de.fraunhofer.iais.eis.Resource; -import de.fraunhofer.iais.eis.ResourceBuilder; -import de.fraunhofer.iais.eis.ResourceImpl; -import de.fraunhofer.iais.eis.RouteStep; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java index 9b8e1d26..d80208d5 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java @@ -1,10 +1,6 @@ package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util; -import de.fraunhofer.iais.eis.Artifact; -import de.fraunhofer.iais.eis.BasicAuthenticationImpl; -import de.fraunhofer.iais.eis.GenericEndpoint; -import de.fraunhofer.iais.eis.Representation; -import de.fraunhofer.iais.eis.Resource; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.iais.eis.util.RdfResource; import de.fraunhofer.iais.eis.util.TypedLiteral; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/data/entities/ConfigModelObject.java b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/ConfigModelObject.java index 007cf1ea..44e589f7 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/data/entities/ConfigModelObject.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/ConfigModelObject.java @@ -7,12 +7,7 @@ import lombok.NoArgsConstructor; import lombok.experimental.FieldDefaults; -import javax.persistence.Column; -import javax.persistence.Convert; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import javax.persistence.*; /** * Entity class for the configuration model. diff --git a/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomApp.java b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomApp.java index c86d1a4f..be4ccdeb 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomApp.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomApp.java @@ -4,12 +4,7 @@ import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.OneToMany; +import javax.persistence.*; import java.util.List; /** diff --git a/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomBroker.java b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomBroker.java index 92cf52b0..5f68c6e4 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomBroker.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomBroker.java @@ -5,11 +5,7 @@ import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.ElementCollection; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import javax.persistence.*; import java.net.URI; import java.util.List; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomGenericEndpointList.java b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomGenericEndpointList.java index cb26a503..e874fd2a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomGenericEndpointList.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomGenericEndpointList.java @@ -5,14 +5,7 @@ import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.CascadeType; -import javax.persistence.Entity; -import javax.persistence.FetchType; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.OneToMany; +import javax.persistence.*; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/data/util/BackendConfig.java b/src/main/java/de/fraunhofer/isst/configmanager/data/util/BackendConfig.java index 2e8cc019..d3530ed3 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/data/util/BackendConfig.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/util/BackendConfig.java @@ -6,12 +6,7 @@ import lombok.NoArgsConstructor; import lombok.experimental.FieldDefaults; -import javax.persistence.Column; -import javax.persistence.Convert; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.MappedSuperclass; +import javax.persistence.*; /** * The class helps to persist objects inherited from the endpoint from the information model. diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilder.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilder.java index 06150e07..5e62b6d2 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilder.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilder.java @@ -3,15 +3,7 @@ import de.fraunhofer.iais.eis.AppRoute; import de.fraunhofer.iais.eis.Endpoint; import de.fraunhofer.iais.eis.RouteStep; -import de.fraunhofer.isst.configmanager.petrinet.model.Arc; -import de.fraunhofer.isst.configmanager.petrinet.model.ArcImpl; -import de.fraunhofer.isst.configmanager.petrinet.model.Node; -import de.fraunhofer.isst.configmanager.petrinet.model.PetriNet; -import de.fraunhofer.isst.configmanager.petrinet.model.PetriNetImpl; -import de.fraunhofer.isst.configmanager.petrinet.model.Place; -import de.fraunhofer.isst.configmanager.petrinet.model.PlaceImpl; -import de.fraunhofer.isst.configmanager.petrinet.model.Transition; -import de.fraunhofer.isst.configmanager.petrinet.model.TransitionImpl; +import de.fraunhofer.isst.configmanager.petrinet.model.*; import lombok.experimental.UtilityClass; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java index 206bfcc6..8abfbe4e 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/evaluation/formula/state/NodeFORALL_UNTIL.java @@ -2,7 +2,6 @@ import de.fraunhofer.isst.configmanager.petrinet.model.Node; import de.fraunhofer.isst.configmanager.petrinet.model.Place; -import de.fraunhofer.isst.configmanager.petrinet.model.Transition; import de.fraunhofer.isst.configmanager.petrinet.simulator.PetriNetSimulator; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/ContextObject.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/ContextObject.java index deda3a6b..7b701131 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/ContextObject.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/ContextObject.java @@ -15,9 +15,10 @@ public class ContextObject { private String read; private String write; private String erase; + private TransType type; public ContextObject deepCopy() { - return new ContextObject(context, read, write, erase); + return new ContextObject(context, read, write, erase, type); } @Override @@ -39,4 +40,9 @@ public boolean equals(final Object o) { public int hashCode() { return Objects.hash(new ArrayList<>(context), read, write, erase); } + + public enum TransType { + APP, + CONTROL + } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/PetriNetImpl.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/PetriNetImpl.java index 462ba77d..8d3ad9fc 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/PetriNetImpl.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/model/PetriNetImpl.java @@ -4,9 +4,7 @@ import lombok.SneakyThrows; import java.net.URI; -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; +import java.util.*; /** * Implementation class of the {@link PetriNet} interface. @@ -32,17 +30,18 @@ public Set getArcs() { @SneakyThrows public PetriNet deepCopy() { final var nodeCopy = new HashSet(); + Map nodeClones = new HashMap<>(); for (final var node : nodes) { - nodeCopy.add(node.deepCopy()); + nodeClones.put(node.getID(), node.deepCopy()); } + nodeCopy.addAll(nodeClones.values()); final var arcCopy = new HashSet(); - for (final var arc : arcs) { arcCopy.add( new ArcImpl( - nodeById(arc.getSource().getID(), nodeCopy), - nodeById(arc.getTarget().getID(), nodeCopy) + (Node) nodeClones.get(arc.getSource().getID()), + (Node) nodeClones.get(arc.getTarget().getID()) ) ); } @@ -78,12 +77,15 @@ public boolean equals(final Object o) { if (o == null || getClass() != o.getClass()) { return false; } - final var petriNet = (PetriNetImpl) o; - final var eq1 = Objects.equals(id, petriNet.id); - final var eq2 = nodes.stream().map(s -> petriNet.nodes.stream().filter(n -> n.getID().equals(s.getID())).anyMatch(n -> n.equals(s))).reduce(true, (a, b) -> a && b); - final var eq3 = arcs.stream().map(s -> petriNet.arcs.stream().anyMatch(n -> n.equals(s))).reduce(true, (a, b) -> a && b); + return Objects.equals(id, petriNet.id) && arcsEqual(petriNet.arcs) && nodesEqual(petriNet.nodes); + } + + private boolean nodesEqual(Set otherNodes){ + return nodes.stream().map(s -> otherNodes.stream().filter(n -> n.getID().equals(s.getID())).anyMatch(n -> n.equals(s))).reduce(true, (a, b) -> a && b); + } - return eq1 && eq2 && eq3; + private boolean arcsEqual(Set otherArcs){ + return arcs.stream().map(s -> otherArcs.stream().anyMatch(n -> n.equals(s))).reduce(true, (a, b) -> a && b); } } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/ParallelEvaluator.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/ParallelEvaluator.java index 4a9b5b57..66b99912 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/ParallelEvaluator.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/ParallelEvaluator.java @@ -1,17 +1,22 @@ package de.fraunhofer.isst.configmanager.petrinet.simulator; -import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.ArcExpression; import de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.ArcSubExpression; -import de.fraunhofer.isst.configmanager.petrinet.model.Node; +import de.fraunhofer.isst.configmanager.petrinet.model.ContextObject; import de.fraunhofer.isst.configmanager.petrinet.model.Transition; +import lombok.extern.slf4j.Slf4j; import java.util.List; +import java.util.stream.Collectors; +@Slf4j public class ParallelEvaluator { public static boolean nParallelTransitionsWithCondition(ArcSubExpression condition, int n, List> parallelSets){ - for(var set: parallelSets){ - if(set.size() >= n && set.stream().filter(condition::evaluate).count() >= n) return true; + var setsWithSizeAtLeastN = parallelSets.stream().filter(transitions -> transitions.size() >= n).collect(Collectors.toSet()); + for(var set: setsWithSizeAtLeastN){ + var names = set.stream().map(Transition::getContext).map(ContextObject::getRead).collect(Collectors.toList()); + log.info(names.toString()); + if(set.stream().filter(condition::evaluate).count() >= n) return true; } return false; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java index a3681002..28407ec5 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/petrinet/simulator/PetriNetSimulator.java @@ -337,7 +337,7 @@ private static List> calcPathsOfLengthNplus1(final List trans instanceof Transition).collect(Collectors.toList()); + var transitions = unfolded.getNodes().stream().filter(trans -> trans instanceof Transition).filter(trans -> ((Transition) trans).getContext().getType() == ContextObject.TransType.APP).collect(Collectors.toList()); for(var transition : transitions){ unfolded.getNodes().remove(transition); var transpart1 = new TransitionImpl(URI.create(String.format("%s_start", transition.getID().toString()))); diff --git a/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java b/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java index c1312004..a5e87d1c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java @@ -1,10 +1,6 @@ package de.fraunhofer.isst.configmanager.util; -import de.fraunhofer.iais.eis.AppEndpoint; -import de.fraunhofer.iais.eis.AppEndpointBuilder; -import de.fraunhofer.iais.eis.AppEndpointType; -import de.fraunhofer.iais.eis.CustomMediaTypeBuilder; -import de.fraunhofer.iais.eis.Language; +import de.fraunhofer.iais.eis.*; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; import lombok.experimental.UtilityClass; diff --git a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java index 1f875675..ea7b6f5e 100644 --- a/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java +++ b/src/test/java/de/fraunhofer/isst/configmanager/petrinet/builder/InfomodelPetriNetBuilderTest.java @@ -31,15 +31,11 @@ import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeFORALL_NEXT.nodeFORALL_NEXT; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeMODAL.nodeMODAL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeNF.nodeNF; -import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeNOT.nodeNOT; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodeOR.nodeOR; -import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.state.NodePOS.nodePOS; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.ArcExpression.arcExpression; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionAF.transitionAF; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionAND.transitionAND; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionEV.transitionEV; -import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionEXIST_UNTIL.transitionEXIST_UNTIL; -import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionFORALL_UNTIL.transitionFORALL_UNTIL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionMODAL.transitionMODAL; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionNOT.transitionNOT; import static de.fraunhofer.isst.configmanager.petrinet.evaluation.formula.transition.TransitionOR.transitionOR; @@ -175,6 +171,7 @@ void testExamplePetriNet(){ @Disabled void testUnfoldNet(){ var petriNet = buildPaperNet(); + var stepGraph = PetriNetSimulator.buildStepGraph(petriNet); var unfolded = PetriNetSimulator.getUnfoldedPetriNet(petriNet); log.info(GraphVizGenerator.generateGraphViz(unfolded)); log.info(String.valueOf(unfolded.deepCopy().equals(unfolded))); @@ -236,29 +233,29 @@ private PetriNet buildPaperNet(){ nodes.addAll(List.of(start, copy, init, dat1, dat2, con1, con2, con3, con4, sample, mean, med, rules, stor1, stor2, stor3, stor4, end)); //create transitions with context var initTrans = new TransitionImpl(URI.create("trans://init")); - initTrans.setContextObject(new ContextObject(List.of(), null, null, null)); + initTrans.setContextObject(new ContextObject(List.of(), null, null, null, ContextObject.TransType.CONTROL)); var getData = new TransitionImpl(URI.create("trans://getData")); - getData.setContextObject(new ContextObject(List.of(), null, "data", null)); + getData.setContextObject(new ContextObject(List.of(), null, "data", null, ContextObject.TransType.APP)); var copyData = new TransitionImpl(URI.create("trans://copyData")); - copyData.setContextObject(new ContextObject(List.of(""), "data", "data", null)); + copyData.setContextObject(new ContextObject(List.of(""), "data", "data", null, ContextObject.TransType.APP)); var extract = new TransitionImpl(URI.create("trans://extractSample")); - extract.setContextObject(new ContextObject(List.of("france"), "data", "sample", "data")); + extract.setContextObject(new ContextObject(List.of("france"), "data", "sample", "data", ContextObject.TransType.APP)); var calcMean = new TransitionImpl(URI.create("trans://calcMean")); - calcMean.setContextObject(new ContextObject(List.of("france"), "data", "mean", "data")); + calcMean.setContextObject(new ContextObject(List.of("france"), "data", "mean", "data", ContextObject.TransType.APP)); var calcMed = new TransitionImpl(URI.create("trans://calcMedian")); - calcMed.setContextObject(new ContextObject(List.of("france"), "data", "median", "data")); + calcMed.setContextObject(new ContextObject(List.of("france"), "data", "median", "data", ContextObject.TransType.APP)); var calcRules = new TransitionImpl(URI.create("trans://calcAPrioriRules")); - calcRules.setContextObject(new ContextObject(List.of("france", "high_performance"), "data", "rules", "data")); + calcRules.setContextObject(new ContextObject(List.of("france", "high_performance"), "data", "rules", "data", ContextObject.TransType.APP)); var store1 = new TransitionImpl(URI.create("trans://storeData1")); - store1.setContextObject(new ContextObject(List.of(), "sample", null, "sample")); + store1.setContextObject(new ContextObject(List.of(), "sample", null, "sample", ContextObject.TransType.APP)); var store2 = new TransitionImpl(URI.create("trans://storeData2")); - store2.setContextObject(new ContextObject(List.of(), "mean", null, "mean")); + store2.setContextObject(new ContextObject(List.of(), "mean", null, "mean", ContextObject.TransType.APP)); var store3 = new TransitionImpl(URI.create("trans://storeData3")); - store3.setContextObject(new ContextObject(List.of(), "median", null, "median")); + store3.setContextObject(new ContextObject(List.of(), "median", null, "median", ContextObject.TransType.APP)); var store4 = new TransitionImpl(URI.create("trans://storeData4")); - store4.setContextObject(new ContextObject(List.of(), "rules", null, "rules")); + store4.setContextObject(new ContextObject(List.of(), "rules", null, "rules", ContextObject.TransType.APP)); var endTrans = new TransitionImpl(URI.create("trans://end")); - endTrans.setContextObject(new ContextObject(List.of(), null, null, null)); + endTrans.setContextObject(new ContextObject(List.of(), null, null, null, ContextObject.TransType.CONTROL)); nodes.addAll(List.of(initTrans, getData, copyData, extract, calcMean, calcMed, calcRules, store1, store2, store3, store4, endTrans)); //create arcs var arcs = new HashSet(); From 31dd04b3f10eac6938849140428b40353f43c474 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 May 2021 07:57:10 +0000 Subject: [PATCH 151/157] build(deps): bump springdoc-openapi-ui from 1.5.8 to 1.5.9 Bumps [springdoc-openapi-ui](https://github.com/springdoc/springdoc-openapi) from 1.5.8 to 1.5.9. - [Release notes](https://github.com/springdoc/springdoc-openapi/releases) - [Changelog](https://github.com/springdoc/springdoc-openapi/blob/master/CHANGELOG.md) - [Commits](https://github.com/springdoc/springdoc-openapi/compare/v1.5.8...v1.5.9) Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cf418cbb..ea123831 100644 --- a/pom.xml +++ b/pom.xml @@ -158,7 +158,7 @@ org.springdoc springdoc-openapi-ui - 1.5.8 + 1.5.9 From 1e0b72ba1509afee57dc59e5037eeafd02570c4c Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Tue, 25 May 2021 08:45:13 +0200 Subject: [PATCH 152/157] docs: update changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c4984ea..3e31f0a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,11 +50,11 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - Dependabot: Dependabot will now automatically suggest pull requests for updates to dependencies. - Add: org.apache.logging.log4j:log4j-web 2.14.1 (Apache 2.0) - Add: org.postgresql:postgresql 42.2.20 (BSD-2-Clause) -- Upgrade: org.springframework.boot:spring-boot-starter-parent 2.4.2 -> 2.4.5 +- Upgrade: org.springframework.boot:spring-boot-starter-parent 2.4.2 -> 2.5.0 - Upgrade: org.springframework.security:spring-security-test 5.4.2 -> 5.5.0 - Upgrade: org.projectlombok:lombok 1.18.18 -> 1.18.20 - Upgrade: junit:junit 4.13.1 -> 4.13.2 -- Upgrade: org.springdoc:springdoc-openapi-ui 1.5.7 -> 1.5.8 +- Upgrade: org.springdoc:springdoc-openapi-ui 1.5.7 -> 1.5.9 - Exclude: com.vaadin.external.google:android-json from org.springframework.boot:spring-boot-starter-test - Remove: io.jsonwebtoken:jjwt 0.9.1 From 7f4c362566b6807df63648ebc3f418782212299b Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Tue, 25 May 2021 09:48:40 +0200 Subject: [PATCH 153/157] refactor: small code adjustments (imports) --- .../isst/configmanager/api/AppRouteApi.java | 6 +++++- .../isst/configmanager/api/BrokerApi.java | 6 +++++- .../isst/configmanager/api/ResourceApi.java | 6 +++++- .../ResourceRepresentationController.java | 8 ++++++-- .../configmanager/api/service/AppRouteService.java | 11 ++++++++++- .../api/service/ConfigModelService.java | 13 ++++++++++++- .../configmanager/api/service/ConnectorService.java | 6 +++++- .../configmanager/api/service/EndpointService.java | 6 +++++- .../service/resources/ResourceContractBuilder.java | 11 ++++++++++- .../api/service/resources/ResourceService.java | 6 +++++- .../dataspaceconnector/util/ResourceMapper.java | 6 +++++- .../data/entities/ConfigModelObject.java | 7 ++++++- .../isst/configmanager/data/entities/CustomApp.java | 7 ++++++- .../configmanager/data/entities/CustomBroker.java | 6 +++++- .../data/entities/CustomGenericEndpointList.java | 9 ++++++++- .../isst/configmanager/data/util/BackendConfig.java | 7 ++++++- .../fraunhofer/isst/configmanager/util/Utility.java | 6 +++++- 17 files changed, 109 insertions(+), 18 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java index 6ad1f47c..68b1f952 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/AppRouteApi.java @@ -4,7 +4,11 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java index 4c80fc1f..db713611 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/BrokerApi.java @@ -3,7 +3,11 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java index 0ef8e728..2a2b1e03 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java @@ -3,7 +3,11 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestParam; import java.net.URI; import java.util.ArrayList; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java index 3d7ef69d..dfb32560 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceRepresentationController.java @@ -1,7 +1,11 @@ package de.fraunhofer.isst.configmanager.api.controller; - -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.ArtifactBuilder; +import de.fraunhofer.iais.eis.IANAMediaTypeBuilder; +import de.fraunhofer.iais.eis.Language; +import de.fraunhofer.iais.eis.RepresentationBuilder; +import de.fraunhofer.iais.eis.RepresentationImpl; +import de.fraunhofer.iais.eis.ResourceImpl; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.api.ResourceRepresentationApi; import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java index ee0697cc..255d3e40 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/AppRouteService.java @@ -1,6 +1,15 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.AppRoute; +import de.fraunhofer.iais.eis.AppRouteBuilder; +import de.fraunhofer.iais.eis.AppRouteImpl; +import de.fraunhofer.iais.eis.BaseConnectorImpl; +import de.fraunhofer.iais.eis.ConfigurationModelImpl; +import de.fraunhofer.iais.eis.ConnectorEndpointBuilder; +import de.fraunhofer.iais.eis.Endpoint; +import de.fraunhofer.iais.eis.ResourceImpl; +import de.fraunhofer.iais.eis.RouteStep; +import de.fraunhofer.iais.eis.RouteStepBuilder; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.api.service.resources.ResourceService; import de.fraunhofer.isst.configmanager.data.entities.CustomApp; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java index 264c5ad9..ac4eed6c 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConfigModelService.java @@ -1,6 +1,17 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.BaseConnectorBuilder; +import de.fraunhofer.iais.eis.BasicAuthenticationBuilder; +import de.fraunhofer.iais.eis.ConfigurationModel; +import de.fraunhofer.iais.eis.ConfigurationModelBuilder; +import de.fraunhofer.iais.eis.ConfigurationModelImpl; +import de.fraunhofer.iais.eis.ConnectorDeployMode; +import de.fraunhofer.iais.eis.ConnectorEndpointBuilder; +import de.fraunhofer.iais.eis.ConnectorStatus; +import de.fraunhofer.iais.eis.LogLevel; +import de.fraunhofer.iais.eis.ProxyBuilder; +import de.fraunhofer.iais.eis.ProxyImpl; +import de.fraunhofer.iais.eis.SecurityProfile; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; import de.fraunhofer.isst.configmanager.data.entities.ConfigModelObject; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java index 29337968..007aecae 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/ConnectorService.java @@ -1,6 +1,10 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.BaseConnectorBuilder; +import de.fraunhofer.iais.eis.BaseConnectorImpl; +import de.fraunhofer.iais.eis.ConfigurationModelImpl; +import de.fraunhofer.iais.eis.ConnectorEndpointBuilder; +import de.fraunhofer.iais.eis.SecurityProfile; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.data.repositories.ConfigModelRepository; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java index 44f3225a..f74d3247 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/EndpointService.java @@ -1,6 +1,10 @@ package de.fraunhofer.isst.configmanager.api.service; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.BasicAuthenticationBuilder; +import de.fraunhofer.iais.eis.Endpoint; +import de.fraunhofer.iais.eis.GenericEndpoint; +import de.fraunhofer.iais.eis.GenericEndpointBuilder; +import de.fraunhofer.iais.eis.GenericEndpointImpl; import de.fraunhofer.isst.configmanager.data.entities.CustomGenericEndpointList; import de.fraunhofer.isst.configmanager.data.entities.CustomGenericEndpointObject; import de.fraunhofer.isst.configmanager.data.repositories.CustomGenericEndpointRepository; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java index 784b618a..3926f755 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceContractBuilder.java @@ -3,7 +3,16 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.Action; +import de.fraunhofer.iais.eis.BinaryOperator; +import de.fraunhofer.iais.eis.ConstraintBuilder; +import de.fraunhofer.iais.eis.ContractOffer; +import de.fraunhofer.iais.eis.ContractOfferBuilder; +import de.fraunhofer.iais.eis.DutyBuilder; +import de.fraunhofer.iais.eis.LeftOperand; +import de.fraunhofer.iais.eis.NotMoreThanNOfferBuilder; +import de.fraunhofer.iais.eis.PermissionBuilder; +import de.fraunhofer.iais.eis.ProhibitionBuilder; import de.fraunhofer.iais.eis.util.RdfResource; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java index 0fbb571b..2cecdd74 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java @@ -1,6 +1,10 @@ package de.fraunhofer.isst.configmanager.api.service.resources; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.Language; +import de.fraunhofer.iais.eis.Resource; +import de.fraunhofer.iais.eis.ResourceBuilder; +import de.fraunhofer.iais.eis.ResourceImpl; +import de.fraunhofer.iais.eis.RouteStep; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java index d80208d5..9b8e1d26 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/util/ResourceMapper.java @@ -1,6 +1,10 @@ package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.util; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.Artifact; +import de.fraunhofer.iais.eis.BasicAuthenticationImpl; +import de.fraunhofer.iais.eis.GenericEndpoint; +import de.fraunhofer.iais.eis.Representation; +import de.fraunhofer.iais.eis.Resource; import de.fraunhofer.iais.eis.ids.jsonld.Serializer; import de.fraunhofer.iais.eis.util.RdfResource; import de.fraunhofer.iais.eis.util.TypedLiteral; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/data/entities/ConfigModelObject.java b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/ConfigModelObject.java index 44e589f7..007cf1ea 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/data/entities/ConfigModelObject.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/ConfigModelObject.java @@ -7,7 +7,12 @@ import lombok.NoArgsConstructor; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Convert; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; /** * Entity class for the configuration model. diff --git a/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomApp.java b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomApp.java index be4ccdeb..c86d1a4f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomApp.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomApp.java @@ -4,7 +4,12 @@ import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; import java.util.List; /** diff --git a/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomBroker.java b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomBroker.java index 5f68c6e4..92cf52b0 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomBroker.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomBroker.java @@ -5,7 +5,11 @@ import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; import java.net.URI; import java.util.List; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomGenericEndpointList.java b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomGenericEndpointList.java index e874fd2a..cb26a503 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomGenericEndpointList.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/entities/CustomGenericEndpointList.java @@ -5,7 +5,14 @@ import lombok.Data; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/de/fraunhofer/isst/configmanager/data/util/BackendConfig.java b/src/main/java/de/fraunhofer/isst/configmanager/data/util/BackendConfig.java index d3530ed3..2e8cc019 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/data/util/BackendConfig.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/data/util/BackendConfig.java @@ -6,7 +6,12 @@ import lombok.NoArgsConstructor; import lombok.experimental.FieldDefaults; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Convert; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; /** * The class helps to persist objects inherited from the endpoint from the information model. diff --git a/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java b/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java index a5e87d1c..c1312004 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/util/Utility.java @@ -1,6 +1,10 @@ package de.fraunhofer.isst.configmanager.util; -import de.fraunhofer.iais.eis.*; +import de.fraunhofer.iais.eis.AppEndpoint; +import de.fraunhofer.iais.eis.AppEndpointBuilder; +import de.fraunhofer.iais.eis.AppEndpointType; +import de.fraunhofer.iais.eis.CustomMediaTypeBuilder; +import de.fraunhofer.iais.eis.Language; import de.fraunhofer.iais.eis.util.TypedLiteral; import de.fraunhofer.iais.eis.util.Util; import lombok.experimental.UtilityClass; From 05507f80bba5deff683817aaee4022e57dd9875e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Wed, 26 May 2021 14:59:40 +0200 Subject: [PATCH 154/157] chore: refactored the ResourceService and commented out unnecessary code --- .../isst/configmanager/api/ResourceApi.java | 1 + .../api/controller/ResourceController.java | 20 +++++- .../resources/AbstractResourceService.java | 29 +++++++- .../service/resources/ResourceService.java | 52 +++++++------- .../clients/DefaultResourceClient.java | 28 ++++---- .../clients/DataspaceResourceClient.java | 71 +++++++++---------- 6 files changed, 122 insertions(+), 79 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java index 2a2b1e03..5c29e48b 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/ResourceApi.java @@ -23,6 +23,7 @@ public interface ResourceApi { @GetMapping(value = "/resources", produces = "application/ld+json") @Operation(summary = "Returns all resources from the connector") @ApiResponse(responseCode = "200", description = "Successfully returned all resources from the connector") + @ApiResponse(responseCode = "500", description = "Internal server error") ResponseEntity getResources(); @GetMapping(value = "/resources/requested", produces = "application/ld+json") diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java index 8585e4cd..f12b9356 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/controller/ResourceController.java @@ -97,7 +97,15 @@ public ResponseEntity getResources() { if (log.isInfoEnabled()) { log.info(">> GET /resources"); } - return ResponseEntity.ok(resourceService.getOfferedResourcesAsJsonString()); + ResponseEntity response; + final var resources = resourceService.getResources(); + try { + response = ResponseEntity.ok(serializer.serialize(resources)); + } catch (IOException e) { + log.error(e.getMessage(), e); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + return response; } /** @@ -110,7 +118,15 @@ public ResponseEntity getRequestedResources() { if (log.isInfoEnabled()) { log.info(">> GET /resources/requested"); } - return ResponseEntity.ok(resourceService.getRequestedResourcesAsJsonString()); + ResponseEntity response; + final var resources = resourceService.getRequestedResources(); + try { + response = ResponseEntity.ok(serializer.serialize(resources)); + } catch (IOException e) { + log.error(e.getMessage(), e); + response = ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } + return response; } /** diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/AbstractResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/AbstractResourceService.java index ccbca704..e732ef2a 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/AbstractResourceService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/AbstractResourceService.java @@ -26,7 +26,7 @@ public abstract class AbstractResourceService { @Autowired protected AbstractResourceService(final ConfigModelService configModelService, - final DefaultConnectorClient connectorClient) { + final DefaultConnectorClient connectorClient) { this.configModelService = configModelService; this.connectorClient = connectorClient; } @@ -75,6 +75,33 @@ public List getResources() { return resources; } + /** + * This method returns a list of requested resources from the connector. + * + * @return List of requested resources. + */ + public List getRequestedResources() { + final ArrayList resources = new ArrayList<>(); + + BaseConnector baseConnector = null; + try { + baseConnector = connectorClient.getSelfDeclaration(); + } catch (IOException e) { + if (log.isErrorEnabled()) { + log.error(e.getMessage(), e); + } + } + if (baseConnector != null && baseConnector.getResourceCatalog() != null) { + for (final var resourceCatalog : baseConnector.getResourceCatalog()) { + if (resourceCatalog.getRequestedResource() != null) { + resources.addAll(resourceCatalog.getRequestedResource()); + } + } + } + return resources; + } + + /** * Delete occurrence of a resource with resourceID from all SubRoutes. * diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java index 2cecdd74..e4a51bc9 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java @@ -88,33 +88,33 @@ public void updateResourceContent(final String title, final String description, } } - /** - * This method returns all offered resources of a connector as plain json String. - * - * @return list of resources from the connector - */ - public String getOfferedResourcesAsJsonString() { - try { - return resourceClient.getOfferedResourcesAsJsonString(); - } catch (IOException e) { - log.error(e.getMessage(), e); - return null; - } - } +// /** +// * This method returns all offered resources of a connector as plain json String. +// * +// * @return list of resources from the connector +// */ +// public String getOfferedResourcesAsJsonString() { +// try { +// return resourceClient.getOfferedResourcesAsJsonString(); +// } catch (IOException e) { +// log.error(e.getMessage(), e); +// return null; +// } +// } - /** - * This method returns all requested resources of a connector as plain json String. - * - * @return list of resources from the connector - */ - public String getRequestedResourcesAsJsonString() { - try { - return resourceClient.getRequestedResourcesAsJsonString(); - } catch (IOException e) { - log.error(e.getMessage(), e); - return null; - } - } +// /** +// * This method returns all requested resources of a connector as plain json String. +// * +// * @return list of resources from the connector +// */ +// public String getRequestedResourcesAsJsonString() { +// try { +// return resourceClient.getRequestedResourcesAsJsonString(); +// } catch (IOException e) { +// log.error(e.getMessage(), e); +// return null; +// } +// } /** * @param resourceId id of the resource diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java index 2b496bff..739550e2 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java @@ -82,20 +82,20 @@ String updateResourceRepresentation(String resourceID, String representationID, */ String updateResourceContract(String resourceID, String contract) throws IOException; - /** - * Returns the offered resources of the self declaration of a connector. - * - * @return json-string with all offered resources - * @throws IOException when an error occurs while sending the request - */ - String getOfferedResourcesAsJsonString() throws IOException; +// /** +// * Returns the offered resources of the self declaration of a connector. +// * +// * @return json-string with all offered resources +// * @throws IOException when an error occurs while sending the request +// */ +// String getOfferedResourcesAsJsonString() throws IOException; - /** - * Returns the requested resources of the self declaration of a connector. - * - * @return json-string with all requested resources - * @throws IOException when an error occurs while sending the request - */ - String getRequestedResourcesAsJsonString() throws IOException; +// /** +// * Returns the requested resources of the self declaration of a connector. +// * +// * @return json-string with all requested resources +// * @throws IOException when an error occurs while sending the request +// */ +// String getRequestedResourcesAsJsonString() throws IOException; } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java index 76861238..a470b43f 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java @@ -1,6 +1,5 @@ package de.fraunhofer.isst.configmanager.connector.dataspaceconnector.clients; -import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import de.fraunhofer.iais.eis.Representation; import de.fraunhofer.iais.eis.Resource; @@ -33,41 +32,41 @@ public DataspaceResourceClient(final ResourceMapper dataSpaceConnectorResourceMa super(dataSpaceConnectorResourceMapper); } - @Override - public String getOfferedResourcesAsJsonString() throws IOException { - final var baseConnectorNode = getJsonNodeOfBaseConnector(); - final var offeredResourceNode = baseConnectorNode.findValue("ids:offeredResource"); - return offeredResourceNode.toString(); - } - - @Override - public String getRequestedResourcesAsJsonString() throws IOException { - final var baseConnectorNode = getJsonNodeOfBaseConnector(); - final var requestedResourceNode = baseConnectorNode.findValue("ids:requestedResource"); - return requestedResourceNode.toString(); - } - - private JsonNode getJsonNodeOfBaseConnector() throws IOException { - final var connectorUrl = connectorBaseUrl + "admin/api/connector"; - - final var builder = getRequestBuilder(); - builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, - dataSpaceConnectorApiPassword)); - builder.url(connectorUrl); - builder.get(); - - final var request = builder.build(); - final var response = DispatchRequest.sendToDataspaceConnector(request); - - if (!response.isSuccessful() && log.isWarnEnabled()) { - log.warn("---- [DataspaceResourceClient getJsonNodeOfBaseConnector] Could not get BaseConnector"); - } - - final var body = Objects.requireNonNull(response.body()).string(); - final var mapper = new ObjectMapper(); - - return mapper.readTree(body); - } +// @Override +// public String getOfferedResourcesAsJsonString() throws IOException { +// final var baseConnectorNode = getJsonNodeOfBaseConnector(); +// final var offeredResourceNode = baseConnectorNode.findValue("ids:offeredResource"); +// return offeredResourceNode.toString(); +// } + +// @Override +// public String getRequestedResourcesAsJsonString() throws IOException { +// final var baseConnectorNode = getJsonNodeOfBaseConnector(); +// final var requestedResourceNode = baseConnectorNode.findValue("ids:requestedResource"); +// return requestedResourceNode.toString(); +// } + +// private JsonNode getJsonNodeOfBaseConnector() throws IOException { +// final var connectorUrl = connectorBaseUrl + "admin/api/connector"; +// +// final var builder = getRequestBuilder(); +// builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, +// dataSpaceConnectorApiPassword)); +// builder.url(connectorUrl); +// builder.get(); +// +// final var request = builder.build(); +// final var response = DispatchRequest.sendToDataspaceConnector(request); +// +// if (!response.isSuccessful() && log.isWarnEnabled()) { +// log.warn("---- [DataspaceResourceClient getJsonNodeOfBaseConnector] Could not get BaseConnector"); +// } +// +// final var body = Objects.requireNonNull(response.body()).string(); +// final var mapper = new ObjectMapper(); +// +// return mapper.readTree(body); +// } @Override public String getRequestedResource(final String accessURL, final String resourceId) throws IOException { From d9c5be4636657913e382191af9f5a49d081ca7ca Mon Sep 17 00:00:00 2001 From: Tim Berthold Date: Wed, 26 May 2021 15:55:41 +0200 Subject: [PATCH 155/157] docs: update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e31f0a3..af6b560b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - Patch Change: A percent sign within URLs in the UI no longer results in an error in the CM-Backend. - Patch Change: Refactored Swagger-UI API Documentation, added all actually possible return-status-codes for API calls - Patch Change: IDS Resources Duration Policy in (h) in edit mode is poluted with xml-coding (2^^xsd:duration instead of 2), fixed by upgrading infomodel dependencies +- Patch Change: ResourceService is now use the Serializer-Artifact for returning all ressources ### Dependency Maintenance - Dependabot: Dependabot will now automatically suggest pull requests for updates to dependencies. From c1d3ee57cad7eaba189e49042bd7b4355c1e8a55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6khan=20Kahriman?= Date: Wed, 26 May 2021 15:59:53 +0200 Subject: [PATCH 156/157] chore: refactored code --- .../service/resources/ResourceService.java | 36 +------------------ .../clients/DefaultResourceClient.java | 17 --------- .../clients/DataspaceResourceClient.java | 36 ------------------- 3 files changed, 1 insertion(+), 88 deletions(-) diff --git a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java index e4a51bc9..1985c88d 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/api/service/resources/ResourceService.java @@ -9,7 +9,6 @@ import de.fraunhofer.iais.eis.util.Util; import de.fraunhofer.isst.configmanager.api.service.ConfigModelService; import de.fraunhofer.isst.configmanager.connector.clients.DefaultConnectorClient; -import de.fraunhofer.isst.configmanager.connector.clients.DefaultResourceClient; import de.fraunhofer.isst.configmanager.util.CalenderUtil; import lombok.AccessLevel; import lombok.experimental.FieldDefaults; @@ -18,7 +17,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.List; @@ -32,14 +30,10 @@ @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) public class ResourceService extends AbstractResourceService { - transient DefaultResourceClient resourceClient; - @Autowired public ResourceService(final ConfigModelService configModelService, - final DefaultConnectorClient connectorClient, - final DefaultResourceClient resourceClient) { + final DefaultConnectorClient connectorClient) { super(configModelService, connectorClient); - this.resourceClient = resourceClient; } @@ -88,34 +82,6 @@ public void updateResourceContent(final String title, final String description, } } -// /** -// * This method returns all offered resources of a connector as plain json String. -// * -// * @return list of resources from the connector -// */ -// public String getOfferedResourcesAsJsonString() { -// try { -// return resourceClient.getOfferedResourcesAsJsonString(); -// } catch (IOException e) { -// log.error(e.getMessage(), e); -// return null; -// } -// } - -// /** -// * This method returns all requested resources of a connector as plain json String. -// * -// * @return list of resources from the connector -// */ -// public String getRequestedResourcesAsJsonString() { -// try { -// return resourceClient.getRequestedResourcesAsJsonString(); -// } catch (IOException e) { -// log.error(e.getMessage(), e); -// return null; -// } -// } - /** * @param resourceId id of the resource */ diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java index 739550e2..55d60723 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/clients/DefaultResourceClient.java @@ -81,21 +81,4 @@ String updateResourceRepresentation(String resourceID, String representationID, * @throws IOException when an error occurs while sending the request */ String updateResourceContract(String resourceID, String contract) throws IOException; - -// /** -// * Returns the offered resources of the self declaration of a connector. -// * -// * @return json-string with all offered resources -// * @throws IOException when an error occurs while sending the request -// */ -// String getOfferedResourcesAsJsonString() throws IOException; - -// /** -// * Returns the requested resources of the self declaration of a connector. -// * -// * @return json-string with all requested resources -// * @throws IOException when an error occurs while sending the request -// */ -// String getRequestedResourcesAsJsonString() throws IOException; - } diff --git a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java index a470b43f..e0416db0 100644 --- a/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java +++ b/src/main/java/de/fraunhofer/isst/configmanager/connector/dataspaceconnector/clients/DataspaceResourceClient.java @@ -32,42 +32,6 @@ public DataspaceResourceClient(final ResourceMapper dataSpaceConnectorResourceMa super(dataSpaceConnectorResourceMapper); } -// @Override -// public String getOfferedResourcesAsJsonString() throws IOException { -// final var baseConnectorNode = getJsonNodeOfBaseConnector(); -// final var offeredResourceNode = baseConnectorNode.findValue("ids:offeredResource"); -// return offeredResourceNode.toString(); -// } - -// @Override -// public String getRequestedResourcesAsJsonString() throws IOException { -// final var baseConnectorNode = getJsonNodeOfBaseConnector(); -// final var requestedResourceNode = baseConnectorNode.findValue("ids:requestedResource"); -// return requestedResourceNode.toString(); -// } - -// private JsonNode getJsonNodeOfBaseConnector() throws IOException { -// final var connectorUrl = connectorBaseUrl + "admin/api/connector"; -// -// final var builder = getRequestBuilder(); -// builder.header("Authorization", Credentials.basic(dataSpaceConnectorApiUsername, -// dataSpaceConnectorApiPassword)); -// builder.url(connectorUrl); -// builder.get(); -// -// final var request = builder.build(); -// final var response = DispatchRequest.sendToDataspaceConnector(request); -// -// if (!response.isSuccessful() && log.isWarnEnabled()) { -// log.warn("---- [DataspaceResourceClient getJsonNodeOfBaseConnector] Could not get BaseConnector"); -// } -// -// final var body = Objects.requireNonNull(response.body()).string(); -// final var mapper = new ObjectMapper(); -// -// return mapper.readTree(body); -// } - @Override public String getRequestedResource(final String accessURL, final String resourceId) throws IOException { final var builder = getRequestBuilder(); From 86d6b8e997c77412684d5a5608a473df3ba200d4 Mon Sep 17 00:00:00 2001 From: Tim Berthold <75306992+tmberthold@users.noreply.github.com> Date: Wed, 26 May 2021 16:11:07 +0200 Subject: [PATCH 157/157] docs: update changelog, add release date --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index af6b560b..8067f4fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [7.0.0] - UNRELEASED +## [7.0.0] - 2021-05-26 ### Major Changes - Remove 20 unused APIs (= 1.150 lines of code) (unused by ConfigManager-UI project) - For the APIs of the enums, in addition to the technical name, such as DE for the language-dropdown, the written labels are now also supplied, e.g. German <-> DE. The structure of the API returns has changed accordingly

- - - - - - - +License • +Issues • +Discussions • +Contributing • +Code of Conduct