diff options
Diffstat (limited to 'cps-ncmp-service/src/main')
8 files changed, 200 insertions, 70 deletions
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NetworkCmProxyDataService.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NetworkCmProxyDataService.java index 0693f61e44..60669b9169 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NetworkCmProxyDataService.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/NetworkCmProxyDataService.java @@ -28,6 +28,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.onap.cps.ncmp.api.models.DmiPluginRegistration; import org.onap.cps.spi.FetchDescendantsOption; import org.onap.cps.spi.model.DataNode; +import org.onap.cps.spi.model.ModuleReference; /* * Datastore interface for handling CPS data. @@ -154,4 +155,12 @@ public interface NetworkCmProxyDataService { @NotNull String resourceIdentifier, @NotNull Object requestBody, String contentType); + + /** + * Retrieve module references for the given cm handle. + * + * @param cmHandle cm handle + * @return a collection of modules names and revisions + */ + Collection<ModuleReference> getYangResourcesModuleReferences(@NotNull String cmHandle); } diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/JsonUtils.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/JsonUtils.java new file mode 100644 index 0000000000..6768777e17 --- /dev/null +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/JsonUtils.java @@ -0,0 +1,52 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nordix Foundation + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.cps.ncmp.api.impl; + +public class JsonUtils { + + private static final String BACK_SLASH = "\\"; + private static final String NEW_LINE = "\n"; + private static final String QUOTE = "\""; + + private JsonUtils() { + throw new IllegalStateException(); + } + + /** + * Remove redundant beginning and end characters. + * @param input string to format + * @return formatted string + */ + public static String removeWrappingTokens(final String input) { + return input.substring(1, input.length() - 1); + } + + /** + * Remove redundant escape characters. + * @param input string to format + * @return formatted string + */ + public static String removeRedundantEscapeCharacters(final String input) { + return input.replace(BACK_SLASH + "n", NEW_LINE) + .replace(BACK_SLASH + QUOTE, QUOTE) + .replace(BACK_SLASH + BACK_SLASH + QUOTE, BACK_SLASH + QUOTE); + } +} diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java index dfe5603431..a28b73c427 100755 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java @@ -76,6 +76,8 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService private static final String NCMP_DMI_SERVICE_NAME = "dmi-service-name"; + private static final String REVISION = "revision"; + private CpsDataService cpsDataService; private ObjectMapper objectMapper; @@ -88,8 +90,6 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService private CpsAdminService cpsAdminService; - public static final String NO_NAMESPACE = null; - /** * Constructor Injection for Dependencies. * @param dmiOperations DMI operation @@ -215,7 +215,7 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService .cmHandleProperties(cmHandlePropertiesMap) .build(); final var dmiRequestBody = prepareOperationBody(dmiRequestBodyObject); - final ResponseEntity<Void> responseEntity = dmiOperations + final ResponseEntity<String> responseEntity = dmiOperations .createResourceDataPassThroughRunningFromDmi(dmiServiceName, cmHandle, resourceIdentifier, @@ -223,13 +223,17 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService handleResponseForPost(responseEntity); } + @Override + public Collection<ModuleReference> getYangResourcesModuleReferences(final String cmHandle) { + return cpsModuleService.getYangResourcesModuleReferences(NF_PROXY_DATASPACE_NAME, cmHandle); + } + private DataNode fetchDataNodeFromDmiRegistryForCmHandle(final String cmHandle) { final String xpathForDmiRegistryToFetchCmHandle = "/dmi-registry/cm-handles[@id='" + cmHandle + "']"; - final var dataNode = cpsDataService.getDataNode(NCMP_DATASPACE_NAME, + return cpsDataService.getDataNode(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR, xpathForDmiRegistryToFetchCmHandle, FetchDescendantsOption.INCLUDE_ALL_DESCENDANTS); - return dataNode; } private String prepareOperationBody(final GenericRequestBody requestBodyObject) { @@ -242,9 +246,9 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService } } - private Map<String, String> getCmHandlePropertiesAsMap(final Collection<DataNode> cmHandlePropertiesList) { - if (cmHandlePropertiesList == null || cmHandlePropertiesList.size() == 0) { - return null; + private static Map<String, String> getCmHandlePropertiesAsMap(final Collection<DataNode> cmHandlePropertiesList) { + if (cmHandlePropertiesList == null || cmHandlePropertiesList.isEmpty()) { + return Collections.emptyMap(); } final Map<String, String> cmHandlePropertiesMap = new LinkedHashMap<>(); for (final var node: cmHandlePropertiesList) { @@ -254,7 +258,7 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService return cmHandlePropertiesMap; } - private Object handleResponse(final @NotNull ResponseEntity<Object> responseEntity) { + private static Object handleResponse(final @NotNull ResponseEntity<Object> responseEntity) { if (responseEntity.getStatusCode() == HttpStatus.OK) { return responseEntity.getBody(); } else { @@ -264,8 +268,8 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService } } - private void handleResponseForPost(final @NotNull ResponseEntity<Void> responseEntity) { - if (responseEntity.getStatusCode() != HttpStatus.CREATED) { + private static void handleResponseForPost(final @NotNull ResponseEntity<String> responseEntity) { + if (responseEntity.getStatusCode() != HttpStatus.OK) { throw new NcmpException("Not able to create resource data.", "DMI status code: " + responseEntity.getStatusCodeValue() + ", DMI response body: " + responseEntity.getBody()); @@ -275,11 +279,11 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService private String getGenericRequestBody(final DataNode cmHandleDataNode) { final Collection<DataNode> cmHandlePropertiesList = cmHandleDataNode.getChildDataNodes(); final Map<String, String> cmHandlePropertiesMap = getCmHandlePropertiesAsMap(cmHandlePropertiesList); - final var requetBodyObject = GenericRequestBody.builder() + final var requestBodyObject = GenericRequestBody.builder() .operation(GenericRequestBody.OperationEnum.READ) .cmHandleProperties(cmHandlePropertiesMap) .build(); - return prepareOperationBody(requetBodyObject); + return prepareOperationBody(requestBodyObject); } private void parseAndUpdateCmHandlesInDmiRegistration(final DmiPluginRegistration dmiPluginRegistration) { @@ -295,10 +299,7 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService cpsDataService.updateNodeLeavesAndExistingDescendantLeaves(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR, "/dmi-registry", cmHandlesJsonData, NO_TIMESTAMP); } catch (final JsonProcessingException e) { - log.error("Parsing error occurred while converting Object to JSON DMI Registry."); - throw new DataValidationException( - "Parsing error occurred while processing DMI Plugin Registration" + dmiPluginRegistration, e - .getMessage(), e); + handleJsonProcessingException(dmiPluginRegistration, e); } } @@ -310,26 +311,40 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService final PersistenceCmHandle persistenceCmHandle = toPersistenceCmHandle(dmiPluginRegistration.getDmiPlugin(), cmHandle); persistenceCmHandlesList.add(persistenceCmHandle); - createAnchorAndSyncModel(persistenceCmHandle); } final String cmHandleJsonData = objectMapper.writeValueAsString(persistenceCmHandlesList); - cpsDataService.saveListNodeData(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR, "/dmi-registry", - cmHandleJsonData, NO_TIMESTAMP); + + registerAndSyncNode(persistenceCmHandlesList, cmHandleJsonData); } catch (final JsonProcessingException e) { - log.error("Parsing error occurred while converting Object to JSON for DMI Registry."); - throw new DataValidationException( - "Parsing error occurred while processing DMI Plugin Registration" + dmiPluginRegistration, e - .getMessage(), e); + handleJsonProcessingException(dmiPluginRegistration, e); } } - private PersistenceCmHandle toPersistenceCmHandle(final String dmiPluginService, - final CmHandle cmHandle) { + private static void handleJsonProcessingException(final DmiPluginRegistration dmiPluginRegistration, + final JsonProcessingException e) { + final String message = "Parsing error occurred while processing DMI Plugin Registration" + + dmiPluginRegistration; + log.error(message); + throw new DataValidationException(message, e.getMessage(), e); + } + + private void registerAndSyncNode(final PersistenceCmHandlesList persistenceCmHandlesList, + final String cmHandleJsonData) { + cpsDataService.saveListNodeData(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR, "/dmi-registry", + cmHandleJsonData, NO_TIMESTAMP); + + for (final PersistenceCmHandle persistenceCmHandle : persistenceCmHandlesList.getPersistenceCmHandles()) { + createAnchorAndSyncModel(persistenceCmHandle); + } + } + + private static PersistenceCmHandle toPersistenceCmHandle(final String dmiPluginService, + final CmHandle cmHandle) { final PersistenceCmHandle persistenceCmHandle = new PersistenceCmHandle(); persistenceCmHandle.setDmiServiceName(dmiPluginService); persistenceCmHandle.setId(cmHandle.getCmHandleID()); if (cmHandle.getCmHandleProperties() == null) { - persistenceCmHandle.setAdditionalProperties(Collections.EMPTY_MAP); + persistenceCmHandle.setAdditionalProperties(Collections.emptyMap()); } else { persistenceCmHandle.setAdditionalProperties(cmHandle.getCmHandleProperties()); } @@ -350,31 +365,64 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService protected void createAnchorAndSyncModel(final PersistenceCmHandle cmHandle) { final var modulesForCmHandle = dmiOperations.getResourceFromDmi(cmHandle.getDmiServiceName(), cmHandle.getId(), "modules"); - - final List<ModuleReference> moduleReferencesFromDmiForCmHandle = getModuleReferences(modulesForCmHandle); - - final var knownModuleReferencesInCps = cpsModuleService.getAllYangResourcesModuleReferences(); - + final List<ModuleReference> moduleReferencesFromDmiForCmHandle = + getModuleReferences(modulesForCmHandle); + final var knownModuleReferencesInCps = + cpsModuleService.getYangResourceModuleReferences(NF_PROXY_DATASPACE_NAME); final List<ModuleReference> existingModuleReferences = new ArrayList<>(); + + final List<ModuleReference> unknownModuleReferences = new ArrayList<>(); for (final ModuleReference moduleReferenceFromDmiForCmHandle : moduleReferencesFromDmiForCmHandle) { if (knownModuleReferencesInCps.contains(moduleReferenceFromDmiForCmHandle)) { existingModuleReferences.add(moduleReferenceFromDmiForCmHandle); + } else { + unknownModuleReferences.add(moduleReferenceFromDmiForCmHandle); } } + final JsonObject requestBodyAsJson = getRequestBodyAsJson(unknownModuleReferences); + final Map<String, String> newYangResourcesModuleNameToContentMap = - getNewYangResources(cmHandle); + getNewYangResources(cmHandle, requestBodyAsJson.toString()); - cpsModuleService.createSchemaSetFromModules(NCMP_DATASPACE_NAME, cmHandle.getId(), + cpsModuleService.createSchemaSetFromModules(NF_PROXY_DATASPACE_NAME, cmHandle.getId(), newYangResourcesModuleNameToContentMap, existingModuleReferences); - cpsAdminService.createAnchor(NCMP_DATASPACE_NAME, cmHandle.getId(), cmHandle.getId()); + cpsAdminService.createAnchor(NF_PROXY_DATASPACE_NAME, cmHandle.getId(), cmHandle.getId()); + } + + private static JsonObject getRequestBodyAsJson(final List<ModuleReference> unknownModuleReferences) { + + final JsonObject requestBodyAsJson = new JsonObject(); + requestBodyAsJson.addProperty("operation", "read"); + + final JsonArray moduleReferencesAsJson = getModuleReferencesAsJson(unknownModuleReferences); + + final JsonObject data = new JsonObject(); + data.add("modules", moduleReferencesAsJson); + requestBodyAsJson.add("data", data); + + return requestBodyAsJson; } - private Map<String, String> getNewYangResources(final PersistenceCmHandle cmHandle) { - final var moduleResourcesAsJsonString = dmiOperations.getResourceFromDmi( - cmHandle.getDmiServiceName(), cmHandle.getId(), "moduleResources"); - final JsonArray moduleResources = new Gson().fromJson(moduleResourcesAsJsonString.getBody(), JsonArray.class); + private static JsonArray getModuleReferencesAsJson(final List<ModuleReference> unknownModuleReferences) { + final JsonArray moduleReferences = new JsonArray(); + + for (final ModuleReference moduleReference : unknownModuleReferences) { + final JsonObject moduleReferenceAsJson = new JsonObject(); + moduleReferenceAsJson.addProperty("name", moduleReference.getModuleName()); + moduleReferenceAsJson.addProperty(REVISION, moduleReference.getRevision()); + moduleReferences.add(moduleReferenceAsJson); + } + return moduleReferences; + } + + private Map<String, String> getNewYangResources(final PersistenceCmHandle cmHandle, final String jsonData) { + final var moduleResourcesAsJsonString = dmiOperations.getResourceFromDmiWithJsonData( + cmHandle.getDmiServiceName(), jsonData, cmHandle.getId(), "moduleResources"); + + final JsonArray moduleResources = new Gson().fromJson(moduleResourcesAsJsonString.getBody(), + JsonArray.class); final Map<String, String> newYangResourcesModuleNameToContentMap = new HashMap<>(); for (final JsonElement moduleResource : moduleResources) { @@ -384,29 +432,34 @@ public class NetworkCmProxyDataServiceImpl implements NetworkCmProxyDataService return newYangResourcesModuleNameToContentMap; } - private YangResource toYangResource(final JsonObject yangResourceAsJson) { + private static YangResource toYangResource(final JsonObject yangResourceAsJson) { final YangResource yangResource = new YangResource(); yangResource.setModuleName(yangResourceAsJson.get("moduleName").getAsString()); yangResource.setRevision(yangResourceAsJson.get("revision").getAsString()); - yangResource.setYangSource(yangResourceAsJson.get("yangSource").getAsString()); + final String yangSourceJson = yangResourceAsJson.get("yangSource").getAsString(); + + String yangSource = JsonUtils.removeWrappingTokens(yangSourceJson); + yangSource = JsonUtils.removeRedundantEscapeCharacters(yangSource); + yangResource.setYangSource(yangSource); + return yangResource; } - private List<ModuleReference> getModuleReferences(final ResponseEntity<String> response) { + private static List<ModuleReference> getModuleReferences(final ResponseEntity<String> response) { final List<ModuleReference> modulesFromDmiForCmHandle = new ArrayList<>(); final JsonObject convertedObject = new Gson().fromJson(response.getBody(), JsonObject.class); final JsonArray moduleReferencesAsJson = convertedObject.getAsJsonArray("schemas"); for (final JsonElement moduleReferenceAsJson : moduleReferencesAsJson) { - final ModuleReference moduleReference = toModuleReference((JsonObject) moduleReferenceAsJson); + final ModuleReference moduleReference = + toModuleReference((JsonObject) moduleReferenceAsJson); modulesFromDmiForCmHandle.add(moduleReference); } return modulesFromDmiForCmHandle; } - private ModuleReference toModuleReference(final JsonObject moduleReferenceAsJson) { + private static ModuleReference toModuleReference(final JsonObject moduleReferenceAsJson) { final var moduleReference = new ModuleReference(); - moduleReference.setName(moduleReferenceAsJson.get("moduleName").getAsString()); - moduleReference.setNamespace(NO_NAMESPACE); + moduleReference.setModuleName(moduleReferenceAsJson.get("moduleName").getAsString()); moduleReference.setRevision(moduleReferenceAsJson.get("revision").getAsString()); return moduleReference; } diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/client/DmiRestClient.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/client/DmiRestClient.java index af691f6341..fc70708f92 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/client/DmiRestClient.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/client/DmiRestClient.java @@ -46,10 +46,18 @@ public class DmiRestClient { return restTemplate.exchange(dmiResourceUrl, HttpMethod.PUT, httpEntity, Object.class); } - public ResponseEntity<Void> postOperationWithJsonData(final String dmiResourceUrl, - final String jsonData, final HttpHeaders headers) { - final var httpEntity = new HttpEntity<>(jsonData, configureHttpHeaders(headers)); - return restTemplate.postForEntity(dmiResourceUrl, httpEntity, Void.class); + /** + * Sends POST operation to DMI with json body containing module references. + * @param dmiResourceUrl dmi resource url + * @param jsonData json data body + * @param httpHeaders http headers + * @return response entity of type String + */ + public ResponseEntity<String> postOperationWithJsonData(final String dmiResourceUrl, + final String jsonData, + final HttpHeaders httpHeaders) { + final var httpEntity = new HttpEntity<>(jsonData, configureHttpHeaders(httpHeaders)); + return restTemplate.postForEntity(dmiResourceUrl, httpEntity, String.class); } private HttpHeaders configureHttpHeaders(final HttpHeaders httpHeaders) { @@ -58,6 +66,12 @@ public class DmiRestClient { return httpHeaders; } + /** + * Sends POST operation to DMI. + * @param dmiResourceUrl dmi resource url + * @param httpHeaders http headers + * @return response entity of type String + */ public ResponseEntity<String> postOperation(final String dmiResourceUrl, final HttpHeaders httpHeaders) { final var httpEntity = new HttpEntity<>(configureHttpHeaders(httpHeaders)); return restTemplate.exchange(dmiResourceUrl, HttpMethod.POST, httpEntity, String.class); diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/config/NcmpConfiguration.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/config/NcmpConfiguration.java index a834bfcd90..c4e82d3290 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/config/NcmpConfiguration.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/config/NcmpConfiguration.java @@ -41,7 +41,7 @@ public class NcmpConfiguration { } @Bean - public RestTemplate restTemplate(final RestTemplateBuilder restTemplateBuilder) { + public static RestTemplate restTemplate(final RestTemplateBuilder restTemplateBuilder) { return restTemplateBuilder.build(); } -}
\ No newline at end of file +} diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/exception/NcmpException.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/exception/NcmpException.java index ff53464096..2c75b5d992 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/exception/NcmpException.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/exception/NcmpException.java @@ -43,17 +43,5 @@ public class NcmpException extends RuntimeException { this.details = details; } - /** - * Constructor. - * - * @param message the error message - * @param details the error details - * @param cause the cause of the exception - */ - public NcmpException(final String message, final String details, final Throwable cause) { - super(message, cause); - this.details = details; - } - } diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/operation/DmiOperations.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/operation/DmiOperations.java index d6feaf3adf..71af3d4cfe 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/operation/DmiOperations.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/operation/DmiOperations.java @@ -76,7 +76,23 @@ public class DmiOperations { final var dmiResourceDataUrl = getDmiResourceUrl(dmiServiceName, cmHandle, resourceName); final var httpHeaders = new HttpHeaders(); return dmiRestClient.postOperation(dmiResourceDataUrl, httpHeaders); + } + /** + * Get resources from DMI for modules. + * + * @param dmiServiceName dmi service name + * @param jsonData module names and revisions as JSON + * @param cmHandle cmHandle + * @param resourceName name of the resource(s) + * @return {@code ResponseEntity} response entity + */ + public ResponseEntity<String> getResourceFromDmiWithJsonData(final String dmiServiceName, + final String jsonData, + final String cmHandle, + final String resourceName) { + final String dmiResourceDataUrl = getDmiResourceUrl(dmiServiceName, cmHandle, resourceName); + return dmiRestClient.postOperationWithJsonData(dmiResourceDataUrl, jsonData, new HttpHeaders()); } /** @@ -141,7 +157,7 @@ public class DmiOperations { * @param jsonBody json body for put operation * @return {@code ResponseEntity} response entity */ - public ResponseEntity<Void> createResourceDataPassThroughRunningFromDmi(final String dmiServiceName, + public ResponseEntity<String> createResourceDataPassThroughRunningFromDmi(final String dmiServiceName, final String cmHandle, final String resourceId, final String jsonBody) { diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/PersistenceCmHandlesList.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/PersistenceCmHandlesList.java index beeb00f116..f35abf60b6 100644 --- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/PersistenceCmHandlesList.java +++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/models/PersistenceCmHandlesList.java @@ -23,11 +23,13 @@ package org.onap.cps.ncmp.api.models; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.ArrayList; import java.util.List; +import lombok.Getter; +@Getter public class PersistenceCmHandlesList { @JsonProperty("cm-handles") - private List<PersistenceCmHandle> persistenceCmHandles; + private List<PersistenceCmHandle> persistenceCmHandles = new ArrayList<>(); /** * Add a persistenceCmHandle. @@ -35,10 +37,6 @@ public class PersistenceCmHandlesList { * @param persistenceCmHandle the persistenceCmHandle to add */ public void add(final PersistenceCmHandle persistenceCmHandle) { - if (persistenceCmHandles == null) { - persistenceCmHandles = new ArrayList<>(); - } persistenceCmHandles.add(persistenceCmHandle); } - } |