/* * Copyright 2016-present Open Networking Laboratory * * 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.onosproject.yms.app.yob; import org.onosproject.yangutils.datamodel.YangLeafList; import org.onosproject.yangutils.datamodel.YangSchemaNode; import org.onosproject.yangutils.datamodel.YangType; import org.onosproject.yangutils.datamodel.javadatamodel.JavaQualifiedTypeInfoContainer; import org.onosproject.yms.app.ydt.YdtExtendedContext; import org.onosproject.yms.app.yob.exception.YobException; import org.onosproject.yms.app.ysr.YangSchemaRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.util.Set; import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.IDENTITYREF; import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase; import static org.onosproject.yms.app.ydt.AppType.YOB; import static org.onosproject.yms.app.yob.YobConstants.ADD_TO; import static org.onosproject.yms.app.yob.YobConstants.E_FAIL_TO_INVOKE_METHOD; import static org.onosproject.yms.app.yob.YobConstants.L_FAIL_TO_INVOKE_METHOD; /** * Represents a multi instance leaf node handler in YANG object builder. */ class YobMultiInstanceLeafHandler extends YobHandler { private static final Logger log = LoggerFactory.getLogger(YobMultiInstanceLeafHandler.class); @Override public void createBuilder(YdtExtendedContext curNode, YdtExtendedContext rootNode, YangSchemaRegistry registry) { // For multi instance leaf no need to create an object. } @Override public void buildObject(YdtExtendedContext ydtNode, YdtExtendedContext ydtRootNode, YangSchemaRegistry schemaRegistry) { // For multi instance leaf no need to build object. } /** * Set the leaf list values in the YANG object. * * @param leafListNode leaf list YDT node * @param schemaRegistry YANG schema registry * @throws YobException if failed to invoke the leaf list's setter */ @Override public void setInParent(YdtExtendedContext leafListNode, YangSchemaRegistry schemaRegistry) { Class<?> parentBuilderClass = null; YangSchemaNode yangSchemaNode = leafListNode.getYangSchemaNode(); while (yangSchemaNode.getReferredSchema() != null) { yangSchemaNode = yangSchemaNode.getReferredSchema(); } YdtExtendedContext parentYdtNode = (YdtExtendedContext) leafListNode.getParent(); YobWorkBench parentYobWorkBench = (YobWorkBench) parentYdtNode.getAppInfo(YOB); Set<String> valueSet = leafListNode.getValueSet(); for (String value : valueSet) { try { String setterInParent = yangSchemaNode.getJavaAttributeName(); Object builderObject = parentYobWorkBench .getParentBuilder(leafListNode, schemaRegistry); parentBuilderClass = builderObject.getClass(); Field leafName = parentBuilderClass .getDeclaredField(setterInParent); ParameterizedType genericListType = (ParameterizedType) leafName.getGenericType(); Class<?> genericListClass; if (((YangLeafList) leafListNode.getYangSchemaNode()) .getDataType().getDataType() == IDENTITYREF) { ParameterizedType type = (ParameterizedType) genericListType.getActualTypeArguments()[0]; genericListClass = type.getClass().getClass(); } else { genericListClass = (Class<?>) genericListType.getActualTypeArguments()[0]; } Method setterMethod = parentBuilderClass.getDeclaredMethod( ADD_TO + getCapitalCase(setterInParent), genericListClass); JavaQualifiedTypeInfoContainer javaQualifiedType = (JavaQualifiedTypeInfoContainer) yangSchemaNode; YangType<?> yangType = ((YangLeafList) javaQualifiedType).getDataType(); YobUtils.setDataFromStringValue(yangType.getDataType(), value, setterMethod, builderObject, leafListNode); } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException | NoSuchFieldException e) { log.error(L_FAIL_TO_INVOKE_METHOD, parentBuilderClass.getName()); throw new YobException(E_FAIL_TO_INVOKE_METHOD + parentBuilderClass.getName()); } } } }