Merge "Add functionality to rAPP Catalogue"
[nonrtric.git] / r-app-catalogue / src / main / java / org / oransc / rappcatalogue / api / ServicesApiDelegateImpl.java
index 701f1d8..8c9469a 100644 (file)
+/*-\r
+ * ========================LICENSE_START=================================\r
+ * Copyright (C) 2020 Nordix Foundation. All rights reserved.\r
+ * ======================================================================\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ * ========================LICENSE_END===================================\r
+ */\r
+\r
 package org.oransc.rappcatalogue.api;\r
 \r
-import java.util.Arrays;\r
+import java.io.IOException;\r
+import java.sql.Date;\r
+import java.util.ArrayList;\r
 import java.util.List;\r
-\r
+import java.util.Optional;\r
+import java.util.concurrent.ConcurrentHashMap;\r
+import javax.servlet.http.HttpServletRequest;\r
+import javax.servlet.http.HttpServletResponse;\r
+import org.oransc.rappcatalogue.exception.HeaderException;\r
+import org.oransc.rappcatalogue.exception.InvalidServiceException;\r
+import org.oransc.rappcatalogue.exception.ServiceNotFoundException;\r
+import org.oransc.rappcatalogue.model.InputService;\r
+import org.oransc.rappcatalogue.model.Service;\r
+import org.springframework.beans.factory.annotation.Autowired;\r
 import org.springframework.http.HttpStatus;\r
 import org.springframework.http.ResponseEntity;\r
+import org.springframework.web.context.request.NativeWebRequest;\r
 \r
 @org.springframework.stereotype.Service\r
 public class ServicesApiDelegateImpl implements ServicesApiDelegate {\r
 \r
+    private static final String LOCATION_HEADER = "Location";\r
+\r
+    @Autowired\r
+    private NativeWebRequest nativeWebRequest;\r
+\r
+    private ConcurrentHashMap<String, Service> registeredServices = new ConcurrentHashMap<>();\r
+\r
+    ServicesApiDelegateImpl(NativeWebRequest nativeWebRequest) {\r
+        this.nativeWebRequest = nativeWebRequest;\r
+    }\r
+\r
+    @Override\r
+    public Optional<NativeWebRequest> getRequest() {\r
+        return Optional.of(nativeWebRequest);\r
+    }\r
+\r
     @Override\r
-    public ResponseEntity<Void> deleteIndividualServiceUsingDELETE(String serviceName) {\r
-        return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\r
+    public ResponseEntity<Service> getIndividualService(String serviceName) {\r
+        Service service = registeredServices.get(serviceName);\r
+        if (service != null) {\r
+            return ResponseEntity.ok(service);\r
+        } else {\r
+            throw new ServiceNotFoundException(serviceName);\r
+        }\r
     }\r
 \r
-    // @Override\r
-    // public ResponseEntity<Service> getIndividualServiceUsingGET(String serviceName) {\r
-    //     return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\r
+    @Override\r
+    public ResponseEntity<List<Service>> getServices() {\r
+        return ResponseEntity.ok(new ArrayList<>(registeredServices.values()));\r
+    }\r
+\r
+    @Override\r
+    public ResponseEntity<Void> putIndividualService(String serviceName, InputService inputService) {\r
+        if (isServiceValid(inputService)) {\r
+            if (registeredServices.put(serviceName, createService(serviceName, inputService)) == null) {\r
+                try {\r
+                    getRequest().ifPresent(request -> addLocationHeaderToResponse(serviceName, request));\r
+                } catch (Exception e) {\r
+                    registeredServices.remove(serviceName);\r
+                    throw e;\r
+                }\r
+                return new ResponseEntity<>(HttpStatus.CREATED);\r
+            } else {\r
+                return new ResponseEntity<>(HttpStatus.OK);\r
+            }\r
+        } else {\r
+            throw new InvalidServiceException();\r
+        }\r
+    }\r
 \r
-    // }\r
+    private void addLocationHeaderToResponse(String serviceName, NativeWebRequest request) {\r
+        try {\r
+            HttpServletRequest nativeRequest = request.getNativeRequest(HttpServletRequest.class);\r
+            HttpServletResponse nativeResponse = request.getNativeResponse(HttpServletResponse.class);\r
+            if (nativeRequest != null && nativeResponse != null) {\r
+                StringBuffer requestURL = nativeRequest.getRequestURL();\r
+                nativeResponse.addHeader(LOCATION_HEADER, requestURL.toString());\r
+                nativeResponse.getWriter().print("");\r
+            } else {\r
+                throw new HeaderException(LOCATION_HEADER, new Exception("Native Request or Response missing"));\r
+            }\r
+        } catch (IOException e) {\r
+            throw new HeaderException(LOCATION_HEADER, e);\r
+        }\r
+    }\r
 \r
     @Override\r
-    public ResponseEntity<List<String>> getServiceNamesUsingGET() {\r
-        List<String> services = Arrays.asList("a", "b");\r
-        return ResponseEntity.ok(services);\r
+    public ResponseEntity<Void> deleteIndividualService(String serviceName) {\r
+        registeredServices.remove(serviceName);\r
+        return new ResponseEntity<>(HttpStatus.NO_CONTENT);\r
     }\r
 \r
-    // @Override\r
-    // public ResponseEntity<Void> putIndividualServiceUsingPUT(String serviceName, Service service) {\r
-    //     return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);\r
+    /*\r
+     * java:S2589: Boolean expressions should not be gratuitous.\r
+     * Even though the version property is marked as @NotNull, it might be null coming from the client, hence the null\r
+     * check is needed.\r
+     */\r
+    @SuppressWarnings("java:S2589")\r
+    private boolean isServiceValid(InputService service) {\r
+        String version = service.getVersion();\r
+        return version != null && !version.isBlank();\r
+    }\r
 \r
-    // }\r
+    private Service createService(String serviceName, InputService inputService) {\r
+        Service service = new Service();\r
+        service.setName(serviceName);\r
+        service.setDescription(inputService.getDescription());\r
+        service.setDisplayName(inputService.getDisplayName());\r
+        service.setVersion(inputService.getVersion());\r
+        service.setRegistrationDate(getTodaysDate());\r
+        return service;\r
+    }\r
+\r
+    private String getTodaysDate() {\r
+        long millis = System.currentTimeMillis();\r
+        Date date = new Date(millis);\r
+        return date.toString();\r
+    }\r
 }\r