/* * Copyright © 2016-2017 European Support Limited * * 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. */ package org.openecomp.core.impl; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.openecomp.core.converter.errors.CreateToscaObjectErrorBuilder; import org.openecomp.sdc.common.errors.CoreException; import org.openecomp.sdc.logging.api.Logger; import org.openecomp.sdc.logging.api.LoggerFactory; import java.lang.reflect.Field; import java.util.HashSet; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; public class ToscaConverterUtil { private static final String SET = "set"; private static final String DEFAULT = "default"; private static final String DEFAULT_CAPITAL = "Default"; private static final Set DEFAULT_VALUE_KEYS; private static final Logger LOGGER = LoggerFactory.getLogger(ToscaConverterUtil.class); static { DEFAULT_VALUE_KEYS = Stream.of(DEFAULT, DEFAULT_CAPITAL).collect(Collectors.toSet()); } private ToscaConverterUtil() { // static utility methods only, prevent instantiation } public static Optional createObjectFromClass(String objectId, Object objectCandidate, Class classToCreate) { try { return createObjectUsingSetters(objectCandidate, classToCreate); } catch (Exception ex) { throw new CoreException( new CreateToscaObjectErrorBuilder(classToCreate.getSimpleName(), objectId) .build(), ex); } } private static Optional createObjectUsingSetters(Object objectCandidate, Class classToCreate) throws ReflectiveOperationException { if (Objects.isNull(objectCandidate) || !(objectCandidate instanceof Map)) { return Optional.empty(); } Map objectAsMap = (Map) objectCandidate; Field[] classFields = classToCreate.getDeclaredFields(); T result = classToCreate.newInstance(); for (Field field : classFields) { Object fieldValueToAssign = objectAsMap.get(field.getName()); String methodName = SET + StringUtils.capitalize(field.getName()); if(shouldSetterMethodNeedsToGetInvoked(classToCreate, field, fieldValueToAssign, methodName)) { classToCreate.getMethod(methodName, field.getType()).invoke(result, fieldValueToAssign); } } return Optional.of(result); } private static boolean shouldSetterMethodNeedsToGetInvoked(Class classToCreate, Field field, Object fieldValueToAssign, String methodName) { try { return Objects.nonNull(fieldValueToAssign) && Objects.nonNull(classToCreate.getMethod(methodName, field.getType())); } catch (NoSuchMethodException e) { LOGGER.debug(String.format("Could not extract method '%s' from class '%s'. returning false " + "with filedType '%s'.", methodName, classToCreate, field.getType()), e); return false; } } public static Optional getDefaultValue(Object entryValue, Object objectToAssignDefaultValue) { if (!(entryValue instanceof Map) || Objects.isNull(objectToAssignDefaultValue)) { return Optional.empty(); } return Optional.ofNullable(getDefaultParameterValue((Map) entryValue)); } private static Object getDefaultParameterValue(Map entryValue) { Object defaultValue = null; Set keys = new HashSet<>(entryValue.keySet()); keys.retainAll(DEFAULT_VALUE_KEYS); if (CollectionUtils.isNotEmpty(keys)) { defaultValue = entryValue.get(keys.iterator().next()); } return defaultValue; } }