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