Improve error message for A1 client custom adapter handling 50/137250/1
authoraravind.est <aravindhan.a@est.tech>
Fri, 16 Feb 2024 18:44:53 +0000 (18:44 +0000)
committeraravind.est <aravindhan.a@est.tech>
Fri, 16 Feb 2024 18:44:53 +0000 (18:44 +0000)
Error message improvement when using custom handler.

Issue-ID: CCSDK-3986
Signed-off-by: aravind.est <aravindhan.a@est.tech>
Change-Id: I11db77d7f861432614a7685498eeca02bba1a8fb

a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/clients/A1ClientFactory.java
a1-policy-management/src/test/java/org/onap/ccsdk/oran/a1policymanagementservice/clients/A1ClientFactoryTest.java

index 87776c0..b5c10bf 100644 (file)
@@ -3,6 +3,7 @@
  * ONAP : ccsdk oran
  * ======================================================================
  * Copyright (C) 2020-2023 Nordix Foundation. All rights reserved.
+ * Copyright (C) 2024 OpenInfra Foundation Europe. 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.
@@ -105,22 +106,31 @@ public class A1ClientFactory {
 
     private A1Client createCustomAdapter(Ric ric) throws ServiceException {
         try {
-            Class<?> clazz = Class.forName(ric.getConfig().getCustomAdapterClass());
-            if (A1Client.class.isAssignableFrom(clazz)) {
-                Constructor<?> constructor = clazz.getConstructor(RicConfig.class, AsyncRestClientFactory.class);
-                logger.debug("A1Client (" + clazz.getTypeName() + ") being created for ric: {}",
-                        ric.getConfig().getRicId());
-                return (A1Client) constructor.newInstance(ric.getConfig(), this.restClientFactory);
-            } else if (A1Client.Factory.class.isAssignableFrom(clazz)) {
-                A1Client.Factory factory = (A1Client.Factory) clazz.getDeclaredConstructor().newInstance();
-                logger.debug("A1Client (" + clazz.getTypeName() + ") factory creating client for ric: {}",
-                        ric.getConfig().getRicId());
-                return factory.create(ric.getConfig(), this.restClientFactory);
+            if (ric.getConfig().getCustomAdapterClass() != null && !ric.getConfig().getCustomAdapterClass().isEmpty()) {
+                Class<?> clazz = Class.forName(ric.getConfig().getCustomAdapterClass());
+                if (A1Client.class.isAssignableFrom(clazz)) {
+                    Constructor<?> constructor = clazz.getConstructor(RicConfig.class, AsyncRestClientFactory.class);
+                    logger.debug("A1Client (" + clazz.getTypeName() + ") being created for ric: {}",
+                            ric.getConfig().getRicId());
+                    return (A1Client) constructor.newInstance(ric.getConfig(), this.restClientFactory);
+                } else if (A1Client.Factory.class.isAssignableFrom(clazz)) {
+                    A1Client.Factory factory = (A1Client.Factory) clazz.getDeclaredConstructor().newInstance();
+                    logger.debug("A1Client (" + clazz.getTypeName() + ") factory creating client for ric: {}",
+                            ric.getConfig().getRicId());
+                    return factory.create(ric.getConfig(), this.restClientFactory);
+                } else {
+                    throw new ServiceException("The custom class must either implement A1Client.Factory or A1Client");
+                }
             } else {
-                throw new ServiceException("The custom class must either implement A1Client.Factory or A1Client");
+                throw new ServiceException("Custom adapter class is required to use A1ProtocolType.CUSTOM_PROTOCOL");
             }
         } catch (ClassNotFoundException e) {
             throw new ServiceException("Could not find class: " + ric.getConfig().getCustomAdapterClass(), e);
+        } catch (NoSuchMethodException e) {
+            throw new ServiceException("Could not find the required constructor in class "
+                                               + ric.getConfig().getCustomAdapterClass(), e);
+        } catch (ServiceException e) {
+            throw e;
         } catch (Exception e) {
             throw new ServiceException("Cannot create custom adapter: " + ric.getConfig().getCustomAdapterClass(), e);
         }
index f50d553..a23540e 100644 (file)
@@ -3,6 +3,7 @@
  * ONAP : ccsdk oran
  * ======================================================================
  * Copyright (C) 2020-2023 Nordix Foundation. All rights reserved.
+ * Copyright (C) 2024 OpenInfra Foundation Europe. 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.
@@ -41,6 +42,7 @@ import org.onap.ccsdk.oran.a1policymanagementservice.configuration.RicConfig;
 import org.onap.ccsdk.oran.a1policymanagementservice.exceptions.ServiceException;
 import org.onap.ccsdk.oran.a1policymanagementservice.repository.Ric;
 
+import org.onap.ccsdk.oran.a1policymanagementservice.utils.MockA1Client;
 import reactor.core.publisher.Mono;
 import reactor.test.StepVerifier;
 
@@ -148,6 +150,18 @@ class A1ClientFactoryTest {
             factoryUnderTest.createClient(new Ric(ricConfig("", "junk")), A1ProtocolType.CUSTOM_PROTOCOL);
         });
         assertEquals("Could not find class: junk", e.getMessage());
+
+        Exception exceptionNoSuchMethod = Assertions.assertThrows(Exception.class, () -> {
+            factoryUnderTest.createClient(new Ric(ricConfig("", MockA1Client.class.getName())),
+                    A1ProtocolType.CUSTOM_PROTOCOL);
+        });
+        assertEquals("Could not find the required constructor in class " + MockA1Client.class.getName(),
+                exceptionNoSuchMethod.getMessage());
+
+        Exception exceptionNullCustomAdaptor = Assertions.assertThrows(Exception.class, () -> {
+            factoryUnderTest.createClient(new Ric(ricConfig("", null)), A1ProtocolType.CUSTOM_PROTOCOL);
+        });
+        assertEquals("Custom adapter class is required to use A1ProtocolType.CUSTOM_PROTOCOL", exceptionNullCustomAdaptor.getMessage());
     }
 
     @Test