diff --git a/src/main/java/org/etsi/osl/tmf/gsm674/api/ApiUtil.java b/src/main/java/org/etsi/osl/tmf/gsm674/api/ApiUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..6683c4761959adb4763b8e0a613fb47364af1c8e --- /dev/null +++ b/src/main/java/org/etsi/osl/tmf/gsm674/api/ApiUtil.java @@ -0,0 +1,19 @@ +package org.etsi.osl.tmf.gsm674.api; + +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.context.request.NativeWebRequest; + +import java.io.IOException; + +public class ApiUtil { + public static void setExampleResponse(NativeWebRequest req, String contentType, String example) { + try { + HttpServletResponse res = req.getNativeResponse(HttpServletResponse.class); + res.setCharacterEncoding("UTF-8"); + res.addHeader("Content-Type", contentType); + res.getWriter().print(example); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/org/etsi/osl/tmf/gsm674/api/GeographicSiteManagementApiController.java b/src/main/java/org/etsi/osl/tmf/gsm674/api/GeographicSiteManagementApiController.java index 23f1be21eb18cf5f1e9e892df19a50fd53b100d0..475eaede144dd839288630f5c63daf275e08769e 100644 --- a/src/main/java/org/etsi/osl/tmf/gsm674/api/GeographicSiteManagementApiController.java +++ b/src/main/java/org/etsi/osl/tmf/gsm674/api/GeographicSiteManagementApiController.java @@ -16,7 +16,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import java.util.List; @Controller -@RequestMapping("/geographicSiteManagement/v4/") +@RequestMapping("/geographicSiteManagement/v5/") public class GeographicSiteManagementApiController implements GeographicSiteManagementApi{ private static final String COULD_NOT_SERIALIZE="Couldn't serialize response for content type application/json"; diff --git a/src/main/java/org/etsi/osl/tmf/gsm674/api/HubApi.java b/src/main/java/org/etsi/osl/tmf/gsm674/api/HubApi.java new file mode 100644 index 0000000000000000000000000000000000000000..f29996f780f1a0f2030345d880381afa76179478 --- /dev/null +++ b/src/main/java/org/etsi/osl/tmf/gsm674/api/HubApi.java @@ -0,0 +1,130 @@ +package org.etsi.osl.tmf.gsm674.api; + +import com.fasterxml.jackson.databind.ObjectMapper; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import jakarta.validation.Valid; +import org.etsi.osl.tmf.gsm674.model.EventSubscription; +import org.etsi.osl.tmf.gsm674.model.EventSubscriptionInput; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.context.request.NativeWebRequest; + +import java.io.IOException; +import java.util.Optional; + +@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2024-04-24T14:24:54.867613034Z[Etc/UTC]", comments = "Generator version: 7.6.0-SNAPSHOT") +@Validated +@Tag(name = "events subscription", description = "Endpoints to register and terminate an Event Listener") +public interface HubApi { + Logger log = LoggerFactory.getLogger(HubApi.class); + default Optional<ObjectMapper> getObjectMapper(){ + return Optional.empty(); + } + + default Optional<NativeWebRequest> getRequest() { + return Optional.empty(); + } + + default Optional<String> getAcceptHeader() { + return getRequest().map(r -> r.getHeader("Accept")); + } + + /** + * POST /hub : Register a listener + * Sets the communication endpoint address the service instance must use to deliver information about its health state, execution state, failures and metrics. + * + * @param eventSubscriptionInput Data containing the callback endpoint to deliver the information (required) + * @return Notified (status code 201) + * or Error (status code 200) + */ + @Operation( + operationId = "registerListener", + summary = "Register a listener", + description = "Sets the communication endpoint address the service instance must use to deliver information about its health state, execution state, failures and metrics.", + tags = { "events subscription" }, + responses = { + @ApiResponse(responseCode = "201", description = "Notified", content = { + @Content(mediaType = "application/json;charset=utf-8", schema = @Schema(implementation = EventSubscription.class)), + @Content(mediaType = "application/json", schema = @Schema(implementation = EventSubscription.class)) + }), + @ApiResponse(responseCode = "default", description = "Error", content = { + @Content(mediaType = "application/json;charset=utf-8", schema = @Schema(implementation = Error.class)), + @Content(mediaType = "application/json", schema = @Schema(implementation = Error.class)) + }) + } + ) + @RequestMapping( + method = RequestMethod.POST, + value = "/hub", + produces = { "application/json;charset=utf-8", "application/json" }, + consumes = { "application/json" } + ) + + default ResponseEntity<EventSubscription> registerListener( + @Parameter(name = "EventSubscriptionInput", description = "Data containing the callback endpoint to deliver the information", required = true) @Valid @RequestBody EventSubscriptionInput eventSubscriptionInput + ) { + if(getObjectMapper().isPresent() && getAcceptHeader().isPresent()) { + if (getAcceptHeader().get().contains("application/json")) { + try { + return new ResponseEntity<>(getObjectMapper().get().readValue("{ \"query\" : \"query\", \"callback\" : \"callback\", \"id\" : \"id\"}",EventSubscription.class), HttpStatus.NOT_IMPLEMENTED); + } catch (IOException e) { + log.error("Couldn't serialize response for content type application/json", e); + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } + } + } else { + log.warn("ObjectMapper or HttpServletRequest not configured in default HubApi interface so no example is generated"); + } + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + /** + * DELETE /hub/{id} : Unregister a listener + * Resets the communication endpoint address the service instance must use to deliver information about its health state, execution state, failures and metrics. + * + * @param id Identifier of the Service (required) + * @return Deleted (status code 204) + * or Error (status code 200) + */ + @Operation( + operationId = "unregisterListener", + summary = "Unregister a listener", + description = "Resets the communication endpoint address the service instance must use to deliver information about its health state, execution state, failures and metrics.", + tags = { "events subscription" }, + responses = { + @ApiResponse(responseCode = "204", description = "Deleted"), + @ApiResponse(responseCode = "default", description = "Error", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = Error.class)) + }) + } + ) + @RequestMapping( + method = RequestMethod.DELETE, + value = "/hub/{id}", + produces = { "application/json" } + ) + + default ResponseEntity<Void> unregisterListener( + @Parameter(name = "id", description = "Identifier of the Service", required = true, in = ParameterIn.PATH) @PathVariable("id") String id + ) { + if(getObjectMapper().isPresent() && getAcceptHeader().isPresent()) { + } else { + log.warn("ObjectMapper or HttpServletRequest not configured in default HubApi interface so no example is generated"); + } + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + +} diff --git a/src/main/java/org/etsi/osl/tmf/gsm674/api/HubApiController.java b/src/main/java/org/etsi/osl/tmf/gsm674/api/HubApiController.java new file mode 100644 index 0000000000000000000000000000000000000000..71195a53eb10d27b6a4f3429b6684c0db85e5b3b --- /dev/null +++ b/src/main/java/org/etsi/osl/tmf/gsm674/api/HubApiController.java @@ -0,0 +1,28 @@ +package org.etsi.osl.tmf.gsm674.api; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.context.request.NativeWebRequest; + +import java.util.Optional; + + +@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2024-04-24T14:24:54.867613034Z[Etc/UTC]", comments = "Generator version: 7.6.0-SNAPSHOT") +@Controller("HubApiController674") +@RequestMapping("/geographicSiteManagement/v5/") +public class HubApiController implements HubApi { + + private final NativeWebRequest request; + + @Autowired + public HubApiController(NativeWebRequest request) { + this.request = request; + } + + @Override + public Optional<NativeWebRequest> getRequest() { + return Optional.ofNullable(request); + } + +} diff --git a/src/main/java/org/etsi/osl/tmf/gsm674/api/ListenerApi.java b/src/main/java/org/etsi/osl/tmf/gsm674/api/ListenerApi.java new file mode 100644 index 0000000000000000000000000000000000000000..7de990795063da59dc826f0e8337407cfa7d6799 --- /dev/null +++ b/src/main/java/org/etsi/osl/tmf/gsm674/api/ListenerApi.java @@ -0,0 +1,217 @@ + +package org.etsi.osl.tmf.gsm674.api; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.etsi.osl.tmf.gsm674.model.GeographicSiteAttributeValueChangeEvent; +import org.etsi.osl.tmf.gsm674.model.GeographicSiteCreateEvent; +import org.etsi.osl.tmf.gsm674.model.GeographicSiteDeleteEvent; +import org.etsi.osl.tmf.gsm674.model.GeographicSiteStateChangeEvent; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.context.request.NativeWebRequest; + +import java.util.Optional; + + +@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2024-04-24T14:24:54.867613034Z[Etc/UTC]", comments = "Generator version: 7.6.0-SNAPSHOT") +@Validated +@Tag(name = "notification listener", description = "Notifications for Resource Lifecycle and event notifications") +public interface ListenerApi { + Logger log = LoggerFactory.getLogger(ListenerApi.class); + default Optional<NativeWebRequest> getRequest() { + return Optional.empty(); + } + default Optional<ObjectMapper> getObjectMapper() { + return Optional.empty(); + } + default Optional<String> getAcceptHeader() { + return getRequest().map(r -> r.getHeader("Accept")); + } + /** + * POST /listener/geographicSiteAttributeValueChangeEvent : Client listener for entity GeographicSiteCreateEvent + * Example of a client listener for receiving the notification GeographicSiteAttributeValueChangeEvent + * + * @param geographicSiteAttributeValueChangeEvent The event data (required) + * @return Notified (status code 204) + * or Error (status code 200) + */ + @Operation( + operationId = "geographicSiteAttributeValueChangeEvent", + summary = "Client listener for entity GeographicSiteCreateEvent", + description = "Example of a client listener for receiving the notification GeographicSiteAttributeValueChangeEvent", + tags = { "notification listener" }, + responses = { + @ApiResponse(responseCode = "204", description = "Notified"), + @ApiResponse(responseCode = "default", description = "Error", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = Error.class)) + }) + } + ) + @RequestMapping( + method = RequestMethod.POST, + value = "/listener/geographicSiteAttributeValueChangeEvent", + produces = { "application/json" }, + consumes = { "application/json" } + ) + + default ResponseEntity<Void> geographicSiteAttributeValueChangeEvent( + @Parameter(name = "GeographicSiteAttributeValueChangeEvent", description = "The event data", required = true) @Valid @RequestBody GeographicSiteAttributeValueChangeEvent geographicSiteAttributeValueChangeEvent + ) { + getRequest().ifPresent(request -> { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + String exampleString = "{ \"reason\" : \"reason\", \"code\" : \"code\", \"@baseType\" : \"@baseType\", \"@type\" : \"@type\", \"@schemaLocation\" : \"@schemaLocation\", \"message\" : \"message\", \"referenceError\" : \"referenceError\", \"status\" : \"status\" }"; + ApiUtil.setExampleResponse(request, "application/json", exampleString); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + /** + * POST /listener/geographicSiteCreateEvent : Client listener for entity GeographicSiteCreateEvent + * Example of a client listener for receiving the notification GeographicSiteCreateEvent + * + * @param geographicSiteCreateEvent The event data (required) + * @return Notified (status code 204) + * or Error (status code 200) + */ + @Operation( + operationId = "geographicSiteCreateEvent", + summary = "Client listener for entity GeographicSiteCreateEvent", + description = "Example of a client listener for receiving the notification GeographicSiteCreateEvent", + tags = { "notification listener" }, + responses = { + @ApiResponse(responseCode = "204", description = "Notified"), + @ApiResponse(responseCode = "default", description = "Error", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = Error.class)) + }) + } + ) + @RequestMapping( + method = RequestMethod.POST, + value = "/listener/geographicSiteCreateEvent", + produces = { "application/json" }, + consumes = { "application/json" } + ) + + default ResponseEntity<Void> geographicSiteCreateEvent( + @Parameter(name = "GeographicSiteCreateEvent", description = "The event data", required = true) @Valid @RequestBody GeographicSiteCreateEvent geographicSiteCreateEvent + ) { + getRequest().ifPresent(request -> { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + String exampleString = "{ \"reason\" : \"reason\", \"code\" : \"code\", \"@baseType\" : \"@baseType\", \"@type\" : \"@type\", \"@schemaLocation\" : \"@schemaLocation\", \"message\" : \"message\", \"referenceError\" : \"referenceError\", \"status\" : \"status\" }"; + ApiUtil.setExampleResponse(request, "application/json", exampleString); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + /** + * POST /listener/geographicSiteDeleteEvent : Client listener for entity GeographicSiteCreateEvent + * Example of a client listener for receiving the notification GeographicSiteDeleteEvent + * + * @param geographicSiteDeleteEvent The event data (required) + * @return Notified (status code 204) + * or Error (status code 200) + */ + @Operation( + operationId = "geographicSiteDeleteEvent", + summary = "Client listener for entity GeographicSiteCreateEvent", + description = "Example of a client listener for receiving the notification GeographicSiteDeleteEvent", + tags = { "notification listener" }, + responses = { + @ApiResponse(responseCode = "204", description = "Notified"), + @ApiResponse(responseCode = "default", description = "Error", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = Error.class)) + }) + } + ) + @RequestMapping( + method = RequestMethod.POST, + value = "/listener/geographicSiteDeleteEvent", + produces = { "application/json" }, + consumes = { "application/json" } + ) + + default ResponseEntity<Void> geographicSiteDeleteEvent( + @Parameter(name = "GeographicSiteDeleteEvent", description = "The event data", required = true) @Valid @RequestBody GeographicSiteDeleteEvent geographicSiteDeleteEvent + ) { + getRequest().ifPresent(request -> { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + String exampleString = "{ \"reason\" : \"reason\", \"code\" : \"code\", \"@baseType\" : \"@baseType\", \"@type\" : \"@type\", \"@schemaLocation\" : \"@schemaLocation\", \"message\" : \"message\", \"referenceError\" : \"referenceError\", \"status\" : \"status\" }"; + ApiUtil.setExampleResponse(request, "application/json", exampleString); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + + + /** + * POST /listener/geographicSiteStateChangeEvent : Client listener for entity GeographicSiteCreateEvent + * Example of a client listener for receiving the notification GeographicSiteStateChangeEvent + * + * @param geographicSiteStateChangeEvent The event data (required) + * @return Notified (status code 204) + * or Error (status code 200) + */ + @Operation( + operationId = "geographicSiteStateChangeEvent", + summary = "Client listener for entity GeographicSiteCreateEvent", + description = "Example of a client listener for receiving the notification GeographicSiteStateChangeEvent", + tags = { "notification listener" }, + responses = { + @ApiResponse(responseCode = "204", description = "Notified"), + @ApiResponse(responseCode = "default", description = "Error", content = { + @Content(mediaType = "application/json", schema = @Schema(implementation = Error.class)) + }) + } + ) + @RequestMapping( + method = RequestMethod.POST, + value = "/listener/geographicSiteStateChangeEvent", + produces = { "application/json" }, + consumes = { "application/json" } + ) + + default ResponseEntity<Void> geographicSiteStateChangeEvent( + @Parameter(name = "GeographicSiteStateChangeEvent", description = "The event data", required = true) @Valid @RequestBody GeographicSiteStateChangeEvent geographicSiteStateChangeEvent + ) { + getRequest().ifPresent(request -> { + for (MediaType mediaType: MediaType.parseMediaTypes(request.getHeader("Accept"))) { + if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) { + String exampleString = "{ \"reason\" : \"reason\", \"code\" : \"code\", \"@baseType\" : \"@baseType\", \"@type\" : \"@type\", \"@schemaLocation\" : \"@schemaLocation\", \"message\" : \"message\", \"referenceError\" : \"referenceError\", \"status\" : \"status\" }"; + ApiUtil.setExampleResponse(request, "application/json", exampleString); + break; + } + } + }); + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + + } + +} diff --git a/src/main/java/org/etsi/osl/tmf/gsm674/api/ListenerApiController.java b/src/main/java/org/etsi/osl/tmf/gsm674/api/ListenerApiController.java new file mode 100644 index 0000000000000000000000000000000000000000..bfdcd763980b701f1680713c1a1ffdc2b44c1bd3 --- /dev/null +++ b/src/main/java/org/etsi/osl/tmf/gsm674/api/ListenerApiController.java @@ -0,0 +1,27 @@ +package org.etsi.osl.tmf.gsm674.api; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.context.request.NativeWebRequest; +import java.util.Optional; + + +@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.SpringCodegen", date = "2024-04-24T14:24:54.867613034Z[Etc/UTC]", comments = "Generator version: 7.6.0-SNAPSHOT") +@Controller("ListenerApiController674") +@RequestMapping("/geographicSiteManagement/v5/") +public class ListenerApiController implements ListenerApi { + + private final NativeWebRequest request; + + @Autowired + public ListenerApiController(NativeWebRequest request) { + this.request = request; + } + + @Override + public Optional<NativeWebRequest> getRequest() { + return Optional.ofNullable(request); + } + +} diff --git a/src/main/java/org/etsi/osl/tmf/gsm674/reposervices/GeographicSiteManagementService.java b/src/main/java/org/etsi/osl/tmf/gsm674/reposervices/GeographicSiteManagementService.java index 0887b38e67728cd1d486bf979ded708d74e02f85..1206d8201224198c4ff587db4ef8940ce4b2ecfc 100644 --- a/src/main/java/org/etsi/osl/tmf/gsm674/reposervices/GeographicSiteManagementService.java +++ b/src/main/java/org/etsi/osl/tmf/gsm674/reposervices/GeographicSiteManagementService.java @@ -58,17 +58,16 @@ public class GeographicSiteManagementService { private GeographicSite updateFields(GeographicSite newSite, GeographicSite existingSite){ - if(newSite.getName()!=null) existingSite.setName(newSite.getName()); if(newSite.getDescription()!=null) existingSite.setDescription(newSite.getDescription()); if(newSite.getCode()!=null) existingSite.setCode(newSite.getCode()); if (newSite.getStatus()!=null) existingSite.setStatus(newSite.getStatus()); - if(newSite.getGeographicSiteRelationship()!=null){ - for(GeographicSiteRelationship n : newSite.getGeographicSiteRelationship()){ + if(newSite.getSiteRelationship() !=null){ + for(GeographicSiteRelationship n : newSite.getSiteRelationship()){ if(n.getUuid()==null){ - existingSite.addGeographicSiteRelationship(n); + existingSite.addSiteRelationshipItem(n); }else { - for (GeographicSiteRelationship oldGeographicRelationship : existingSite.getGeographicSiteRelationship()){ + for (GeographicSiteRelationship oldGeographicRelationship : existingSite.getSiteRelationship()){ if (n.getUuid().equals(oldGeographicRelationship.getUuid())){ if (n.getRole() !=null) oldGeographicRelationship.setRole(n.getRole()); if (n.getRelationshipType() !=null) oldGeographicRelationship.setRelationshipType(n.getRelationshipType()); @@ -82,7 +81,7 @@ public class GeographicSiteManagementService { if(newSite.getCalendar()!=null){ for(CalendarPeriod c: newSite.getCalendar()){ if(c.getUuid()==null){ - existingSite.addCalendarPeriod(c); + existingSite.addCalendarItem(c); } else { for (CalendarPeriod oldCalendarPeriod: existingSite.getCalendar()){ if (c.getUuid().equals(oldCalendarPeriod.getUuid())){ @@ -96,20 +95,20 @@ public class GeographicSiteManagementService { } } - if(newSite.getPlaceRefOrValue()!=null){ - for(PlaceRefOrValue p: newSite.getPlaceRefOrValue()){ + if(newSite.getPlace()!=null){ + for(PlaceRefOrValue p: newSite.getPlace()){ if (p.getUuid()==null){ - existingSite.addPlaceRefOrValue(p); + existingSite.addPlaceItem(p); } } } - if(newSite.getRelatedParties()!=null){ - for(RelatedParty party: newSite.getRelatedParties()){ + if(newSite.getRelatedParty()!=null){ + for(RelatedParty party: newSite.getRelatedParty()){ if(party.getUuid()==null){ - existingSite.addRelatedParty(party); + existingSite.addRelatedPartyItem(party); } else { - for (RelatedParty rp: existingSite.getRelatedParties()){ + for (RelatedParty rp: existingSite.getRelatedParty()){ if(party.getUuid().equals(rp.getUuid())){ if (party.getRole() !=null) rp.setRole(party.getRole()); if (party.getName() !=null) rp.setName(party.getName());