BeanUtils upgrade to 1.9.x
Transitive dependency to beanutils 1.8.3 removed.
Refactor of existing usage of beanutils proposed.
Change-Id: I6614a5794979225376338c778b25f71911ae9c50
Issue-ID: SDC-2269
Signed-off-by: Tomasz Golabek <tomasz.golabek@nokia.com>
diff --git a/asdctool/pom.xml b/asdctool/pom.xml
index d7ac069..9f9dc56 100644
--- a/asdctool/pom.xml
+++ b/asdctool/pom.xml
@@ -210,16 +210,9 @@
</dependency>
<dependency>
- <groupId>commons-configuration</groupId>
- <artifactId>commons-configuration</artifactId>
- <version>1.6</version>
- <scope>compile</scope>
- <exclusions>
- <exclusion>
- <artifactId>commons-collections</artifactId>
- <groupId>commons-collections</groupId>
- </exclusion>
- </exclusions>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-configuration2</artifactId>
+ <version>${commons-configuration}</version>
</dependency>
<dependency>
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/externalupload/utils/ServiceUtils.java b/catalog-be/src/main/java/org/openecomp/sdc/externalupload/utils/ServiceUtils.java
index 20501ef..47e676d 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/externalupload/utils/ServiceUtils.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/externalupload/utils/ServiceUtils.java
@@ -12,16 +12,19 @@
* 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=========================================================
+ * Modifications copyright (c) 2019 Nokia
+ * ================================================================================
*/
package org.openecomp.sdc.externalupload.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.ImmutableSet;
-import org.apache.commons.beanutils.BeanUtils;
import java.lang.reflect.Field;
import java.util.*;
+import org.onap.sdc.tosca.services.CommonUtil;
public class ServiceUtils {
@@ -38,20 +41,11 @@
}
Map<String, Object> objectAsMap = getObjectAsMap(objectCandidate);
- T result = classToCreate.newInstance();
List<Field> declaredFields = getAllFields(classToCreate);
- for( Field field : declaredFields){
- if(isComplexClass(field)){
- Optional<?> objectUsingSetters =
- createObjectUsingSetters(objectAsMap.get(field.getName()), field.getType());
- if( objectUsingSetters.isPresent()){
- objectAsMap.remove(field.getName());
- objectAsMap.put(field.getName(), objectUsingSetters.get());
- }
- }
- }
- BeanUtils.populate(result, objectAsMap);
+
+ CommonUtil.createSubObjectsUsingSetters(objectAsMap, declaredFields.toArray(new Field[0]));
+ T result = CommonUtil.populateBean(objectAsMap, classToCreate);
return Optional.of(result);
}
diff --git a/common/onap-common-configuration-management/onap-configuration-management-core/pom.xml b/common/onap-common-configuration-management/onap-configuration-management-core/pom.xml
index 2aa4226..7f978bf 100755
--- a/common/onap-common-configuration-management/onap-configuration-management-core/pom.xml
+++ b/common/onap-common-configuration-management/onap-configuration-management-core/pom.xml
@@ -41,7 +41,12 @@
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-configuration2</artifactId>
- <version>2.3</version>
+ <version>${commons-configuration}</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-beanutils</groupId>
+ <artifactId>commons-beanutils</artifactId>
+ <version>${commons-beanutils}</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
@@ -49,10 +54,6 @@
<version>${commons-logging}</version>
</dependency>
<dependency>
- <groupId>commons-beanutils</groupId>
- <artifactId>commons-beanutils</artifactId>
- </dependency>
- <dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
diff --git a/common/onap-tosca-datatype/pom.xml b/common/onap-tosca-datatype/pom.xml
index 51c557f..eb0a31c 100644
--- a/common/onap-tosca-datatype/pom.xml
+++ b/common/onap-tosca-datatype/pom.xml
@@ -42,7 +42,7 @@
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
- <version>${commons.beanutils.version}</version>
+ <version>${commons-beanutils}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
diff --git a/common/onap-tosca-datatype/src/main/java/org/onap/sdc/tosca/services/CommonUtil.java b/common/onap-tosca-datatype/src/main/java/org/onap/sdc/tosca/services/CommonUtil.java
index 4ecf869..fdbcb25 100644
--- a/common/onap-tosca-datatype/src/main/java/org/onap/sdc/tosca/services/CommonUtil.java
+++ b/common/onap-tosca-datatype/src/main/java/org/onap/sdc/tosca/services/CommonUtil.java
@@ -12,12 +12,14 @@
* 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=========================================================
+ * Modifications copyright (c) 2019 Nokia
+ * ================================================================================
*/
-
package org.onap.sdc.tosca.services;
-
import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
@@ -25,10 +27,10 @@
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
-import org.apache.commons.beanutils.BeanUtils;
import com.google.common.collect.ImmutableSet;
import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.commons.beanutils.BeanUtils;
public class CommonUtil {
@@ -47,9 +49,16 @@
return Optional.empty();
}
Map<String, Object> objectAsMap = getObjectAsMap(objectCandidate);
- T result = classToCreate.newInstance();
Field[] declaredFields = classToCreate.getDeclaredFields();
+ createSubObjectsUsingSetters(objectAsMap, declaredFields);
+ T result = populateBean(objectAsMap, classToCreate);
+
+ return Optional.of(result);
+ }
+
+ public static void createSubObjectsUsingSetters(Map<String, Object> objectAsMap, Field[] declaredFields)
+ throws Exception {
for (Field field : declaredFields) {
if (isComplexClass(field)) {
Optional<?> objectUsingSetters =
@@ -60,9 +69,13 @@
}
}
}
- BeanUtils.populate(result, objectAsMap);
+ }
- return Optional.of(result);
+ public static <T> T populateBean(Map<String, Object> propertiesMap, Class<T> classToCreate)
+ throws IllegalAccessException, InstantiationException, InvocationTargetException {
+ T result = classToCreate.newInstance();
+ BeanUtils.populate(result, propertiesMap);
+ return result;
}
public static Map<String, Object> getObjectAsMap(Object obj) {
diff --git a/common/onap-tosca-datatype/src/test/java/org/onap/sdc/tosca/services/CommonUtilTest.java b/common/onap-tosca-datatype/src/test/java/org/onap/sdc/tosca/services/CommonUtilTest.java
new file mode 100644
index 0000000..d9d7f69
--- /dev/null
+++ b/common/onap-tosca-datatype/src/test/java/org/onap/sdc/tosca/services/CommonUtilTest.java
@@ -0,0 +1,45 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2019 Nokia Intellectual Property. 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.onap.sdc.tosca.services;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.HashMap;
+import java.util.Map;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class CommonUtilTest {
+
+ private static final String INT_FIELD_KEY = "field1";
+ private static final Integer INT_FIELD_VALUE = 1;
+ private static final String STRING_FIELD_KEY = "field2";
+ private static final String STRING_FIELD_VALUE = "abc";
+
+ @Test
+ public void testPopulateBeanMethod()
+ throws InstantiationException, IllegalAccessException, InvocationTargetException {
+ Map<String, Object> props = new HashMap<>();
+ props.put(INT_FIELD_KEY, INT_FIELD_VALUE);
+ props.put(STRING_FIELD_KEY, STRING_FIELD_VALUE);
+ TestModel testModel = CommonUtil.populateBean(props, TestModel.class);
+ Assert.assertEquals(testModel.getField1(), INT_FIELD_VALUE);
+ Assert.assertEquals(testModel.getField2(), STRING_FIELD_VALUE);
+ }
+}
\ No newline at end of file
diff --git a/common/onap-tosca-datatype/src/test/java/org/onap/sdc/tosca/services/TestModel.java b/common/onap-tosca-datatype/src/test/java/org/onap/sdc/tosca/services/TestModel.java
new file mode 100644
index 0000000..e8fc346
--- /dev/null
+++ b/common/onap-tosca-datatype/src/test/java/org/onap/sdc/tosca/services/TestModel.java
@@ -0,0 +1,32 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2019 Nokia Intellectual Property. 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.onap.sdc.tosca.services;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Setter
+@Getter
+@NoArgsConstructor
+public class TestModel {
+ private Integer field1;
+ private String field2;
+}
diff --git a/onboarding/pom.xml b/onboarding/pom.xml
index dcd952c..e518b73 100644
--- a/onboarding/pom.xml
+++ b/onboarding/pom.xml
@@ -70,7 +70,6 @@
<bsh.version>2.0b5</bsh.version>
<cglib.nodep.version>3.2.4</cglib.nodep.version>
<classmate.version>1.3.3</classmate.version>
- <commons.beanutils.version>1.9.3</commons.beanutils.version>
<commons.codec.version>1.10</commons.codec.version>
<commons.collections.version>4.1</commons.collections.version>
<commons.digester.version>2.1</commons.digester.version>
@@ -221,7 +220,7 @@
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
- <version>${commons.beanutils.version}</version>
+ <version>${commons-beanutils}</version>
</dependency>
<dependency>
<groupId>com.google.code.findbugs</groupId>
diff --git a/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/services/OrchestrationTemplateCandidateImpl.java b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/services/OrchestrationTemplateCandidateImpl.java
index 4978b3f..5cf6f40 100644
--- a/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/services/OrchestrationTemplateCandidateImpl.java
+++ b/openecomp-be/api/openecomp-sdc-rest-webapp/vendor-software-products-rest/vendor-software-products-rest-services/src/main/java/org/openecomp/sdcrests/vsp/rest/services/OrchestrationTemplateCandidateImpl.java
@@ -12,14 +12,15 @@
* 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=========================================================
+ * Modifications copyright (c) 2019 Nokia
+ * ================================================================================
*/
package org.openecomp.sdcrests.vsp.rest.services;
-import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.cxf.jaxrs.ext.multipart.Attachment;
-import org.openecomp.core.validation.errors.ErrorMessagesFormatBuilder;
import org.openecomp.sdc.activitylog.ActivityLogManager;
import org.openecomp.sdc.activitylog.ActivityLogManagerFactory;
import org.openecomp.sdc.activitylog.dao.type.ActivityLogEntity;
@@ -56,7 +57,6 @@
import javax.ws.rs.core.Response;
import java.io.ByteArrayInputStream;
import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -125,7 +125,7 @@
@Override
public Response get(String vspId, String versionId, String user) throws IOException {
Optional<Pair<String, byte[]>> zipFile = candidateManager.get(vspId, new Version(versionId));
- String fileName = null;
+ String fileName;
if (zipFile.isPresent()) {
fileName = "Candidate." + zipFile.get().getLeft();
} else {
@@ -147,14 +147,13 @@
}
@Override
- public Response abort(String vspId, String versionId) throws Exception {
+ public Response abort(String vspId, String versionId) {
candidateManager.abort(vspId, new Version(versionId));
return Response.ok().build();
}
@Override
- public Response process(String vspId, String versionId, String user)
- throws InvocationTargetException, IllegalAccessException {
+ public Response process(String vspId, String versionId, String user) {
Version version = new Version(versionId);
OrchestrationTemplateActionResponse response = candidateManager.process(vspId, version);
@@ -162,27 +161,17 @@
activityLogManager.logActivity(new ActivityLogEntity(vspId, version,
ActivityType.Upload_Network_Package, user, true, "", ""));
- OrchestrationTemplateActionResponseDto responseDto =
- new OrchestrationTemplateActionResponseDto();
- BeanUtils.copyProperties(responseDto, response);
+ OrchestrationTemplateActionResponseDto responseDto = copyOrchestrationTemplateActionResponseToDto(response);
return Response.ok(responseDto).build();
}
@Override
public Response updateFilesDataStructure(
- String vspId, String versionId, FileDataStructureDto fileDataStructureDto, String user)
- throws Exception {
+ String vspId, String versionId, FileDataStructureDto fileDataStructureDto, String user) {
- FilesDataStructure fileDataStructure = new FilesDataStructure();
- try {
- BeanUtils.copyProperties(fileDataStructure, fileDataStructureDto);
- } catch (IllegalAccessException | InvocationTargetException exception) {
- String errorWithParameters = ErrorMessagesFormatBuilder
- .getErrorWithParameters(Messages.MAPPING_OBJECTS_FAILURE.getErrorMessage(),
- fileDataStructureDto.toString(), fileDataStructure.toString());
- throw new OrchestrationTemplateCandidateException(errorWithParameters, exception);
- }
+ FilesDataStructure fileDataStructure = copyFilesDataStructureDtoToFilesDataStructure(fileDataStructureDto);
+
ValidationResponse response = candidateManager
.updateFilesDataStructure(vspId, new Version(versionId), fileDataStructure);
@@ -195,8 +184,7 @@
}
@Override
- public Response getFilesDataStructure(String vspId, String versionId, String user)
- throws Exception {
+ public Response getFilesDataStructure(String vspId, String versionId, String user) {
Optional<FilesDataStructure> filesDataStructure =
candidateManager.getFilesDataStructure(vspId, new Version(versionId));
if (!filesDataStructure.isPresent()) {
@@ -211,4 +199,21 @@
return Response.ok(fileDataStructureDto).build();
}
+ private OrchestrationTemplateActionResponseDto copyOrchestrationTemplateActionResponseToDto(OrchestrationTemplateActionResponse response){
+ OrchestrationTemplateActionResponseDto result = new OrchestrationTemplateActionResponseDto();
+ result.setErrors(response.getErrors());
+ result.setFileNames(response.getFileNames());
+ result.setStatus(response.getStatus());
+ return result;
+ }
+
+ private FilesDataStructure copyFilesDataStructureDtoToFilesDataStructure(FileDataStructureDto fileDataStructureDto){
+ FilesDataStructure filesDataStructure = new FilesDataStructure();
+ filesDataStructure.setArtifacts(fileDataStructureDto.getArtifacts());
+ filesDataStructure.setModules(fileDataStructureDto.getModules());
+ filesDataStructure.setNested(fileDataStructureDto.getNested());
+ filesDataStructure.setUnassigned(fileDataStructureDto.getUnassigned());
+ return filesDataStructure;
+ }
+
}
diff --git a/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/utils/CommonUtil.java b/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/utils/CommonUtil.java
index 7d37a55..fcb668f 100644
--- a/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/utils/CommonUtil.java
+++ b/openecomp-be/lib/openecomp-common-lib/src/main/java/org/openecomp/sdc/common/utils/CommonUtil.java
@@ -12,14 +12,15 @@
* 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=========================================================
+ * Modifications copyright (c) 2019 Nokia
+ * ================================================================================
*/
package org.openecomp.sdc.common.utils;
-import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.Multimap;
-import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.tuple.ImmutablePair;
@@ -176,27 +177,7 @@
public static <T> Optional<T> createObjectUsingSetters(Object objectCandidate,
Class<T> classToCreate)
throws Exception {
- if (Objects.isNull(objectCandidate)) {
- return Optional.empty();
- }
-
- Map<String, Object> objectAsMap = getObjectAsMap(objectCandidate);
- T result = classToCreate.newInstance();
-
- Field[] declaredFields = classToCreate.getDeclaredFields();
- for( Field field : declaredFields){
- if(isComplexClass(field)){
- Optional<?> objectUsingSetters =
- createObjectUsingSetters(objectAsMap.get(field.getName()), field.getType());
- if( objectUsingSetters.isPresent()){
- objectAsMap.remove(field.getName());
- objectAsMap.put(field.getName(), objectUsingSetters.get());
- }
- }
- }
- BeanUtils.populate(result, objectAsMap);
-
- return Optional.of(result);
+ return org.onap.sdc.tosca.services.CommonUtil.createObjectUsingSetters(objectCandidate, classToCreate);
}
private static boolean isComplexClass(Field field) {
@@ -211,15 +192,7 @@
}
public static Map<String, Object> getObjectAsMap(Object obj) {
- Map<String, Object> objectAsMap = obj instanceof Map ? (Map<String, Object>) obj
- : new ObjectMapper().convertValue(obj, Map.class);
-
- if (objectAsMap.containsKey(DEFAULT)) {
- Object defaultValue = objectAsMap.get(DEFAULT);
- objectAsMap.remove(DEFAULT);
- objectAsMap.put(_DEFAULT, defaultValue);
- }
- return objectAsMap;
+ return org.onap.sdc.tosca.services.CommonUtil.getObjectAsMap(obj);
}
public static <K, V> boolean isMultimapEmpty(Multimap<K, V> obj) {
diff --git a/pom.xml b/pom.xml
index 0df3e36..cd1db89 100644
--- a/pom.xml
+++ b/pom.xml
@@ -48,6 +48,8 @@
<ecomp.version>2.4.0</ecomp.version>
<cassandra.unit.version>3.5.0.1</cassandra.unit.version>
<lombok.version>1.18.2</lombok.version>
+ <commons-beanutils>1.9.3</commons-beanutils>
+ <commons-configuration>2.3</commons-configuration>
<commons.collections.version>4.1</commons.collections.version>