diff options
author | 2018-07-23 12:10:41 +0200 | |
---|---|---|
committer | 2018-08-09 18:01:41 +0000 | |
commit | 5008b80497d3256b724d54e0b26ad398f050571e (patch) | |
tree | 2cba735259e1ff33d6d5b647d10de253403152c2 /appc-dispatcher/appc-license-manager/appc-license-manager-core | |
parent | dc87c8cea2a6b6f68a8d7521db325fec4319b71a (diff) |
Improve LicenseManagerImpl implementation
- Use STAX API for XML processing instead of parsing it manually
- Rearrange code for clarity and testing
- Adjust JUnits accordingly
Issue-ID: APPC-1024
Change-Id: I9d655b581adb401b0c20bc29eda6a2bce1f2ef89
Signed-off-by: Joanna Jeremicz <joanna.jeremicz@nokia.com>
Diffstat (limited to 'appc-dispatcher/appc-license-manager/appc-license-manager-core')
6 files changed, 297 insertions, 52 deletions
diff --git a/appc-dispatcher/appc-license-manager/appc-license-manager-core/src/main/java/org/onap/appc/licmgr/impl/LicenseManagerImpl.java b/appc-dispatcher/appc-license-manager/appc-license-manager-core/src/main/java/org/onap/appc/licmgr/impl/LicenseManagerImpl.java index 6f8d33ea5..58b9b9e87 100644 --- a/appc-dispatcher/appc-license-manager/appc-license-manager-core/src/main/java/org/onap/appc/licmgr/impl/LicenseManagerImpl.java +++ b/appc-dispatcher/appc-license-manager/appc-license-manager-core/src/main/java/org/onap/appc/licmgr/impl/LicenseManagerImpl.java @@ -6,18 +6,20 @@ * ================================================================================ * Copyright (C) 2017 Amdocs * ============================================================================= + * Modifications Copyright (C) 2018 Nokia + * ============================================================================= * 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========================================================= */ @@ -25,12 +27,15 @@ package org.onap.appc.licmgr.impl; import static org.onap.appc.licmgr.Constants.SDC_ARTIFACTS_FIELDS.ARTIFACT_CONTENT; +import java.io.IOException; import java.util.Map; - +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; import org.onap.appc.licmgr.LicenseDataAccessService; import org.onap.appc.licmgr.LicenseManager; import org.onap.appc.licmgr.exception.DataAccessException; import org.onap.appc.licmgr.objects.LicenseModel; +import org.onap.appc.licmgr.objects.LicenseModelBuilder; @SuppressWarnings("all") @@ -38,50 +43,39 @@ public class LicenseManagerImpl implements LicenseManager { private LicenseDataAccessService DAService; - public void setDAService(LicenseDataAccessService daSrv){ - DAService = daSrv; - } - public LicenseManagerImpl() { + } @Override public LicenseModel retrieveLicenseModel(String vnfType, String vnfVersion) throws DataAccessException { - LicenseModel licenseModel; + LicenseModelBuilder builder = new LicenseModelBuilder(); try { - Map<String,String> resultMap = DAService.retrieveLicenseModelData(vnfType, vnfVersion); + Map<String, String> resultMap = DAService.retrieveLicenseModelData(vnfType, vnfVersion); if (resultMap.isEmpty()) { - throw new DataAccessException(String.format("License model not found for vnfType='%s' and vnfVersion='%s'", vnfType, vnfVersion)); + throw new DataAccessException( + String.format("License model not found for vnfType='%s' and vnfVersion='%s'", vnfType, vnfVersion)); } String licenseModelXML = resultMap.get(ARTIFACT_CONTENT.name()); - licenseModel = convert(licenseModelXML); // JAXBUtil.<VfLicenseModel>toObject(licenseModelXML, VfLicenseModel.class); + convert(licenseModelXML, builder); } catch (DataAccessException le) { throw le; } catch (Exception e) { throw new DataAccessException(e); } - return licenseModel; + return builder.build(); } - - private static LicenseModel convert(String xml) { - - LicenseModel licenseModel = new LicenseModel(); - - int posEntitlementStart = xml.indexOf("<entitlement-pool-uuid>"); - int posEntitlementEnd = xml.indexOf("</entitlement-pool-uuid>", posEntitlementStart); - if (-1 != posEntitlementStart) { - licenseModel.setEntitlementPoolUuid(xml.substring(posEntitlementStart + "<entitlement-pool-uuid>".length(), posEntitlementEnd)); - } - - int posLicenseStart = xml.indexOf("<license-key-group-uuid>"); - int posLicenseEnd = xml.indexOf("</license-key-group-uuid>", posEntitlementStart); - if (-1 != posLicenseStart) { - licenseModel.setLicenseKeyGroupUuid(xml.substring(posLicenseStart + "<license-key-group-uuid>".length(), posLicenseEnd)); - } - - return licenseModel; + public void setDAService(LicenseDataAccessService daSrv) { + DAService = daSrv; } + private LicenseModelBuilder convert(String xml, LicenseModelBuilder builder) + throws XMLStreamException, IOException { + XmlToLicenseModelConverter converter = new XmlToLicenseModelConverter( + XMLInputFactory.newInstance()); + converter.convert(VfLicenseModelXmlConsumer::setLicenseModel, xml, builder); + return builder; + } } diff --git a/appc-dispatcher/appc-license-manager/appc-license-manager-core/src/main/java/org/onap/appc/licmgr/impl/VfLicenseModelXmlConsumer.java b/appc-dispatcher/appc-license-manager/appc-license-manager-core/src/main/java/org/onap/appc/licmgr/impl/VfLicenseModelXmlConsumer.java new file mode 100644 index 000000000..6cfb77e7c --- /dev/null +++ b/appc-dispatcher/appc-license-manager/appc-license-manager-core/src/main/java/org/onap/appc/licmgr/impl/VfLicenseModelXmlConsumer.java @@ -0,0 +1,57 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2018 Nokia + * ================================================================================ + * 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.onap.appc.licmgr.impl; + +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import org.onap.appc.licmgr.objects.LicenseModelBuilder; + +class VfLicenseModelXmlConsumer { + + private static final String ENTITLEMENT_POOL_UUID = "entitlement-pool-uuid"; + private static final String LICENSE_KEY_GROUP_UUID = "license-key-group-uuid"; + + static void setLicenseModel(XMLStreamReader re, LicenseModelBuilder builder) throws XMLStreamException { + while (re.hasNext() && !builder.isReady()) { + re.next(); + if (re.isStartElement() && !trySetEntitlementPoolUuid(re, builder)) { + trySetLicenseKeyGroupUuid(re, builder); + } + } + } + + private static boolean trySetEntitlementPoolUuid(XMLStreamReader re, LicenseModelBuilder builder) + throws XMLStreamException { + if (re.getName().getLocalPart().equals(ENTITLEMENT_POOL_UUID)) { + builder.setEntitlementPoolUuid(re.getElementText()); + return true; + } + return false; + } + + private static void trySetLicenseKeyGroupUuid(XMLStreamReader re, LicenseModelBuilder builder) + throws XMLStreamException { + if (re.getName().getLocalPart().equals(LICENSE_KEY_GROUP_UUID)) { + builder.setLicenseKeyGroupUuid(re.getElementText()); + } + } +}
\ No newline at end of file diff --git a/appc-dispatcher/appc-license-manager/appc-license-manager-core/src/main/java/org/onap/appc/licmgr/impl/XmlToLicenseModelConverter.java b/appc-dispatcher/appc-license-manager/appc-license-manager-core/src/main/java/org/onap/appc/licmgr/impl/XmlToLicenseModelConverter.java new file mode 100644 index 000000000..02e37bf69 --- /dev/null +++ b/appc-dispatcher/appc-license-manager/appc-license-manager-core/src/main/java/org/onap/appc/licmgr/impl/XmlToLicenseModelConverter.java @@ -0,0 +1,58 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2018 Nokia + * ============================================================================= + * 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.onap.appc.licmgr.impl; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import org.onap.appc.licmgr.objects.LicenseModelBuilder; + +class XmlToLicenseModelConverter { + + private XMLInputFactory factory; + + XmlToLicenseModelConverter(XMLInputFactory factory) { + this.factory = factory; + } + + void convert(XMLStreamConsumer<XMLStreamReader, LicenseModelBuilder> consumer, String xml, LicenseModelBuilder builder) + throws XMLStreamException, IOException { + + XMLStreamReader reader = null; + try (InputStream inputStream = new ByteArrayInputStream(xml.getBytes())) { + reader = factory.createXMLStreamReader(inputStream); + consumer.accept(reader, builder); + } finally { + if (reader != null) { + reader.close(); + } + } + } + + @FunctionalInterface + public interface XMLStreamConsumer<T, W> { + void accept(T t, W w) throws XMLStreamException; + } +} diff --git a/appc-dispatcher/appc-license-manager/appc-license-manager-core/src/test/java/org/onap/appc/licmgr/impl/LicenseManagerImplTest.java b/appc-dispatcher/appc-license-manager/appc-license-manager-core/src/test/java/org/onap/appc/licmgr/impl/LicenseManagerImplTest.java index c025c987b..9d2fb87b4 100644 --- a/appc-dispatcher/appc-license-manager/appc-license-manager-core/src/test/java/org/onap/appc/licmgr/impl/LicenseManagerImplTest.java +++ b/appc-dispatcher/appc-license-manager/appc-license-manager-core/src/test/java/org/onap/appc/licmgr/impl/LicenseManagerImplTest.java @@ -2,7 +2,7 @@ * ============LICENSE_START======================================================= * ONAP : APPC * ================================================================================ - * Copyright (C) 2018 Nokia. + * Modifications Copyright (C) 2018 Nokia * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,14 +24,15 @@ package org.onap.appc.licmgr.impl; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; import static org.mockito.BDDMockito.given; import static org.onap.appc.licmgr.Constants.SDC_ARTIFACTS_FIELDS.ARTIFACT_CONTENT; +import java.io.InputStream; import java.util.Collections; -import java.util.Map; import java.util.HashMap; import org.junit.Before; +import java.util.Map; +import java.util.Scanner; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -53,6 +54,7 @@ public class LicenseManagerImplTest { @Before public void setUp() { licenseManager = new LicenseManagerImpl(); + licenseManager.setDAService(licenseDataAccessService); } @Test @@ -65,15 +67,13 @@ public class LicenseManagerImplTest { .willReturn(Collections.emptyMap()); // WHEN THEN - licenseManager.setDAService(licenseDataAccessService); - assertThatExceptionOfType(DataAccessException.class) .isThrownBy(() -> licenseManager.retrieveLicenseModel(VNF_TYPE, VNF_VERSION)) .withMessage(expectedMessage); } @Test - public void retrieveLicenseModel_shouldReturnLicenseModelWithNullValues_whenXmlIsMalformed() { + public void retrieveLicenseModel_shouldThrowException_whenXmlIsMalformed() { // GIVEN String malformedXml = "xyz"; @@ -83,27 +83,21 @@ public class LicenseManagerImplTest { given(licenseDataAccessService.retrieveLicenseModelData(VNF_TYPE, VNF_VERSION)) .willReturn(licenseModelData); - // WHEN - licenseManager.setDAService(licenseDataAccessService); - LicenseModel licenseModel = licenseManager.retrieveLicenseModel(VNF_TYPE, VNF_VERSION); - - // THEN - assertNull(licenseModel.getEntitlementPoolUuid()); - assertNull(licenseModel.getLicenseKeyGroupUuid()); + // WHEN THEN + assertThatExceptionOfType(DataAccessException.class) + .isThrownBy(() -> licenseManager.retrieveLicenseModel(VNF_TYPE, VNF_VERSION)); } @Test public void retrieveLicenseModel_shouldReturnCorrectLicenseModel_whenCorrectXmlExists() { // GIVEN - String expectedEntitlementPool = "default_entitlement_pool"; - String expectedKeyGroup = "default_key_group"; + String expectedEntitlementPool = "default_entitlement_pool_uuid"; + String expectedKeyGroup = "default_lkg_uuid"; - String correctlyFormedXml = String.format("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" - + "<parent>\n" - + "<entitlement-pool-uuid>%s</entitlement-pool-uuid>\n" - + "<license-key-group-uuid>%s</license-key-group-uuid>\n" - + "</parent>", expectedEntitlementPool, expectedKeyGroup); + ClassLoader classLoader = getClass().getClassLoader(); + InputStream inputStream = classLoader.getResourceAsStream("test-vf-license-model.xml"); + String correctlyFormedXml = new Scanner(inputStream).useDelimiter("\\A").next(); Map<String, String> licenseModelData = new HashMap<>(); licenseModelData.put(ARTIFACT_CONTENT.name(), correctlyFormedXml); @@ -111,7 +105,6 @@ public class LicenseManagerImplTest { .willReturn(licenseModelData); // WHEN - licenseManager.setDAService(licenseDataAccessService); LicenseModel licenseModel = licenseManager.retrieveLicenseModel(VNF_TYPE, VNF_VERSION); // THEN diff --git a/appc-dispatcher/appc-license-manager/appc-license-manager-core/src/test/java/org/onap/appc/licmgr/impl/XmlToLicenseModelConverterTest.java b/appc-dispatcher/appc-license-manager/appc-license-manager-core/src/test/java/org/onap/appc/licmgr/impl/XmlToLicenseModelConverterTest.java new file mode 100644 index 000000000..d0c48cc93 --- /dev/null +++ b/appc-dispatcher/appc-license-manager/appc-license-manager-core/src/test/java/org/onap/appc/licmgr/impl/XmlToLicenseModelConverterTest.java @@ -0,0 +1,80 @@ +/*- + * ============LICENSE_START======================================================= + * ONAP : APPC + * ================================================================================ + * Copyright (C) 2018 Nokia + * ============================================================================= + * 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.onap.appc.licmgr.impl; + +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.then; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; + +import java.io.IOException; +import java.io.InputStream; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + + +@RunWith(MockitoJUnitRunner.class) +public class XmlToLicenseModelConverterTest { + + @Mock + private XMLStreamReader xmlStreamReader; + + @Mock + private XMLInputFactory xmlInputFactory; + + @Test + public void apply_shouldCloseXMLStreamReader_whenNoExceptionIsThrown() + throws XMLStreamException, IOException { + + // GIVEN + XmlToLicenseModelConverter converter = new XmlToLicenseModelConverter(xmlInputFactory); + given(xmlInputFactory.createXMLStreamReader(any(InputStream.class))).willReturn(xmlStreamReader); + + // WHEN + converter.convert((a, b) -> { + }, anyString(), null); + + // THEN + then(xmlStreamReader).should().close(); + } + + @Test + public void apply_shouldCloseXMLStreamReader_whenExceptionIsThrown() + throws XMLStreamException { + // GIVEN + XmlToLicenseModelConverter converter = new XmlToLicenseModelConverter(xmlInputFactory); + given(xmlInputFactory.createXMLStreamReader(any(InputStream.class))).willReturn(xmlStreamReader); + + // WHEN THEN + assertThatExceptionOfType(XMLStreamException.class) + .isThrownBy(() -> converter.convert((a, b) -> { + throw new XMLStreamException(); + }, anyString(), null)); + then(xmlStreamReader).should().close(); + } +}
\ No newline at end of file diff --git a/appc-dispatcher/appc-license-manager/appc-license-manager-core/src/test/resources/test-vf-license-model.xml b/appc-dispatcher/appc-license-manager/appc-license-manager-core/src/test/resources/test-vf-license-model.xml new file mode 100644 index 000000000..6f32f50b8 --- /dev/null +++ b/appc-dispatcher/appc-license-manager/appc-license-manager-core/src/test/resources/test-vf-license-model.xml @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="UTF-8" standalone="yes"?> +<!-- + ============LICENSE_START======================================================= + ONAP : APPC + ================================================================================ + Copyright (C) 2018 Nokia + ============================================================================= + 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========================================================= + --> +<vf-license-model> + <vnf-id>default_vnf_id</vnf-id> + <vendor-name>default_vendor_name</vendor-name> + <feature-group-list> + <feature-group> + <feature-group-uuid>default_feature_group_uuid</feature-group-uuid> + <name>default_fg_name</name> + <description>default_fg_ description</description> + <att-part-number>default_part_number</att-part-number> + <entitlement-pool-list> + <entitlement-pool> + <entitlement-pool-uuid>default_entitlement_pool_uuid</entitlement-pool-uuid> + <name>default_ep_name</name> + <description>default_ep_description</description> + <manufacturer-reference-number>default_manufacturer_reference_number</manufacturer-reference-number> + <threshold-value> + <value>1</value> + <unit>default_unit</unit> + </threshold-value> + <entitlement-metric> + <value>default_em_value</value> + </entitlement-metric> + <increments>default_increments</increments> + <aggregation-function> + <value>default_af_value</value> + </aggregation-function> + <time> + <value>default_time</value> + </time> + </entitlement-pool> + </entitlement-pool-list> + <license-key-group-list> + <license-key-group> + <license-key-group-uuid>default_lkg_uuid</license-key-group-uuid> + <name>default_lkg_name</name> + <description>default_lkg_description</description> + <type>default_lkg_type</type> + </license-key-group> + </license-key-group-list> + </feature-group> + </feature-group-list> +</vf-license-model>
\ No newline at end of file |