blob: ef2ca3de4ca4a91c7671c815c700163512ed9bf3 [file] [log] [blame]
Bharat saraswal4bf8b152016-02-25 02:26:43 +05301/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Bharat saraswal4bf8b152016-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 Agrawal8a5af142016-06-15 13:58:01 +053017package org.onosproject.yangutils.translator.tojava.javamodel;
Bharat saraswal4bf8b152016-02-25 02:26:43 +053018
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +053019import java.util.Stack;
janani be18b5342016-07-13 21:06:41 +053020
Bharat saraswalcc1cdab2016-04-16 02:28:25 +053021import org.onosproject.yangutils.datamodel.YangDerivedInfo;
Bharat saraswald72411a2016-04-19 01:00:16 +053022import org.onosproject.yangutils.datamodel.YangEnumeration;
Shankara-Huaweidf7b9ca2016-07-14 11:35:34 +053023import org.onosproject.yangutils.datamodel.YangIdentity;
Shankara-Huaweidf7b9ca2016-07-14 11:35:34 +053024import org.onosproject.yangutils.datamodel.YangIdentityRef;
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +053025import org.onosproject.yangutils.datamodel.YangLeafRef;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +053026import org.onosproject.yangutils.datamodel.YangNode;
Bharat saraswal4bf8b152016-02-25 02:26:43 +053027import org.onosproject.yangutils.datamodel.YangType;
Gaurav Agrawal338735b2016-04-18 18:53:11 +053028import org.onosproject.yangutils.datamodel.YangUnion;
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +053029import org.onosproject.yangutils.datamodel.javadatamodel.JavaFileInfo;
30import org.onosproject.yangutils.datamodel.javadatamodel.YangToJavaNamingConflictUtil;
janani be18b5342016-07-13 21:06:41 +053031import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +053032import org.onosproject.yangutils.translator.exception.TranslatorException;
Gaurav Agrawal8a5af142016-06-15 13:58:01 +053033import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
Gaurav Agrawal0d43bb52016-05-17 18:06:38 +053034import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
Bharat saraswale2d51d62016-03-23 19:40:35 +053035
Bharat saraswalb551aae2016-07-14 15:18:20 +053036import static org.onosproject.yangutils.translator.tojava.YangJavaModelUtils.getCurNodePackage;
Gaurav Agrawal0d43bb52016-05-17 18:06:38 +053037import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getRootPackage;
Mahesh Poojary Huawei46fb4db2016-07-14 12:38:17 +053038import static org.onosproject.yangutils.utils.UtilConstants.BIG_DECIMAL;
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +053039import static org.onosproject.yangutils.utils.UtilConstants.BIG_INTEGER;
Mahesh Poojary Huawei46fb4db2016-07-14 12:38:17 +053040import static org.onosproject.yangutils.utils.UtilConstants.BIT_SET;
Bharat saraswale2d51d62016-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 Huawei46fb4db2016-07-14 12:38:17 +053045import static org.onosproject.yangutils.utils.UtilConstants.COLLECTION_IMPORTS;
Bharat saraswale2d51d62016-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 saraswalcc1cdab2016-04-16 02:28:25 +053049import static org.onosproject.yangutils.utils.UtilConstants.JAVA_MATH;
Bharat saraswale2d51d62016-03-23 19:40:35 +053050import static org.onosproject.yangutils.utils.UtilConstants.LONG;
51import static org.onosproject.yangutils.utils.UtilConstants.LONG_WRAPPER;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +053052import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
Bharat saraswale2d51d62016-03-23 19:40:35 +053053import static org.onosproject.yangutils.utils.UtilConstants.SHORT;
54import static org.onosproject.yangutils.utils.UtilConstants.SHORT_WRAPPER;
Mahesh Poojary Huawei46fb4db2016-07-14 12:38:17 +053055import static org.onosproject.yangutils.utils.UtilConstants.SQUARE_BRACKETS;
Bharat saraswale2d51d62016-03-23 19:40:35 +053056import static org.onosproject.yangutils.utils.UtilConstants.STRING_DATA_TYPE;
Gaurav Agrawal8a5af142016-06-15 13:58:01 +053057import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
58import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
59import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getPackageDirPathFromJavaJPackage;
Bharat saraswal4bf8b152016-02-25 02:26:43 +053060
61/**
Bharat saraswald9822e92016-04-05 15:13:44 +053062 * Represents java data types info corresponding to YANG type.
Bharat saraswal4bf8b152016-02-25 02:26:43 +053063 */
64public final class AttributesJavaDataType {
65
66 /**
Bharat saraswald9822e92016-04-05 15:13:44 +053067 * Creates an instance of attribute java data type.
Bharat saraswal4bf8b152016-02-25 02:26:43 +053068 */
69 private AttributesJavaDataType() {
70 }
71
72 /**
Vinod Kumar Sc4216002016-03-03 19:55:30 +053073 * Returns java type.
Bharat saraswal4bf8b152016-02-25 02:26:43 +053074 *
75 * @param yangType YANG type
Vinod Kumar Sc4216002016-03-03 19:55:30 +053076 * @return java type
Bharat saraswal4bf8b152016-02-25 02:26:43 +053077 */
Vinod Kumar Sc4216002016-03-03 19:55:30 +053078 public static String getJavaDataType(YangType<?> yangType) {
Bharat saraswale2d51d62016-03-23 19:40:35 +053079
Vinod Kumar Sc4216002016-03-03 19:55:30 +053080 YangDataTypes type = yangType.getDataType();
Bharat saraswal4bf8b152016-02-25 02:26:43 +053081
Bharat saraswalcc1cdab2016-04-16 02:28:25 +053082 switch (type) {
83 case INT8:
84 return BYTE;
85 case INT16:
86 return SHORT;
87 case INT32:
88 return INT;
89 case INT64:
90 return LONG;
91 case UINT8:
92 return SHORT;
93 case UINT16:
94 return INT;
95 case UINT32:
96 return LONG;
97 case UINT64:
98 return BIG_INTEGER;
Mahesh Poojary Huawei46fb4db2016-07-14 12:38:17 +053099 case BITS:
100 return BIT_SET;
Bharat saraswal33dfa012016-05-17 19:59:16 +0530101 case BINARY:
Mahesh Poojary Huawei46fb4db2016-07-14 12:38:17 +0530102 return BYTE + SQUARE_BRACKETS;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530103 case DECIMAL64:
Mahesh Poojary Huawei46fb4db2016-07-14 12:38:17 +0530104 return BIG_DECIMAL;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530105 case STRING:
106 return STRING_DATA_TYPE;
107 case BOOLEAN:
108 return BOOLEAN_DATA_TYPE;
janani be18b5342016-07-13 21:06:41 +0530109 case INSTANCE_IDENTIFIER:
110 return STRING_DATA_TYPE;
111 case LEAFREF:
112 return getJavaDataType(getReferredTypeFromLeafref(yangType));
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530113 default:
114 throw new TranslatorException("given data type is not supported.");
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530115 }
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530116 }
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530117
118 /**
119 * Returns java import class.
120 *
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530121 * @param yangType YANG type
122 * @param isListAttr if the attribute need to be a list
Bharat saraswal33dfa012016-05-17 19:59:16 +0530123 * @param pluginConfig plugin configurations
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530124 * @return java import class
125 */
Bharat saraswal33dfa012016-05-17 19:59:16 +0530126 public static String getJavaImportClass(YangType<?> yangType, boolean isListAttr,
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530127 YangToJavaNamingConflictUtil pluginConfig) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530128
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530129 YangDataTypes type = yangType.getDataType();
130
131 if (isListAttr) {
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530132 switch (type) {
133 case INT8:
134 return BYTE_WRAPPER;
135 case INT16:
136 return SHORT_WRAPPER;
137 case INT32:
138 return INTEGER_WRAPPER;
139 case INT64:
140 return LONG_WRAPPER;
141 case UINT8:
142 return SHORT_WRAPPER;
143 case UINT16:
144 return INTEGER_WRAPPER;
145 case UINT32:
146 return LONG_WRAPPER;
147 case UINT64:
148 return BIG_INTEGER;
149 case DECIMAL64:
Mahesh Poojary Huawei46fb4db2016-07-14 12:38:17 +0530150 return BIG_DECIMAL;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530151 case STRING:
152 return STRING_DATA_TYPE;
153 case BOOLEAN:
154 return BOOLEAN_WRAPPER;
155 case ENUMERATION:
janani b4a6711a2016-05-17 13:12:22 +0530156 return getCapitalCase(
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +0530157 getCamelCase(((YangJavaEnumerationTranslator) yangType.getDataTypeExtendedInfo()).getName(),
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530158 pluginConfig));
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530159 case BITS:
Mahesh Poojary Huawei46fb4db2016-07-14 12:38:17 +0530160 return BIT_SET;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530161 case BINARY:
Mahesh Poojary Huawei46fb4db2016-07-14 12:38:17 +0530162 return BYTE + SQUARE_BRACKETS;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530163 case LEAFREF:
janani be18b5342016-07-13 21:06:41 +0530164 YangType<?> referredType = getReferredTypeFromLeafref(yangType);
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +0530165 return getJavaImportClass(referredType, true, pluginConfig);
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530166 case IDENTITYREF:
Shankara-Huaweidf7b9ca2016-07-14 11:35:34 +0530167 YangIdentityRef identityRef = (YangIdentityRef) yangType.getDataTypeExtendedInfo();
168 YangIdentity identity = identityRef.getReferredIdentity();
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +0530169 return getCapitalCase(getCamelCase(identity.
170 getName(), pluginConfig));
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530171 case EMPTY:
172 return BOOLEAN_WRAPPER;
173 case UNION:
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +0530174 return getCapitalCase(getCamelCase(((YangJavaUnionTranslator) yangType
175 .getDataTypeExtendedInfo()).getName(), pluginConfig));
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530176 case INSTANCE_IDENTIFIER:
janani be18b5342016-07-13 21:06:41 +0530177 return STRING_DATA_TYPE;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530178 case DERIVED:
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530179 return getCapitalCase(
180 getCamelCase(yangType.getDataTypeName(), pluginConfig));
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530181 default:
Bharat saraswald72411a2016-04-19 01:00:16 +0530182 throw new TranslatorException("given data type is not supported.");
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530183 }
184 } else {
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530185 switch (type) {
186 case UINT64:
187 return BIG_INTEGER;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530188 case STRING:
189 return STRING_DATA_TYPE;
190 case ENUMERATION:
janani b4a6711a2016-05-17 13:12:22 +0530191 return getCapitalCase(
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +0530192 getCamelCase(((YangJavaEnumerationTranslator) yangType.getDataTypeExtendedInfo()).getName(),
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530193 pluginConfig));
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530194 case BITS:
Mahesh Poojary Huawei46fb4db2016-07-14 12:38:17 +0530195 return BIT_SET;
196 case DECIMAL64:
197 return BIG_DECIMAL;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530198 case LEAFREF:
janani be18b5342016-07-13 21:06:41 +0530199 YangType<?> referredType = getReferredTypeFromLeafref(yangType);
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +0530200 return getJavaImportClass(referredType, false, pluginConfig);
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530201 case IDENTITYREF:
Shankara-Huaweidf7b9ca2016-07-14 11:35:34 +0530202 YangIdentityRef identityRef = (YangIdentityRef) yangType.getDataTypeExtendedInfo();
203 YangIdentity identity = identityRef.getReferredIdentity();
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +0530204 return getCapitalCase(getCamelCase(identity.getName(), pluginConfig));
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530205 case EMPTY:
Bharat saraswal33dfa012016-05-17 19:59:16 +0530206 return BOOLEAN_DATA_TYPE;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530207 case UNION:
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +0530208 return getCapitalCase(getCamelCase(((YangJavaUnionTranslator) yangType
209 .getDataTypeExtendedInfo()).getName(), pluginConfig));
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530210 case INSTANCE_IDENTIFIER:
janani be18b5342016-07-13 21:06:41 +0530211 return STRING_DATA_TYPE;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530212 case DERIVED:
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530213 return getCapitalCase(
214 getCamelCase(yangType.getDataTypeName(), pluginConfig));
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530215 default:
216 return null;
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530217 }
218 }
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530219 }
220
221 /**
222 * Returns java import package.
223 *
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530224 * @param yangType YANG type
225 * @param isListAttr if the attribute is of list type
janani bdd1314f2016-05-19 17:39:50 +0530226 * @param conflictResolver object of YANG to java naming conflict util
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530227 * @return java import package
228 */
Bharat saraswalcad0e652016-05-26 23:48:38 +0530229 public static String getJavaImportPackage(YangType<?> yangType, boolean isListAttr,
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530230 YangToJavaNamingConflictUtil conflictResolver) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530231
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530232 YangDataTypes type = yangType.getDataType();
233
234 if (isListAttr) {
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530235 switch (type) {
236 case INT8:
237 case INT16:
238 case INT32:
239 case INT64:
240 case UINT8:
241 case UINT16:
242 case UINT32:
Mahesh Poojary Huawei46fb4db2016-07-14 12:38:17 +0530243 case BINARY:
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530244 case STRING:
245 case BOOLEAN:
Bharat saraswal33dfa012016-05-17 19:59:16 +0530246 case EMPTY:
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530247 return JAVA_LANG;
248 case UINT64:
Mahesh Poojary Huawei46fb4db2016-07-14 12:38:17 +0530249 case DECIMAL64:
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530250 return JAVA_MATH;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530251 case ENUMERATION:
janani bdd1314f2016-05-19 17:39:50 +0530252 return getEnumsPackage(yangType, conflictResolver);
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530253 case BITS:
Mahesh Poojary Huawei46fb4db2016-07-14 12:38:17 +0530254 return COLLECTION_IMPORTS;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530255 case LEAFREF:
janani be18b5342016-07-13 21:06:41 +0530256 YangType<?> referredType = getReferredTypeFromLeafref(yangType);
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +0530257 return getJavaImportPackage(referredType, true, conflictResolver);
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530258 case IDENTITYREF:
Shankara-Huaweidf7b9ca2016-07-14 11:35:34 +0530259 return getIdentityRefPackage(yangType, conflictResolver);
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530260 case UNION:
janani bdd1314f2016-05-19 17:39:50 +0530261 return getUnionPackage(yangType, conflictResolver);
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530262 case INSTANCE_IDENTIFIER:
janani be18b5342016-07-13 21:06:41 +0530263 return JAVA_LANG;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530264 case DERIVED:
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530265 return getTypeDefsPackage(yangType, conflictResolver);
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530266 default:
Bharat saraswald72411a2016-04-19 01:00:16 +0530267 throw new TranslatorException("given data type is not supported.");
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530268 }
269 } else {
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530270 switch (type) {
271 case UINT64:
Mahesh Poojary Huawei46fb4db2016-07-14 12:38:17 +0530272 case DECIMAL64:
Bharat saraswalc0e04842016-05-12 13:16:57 +0530273 return JAVA_MATH;
Mahesh Poojary Huawei46fb4db2016-07-14 12:38:17 +0530274 case EMPTY:
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530275 case STRING:
276 return JAVA_LANG;
277 case ENUMERATION:
janani bdd1314f2016-05-19 17:39:50 +0530278 return getEnumsPackage(yangType, conflictResolver);
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530279 case BITS:
Mahesh Poojary Huawei46fb4db2016-07-14 12:38:17 +0530280 return COLLECTION_IMPORTS;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530281 case LEAFREF:
janani be18b5342016-07-13 21:06:41 +0530282 YangType<?> referredType = getReferredTypeFromLeafref(yangType);
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +0530283 return getJavaImportPackage(referredType, false, conflictResolver);
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530284 case IDENTITYREF:
Shankara-Huaweidf7b9ca2016-07-14 11:35:34 +0530285 return getIdentityRefPackage(yangType, conflictResolver);
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530286 case UNION:
janani bdd1314f2016-05-19 17:39:50 +0530287 return getUnionPackage(yangType, conflictResolver);
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530288 case INSTANCE_IDENTIFIER:
janani be18b5342016-07-13 21:06:41 +0530289 return JAVA_LANG;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530290 case DERIVED:
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530291 return getTypeDefsPackage(yangType, conflictResolver);
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530292 default:
293 return null;
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530294 }
295 }
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530296 }
297
298 /**
299 * Returns java package for typedef node.
300 *
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530301 * @param type YANG type
janani bdd1314f2016-05-19 17:39:50 +0530302 * @param conflictResolver object of YANG to java naming conflict util
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530303 * @return java package for typedef node
304 */
Bharat saraswal2d90b0c2016-08-04 02:00:03 +0530305 private static String getTypeDefsPackage(YangType<?> type, YangToJavaNamingConflictUtil conflictResolver) {
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530306 Object var = type.getDataTypeExtendedInfo();
307 if (!(var instanceof YangDerivedInfo)) {
308 throw new TranslatorException("type should have been derived.");
309 }
310
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +0530311 if (!(((YangDerivedInfo<?>) var).getReferredTypeDef() != null)) {
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530312 throw new TranslatorException("derived info is not an instance of typedef.");
313 }
314
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +0530315 YangJavaTypeDefTranslator typedef = (YangJavaTypeDefTranslator) ((YangDerivedInfo<?>) var).getReferredTypeDef();
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530316 if (typedef.getJavaFileInfo().getPackage() == null) {
janani bdd1314f2016-05-19 17:39:50 +0530317 return getPackageFromParent(typedef.getParent(), conflictResolver);
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530318 }
319 return typedef.getJavaFileInfo().getPackage();
320 }
321
322 /**
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530323 * Returns java package for union node.
324 *
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530325 * @param type YANG type
janani bdd1314f2016-05-19 17:39:50 +0530326 * @param conflictResolver object of YANG to java naming conflict util
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530327 * @return java package for union node
328 */
janani bdd1314f2016-05-19 17:39:50 +0530329 private static String getUnionPackage(YangType<?> type, YangToJavaNamingConflictUtil conflictResolver) {
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530330
331 if (!(type.getDataTypeExtendedInfo() instanceof YangUnion)) {
332 throw new TranslatorException("type should have been union.");
333 }
334
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +0530335 YangJavaUnionTranslator union = (YangJavaUnionTranslator) type.getDataTypeExtendedInfo();
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530336 if (union.getJavaFileInfo().getPackage() == null) {
janani bdd1314f2016-05-19 17:39:50 +0530337 return getPackageFromParent(union.getParent(), conflictResolver);
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530338 }
339 return union.getJavaFileInfo().getPackage();
340 }
341
342 /**
Bharat saraswald72411a2016-04-19 01:00:16 +0530343 * Returns YANG enumeration's java package.
344 *
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530345 * @param type YANG type
janani bdd1314f2016-05-19 17:39:50 +0530346 * @param conflictResolver object of YANG to java naming conflict util
Bharat saraswald72411a2016-04-19 01:00:16 +0530347 * @return YANG enumeration's java package
348 */
janani bdd1314f2016-05-19 17:39:50 +0530349 private static String getEnumsPackage(YangType<?> type, YangToJavaNamingConflictUtil conflictResolver) {
Bharat saraswald72411a2016-04-19 01:00:16 +0530350
351 if (!(type.getDataTypeExtendedInfo() instanceof YangEnumeration)) {
352 throw new TranslatorException("type should have been enumeration.");
353 }
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +0530354 YangJavaEnumerationTranslator enumeration = (YangJavaEnumerationTranslator) type.getDataTypeExtendedInfo();
Bharat saraswald72411a2016-04-19 01:00:16 +0530355 if (enumeration.getJavaFileInfo().getPackage() == null) {
janani bdd1314f2016-05-19 17:39:50 +0530356 return getPackageFromParent(enumeration.getParent(), conflictResolver);
Bharat saraswald72411a2016-04-19 01:00:16 +0530357 }
358 return enumeration.getJavaFileInfo().getPackage();
359 }
360
361 /**
Shankara-Huaweidf7b9ca2016-07-14 11:35:34 +0530362 * Returns YANG identity's java package.
363 *
364 * @param type YANG type
365 * @param conflictResolver object of YANG to java naming conflict util
366 * @return YANG identity's java package
367 */
368 private static String getIdentityRefPackage(YangType<?> type, YangToJavaNamingConflictUtil conflictResolver) {
369
370 if (!(type.getDataTypeExtendedInfo() instanceof YangIdentityRef)) {
371 throw new TranslatorException("type should have been identityref.");
372 }
373 YangIdentityRef identityRef = (YangIdentityRef) type.getDataTypeExtendedInfo();
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +0530374 YangJavaIdentityTranslator identity = (YangJavaIdentityTranslator) (identityRef.getReferredIdentity());
Shankara-Huaweidf7b9ca2016-07-14 11:35:34 +0530375 if (identity.getJavaFileInfo().getPackage() == null) {
376 return getPackageFromParent(identity.getParent(), conflictResolver);
377 }
378 return identity.getJavaFileInfo().getPackage();
379 }
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +0530380
Shankara-Huaweidf7b9ca2016-07-14 11:35:34 +0530381 /**
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530382 * Returns package from parent node.
383 *
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530384 * @param parent parent YANG node
janani bdd1314f2016-05-19 17:39:50 +0530385 * @param conflictResolver object of YANG to java naming conflict util
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530386 * @return java package from parent node
387 */
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530388 private static String getPackageFromParent(YangNode parent,
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530389 YangToJavaNamingConflictUtil conflictResolver) {
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530390 if (!(parent instanceof JavaFileInfoContainer)) {
Gaurav Agrawal338735b2016-04-18 18:53:11 +0530391 throw new TranslatorException("invalid child node is being processed.");
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530392 }
Vinod Kumar Se4b9b0c2016-04-30 21:09:15 +0530393 JavaFileInfo parentInfo = ((JavaFileInfoContainer) parent).getJavaFileInfo();
Gaurav Agrawal0d43bb52016-05-17 18:06:38 +0530394 if (parentInfo.getPackage() == null) {
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530395 updateJavaFileInfo(parent, conflictResolver);
Gaurav Agrawal0d43bb52016-05-17 18:06:38 +0530396 }
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530397 return parentInfo.getPackage() + PERIOD + parentInfo.getJavaName().toLowerCase();
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530398 }
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530399
400 /**
401 * Update the referred data model nodes java file info, this will be called,
402 * when the linked node is yet to translate. Then resolve until the parent hierarchy.
403 *
404 * @param yangNode node whose java info needs to be updated
405 * @param conflictResolver yang plugin config
406 */
407 public static void updateJavaFileInfo(YangNode yangNode,
Gaurav Agrawal8a5af142016-06-15 13:58:01 +0530408 YangToJavaNamingConflictUtil conflictResolver) {
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +0530409 Stack<YangNode> nodesToUpdatePackage = new Stack<>();
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530410
411 /*
412 * Add the nodes to be updated for package info in a stack.
413 */
414 while (yangNode != null
415 && ((JavaFileInfoContainer) yangNode)
416 .getJavaFileInfo().getPackage() == null) {
417 nodesToUpdatePackage.push(yangNode);
418 yangNode = yangNode.getParent();
419 }
420
421 /*
422 * If the package is not updated till root node, then root package needs to
423 * be updated.
424 */
425 if (yangNode == null) {
426 yangNode = nodesToUpdatePackage.pop();
427 String pkg;
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +0530428 if (yangNode instanceof YangJavaModuleTranslator) {
429 YangJavaModuleTranslator module = (YangJavaModuleTranslator) yangNode;
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530430 pkg = getRootPackage(module.getVersion(), module.getNameSpace().getUri(), module
431 .getRevision().getRevDate(), conflictResolver);
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +0530432 } else if (yangNode instanceof YangJavaSubModuleTranslator) {
433 YangJavaSubModuleTranslator submodule = (YangJavaSubModuleTranslator) yangNode;
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530434 pkg = getRootPackage(submodule.getVersion(),
435 submodule.getNameSpaceFromModule(submodule.getBelongsTo()),
436 submodule.getRevision().getRevDate(), conflictResolver);
437 } else {
438 throw new TranslatorException("Invalid root node of data model tree");
439 }
440
441 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
442 .setJavaName(getCamelCase(yangNode.getName(), conflictResolver));
443 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
444 .setPackage(pkg);
445 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
446 .setPackageFilePath(getPackageDirPathFromJavaJPackage(
447 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
448 .getPackage()));
449 }
450
Shankara-Huaweibdf24bb2016-08-02 18:13:13 +0530451 /*
VinodKumarS-Huawei2ee9e7e2016-06-01 14:30:22 +0530452 * Parent of the node in stack is updated with java info,
453 * all the nodes can be popped and updated
454 */
455 while (nodesToUpdatePackage.size() != 0) {
456 yangNode = nodesToUpdatePackage.pop();
457 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
458 .setJavaName(getCamelCase(yangNode.getName(), conflictResolver));
459 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
460 .setPackage(getCurNodePackage(yangNode));
461 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
462 .setPackageFilePath(getPackageDirPathFromJavaJPackage(
463 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
464 .getPackage()));
465 }
466 }
janani be18b5342016-07-13 21:06:41 +0530467
468 /**
469 * Returns the referred type from leaf/leaf-list.
470 *
471 * @param type current type in leaf
472 * @return type from the leafref
473 */
474 private static YangType<?> getReferredTypeFromLeafref(YangType type) {
475 YangLeafRef<?> leafRefInfo = (YangLeafRef<?>) type.getDataTypeExtendedInfo();
476 return leafRefInfo.getEffectiveDataType();
477 }
Bharat saraswal4bf8b152016-02-25 02:26:43 +0530478}