blob: 617ac99d8494864a0c58f356163e53ffd94cff40 [file] [log] [blame]
Bharat saraswalcc1cdab2016-04-16 02:28:25 +05301/*
2 * Copyright 2016-present Open Networking Laboratory
3 *
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.io.File;
20import java.io.IOException;
21import java.util.List;
22
23import org.onosproject.yangutils.datamodel.YangNode;
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053024import org.onosproject.yangutils.datamodel.YangNodeIdentifier;
25import org.onosproject.yangutils.translator.exception.TranslatorException;
Bharat saraswalc0e04842016-05-12 13:16:57 +053026import org.onosproject.yangutils.translator.tojava.JavaFileInfoContainer;
Bharat saraswalc0e04842016-05-12 13:16:57 +053027import org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo;
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053028import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFiles;
29import org.onosproject.yangutils.translator.tojava.TempJavaCodeFragmentFilesContainer;
30import org.onosproject.yangutils.translator.tojava.TempJavaFragmentFiles;
31import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaAugment;
Bharat saraswalcad0e652016-05-26 23:48:38 +053032import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaInput;
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053033import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaModule;
Bharat saraswalcad0e652016-05-26 23:48:38 +053034import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaOutput;
35import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaSubModule;
Bharat saraswalc0e04842016-05-12 13:16:57 +053036
37import static java.util.Collections.sort;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +053038
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053039import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCapitalCase;
40import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getSmallCase;
Bharat saraswal33dfa012016-05-17 19:59:16 +053041import static org.onosproject.yangutils.utils.UtilConstants.ACTIVATE_ANNOTATION_IMPORT;
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053042import static org.onosproject.yangutils.utils.UtilConstants.ADD_STRING;
43import static org.onosproject.yangutils.utils.UtilConstants.AUGMENTATION;
44import static org.onosproject.yangutils.utils.UtilConstants.AUGMENTATION_HOLDER;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +053045import static org.onosproject.yangutils.utils.UtilConstants.AUGMENTED_INFO;
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053046import static org.onosproject.yangutils.utils.UtilConstants.BUILDER;
47import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_PARENTHESIS;
Bharat saraswal33dfa012016-05-17 19:59:16 +053048import static org.onosproject.yangutils.utils.UtilConstants.COMPONENT_ANNOTATION_IMPORT;
49import static org.onosproject.yangutils.utils.UtilConstants.DEACTIVATE_ANNOTATION_IMPORT;
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053050import static org.onosproject.yangutils.utils.UtilConstants.EIGHT_SPACE_INDENTATION;
Bharat saraswal33dfa012016-05-17 19:59:16 +053051import static org.onosproject.yangutils.utils.UtilConstants.ENUM;
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053052import static org.onosproject.yangutils.utils.UtilConstants.EQUAL;
Bharat saraswal33dfa012016-05-17 19:59:16 +053053import static org.onosproject.yangutils.utils.UtilConstants.FOUR_SPACE_INDENTATION;
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053054import static org.onosproject.yangutils.utils.UtilConstants.IMPL;
55import static org.onosproject.yangutils.utils.UtilConstants.IMPORT;
56import static org.onosproject.yangutils.utils.UtilConstants.LISTENER_SERVICE;
Bharat saraswal33dfa012016-05-17 19:59:16 +053057import static org.onosproject.yangutils.utils.UtilConstants.LOGGER_FACTORY_IMPORT;
58import static org.onosproject.yangutils.utils.UtilConstants.LOGGER_IMPORT;
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053059import static org.onosproject.yangutils.utils.UtilConstants.NEW;
60import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
Bharat saraswal33dfa012016-05-17 19:59:16 +053061import static org.onosproject.yangutils.utils.UtilConstants.OPEN_CURLY_BRACKET;
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053062import static org.onosproject.yangutils.utils.UtilConstants.OPEN_PARENTHESIS;
63import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
Bharat saraswal33dfa012016-05-17 19:59:16 +053064import static org.onosproject.yangutils.utils.UtilConstants.PUBLIC;
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053065import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLAN;
Bharat saraswal33dfa012016-05-17 19:59:16 +053066import static org.onosproject.yangutils.utils.UtilConstants.SERVICE_ANNOTATION_IMPORT;
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053067import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
68import static org.onosproject.yangutils.utils.UtilConstants.THIS;
Bharat saraswal33dfa012016-05-17 19:59:16 +053069import static org.onosproject.yangutils.utils.UtilConstants.TYPE;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +053070import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.updateFileHandle;
71
72/**
73 * Represents utilities for temporary java code fragments.
74 */
75public final class TempJavaCodeFragmentFilesUtils {
76
77 /**
78 * Creates a private instance of temporary java code fragment utils.
79 */
80 private TempJavaCodeFragmentFilesUtils() {
81 }
82
83 /**
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053084 * Adds import for AugmentationHolders class.
Bharat saraswalcc1cdab2016-04-16 02:28:25 +053085 *
86 * @param curNode current YANG node
87 * @param imports list of imports
88 * @param operation add or delete import
Bharat saraswalcc1cdab2016-04-16 02:28:25 +053089 */
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053090 public static void addAugmentationHoldersImport(YangNode curNode, List<String> imports, boolean operation) {
91 String thisImport = getTempJavaFragement(curNode).getJavaImportData().getAugmentationHolderImport();
92 performOperationOnImports(imports, thisImport, operation);
Bharat saraswalcc1cdab2016-04-16 02:28:25 +053093 }
94
95 /**
96 * Adds import for AugmentedInfo class.
97 *
98 * @param curNode current YANG node
99 * @param imports list of imports
100 * @param operation add or delete import
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530101 */
Bharat saraswalab4c6ba2016-05-17 14:19:38 +0530102 public static void addAugmentedInfoImport(YangNode curNode, List<String> imports, boolean operation) {
103 String thisImport = getTempJavaFragement(curNode).getJavaImportData().getAugmentedInfoImport();
104 performOperationOnImports(imports, thisImport, operation);
105 }
106
107 /**
108 * Returns temp java fragment.
109 *
110 * @param curNode current YANG node
111 * @return temp java fragments
112 */
113 public static TempJavaFragmentFiles getTempJavaFragement(YangNode curNode) {
114 TempJavaCodeFragmentFiles container = ((TempJavaCodeFragmentFilesContainer) curNode)
115 .getTempJavaCodeFragmentFiles();
116 if (container.getBeanTempFiles() != null) {
117 return container.getBeanTempFiles();
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530118 }
Bharat saraswalab4c6ba2016-05-17 14:19:38 +0530119 if (container.getServiceTempFiles() != null) {
120 return container.getServiceTempFiles();
121 }
122
123 return null;
124 }
125
126 /**
127 * Updated imports with augmented nodes import.
128 *
129 * @param curNode current YANG node
130 * @param imports list of imports
131 * @param operation to add or to delete
132 */
133 public static void addAugmentedNodesImport(YangNode curNode, List<String> imports, boolean operation) {
134
135 String nodesImport = "";
136
137 if (!(curNode instanceof YangJavaAugment)) {
138 throw new TranslatorException("current node should be of type augment node.");
139 }
140 YangJavaAugment augment = (YangJavaAugment) curNode;
141 List<YangNodeIdentifier> targetNodes = augment.getTargetNode();
142 YangNode parent = curNode.getParent();
143 if (parent instanceof YangJavaModule) {
144 // Add impl class import.
145 nodesImport = getAugmendtedNodesImports(parent, targetNodes, true) + SEMI_COLAN + NEW_LINE;
146 performOperationOnImports(imports, nodesImport, operation);
147 // Add builder class import.
148 if (targetNodes.size() > 2) {
149 nodesImport = getAugmendtedNodesImports(parent, targetNodes, false) + SEMI_COLAN + NEW_LINE;
150 performOperationOnImports(imports, nodesImport, operation);
151 }
152 }
153 // TODO: add functionality for submodule and uses.
154 }
155
156 /**
157 * Returns imports for augmented node.
158 *
159 * @param parent parent YANG node
160 * @param targetNodes list of target nodes
161 * @param isImplClass if impl class's import required
162 * @return imports for augmented node
163 */
164 private static String getAugmendtedNodesImports(YangNode parent, List<YangNodeIdentifier> targetNodes,
165 boolean isImplClass) {
166 String pkgInfo = ((JavaFileInfoContainer) parent).getJavaFileInfo().getPackage();
167
168 for (int i = 0; i < targetNodes.size() - 1; i++) {
169 pkgInfo = pkgInfo + PERIOD + targetNodes.get(i).getName();
170 }
171 String classInfo = targetNodes.get(targetNodes.size() - 1).getName();
172 if (!isImplClass) {
173 return IMPORT + pkgInfo.toLowerCase() + PERIOD + getCapitalCase(classInfo) + BUILDER;
174 }
175 return IMPORT + pkgInfo.toLowerCase() + PERIOD + getCapitalCase(classInfo) + BUILDER + PERIOD
176 + getCapitalCase(classInfo) + IMPL;
177 }
178
179 /**
180 * Provides string to be added in augment node's constructor.
181 *
182 * @param curNode current YANG node
183 * @return constructors string
184 */
185 public static String getAugmentsAddToAugmentedClassString(YangNode curNode) {
186
187 if (!(curNode instanceof YangJavaAugment)) {
188 throw new TranslatorException("current node should be of type augment node.");
189 }
190 YangJavaAugment augment = (YangJavaAugment) curNode;
191 List<YangNodeIdentifier> targetNodes = augment.getTargetNode();
192
193 String name = targetNodes.get(targetNodes.size() - 1).getName();
194 String captialCase = getCapitalCase(name);
195 String smallCase = getSmallCase(captialCase);
196 return EIGHT_SPACE_INDENTATION + captialCase + IMPL + SPACE + smallCase + IMPL + SPACE + EQUAL + SPACE + NEW
197 + SPACE + captialCase + BUILDER + OPEN_PARENTHESIS + CLOSE_PARENTHESIS + PERIOD + NEW + SPACE
198 + captialCase + IMPL + OPEN_PARENTHESIS + CLOSE_PARENTHESIS + SEMI_COLAN + NEW_LINE
199 + EIGHT_SPACE_INDENTATION + smallCase + IMPL + PERIOD + ADD_STRING + AUGMENTATION + OPEN_PARENTHESIS
200 + THIS + CLOSE_PARENTHESIS + SEMI_COLAN + NEW_LINE;
201
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530202 }
203
204 /**
205 * Adds import for array list.
206 *
207 * @param curNode current YANG node
208 * @param imports list of imports
209 * @param operation add or delete import
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530210 */
Bharat saraswalab4c6ba2016-05-17 14:19:38 +0530211 public static void addArrayListImport(YangNode curNode, List<String> imports, boolean operation) {
212 String arrayListImport = getTempJavaFragement(curNode).getJavaImportData().getImportForArrayList();
213 String listImport = getTempJavaFragement(curNode).getJavaImportData().getImportForList();
214 performOperationOnImports(imports, arrayListImport, operation);
215 if (!imports.contains(listImport)) {
216 /**
217 * List can be there because of attribute also , so no need to remove it and operation will
218 * always be add(true).
219 */
220 performOperationOnImports(imports, listImport, true);
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530221 }
Bharat saraswalab4c6ba2016-05-17 14:19:38 +0530222 }
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530223
Bharat saraswalab4c6ba2016-05-17 14:19:38 +0530224 /**
225 * Adds listener's imports.
226 *
227 * @param curNode currentYangNode.
228 * @param imports import list
229 * @param operation add or remove
230 * @param classInfo class info to be added to import list
231 */
232 public static void addListnersImport(YangNode curNode, List<String> imports, boolean operation,
233 String classInfo) {
234 String thisImport = "";
235 if (classInfo.equals(LISTENER_SERVICE)) {
236 thisImport = getTempJavaFragement(curNode).getJavaImportData().getListenerServiceImport();
237 performOperationOnImports(imports, thisImport, operation);
238 } else {
239 thisImport = getTempJavaFragement(curNode).getJavaImportData().getListenerRegistryImport();
240 performOperationOnImports(imports, thisImport, operation);
241 }
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530242 }
243
244 /**
Bharat saraswal33dfa012016-05-17 19:59:16 +0530245 * Adds annotations imports.
246 *
247 * @param imports list if imports
248 * @param operation to add or to delete
249 */
250 public static void addAnnotationsImports(List<String> imports, boolean operation) {
251 if (operation) {
252 imports.add(ACTIVATE_ANNOTATION_IMPORT);
253 imports.add(DEACTIVATE_ANNOTATION_IMPORT);
254 imports.add(COMPONENT_ANNOTATION_IMPORT);
255 imports.add(SERVICE_ANNOTATION_IMPORT);
256 imports.add(LOGGER_FACTORY_IMPORT);
257 imports.add(LOGGER_IMPORT);
258 } else {
259 imports.remove(ACTIVATE_ANNOTATION_IMPORT);
260 imports.remove(DEACTIVATE_ANNOTATION_IMPORT);
261 imports.remove(COMPONENT_ANNOTATION_IMPORT);
262 imports.remove(SERVICE_ANNOTATION_IMPORT);
263 imports.remove(LOGGER_FACTORY_IMPORT);
264 imports.remove(LOGGER_IMPORT);
265 }
266 sortImports(imports);
267 }
268
269 /**
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530270 * Performs given operations on import list.
271 *
272 * @param imports list of imports
273 * @param curImport current import
274 * @param operation add or remove
275 * @return import list
276 */
Bharat saraswalc0e04842016-05-12 13:16:57 +0530277 private static List<String> performOperationOnImports(List<String> imports, String curImport,
278 boolean operation) {
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530279 if (operation) {
280 imports.add(curImport);
281 } else {
282 imports.remove(curImport);
283 }
Bharat saraswalc0e04842016-05-12 13:16:57 +0530284 sortImports(imports);
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530285 return imports;
286 }
287
288 /**
Bharat saraswalab4c6ba2016-05-17 14:19:38 +0530289 * Returns true if AugmentationHolder class needs to be extended.
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530290 *
291 * @param extendsList list of classes need to be extended
292 * @return true or false
293 */
Bharat saraswalab4c6ba2016-05-17 14:19:38 +0530294 public static boolean isAugmentationHolderExtended(List<JavaQualifiedTypeInfo> extendsList) {
295 for (JavaQualifiedTypeInfo info : extendsList) {
296 return info.getClassInfo().equals(AUGMENTATION_HOLDER);
297 }
298 return false;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530299 }
300
301 /**
302 * Returns true if AugmentedInfo class needs to be extended.
303 *
304 * @param extendsList list of classes need to be extended
305 * @return true or false
306 */
Bharat saraswalab4c6ba2016-05-17 14:19:38 +0530307 public static boolean isAugmentedInfoExtended(List<JavaQualifiedTypeInfo> extendsList) {
308 for (JavaQualifiedTypeInfo info : extendsList) {
309 return info.getClassInfo().equals(AUGMENTED_INFO);
310 }
311 return false;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530312 }
313
314 /**
315 * Closes the file handle for temporary file.
316 *
317 * @param file file to be closed
318 * @param toBeDeleted flag to indicate if file needs to be deleted
319 * @throws IOException when failed to close the file handle
320 */
VinodKumarS-Huaweicb3a1f52016-05-10 17:58:57 +0530321 public static void closeFile(File file, boolean toBeDeleted)
322 throws IOException {
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530323
324 if (file != null) {
325 updateFileHandle(file, null, true);
326 if (toBeDeleted) {
327 file.delete();
328 }
329 }
330 }
Bharat saraswalc0e04842016-05-12 13:16:57 +0530331
332 /**
333 * Detects collision between parent and child node which have same name.
334 * When parent and child node both have the same name in that case child node should be used with
335 * qualified name.
336 *
337 * @param curNode current YANG node
338 * @param qualifiedTypeInfo current node's qualified info
339 * @return true if collision is detected
340 */
341 public static boolean detectCollisionBwParentAndChildForImport(YangNode curNode,
342 JavaQualifiedTypeInfo qualifiedTypeInfo) {
343
344 YangNode parent = curNode.getParent();
Bharat saraswalcad0e652016-05-26 23:48:38 +0530345 if (parent instanceof YangJavaModule
346 || parent instanceof YangJavaSubModule
347 || parent instanceof YangJavaInput
348 || parent instanceof YangJavaOutput) {
349 return false;
350 }
Bharat saraswalab4c6ba2016-05-17 14:19:38 +0530351 String parentsClassInfo = getCapitalCase(((JavaFileInfoContainer) parent).getJavaFileInfo().getJavaName());
Bharat saraswalc0e04842016-05-12 13:16:57 +0530352 String childsClassInfo = qualifiedTypeInfo.getClassInfo();
353 if (childsClassInfo.equals(parentsClassInfo)) {
354 return true;
355 }
356 return false;
357 }
358
359 /**
360 * Returns sorted import list.
361 *
362 * @param imports import list
363 * @return sorted import list
364 */
365 public static List<String> sortImports(List<String> imports) {
366 sort(imports);
367 return imports;
368 }
369
Bharat saraswal33dfa012016-05-17 19:59:16 +0530370 /**
371 * Returns event enum start.
372 *
373 * @return event enum start
374 */
375 public static String getEventEnumTypeStart() {
376 return FOUR_SPACE_INDENTATION + PUBLIC + SPACE + ENUM + SPACE + TYPE + SPACE + OPEN_CURLY_BRACKET
377 + NEW_LINE;
378 }
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530379}