From 00fd5055c54d94b99cd52e8bd737f2bfac4287d0 Mon Sep 17 00:00:00 2001 From: "aravind.est" Date: Fri, 16 Feb 2024 18:44:53 +0000 Subject: Improve error message for A1 client custom adapter handling Error message improvement when using custom handler. Issue-ID: CCSDK-3986 Signed-off-by: aravind.est Change-Id: I11db77d7f861432614a7685498eeca02bba1a8fb --- .../clients/A1ClientFactory.java | 34 ++++++++++++++-------- .../clients/A1ClientFactoryTest.java | 14 +++++++++ 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/clients/A1ClientFactory.java b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/clients/A1ClientFactory.java index 87776c0f..b5c10bf6 100644 --- a/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/clients/A1ClientFactory.java +++ b/a1-policy-management/src/main/java/org/onap/ccsdk/oran/a1policymanagementservice/clients/A1ClientFactory.java @@ -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); } diff --git a/a1-policy-management/src/test/java/org/onap/ccsdk/oran/a1policymanagementservice/clients/A1ClientFactoryTest.java b/a1-policy-management/src/test/java/org/onap/ccsdk/oran/a1policymanagementservice/clients/A1ClientFactoryTest.java index f50d5537..a23540e5 100644 --- a/a1-policy-management/src/test/java/org/onap/ccsdk/oran/a1policymanagementservice/clients/A1ClientFactoryTest.java +++ b/a1-policy-management/src/test/java/org/onap/ccsdk/oran/a1policymanagementservice/clients/A1ClientFactoryTest.java @@ -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 -- cgit 1.2.3-korg