blob: 1feeb51ccdfb2331c0ea713d44b5ac8b05b6d28c [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;
32import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaModule;
Bharat saraswalc0e04842016-05-12 13:16:57 +053033
34import static java.util.Collections.sort;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +053035
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053036import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getCapitalCase;
37import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getSmallCase;
Bharat saraswal33dfa012016-05-17 19:59:16 +053038import static org.onosproject.yangutils.utils.UtilConstants.ACTIVATE_ANNOTATION_IMPORT;
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053039import static org.onosproject.yangutils.utils.UtilConstants.ADD_STRING;
40import static org.onosproject.yangutils.utils.UtilConstants.AUGMENTATION;
41import static org.onosproject.yangutils.utils.UtilConstants.AUGMENTATION_HOLDER;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +053042import static org.onosproject.yangutils.utils.UtilConstants.AUGMENTED_INFO;
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053043import static org.onosproject.yangutils.utils.UtilConstants.BUILDER;
44import static org.onosproject.yangutils.utils.UtilConstants.CLOSE_PARENTHESIS;
Bharat saraswal33dfa012016-05-17 19:59:16 +053045import static org.onosproject.yangutils.utils.UtilConstants.COMPONENT_ANNOTATION_IMPORT;
46import static org.onosproject.yangutils.utils.UtilConstants.DEACTIVATE_ANNOTATION_IMPORT;
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053047import static org.onosproject.yangutils.utils.UtilConstants.EIGHT_SPACE_INDENTATION;
Bharat saraswal33dfa012016-05-17 19:59:16 +053048import static org.onosproject.yangutils.utils.UtilConstants.ENUM;
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053049import static org.onosproject.yangutils.utils.UtilConstants.EQUAL;
Bharat saraswal33dfa012016-05-17 19:59:16 +053050import static org.onosproject.yangutils.utils.UtilConstants.FOUR_SPACE_INDENTATION;
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053051import static org.onosproject.yangutils.utils.UtilConstants.IMPL;
52import static org.onosproject.yangutils.utils.UtilConstants.IMPORT;
53import static org.onosproject.yangutils.utils.UtilConstants.LISTENER_SERVICE;
Bharat saraswal33dfa012016-05-17 19:59:16 +053054import static org.onosproject.yangutils.utils.UtilConstants.LOGGER_FACTORY_IMPORT;
55import static org.onosproject.yangutils.utils.UtilConstants.LOGGER_IMPORT;
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053056import static org.onosproject.yangutils.utils.UtilConstants.NEW;
57import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
Bharat saraswal33dfa012016-05-17 19:59:16 +053058import static org.onosproject.yangutils.utils.UtilConstants.OPEN_CURLY_BRACKET;
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053059import static org.onosproject.yangutils.utils.UtilConstants.OPEN_PARENTHESIS;
60import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
Bharat saraswal33dfa012016-05-17 19:59:16 +053061import static org.onosproject.yangutils.utils.UtilConstants.PUBLIC;
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053062import static org.onosproject.yangutils.utils.UtilConstants.SEMI_COLAN;
Bharat saraswal33dfa012016-05-17 19:59:16 +053063import static org.onosproject.yangutils.utils.UtilConstants.SERVICE_ANNOTATION_IMPORT;
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053064import static org.onosproject.yangutils.utils.UtilConstants.SPACE;
65import static org.onosproject.yangutils.utils.UtilConstants.THIS;
Bharat saraswal33dfa012016-05-17 19:59:16 +053066import static org.onosproject.yangutils.utils.UtilConstants.TYPE;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +053067import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.updateFileHandle;
68
69/**
70 * Represents utilities for temporary java code fragments.
71 */
72public final class TempJavaCodeFragmentFilesUtils {
73
74 /**
75 * Creates a private instance of temporary java code fragment utils.
76 */
77 private TempJavaCodeFragmentFilesUtils() {
78 }
79
80 /**
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053081 * Adds import for AugmentationHolders class.
Bharat saraswalcc1cdab2016-04-16 02:28:25 +053082 *
83 * @param curNode current YANG node
84 * @param imports list of imports
85 * @param operation add or delete import
Bharat saraswalcc1cdab2016-04-16 02:28:25 +053086 */
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053087 public static void addAugmentationHoldersImport(YangNode curNode, List<String> imports, boolean operation) {
88 String thisImport = getTempJavaFragement(curNode).getJavaImportData().getAugmentationHolderImport();
89 performOperationOnImports(imports, thisImport, operation);
Bharat saraswalcc1cdab2016-04-16 02:28:25 +053090 }
91
92 /**
93 * Adds import for AugmentedInfo class.
94 *
95 * @param curNode current YANG node
96 * @param imports list of imports
97 * @param operation add or delete import
Bharat saraswalcc1cdab2016-04-16 02:28:25 +053098 */
Bharat saraswalab4c6ba2016-05-17 14:19:38 +053099 public static void addAugmentedInfoImport(YangNode curNode, List<String> imports, boolean operation) {
100 String thisImport = getTempJavaFragement(curNode).getJavaImportData().getAugmentedInfoImport();
101 performOperationOnImports(imports, thisImport, operation);
102 }
103
104 /**
105 * Returns temp java fragment.
106 *
107 * @param curNode current YANG node
108 * @return temp java fragments
109 */
110 public static TempJavaFragmentFiles getTempJavaFragement(YangNode curNode) {
111 TempJavaCodeFragmentFiles container = ((TempJavaCodeFragmentFilesContainer) curNode)
112 .getTempJavaCodeFragmentFiles();
113 if (container.getBeanTempFiles() != null) {
114 return container.getBeanTempFiles();
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530115 }
Bharat saraswalab4c6ba2016-05-17 14:19:38 +0530116 if (container.getServiceTempFiles() != null) {
117 return container.getServiceTempFiles();
118 }
119
120 return null;
121 }
122
123 /**
124 * Updated imports with augmented nodes import.
125 *
126 * @param curNode current YANG node
127 * @param imports list of imports
128 * @param operation to add or to delete
129 */
130 public static void addAugmentedNodesImport(YangNode curNode, List<String> imports, boolean operation) {
131
132 String nodesImport = "";
133
134 if (!(curNode instanceof YangJavaAugment)) {
135 throw new TranslatorException("current node should be of type augment node.");
136 }
137 YangJavaAugment augment = (YangJavaAugment) curNode;
138 List<YangNodeIdentifier> targetNodes = augment.getTargetNode();
139 YangNode parent = curNode.getParent();
140 if (parent instanceof YangJavaModule) {
141 // Add impl class import.
142 nodesImport = getAugmendtedNodesImports(parent, targetNodes, true) + SEMI_COLAN + NEW_LINE;
143 performOperationOnImports(imports, nodesImport, operation);
144 // Add builder class import.
145 if (targetNodes.size() > 2) {
146 nodesImport = getAugmendtedNodesImports(parent, targetNodes, false) + SEMI_COLAN + NEW_LINE;
147 performOperationOnImports(imports, nodesImport, operation);
148 }
149 }
150 // TODO: add functionality for submodule and uses.
151 }
152
153 /**
154 * Returns imports for augmented node.
155 *
156 * @param parent parent YANG node
157 * @param targetNodes list of target nodes
158 * @param isImplClass if impl class's import required
159 * @return imports for augmented node
160 */
161 private static String getAugmendtedNodesImports(YangNode parent, List<YangNodeIdentifier> targetNodes,
162 boolean isImplClass) {
163 String pkgInfo = ((JavaFileInfoContainer) parent).getJavaFileInfo().getPackage();
164
165 for (int i = 0; i < targetNodes.size() - 1; i++) {
166 pkgInfo = pkgInfo + PERIOD + targetNodes.get(i).getName();
167 }
168 String classInfo = targetNodes.get(targetNodes.size() - 1).getName();
169 if (!isImplClass) {
170 return IMPORT + pkgInfo.toLowerCase() + PERIOD + getCapitalCase(classInfo) + BUILDER;
171 }
172 return IMPORT + pkgInfo.toLowerCase() + PERIOD + getCapitalCase(classInfo) + BUILDER + PERIOD
173 + getCapitalCase(classInfo) + IMPL;
174 }
175
176 /**
177 * Provides string to be added in augment node's constructor.
178 *
179 * @param curNode current YANG node
180 * @return constructors string
181 */
182 public static String getAugmentsAddToAugmentedClassString(YangNode curNode) {
183
184 if (!(curNode instanceof YangJavaAugment)) {
185 throw new TranslatorException("current node should be of type augment node.");
186 }
187 YangJavaAugment augment = (YangJavaAugment) curNode;
188 List<YangNodeIdentifier> targetNodes = augment.getTargetNode();
189
190 String name = targetNodes.get(targetNodes.size() - 1).getName();
191 String captialCase = getCapitalCase(name);
192 String smallCase = getSmallCase(captialCase);
193 return EIGHT_SPACE_INDENTATION + captialCase + IMPL + SPACE + smallCase + IMPL + SPACE + EQUAL + SPACE + NEW
194 + SPACE + captialCase + BUILDER + OPEN_PARENTHESIS + CLOSE_PARENTHESIS + PERIOD + NEW + SPACE
195 + captialCase + IMPL + OPEN_PARENTHESIS + CLOSE_PARENTHESIS + SEMI_COLAN + NEW_LINE
196 + EIGHT_SPACE_INDENTATION + smallCase + IMPL + PERIOD + ADD_STRING + AUGMENTATION + OPEN_PARENTHESIS
197 + THIS + CLOSE_PARENTHESIS + SEMI_COLAN + NEW_LINE;
198
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530199 }
200
201 /**
202 * Adds import for array list.
203 *
204 * @param curNode current YANG node
205 * @param imports list of imports
206 * @param operation add or delete import
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530207 */
Bharat saraswalab4c6ba2016-05-17 14:19:38 +0530208 public static void addArrayListImport(YangNode curNode, List<String> imports, boolean operation) {
209 String arrayListImport = getTempJavaFragement(curNode).getJavaImportData().getImportForArrayList();
210 String listImport = getTempJavaFragement(curNode).getJavaImportData().getImportForList();
211 performOperationOnImports(imports, arrayListImport, operation);
212 if (!imports.contains(listImport)) {
213 /**
214 * List can be there because of attribute also , so no need to remove it and operation will
215 * always be add(true).
216 */
217 performOperationOnImports(imports, listImport, true);
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530218 }
Bharat saraswalab4c6ba2016-05-17 14:19:38 +0530219 }
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530220
Bharat saraswalab4c6ba2016-05-17 14:19:38 +0530221 /**
222 * Adds listener's imports.
223 *
224 * @param curNode currentYangNode.
225 * @param imports import list
226 * @param operation add or remove
227 * @param classInfo class info to be added to import list
228 */
229 public static void addListnersImport(YangNode curNode, List<String> imports, boolean operation,
230 String classInfo) {
231 String thisImport = "";
232 if (classInfo.equals(LISTENER_SERVICE)) {
233 thisImport = getTempJavaFragement(curNode).getJavaImportData().getListenerServiceImport();
234 performOperationOnImports(imports, thisImport, operation);
235 } else {
236 thisImport = getTempJavaFragement(curNode).getJavaImportData().getListenerRegistryImport();
237 performOperationOnImports(imports, thisImport, operation);
238 }
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530239 }
240
241 /**
Bharat saraswal33dfa012016-05-17 19:59:16 +0530242 * Adds annotations imports.
243 *
244 * @param imports list if imports
245 * @param operation to add or to delete
246 */
247 public static void addAnnotationsImports(List<String> imports, boolean operation) {
248 if (operation) {
249 imports.add(ACTIVATE_ANNOTATION_IMPORT);
250 imports.add(DEACTIVATE_ANNOTATION_IMPORT);
251 imports.add(COMPONENT_ANNOTATION_IMPORT);
252 imports.add(SERVICE_ANNOTATION_IMPORT);
253 imports.add(LOGGER_FACTORY_IMPORT);
254 imports.add(LOGGER_IMPORT);
255 } else {
256 imports.remove(ACTIVATE_ANNOTATION_IMPORT);
257 imports.remove(DEACTIVATE_ANNOTATION_IMPORT);
258 imports.remove(COMPONENT_ANNOTATION_IMPORT);
259 imports.remove(SERVICE_ANNOTATION_IMPORT);
260 imports.remove(LOGGER_FACTORY_IMPORT);
261 imports.remove(LOGGER_IMPORT);
262 }
263 sortImports(imports);
264 }
265
266 /**
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530267 * Performs given operations on import list.
268 *
269 * @param imports list of imports
270 * @param curImport current import
271 * @param operation add or remove
272 * @return import list
273 */
Bharat saraswalc0e04842016-05-12 13:16:57 +0530274 private static List<String> performOperationOnImports(List<String> imports, String curImport,
275 boolean operation) {
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530276 if (operation) {
277 imports.add(curImport);
278 } else {
279 imports.remove(curImport);
280 }
Bharat saraswalc0e04842016-05-12 13:16:57 +0530281 sortImports(imports);
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530282 return imports;
283 }
284
285 /**
Bharat saraswalab4c6ba2016-05-17 14:19:38 +0530286 * Returns true if AugmentationHolder class needs to be extended.
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530287 *
288 * @param extendsList list of classes need to be extended
289 * @return true or false
290 */
Bharat saraswalab4c6ba2016-05-17 14:19:38 +0530291 public static boolean isAugmentationHolderExtended(List<JavaQualifiedTypeInfo> extendsList) {
292 for (JavaQualifiedTypeInfo info : extendsList) {
293 return info.getClassInfo().equals(AUGMENTATION_HOLDER);
294 }
295 return false;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530296 }
297
298 /**
299 * Returns true if AugmentedInfo class needs to be extended.
300 *
301 * @param extendsList list of classes need to be extended
302 * @return true or false
303 */
Bharat saraswalab4c6ba2016-05-17 14:19:38 +0530304 public static boolean isAugmentedInfoExtended(List<JavaQualifiedTypeInfo> extendsList) {
305 for (JavaQualifiedTypeInfo info : extendsList) {
306 return info.getClassInfo().equals(AUGMENTED_INFO);
307 }
308 return false;
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530309 }
310
311 /**
312 * Closes the file handle for temporary file.
313 *
314 * @param file file to be closed
315 * @param toBeDeleted flag to indicate if file needs to be deleted
316 * @throws IOException when failed to close the file handle
317 */
VinodKumarS-Huaweicb3a1f52016-05-10 17:58:57 +0530318 public static void closeFile(File file, boolean toBeDeleted)
319 throws IOException {
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530320
321 if (file != null) {
322 updateFileHandle(file, null, true);
323 if (toBeDeleted) {
324 file.delete();
325 }
326 }
327 }
Bharat saraswalc0e04842016-05-12 13:16:57 +0530328
329 /**
330 * Detects collision between parent and child node which have same name.
331 * When parent and child node both have the same name in that case child node should be used with
332 * qualified name.
333 *
334 * @param curNode current YANG node
335 * @param qualifiedTypeInfo current node's qualified info
336 * @return true if collision is detected
337 */
338 public static boolean detectCollisionBwParentAndChildForImport(YangNode curNode,
339 JavaQualifiedTypeInfo qualifiedTypeInfo) {
340
341 YangNode parent = curNode.getParent();
Bharat saraswalab4c6ba2016-05-17 14:19:38 +0530342 String parentsClassInfo = getCapitalCase(((JavaFileInfoContainer) parent).getJavaFileInfo().getJavaName());
Bharat saraswalc0e04842016-05-12 13:16:57 +0530343 String childsClassInfo = qualifiedTypeInfo.getClassInfo();
344 if (childsClassInfo.equals(parentsClassInfo)) {
345 return true;
346 }
347 return false;
348 }
349
350 /**
351 * Returns sorted import list.
352 *
353 * @param imports import list
354 * @return sorted import list
355 */
356 public static List<String> sortImports(List<String> imports) {
357 sort(imports);
358 return imports;
359 }
360
Bharat saraswal33dfa012016-05-17 19:59:16 +0530361 /**
362 * Returns event enum start.
363 *
364 * @return event enum start
365 */
366 public static String getEventEnumTypeStart() {
367 return FOUR_SPACE_INDENTATION + PUBLIC + SPACE + ENUM + SPACE + TYPE + SPACE + OPEN_CURLY_BRACKET
368 + NEW_LINE;
369 }
Bharat saraswalcc1cdab2016-04-16 02:28:25 +0530370}