blob: 19c39d7770e274a1ccdb051197b828e83a79f67f [file] [log] [blame]
Rama-Huaweib711e5c2016-08-31 07:55:46 +05301/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
Rama-Huaweib711e5c2016-08-31 07:55:46 +05303 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.yms.app.yob;
18
19
20import org.onosproject.yangutils.datamodel.YangLeafList;
21import org.onosproject.yangutils.datamodel.YangSchemaNode;
22import org.onosproject.yangutils.datamodel.YangType;
23import org.onosproject.yangutils.datamodel.javadatamodel.JavaQualifiedTypeInfoContainer;
24import org.onosproject.yms.app.ydt.YdtExtendedContext;
VinodKumarS-Huawei7b1733c2016-10-25 13:44:26 +053025import org.onosproject.yms.app.yob.exception.YobException;
Rama-Huaweib711e5c2016-08-31 07:55:46 +053026import org.onosproject.yms.app.ysr.YangSchemaRegistry;
27import org.slf4j.Logger;
28import org.slf4j.LoggerFactory;
29
30import java.lang.reflect.Field;
31import java.lang.reflect.InvocationTargetException;
32import java.lang.reflect.Method;
33import java.lang.reflect.ParameterizedType;
34import java.util.Set;
35
Vidyashree Rama6160be12016-11-24 13:43:31 +053036import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.IDENTITYREF;
Rama-Huaweib711e5c2016-08-31 07:55:46 +053037import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
38import static org.onosproject.yms.app.ydt.AppType.YOB;
39import static org.onosproject.yms.app.yob.YobConstants.ADD_TO;
VinodKumarS-Huawei7b1733c2016-10-25 13:44:26 +053040import static org.onosproject.yms.app.yob.YobConstants.E_FAIL_TO_INVOKE_METHOD;
41import static org.onosproject.yms.app.yob.YobConstants.L_FAIL_TO_INVOKE_METHOD;
Rama-Huaweib711e5c2016-08-31 07:55:46 +053042
43/**
44 * Represents a multi instance leaf node handler in YANG object builder.
45 */
46class YobMultiInstanceLeafHandler
47 extends YobHandler {
48
49 private static final Logger log =
50 LoggerFactory.getLogger(YobMultiInstanceLeafHandler.class);
51
52 @Override
VinodKumarS-Huawei7b1733c2016-10-25 13:44:26 +053053 public void createBuilder(YdtExtendedContext curNode,
54 YdtExtendedContext rootNode,
55 YangSchemaRegistry registry) {
Rama-Huaweib711e5c2016-08-31 07:55:46 +053056 // For multi instance leaf no need to create an object.
57 }
58
59 @Override
VinodKumarS-Huawei7b1733c2016-10-25 13:44:26 +053060 public void buildObject(YdtExtendedContext ydtNode,
61 YdtExtendedContext ydtRootNode,
62 YangSchemaRegistry schemaRegistry) {
Rama-Huaweib711e5c2016-08-31 07:55:46 +053063 // For multi instance leaf no need to build object.
64 }
65
VinodKumarS-Huawei7b1733c2016-10-25 13:44:26 +053066 /**
67 * Set the leaf list values in the YANG object.
68 *
69 * @param leafListNode leaf list YDT node
70 * @param schemaRegistry YANG schema registry
71 * @throws YobException if failed to invoke the leaf list's setter
72 */
Rama-Huaweib711e5c2016-08-31 07:55:46 +053073 @Override
VinodKumarS-Huawei7b1733c2016-10-25 13:44:26 +053074 public void setInParent(YdtExtendedContext leafListNode,
75 YangSchemaRegistry schemaRegistry) {
Rama-Huaweib711e5c2016-08-31 07:55:46 +053076 Class<?> parentBuilderClass = null;
VinodKumarS-Huawei7b1733c2016-10-25 13:44:26 +053077 YangSchemaNode yangSchemaNode = leafListNode.getYangSchemaNode();
Vidyashree Rama6160be12016-11-24 13:43:31 +053078 while (yangSchemaNode.getReferredSchema() != null) {
79 yangSchemaNode = yangSchemaNode.getReferredSchema();
80 }
81
Rama-Huaweib711e5c2016-08-31 07:55:46 +053082 YdtExtendedContext parentYdtNode =
VinodKumarS-Huawei7b1733c2016-10-25 13:44:26 +053083 (YdtExtendedContext) leafListNode.getParent();
Rama-Huaweib711e5c2016-08-31 07:55:46 +053084 YobWorkBench parentYobWorkBench =
85 (YobWorkBench) parentYdtNode.getAppInfo(YOB);
VinodKumarS-Huawei7b1733c2016-10-25 13:44:26 +053086 Set<String> valueSet = leafListNode.getValueSet();
Rama-Huaweib711e5c2016-08-31 07:55:46 +053087
88 for (String value : valueSet) {
89 try {
90 String setterInParent = yangSchemaNode.getJavaAttributeName();
VinodKumarS-Huawei7b1733c2016-10-25 13:44:26 +053091 Object builderObject = parentYobWorkBench
92 .getParentBuilder(leafListNode, schemaRegistry);
93 parentBuilderClass = builderObject.getClass();
Rama-Huaweib711e5c2016-08-31 07:55:46 +053094 Field leafName = parentBuilderClass
95 .getDeclaredField(setterInParent);
96 ParameterizedType genericListType =
97 (ParameterizedType) leafName.getGenericType();
Vidyashree Rama6160be12016-11-24 13:43:31 +053098 Class<?> genericListClass;
99 if (((YangLeafList) leafListNode.getYangSchemaNode())
100 .getDataType().getDataType() == IDENTITYREF) {
101 ParameterizedType type = (ParameterizedType)
102 genericListType.getActualTypeArguments()[0];
103 genericListClass = type.getClass().getClass();
104 } else {
105 genericListClass = (Class<?>) genericListType.getActualTypeArguments()[0];
106 }
107
108 Method setterMethod = parentBuilderClass.getDeclaredMethod(
109 ADD_TO + getCapitalCase(setterInParent), genericListClass);
110
Rama-Huaweib711e5c2016-08-31 07:55:46 +0530111 JavaQualifiedTypeInfoContainer javaQualifiedType =
112 (JavaQualifiedTypeInfoContainer) yangSchemaNode;
113 YangType<?> yangType =
114 ((YangLeafList) javaQualifiedType).getDataType();
Vidyashree Rama6160be12016-11-24 13:43:31 +0530115 YobUtils.setDataFromStringValue(yangType.getDataType(), value,
116 setterMethod,
VinodKumarS-Huawei7b1733c2016-10-25 13:44:26 +0530117 builderObject, leafListNode);
Rama-Huaweib711e5c2016-08-31 07:55:46 +0530118 } catch (NoSuchMethodException | InvocationTargetException
119 | IllegalAccessException | NoSuchFieldException e) {
VinodKumarS-Huawei7b1733c2016-10-25 13:44:26 +0530120 log.error(L_FAIL_TO_INVOKE_METHOD,
121 parentBuilderClass.getName());
122 throw new YobException(E_FAIL_TO_INVOKE_METHOD +
123 parentBuilderClass.getName());
Rama-Huaweib711e5c2016-08-31 07:55:46 +0530124 }
125 }
126 }
127}