blob: ae7b0162477183b3214dcb2a51be97c9a981eea6 [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
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +053019import java.util.Stack;
Bharat saraswale3175d32016-08-31 17:50:11 +053020
Bharat saraswale2bc60d2016-04-16 02:28:25 +053021import org.onosproject.yangutils.datamodel.YangDerivedInfo;
Bharat saraswal68fa0d12016-04-19 01:00:16 +053022import org.onosproject.yangutils.datamodel.YangEnumeration;
Shankara-Huawei234cd092016-07-14 11:35:34 +053023import org.onosproject.yangutils.datamodel.YangIdentity;
Shankara-Huawei234cd092016-07-14 11:35:34 +053024import org.onosproject.yangutils.datamodel.YangIdentityRef;
Shankara-Huaweib7564772016-08-02 18:13:13 +053025import org.onosproject.yangutils.datamodel.YangLeafRef;
Bharat saraswale2bc60d2016-04-16 02:28:25 +053026import org.onosproject.yangutils.datamodel.YangNode;
Bharat saraswalc46ee2a2016-02-25 02:26:43 +053027import org.onosproject.yangutils.datamodel.YangType;
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +053028import org.onosproject.yangutils.datamodel.YangUnion;
janani b0e4e8ae2016-07-13 21:06:41 +053029import org.onosproject.yangutils.datamodel.utils.builtindatatype.YangDataTypes;
Bharat saraswale2bc60d2016-04-16 02:28:25 +053030import org.onosproject.yangutils.translator.exception.TranslatorException;
Gaurav Agrawalbfce9342016-06-15 13:58:01 +053031import org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorInfo;
Gaurav Agrawalab7c4bd2016-05-17 18:06:38 +053032import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
Gaurav Agrawale5057f02016-08-22 17:14:33 +053033import org.onosproject.yangutils.translator.tojava.JavaFileInfoTranslator;
34import org.onosproject.yangutils.utils.io.YangToJavaNamingConflictUtil;
Bharat saraswal84366c52016-03-23 19:40:35 +053035
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;
Bharat saraswale2bc60d2016-04-16 02:28:25 +053052import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
Bharat saraswal84366c52016-03-23 19:40:35 +053053import static org.onosproject.yangutils.utils.UtilConstants.SHORT;
54import static org.onosproject.yangutils.utils.UtilConstants.SHORT_WRAPPER;
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +053055import static org.onosproject.yangutils.utils.UtilConstants.SQUARE_BRACKETS;
Bharat saraswal84366c52016-03-23 19:40:35 +053056import static org.onosproject.yangutils.utils.UtilConstants.STRING_DATA_TYPE;
Gaurav Agrawalbfce9342016-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 saraswalc46ee2a2016-02-25 02:26:43 +053060
61/**
Bharat saraswal63f26fb2016-04-05 15:13:44 +053062 * Represents java data types info corresponding to YANG type.
Bharat saraswalc46ee2a2016-02-25 02:26:43 +053063 */
64public final class AttributesJavaDataType {
65
66 /**
Bharat saraswal63f26fb2016-04-05 15:13:44 +053067 * Creates an instance of attribute java data type.
Bharat saraswalc46ee2a2016-02-25 02:26:43 +053068 */
69 private AttributesJavaDataType() {
70 }
71
72 /**
Vinod Kumar S08710982016-03-03 19:55:30 +053073 * Returns java type.
Bharat saraswalc46ee2a2016-02-25 02:26:43 +053074 *
75 * @param yangType YANG type
Vinod Kumar S08710982016-03-03 19:55:30 +053076 * @return java type
Bharat saraswalc46ee2a2016-02-25 02:26:43 +053077 */
Vinod Kumar S08710982016-03-03 19:55:30 +053078 public static String getJavaDataType(YangType<?> yangType) {
Bharat saraswal84366c52016-03-23 19:40:35 +053079
Vinod Kumar S08710982016-03-03 19:55:30 +053080 YangDataTypes type = yangType.getDataType();
Bharat saraswalc46ee2a2016-02-25 02:26:43 +053081
Bharat saraswale2bc60d2016-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 Huawei2cd44332016-07-14 12:38:17 +053099 case BITS:
100 return BIT_SET;
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530101 case BINARY:
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530102 return BYTE + SQUARE_BRACKETS;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530103 case DECIMAL64:
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530104 return BIG_DECIMAL;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530105 case STRING:
106 return STRING_DATA_TYPE;
107 case BOOLEAN:
108 return BOOLEAN_DATA_TYPE;
janani b0e4e8ae2016-07-13 21:06:41 +0530109 case INSTANCE_IDENTIFIER:
110 return STRING_DATA_TYPE;
111 case LEAFREF:
112 return getJavaDataType(getReferredTypeFromLeafref(yangType));
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530113 default:
Bharat saraswale3175d32016-08-31 17:50:11 +0530114 throw new TranslatorException("given data type is not supported. " +
Bharat saraswal1edde622016-09-06 10:18:04 +0530115 yangType.getDataTypeName() + " in " +
116 yangType.getLineNumber() + " at " +
117 yangType.getCharPosition()
118 + " in " + yangType.getFileName());
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530119 }
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530120 }
Vinod Kumar S08710982016-03-03 19:55:30 +0530121
122 /**
123 * Returns java import class.
124 *
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530125 * @param yangType YANG type
126 * @param isListAttr if the attribute need to be a list
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530127 * @param pluginConfig plugin configurations
Vinod Kumar S08710982016-03-03 19:55:30 +0530128 * @return java import class
129 */
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530130 public static String getJavaImportClass(YangType<?> yangType, boolean isListAttr,
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530131 YangToJavaNamingConflictUtil pluginConfig) {
Bharat saraswal84366c52016-03-23 19:40:35 +0530132
Vinod Kumar S08710982016-03-03 19:55:30 +0530133 YangDataTypes type = yangType.getDataType();
134
135 if (isListAttr) {
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530136 switch (type) {
137 case INT8:
138 return BYTE_WRAPPER;
139 case INT16:
140 return SHORT_WRAPPER;
141 case INT32:
142 return INTEGER_WRAPPER;
143 case INT64:
144 return LONG_WRAPPER;
145 case UINT8:
146 return SHORT_WRAPPER;
147 case UINT16:
148 return INTEGER_WRAPPER;
149 case UINT32:
150 return LONG_WRAPPER;
151 case UINT64:
152 return BIG_INTEGER;
153 case DECIMAL64:
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530154 return BIG_DECIMAL;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530155 case STRING:
156 return STRING_DATA_TYPE;
157 case BOOLEAN:
158 return BOOLEAN_WRAPPER;
159 case ENUMERATION:
janani b703cfe42016-05-17 13:12:22 +0530160 return getCapitalCase(
Shankara-Huaweib7564772016-08-02 18:13:13 +0530161 getCamelCase(((YangJavaEnumerationTranslator) yangType.getDataTypeExtendedInfo()).getName(),
Bharat saraswal1edde622016-09-06 10:18:04 +0530162 pluginConfig));
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530163 case BITS:
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530164 return BIT_SET;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530165 case BINARY:
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530166 return BYTE + SQUARE_BRACKETS;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530167 case LEAFREF:
janani b0e4e8ae2016-07-13 21:06:41 +0530168 YangType<?> referredType = getReferredTypeFromLeafref(yangType);
Shankara-Huaweib7564772016-08-02 18:13:13 +0530169 return getJavaImportClass(referredType, true, pluginConfig);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530170 case IDENTITYREF:
Shankara-Huawei234cd092016-07-14 11:35:34 +0530171 YangIdentityRef identityRef = (YangIdentityRef) yangType.getDataTypeExtendedInfo();
172 YangIdentity identity = identityRef.getReferredIdentity();
Shankara-Huaweib7564772016-08-02 18:13:13 +0530173 return getCapitalCase(getCamelCase(identity.
174 getName(), pluginConfig));
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530175 case EMPTY:
176 return BOOLEAN_WRAPPER;
177 case UNION:
Shankara-Huaweib7564772016-08-02 18:13:13 +0530178 return getCapitalCase(getCamelCase(((YangJavaUnionTranslator) yangType
179 .getDataTypeExtendedInfo()).getName(), pluginConfig));
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530180 case INSTANCE_IDENTIFIER:
janani b0e4e8ae2016-07-13 21:06:41 +0530181 return STRING_DATA_TYPE;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530182 case DERIVED:
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530183 return getCapitalCase(
184 getCamelCase(yangType.getDataTypeName(), pluginConfig));
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530185 default:
Bharat saraswale3175d32016-08-31 17:50:11 +0530186 throw new TranslatorException("given data type is not supported ." +
Bharat saraswal1edde622016-09-06 10:18:04 +0530187 yangType.getDataTypeName() + " in " +
188 yangType.getLineNumber() + " at " +
189 yangType.getCharPosition()
190 + " in " + yangType.getFileName());
Vinod Kumar S08710982016-03-03 19:55:30 +0530191 }
192 } else {
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530193 switch (type) {
194 case UINT64:
195 return BIG_INTEGER;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530196 case STRING:
197 return STRING_DATA_TYPE;
198 case ENUMERATION:
janani b703cfe42016-05-17 13:12:22 +0530199 return getCapitalCase(
Shankara-Huaweib7564772016-08-02 18:13:13 +0530200 getCamelCase(((YangJavaEnumerationTranslator) yangType.getDataTypeExtendedInfo()).getName(),
Bharat saraswal1edde622016-09-06 10:18:04 +0530201 pluginConfig));
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530202 case BITS:
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530203 return BIT_SET;
204 case DECIMAL64:
205 return BIG_DECIMAL;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530206 case LEAFREF:
janani b0e4e8ae2016-07-13 21:06:41 +0530207 YangType<?> referredType = getReferredTypeFromLeafref(yangType);
Shankara-Huaweib7564772016-08-02 18:13:13 +0530208 return getJavaImportClass(referredType, false, pluginConfig);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530209 case IDENTITYREF:
Shankara-Huawei234cd092016-07-14 11:35:34 +0530210 YangIdentityRef identityRef = (YangIdentityRef) yangType.getDataTypeExtendedInfo();
211 YangIdentity identity = identityRef.getReferredIdentity();
Shankara-Huaweib7564772016-08-02 18:13:13 +0530212 return getCapitalCase(getCamelCase(identity.getName(), pluginConfig));
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530213 case EMPTY:
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530214 return BOOLEAN_DATA_TYPE;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530215 case UNION:
Shankara-Huaweib7564772016-08-02 18:13:13 +0530216 return getCapitalCase(getCamelCase(((YangJavaUnionTranslator) yangType
217 .getDataTypeExtendedInfo()).getName(), pluginConfig));
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530218 case INSTANCE_IDENTIFIER:
janani b0e4e8ae2016-07-13 21:06:41 +0530219 return STRING_DATA_TYPE;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530220 case DERIVED:
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530221 return getCapitalCase(
222 getCamelCase(yangType.getDataTypeName(), pluginConfig));
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530223 default:
224 return null;
Vinod Kumar S08710982016-03-03 19:55:30 +0530225 }
226 }
Vinod Kumar S08710982016-03-03 19:55:30 +0530227 }
228
229 /**
230 * Returns java import package.
231 *
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530232 * @param yangType YANG type
233 * @param isListAttr if the attribute is of list type
janani b3e357f62016-05-19 17:39:50 +0530234 * @param conflictResolver object of YANG to java naming conflict util
Vinod Kumar S08710982016-03-03 19:55:30 +0530235 * @return java import package
236 */
Bharat saraswal5cd9e9c2016-05-26 23:48:38 +0530237 public static String getJavaImportPackage(YangType<?> yangType, boolean isListAttr,
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530238 YangToJavaNamingConflictUtil conflictResolver) {
Bharat saraswal84366c52016-03-23 19:40:35 +0530239
Vinod Kumar S08710982016-03-03 19:55:30 +0530240 YangDataTypes type = yangType.getDataType();
241
242 if (isListAttr) {
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530243 switch (type) {
244 case INT8:
245 case INT16:
246 case INT32:
247 case INT64:
248 case UINT8:
249 case UINT16:
250 case UINT32:
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530251 case BINARY:
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530252 case STRING:
253 case BOOLEAN:
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530254 case EMPTY:
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530255 return JAVA_LANG;
256 case UINT64:
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530257 case DECIMAL64:
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530258 return JAVA_MATH;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530259 case ENUMERATION:
janani b3e357f62016-05-19 17:39:50 +0530260 return getEnumsPackage(yangType, conflictResolver);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530261 case BITS:
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530262 return COLLECTION_IMPORTS;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530263 case LEAFREF:
janani b0e4e8ae2016-07-13 21:06:41 +0530264 YangType<?> referredType = getReferredTypeFromLeafref(yangType);
Shankara-Huaweib7564772016-08-02 18:13:13 +0530265 return getJavaImportPackage(referredType, true, conflictResolver);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530266 case IDENTITYREF:
Shankara-Huawei234cd092016-07-14 11:35:34 +0530267 return getIdentityRefPackage(yangType, conflictResolver);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530268 case UNION:
janani b3e357f62016-05-19 17:39:50 +0530269 return getUnionPackage(yangType, conflictResolver);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530270 case INSTANCE_IDENTIFIER:
janani b0e4e8ae2016-07-13 21:06:41 +0530271 return JAVA_LANG;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530272 case DERIVED:
Bharat saraswal8beac342016-08-04 02:00:03 +0530273 return getTypeDefsPackage(yangType, conflictResolver);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530274 default:
Bharat saraswale3175d32016-08-31 17:50:11 +0530275 throw new TranslatorException("given data type is not supported. " +
Bharat saraswal1edde622016-09-06 10:18:04 +0530276 yangType.getDataTypeName() + " in " +
277 yangType.getLineNumber() + " at " +
278 yangType.getCharPosition()
279 + " in " + yangType.getFileName());
Vinod Kumar S08710982016-03-03 19:55:30 +0530280 }
281 } else {
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530282 switch (type) {
283 case UINT64:
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530284 case DECIMAL64:
Bharat saraswal250a7472016-05-12 13:16:57 +0530285 return JAVA_MATH;
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530286 case EMPTY:
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530287 case STRING:
288 return JAVA_LANG;
289 case ENUMERATION:
janani b3e357f62016-05-19 17:39:50 +0530290 return getEnumsPackage(yangType, conflictResolver);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530291 case BITS:
Mahesh Poojary Huawei2cd44332016-07-14 12:38:17 +0530292 return COLLECTION_IMPORTS;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530293 case LEAFREF:
janani b0e4e8ae2016-07-13 21:06:41 +0530294 YangType<?> referredType = getReferredTypeFromLeafref(yangType);
Shankara-Huaweib7564772016-08-02 18:13:13 +0530295 return getJavaImportPackage(referredType, false, conflictResolver);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530296 case IDENTITYREF:
Shankara-Huawei234cd092016-07-14 11:35:34 +0530297 return getIdentityRefPackage(yangType, conflictResolver);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530298 case UNION:
janani b3e357f62016-05-19 17:39:50 +0530299 return getUnionPackage(yangType, conflictResolver);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530300 case INSTANCE_IDENTIFIER:
janani b0e4e8ae2016-07-13 21:06:41 +0530301 return JAVA_LANG;
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530302 case DERIVED:
Bharat saraswal8beac342016-08-04 02:00:03 +0530303 return getTypeDefsPackage(yangType, conflictResolver);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530304 default:
305 return null;
Vinod Kumar S08710982016-03-03 19:55:30 +0530306 }
307 }
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530308 }
309
310 /**
311 * Returns java package for typedef node.
312 *
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530313 * @param type YANG type
janani b3e357f62016-05-19 17:39:50 +0530314 * @param conflictResolver object of YANG to java naming conflict util
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530315 * @return java package for typedef node
316 */
Bharat saraswal8beac342016-08-04 02:00:03 +0530317 private static String getTypeDefsPackage(YangType<?> type, YangToJavaNamingConflictUtil conflictResolver) {
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530318 Object var = type.getDataTypeExtendedInfo();
319 if (!(var instanceof YangDerivedInfo)) {
Bharat saraswale3175d32016-08-31 17:50:11 +0530320 throw new TranslatorException("type should have been derived. " +
Bharat saraswal1edde622016-09-06 10:18:04 +0530321 type.getDataTypeName() + " in " +
322 type.getLineNumber() + " at " +
323 type.getCharPosition()
324 + " in " + type.getFileName());
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530325 }
326
Shankara-Huaweib7564772016-08-02 18:13:13 +0530327 if (!(((YangDerivedInfo<?>) var).getReferredTypeDef() != null)) {
Bharat saraswale3175d32016-08-31 17:50:11 +0530328 throw new TranslatorException("derived info is not an instance of typedef. " +
Bharat saraswal1edde622016-09-06 10:18:04 +0530329 type.getDataTypeName() + " in " +
330 type.getLineNumber() + " at " +
331 type.getCharPosition()
332 + " in " + type.getFileName());
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530333 }
334
Shankara-Huaweib7564772016-08-02 18:13:13 +0530335 YangJavaTypeDefTranslator typedef = (YangJavaTypeDefTranslator) ((YangDerivedInfo<?>) var).getReferredTypeDef();
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530336 if (typedef.getJavaFileInfo().getPackage() == null) {
janani b3e357f62016-05-19 17:39:50 +0530337 return getPackageFromParent(typedef.getParent(), conflictResolver);
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530338 }
339 return typedef.getJavaFileInfo().getPackage();
340 }
341
342 /**
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530343 * Returns java package for union node.
344 *
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530345 * @param type YANG type
janani b3e357f62016-05-19 17:39:50 +0530346 * @param conflictResolver object of YANG to java naming conflict util
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530347 * @return java package for union node
348 */
janani b3e357f62016-05-19 17:39:50 +0530349 private static String getUnionPackage(YangType<?> type, YangToJavaNamingConflictUtil conflictResolver) {
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530350
351 if (!(type.getDataTypeExtendedInfo() instanceof YangUnion)) {
Bharat saraswale3175d32016-08-31 17:50:11 +0530352 throw new TranslatorException("type should have been union. " +
Bharat saraswal1edde622016-09-06 10:18:04 +0530353 type.getDataTypeName() + " in " +
354 type.getLineNumber() + " at " +
355 type.getCharPosition()
356 + " in " + type.getFileName());
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530357 }
358
Shankara-Huaweib7564772016-08-02 18:13:13 +0530359 YangJavaUnionTranslator union = (YangJavaUnionTranslator) type.getDataTypeExtendedInfo();
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530360 if (union.getJavaFileInfo().getPackage() == null) {
janani b3e357f62016-05-19 17:39:50 +0530361 return getPackageFromParent(union.getParent(), conflictResolver);
Gaurav Agrawal97a5e1c2016-04-18 18:53:11 +0530362 }
363 return union.getJavaFileInfo().getPackage();
364 }
365
366 /**
Bharat saraswal68fa0d12016-04-19 01:00:16 +0530367 * Returns YANG enumeration's java package.
368 *
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530369 * @param type YANG type
janani b3e357f62016-05-19 17:39:50 +0530370 * @param conflictResolver object of YANG to java naming conflict util
Bharat saraswal68fa0d12016-04-19 01:00:16 +0530371 * @return YANG enumeration's java package
372 */
janani b3e357f62016-05-19 17:39:50 +0530373 private static String getEnumsPackage(YangType<?> type, YangToJavaNamingConflictUtil conflictResolver) {
Bharat saraswal68fa0d12016-04-19 01:00:16 +0530374
375 if (!(type.getDataTypeExtendedInfo() instanceof YangEnumeration)) {
Bharat saraswale3175d32016-08-31 17:50:11 +0530376 throw new TranslatorException("type should have been enumeration. " +
Bharat saraswal1edde622016-09-06 10:18:04 +0530377 type.getDataTypeName() + " in " +
378 type.getLineNumber() + " at " +
379 type.getCharPosition()
380 + " in " + type.getFileName());
Bharat saraswal68fa0d12016-04-19 01:00:16 +0530381 }
Shankara-Huaweib7564772016-08-02 18:13:13 +0530382 YangJavaEnumerationTranslator enumeration = (YangJavaEnumerationTranslator) type.getDataTypeExtendedInfo();
Bharat saraswal68fa0d12016-04-19 01:00:16 +0530383 if (enumeration.getJavaFileInfo().getPackage() == null) {
janani b3e357f62016-05-19 17:39:50 +0530384 return getPackageFromParent(enumeration.getParent(), conflictResolver);
Bharat saraswal68fa0d12016-04-19 01:00:16 +0530385 }
386 return enumeration.getJavaFileInfo().getPackage();
387 }
388
389 /**
Shankara-Huawei234cd092016-07-14 11:35:34 +0530390 * Returns YANG identity's java package.
391 *
392 * @param type YANG type
393 * @param conflictResolver object of YANG to java naming conflict util
394 * @return YANG identity's java package
395 */
396 private static String getIdentityRefPackage(YangType<?> type, YangToJavaNamingConflictUtil conflictResolver) {
397
398 if (!(type.getDataTypeExtendedInfo() instanceof YangIdentityRef)) {
Bharat saraswale3175d32016-08-31 17:50:11 +0530399 throw new TranslatorException("type should have been identityref. " +
Bharat saraswal1edde622016-09-06 10:18:04 +0530400 type.getDataTypeName() + " in " +
401 type.getLineNumber() + " at " +
402 type.getCharPosition()
403 + " in " + type.getFileName());
Shankara-Huawei234cd092016-07-14 11:35:34 +0530404 }
405 YangIdentityRef identityRef = (YangIdentityRef) type.getDataTypeExtendedInfo();
Shankara-Huaweib7564772016-08-02 18:13:13 +0530406 YangJavaIdentityTranslator identity = (YangJavaIdentityTranslator) (identityRef.getReferredIdentity());
Shankara-Huawei234cd092016-07-14 11:35:34 +0530407 if (identity.getJavaFileInfo().getPackage() == null) {
408 return getPackageFromParent(identity.getParent(), conflictResolver);
409 }
410 return identity.getJavaFileInfo().getPackage();
411 }
Shankara-Huaweib7564772016-08-02 18:13:13 +0530412
Shankara-Huawei234cd092016-07-14 11:35:34 +0530413 /**
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530414 * Returns package from parent node.
415 *
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530416 * @param parent parent YANG node
janani b3e357f62016-05-19 17:39:50 +0530417 * @param conflictResolver object of YANG to java naming conflict util
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530418 * @return java package from parent node
419 */
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530420 private static String getPackageFromParent(YangNode parent,
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530421 YangToJavaNamingConflictUtil conflictResolver) {
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530422 if (!(parent instanceof JavaFileInfoContainer)) {
Bharat saraswale3175d32016-08-31 17:50:11 +0530423 throw new TranslatorException("invalid child node is being processed. " +
Bharat saraswal1edde622016-09-06 10:18:04 +0530424 parent.getName() + " in " +
425 parent.getLineNumber() + " at " +
426 parent.getCharPosition()
427 + " in " + parent.getFileName());
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530428 }
Bharat saraswale50edca2016-08-05 01:58:25 +0530429 JavaFileInfoTranslator parentInfo = ((JavaFileInfoContainer) parent).getJavaFileInfo();
Gaurav Agrawalab7c4bd2016-05-17 18:06:38 +0530430 if (parentInfo.getPackage() == null) {
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530431 updateJavaFileInfo(parent, conflictResolver);
Gaurav Agrawalab7c4bd2016-05-17 18:06:38 +0530432 }
Bharat saraswale2bc60d2016-04-16 02:28:25 +0530433 return parentInfo.getPackage() + PERIOD + parentInfo.getJavaName().toLowerCase();
Vinod Kumar S08710982016-03-03 19:55:30 +0530434 }
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530435
436 /**
437 * Update the referred data model nodes java file info, this will be called,
438 * when the linked node is yet to translate. Then resolve until the parent hierarchy.
439 *
440 * @param yangNode node whose java info needs to be updated
441 * @param conflictResolver yang plugin config
442 */
443 public static void updateJavaFileInfo(YangNode yangNode,
Gaurav Agrawalbfce9342016-06-15 13:58:01 +0530444 YangToJavaNamingConflictUtil conflictResolver) {
Shankara-Huaweib7564772016-08-02 18:13:13 +0530445 Stack<YangNode> nodesToUpdatePackage = new Stack<>();
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530446
447 /*
448 * Add the nodes to be updated for package info in a stack.
449 */
450 while (yangNode != null
451 && ((JavaFileInfoContainer) yangNode)
452 .getJavaFileInfo().getPackage() == null) {
453 nodesToUpdatePackage.push(yangNode);
454 yangNode = yangNode.getParent();
455 }
456
457 /*
458 * If the package is not updated till root node, then root package needs to
459 * be updated.
460 */
461 if (yangNode == null) {
462 yangNode = nodesToUpdatePackage.pop();
463 String pkg;
Shankara-Huaweib7564772016-08-02 18:13:13 +0530464 if (yangNode instanceof YangJavaModuleTranslator) {
465 YangJavaModuleTranslator module = (YangJavaModuleTranslator) yangNode;
Gaurav Agrawal493e0a82016-09-28 18:30:08 +0530466 pkg = getRootPackage(module.getVersion(), module.getModuleNamespace(),
467 module.getRevision(), conflictResolver);
Shankara-Huaweib7564772016-08-02 18:13:13 +0530468 } else if (yangNode instanceof YangJavaSubModuleTranslator) {
469 YangJavaSubModuleTranslator submodule = (YangJavaSubModuleTranslator) yangNode;
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530470 pkg = getRootPackage(submodule.getVersion(),
Bharat saraswal1edde622016-09-06 10:18:04 +0530471 submodule.getNameSpaceFromModule(),
472 submodule.getRevision(), conflictResolver);
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530473 } else {
Bharat saraswale3175d32016-08-31 17:50:11 +0530474 throw new TranslatorException("Invalid root node of data model tree " +
Bharat saraswal1edde622016-09-06 10:18:04 +0530475 yangNode.getName() + " in " +
476 yangNode.getLineNumber() + " at " +
477 yangNode.getCharPosition()
478 + " in " + yangNode.getFileName());
Bharat saraswale3175d32016-08-31 17:50:11 +0530479
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530480 }
481
482 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
483 .setJavaName(getCamelCase(yangNode.getName(), conflictResolver));
484 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
485 .setPackage(pkg);
486 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
487 .setPackageFilePath(getPackageDirPathFromJavaJPackage(
488 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
489 .getPackage()));
490 }
491
Shankara-Huaweib7564772016-08-02 18:13:13 +0530492 /*
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530493 * Parent of the node in stack is updated with java info,
494 * all the nodes can be popped and updated
495 */
496 while (nodesToUpdatePackage.size() != 0) {
497 yangNode = nodesToUpdatePackage.pop();
498 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
499 .setJavaName(getCamelCase(yangNode.getName(), conflictResolver));
500 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
501 .setPackage(getCurNodePackage(yangNode));
502 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
503 .setPackageFilePath(getPackageDirPathFromJavaJPackage(
504 ((JavaCodeGeneratorInfo) yangNode).getJavaFileInfo()
505 .getPackage()));
506 }
507 }
janani b0e4e8ae2016-07-13 21:06:41 +0530508
509 /**
510 * Returns the referred type from leaf/leaf-list.
511 *
512 * @param type current type in leaf
513 * @return type from the leafref
514 */
515 private static YangType<?> getReferredTypeFromLeafref(YangType type) {
516 YangLeafRef<?> leafRefInfo = (YangLeafRef<?>) type.getDataTypeExtendedInfo();
517 return leafRefInfo.getEffectiveDataType();
518 }
Bharat saraswalc46ee2a2016-02-25 02:26:43 +0530519}