blob: 00d7a196031ff799936cf89881d75896b8784cf4 [file] [log] [blame]
Bharat saraswalc46ee2a2016-02-25 02:26:43 +05301/*
Brian O'Connor0f7908b2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Bharat saraswalc46ee2a2016-02-25 02:26:43 +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
Gaurav Agrawalbfce9342016-06-15 13:58:01 +053017package org.onosproject.yangutils.translator.tojava.javamodel;
Bharat saraswalc46ee2a2016-02-25 02:26:43 +053018
Bharat saraswale2bc60d2016-04-16 02:28:25 +053019import org.onosproject.yangutils.datamodel.YangDerivedInfo;
Bharat saraswal68fa0d12016-04-19 01:00:16 +053020import org.onosproject.yangutils.datamodel.YangEnumeration;
Shankara-Huawei234cd092016-07-14 11:35:34 +053021import org.onosproject.yangutils.datamodel.YangIdentity;
Shankara-Huawei234cd092016-07-14 11:35:34 +053022import org.onosproject.yangutils.datamodel.YangIdentityRef;
Shankara-Huaweib7564772016-08-02 18:13:13 +053023import org.onosproject.yangutils.datamodel.YangLeafRef;
Bharat saraswale2bc60d2016-04-16 02:28:25 +053024import org.onosproject.yangutils.datamodel.YangNode;
Bharat saraswalc46ee2a2016-02-25 02:26:43 +053025import org.onosproject.yangutils.datamodel.YangType;
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +053026import org.onosproject.yangutils.datamodel.YangUnion;
janani b0e4e8ae2016-07-13 21:06:41 +053027import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
Bharat saraswale2bc60d2016-04-16 02:28:25 +053028import org.onosproject.yangutils.translator.exception.TranslatorException;
Gaurav Agrawalbfce9342016-06-15 13:58:01 +053029import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
Gaurav Agrawalab7c4bd2016-05-17 18:06:38 +053030import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
Gaurav Agrawale5057f02016-08-22 17:14:33 +053031import org.onosproject.yangutils.translator.tojava.JavaFileInfoTranslator;
32import org.onosproject.yangutils.utils.io.YangToJavaNamingConflictUtil;
Bharat saraswal84366c52016-03-23 19:40:35 +053033
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +053034import java.util.Stack;
35
Bharat saraswalaf413b82016-07-14 15:18:20 +053036import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.getCurNodePackage;
Gaurav Agrawalab7c4bd2016-05-17 18:06:38 +053037import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getRootPackage;
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +053038import static org.onosproject.yangutils.utils.UtilConstants.BIG_DECIMAL;
Shankara-Huaweib7564772016-08-02 18:13:13 +053039import static org.onosproject.yangutils.utils.UtilConstants.BIG_INTEGER;
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +053040import static org.onosproject.yangutils.utils.UtilConstants.BIT_SET;
Bharat saraswal84366c52016-03-23 19:40:35 +053041import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_DATA_TYPE;
42import static org.onosproject.yangutils.utils.UtilConstants.BOOLEAN_WRAPPER;
43import static org.onosproject.yangutils.utils.UtilConstants.BYTE;
44import static org.onosproject.yangutils.utils.UtilConstants.BYTE_WRAPPER;
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +053045import static org.onosproject.yangutils.utils.UtilConstants.COLLECTION_IMPORTS;
Bharat saraswal84366c52016-03-23 19:40:35 +053046import static org.onosproject.yangutils.utils.UtilConstants.INT;
47import static org.onosproject.yangutils.utils.UtilConstants.INTEGER_WRAPPER;
48import static org.onosproject.yangutils.utils.UtilConstants.JAVA_LANG;
Bharat saraswale2bc60d2016-04-16 02:28:25 +053049import static org.onosproject.yangutils.utils.UtilConstants.JAVA_MATH;
Bharat saraswal84366c52016-03-23 19:40:35 +053050import static org.onosproject.yangutils.utils.UtilConstants.LONG;
51import static org.onosproject.yangutils.utils.UtilConstants.LONG_WRAPPER;
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +053052import static org.onosproject.yangutils.utils.UtilConstants.OBJECT_STRING;
Bharat saraswale2bc60d2016-04-16 02:28:25 +053053import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
Bharat saraswal84366c52016-03-23 19:40:35 +053054import static org.onosproject.yangutils.utils.UtilConstants.SHORT;
55import static org.onosproject.yangutils.utils.UtilConstants.SHORT_WRAPPER;
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +053056import static org.onosproject.yangutils.utils.UtilConstants.SQUARE_BRACKETS;
Bharat saraswal84366c52016-03-23 19:40:35 +053057import static org.onosproject.yangutils.utils.UtilConstants.STRING_DATA_TYPE;
Gaurav Agrawalbfce9342016-06-15 13:58:01 +053058import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
59import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
60import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getPackageDirPathFromJavaJPackage;
Bharat saraswalc46ee2a2016-02-25 02:26:43 +053061
62/**
Bharat saraswal63f26fb2016-04-05 15:13:44 +053063 * Represents java data types info corresponding to YANG type.
Bharat saraswalc46ee2a2016-02-25 02:26:43 +053064 */
65public final class AttributesJavaDataType {
66
67 /**
Bharat saraswal63f26fb2016-04-05 15:13:44 +053068 * Creates an instance of attribute java data type.
Bharat saraswalc46ee2a2016-02-25 02:26:43 +053069 */
70 private AttributesJavaDataType() {
71 }
72
73 /**
Vinod Kumar S08710982016-03-03 19:55:30 +053074 * Returns java type.
Bharat saraswalc46ee2a2016-02-25 02:26:43 +053075 *
76 * @param yangType YANG type
Vinod Kumar S08710982016-03-03 19:55:30 +053077 * @return java type
Bharat saraswalc46ee2a2016-02-25 02:26:43 +053078 */
Vinod Kumar S08710982016-03-03 19:55:30 +053079 public static String getJavaDataType(YangType<?> yangType) {
Bharat saraswal84366c52016-03-23 19:40:35 +053080
Vinod Kumar S08710982016-03-03 19:55:30 +053081 YangDataTypes type = yangType.getDataType();
Bharat saraswalc46ee2a2016-02-25 02:26:43 +053082
Bharat saraswale2bc60d2016-04-16 02:28:25 +053083 switch (type) {
84 case INT8:
85 return BYTE;
86 case INT16:
87 return SHORT;
88 case INT32:
89 return INT;
90 case INT64:
91 return LONG;
92 case UINT8:
93 return SHORT;
94 case UINT16:
95 return INT;
96 case UINT32:
97 return LONG;
98 case UINT64:
99 return BIG_INTEGER;
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530100 case BITS:
101 return BIT_SET;
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530102 case BINARY:
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530103 return BYTE + SQUARE_BRACKETS;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530104 case DECIMAL64:
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530105 return BIG_DECIMAL;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530106 case STRING:
107 return STRING_DATA_TYPE;
108 case BOOLEAN:
109 return BOOLEAN_DATA_TYPE;
janani b0e4e8ae2016-07-13 21:06:41 +0530110 case INSTANCE_IDENTIFIER:
111 return STRING_DATA_TYPE;
112 case LEAFREF:
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +0530113 YangType refType = getReferredTypeFromLeafref(yangType);
114 if (refType == null) {
115 return OBJECT_STRING;
116 }
janani b0e4e8ae2016-07-13 21:06:41 +0530117 return getJavaDataType(getReferredTypeFromLeafref(yangType));
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530118 default:
Bharat saraswale3175d32016-08-31 17:50:11 +0530119 throw new TranslatorException("given data type is not supported. " +
Bharat saraswal1edde622016-09-06 10:18:04 +0530120 yangType.getDataTypeName() + " in " +
121 yangType.getLineNumber() + " at " +
122 yangType.getCharPosition()
123 + " in " + yangType.getFileName());
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530124 }
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530125 }
Vinod Kumar S08710982016-03-03 19:55:30 +0530126
127 /**
128 * Returns java import class.
129 *
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530130 * @param yangType YANG type
131 * @param isListAttr if the attribute need to be a list
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530132 * @param pluginConfig plugin configurations
Vinod Kumar S08710982016-03-03 19:55:30 +0530133 * @return java import class
134 */
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530135 public static String getJavaImportClass(YangType<?> yangType, boolean isListAttr,
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530136 YangToJavaNamingConflictUtil pluginConfig) {
Bharat saraswal84366c52016-03-23 19:40:35 +0530137
Vinod Kumar S08710982016-03-03 19:55:30 +0530138 YangDataTypes type = yangType.getDataType();
139
140 if (isListAttr) {
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530141 switch (type) {
142 case INT8:
143 return BYTE_WRAPPER;
144 case INT16:
145 return SHORT_WRAPPER;
146 case INT32:
147 return INTEGER_WRAPPER;
148 case INT64:
149 return LONG_WRAPPER;
150 case UINT8:
151 return SHORT_WRAPPER;
152 case UINT16:
153 return INTEGER_WRAPPER;
154 case UINT32:
155 return LONG_WRAPPER;
156 case UINT64:
157 return BIG_INTEGER;
158 case DECIMAL64:
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530159 return BIG_DECIMAL;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530160 case STRING:
161 return STRING_DATA_TYPE;
162 case BOOLEAN:
163 return BOOLEAN_WRAPPER;
164 case ENUMERATION:
janani b703cfe42016-05-17 13:12:22 +0530165 return getCapitalCase(
Shankara-Huaweib7564772016-08-02 18:13:13 +0530166 getCamelCase(((YangJavaEnumerationTranslator) yangType.getDataTypeExtendedInfo()).getName(),
Bharat saraswal1edde622016-09-06 10:18:04 +0530167 pluginConfig));
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530168 case BITS:
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530169 return BIT_SET;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530170 case BINARY:
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530171 return BYTE + SQUARE_BRACKETS;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530172 case LEAFREF:
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +0530173 return getLeafRefImpClass(yangType, pluginConfig, true);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530174 case IDENTITYREF:
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +0530175 return getIdentityRefImpClass(yangType, pluginConfig);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530176 case EMPTY:
177 return BOOLEAN_WRAPPER;
178 case UNION:
Shankara-Huaweib7564772016-08-02 18:13:13 +0530179 return getCapitalCase(getCamelCase(((YangJavaUnionTranslator) yangType
180 .getDataTypeExtendedInfo()).getName(), pluginConfig));
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530181 case INSTANCE_IDENTIFIER:
janani b0e4e8ae2016-07-13 21:06:41 +0530182 return STRING_DATA_TYPE;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530183 case DERIVED:
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530184 return getCapitalCase(
185 getCamelCase(yangType.getDataTypeName(), pluginConfig));
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530186 default:
Bharat saraswale3175d32016-08-31 17:50:11 +0530187 throw new TranslatorException("given data type is not supported ." +
Bharat saraswal1edde622016-09-06 10:18:04 +0530188 yangType.getDataTypeName() + " in " +
189 yangType.getLineNumber() + " at " +
190 yangType.getCharPosition()
191 + " in " + yangType.getFileName());
Vinod Kumar S08710982016-03-03 19:55:30 +0530192 }
193 } else {
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530194 switch (type) {
195 case UINT64:
196 return BIG_INTEGER;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530197 case STRING:
198 return STRING_DATA_TYPE;
199 case ENUMERATION:
janani b703cfe42016-05-17 13:12:22 +0530200 return getCapitalCase(
Shankara-Huaweib7564772016-08-02 18:13:13 +0530201 getCamelCase(((YangJavaEnumerationTranslator) yangType.getDataTypeExtendedInfo()).getName(),
Bharat saraswal1edde622016-09-06 10:18:04 +0530202 pluginConfig));
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530203 case BITS:
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530204 return BIT_SET;
205 case DECIMAL64:
206 return BIG_DECIMAL;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530207 case LEAFREF:
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +0530208 return getLeafRefImpClass(yangType, pluginConfig, false);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530209 case IDENTITYREF:
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +0530210 return getIdentityRefImpClass(yangType, pluginConfig);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530211 case EMPTY:
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530212 return BOOLEAN_DATA_TYPE;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530213 case UNION:
Shankara-Huaweib7564772016-08-02 18:13:13 +0530214 return getCapitalCase(getCamelCase(((YangJavaUnionTranslator) yangType
215 .getDataTypeExtendedInfo()).getName(), pluginConfig));
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530216 case INSTANCE_IDENTIFIER:
janani b0e4e8ae2016-07-13 21:06:41 +0530217 return STRING_DATA_TYPE;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530218 case DERIVED:
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530219 return getCapitalCase(
220 getCamelCase(yangType.getDataTypeName(), pluginConfig));
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530221 default:
222 return null;
Vinod Kumar S08710982016-03-03 19:55:30 +0530223 }
224 }
Vinod Kumar S08710982016-03-03 19:55:30 +0530225 }
226
227 /**
228 * Returns java import package.
229 *
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530230 * @param yangType YANG type
231 * @param isListAttr if the attribute is of list type
janani b3e357f62016-05-19 17:39:50 +0530232 * @param conflictResolver object of YANG to java naming conflict util
Vinod Kumar S08710982016-03-03 19:55:30 +0530233 * @return java import package
234 */
Bharat saraswal5cd9e9c2016-05-26 23:48:38 +0530235 public static String getJavaImportPackage(YangType<?> yangType, boolean isListAttr,
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530236 YangToJavaNamingConflictUtil conflictResolver) {
Bharat saraswal84366c52016-03-23 19:40:35 +0530237
Vinod Kumar S08710982016-03-03 19:55:30 +0530238 YangDataTypes type = yangType.getDataType();
239
240 if (isListAttr) {
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530241 switch (type) {
242 case INT8:
243 case INT16:
244 case INT32:
245 case INT64:
246 case UINT8:
247 case UINT16:
248 case UINT32:
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530249 case BINARY:
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530250 case STRING:
251 case BOOLEAN:
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530252 case EMPTY:
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530253 return JAVA_LANG;
254 case UINT64:
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530255 case DECIMAL64:
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530256 return JAVA_MATH;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530257 case ENUMERATION:
janani b3e357f62016-05-19 17:39:50 +0530258 return getEnumsPackage(yangType, conflictResolver);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530259 case BITS:
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530260 return COLLECTION_IMPORTS;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530261 case LEAFREF:
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +0530262 return getLeafRefImpPkg(yangType, conflictResolver, true);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530263 case IDENTITYREF:
Shankara-Huawei234cd092016-07-14 11:35:34 +0530264 return getIdentityRefPackage(yangType, conflictResolver);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530265 case UNION:
janani b3e357f62016-05-19 17:39:50 +0530266 return getUnionPackage(yangType, conflictResolver);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530267 case INSTANCE_IDENTIFIER:
janani b0e4e8ae2016-07-13 21:06:41 +0530268 return JAVA_LANG;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530269 case DERIVED:
Bharat saraswal8beac342016-08-04 02:00:03 +0530270 return getTypeDefsPackage(yangType, conflictResolver);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530271 default:
Bharat saraswale3175d32016-08-31 17:50:11 +0530272 throw new TranslatorException("given data type is not supported. " +
Bharat saraswal1edde622016-09-06 10:18:04 +0530273 yangType.getDataTypeName() + " in " +
274 yangType.getLineNumber() + " at " +
275 yangType.getCharPosition()
276 + " in " + yangType.getFileName());
Vinod Kumar S08710982016-03-03 19:55:30 +0530277 }
278 } else {
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530279 switch (type) {
280 case UINT64:
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530281 case DECIMAL64:
Bharat saraswal250a7472016-05-12 13:16:57 +0530282 return JAVA_MATH;
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530283 case EMPTY:
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530284 case STRING:
285 return JAVA_LANG;
286 case ENUMERATION:
janani b3e357f62016-05-19 17:39:50 +0530287 return getEnumsPackage(yangType, conflictResolver);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530288 case BITS:
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530289 return COLLECTION_IMPORTS;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530290 case LEAFREF:
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +0530291 return getLeafRefImpPkg(yangType, conflictResolver, false);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530292 case IDENTITYREF:
Shankara-Huawei234cd092016-07-14 11:35:34 +0530293 return getIdentityRefPackage(yangType, conflictResolver);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530294 case UNION:
janani b3e357f62016-05-19 17:39:50 +0530295 return getUnionPackage(yangType, conflictResolver);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530296 case INSTANCE_IDENTIFIER:
janani b0e4e8ae2016-07-13 21:06:41 +0530297 return JAVA_LANG;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530298 case DERIVED:
Bharat saraswal8beac342016-08-04 02:00:03 +0530299 return getTypeDefsPackage(yangType, conflictResolver);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530300 default:
301 return null;
Vinod Kumar S08710982016-03-03 19:55:30 +0530302 }
303 }
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530304 }
305
306 /**
307 * Returns java package for typedef node.
308 *
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530309 * @param type YANG type
janani b3e357f62016-05-19 17:39:50 +0530310 * @param conflictResolver object of YANG to java naming conflict util
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530311 * @return java package for typedef node
312 */
Bharat saraswal8beac342016-08-04 02:00:03 +0530313 private static String getTypeDefsPackage(YangType<?> type, YangToJavaNamingConflictUtil conflictResolver) {
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530314 Object var = type.getDataTypeExtendedInfo();
315 if (!(var instanceof YangDerivedInfo)) {
Bharat saraswale3175d32016-08-31 17:50:11 +0530316 throw new TranslatorException("type should have been derived. " +
Bharat saraswal1edde622016-09-06 10:18:04 +0530317 type.getDataTypeName() + " in " +
318 type.getLineNumber() + " at " +
319 type.getCharPosition()
320 + " in " + type.getFileName());
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530321 }
322
Shankara-Huaweib7564772016-08-02 18:13:13 +0530323 if (!(((YangDerivedInfo<?>) var).getReferredTypeDef() != null)) {
Bharat saraswale3175d32016-08-31 17:50:11 +0530324 throw new TranslatorException("derived info is not an instance of typedef. " +
Bharat saraswal1edde622016-09-06 10:18:04 +0530325 type.getDataTypeName() + " in " +
326 type.getLineNumber() + " at " +
327 type.getCharPosition()
328 + " in " + type.getFileName());
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530329 }
330
Shankara-Huaweib7564772016-08-02 18:13:13 +0530331 YangJavaTypeDefTranslator typedef = (YangJavaTypeDefTranslator) ((YangDerivedInfo<?>) var).getReferredTypeDef();
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +0530332 return getTypePackage(typedef, conflictResolver);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530333 }
334
335 /**
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530336 * Returns java package for union node.
337 *
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530338 * @param type YANG type
janani b3e357f62016-05-19 17:39:50 +0530339 * @param conflictResolver object of YANG to java naming conflict util
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530340 * @return java package for union node
341 */
janani b3e357f62016-05-19 17:39:50 +0530342 private static String getUnionPackage(YangType<?> type, YangToJavaNamingConflictUtil conflictResolver) {
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530343
344 if (!(type.getDataTypeExtendedInfo() instanceof YangUnion)) {
Bharat saraswale3175d32016-08-31 17:50:11 +0530345 throw new TranslatorException("type should have been union. " +
Bharat saraswal1edde622016-09-06 10:18:04 +0530346 type.getDataTypeName() + " in " +
347 type.getLineNumber() + " at " +
348 type.getCharPosition()
349 + " in " + type.getFileName());
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530350 }
351
Shankara-Huaweib7564772016-08-02 18:13:13 +0530352 YangJavaUnionTranslator union = (YangJavaUnionTranslator) type.getDataTypeExtendedInfo();
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +0530353 return getTypePackage(union, conflictResolver);
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530354 }
355
356 /**
Bharat saraswal68fa0d12016-04-19 01:00:16 +0530357 * Returns YANG enumeration's java package.
358 *
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530359 * @param type YANG type
janani b3e357f62016-05-19 17:39:50 +0530360 * @param conflictResolver object of YANG to java naming conflict util
Bharat saraswal68fa0d12016-04-19 01:00:16 +0530361 * @return YANG enumeration's java package
362 */
janani b3e357f62016-05-19 17:39:50 +0530363 private static String getEnumsPackage(YangType<?> type, YangToJavaNamingConflictUtil conflictResolver) {
Bharat saraswal68fa0d12016-04-19 01:00:16 +0530364
365 if (!(type.getDataTypeExtendedInfo() instanceof YangEnumeration)) {
Bharat saraswale3175d32016-08-31 17:50:11 +0530366 throw new TranslatorException("type should have been enumeration. " +
Bharat saraswal1edde622016-09-06 10:18:04 +0530367 type.getDataTypeName() + " in " +
368 type.getLineNumber() + " at " +
369 type.getCharPosition()
370 + " in " + type.getFileName());
Bharat saraswal68fa0d12016-04-19 01:00:16 +0530371 }
Shankara-Huaweib7564772016-08-02 18:13:13 +0530372 YangJavaEnumerationTranslator enumeration = (YangJavaEnumerationTranslator) type.getDataTypeExtendedInfo();
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +0530373 return getTypePackage(enumeration, conflictResolver);
Bharat saraswal68fa0d12016-04-19 01:00:16 +0530374 }
375
376 /**
Shankara-Huawei234cd092016-07-14 11:35:34 +0530377 * Returns YANG identity's java package.
378 *
379 * @param type YANG type
380 * @param conflictResolver object of YANG to java naming conflict util
381 * @return YANG identity's java package
382 */
383 private static String getIdentityRefPackage(YangType<?> type, YangToJavaNamingConflictUtil conflictResolver) {
384
385 if (!(type.getDataTypeExtendedInfo() instanceof YangIdentityRef)) {
Bharat saraswale3175d32016-08-31 17:50:11 +0530386 throw new TranslatorException("type should have been identityref. " +
Bharat saraswal1edde622016-09-06 10:18:04 +0530387 type.getDataTypeName() + " in " +
388 type.getLineNumber() + " at " +
389 type.getCharPosition()
390 + " in " + type.getFileName());
Shankara-Huawei234cd092016-07-14 11:35:34 +0530391 }
392 YangIdentityRef identityRef = (YangIdentityRef) type.getDataTypeExtendedInfo();
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +0530393 if (identityRef.isInGrouping()) {
394 return JAVA_LANG;
Shankara-Huawei234cd092016-07-14 11:35:34 +0530395 }
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +0530396 YangJavaIdentityTranslator identity = (YangJavaIdentityTranslator) (identityRef.getReferredIdentity());
397 return getTypePackage(identity, conflictResolver);
398 }
399
400 /**
401 * Returns type package.
402 *
403 * @param info YANG code generator info
404 * @param conflictResolver object of YANG to java naming conflict util
405 * @return type java package
406 */
407 private static String getTypePackage(JavaCodeGeneratorInfo info,
408 YangToJavaNamingConflictUtil conflictResolver) {
409 YangNode node = (YangNode) info;
410 // Check for referred schema type node for grouping scenario.
411 while (node.getReferredSchema() != null) {
412 node = (YangNode) node.getReferredSchema();
413 }
414 info = (JavaCodeGeneratorInfo) node;
415 if (info.getJavaFileInfo().getPackage() == null) {
416 return getPackageFromParent(node.getParent(), conflictResolver);
417 }
418 return info.getJavaFileInfo().getPackage();
Shankara-Huawei234cd092016-07-14 11:35:34 +0530419 }
Shankara-Huaweib7564772016-08-02 18:13:13 +0530420
Shankara-Huawei234cd092016-07-14 11:35:34 +0530421 /**
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530422 * Returns package from parent node.
423 *
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530424 * @param parent parent YANG node
janani b3e357f62016-05-19 17:39:50 +0530425 * @param conflictResolver object of YANG to java naming conflict util
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530426 * @return java package from parent node
427 */
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530428 private static String getPackageFromParent(YangNode parent,
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530429 YangToJavaNamingConflictUtil conflictResolver) {
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530430 if (!(parent instanceof JavaFileInfoContainer)) {
Bharat saraswale3175d32016-08-31 17:50:11 +0530431 throw new TranslatorException("invalid child node is being processed. " +
Bharat saraswal1edde622016-09-06 10:18:04 +0530432 parent.getName() + " in " +
433 parent.getLineNumber() + " at " +
434 parent.getCharPosition()
435 + " in " + parent.getFileName());
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530436 }
Bharat saraswale50edca2016-08-05 01:58:25 +0530437 JavaFileInfoTranslator parentInfo = ((JavaFileInfoContainer) parent).getJavaFileInfo();
Gaurav Agrawalab7c4bd2016-05-17 18:06:38 +0530438 if (parentInfo.getPackage() == null) {
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530439 updateJavaFileInfo(parent, conflictResolver);
Gaurav Agrawalab7c4bd2016-05-17 18:06:38 +0530440 }
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530441 return parentInfo.getPackage() + PERIOD + parentInfo.getJavaName().toLowerCase();
Vinod Kumar S08710982016-03-03 19:55:30 +0530442 }
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530443
444 /**
445 * Update the referred data model nodes java file info, this will be called,
446 * when the linked node is yet to translate. Then resolve until the parent hierarchy.
447 *
448 * @param yangNode node whose java info needs to be updated
449 * @param conflictResolver yang plugin config
450 */
451 public static void updateJavaFileInfo(YangNode yangNode,
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530452 YangToJavaNamingConflictUtil conflictResolver) {
Shankara-Huaweib7564772016-08-02 18:13:13 +0530453 Stack<YangNode> nodesToUpdatePackage = new Stack<>();
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530454
455 /*
456 * Add the nodes to be updated for package info in a stack.
457 */
458 while (yangNode != null
459 && ((JavaFileInfoContainer) yangNode)
460 .getJavaFileInfo().getPackage() == null) {
461 nodesToUpdatePackage.push(yangNode);
462 yangNode = yangNode.getParent();
463 }
464
465 /*
466 * If the package is not updated till root node, then root package needs to
467 * be updated.
468 */
469 if (yangNode == null) {
470 yangNode = nodesToUpdatePackage.pop();
471 String pkg;
Shankara-Huaweib7564772016-08-02 18:13:13 +0530472 if (yangNode instanceof YangJavaModuleTranslator) {
473 YangJavaModuleTranslator module = (YangJavaModuleTranslator) yangNode;
Gaurav Agrawal493e0a82016-09-28 18:30:08 +0530474 pkg = getRootPackage(module.getVersion(), module.getModuleNamespace(),
475 module.getRevision(), conflictResolver);
Shankara-Huaweib7564772016-08-02 18:13:13 +0530476 } else if (yangNode instanceof YangJavaSubModuleTranslator) {
477 YangJavaSubModuleTranslator submodule = (YangJavaSubModuleTranslator) yangNode;
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530478 pkg = getRootPackage(submodule.getVersion(),
Bharat saraswal1edde622016-09-06 10:18:04 +0530479 submodule.getNameSpaceFromModule(),
480 submodule.getRevision(), conflictResolver);
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530481 } else {
Bharat saraswale3175d32016-08-31 17:50:11 +0530482 throw new TranslatorException("Invalid root node of data model tree " +
Bharat saraswal1edde622016-09-06 10:18:04 +0530483 yangNode.getName() + " in " +
484 yangNode.getLineNumber() + " at " +
485 yangNode.getCharPosition()
486 + " in " + yangNode.getFileName());
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530487 }
488
489 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
490 .setJavaName(getCamelCase(yangNode.getName(), conflictResolver));
491 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
492 .setPackage(pkg);
493 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
494 .setPackageFilePath(getPackageDirPathFromJavaJPackage(
495 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
496 .getPackage()));
497 }
498
Shankara-Huaweib7564772016-08-02 18:13:13 +0530499 /*
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530500 * Parent of the node in stack is updated with java info,
501 * all the nodes can be popped and updated
502 */
503 while (nodesToUpdatePackage.size() != 0) {
504 yangNode = nodesToUpdatePackage.pop();
505 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
506 .setJavaName(getCamelCase(yangNode.getName(), conflictResolver));
507 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
508 .setPackage(getCurNodePackage(yangNode));
509 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
510 .setPackageFilePath(getPackageDirPathFromJavaJPackage(
511 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
512 .getPackage()));
513 }
514 }
janani b0e4e8ae2016-07-13 21:06:41 +0530515
516 /**
517 * Returns the referred type from leaf/leaf-list.
518 *
519 * @param type current type in leaf
520 * @return type from the leafref
521 */
522 private static YangType<?> getReferredTypeFromLeafref(YangType type) {
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +0530523 YangLeafRef<?> lri = (YangLeafRef<?>) type.getDataTypeExtendedInfo();
524 return lri.isInGrouping() ? null : lri.getEffectiveDataType();
525 }
526
527 /**
528 * Returns leaf ref import string.
529 *
530 * @param type YANG type
531 * @param cnfg YANG to java naming conflict util
532 * @param isList true if list, false otherwise
533 * @return import class
534 */
Bharat saraswal94844d62016-10-13 13:28:03 +0530535 public static String getLeafRefImpClass(
Gaurav Agrawal9381ebb2016-09-29 19:00:33 +0530536 YangType type, YangToJavaNamingConflictUtil cnfg, boolean isList) {
537 YangType<?> rt = getReferredTypeFromLeafref(type);
538 return rt == null ? OBJECT_STRING : getJavaImportClass(rt, isList,
539 cnfg);
540 }
541
542 /**
543 * Returns identity ref import class.
544 *
545 * @param type YANG type
546 * @param cnfg YANG to java naming conflict util
547 * @return import class
548 */
549 private static String getIdentityRefImpClass(
550 YangType type, YangToJavaNamingConflictUtil cnfg) {
551 YangIdentityRef ir = (YangIdentityRef) type.getDataTypeExtendedInfo();
552 if (ir.isInGrouping()) {
553 return OBJECT_STRING;
554 }
555 YangIdentity identity = ir.getReferredIdentity();
556 return getCapitalCase(getCamelCase(identity.getName(), cnfg));
557 }
558
559 /**
560 * Returns leaf ref import package.
561 *
562 * @param type YANG type
563 * @param cnfg YANG to java naming conflict util
564 * @param isList true if list, false otherwise
565 * @return import package
566 */
567 private static String getLeafRefImpPkg(
568 YangType type, YangToJavaNamingConflictUtil cnfg, boolean isList) {
569 YangType<?> rt = getReferredTypeFromLeafref(type);
570 return rt == null ? JAVA_LANG : getJavaImportPackage(rt, isList, cnfg);
janani b0e4e8ae2016-07-13 21:06:41 +0530571 }
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530572}