Make use of Lombok
[nonrtric.git] / policy-agent / src / main / java / org / oransc / policyagent / controllers / ServiceController.java
index bda5e09..8996376 100644 (file)
@@ -23,16 +23,23 @@ package org.oransc.policyagent.controllers;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+
 import java.time.Duration;
 import java.util.Collection;
 import java.util.Vector;
 
 import org.oransc.policyagent.exceptions.ServiceException;
+import org.oransc.policyagent.repository.Policies;
+import org.oransc.policyagent.repository.Policy;
 import org.oransc.policyagent.repository.Service;
 import org.oransc.policyagent.repository.Services;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 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.PutMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -43,26 +50,35 @@ import org.springframework.web.bind.annotation.RestController;
 public class ServiceController {
 
     private final Services services;
+    private final Policies policies;
+
     private static Gson gson = new GsonBuilder() //
         .serializeNulls() //
         .create(); //
 
     @Autowired
-    ServiceController(Services services) {
+    ServiceController(Services services, Policies policies) {
         this.services = services;
+        this.policies = policies;
     }
 
-    @GetMapping("/service")
-    public ResponseEntity<String> getService( //
-        @RequestParam(name = "name", required = true) String name) {
-        try {
-            Service s = services.getService(name);
-            String res = gson.toJson(toServiceStatus(s));
-            return new ResponseEntity<String>(res, HttpStatus.OK);
+    @GetMapping("/services")
+    @ApiOperation(value = "Returns service information", response = ServiceStatus.class)
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "OK")})
+    public ResponseEntity<String> getServices( //
+        @RequestParam(name = "name", required = false) String name) {
 
-        } catch (ServiceException e) {
-            return new ResponseEntity<String>(e.getMessage(), HttpStatus.NO_CONTENT);
+        Collection<ServiceStatus> servicesStatus = new Vector<>();
+        synchronized (this.services) {
+            for (Service s : this.services.getAll()) {
+                if (name == null || name.equals(s.getName())) {
+                    servicesStatus.add(toServiceStatus(s));
+                }
+            }
         }
+
+        String res = gson.toJson(servicesStatus);
+        return new ResponseEntity<String>(res, HttpStatus.OK);
     }
 
     private ServiceStatus toServiceStatus(Service s) {
@@ -85,31 +101,39 @@ public class ServiceController {
         }
     }
 
-    private Service toService(ServiceRegistrationInfo s) {
-        return new Service(s.name(), Duration.ofSeconds(s.keepAliveInterval()), s.callbackUrl());
+    @DeleteMapping("/services")
+    public ResponseEntity<String> deleteService( //
+        @RequestParam(name = "name", required = true) String name) {
+        try {
+            Service service = removeService(name);
+            // Remove the policies from the repo and let the consistency monitoring
+            // do the rest.
+            removePolicies(service);
+            return new ResponseEntity<String>("OK", HttpStatus.NO_CONTENT);
+        } catch (Exception e) {
+            return new ResponseEntity<String>(e.getMessage(), HttpStatus.NO_CONTENT);
+        }
     }
 
-    @GetMapping("/services")
-    public ResponseEntity<?> getServices() {
-        Collection<ServiceStatus> result = new Vector<>();
+    private Service removeService(String name) throws ServiceException {
         synchronized (this.services) {
-            for (Service s : this.services.getAll()) {
-                result.add(toServiceStatus(s));
-            }
+            Service service = this.services.getService(name);
+            this.services.remove(service.getName());
+            return service;
         }
-        return new ResponseEntity<>(gson.toJson(result), HttpStatus.OK);
     }
 
-    @PutMapping("/service/ping")
-    public ResponseEntity<String> ping( //
-        @RequestBody String name) {
-        try {
-            Service s = services.getService(name);
-            s.ping();
-            return new ResponseEntity<String>("OK", HttpStatus.OK);
-        } catch (ServiceException e) {
-            return new ResponseEntity<String>(e.getMessage(), HttpStatus.NO_CONTENT);
+    private void removePolicies(Service service) {
+        synchronized (this.policies) {
+            Vector<Policy> policyList = new Vector<>(this.policies.getForService(service.getName()));
+            for (Policy policy : policyList) {
+                this.policies.remove(policy);
+            }
         }
     }
 
+    private Service toService(ServiceRegistrationInfo s) {
+        return new Service(s.name(), Duration.ofSeconds(s.keepAliveInterval()), s.callbackUrl());
+    }
+
 }