blob: c71f2d1a362a75e291352a5a142e260390e21a85 [file] [log] [blame]
Bharat saraswal870c56f2016-02-20 21:57:16 +05301/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Bharat saraswal870c56f2016-02-20 21:57:16 +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
17package org.onosproject.yangutils.translator.tojava.utils;
18
19import java.util.ArrayList;
20
Vinod Kumar S38046502016-03-23 15:30:27 +053021import org.onosproject.yangutils.datamodel.YangNode;
b.janani1fef2732016-03-04 12:29:05 +053022import org.onosproject.yangutils.translator.exception.TranslatorException;
Vinod Kumar S38046502016-03-23 15:30:27 +053023import org.onosproject.yangutils.translator.tojava.HasJavaFileInfo;
24import org.onosproject.yangutils.translator.tojava.JavaFileInfo;
Bharat saraswale2d51d62016-03-23 19:40:35 +053025
26import static org.onosproject.yangutils.utils.UtilConstants.COLAN;
27import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT_BASE_PKG;
28import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
29import static org.onosproject.yangutils.utils.UtilConstants.HYPHEN;
30import static org.onosproject.yangutils.utils.UtilConstants.JAVA_KEY_WORDS;
31import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
32import static org.onosproject.yangutils.utils.UtilConstants.QUOTES;
33import static org.onosproject.yangutils.utils.UtilConstants.REGEX_FOR_FIRST_DIGIT;
34import static org.onosproject.yangutils.utils.UtilConstants.REGEX_WITH_SPECIAL_CHAR;
Bharat saraswal2f11f652016-03-25 18:19:46 +053035import static org.onosproject.yangutils.utils.UtilConstants.REVISION_PREFIX;
Bharat saraswale2d51d62016-03-23 19:40:35 +053036import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
37import static org.onosproject.yangutils.utils.UtilConstants.UNDER_SCORE;
Bharat saraswal2f11f652016-03-25 18:19:46 +053038import static org.onosproject.yangutils.utils.UtilConstants.VERSION_PREFIX;
Bharat saraswal870c56f2016-02-20 21:57:16 +053039
40/**
Bharat saraswald9822e92016-04-05 15:13:44 +053041 * Represents an utility Class for translating the name from YANG to java convention.
Bharat saraswal870c56f2016-02-20 21:57:16 +053042 */
43public final class JavaIdentifierSyntax {
44
b.janani1fef2732016-03-04 12:29:05 +053045 private static final int MAX_MONTHS = 12;
46 private static final int MAX_DAYS = 31;
47 private static final int INDEX_ZERO = 0;
48 private static final int INDEX_ONE = 1;
49 private static final int INDEX_TWO = 2;
Bharat saraswal6ef0b762016-04-05 12:45:45 +053050 private static final int VALUE_CHECK = 10;
51 private static final String ZERO = "0";
b.janani1fef2732016-03-04 12:29:05 +053052
Bharat saraswal870c56f2016-02-20 21:57:16 +053053 /**
Bharat saraswald9822e92016-04-05 15:13:44 +053054 * Create instance of java identifier syntax.
Bharat saraswal870c56f2016-02-20 21:57:16 +053055 */
56 private JavaIdentifierSyntax() {
57 }
58
59 /**
Bharat saraswald9822e92016-04-05 15:13:44 +053060 * Returns the root package string.
Bharat saraswal870c56f2016-02-20 21:57:16 +053061 *
Vinod Kumar Sc4216002016-03-03 19:55:30 +053062 * @param version YANG version
63 * @param nameSpace name space of the module
Bharat saraswal870c56f2016-02-20 21:57:16 +053064 * @param revision revision of the module defined
Vinod Kumar Sc4216002016-03-03 19:55:30 +053065 * @return returns the root package string
Bharat saraswal870c56f2016-02-20 21:57:16 +053066 */
67 public static String getRootPackage(byte version, String nameSpace, String revision) {
68
69 String pkg;
Bharat saraswale2d51d62016-03-23 19:40:35 +053070 pkg = DEFAULT_BASE_PKG;
71 pkg = pkg + PERIOD;
Bharat saraswal870c56f2016-02-20 21:57:16 +053072 pkg = pkg + getYangVersion(version);
Bharat saraswale2d51d62016-03-23 19:40:35 +053073 pkg = pkg + PERIOD;
Bharat saraswal870c56f2016-02-20 21:57:16 +053074 pkg = pkg + getPkgFromNameSpace(nameSpace);
Bharat saraswale2d51d62016-03-23 19:40:35 +053075 pkg = pkg + PERIOD;
Bharat saraswal870c56f2016-02-20 21:57:16 +053076 pkg = pkg + getYangRevisionStr(revision);
77
Bharat saraswal4bf8b152016-02-25 02:26:43 +053078 return pkg.toLowerCase();
Bharat saraswal870c56f2016-02-20 21:57:16 +053079 }
80
81 /**
Bharat saraswald9822e92016-04-05 15:13:44 +053082 * Returns the contained data model parent node.
Vinod Kumar S38046502016-03-23 15:30:27 +053083 *
84 * @param currentNode current node which parent contained node is required
85 * @return parent node in which the current node is an attribute
86 */
87 public static YangNode getParentNodeInGenCode(YangNode currentNode) {
88
89 /*
90 * TODO: recursive parent lookup to support choice/augment/uses. TODO:
91 * need to check if this needs to be updated for
92 * choice/case/augment/grouping
93 */
94 return currentNode.getParent();
95 }
96
97 /**
Bharat saraswald9822e92016-04-05 15:13:44 +053098 * Returns the node package string.
Vinod Kumar S38046502016-03-23 15:30:27 +053099 *
100 * @param curNode current java node whose package string needs to be set
101 * @return returns the root package string
102 */
103 public static String getCurNodePackage(YangNode curNode) {
104
105 String pkg;
106 if (!(curNode instanceof HasJavaFileInfo)
107 || curNode.getParent() == null) {
Bharat saraswal6ef0b762016-04-05 12:45:45 +0530108 throw new TranslatorException("missing parent node to get current node's package");
Vinod Kumar S38046502016-03-23 15:30:27 +0530109 }
110
111 YangNode parentNode = getParentNodeInGenCode(curNode);
112 if (!(parentNode instanceof HasJavaFileInfo)) {
Bharat saraswal6ef0b762016-04-05 12:45:45 +0530113 throw new TranslatorException("missing parent java node to get current node's package");
Vinod Kumar S38046502016-03-23 15:30:27 +0530114 }
115 JavaFileInfo parentJavaFileHandle = ((HasJavaFileInfo) parentNode).getJavaFileInfo();
Bharat saraswale2d51d62016-03-23 19:40:35 +0530116 pkg = parentJavaFileHandle.getPackage() + PERIOD + parentJavaFileHandle.getJavaName();
Vinod Kumar S38046502016-03-23 15:30:27 +0530117 return pkg.toLowerCase();
118 }
119
120 /**
Bharat saraswal870c56f2016-02-20 21:57:16 +0530121 * Returns version.
122 *
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530123 * @param ver YANG version
Bharat saraswal870c56f2016-02-20 21:57:16 +0530124 * @return version
125 */
126 private static String getYangVersion(byte ver) {
Bharat saraswal2f11f652016-03-25 18:19:46 +0530127 return VERSION_PREFIX + ver;
Bharat saraswal870c56f2016-02-20 21:57:16 +0530128 }
129
130 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530131 * Returns package name from name space.
Bharat saraswal870c56f2016-02-20 21:57:16 +0530132 *
133 * @param nameSpace name space of YANG module
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530134 * @return java package name as per java rules
Bharat saraswal870c56f2016-02-20 21:57:16 +0530135 */
Bharat saraswald9822e92016-04-05 15:13:44 +0530136 private static String getPkgFromNameSpace(String nameSpace) {
Vinod Kumar S38046502016-03-23 15:30:27 +0530137
Bharat saraswal870c56f2016-02-20 21:57:16 +0530138 ArrayList<String> pkgArr = new ArrayList<String>();
Bharat saraswale2d51d62016-03-23 19:40:35 +0530139 nameSpace = nameSpace.replace(QUOTES, EMPTY_STRING);
140 String properNameSpace = nameSpace.replaceAll(REGEX_WITH_SPECIAL_CHAR, COLAN);
141 String[] nameSpaceArr = properNameSpace.split(COLAN);
Bharat saraswal870c56f2016-02-20 21:57:16 +0530142
143 for (String nameSpaceString : nameSpaceArr) {
144 pkgArr.add(nameSpaceString);
145 }
146 return getPkgFrmArr(pkgArr);
147 }
148
149 /**
150 * Returns revision string array.
151 *
152 * @param date YANG module revision
153 * @return revision string
b.janani1fef2732016-03-04 12:29:05 +0530154 * @throws TranslatorException when date is invalid.
Bharat saraswal870c56f2016-02-20 21:57:16 +0530155 */
Bharat saraswald9822e92016-04-05 15:13:44 +0530156 private static String getYangRevisionStr(String date) throws TranslatorException {
Vinod Kumar S38046502016-03-23 15:30:27 +0530157
Bharat saraswale2d51d62016-03-23 19:40:35 +0530158 String[] revisionArr = date.split(HYPHEN);
Bharat saraswal870c56f2016-02-20 21:57:16 +0530159
Bharat saraswal2f11f652016-03-25 18:19:46 +0530160 String rev = REVISION_PREFIX;
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530161 rev = rev + revisionArr[INDEX_ZERO];
b.janani1fef2732016-03-04 12:29:05 +0530162
Vinod Kumar S38046502016-03-23 15:30:27 +0530163 if (Integer.parseInt(revisionArr[INDEX_ONE]) <= MAX_MONTHS
b.janani1fef2732016-03-04 12:29:05 +0530164 && Integer.parseInt(revisionArr[INDEX_TWO]) <= MAX_DAYS) {
165 for (int i = INDEX_ONE; i < revisionArr.length; i++) {
166
167 Integer val = Integer.parseInt(revisionArr[i]);
Bharat saraswal6ef0b762016-04-05 12:45:45 +0530168 if (val < VALUE_CHECK) {
169 rev = rev + ZERO;
b.janani1fef2732016-03-04 12:29:05 +0530170 }
171 rev = rev + val;
Bharat saraswal870c56f2016-02-20 21:57:16 +0530172 }
b.janani1fef2732016-03-04 12:29:05 +0530173
174 return rev;
175 } else {
176 throw new TranslatorException("Date in revision is not proper: " + date);
Bharat saraswal870c56f2016-02-20 21:57:16 +0530177 }
Bharat saraswal870c56f2016-02-20 21:57:16 +0530178 }
179
180 /**
181 * Returns the package string.
182 *
183 * @param pkgArr package array
184 * @return package string
185 */
Bharat saraswald9822e92016-04-05 15:13:44 +0530186 private static String getPkgFrmArr(ArrayList<String> pkgArr) {
Bharat saraswal870c56f2016-02-20 21:57:16 +0530187
Bharat saraswale2d51d62016-03-23 19:40:35 +0530188 String pkg = EMPTY_STRING;
Bharat saraswal870c56f2016-02-20 21:57:16 +0530189 int size = pkgArr.size();
190 int i = 0;
191 for (String member : pkgArr) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530192 boolean presenceOfKeyword = JAVA_KEY_WORDS.contains(member);
193 if (presenceOfKeyword || member.matches(REGEX_FOR_FIRST_DIGIT)) {
194 member = UNDER_SCORE + member;
b.janani1fef2732016-03-04 12:29:05 +0530195 }
Bharat saraswal870c56f2016-02-20 21:57:16 +0530196 pkg = pkg + member;
197 if (i != size - 1) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530198 pkg = pkg + PERIOD;
Bharat saraswal870c56f2016-02-20 21:57:16 +0530199 }
200 i++;
201 }
202 return pkg;
203 }
204
205 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530206 * Returns package sub name from YANG identifier name.
Bharat saraswal870c56f2016-02-20 21:57:16 +0530207 *
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530208 * @param name YANG identifier name
209 * @return java package sub name as per java rules
Bharat saraswal870c56f2016-02-20 21:57:16 +0530210 */
211 public static String getSubPkgFromName(String name) {
Vinod Kumar S38046502016-03-23 15:30:27 +0530212
Bharat saraswal870c56f2016-02-20 21:57:16 +0530213 ArrayList<String> pkgArr = new ArrayList<String>();
Bharat saraswale2d51d62016-03-23 19:40:35 +0530214 String[] nameArr = name.split(COLAN);
Bharat saraswal870c56f2016-02-20 21:57:16 +0530215
216 for (String nameString : nameArr) {
217 pkgArr.add(nameString);
218 }
219 return getPkgFrmArr(pkgArr);
220 }
221
222 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530223 * Returns the YANG identifier name as java identifier.
Bharat saraswal870c56f2016-02-20 21:57:16 +0530224 *
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530225 * @param yangIdentifier identifier in YANG file
Bharat saraswal870c56f2016-02-20 21:57:16 +0530226 * @return corresponding java identifier
227 */
228 public static String getCamelCase(String yangIdentifier) {
Vinod Kumar S38046502016-03-23 15:30:27 +0530229
Bharat saraswale2d51d62016-03-23 19:40:35 +0530230 String[] strArray = yangIdentifier.split(HYPHEN);
Bharat saraswal870c56f2016-02-20 21:57:16 +0530231 String camelCase = strArray[0];
232 for (int i = 1; i < strArray.length; i++) {
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530233 camelCase = camelCase + strArray[i].substring(0, 1).toUpperCase() + strArray[i].substring(1);
Bharat saraswal870c56f2016-02-20 21:57:16 +0530234 }
235 return camelCase;
236 }
Bharat saraswal594bc6d2016-02-22 22:15:21 +0530237
238 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530239 * Returns the YANG identifier name as java identifier with first letter
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530240 * in caps.
Bharat saraswal594bc6d2016-02-22 22:15:21 +0530241 *
Vinod Kumar Sc4216002016-03-03 19:55:30 +0530242 * @param yangIdentifier identifier in YANG file
Bharat saraswal594bc6d2016-02-22 22:15:21 +0530243 * @return corresponding java identifier
244 */
245 public static String getCaptialCase(String yangIdentifier) {
246 return yangIdentifier.substring(0, 1).toUpperCase() + yangIdentifier.substring(1);
247 }
b.janani1fef2732016-03-04 12:29:05 +0530248
249 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530250 * Returns the YANG identifier name as java identifier with first letter
Vinod Kumar S38046502016-03-23 15:30:27 +0530251 * in small.
b.janani1fef2732016-03-04 12:29:05 +0530252 *
253 * @param yangIdentifier identifier in YANG file.
254 * @return corresponding java identifier
255 */
Bharat saraswal2f11f652016-03-25 18:19:46 +0530256 public static String getSmallCase(String yangIdentifier) {
b.janani1fef2732016-03-04 12:29:05 +0530257 return yangIdentifier.substring(0, 1).toLowerCase() + yangIdentifier.substring(1);
258 }
Vinod Kumar S38046502016-03-23 15:30:27 +0530259
260 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530261 * Returns the java Package from package path.
Vinod Kumar S38046502016-03-23 15:30:27 +0530262 *
263 * @param packagePath package path
264 * @return java package
265 */
266 public static String getJavaPackageFromPackagePath(String packagePath) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530267 return packagePath.replace(SLASH, PERIOD);
Vinod Kumar S38046502016-03-23 15:30:27 +0530268 }
269
270 /**
Bharat saraswald9822e92016-04-05 15:13:44 +0530271 * Returns the directory path corresponding to java package.
Vinod Kumar S38046502016-03-23 15:30:27 +0530272 *
273 * @param packagePath package path
274 * @return java package
275 */
276 public static String getPackageDirPathFromJavaJPackage(String packagePath) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530277 return packagePath.replace(PERIOD, SLASH);
Vinod Kumar S38046502016-03-23 15:30:27 +0530278 }
Bharat saraswal870c56f2016-02-20 21:57:16 +0530279}