blob: f225f06449cdae6013e5a48136c8d15a2f6f8b00 [file] [log] [blame]
Bharat saraswald50c6382016-07-14 21:57:13 +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;
18
19import java.io.File;
20import java.io.IOException;
21import java.util.ArrayList;
22import java.util.List;
23
24import org.onosproject.yangutils.datamodel.YangNode;
janani befb554b2016-07-14 15:03:41 +053025import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaGrouping;
Bharat saraswald50c6382016-07-14 21:57:13 +053026import org.onosproject.yangutils.translator.tojava.utils.JavaExtendsListHolder;
27import org.onosproject.yangutils.utils.io.impl.YangPluginConfig;
28
29import static org.onosproject.yangutils.translator.tojava.GeneratedJavaFileType.GENERATE_EVENT_SUBJECT_CLASS;
30import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_ENUM_MASK;
31import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_METHOD_MASK;
32import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_SUBJECT_ATTRIBUTE_MASK;
33import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_SUBJECT_GETTER_MASK;
34import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.EVENT_SUBJECT_SETTER_MASK;
35import static org.onosproject.yangutils.translator.tojava.JavaAttributeInfo.getAttributeInfoForTheData;
36import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfo.getQualifiedTypeInfoOfCurNode;
37import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateEventFile;
38import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateEventListenerFile;
39import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateEventSubjectFile;
40import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGeneratorUtils.getFileObject;
41import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getEnumJavaAttribute;
42import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getGetterForClass;
43import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getSetterForClass;
44import static org.onosproject.yangutils.utils.UtilConstants.COMMA;
45import static org.onosproject.yangutils.utils.UtilConstants.EVENT_STRING;
46import static org.onosproject.yangutils.utils.UtilConstants.FOUR_SPACE_INDENTATION;
47import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
48import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
Bharat saraswale707f032016-07-14 23:33:55 +053049import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.closeFile;
Bharat saraswald50c6382016-07-14 21:57:13 +053050import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.ENUM_ATTRIBUTE;
51import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.GETTER_METHOD;
52import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.JavaDocType.MANAGER_SETTER_METHOD;
53import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.getJavaDoc;
54import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getAbsolutePackagePath;
55import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
56import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
57import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getSmallCase;
58
59/**
60 * Represent temporary java fragments for event files.
61 */
62public class TempJavaEventFragmentFiles
63 extends TempJavaFragmentFiles {
64 /**
65 * File name for generated class file for special type like union, typedef suffix.
66 */
Bharat saraswale707f032016-07-14 23:33:55 +053067 private static final String EVENT_SUBJECT_NAME_SUFFIX = "EventSubject";
Bharat saraswald50c6382016-07-14 21:57:13 +053068
69 /**
70 * File name for event enum temp file.
71 */
Bharat saraswald50c6382016-07-14 21:57:13 +053072 private static final String EVENT_ENUM_FILE_NAME = "EventEnum";
73
74 /**
75 * File name for event method temp file.
76 */
77 private static final String EVENT_METHOD_FILE_NAME = "EventMethod";
78
79 /**
80 * File name for event subject attribute temp file.
81 */
82 private static final String EVENT_SUBJECT_ATTRIBUTE_FILE_NAME = "EventSubjectAttribute";
83
84 /**
85 * File name for event subject getter temp file.
86 */
87 private static final String EVENT_SUBJECT_GETTER_FILE_NAME = "EventSubjectGetter";
88
89 /**
90 * File name for event subject setter temp file.
91 */
92 private static final String EVENT_SUBJECT_SETTER_FILE_NAME = "EventSubjectSetter";
93
94 /**
95 * File name for generated class file for special type like union, typedef suffix.
96 */
97 private static final String EVENT_FILE_NAME_SUFFIX = "Event";
98
99 /**
100 * File name for generated class file for special type like union, typedef suffix.
101 */
102 private static final String EVENT_LISTENER_FILE_NAME_SUFFIX = "Listener";
103
104 private static final String JAVA_FILE_EXTENSION = ".java";
105
106 /**
107 * Java file handle for event subject file.
108 */
109 private File eventSubjectJavaFileHandle;
110
111 /**
112 * Java file handle for event listener file.
113 */
114 private File eventListenerJavaFileHandle;
115
116 /**
117 * Java file handle for event file.
118 */
119 private File eventJavaFileHandle;
120
121 /**
122 * Java file handle for event enum impl file.
123 */
124 private File eventEnumTempFileHandle;
125
126 /**
127 * Java file handle for event method impl file.
128 */
129 private File eventMethodTempFileHandle;
130
131 /**
132 * Java file handle for event subject attribute file.
133 */
134 private File eventSubjectAttributeTempFileHandle;
135
136 /**
137 * Java file handle for event subject getter impl file.
138 */
139 private File eventSubjectGetterTempFileHandle;
140
141 /**
142 * Java file handle for event subject setter impl file.
143 */
144 private File eventSubjectSetterTempFileHandle;
145
146 /**
147 * Creates an instance of temporary java code fragment.
148 *
149 * @param javaFileInfo generated file information
150 * @throws IOException when fails to create new file handle
151 */
Bharat saraswale707f032016-07-14 23:33:55 +0530152 TempJavaEventFragmentFiles(JavaFileInfo javaFileInfo)
Bharat saraswald50c6382016-07-14 21:57:13 +0530153 throws IOException {
154 setJavaExtendsListHolder(new JavaExtendsListHolder());
155 setJavaImportData(new JavaImportData());
156 setJavaFileInfo(javaFileInfo);
157 setAbsoluteDirPath(getAbsolutePackagePath(getJavaFileInfo().getBaseCodeGenPath(),
158 getJavaFileInfo().getPackageFilePath()));
159
160 addGeneratedTempFile(EVENT_ENUM_MASK);
161 addGeneratedTempFile(EVENT_METHOD_MASK);
162 addGeneratedTempFile(EVENT_SUBJECT_ATTRIBUTE_MASK);
163 addGeneratedTempFile(EVENT_SUBJECT_GETTER_MASK);
164 addGeneratedTempFile(EVENT_SUBJECT_SETTER_MASK);
165
166 setEventEnumTempFileHandle(getTemporaryFileHandle(EVENT_ENUM_FILE_NAME));
167 setEventMethodTempFileHandle(getTemporaryFileHandle(EVENT_METHOD_FILE_NAME));
168 setEventSubjectAttributeTempFileHandle(getTemporaryFileHandle(EVENT_SUBJECT_ATTRIBUTE_FILE_NAME));
169 setEventSubjectGetterTempFileHandle(getTemporaryFileHandle(EVENT_SUBJECT_GETTER_FILE_NAME));
170 setEventSubjectSetterTempFileHandle(getTemporaryFileHandle(EVENT_SUBJECT_SETTER_FILE_NAME));
171 }
172
173 /*Adds event method contents to event file.*/
174 private static String getEventFileContents(String eventClassname, String classname) {
175 return "\n" +
176 " /**\n" +
177 " * Creates " + classname + " event with type and subject.\n" +
178 " *\n" +
179 " * @param type event type\n" +
180 " * @param subject subject " + classname + "\n" +
181 " */\n" +
182 " public " + eventClassname + "(Type type, " + getCapitalCase(classname) + " subject) {\n" +
183 " super(type, subject);\n" +
184 " }\n" +
185 "\n" +
186 " /**\n" +
187 " * Creates " + classname + " event with type, subject and time.\n" +
188 " *\n" +
189 " * @param type event type\n" +
190 " * @param subject subject " + classname + "\n" +
191 " * @param time time of event\n" +
192 " */\n" +
193 " public " + eventClassname + "(Type type, " + getCapitalCase(classname)
194 + " subject, long time) {\n" +
195 " super(type, subject, time);\n" +
196 " }\n" +
197 "\n";
198 }
199
200 /**
201 * Returns event's java file handle.
202 *
203 * @return java file handle
204 */
205 private File getEventJavaFileHandle() {
206 return eventJavaFileHandle;
207 }
208
209 /**
210 * Sets event's java file handle.
211 *
212 * @param eventJavaFileHandle file handle for event
213 */
214 private void setEventJavaFileHandle(File eventJavaFileHandle) {
215 this.eventJavaFileHandle = eventJavaFileHandle;
216 }
217
218 /**
219 * Returns event listeners's java file handle.
220 *
221 * @return java file handle
222 */
223 private File getEventListenerJavaFileHandle() {
224 return eventListenerJavaFileHandle;
225 }
226
227 /**
228 * Sets event's java file handle.
229 *
230 * @param eventListenerJavaFileHandle file handle for event
231 */
232 private void setEventListenerJavaFileHandle(File eventListenerJavaFileHandle) {
233 this.eventListenerJavaFileHandle = eventListenerJavaFileHandle;
234 }
235
236 /**
237 * Returns event subject's java file handle.
238 *
239 * @return java file handle
240 */
241 private File getEventSubjectJavaFileHandle() {
242 return eventSubjectJavaFileHandle;
243 }
244
245 /**
246 * Sets event's subject java file handle.
247 *
248 * @param eventSubjectJavaFileHandle file handle for event's subject
249 */
250 private void setEventSubjectJavaFileHandle(File eventSubjectJavaFileHandle) {
251 this.eventSubjectJavaFileHandle = eventSubjectJavaFileHandle;
252 }
253
254 public void generateJavaFile(int fileType, YangNode curNode) throws IOException {
255 generateEventJavaFile(curNode);
256 generateEventListenerJavaFile(curNode);
257 generateEventSubjectJavaFile(curNode);
Bharat saraswale707f032016-07-14 23:33:55 +0530258
259 // Close all the file handles.
260 freeTemporaryResources(false);
Bharat saraswald50c6382016-07-14 21:57:13 +0530261 }
262
263 /**
264 * Constructs java code exit.
265 *
266 * @param curNode current YANG node
267 * @throws IOException when fails to generate java files
268 */
Bharat saraswale707f032016-07-14 23:33:55 +0530269 private void generateEventJavaFile(YangNode curNode)
Bharat saraswald50c6382016-07-14 21:57:13 +0530270 throws IOException {
271
272 List<String> imports = new ArrayList<>();
273
274 imports.add(getJavaImportData().getAbstractEventsImport());
275 String curNodeInfo = getCapitalCase(((JavaFileInfoContainer) curNode).getJavaFileInfo().getJavaName());
276 String nodeName = curNodeInfo + EVENT_STRING;
277
278 addEnumMethod(nodeName, curNodeInfo + EVENT_SUBJECT_NAME_SUFFIX);
279
Bharat saraswale707f032016-07-14 23:33:55 +0530280 //Creates event interface file.
Bharat saraswald50c6382016-07-14 21:57:13 +0530281 setEventJavaFileHandle(getJavaFileHandle(curNode, curNodeInfo + EVENT_FILE_NAME_SUFFIX));
282 generateEventFile(getEventJavaFileHandle(), curNode, imports);
283
Bharat saraswald50c6382016-07-14 21:57:13 +0530284 }
285
286 /**
287 * Constructs java code exit.
288 *
289 * @param curNode current YANG node
290 * @throws IOException when fails to generate java files
291 */
Bharat saraswale707f032016-07-14 23:33:55 +0530292 private void generateEventListenerJavaFile(YangNode curNode)
293 throws IOException {
294
295 List<String> imports = new ArrayList<>();
296
297 imports.add(getJavaImportData().getEventListenerImport());
298 String curNodeInfo = getCapitalCase(((JavaFileInfoContainer) curNode)
299 .getJavaFileInfo().getJavaName());
300
301 // Creates event listener interface file.
302 setEventListenerJavaFileHandle(
303 getJavaFileHandle(curNode, curNodeInfo + EVENT_LISTENER_FILE_NAME_SUFFIX));
304 generateEventListenerFile(getEventListenerJavaFileHandle(), curNode, imports);
305
306 }
307
308 /**
309 * Constructs java code exit.
310 *
311 * @param curNode current YANG node
312 * @throws IOException when fails to generate java files
313 */
314 private void generateEventSubjectJavaFile(YangNode curNode)
Bharat saraswald50c6382016-07-14 21:57:13 +0530315 throws IOException {
316
317 String curNodeInfo = getCapitalCase(((JavaFileInfoContainer) curNode)
318 .getJavaFileInfo().getJavaName());
Bharat saraswale707f032016-07-14 23:33:55 +0530319
320 //Creates event interface file.
Bharat saraswald50c6382016-07-14 21:57:13 +0530321 setEventSubjectJavaFileHandle(getJavaFileHandle(curNode, curNodeInfo +
322 TempJavaEventFragmentFiles.EVENT_SUBJECT_NAME_SUFFIX));
323 generateEventSubjectFile(getEventSubjectJavaFileHandle(), curNode);
324
Bharat saraswald50c6382016-07-14 21:57:13 +0530325 }
326
327 /**
328 * Returns event enum temp file.
329 *
330 * @return event enum temp file
331 */
332 public File getEventEnumTempFileHandle() {
333 return eventEnumTempFileHandle;
334 }
335
336 /**
337 * Sets event enum temp file.
338 *
339 * @param eventEnumTempFileHandle event enum temp file
340 */
Bharat saraswale707f032016-07-14 23:33:55 +0530341 private void setEventEnumTempFileHandle(File eventEnumTempFileHandle) {
Bharat saraswald50c6382016-07-14 21:57:13 +0530342 this.eventEnumTempFileHandle = eventEnumTempFileHandle;
343 }
344
345 /**
346 * Returns event method temp file.
347 *
348 * @return event method temp file
349 */
350 public File getEventMethodTempFileHandle() {
351 return eventMethodTempFileHandle;
352 }
353
354 /**
355 * Sets event method temp file.
356 *
357 * @param eventMethodTempFileHandle event method temp file
358 */
Bharat saraswale707f032016-07-14 23:33:55 +0530359 private void setEventMethodTempFileHandle(File eventMethodTempFileHandle) {
Bharat saraswald50c6382016-07-14 21:57:13 +0530360 this.eventMethodTempFileHandle = eventMethodTempFileHandle;
361 }
362
363 /**
364 * Returns event subject attribute temp file.
365 *
366 * @return event subject attribute temp file
367 */
368 public File getEventSubjectAttributeTempFileHandle() {
369 return eventSubjectAttributeTempFileHandle;
370 }
371
372 /**
373 * Sets event subject attribute temp file.
374 *
375 * @param eventSubjectAttributeTempFileHandle event subject attribute temp file
376 */
Bharat saraswale707f032016-07-14 23:33:55 +0530377 private void setEventSubjectAttributeTempFileHandle(File eventSubjectAttributeTempFileHandle) {
Bharat saraswald50c6382016-07-14 21:57:13 +0530378 this.eventSubjectAttributeTempFileHandle = eventSubjectAttributeTempFileHandle;
379 }
380
381 /**
382 * Returns event subject getter temp file.
383 *
384 * @return event subject getter temp file
385 */
386 public File getEventSubjectGetterTempFileHandle() {
387 return eventSubjectGetterTempFileHandle;
388 }
389
390 /**
391 * Sets event subject getter temp file.
392 *
393 * @param eventSubjectGetterTempFileHandle event subject getter temp file
394 */
Bharat saraswale707f032016-07-14 23:33:55 +0530395 private void setEventSubjectGetterTempFileHandle(File eventSubjectGetterTempFileHandle) {
Bharat saraswald50c6382016-07-14 21:57:13 +0530396 this.eventSubjectGetterTempFileHandle = eventSubjectGetterTempFileHandle;
397 }
398
399 /**
400 * Returns event subject setter temp file.
401 *
402 * @return event subject setter temp file
403 */
404 public File getEventSubjectSetterTempFileHandle() {
405 return eventSubjectSetterTempFileHandle;
406 }
407
408 /**
409 * Sets event subject setter temp file.
410 *
411 * @param eventSubjectSetterTempFileHandle event subject setter temp file
412 */
Bharat saraswale707f032016-07-14 23:33:55 +0530413 private void setEventSubjectSetterTempFileHandle(File eventSubjectSetterTempFileHandle) {
Bharat saraswald50c6382016-07-14 21:57:13 +0530414 this.eventSubjectSetterTempFileHandle = eventSubjectSetterTempFileHandle;
415 }
416
417 /**
418 * Adds java snippet for events to event subject file.
419 *
420 * @param curNode current node
421 * @param pluginConfig plugin configurations
422 * @throws IOException when fails to do IO operations
423 */
Bharat saraswale707f032016-07-14 23:33:55 +0530424 void addJavaSnippetOfEvent(YangNode curNode, YangPluginConfig pluginConfig)
Bharat saraswald50c6382016-07-14 21:57:13 +0530425 throws IOException {
426
427 String currentInfo = getCapitalCase(getCamelCase(curNode.getName(),
428 pluginConfig.getConflictResolver()));
429 String notificationName = curNode.getName();
430
431 JavaQualifiedTypeInfo qualifiedTypeInfo = getQualifiedTypeInfoOfCurNode(curNode,
432 getCapitalCase(currentInfo));
433
434 JavaAttributeInfo javaAttributeInfo = getAttributeInfoForTheData(qualifiedTypeInfo, getSmallCase(currentInfo),
435 null, false, false);
436
437 /*Adds java info for event in respective temp files.*/
438 addEventEnum(notificationName, pluginConfig);
439 addEventSubjectAttribute(javaAttributeInfo, pluginConfig);
440 addEventSubjectGetter(javaAttributeInfo, pluginConfig);
441 addEventSubjectSetter(javaAttributeInfo, pluginConfig, currentInfo);
442 }
443
444 /*Adds event to enum temp file.*/
445 private void addEventEnum(String notificationName, YangPluginConfig pluginConfig)
446 throws IOException {
447 appendToFile(getEventEnumTempFileHandle(),
448 getJavaDoc(ENUM_ATTRIBUTE, notificationName, false, pluginConfig) + FOUR_SPACE_INDENTATION
449 + getEnumJavaAttribute(notificationName).toUpperCase() + COMMA + NEW_LINE);
450 }
451
452 /*Adds event method in event class*/
453 private void addEnumMethod(String eventClassname, String className)
454 throws IOException {
455 appendToFile(getEventMethodTempFileHandle(), getEventFileContents(eventClassname, className));
456 }
457
458 /*Adds events to event subject file.*/
459 private void addEventSubjectAttribute(JavaAttributeInfo attr, YangPluginConfig pluginConfig)
460 throws IOException {
461 appendToFile(getEventSubjectAttributeTempFileHandle(),
462 FOUR_SPACE_INDENTATION + parseAttribute(attr, pluginConfig));
463 }
464
465 /*Adds getter method for event in event subject class.*/
466 private void addEventSubjectGetter(JavaAttributeInfo attr, YangPluginConfig pluginConfig)
467 throws IOException {
468 appendToFile(getEventSubjectGetterTempFileHandle(),
469 getJavaDoc(GETTER_METHOD, getCapitalCase(attr.getAttributeName()), false, pluginConfig)
470 + getGetterForClass(attr, GENERATE_EVENT_SUBJECT_CLASS) + NEW_LINE);
471 }
472
473 /*Adds setter method for event in event subject class.*/
474 private void addEventSubjectSetter(JavaAttributeInfo attr, YangPluginConfig pluginConfig, String className)
475 throws IOException {
476 appendToFile(getEventSubjectSetterTempFileHandle(),
477 getJavaDoc(MANAGER_SETTER_METHOD, getCapitalCase(attr.getAttributeName()), false, pluginConfig)
478 + getSetterForClass(attr, className, GENERATE_EVENT_SUBJECT_CLASS) + NEW_LINE);
479 }
480
481 /**
482 * Returns a temporary file handle for the event's file type.
483 *
484 * @param name file name
485 * @return temporary file handle
486 * @throws IOException when fails to create new file handle
487 */
488 private File getJavaFileHandle(YangNode curNode, String name)
489 throws IOException {
490
491 JavaFileInfo parentInfo = ((JavaFileInfoContainer) curNode).getJavaFileInfo();
janani befb554b2016-07-14 15:03:41 +0530492 YangNode childNode = curNode.getChild();
Bharat saraswald50c6382016-07-14 21:57:13 +0530493
janani befb554b2016-07-14 15:03:41 +0530494 // Skip grouping, as it wont have the package name.
495 while (childNode instanceof YangJavaGrouping) {
496 childNode = childNode.getNextSibling();
497 }
498 JavaFileInfo childInfo = ((JavaFileInfoContainer) childNode).getJavaFileInfo();
Bharat saraswald50c6382016-07-14 21:57:13 +0530499 return getFileObject(getDirPath(parentInfo), name, JAVA_FILE_EXTENSION,
500 childInfo.getBaseCodeGenPath());
501 }
502
503 /**
504 * Returns the directory path.
505 *
506 * @return directory path
507 */
508 private String getDirPath(JavaFileInfo parentInfo) {
509 return (parentInfo.getPackageFilePath() + SLASH + parentInfo.getJavaName()).toLowerCase();
510 }
Bharat saraswale707f032016-07-14 23:33:55 +0530511
512 /**
513 * Removes all temporary file handles.
514 *
515 * @param isErrorOccurred flag to tell translator that error has occurred while file generation
516 * @throws IOException when failed to delete the temporary files
517 */
518 @Override
519 public void freeTemporaryResources(boolean isErrorOccurred)
520 throws IOException {
521
522 closeFile(getEventJavaFileHandle(), isErrorOccurred);
523 closeFile(getEventListenerJavaFileHandle(), isErrorOccurred);
524 closeFile(getEventSubjectJavaFileHandle(), isErrorOccurred);
525
526 closeFile(getEventEnumTempFileHandle(), true);
527 closeFile(getEventSubjectAttributeTempFileHandle(), true);
528 closeFile(getEventMethodTempFileHandle(), true);
529 closeFile(getEventSubjectGetterTempFileHandle(), true);
530 closeFile(getEventSubjectSetterTempFileHandle(), true);
531
532 super.freeTemporaryResources(isErrorOccurred);
533
534 }
Bharat saraswald50c6382016-07-14 21:57:13 +0530535}