blob: 3e6081777f90f07c5d7dfc3e318f386e71f7df5f [file] [log] [blame]
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301/*
2 * Copyright 2016-present Open Networking Laboratory
3 *
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.yangutils.translator.tojava.utils;
18
Bharat saraswal0663aff2016-10-18 23:16:14 +053019import org.onosproject.yangutils.datamodel.RpcNotificationContainer;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +053020import org.onosproject.yangutils.datamodel.YangAugment;
Bharat saraswalc2fd3222016-10-19 16:10:27 +053021import org.onosproject.yangutils.datamodel.YangCase;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +053022import org.onosproject.yangutils.datamodel.YangChoice;
Bharat saraswala5c28512016-11-10 21:09:23 +053023import org.onosproject.yangutils.datamodel.YangDataStructure;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +053024import org.onosproject.yangutils.datamodel.YangLeafRef;
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +053025import org.onosproject.yangutils.datamodel.YangLeavesHolder;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +053026import org.onosproject.yangutils.datamodel.YangNode;
27import org.onosproject.yangutils.datamodel.YangType;
Bharat saraswalc2fd3222016-10-19 16:10:27 +053028import org.onosproject.yangutils.translator.exception.TranslatorException;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +053029import org.onosproject.yangutils.translator.tojava.JavaAttributeInfo;
Bharat saraswal0663aff2016-10-18 23:16:14 +053030import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +053031import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
32import org.onosproject.yangutils.translator.tojava.JavaFileInfoTranslator;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +053033
Bharat saraswal9fab16b2016-09-23 23:27:24 +053034import java.io.IOException;
Bharat saraswal0663aff2016-10-18 23:16:14 +053035import java.util.LinkedHashMap;
36import java.util.Map;
Bharat saraswal9fab16b2016-09-23 23:27:24 +053037
Bharat saraswala5c28512016-11-10 21:09:23 +053038import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.IDENTITYREF;
Bharat saraswal9fab16b2016-09-23 23:27:24 +053039import static org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes.LEAFREF;
40import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK;
41import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_LEAF_MASK;
42import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.FILTER_CONTENT_MATCH_FOR_NODES_MASK;
43import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.EIGHT_SPACE;
Bharat saraswal0663aff2016-10-18 23:16:14 +053044import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.FOUR_SPACE;
Bharat saraswal9fab16b2016-09-23 23:27:24 +053045import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.SIXTEEN_SPACE;
46import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.TWELVE_SPACE;
Bharat saraswalc2fd3222016-10-19 16:10:27 +053047import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.TWENTY_EIGHT_SPACE;
Bharat saraswal9fab16b2016-09-23 23:27:24 +053048import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.TWENTY_FOUR_SPACE;
49import static org.onosproject.yangutils.translator.tojava.utils.IndentationType.TWENTY_SPACE;
50import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGeneratorUtils.getDataFromTempFileHandle;
Bharat saraswal0663aff2016-10-18 23:16:14 +053051import static org.onosproject.yangutils.translator.tojava.utils.MethodClassTypes.CLASS_TYPE;
Bharat saraswala5c28512016-11-10 21:09:23 +053052import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getYangDataStructure;
Bharat saraswal0663aff2016-10-18 23:16:14 +053053import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getAppInstanceAttrString;
Bharat saraswal0663aff2016-10-18 23:16:14 +053054import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getElseIfConditionBegin;
55import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getEqualEqualString;
Bharat saraswalc2fd3222016-10-19 16:10:27 +053056import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getForLoopString;
Bharat saraswal0663aff2016-10-18 23:16:14 +053057import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getIfConditionBegin;
58import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getLeafFlagSetString;
Bharat saraswalc2fd3222016-10-19 16:10:27 +053059import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getNewInstance;
Bharat saraswal0663aff2016-10-18 23:16:14 +053060import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getOpenCloseParaWithValue;
61import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getReturnString;
62import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.getTwoParaEqualsString;
Bharat saraswal9fab16b2016-09-23 23:27:24 +053063import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.methodClose;
Bharat saraswal0663aff2016-10-18 23:16:14 +053064import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.multiAttrMethodSignature;
65import static org.onosproject.yangutils.translator.tojava.utils.StringGenerator.signatureClose;
Bharat saraswalc2fd3222016-10-19 16:10:27 +053066import static org.onosproject.yangutils.translator.tojava.utils.TranslatorUtils.getBeanFiles;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +053067import static org.onosproject.yangutils.utils.UtilConstants.ADD_STRING;
68import static org.onosproject.yangutils.utils.UtilConstants.AND_OPERATION;
69import static org.onosproject.yangutils.utils.UtilConstants.APP_INSTANCE;
Bharat saraswalb41904b2016-10-20 19:22:36 +053070import static org.onosproject.yangutils.utils.UtilConstants.BIT_SET;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +053071import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_DATA_TYPE;
72import static org.onosproject.yangutils.utils.UtilConstants.BREAK;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +053073import static org.onosproject.yangutils.utils.UtilConstants.BUILDER;
Bharat saraswalb41904b2016-10-20 19:22:36 +053074import static org.onosproject.yangutils.utils.UtilConstants.BUILDER_LOWER_CASE;
Bharat saraswal0663aff2016-10-18 23:16:14 +053075import static org.onosproject.yangutils.utils.UtilConstants.BUILD_FOR_FILTER;
Bharat saraswala5c28512016-11-10 21:09:23 +053076import static org.onosproject.yangutils.utils.UtilConstants.CLASS_STRING;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +053077import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_CURLY_BRACKET;
78import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_PARENTHESIS;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +053079import static org.onosproject.yangutils.utils.UtilConstants.COMMA;
Bharat saraswalc2fd3222016-10-19 16:10:27 +053080import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT;
Bharat saraswal0663aff2016-10-18 23:16:14 +053081import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT_CAPS;
Bharat saraswala5c28512016-11-10 21:09:23 +053082import static org.onosproject.yangutils.utils.UtilConstants.DIAMOND_CLOSE_BRACKET;
83import static org.onosproject.yangutils.utils.UtilConstants.DIAMOND_OPEN_BRACKET;
Bharat saraswal9fab16b2016-09-23 23:27:24 +053084import static org.onosproject.yangutils.utils.UtilConstants.EIGHT_SPACE_INDENTATION;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +053085import static org.onosproject.yangutils.utils.UtilConstants.ELSE;
Bharat saraswal0663aff2016-10-18 23:16:14 +053086import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
Bharat saraswala5c28512016-11-10 21:09:23 +053087import static org.onosproject.yangutils.utils.UtilConstants.ENTRY;
88import static org.onosproject.yangutils.utils.UtilConstants.ENTRY_SET;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +053089import static org.onosproject.yangutils.utils.UtilConstants.EQUAL;
90import static org.onosproject.yangutils.utils.UtilConstants.EQUALS_STRING;
Bharat saraswala5c28512016-11-10 21:09:23 +053091import static org.onosproject.yangutils.utils.UtilConstants.EXTEND;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +053092import static org.onosproject.yangutils.utils.UtilConstants.FALSE;
Bharat saraswalc2fd3222016-10-19 16:10:27 +053093import static org.onosproject.yangutils.utils.UtilConstants.FLAG;
Bharat saraswal0663aff2016-10-18 23:16:14 +053094import static org.onosproject.yangutils.utils.UtilConstants.GET;
Bharat saraswala5c28512016-11-10 21:09:23 +053095import static org.onosproject.yangutils.utils.UtilConstants.GET_KEY;
96import static org.onosproject.yangutils.utils.UtilConstants.GET_VALUE;
Bharat saraswalc2fd3222016-10-19 16:10:27 +053097import static org.onosproject.yangutils.utils.UtilConstants.INSTANCE;
Bharat saraswal9fab16b2016-09-23 23:27:24 +053098import static org.onosproject.yangutils.utils.UtilConstants.IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +053099import static org.onosproject.yangutils.utils.UtilConstants.IS_EMPTY;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530100import static org.onosproject.yangutils.utils.UtilConstants.IS_SELECT_ALL_SCHEMA_CHILD_FLAG;
Bharat saraswala5c28512016-11-10 21:09:23 +0530101import static org.onosproject.yangutils.utils.UtilConstants.KEYS;
Bharat saraswalb41904b2016-10-20 19:22:36 +0530102import static org.onosproject.yangutils.utils.UtilConstants.LEAF_IDENTIFIER;
Bharat saraswala5c28512016-11-10 21:09:23 +0530103import static org.onosproject.yangutils.utils.UtilConstants.MAP;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530104import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
105import static org.onosproject.yangutils.utils.UtilConstants.NOT;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530106import static org.onosproject.yangutils.utils.UtilConstants.NULL;
Bharat saraswal94844d62016-10-13 13:28:03 +0530107import static org.onosproject.yangutils.utils.UtilConstants.OPEN_CLOSE_BRACKET_STRING;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530108import static org.onosproject.yangutils.utils.UtilConstants.OPEN_CURLY_BRACKET;
109import static org.onosproject.yangutils.utils.UtilConstants.OPEN_PARENTHESIS;
Bharat saraswal0663aff2016-10-18 23:16:14 +0530110import static org.onosproject.yangutils.utils.UtilConstants.OP_PARAM;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530111import static org.onosproject.yangutils.utils.UtilConstants.OR_OPERATION;
112import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
113import static org.onosproject.yangutils.utils.UtilConstants.PRIVATE;
Bharat saraswal0663aff2016-10-18 23:16:14 +0530114import static org.onosproject.yangutils.utils.UtilConstants.PROCESS_CHILD_NODE_STF_PARAM;
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530115import static org.onosproject.yangutils.utils.UtilConstants.PROCESS_LEAF_LIST_STF_PARAM;
116import static org.onosproject.yangutils.utils.UtilConstants.PROCESS_LEAF_STF_PARAM;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530117import static org.onosproject.yangutils.utils.UtilConstants.PROCESS_SUBTREE_FILTERING;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530118import static org.onosproject.yangutils.utils.UtilConstants.PUBLIC;
Bharat saraswala5c28512016-11-10 21:09:23 +0530119import static org.onosproject.yangutils.utils.UtilConstants.QUESTION_MARK;
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530120import static org.onosproject.yangutils.utils.UtilConstants.RESULT;
121import static org.onosproject.yangutils.utils.UtilConstants.SELECT_ALL_CHILD;
Bharat saraswal0663aff2016-10-18 23:16:14 +0530122import static org.onosproject.yangutils.utils.UtilConstants.SELECT_ALL_CHILD_SCHEMA_PARAM;
Bharat saraswal94844d62016-10-13 13:28:03 +0530123import static org.onosproject.yangutils.utils.UtilConstants.SELECT_LEAF;
Bharat saraswal0663aff2016-10-18 23:16:14 +0530124import static org.onosproject.yangutils.utils.UtilConstants.SELECT_OR_CONTAINMENT_NODE_PARAM;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530125import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLON;
Bharat saraswalb41904b2016-10-20 19:22:36 +0530126import static org.onosproject.yangutils.utils.UtilConstants.SET_METHOD_PREFIX;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530127import static org.onosproject.yangutils.utils.UtilConstants.SIXTEEN_SPACE_INDENTATION;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530128import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
Bharat saraswal0663aff2016-10-18 23:16:14 +0530129import static org.onosproject.yangutils.utils.UtilConstants.STF_BUILDER_PARAM;
Bharat saraswalb41904b2016-10-20 19:22:36 +0530130import static org.onosproject.yangutils.utils.UtilConstants.SUBTREE_FILTERED;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530131import static org.onosproject.yangutils.utils.UtilConstants.SUBTREE_FILTERING_RESULT_BUILDER;
132import static org.onosproject.yangutils.utils.UtilConstants.THIRTY_TWO_SPACE_INDENTATION;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530133import static org.onosproject.yangutils.utils.UtilConstants.TO;
134import static org.onosproject.yangutils.utils.UtilConstants.TRUE;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530135import static org.onosproject.yangutils.utils.UtilConstants.TWELVE_SPACE_INDENTATION;
136import static org.onosproject.yangutils.utils.UtilConstants.TWENTY_EIGHT_SPACE_INDENTATION;
137import static org.onosproject.yangutils.utils.UtilConstants.TWENTY_FOUR_SPACE_INDENTATION;
138import static org.onosproject.yangutils.utils.UtilConstants.TWENTY_SPACE_INDENTATION;
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530139import static org.onosproject.yangutils.utils.UtilConstants.TWO;
Bharat saraswal94844d62016-10-13 13:28:03 +0530140import static org.onosproject.yangutils.utils.UtilConstants.VALUE_LEAF;
Bharat saraswalb41904b2016-10-20 19:22:36 +0530141import static org.onosproject.yangutils.utils.UtilConstants.VALUE_LEAF_SET;
142import static org.onosproject.yangutils.utils.UtilConstants.ZERO;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530143import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530144import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530145
146/**
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530147 * Represents generator for subtree filtering methods of generated files
148 * based on the file type.
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530149 */
150public final class SubtreeFilteringMethodsGenerator {
151
152 /**
153 * private to make it a util.
154 */
155 private SubtreeFilteringMethodsGenerator() {
156 }
157
158 /**
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530159 * Returns process sub tree for choice interface class.
160 *
161 * @param node choice node
162 * @return process sub tree for choice interface class
163 */
164 static String getProcessSubTreeForChoiceInterface(YangNode node) {
165 if (!(node instanceof YangChoice)) {
166 throw new TranslatorException("process sub tree for interface is " +
167 "only allowed in choice " +
168 "node.");
169 }
170 JavaFileInfoTranslator info = ((JavaCodeGeneratorInfo) node)
171 .getJavaFileInfo();
172
173 String name = info.getJavaName();
174 String returnType = getCapitalCase(name);
175
176 String javadoc = "\n /**\n" +
177 " * Applications need not to implement process subtree " +
178 "of " + name + "\n * it will be overridden by " +
179 "corresponding case class.\n" +
180 " *\n" +
181 " * @param " + APP_INSTANCE + SPACE +
182 APP_INSTANCE + SPACE + "being passed to check" +
183 " for" +
184 " content match\n" +
185 " * @param isSelectAllSchemaChild is select all schema child\n" +
186 " * @return match result\n" +
187 " */\n";
188 StringBuilder builder = new StringBuilder(javadoc);
189 Map<String, String> param = new LinkedHashMap<>();
190 param.put(APP_INSTANCE, returnType);
191 param.put(SELECT_ALL_CHILD_SCHEMA_PARAM, BOOLEAN_DATA_TYPE);
192 builder.append(multiAttrMethodSignature(PROCESS_SUBTREE_FILTERING, null,
193 DEFAULT, returnType, param,
194 CLASS_TYPE))
195 .append(getReturnString(NULL, EIGHT_SPACE_INDENTATION))
196 .append(signatureClose()).append(methodClose(FOUR_SPACE));
197 return builder.toString();
198 }
199
200 /**
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530201 * Returns is filter content match for leaf.
202 *
203 * @param javaAttributeInfo java attribute
204 * @param type data type
205 * @return is filter content match for leaf
206 */
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530207 public static String getSubtreeFilteringForLeaf(
208 JavaAttributeInfo javaAttributeInfo, YangType<?> type) {
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530209 String attrQualifiedType;
210 String attributeName = javaAttributeInfo.getAttributeName();
211 attrQualifiedType = getIfFilterContentMatchMethodImpl(attributeName,
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530212 type);
Bharat saraswal0663aff2016-10-18 23:16:14 +0530213 /* if (valueLeafFlags.get(LeafIdentifier.LEAF.getLeafIndex())) {
214 * if (appInstance.leaf() != leaf()) {
215 * return false;
216 * } else {
217 * subTreeFilteringResultBuilder.leaf(appInstance.leaf());
218 * }
219 * } else if (selectLeafFlags.get(LeafIdentifier.LEAF.getLeafIndex()) ||
220 * isSelectAllSchemaChild) {
221 * isAnySelectOrContainmentNode = true;
222 * subTreeFilteringResultBuilder.leaf(appInstance.leaf());
223 * }*/
Bharat saraswalb41904b2016-10-20 19:22:36 +0530224
225/* if (isSubTreeFiltered && !appInstance.isLeafValueSet(
226 LeafIdentifier.LEAF2)) {
227 subTreeFilteringResultBuilder.leaf2(leaf2());
228 } else {
229 return false;
230 }*/
231 String condition = SUBTREE_FILTERED + SPACE + AND_OPERATION + SPACE + NOT +
232 APP_INSTANCE + PERIOD + VALUE_LEAF_SET +
233 getOpenCloseParaWithValue(
234 LEAF_IDENTIFIER + PERIOD + attributeName.toUpperCase());
Bharat saraswal0663aff2016-10-18 23:16:14 +0530235 return getIfConditionBegin(EIGHT_SPACE_INDENTATION, getLeafFlagSetString(
236 attributeName, VALUE_LEAF, EMPTY_STRING, GET)) +
237 getIfConditionBegin(TWELVE_SPACE_INDENTATION, attrQualifiedType) +
Bharat saraswalb41904b2016-10-20 19:22:36 +0530238 getIfConditionBegin(SIXTEEN_SPACE_INDENTATION, condition) +
239 TWENTY_SPACE_INDENTATION + SUBTREE_FILTERING_RESULT_BUILDER +
240 PERIOD + attributeName + getOpenCloseParaWithValue(
241 attributeName + OPEN_CLOSE_BRACKET_STRING) + signatureClose() +
242 SIXTEEN_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + ELSE +
243 OPEN_CURLY_BRACKET + NEW_LINE + getReturnString(
244 FALSE, TWENTY_SPACE_INDENTATION) + signatureClose() +
245 SIXTEEN_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + NEW_LINE +
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530246 TWELVE_SPACE_INDENTATION + CLOSE_CURLY_BRACKET + ELSE +
247 OPEN_CURLY_BRACKET + NEW_LINE +
Bharat saraswal0663aff2016-10-18 23:16:14 +0530248 getSubTreeBuilderCallString(SIXTEEN_SPACE_INDENTATION, attributeName,
249 TWELVE_SPACE) +
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530250 getElseIfConditionBegin(EIGHT_SPACE_INDENTATION, getLeafFlagSetString(
Bharat saraswal0663aff2016-10-18 23:16:14 +0530251 attributeName, SELECT_LEAF, EMPTY_STRING, GET) + SPACE +
252 OR_OPERATION + SPACE + IS_SELECT_ALL_SCHEMA_CHILD_FLAG) +
Bharat saraswalb41904b2016-10-20 19:22:36 +0530253 getSelectOrContainmentAssignString() +
Bharat saraswal0663aff2016-10-18 23:16:14 +0530254 getSubTreeBuilderCallString(TWELVE_SPACE_INDENTATION, attributeName,
255 EIGHT_SPACE);
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530256 }
257
Bharat saraswal0663aff2016-10-18 23:16:14 +0530258 private static String getSubTreeBuilderCallString(String indent, String
259 name, IndentationType type) {
260 return indent + SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + name +
261 getOpenCloseParaWithValue(APP_INSTANCE + PERIOD + name +
262 OPEN_CLOSE_BRACKET_STRING) +
263 signatureClose() + methodClose(type);
264 }
265
266 private static String getAttrTypeForFcmWhenPrimitiveDataType(
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530267 String attributeName) {
268 return/* TODO: Need to check if we can expose the value leaf flag in
269 interface.
270 NOT + APP_INSTANCE + PERIOD + GET_VALUE_LEAF_FLAGS +
271 OPEN_PARENTHESIS + CLOSE_PARENTHESIS +
272 GET_METHOD_PREFIX + OPEN_PARENTHESIS + LEAF_IDENTIFIER +
273 PERIOD + attributeName.toUpperCase() + PERIOD
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530274 + GET_LEAF_INDEX + OR_OPERATION +*/
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530275 APP_INSTANCE + PERIOD + attributeName + OPEN_PARENTHESIS +
276 CLOSE_PARENTHESIS + SPACE + NOT + EQUAL + SPACE +
277 attributeName + OPEN_PARENTHESIS +
278 CLOSE_PARENTHESIS;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530279 }
280
Bharat saraswal0663aff2016-10-18 23:16:14 +0530281 private static String attrTypeForFcmWhenNonPrimitiveDataTypes(String name) {
282 /*
283 * appInstance.name() == null || name().equals(appInstance.name())
284 */
285 return getEqualEqualString(StringGenerator.getAppInstanceAttrString(name), NULL) +
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530286 SPACE + OR_OPERATION + SPACE + NOT + OPEN_PARENTHESIS +
Bharat saraswal0663aff2016-10-18 23:16:14 +0530287 getTwoParaEqualsString(name + OPEN_CLOSE_BRACKET_STRING,
288 StringGenerator.getAppInstanceAttrString(name))
289 + CLOSE_PARENTHESIS;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530290 }
291
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530292 private static String getIfFilterContentMatchMethodImpl(
Bharat saraswal0663aff2016-10-18 23:16:14 +0530293 String name, YangType dataType) {
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530294 String attrQualifiedType;
Bharat saraswal0663aff2016-10-18 23:16:14 +0530295 if (dataType.getDataType().isPrimitiveDataType()) {
296 attrQualifiedType = getAttrTypeForFcmWhenPrimitiveDataType(name);
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530297 } else if (dataType.getDataType() == LEAFREF) {
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +0530298
299 // When leafref in grouping.
300 if (((YangLeafRef) dataType.getDataTypeExtendedInfo())
301 .isInGrouping()) {
Bharat saraswal0663aff2016-10-18 23:16:14 +0530302 attrQualifiedType = attrTypeForFcmWhenNonPrimitiveDataTypes(name);
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +0530303 } else {
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +0530304 YangType type = ((YangLeafRef) dataType.getDataTypeExtendedInfo())
305 .getEffectiveDataType();
Bharat saraswal0663aff2016-10-18 23:16:14 +0530306 if (type.getDataType().isPrimitiveDataType()) {
307 attrQualifiedType = getAttrTypeForFcmWhenPrimitiveDataType(name);
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +0530308 } else {
Bharat saraswal0663aff2016-10-18 23:16:14 +0530309 attrQualifiedType = attrTypeForFcmWhenNonPrimitiveDataTypes(
310 name);
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +0530311 }
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530312 }
313 } else {
Bharat saraswal0663aff2016-10-18 23:16:14 +0530314 attrQualifiedType = attrTypeForFcmWhenNonPrimitiveDataTypes(name);
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530315 }
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530316 return attrQualifiedType;
317 }
318
319 /**
320 * Returns is filter content match for leaf.
321 *
322 * @param javaAttributeInfo java attribute
323 * @return is filter content match for leaf
324 */
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530325 public static String getSubtreeFilteringForLeafList(
326 JavaAttributeInfo javaAttributeInfo) {
Bharat saraswal0663aff2016-10-18 23:16:14 +0530327 return getSubtreeFilteringForList(javaAttributeInfo, true, null);
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530328 }
329
330 /**
331 * Returns is filter content match for child node.
332 *
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530333 * @param curNode current node
334 * @param path path of temp file
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530335 * @return is filter content match for child node
336 */
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530337 static String getProcessChildNodeSubtreeFiltering(YangNode curNode, String path)
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530338 throws IOException {
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530339 /* Generate code will look like this.
340 private boolean processChildNodesSubTreeFiltering(Link
341 appInstance, LinkBuilder subTreeFilteringResultBuilder,
342 Boolean isAnySelectOrContainmentNode, boolean isSelectAllSchemaChild) {
343 if (isSelectAllSchemaChild) {
344 for (Areas areas : appInstance.areas()) {
345 subTreeFilteringResultBuilder.addToAreas(areas);
346 }
347 } else if (areas() != null) {
348 isAnySelectOrContainmentNode = true;
349 if (!areas().isEmpty()) {
350 if (appInstance.areas() != null && !appInstance.areas().isEmpty()) {
351 for (Areas areas : areas()) {
352 for (Areas areas2 : appInstance.areas()) {
353 Areas result = areas.processSubtreeFiltering(areas2, false);
354 if (result != null) {
355 subTreeFilteringResultBuilder.addToAreas(result);
356 }
357 }
358 }
359 }
360 } else {
361 if (appInstance.areas() != null && !appInstance.areas().isEmpty()) {
362 for (Areas areas : appInstance.areas()) {
363 subTreeFilteringResultBuilder.addToAreas(areas);
364 }
365 }
366 }
Bharat saraswal0663aff2016-10-18 23:16:14 +0530367 }
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530368
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530369 return true;
370 }*/
371 return getProcessStfMethods(PROCESS_CHILD_NODE_STF_PARAM, curNode,
372 path,
373 FILTER_CONTENT_MATCH_FOR_NODES_MASK);
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530374 }
375
376 /**
377 * Returns is filter content match for leaf list.
378 *
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530379 * @param curNode current node
380 * @param path path of temp file
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530381 * @return is filter content match for leaf list
382 */
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530383 static String getProcessLeafListSubtreeFiltering(YangNode curNode, String path)
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530384 throws IOException {
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530385 /* Generate code will look like this.
386 private boolean processLeafListSubTreeFiltering(Link appInstance, LinkBuilder subTreeFilteringResultBuilder,
387 Boolean isAnySelectOrContainmentNode, boolean isSelectAllSchemaChild) {
388 if (isSelectAllSchemaChild) {
389 for (String portId : appInstance.portId()) {
390 subTreeFilteringResultBuilder.addToPortId(portId);
391 }
392 } else if (portId() != null) {
393 if (!portId().isEmpty()) {
394 if (appInstance.portId() == null || appInstance.portId().isEmpty()) {
395 return false;
396 }
397 for (String portId : portId()) {
398 boolean flag = false;
399 for (String portId2 : appInstance.portId()) {
400 if (portId.equals(portId2)) {
401 flag = true;
402 subTreeFilteringResultBuilder.addToPortId(portId2);
403 break;
404 }
405 }
406 if (!flag) {
407 return false;
408 }
409 }
410 } else {
411 isAnySelectOrContainmentNode = true;
412 if (appInstance.portId() != null && !appInstance.portId().isEmpty()) {
413 for (String portId : appInstance.portId()) {
414 subTreeFilteringResultBuilder.addToPortId(portId);
415 }
416 }
417 }
418 }
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530419
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530420 return true;
421 }*/
422 return getProcessStfMethods(PROCESS_LEAF_LIST_STF_PARAM, curNode, path,
423 FILTER_CONTENT_MATCH_FOR_LEAF_LIST_MASK);
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530424 }
425
426 /**
427 * Returns is filter content match for leaf.
428 *
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530429 * @param curNode current node
430 * @param path path of temp file
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530431 * @return is filter content match for leaf
432 */
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530433 static String getProcessLeafSubtreeFiltering(YangNode curNode, String path)
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530434 throws IOException {
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530435 /* Generate code will look like this.
436 private boolean processLeafSubtreeFiltering(Link appInstance, LinkBuilder subTreeFilteringResultBuilder,
437 Boolean isAnySelectOrContainmentNode, boolean isSelectAllSchemaChild) {
438 if (valueLeafFlags.get(LeafIdentifier.PORT.getLeafIndex())) {
439 if (appInstance.port() != port()) {
440 return false;
441 } else {
442 subTreeFilteringResultBuilder.port(appInstance.port());
443 }
444 } else if (selectLeafFlags.get(LeafIdentifier.PORT.getLeafIndex()) || isSelectAllSchemaChild) {
445 isAnySelectOrContainmentNode = true;
446 subTreeFilteringResultBuilder.port(appInstance.port());
447 }
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530448
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530449 return true;
450 }*/
451 return getProcessStfMethods(PROCESS_LEAF_STF_PARAM, curNode, path,
452 FILTER_CONTENT_MATCH_FOR_LEAF_MASK);
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530453 }
454
455 /**
456 * Returns is filter content match for leaf.
457 *
Bharat saraswal0663aff2016-10-18 23:16:14 +0530458 * @param curNode current node
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530459 * @return is filter content match for leaf
460 */
Bharat saraswal0663aff2016-10-18 23:16:14 +0530461 static String getProcessSubtreeFilteringStart(YangNode curNode) {
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530462
463 /* Generate code will look like this.
464 public Link processSubtreeFiltering(Link appInstance, boolean isSelectAllSchemaChild) {
465 LinkBuilder subTreeFilteringResultBuilder = new LinkBuilder();
466 Boolean isAnySelectOrContainmentNode = false;
467 */
468 StringBuilder builder = new StringBuilder();
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530469 JavaFileInfoTranslator javaFileInfo =
470 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530471 String instance = APP_INSTANCE;
472 String name = getCapitalCase(javaFileInfo.getJavaName());
473 String builderNamePrefix = getCapitalCase(javaFileInfo.getJavaName());
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530474 String caseName = getNameOfClassForIfCase(curNode);
475 String returnType;
Bharat saraswal0663aff2016-10-18 23:16:14 +0530476 if (curNode instanceof RpcNotificationContainer) {
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530477 returnType = name + OP_PARAM;
Bharat saraswal0663aff2016-10-18 23:16:14 +0530478 } else {
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530479 returnType = DEFAULT_CAPS + name;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530480 }
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530481 if (caseName != null) {
482 instance = INSTANCE;
483 name = caseName;
484 }
485
Bharat saraswalb41904b2016-10-20 19:22:36 +0530486 String javadoc = "\n /**\n" +
487 " * Checks if the passed " + name + " maps the content " +
488 "match query condition.\n" +
Bharat saraswal0663aff2016-10-18 23:16:14 +0530489 " *\n" +
Bharat saraswalb41904b2016-10-20 19:22:36 +0530490 " * @param " + instance + SPACE + instance + SPACE +
491 "being passed to check for content match\n" +
492 " * @param isSelectAllSchemaChild is select all schema " +
493 "child\n" +
Bharat saraswal0663aff2016-10-18 23:16:14 +0530494 " * @return match result\n" +
495 " */\n";
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530496 Map<String, String> param = new LinkedHashMap<>();
497 param.put(instance, name);
498 param.put(SELECT_ALL_CHILD_SCHEMA_PARAM, BOOLEAN_DATA_TYPE);
499 builder.append(javadoc)
500 .append(multiAttrMethodSignature(PROCESS_SUBTREE_FILTERING, null,
501 PUBLIC, returnType, param,
502 CLASS_TYPE));
Bharat saraswal0663aff2016-10-18 23:16:14 +0530503
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530504 builder.append(getNewInstance(builderNamePrefix + BUILDER,
505 SUBTREE_FILTERING_RESULT_BUILDER,
506 EIGHT_SPACE_INDENTATION, EMPTY_STRING));
Bharat saraswalb41904b2016-10-20 19:22:36 +0530507 builder.append(getNewInstance(BIT_SET,
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530508 IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG,
Bharat saraswalb41904b2016-10-20 19:22:36 +0530509 EIGHT_SPACE_INDENTATION, EMPTY_STRING));
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530510 if (caseName != null) {
511 builder.append(getCaseCastString(javaFileInfo, instance, curNode));
512 }
513
514 return builder.toString();
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530515 }
516
517 /**
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530518 * Returns all process sub tree method implementations.
519 *
520 * @param methodName method name
521 * @param curNode current node
522 * @param path path for temporary file
523 * @param file temp file
524 * @return method implementations
525 * @throws IOException when fails to fetch data from temp files
526 */
527 private static String getProcessStfMethods(
528 String methodName, YangNode curNode, String path, int file)
529 throws IOException {
Bharat saraswalb41904b2016-10-20 19:22:36 +0530530 StringBuilder builder = new StringBuilder(EMPTY_STRING);
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530531 JavaFileInfoTranslator javaFileInfo =
532 ((JavaFileInfoContainer) curNode).getJavaFileInfo();
533 String instance = APP_INSTANCE;
534 String name = getCapitalCase(javaFileInfo.getJavaName());
535 String builderNamePrefix = getCapitalCase(javaFileInfo.getJavaName());
536 String caseName = getNameOfClassForIfCase(curNode);
537 if (caseName != null) {
538 instance = INSTANCE;
539 name = caseName;
540 }
541
542 Map<String, String> param = new LinkedHashMap<>();
543 param.put(instance, name);
544 param.put(STF_BUILDER_PARAM, builderNamePrefix + BUILDER);
Bharat saraswalb41904b2016-10-20 19:22:36 +0530545 param.put(SELECT_OR_CONTAINMENT_NODE_PARAM, BIT_SET);
546 param.put(SELECT_ALL_CHILD_SCHEMA_PARAM, BOOLEAN_DATA_TYPE);
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530547
548 builder.append(multiAttrMethodSignature(methodName, null,
549 PRIVATE, BOOLEAN_DATA_TYPE, param, CLASS_TYPE));
550
551 if (caseName != null) {
552 builder.append(getCaseCastString(javaFileInfo, instance, curNode));
553 }
554 builder.append(getDataFromTempFileHandle(file,
555 getBeanFiles(curNode), path))
556 .append(getReturnString(TRUE, EIGHT_SPACE_INDENTATION)).append(
557 signatureClose()).append(methodClose(FOUR_SPACE))
558 .append(NEW_LINE);
559 return builder.toString();
560 }
561
562 /**
563 * Returns the body for process subtree filtering.
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530564 *
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530565 * @param curNode node for which the code is being generated
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530566 * @return body of subtree filtering
567 */
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530568 static String getProcessSubtreeFunctionBody(YangNode curNode) {
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530569 StringBuilder builder = new StringBuilder();
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530570
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530571 /* if (!processLeafSubtreeFiltering(appInstance, subTreeFilteringResultBuilder,
572 isAnySelectOrContainmentNode, isSelectAllSchemaChild)) {
573 return null;
574 }
575 if (!processLeafListSubTreeFiltering(appInstance, subTreeFilteringResultBuilder,
576 isAnySelectOrContainmentNode, isSelectAllSchemaChild)) {
577 return null;
578 }
579 if (!processChildNodesSubTreeFiltering(appInstance, subTreeFilteringResultBuilder,
580 isAnySelectOrContainmentNode, isSelectAllSchemaChild)) {
581 return null;
582 }
583 */
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530584 if (curNode instanceof YangLeavesHolder) {
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530585 YangLeavesHolder holder = (YangLeavesHolder) curNode;
586 if (!holder.getListOfLeaf().isEmpty()) {
587 builder.append(getInnerStfMethodClass(PROCESS_LEAF_STF_PARAM));
588 }
589 if (!holder.getListOfLeafList().isEmpty()) {
590 builder.append(getInnerStfMethodClass(PROCESS_LEAF_LIST_STF_PARAM));
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530591 }
592 }
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530593 if (curNode.getChild() != null) {
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530594 builder.append(getInnerStfMethodClass(PROCESS_CHILD_NODE_STF_PARAM));
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530595 }
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530596
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530597 return builder.toString();
598 }
599
600 //Method calls for process subtree filtering method.
601 private static String getInnerStfMethodClass(String name) {
602 StringBuilder builder = new StringBuilder()
603 .append(getIfConditionBegin(EIGHT_SPACE_INDENTATION,
604 getMethodCallsConditionsForStfMethods(name)))
605 .append(getReturnString(NULL, TWELVE_SPACE_INDENTATION)).append(
606 signatureClose()).append(methodClose(EIGHT_SPACE));
607 return builder.toString();
608 }
609
610 // Condition for if check in process sub tree method.
611 private static String getMethodCallsConditionsForStfMethods(String name) {
612 return NOT + name + getOpenCloseParaWithValue(getConditionString());
613 }
614
615 //variable call for conditional method call
616 private static String getConditionString() {
617 return APP_INSTANCE + COMMA + SPACE + SUBTREE_FILTERING_RESULT_BUILDER +
618 COMMA + SPACE + SELECT_OR_CONTAINMENT_NODE_PARAM + COMMA + SPACE +
619 SELECT_ALL_CHILD;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530620 }
621
622 /**
623 * Returns is filter content match for node.
624 *
625 * @param attr attribute info
Bharat saraswal0663aff2016-10-18 23:16:14 +0530626 * @param node YANG node
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530627 * @return is filter content match for node
628 */
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530629 public static String getSubtreeFilteringForNode(JavaAttributeInfo attr, YangNode node) {
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530630 boolean isList = attr.isListAttr();
631 if (isList) {
Bharat saraswal0663aff2016-10-18 23:16:14 +0530632 return getSubtreeFilteringForList(attr, false, node);
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530633 } else {
Bharat saraswal0663aff2016-10-18 23:16:14 +0530634 return getSubtreeFilteringForChildNode(attr, node);
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530635 }
636 }
637
638 /**
639 * Returns is filter content match close.
640 *
Bharat saraswalb41904b2016-10-20 19:22:36 +0530641 * @param name name of class
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530642 * @return is filter content match close
643 */
Bharat saraswalb41904b2016-10-20 19:22:36 +0530644 static String getProcessSubTreeFilteringEnd(String name) {
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530645 /* generate code will look like this.
646 if (!isSelectAllSchemaChild && !isAnySelectOrContainmentNode) {
647 return processSubtreeFiltering(appInstance, true);
648 }
649 return subTreeFilteringResultBuilder.build();
650 */
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530651
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530652 StringBuilder builder = new StringBuilder();
653 String cond1 = NOT + IS_SELECT_ALL_SCHEMA_CHILD_FLAG + SPACE + AND_OPERATION +
Bharat saraswalb41904b2016-10-20 19:22:36 +0530654 SPACE + NOT + IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG +
655 PERIOD + GET + getOpenCloseParaWithValue(ZERO);
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530656 String call = PROCESS_SUBTREE_FILTERING + getOpenCloseParaWithValue(
657 APP_INSTANCE + COMMA + SPACE + TRUE);
658 builder.append(getIfConditionBegin(EIGHT_SPACE_INDENTATION, cond1))
659 .append(getReturnString(call, TWELVE_SPACE_INDENTATION))
660 .append(signatureClose()).append(methodClose(EIGHT_SPACE));
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530661
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530662 call = getOpenCloseParaWithValue(name) + SPACE +
Bharat saraswalb41904b2016-10-20 19:22:36 +0530663 SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + BUILD_FOR_FILTER +
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530664 OPEN_CLOSE_BRACKET_STRING;
665 builder.append(getReturnString(call, EIGHT_SPACE_INDENTATION))
666 .append(signatureClose()).append(methodClose(FOUR_SPACE))
667 .append(NEW_LINE);
668 return builder.toString();
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530669 }
670
671 /**
672 * Returns filter content match for child nodes.
673 *
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530674 * @param attr attribute to be added
675 * @param node YANG node
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530676 * @return filter content match for child nodes
677 */
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530678 private static String getSubtreeFilteringForChildNode(JavaAttributeInfo attr,
679 YangNode node) {
680 StringBuilder builder = new StringBuilder();
681 String name = attr.getAttributeName();
682 String clsInfo = attr.getImportInfo()
Bharat saraswal0663aff2016-10-18 23:16:14 +0530683 .getClassInfo();
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530684 String type = DEFAULT_CAPS + attr.getImportInfo()
Bharat saraswal0663aff2016-10-18 23:16:14 +0530685 .getClassInfo();
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530686 if (attr.isQualifiedName()) {
687 type = attr.getImportInfo().getPkgInfo() + PERIOD +
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530688 type;
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530689 clsInfo = attr.getImportInfo().getPkgInfo() + PERIOD +
Bharat saraswal0663aff2016-10-18 23:16:14 +0530690 clsInfo;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530691 }
Bharat saraswal0663aff2016-10-18 23:16:14 +0530692 String classCast = getOpenCloseParaWithValue(type) + SPACE;
693 String cast = getOpenCloseParaWithValue(classCast + name);
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530694 if (node != null && node instanceof YangChoice) {
695 cast = name;
696 }
697
Bharat saraswalb41904b2016-10-20 19:22:36 +0530698 String resultString = cast + NEW_LINE + TWENTY_EIGHT_SPACE_INDENTATION +
699 PERIOD + PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530700 + APP_INSTANCE + PERIOD + name + OPEN_CLOSE_BRACKET_STRING
Bharat saraswal0663aff2016-10-18 23:16:14 +0530701 + COMMA + SPACE + FALSE + CLOSE_PARENTHESIS + SEMI_COLON +
702 NEW_LINE;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530703
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530704 String cond1 = name + OPEN_CLOSE_BRACKET_STRING + SPACE + NOT + EQUAL +
705 SPACE + NULL + SPACE + OR_OPERATION + SPACE + SELECT_ALL_CHILD;
706 builder.append(getIfConditionBegin(EIGHT_SPACE_INDENTATION, cond1))
707 .append(getSelectOrContainmentAssignString());
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530708
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530709 builder.append(getIfConditionBegin(TWELVE_SPACE_INDENTATION,
Bharat saraswalb41904b2016-10-20 19:22:36 +0530710 getAppInstanceCondition(name, NOT)));
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530711
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530712 String assignment = SIXTEEN_SPACE_INDENTATION + clsInfo + SPACE + RESULT +
Bharat saraswalb41904b2016-10-20 19:22:36 +0530713 SPACE + EQUAL + SPACE + NULL + signatureClose();
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530714
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530715 builder.append(assignment)
716 .append(getIfConditionBegin(SIXTEEN_SPACE_INDENTATION,
717 SELECT_ALL_CHILD));
Bharat saraswalb41904b2016-10-20 19:22:36 +0530718/*
719 result = ((DefaultInterfaces)(DefaultInterfaces.builder()
720 .build())).processSubtreeFiltering(appInstance.interfaces(),
721 true);*/
Bharat saraswal0663aff2016-10-18 23:16:14 +0530722
Bharat saraswala5c28512016-11-10 21:09:23 +0530723 assignment = getDummyObjectCreation(node, name, clsInfo, type,
724 classCast, false, false);
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530725 builder.append(assignment).append(SIXTEEN_SPACE_INDENTATION).append(
726 CLOSE_CURLY_BRACKET).append(ELSE).append(OPEN_CURLY_BRACKET)
727 .append(NEW_LINE);
Bharat saraswal0663aff2016-10-18 23:16:14 +0530728
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530729 assignment = TWENTY_SPACE_INDENTATION + RESULT + SPACE + EQUAL + SPACE
730 + resultString;
731 cond1 = RESULT + SPACE + NOT + EQUAL + SPACE + NULL;
Bharat saraswal0663aff2016-10-18 23:16:14 +0530732
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530733 builder.append(assignment).append(methodClose(SIXTEEN_SPACE))
734 .append(getIfConditionBegin(SIXTEEN_SPACE_INDENTATION, cond1));
Bharat saraswal0663aff2016-10-18 23:16:14 +0530735
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530736 assignment = TWENTY_SPACE_INDENTATION + SUBTREE_FILTERING_RESULT_BUILDER +
737 PERIOD + name + getOpenCloseParaWithValue(RESULT) +
738 signatureClose();
739 builder.append(assignment).append(methodClose(SIXTEEN_SPACE)).append(
Bharat saraswalb41904b2016-10-20 19:22:36 +0530740 TWELVE_SPACE_INDENTATION).append(CLOSE_CURLY_BRACKET)
741 .append(getSubTreeFilteredCondition(name)).append(methodClose(EIGHT_SPACE));
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530742 return builder.toString();
743 }
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530744
Bharat saraswalb41904b2016-10-20 19:22:36 +0530745 private static String getAppInstanceCondition(String name, String condition) {
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530746 return APP_INSTANCE + PERIOD + name + OPEN_CLOSE_BRACKET_STRING + SPACE +
Bharat saraswalb41904b2016-10-20 19:22:36 +0530747 condition + EQUAL + SPACE + NULL;
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530748 }
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530749
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530750 private static String getSelectOrContainmentAssignString() {
751 return TWELVE_SPACE_INDENTATION + IS_ANY_SELECT_OR_CONTAINMENT_NODE_FLAG +
Bharat saraswalb41904b2016-10-20 19:22:36 +0530752 PERIOD + SET_METHOD_PREFIX + getOpenCloseParaWithValue(ZERO) +
753 signatureClose();
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530754 }
755
756 /**
757 * Returns filter content match for list types.
758 *
759 * @param javaAttributeInfo attribute information
760 * @param isLeafList if for leaf list
Bharat saraswal0663aff2016-10-18 23:16:14 +0530761 * @param node YANG node
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530762 * @return filter content match for list types
763 */
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530764 private static String getSubtreeFilteringForList(
Bharat saraswal0663aff2016-10-18 23:16:14 +0530765 JavaAttributeInfo javaAttributeInfo, boolean isLeafList,
766 YangNode node) {
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530767 StringBuilder builder = new StringBuilder();
768 String caps = getCapitalCase(javaAttributeInfo.getAttributeName());
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530769 String name = javaAttributeInfo.getAttributeName();
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530770 String type = javaAttributeInfo.getImportInfo().getClassInfo();
Bharat saraswala5c28512016-11-10 21:09:23 +0530771 if (javaAttributeInfo.getAttributeType() != null && javaAttributeInfo
772 .getAttributeType().getDataType() == IDENTITYREF) {
773 type = CLASS_STRING + DIAMOND_OPEN_BRACKET +
774 QUESTION_MARK + SPACE + EXTEND + SPACE +
775 type + DIAMOND_CLOSE_BRACKET;
776 }
777
778 YangDataStructure struct = getYangDataStructure
779 (javaAttributeInfo.getCompilerAnnotation());
780
781 boolean isMap = false;
782 if (struct != null && struct == YangDataStructure.MAP) {
783 isMap = true;
784 }
785
Bharat saraswal0663aff2016-10-18 23:16:14 +0530786 String clsInfo = DEFAULT_CAPS + type;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530787 if (javaAttributeInfo.isQualifiedName()) {
Bharat saraswala5c28512016-11-10 21:09:23 +0530788 if (javaAttributeInfo.getAttributeType() != null && javaAttributeInfo
789 .getAttributeType().getDataType() == IDENTITYREF) {
790 type = CLASS_STRING + DIAMOND_OPEN_BRACKET +
791 QUESTION_MARK + SPACE + EXTEND + SPACE +
792 javaAttributeInfo.getImportInfo().getPkgInfo() + PERIOD +
793 type + DIAMOND_CLOSE_BRACKET;
794 } else {
795 type = javaAttributeInfo.getImportInfo().getPkgInfo() + PERIOD +
796 type;
797 }
Bharat saraswal0663aff2016-10-18 23:16:14 +0530798 clsInfo = javaAttributeInfo.getImportInfo().getPkgInfo() + PERIOD +
799 clsInfo;
800 }
801
802 String classCast = getOpenCloseParaWithValue(clsInfo) + SPACE;
803 String cast = getOpenCloseParaWithValue(classCast + name);
Bharat saraswal0663aff2016-10-18 23:16:14 +0530804
805 if (node != null && node instanceof YangChoice) {
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530806 cast = name;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530807 }
Bharat saraswala5c28512016-11-10 21:09:23 +0530808 String validPass;
809 //If map is in DS then need to pass name.getValue() to processSubTree.
810 if (isMap) {
811 validPass = name + TWO + PERIOD + GET_VALUE;
812 } else {
813 validPass = name + TWO;
814 }
Bharat saraswalb41904b2016-10-20 19:22:36 +0530815 String resultString = cast + NEW_LINE + TWENTY_EIGHT_SPACE_INDENTATION +
816 PERIOD + PROCESS_SUBTREE_FILTERING + OPEN_PARENTHESIS +
Bharat saraswala5c28512016-11-10 21:09:23 +0530817 validPass + COMMA + SPACE + FALSE + CLOSE_PARENTHESIS + SEMI_COLON +
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530818 NEW_LINE;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530819 /*
820 * If select all schema child
821 */
Bharat saraswala5c28512016-11-10 21:09:23 +0530822 String forCondition;
823 String mapEntry;
824 String para;
825 //If map is there in DS the for loop should run for map entry.
826 if (!isMap) {
827 forCondition = getForLoopString(SIXTEEN_SPACE_INDENTATION, type, name,
828 getAppInstanceAttrString(name));
829 } else {
830 mapEntry = MAP + PERIOD + ENTRY + DIAMOND_OPEN_BRACKET + type +
831 KEYS + COMMA + SPACE + type + DIAMOND_CLOSE_BRACKET + SPACE;
832 para = getAppInstanceAttrString(name) + PERIOD + ENTRY_SET;
833 forCondition = getForLoopString(SIXTEEN_SPACE_INDENTATION,
834 mapEntry, name, para);
835 }
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530836 builder.append(getIfConditionBegin(EIGHT_SPACE_INDENTATION,
837 IS_SELECT_ALL_SCHEMA_CHILD_FLAG))
Bharat saraswalb41904b2016-10-20 19:22:36 +0530838 .append(getIfConditionBegin(TWELVE_SPACE_INDENTATION,
839 getAppInstanceCondition(name, NOT)))
Bharat saraswala5c28512016-11-10 21:09:23 +0530840 .append(forCondition);
Bharat saraswalb41904b2016-10-20 19:22:36 +0530841 String assignment;
Bharat saraswala5c28512016-11-10 21:09:23 +0530842 String result;
843 //If map is added then while creating dummy object need to used name
844 // .getValue() and to add the result in subTreeBuilder need to pass
845 // using key and value, key will be name.getKey() and value will be
846 // result.
847 if (isMap) {
848 result = getOpenCloseParaWithValue(name + PERIOD + GET_KEY + COMMA +
849 SPACE + RESULT);
850 } else {
851 result = getOpenCloseParaWithValue(RESULT);
852 }
Bharat saraswalb41904b2016-10-20 19:22:36 +0530853 if (!isLeafList) {
854 builder.append(TWENTY_SPACE_INDENTATION).append(type).append(SPACE)
855 .append(RESULT).append(signatureClose());
856 assignment = getDummyObjectCreation(node, name, type, clsInfo,
Bharat saraswala5c28512016-11-10 21:09:23 +0530857 classCast, true, isMap);
Bharat saraswalb41904b2016-10-20 19:22:36 +0530858 builder.append(assignment);
859 assignment = TWENTY_SPACE_INDENTATION +
860 SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + ADD_STRING +
Bharat saraswala5c28512016-11-10 21:09:23 +0530861 getCapitalCase(TO) + caps + result +
Bharat saraswalb41904b2016-10-20 19:22:36 +0530862 signatureClose();
863 builder.append(assignment);
864 } else {
865 assignment = TWENTY_SPACE_INDENTATION +
866 SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + ADD_STRING +
867 getCapitalCase(TO) + caps + getOpenCloseParaWithValue(name) +
868 signatureClose();
869 builder.append(assignment);
870 }
871 builder.append(methodClose(SIXTEEN_SPACE))
872 .append(TWELVE_SPACE_INDENTATION).append(CLOSE_CURLY_BRACKET);
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530873
Bharat saraswalb41904b2016-10-20 19:22:36 +0530874/* } else {
875 if (isSubTreeFiltered && leafList2() != null) {
876 subTreeFilteringResultBuilder.addToLeafList2(leafList2());
877 }
878 }*/
879 builder.append(getSubTreeFilteredCondition(name));
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530880
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530881 String cond = name + OPEN_CLOSE_BRACKET_STRING + SPACE + NOT + EQUAL +
882 SPACE + NULL;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530883
884 //If need to explicitly participate in query
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530885 builder.append(getElseIfConditionBegin(EIGHT_SPACE_INDENTATION, cond));
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530886
887 if (!isLeafList) {
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530888 builder.append(getSelectOrContainmentAssignString());
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530889 }
890
891 //If there is any parameter in the query condition
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530892 cond = NOT + name + OPEN_CLOSE_BRACKET_STRING + PERIOD + IS_EMPTY;
893 builder.append(getIfConditionBegin(TWELVE_SPACE_INDENTATION, cond));
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530894
895 if (isLeafList) {
Bharat saraswalb41904b2016-10-20 19:22:36 +0530896 cond = getAppInstanceCondition(name, EQUAL) + SPACE + OR_OPERATION +
897 SPACE + APP_INSTANCE + PERIOD + name +
898 OPEN_CLOSE_BRACKET_STRING + PERIOD + IS_EMPTY;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530899 /*
900 * If there is no app instance to perform content match
901 */
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530902 builder.append(getIfConditionBegin(SIXTEEN_SPACE_INDENTATION, cond))
903 .append(getReturnString(FALSE, TWENTY_SPACE_INDENTATION))
904 .append(signatureClose())
905 .append(methodClose(SIXTEEN_SPACE))
906 // for instance iterator
907 .append(getForLoopString(SIXTEEN_SPACE_INDENTATION, type, name,
908 name + OPEN_CLOSE_BRACKET_STRING));
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530909
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530910 assignment = TWENTY_SPACE_INDENTATION + BOOLEAN_DATA_TYPE + SPACE +
911 FLAG + SPACE + EQUAL + SPACE + FALSE + signatureClose();
912 builder.append(assignment)
913 // for app instance iterator
914 .append(getForLoopString(TWENTY_SPACE_INDENTATION, type,
915 name + TWO,
916 getAppInstanceAttrString(name)));
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530917
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530918 cond = name + PERIOD + EQUALS_STRING
919 + OPEN_PARENTHESIS + name + TWO + CLOSE_PARENTHESIS;
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530920 //the content match leaf list attribute value matches
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530921 builder.append(getIfConditionBegin(TWENTY_FOUR_SPACE_INDENTATION,
922 cond));
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530923
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530924 assignment = TWENTY_EIGHT_SPACE_INDENTATION + FLAG + SPACE + EQUAL +
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530925 SPACE + TRUE + SEMI_COLON + NEW_LINE;
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530926 builder.append(assignment);
927 assignment = TWENTY_EIGHT_SPACE_INDENTATION +
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530928 SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + ADD_STRING +
Bharat saraswala5c28512016-11-10 21:09:23 +0530929 getCapitalCase(TO) + caps + getOpenCloseParaWithValue(name + TWO) +
930 signatureClose();
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530931 builder.append(assignment).append(TWENTY_EIGHT_SPACE_INDENTATION)
932 .append(BREAK).append(signatureClose())
933 //the content match leaf list attribute value matches
934 .append(methodClose(TWENTY_FOUR_SPACE))
935 // for app instance iterator
936 .append(methodClose(TWENTY_SPACE))
937 //if the content match failed
938 .append(getIfConditionBegin(TWENTY_SPACE_INDENTATION, NOT +
939 FLAG))
940 .append(getReturnString(FALSE, TWENTY_FOUR_SPACE_INDENTATION))
941 .append(signatureClose()).append(methodClose(TWENTY_SPACE))// if flag == false
942 .append(methodClose(SIXTEEN_SPACE)); // for instance iterator
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530943
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530944 } else {
Bharat saraswalb41904b2016-10-20 19:22:36 +0530945 cond = getAppInstanceCondition(name, NOT) + SPACE + AND_OPERATION +
946 SPACE + NOT + getAppInstanceAttrString(name) +
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530947 PERIOD + IS_EMPTY;
Bharat saraswala5c28512016-11-10 21:09:23 +0530948 //Same here for loop for map entry.
949 if (!isMap) {
950 forCondition = getForLoopString(TWENTY_SPACE_INDENTATION, type,
951 name + TWO,
952 getAppInstanceAttrString(name));
953 } else {
954 mapEntry = MAP + PERIOD + ENTRY + DIAMOND_OPEN_BRACKET + type +
955 KEYS + COMMA + SPACE + type + DIAMOND_CLOSE_BRACKET + SPACE;
956 para = getAppInstanceAttrString(name) + PERIOD + ENTRY_SET;
957 forCondition = getForLoopString(TWENTY_SPACE_INDENTATION,
958 mapEntry, name + TWO, para);
959 }
960 String forCondition2;
961 //Same here for loop for map entry.
962 if (!isMap) {
963 forCondition2 = getForLoopString(SIXTEEN_SPACE_INDENTATION, type, name,
964 name + OPEN_CLOSE_BRACKET_STRING);
965 } else {
966 mapEntry = MAP + PERIOD + ENTRY + DIAMOND_OPEN_BRACKET + type +
967 KEYS + COMMA + SPACE + type + DIAMOND_CLOSE_BRACKET + SPACE;
968 para = name + OPEN_CLOSE_BRACKET_STRING + PERIOD + ENTRY_SET;
969 forCondition2 = getForLoopString(SIXTEEN_SPACE_INDENTATION,
970 mapEntry, name, para);
971 }
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530972 /*if there is any app instance entry*/
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530973 builder.append(getIfConditionBegin(SIXTEEN_SPACE_INDENTATION,
974 cond))
975 //loop all the app instance(s)
Bharat saraswala5c28512016-11-10 21:09:23 +0530976 .append(forCondition2)
977 .append(forCondition);
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530978
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530979
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530980 assignment = TWENTY_EIGHT_SPACE_INDENTATION + type + SPACE +
981 RESULT + SPACE + EQUAL + SPACE + resultString;
982 builder.append(assignment);
983 cond = RESULT + SPACE + NOT + EQUAL + SPACE + NULL;
984 builder.append(getIfConditionBegin(TWENTY_EIGHT_SPACE_INDENTATION, cond));
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +0530985
Bharat saraswala5c28512016-11-10 21:09:23 +0530986 //If map is added then while creating dummy object need to used name
987 // .getValue() and to add the result in subTreeBuilder need to pass
988 // using key and value, key will be name.getKey() and value will be
989 // result.
990 if (isMap) {
991 result = getOpenCloseParaWithValue(name + TWO + PERIOD + GET_KEY +
992 COMMA +
993 SPACE + RESULT);
994 } else {
995 result = getOpenCloseParaWithValue(RESULT);
996 }
Bharat saraswalc2fd3222016-10-19 16:10:27 +0530997 assignment = THIRTY_TWO_SPACE_INDENTATION +
VinodKumarS-Huawei8f164222016-08-31 15:47:30 +0530998 SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + ADD_STRING +
Bharat saraswala5c28512016-11-10 21:09:23 +0530999 getCapitalCase(TO) + caps + result + signatureClose();
Bharat saraswalc2fd3222016-10-19 16:10:27 +05301000 builder.append(assignment).append(methodClose(TWENTY_EIGHT_SPACE))
1001 //loop all the app instance(s)
1002 .append(methodClose(TWENTY_FOUR_SPACE))
1003 //loop all the query condition instance(s)
1004 .append(methodClose(TWENTY_SPACE))
Bharat saraswalb41904b2016-10-20 19:22:36 +05301005 .append(SIXTEEN_SPACE_INDENTATION).append(CLOSE_CURLY_BRACKET)
1006 .append(getSubTreeFilteredCondition(name));
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301007 //if there is any app instance entry
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301008 }
1009
Bharat saraswalc2fd3222016-10-19 16:10:27 +05301010 cond = TWELVE_SPACE_INDENTATION + CLOSE_CURLY_BRACKET
1011 + ELSE + OPEN_CURLY_BRACKET + NEW_LINE;
1012 builder.append(cond);
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301013
1014 if (isLeafList) {
Bharat saraswalc2fd3222016-10-19 16:10:27 +05301015 builder.append(getSelectOrContainmentAssignString());
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301016 }
Bharat saraswala5c28512016-11-10 21:09:23 +05301017
1018 //need to pass name.getKey() and name.getValue() while adding to
1019 // subtree builder.
1020 if (!isMap) {
1021 forCondition = getForLoopString(SIXTEEN_SPACE_INDENTATION, type,
1022 name, getAppInstanceAttrString(name));
1023 } else {
1024 mapEntry = MAP + PERIOD + ENTRY + DIAMOND_OPEN_BRACKET + type +
1025 KEYS + COMMA + SPACE + type + DIAMOND_CLOSE_BRACKET + SPACE;
1026 para = getAppInstanceAttrString(name) + PERIOD + ENTRY_SET;
1027 forCondition = getForLoopString(SIXTEEN_SPACE_INDENTATION,
1028 mapEntry, name, para);
1029 }
Bharat saraswalb41904b2016-10-20 19:22:36 +05301030 cond = getAppInstanceCondition(name, NOT) + SPACE + AND_OPERATION +
Bharat saraswalc2fd3222016-10-19 16:10:27 +05301031 SPACE + NOT + getAppInstanceAttrString(name) + PERIOD + IS_EMPTY;
1032 builder.append(getIfConditionBegin(SIXTEEN_SPACE_INDENTATION, cond))
Bharat saraswala5c28512016-11-10 21:09:23 +05301033 .append(forCondition);
1034 if (isMap) {
1035 result = getOpenCloseParaWithValue(name + PERIOD + GET_KEY + COMMA +
1036 SPACE + name + PERIOD +
1037 GET_VALUE);
1038 } else {
1039 result = getOpenCloseParaWithValue(name);
1040 }
Bharat saraswalc2fd3222016-10-19 16:10:27 +05301041 assignment = TWENTY_FOUR_SPACE_INDENTATION +
1042 SUBTREE_FILTERING_RESULT_BUILDER + PERIOD + ADD_STRING +
Bharat saraswala5c28512016-11-10 21:09:23 +05301043 getCapitalCase(TO) + caps + result + signatureClose();
Bharat saraswalc2fd3222016-10-19 16:10:27 +05301044 builder.append(assignment).append(methodClose(TWENTY_SPACE))// Close collection Iteration loop
1045 // close if condition
1046 .append(methodClose(SIXTEEN_SPACE))
1047 .append(methodClose(TWELVE_SPACE))// close else condition
1048 .append(methodClose(EIGHT_SPACE));// close else if condition
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301049
Bharat saraswalc2fd3222016-10-19 16:10:27 +05301050 return builder.toString();
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301051 }
1052
janani b110f7f72016-10-27 19:04:18 +05301053 public static String getAugmentableSubTreeFiltering() {
Bharat saraswala5c28512016-11-10 21:09:23 +05301054 return " if (yangAugmentedInfoMap.isEmpty()) {\n" +
Bharat saraswal51c5d672016-11-13 09:03:48 +05301055 " java.util.Set<Map.Entry<Class<?>, Object>> " +
1056 "augment =" +
Bharat saraswala5c28512016-11-10 21:09:23 +05301057 " appInstance.yangAugmentedInfoMap().entrySet();\n" +
1058 " if (augment != null && !augment.isEmpty()) {\n" +
Bharat saraswal51c5d672016-11-13 09:03:48 +05301059 " java.util.Iterator<Map.Entry<Class<?>, " +
1060 "Object>> augItr =" +
Bharat saraswala5c28512016-11-10 21:09:23 +05301061 " augment.iterator();\n" +
1062 " while (augItr.hasNext()) {\n" +
1063 " Map.Entry<Class<?>, Object> aug =" +
1064 " augItr.next();\n" +
1065 " Class<?> augClass = aug.getKey();\n" +
1066 " String augClassName = augClass.getName();\n" +
1067 " int index = augClassName.lastIndexOf('.');\n" +
1068 " String classPackage = augClassName.substring(0, index) +\n" +
1069 " \".\" + \"Default\" + augClass.getSimpleName() + \"$\"\n" +
1070 " + augClass.getSimpleName() + \"Builder\";\n" +
1071 " ClassLoader classLoader = augClass.getClassLoader();\n" +
1072 " try {\n" +
1073 " Class<?> builderClass;\n" +
1074 " builderClass = classLoader.loadClass(classPackage);\n" +
1075 " Object builderObj = builderClass.newInstance();\n" +
Bharat saraswal51c5d672016-11-13 09:03:48 +05301076 " java.lang.reflect.Method method = " +
1077 "builderClass.getMethod(\"build\");\n" +
Bharat saraswala5c28512016-11-10 21:09:23 +05301078 " Object defaultObj = method.invoke(builderObj);\n" +
1079 " Class<?> defaultClass = defaultObj.getClass();\n" +
1080 " method = defaultClass.getMethod(" +
1081 "\"processSubtreeFiltering\", augClass, boolean.class);\n" +
1082 " Object result = method.invoke(" +
1083 "defaultObj, aug.getValue(), true);\n" +
1084 " subTreeFilteringResultBuilder." +
1085 "addYangAugmentedInfo(result, augClass);\n" +
1086 " } catch (ClassNotFoundException | InstantiationException\n" +
janani b110f7f72016-10-27 19:04:18 +05301087 " | NoSuchMethodException |\n" +
Bharat saraswala5c28512016-11-10 21:09:23 +05301088 " InvocationTargetException | IllegalAccessException e) {\n" +
Bharat saraswal0663aff2016-10-18 23:16:14 +05301089 " }\n" +
janani b110f7f72016-10-27 19:04:18 +05301090 " }\n" +
1091 " }\n" +
Bharat saraswala5c28512016-11-10 21:09:23 +05301092 " } else {\n" +
Bharat saraswal51c5d672016-11-13 09:03:48 +05301093 " java.util.Set<Map.Entry<Class<?>, Object>> augment = yangAugmentedInfoMap\n" +
Bharat saraswala5c28512016-11-10 21:09:23 +05301094 " .entrySet();\n" +
Bharat saraswal51c5d672016-11-13 09:03:48 +05301095 " java.util.Iterator<Map.Entry<Class<?>, Object>> augItr = augment.iterator();\n" +
Bharat saraswala5c28512016-11-10 21:09:23 +05301096 " while (augItr.hasNext()) {\n" +
1097 " Map.Entry<Class<?>, Object> aug = augItr.next();\n" +
janani b110f7f72016-10-27 19:04:18 +05301098 " Class<?> augClass = aug.getKey();\n" +
Bharat saraswala5c28512016-11-10 21:09:23 +05301099 " Object appInstanceInfo = appInstance." +
1100 "yangAugmentedInfo(augClass);\n" +
1101 " if (appInstanceInfo == null) {\n" +
1102 " subTreeFilteringResultBuilder." +
1103 "addYangAugmentedInfo(aug.getValue(), aug.getKey());\n" +
1104 " } else {\n" +
1105 " Object processSubtreeFiltering;\n" +
1106 " try {\n" +
1107 " processSubtreeFiltering = " +
1108 "aug.getValue().getClass()\n" +
1109 " .getMethod(\"processSubtreeFiltering\"," +
1110 " aug.getKey(), boolean.class)\n" +
1111 " .invoke(aug.getValue(), appInstanceInfo, true);\n" +
1112 " if (processSubtreeFiltering != null) {\n" +
1113 " subTreeFilteringResultBuilder\n" +
1114 " .addYangAugmentedInfo(" +
1115 "processSubtreeFiltering, aug.getKey());\n" +
1116 " }\n" +
1117 " } catch (NoSuchMethodException | InvocationTargetException |\n" +
1118 " IllegalAccessException e) {\n" +
janani b110f7f72016-10-27 19:04:18 +05301119 " }\n" +
Bharat saraswal0663aff2016-10-18 23:16:14 +05301120 " }\n" +
1121 " }\n" +
1122 " }\n";
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301123 }
Bharat saraswal0663aff2016-10-18 23:16:14 +05301124
Bharat saraswalb41904b2016-10-20 19:22:36 +05301125 private static String getSubTreeFilteredCondition(String name) {
1126 StringBuilder builder = new StringBuilder();
1127 String cond = SUBTREE_FILTERED + SPACE + AND_OPERATION + SPACE + name +
1128 OPEN_CLOSE_BRACKET_STRING + SPACE + NOT + EQUAL + SPACE + NULL;
1129
1130 builder.append(ELSE).append(OPEN_CURLY_BRACKET).append(NEW_LINE)
1131 .append(getIfConditionBegin(SIXTEEN_SPACE_INDENTATION, cond))
1132 .append(TWENTY_SPACE_INDENTATION)
1133 .append(SUBTREE_FILTERING_RESULT_BUILDER).append(PERIOD)
1134 .append(name).append(getOpenCloseParaWithValue(name)).append(
1135 signatureClose()).append(SIXTEEN_SPACE_INDENTATION).append(
1136 CLOSE_CURLY_BRACKET).append(NEW_LINE).append(TWELVE_SPACE_INDENTATION)
1137 .append(CLOSE_CURLY_BRACKET).append(NEW_LINE);
1138 return builder.toString();
1139 }
1140
Bharat saraswalc2fd3222016-10-19 16:10:27 +05301141 private static String getNameOfClassForIfCase(YangNode curNode) {
1142 String name = null;
1143 JavaFileInfoTranslator parentInfo;
1144 if (curNode instanceof YangCase) {
1145 YangNode parent = curNode.getParent();
1146 if (parent instanceof YangChoice) {
1147 parentInfo = ((JavaFileInfoContainer) parent).getJavaFileInfo();
1148 name = getCapitalCase(parentInfo.getJavaName());
1149 } else if (parent instanceof YangAugment) {
1150 parentInfo = ((JavaFileInfoContainer) ((YangAugment) parent)
1151 .getAugmentedNode()).getJavaFileInfo();
1152 if (parentInfo != null) {
1153 name = getCapitalCase(parentInfo.getJavaName());
1154 } else {
1155 name = getCapitalCase(getCamelCase(
1156 ((YangAugment) parent).getAugmentedNode().getName(),
1157 null));
1158 }
1159 }
Bharat saraswal0663aff2016-10-18 23:16:14 +05301160 }
Bharat saraswalc2fd3222016-10-19 16:10:27 +05301161 return name;
Bharat saraswal0663aff2016-10-18 23:16:14 +05301162 }
1163
Bharat saraswalc2fd3222016-10-19 16:10:27 +05301164 private static String getCaseCastString(
1165 JavaFileInfoTranslator javaFileInfo, String instance, YangNode curNode) {
1166 if (curNode instanceof YangCase) {
1167 String caseName = DEFAULT_CAPS + getCapitalCase(
1168 javaFileInfo.getJavaName());
1169 return EIGHT_SPACE_INDENTATION + caseName + SPACE + APP_INSTANCE + SPACE +
1170 EQUAL + SPACE + OPEN_PARENTHESIS + caseName +
1171 CLOSE_PARENTHESIS + SPACE + instance + signatureClose();
Bharat saraswal0663aff2016-10-18 23:16:14 +05301172 }
Bharat saraswalc2fd3222016-10-19 16:10:27 +05301173 return null;
Bharat saraswal0663aff2016-10-18 23:16:14 +05301174 }
1175
Bharat saraswalb41904b2016-10-20 19:22:36 +05301176 private static String getDummyObjectCreation(YangNode node, String name,
1177 String clsInfo, String type,
Bharat saraswala5c28512016-11-10 21:09:23 +05301178 String classCast, boolean isList,
1179 boolean isMap) {
Bharat saraswalb41904b2016-10-20 19:22:36 +05301180 String para = getAppInstanceAttrString(name);
1181 if (isList) {
Bharat saraswala5c28512016-11-10 21:09:23 +05301182 if (isMap) {
1183 para = name + PERIOD + GET_VALUE;
1184 } else {
1185 para = name;
1186 }
Bharat saraswalb41904b2016-10-20 19:22:36 +05301187 }
1188 if (node != null && node instanceof YangChoice) {
1189 return getChoiceReflectionResult(name, clsInfo);
1190 }
1191 return TWENTY_SPACE_INDENTATION + RESULT + SPACE + EQUAL + SPACE +
1192 getOpenCloseParaWithValue(
1193 classCast + type + PERIOD + BUILDER_LOWER_CASE +
1194 OPEN_CLOSE_BRACKET_STRING + NEW_LINE +
1195 TWENTY_EIGHT_SPACE_INDENTATION + PERIOD +
1196 BUILD_FOR_FILTER + OPEN_CLOSE_BRACKET_STRING) +
1197 PERIOD + PROCESS_SUBTREE_FILTERING + getOpenCloseParaWithValue(
1198 para + COMMA + SPACE + TRUE) + signatureClose();
1199
1200 }
1201
1202 private static String getChoiceReflectionResult(String name, String returnType) {
1203 String call = "appInstance." + name + "()";
1204 return " Class<?>[] classArray = " + call + "" +
1205 ".getClass()" +
1206 ".getInterfaces();\n" +
1207 " Class<?> caseClass = classArray[0];\n" +
1208 " try {\n" +
1209 " Object obj1 = caseClass.newInstance();\n" +
Bharat saraswal51c5d672016-11-13 09:03:48 +05301210 " java.lang.reflect.Method method =" +
1211 " caseClass.getMethod(\"builder\", caseClass);\n" +
Bharat saraswalb41904b2016-10-20 19:22:36 +05301212 " Object obj = method.invoke(obj1," +
1213 " (Object) null);\n" +
1214 " method = caseClass.getMethod(\"build\", caseClass);\n" +
1215 " Object obj2 = method.invoke(obj, " +
1216 "(Object) null);\n" +
1217 " method = caseClass.getMethod(\"processSubtreeFiltering\", caseClass);\n" +
1218 " result = (" + returnType + ") method.invoke" +
1219 "(obj2, " + call + ", true);\n" +
1220 " } catch (NoSuchMethodException | InstantiationException |\n" +
1221 " IllegalAccessException | InvocationTargetException e) {\n" +
1222 " e.printStackTrace();\n" +
1223 " }\n";
1224 }
VinodKumarS-Huawei9a91b482016-08-19 23:22:59 +05301225}