2 * Copyright (c) 2018 Orange
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5 * in compliance with the License. You may obtain a copy of the License at
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software distributed under the License
10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11 * or implied. See the License for the specific language governing permissions and limitations under
14 package org.onap.nbi.apis.hub;
16 import java.util.LinkedHashMap;
17 import java.util.List;
18 import java.util.Optional;
19 import java.util.stream.Collectors;
20 import org.onap.nbi.OnapComponentsUrlPaths;
21 import org.onap.nbi.apis.hub.model.Subscriber;
22 import org.onap.nbi.apis.hub.model.Subscription;
23 import org.onap.nbi.apis.hub.service.dmaap.CheckDMaaPEventsManager;
24 import org.onap.nbi.apis.hub.service.SubscriptionService;
25 import org.onap.nbi.commons.EWInterfaceUtils;
26 import org.onap.nbi.commons.JsonRepresentation;
27 import org.onap.nbi.commons.MultiCriteriaRequestBuilder;
28 import org.onap.nbi.commons.ResourceManagement;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
31 import org.springframework.beans.factory.annotation.Autowired;
32 import org.springframework.beans.factory.annotation.Value;
33 import org.springframework.data.mongodb.core.MongoTemplate;
34 import org.springframework.data.mongodb.core.query.Query;
35 import org.springframework.http.HttpHeaders;
36 import org.springframework.http.HttpStatus;
37 import org.springframework.http.MediaType;
38 import org.springframework.http.ResponseEntity;
39 import org.springframework.scheduling.annotation.EnableScheduling;
40 import org.springframework.util.MultiValueMap;
41 import org.springframework.web.bind.annotation.DeleteMapping;
42 import org.springframework.web.bind.annotation.GetMapping;
43 import org.springframework.web.bind.annotation.PathVariable;
44 import org.springframework.web.bind.annotation.PostMapping;
45 import org.springframework.web.bind.annotation.RequestBody;
46 import org.springframework.web.bind.annotation.RequestHeader;
47 import org.springframework.web.bind.annotation.RequestMapping;
48 import org.springframework.web.bind.annotation.RequestParam;
49 import org.springframework.web.bind.annotation.ResponseStatus;
50 import org.springframework.web.bind.annotation.RestController;
53 @RequestMapping(OnapComponentsUrlPaths.HUB_PATH)
55 public class HubResource extends ResourceManagement {
57 Logger logger = LoggerFactory.getLogger(HubResource.class);
60 MongoTemplate mongoTemplate;
63 SubscriptionService subscriptionService;
66 MultiCriteriaRequestBuilder multiCriteriaRequestBuilder;
69 CheckDMaaPEventsManager checkDMaaPEventMAnager;
72 EWInterfaceUtils ewInterfaceUtils;
74 @Value("${nbi.public.url}")
75 private String nbiPublicUrl;
77 @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
78 public ResponseEntity<Object> createEventSubscription(@RequestBody Subscription subscription,
79 @RequestParam MultiValueMap<String, String> params, @RequestHeader(value="Target",required = false)String targetUrl) {
80 logger.debug("POST request for subscription : {}", subscription);
81 if (targetUrl != null) {
82 targetUrl = targetUrl + OnapComponentsUrlPaths.HUB_PATH;
83 String originalCallback = subscription.getCallback();
84 subscription.setCallback(nbiPublicUrl + OnapComponentsUrlPaths.LISTENER_PATH);
85 ResponseEntity ewResponse = ewInterfaceUtils.callPostRequestTarget(subscription, targetUrl);
86 if (ewResponse.getStatusCode() == HttpStatus.CREATED) {
87 subscription.setCallback(originalCallback);
88 subscription.setEwHost(targetUrl);
89 subscription.setEwId(((LinkedHashMap)ewResponse.getBody()).get( "id" ).toString());
94 Subscriber subscriber = subscriptionService.createSubscription(subscription);
95 JsonRepresentation filter = new JsonRepresentation(params);
96 return this.createResponse(Subscription.createFromSubscriber(subscriber), filter);
100 @GetMapping(value = "/{subscriptionId}", produces = MediaType.APPLICATION_JSON_VALUE)
101 public ResponseEntity<Subscription> getSubscription(@PathVariable String subscriptionId) {
104 Optional<Subscriber> optionalSubscriber =
105 subscriptionService.findSubscriptionById(subscriptionId);
106 if (!optionalSubscriber.isPresent()) {
107 return ResponseEntity.notFound().build();
109 return ResponseEntity.ok(Subscription.createFromSubscriber(optionalSubscriber.get()));
112 @GetMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE)
113 public ResponseEntity<Object> findSubscribers(
114 @RequestParam MultiValueMap<String, String> params) {
116 Query query = multiCriteriaRequestBuilder.buildRequest(params);
117 List<Subscriber> subscribers = mongoTemplate.find(query, Subscriber.class);
118 JsonRepresentation filter = new JsonRepresentation(params);
119 long totalCount = subscriptionService.countSubscription();
120 HttpHeaders headers = new HttpHeaders();
121 headers.add("X-Total-Count", String.valueOf(totalCount));
122 headers.add("X-Result-Count", String.valueOf(subscribers.size()));
123 List<Subscription> subscriptions =
124 subscribers.stream().map(Subscription::createFromSubscriber).collect(Collectors.toList());
126 return this.findResponse(subscriptions, filter, headers);
131 * Resource to test for DMaaP Integration for subscribing to AAI-EVENTs
133 @GetMapping("/testaaievents")
134 @ResponseStatus(HttpStatus.OK)
135 public void testAAIEventListener() {
136 checkDMaaPEventMAnager.checkForDMaaPAAIEvents();
139 @DeleteMapping("/{subscriptionId}")
140 @ResponseStatus(HttpStatus.NO_CONTENT)
141 public void deleteSubscription(@PathVariable String subscriptionId) {
142 logger.debug("DELETE request for subscription id #{}", subscriptionId);
143 Optional<Subscriber> optionalSubscriber= subscriptionService.findSubscriptionById(subscriptionId);
144 subscriptionService.deleteSubscription(subscriptionId);
145 String ewHost=optionalSubscriber.get().getEwHost();
146 String ewId=optionalSubscriber.get().getEwId();
147 logger.info("POST delete for ewHost : {}", ewHost);
148 logger.info("POST delete for ewId : {}", ewId);
149 if ( ewHost !=null && ewId !=null )
151 logger.info("POST deleteIF for ewHost : {}", ewHost);
152 String targetUrl = ewHost+ "/" + ewId;
153 ewInterfaceUtils.callDeleteRequestTarget(targetUrl);
154 logger.info("POST deleteIF for ewHost is : {}", targetUrl);