blob: e7cbf6fbc272d0adabb8cf53735ff7175715ab69 [file] [log] [blame]
/*
* Copyright 2017-present Open Networking 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.
*/
package org.onosproject.yang.runtime.impl;
import org.onosproject.yang.compiler.datamodel.YangLeafList;
import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
import org.onosproject.yang.compiler.datamodel.YangType;
import org.onosproject.yang.compiler.datamodel.javadatamodel.JavaQualifiedTypeInfoContainer;
import org.onosproject.yang.model.DataNode;
import org.onosproject.yang.model.LeafNode;
import org.onosproject.yang.model.ModelConverterException;
import org.onosproject.yang.runtime.YangModelRegistry;
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 static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.IDENTITYREF;
import static org.onosproject.yang.runtime.impl.YobConstants.ADD_TO;
import static org.onosproject.yang.runtime.impl.YobConstants.E_FAIL_TO_INVOKE_METHOD;
import static org.onosproject.yang.runtime.impl.YobConstants.L_FAIL_TO_INVOKE_METHOD;
import static org.onosproject.yang.runtime.impl.YobUtils.getCapitalCase;
import static org.onosproject.yang.runtime.impl.YobUtils.getChildSchemaNode;
import static org.onosproject.yang.runtime.impl.YobUtils.setDataFromStringValue;
/**
* Represents a multi instance leaf node handler in YANG object builder.
*/
class YobLeafListNodeHandler extends YobHandler {
private static final Logger log =
LoggerFactory.getLogger(YobLeafListNodeHandler.class);
@Override
YobWorkBench createObject(YangSchemaNode schemaNode,
DefaultYangModelRegistry registry) {
// For multi instance leaf no need to create an object.
return null;
}
/**
* Builds the object.
*
* @param curWorkbench current work bench
* @param registry YANG schema registry
*/
@Override
void buildObject(YobWorkBench curWorkbench,
YangModelRegistry registry) {
// For multi instance leaf no need to build an object.
}
@Override
void setInParent(DataNode leafNode,
YobWorkBench curWb,
YobWorkBench parentWb,
DefaultYangModelRegistry reg) {
Class<?> parentClass = null;
try {
YangSchemaNode schemaNode = getChildSchemaNode(leafNode,
curWb.schemaNode());
YangSchemaNode referredSchema = schemaNode;
while (referredSchema.getReferredSchema() != null) {
referredSchema = referredSchema.getReferredSchema();
}
String setterInParent = referredSchema.getJavaAttributeName();
Object parentObj = curWb.getParentObject(reg, schemaNode);
parentClass = parentObj.getClass();
Field leafName = parentClass
.getDeclaredField(setterInParent);
ParameterizedType genericListType =
(ParameterizedType) leafName.getGenericType();
Class<?> genericListClass;
if (((YangLeafList) referredSchema)
.getDataType().getDataType() == IDENTITYREF) {
ParameterizedType type = (ParameterizedType)
genericListType.getActualTypeArguments()[0];
genericListClass = type.getClass().getClass();
} else {
genericListClass = (Class<?>) genericListType.getActualTypeArguments()[0];
}
Method setterMethod = parentClass.getDeclaredMethod(
ADD_TO + getCapitalCase(setterInParent), genericListClass);
JavaQualifiedTypeInfoContainer javaQualifiedType =
(JavaQualifiedTypeInfoContainer) referredSchema;
YangType<?> yangType =
((YangLeafList) javaQualifiedType).getDataType();
setDataFromStringValue(yangType.getDataType(),
((LeafNode) leafNode).value(), setterMethod,
parentObj, referredSchema,
curWb.schemaNode());
} catch (NoSuchMethodException | InvocationTargetException |
IllegalAccessException | NoSuchFieldException e) {
log.error(L_FAIL_TO_INVOKE_METHOD, parentClass.getName());
throw new ModelConverterException(E_FAIL_TO_INVOKE_METHOD + parentClass
.getName(), e);
}
}
}