blob: b9f7d4627b011a30d1c4c0230cec3e96b38d98fe [file] [log] [blame]
Gaurav Agrawala599a8f2017-01-10 20:45:27 +05301/*
Brian O'Connor72b2df22017-08-03 18:48:28 -07002 * Copyright 2016-present Open Networking Foundation
Gaurav Agrawala599a8f2017-01-10 20:45:27 +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.yang.compiler.translator.tojava.utils;
18
19import org.onosproject.yang.compiler.datamodel.YangNode;
20import org.onosproject.yang.compiler.datamodel.YangRevision;
21import org.onosproject.yang.compiler.translator.exception.TranslatorException;
22import org.onosproject.yang.compiler.translator.tojava.JavaFileInfoContainer;
23import org.onosproject.yang.compiler.translator.tojava.JavaFileInfoTranslator;
24import org.onosproject.yang.compiler.utils.io.YangToJavaNamingConflictUtil;
25
26import java.io.File;
27import java.io.IOException;
Vidyashree Rama7b9726e2019-08-26 13:48:33 +053028import java.time.LocalDate;
Gaurav Agrawala599a8f2017-01-10 20:45:27 +053029import java.util.ArrayList;
30import java.util.Arrays;
Gaurav Agrawala599a8f2017-01-10 20:45:27 +053031import java.util.List;
32
33import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.getParentNodeInGenCode;
sonugupta-huawei35540a32017-08-22 16:18:50 +053034import static org.onosproject.yang.compiler.utils.UtilConstants.ASTERISK;
Gaurav Agrawala599a8f2017-01-10 20:45:27 +053035import static org.onosproject.yang.compiler.utils.UtilConstants.COLON;
36import static org.onosproject.yang.compiler.utils.UtilConstants.DEFAULT_BASE_PKG;
Gaurav Agrawala599a8f2017-01-10 20:45:27 +053037import static org.onosproject.yang.compiler.utils.UtilConstants.HYPHEN;
sonugupta-huawei711d1e32017-09-14 10:59:08 +053038import static org.onosproject.yang.compiler.utils.UtilConstants.ONE_DOT_ONE;
Gaurav Agrawala599a8f2017-01-10 20:45:27 +053039import static org.onosproject.yang.compiler.utils.UtilConstants.PERIOD;
Gaurav Agrawala599a8f2017-01-10 20:45:27 +053040import static org.onosproject.yang.compiler.utils.UtilConstants.REGEX_WITH_ALL_SPECIAL_CHAR;
41import static org.onosproject.yang.compiler.utils.UtilConstants.REVISION_PREFIX;
42import static org.onosproject.yang.compiler.utils.UtilConstants.SLASH;
43import static org.onosproject.yang.compiler.utils.UtilConstants.UNDER_SCORE;
44import static org.onosproject.yang.compiler.utils.UtilConstants.VERSION_PREFIX;
45import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.addPackageInfo;
46import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.createDirectories;
47import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.getAbsolutePackagePath;
Gaurav Agrawalfda09be2017-05-15 15:48:25 +053048import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.getCamelCase;
Gaurav Agrawala599a8f2017-01-10 20:45:27 +053049import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.getJavaPackageFromPackagePath;
50import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.getPackageDirPathFromJavaJPackage;
Gaurav Agrawala599a8f2017-01-10 20:45:27 +053051
52/**
53 * Represents an utility Class for translating the name from YANG to java convention.
54 */
55public final class JavaIdentifierSyntax {
56
57 private static final int INDEX_ZERO = 0;
58 private static final int INDEX_ONE = 1;
59 private static final int VALUE_CHECK = 10;
60 private static final String ZERO = "0";
61 private static final String DATE_FORMAT = "yyyy-MM-dd";
62
63 /**
64 * Create instance of java identifier syntax.
65 */
66 private JavaIdentifierSyntax() {
67 }
68
69 /**
70 * Returns the root package string.
71 *
Gaurav Agrawalfda09be2017-05-15 15:48:25 +053072 * @param version YANG version
73 * @param name name of the module
74 * @param revision revision of the module defined
75 * @param resolver object of YANG to java naming conflict util
Gaurav Agrawala599a8f2017-01-10 20:45:27 +053076 * @return the root package string
77 */
sonugupta-huawei711d1e32017-09-14 10:59:08 +053078 public static String getRootPackage(String version, String name,
Gaurav Agrawala599a8f2017-01-10 20:45:27 +053079 YangRevision revision,
80 YangToJavaNamingConflictUtil resolver) {
81
82 StringBuilder pkg = new StringBuilder(DEFAULT_BASE_PKG)
83 .append(PERIOD)
84 .append(getYangVersion(version))
85 .append(PERIOD)
Gaurav Agrawalfda09be2017-05-15 15:48:25 +053086 .append(getCamelCase(name, resolver));
Gaurav Agrawala599a8f2017-01-10 20:45:27 +053087 if (revision != null) {
88 pkg.append(PERIOD)
89 .append(getYangRevisionStr(revision.getRevDate()));
90 }
91 return pkg.toString().toLowerCase();
92 }
93
Gaurav Agrawala599a8f2017-01-10 20:45:27 +053094 /**
95 * Returns version.
96 *
97 * @param ver YANG version
98 * @return version
99 */
sonugupta-huawei711d1e32017-09-14 10:59:08 +0530100 private static String getYangVersion(String ver) {
101 if (ver.equals(ONE_DOT_ONE)) {
102 ver = "11";
103 }
Gaurav Agrawala599a8f2017-01-10 20:45:27 +0530104 return VERSION_PREFIX + ver;
105 }
106
107 /**
Gaurav Agrawala599a8f2017-01-10 20:45:27 +0530108 * Returns revision string array.
109 *
110 * @param date YANG module revision
111 * @return revision string
112 */
Vidyashree Rama7b9726e2019-08-26 13:48:33 +0530113 private static String getYangRevisionStr(LocalDate date) {
114 String[] revisionArr = date.toString().split(HYPHEN);
Gaurav Agrawala599a8f2017-01-10 20:45:27 +0530115
116 StringBuilder rev = new StringBuilder(REVISION_PREFIX)
117 .append(revisionArr[INDEX_ZERO]);
118
119 for (int i = INDEX_ONE; i < revisionArr.length; i++) {
120 Integer val = Integer.parseInt(revisionArr[i]);
121 if (val < VALUE_CHECK) {
122 rev.append(ZERO);
123 }
124 rev.append(val);
125 }
126 return rev.toString();
127 }
128
129 /**
Gaurav Agrawala599a8f2017-01-10 20:45:27 +0530130 * Returns enum's java name.
131 *
132 * @param name enum's name
133 * @return enum's java name
134 */
135 public static String getEnumJavaAttribute(String name) {
136
sonugupta-huawei35540a32017-08-22 16:18:50 +0530137 if (name.equals("*")) {
138 name = ASTERISK;
139 } else {
140 name = name.replaceAll(REGEX_WITH_ALL_SPECIAL_CHAR, COLON);
141 }
142
Gaurav Agrawala599a8f2017-01-10 20:45:27 +0530143 String[] strArray = name.split(COLON);
144 StringBuilder output = new StringBuilder();
145 if (strArray[0].isEmpty()) {
146 List<String> stringArrangement = new ArrayList<>();
147 stringArrangement.addAll(Arrays.asList(strArray).subList(1, strArray.length));
148 strArray = stringArrangement.toArray(new String[stringArrangement.size()]);
149 }
150 for (int i = 0; i < strArray.length; i++) {
151 if (i > 0 && i < strArray.length) {
152 output.append(UNDER_SCORE);
153 }
154 output.append(strArray[i]);
155 }
156 return output.toString();
157 }
158
159 /**
160 * Creates a package structure with package info java file if not present.
161 *
162 * @param yangNode YANG node for which code is being generated
163 * @throws IOException any IO exception
164 */
165 public static void createPackage(YangNode yangNode)
166 throws IOException {
167 if (!(yangNode instanceof JavaFileInfoContainer)) {
168 throw new TranslatorException("current node must have java file info " +
169 yangNode.getName() + " in " +
170 yangNode.getLineNumber() + " at " +
171 yangNode.getCharPosition() +
172 " in " + yangNode.getFileName());
173 }
174 String pkgInfo;
175 JavaFileInfoTranslator javaFileInfo = ((JavaFileInfoContainer) yangNode)
176 .getJavaFileInfo();
177 String pkg = getAbsolutePackagePath(javaFileInfo.getBaseCodeGenPath(),
178 javaFileInfo.getPackageFilePath());
179 JavaFileInfoTranslator parentInfo;
180 if (!doesPackageExist(pkg)) {
181 try {
182 File pack = createDirectories(pkg);
183 YangNode parent = getParentNodeInGenCode(yangNode);
184 if (parent != null) {
185 parentInfo = ((JavaFileInfoContainer) parent).getJavaFileInfo();
186 pkgInfo = parentInfo.getJavaName();
187 addPackageInfo(pack, pkgInfo, getJavaPackageFromPackagePath(pkg),
188 true);
189 } else {
190 pkgInfo = javaFileInfo.getJavaName();
191 addPackageInfo(pack, pkgInfo, getJavaPackageFromPackagePath(pkg),
192 false);
193 }
194 } catch (IOException e) {
Yuta HIGUCHI601dfd82017-08-11 11:26:39 -0700195 throw new IOException("failed to create package-info file for " + pkg, e);
Gaurav Agrawala599a8f2017-01-10 20:45:27 +0530196 }
197 }
198 }
199
200 /**
201 * Checks if the package directory structure created.
202 *
203 * @param pkg Package to check if it is created
204 * @return existence status of package
205 */
Gaurav Agrawalfda09be2017-05-15 15:48:25 +0530206 static boolean doesPackageExist(String pkg) {
Gaurav Agrawala599a8f2017-01-10 20:45:27 +0530207 File pkgDir = new File(getPackageDirPathFromJavaJPackage(pkg));
208 File pkgWithFile = new File(pkgDir + SLASH + "package-info.java");
209 return pkgDir.exists() && pkgWithFile.isFile();
210 }
211}