blob: 1751ab5d9d06da87f60b00c784a0e60d6d8d3f4f [file] [log] [blame]
Vinod Kumar S79a374b2016-04-30 21:09:15 +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
Bharat saraswal9fab16b2016-09-23 23:27:24 +053019import org.onosproject.yangutils.datamodel.RpcNotificationContainer;
20import org.onosproject.yangutils.datamodel.YangAugment;
21import org.onosproject.yangutils.datamodel.YangInput;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +053022import org.onosproject.yangutils.datamodel.YangNode;
Bharat saraswal9fab16b2016-09-23 23:27:24 +053023import org.onosproject.yangutils.datamodel.YangOutput;
24import org.onosproject.yangutils.datamodel.YangRpc;
25import org.onosproject.yangutils.translator.exception.TranslatorException;
Shankara-Huaweib7564772016-08-02 18:13:13 +053026import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaModuleTranslator;
27import org.onosproject.yangutils.translator.tojava.javamodel.YangJavaSubModuleTranslator;
Bharat saraswalaf413b82016-07-14 15:18:20 +053028import org.onosproject.yangutils.translator.tojava.utils.JavaExtendsListHolder;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +053029
30import java.io.File;
31import java.io.IOException;
32import java.util.List;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +053033
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +053034import static org.onosproject.yangutils.translator.tojava.GeneratedTempFileType.RPC_INTERFACE_MASK;
Bharat saraswal9fab16b2016-09-23 23:27:24 +053035import static org.onosproject.yangutils.translator.tojava.JavaAttributeInfo.getAttributeInfoForTheData;
36import static org.onosproject.yangutils.translator.tojava.JavaQualifiedTypeInfoTranslator.getQualifiedTypeInfoOfCurNode;
Bharat saraswalaf413b82016-07-14 15:18:20 +053037import static org.onosproject.yangutils.translator.tojava.utils.JavaCodeSnippetGen.addListenersImport;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +053038import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGenerator.generateServiceInterfaceFile;
Bharat saraswal8beac342016-08-04 02:00:03 +053039import static org.onosproject.yangutils.translator.tojava.utils.JavaFileGeneratorUtils.addResolvedAugmentedDataNodeImports;
Bharat saraswalaf413b82016-07-14 15:18:20 +053040import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.createPackage;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +053041import static org.onosproject.yangutils.translator.tojava.utils.MethodsGenerator.getRpcServiceMethod;
Bharat saraswal250a7472016-05-12 13:16:57 +053042import static org.onosproject.yangutils.utils.UtilConstants.EMPTY_STRING;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +053043import static org.onosproject.yangutils.utils.UtilConstants.Operation.ADD;
Bharat saraswal250a7472016-05-12 13:16:57 +053044import static org.onosproject.yangutils.utils.UtilConstants.RPC_INPUT_VAR_NAME;
Bharat saraswal9fab16b2016-09-23 23:27:24 +053045import static org.onosproject.yangutils.utils.UtilConstants.SERVICE;
Bharat saraswal250a7472016-05-12 13:16:57 +053046import static org.onosproject.yangutils.utils.UtilConstants.VOID;
Bharat saraswalaf413b82016-07-14 15:18:20 +053047import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.closeFile;
Bharat saraswalaf413b82016-07-14 15:18:20 +053048import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.generateJavaDocForRpc;
Bharat saraswalaf413b82016-07-14 15:18:20 +053049import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getAbsolutePackagePath;
Bharat saraswalaf413b82016-07-14 15:18:20 +053050import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053051
52/**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +053053 * Represents implementation of java service code fragments temporary
54 * implementations. Maintains the temp files required specific for service
55 * and manager java snippet generation.
Vinod Kumar S79a374b2016-04-30 21:09:15 +053056 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +053057public class TempJavaServiceFragmentFiles extends TempJavaFragmentFiles {
Vinod Kumar S79a374b2016-04-30 21:09:15 +053058
59 /**
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +053060 * File name for rpc method.
61 */
62 private static final String RPC_INTERFACE_FILE_NAME = "Rpc";
63
64 /**
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +053065 * Temporary file handle for rpc interface.
66 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +053067 private final File rpcInterfaceTempFileHandle;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +053068
69 /**
70 * Java file handle for rpc interface file.
71 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +053072 private File serviceJavaFileHandle;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +053073
74 /**
Bharat saraswalaf413b82016-07-14 15:18:20 +053075 * Creates an instance of temporary java code fragment.
76 *
77 * @param javaFileInfo generated file information
78 * @throws IOException when fails to create new file handle
79 */
Bharat saraswale50edca2016-08-05 01:58:25 +053080 TempJavaServiceFragmentFiles(JavaFileInfoTranslator javaFileInfo)
Bharat saraswalaf413b82016-07-14 15:18:20 +053081 throws IOException {
82 setJavaExtendsListHolder(new JavaExtendsListHolder());
83 setJavaImportData(new JavaImportData());
84 setJavaFileInfo(javaFileInfo);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +053085 setAbsoluteDirPath(getAbsolutePackagePath(
86 getJavaFileInfo().getBaseCodeGenPath(),
Bharat saraswalaf413b82016-07-14 15:18:20 +053087 getJavaFileInfo().getPackageFilePath()));
88 addGeneratedTempFile(RPC_INTERFACE_MASK);
Bharat saraswal9fab16b2016-09-23 23:27:24 +053089 rpcInterfaceTempFileHandle = getTemporaryFileHandle(RPC_INTERFACE_FILE_NAME);
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +053090 }
91
92 /**
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +053093 * Returns rpc method's temporary file handle.
94 *
95 * @return temporary file handle
96 */
97 public File getRpcInterfaceTempFileHandle() {
98 return rpcInterfaceTempFileHandle;
99 }
100
101 /**
Bharat saraswal4aaab4d2016-05-17 14:19:38 +0530102 * Constructs java code exit.
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530103 *
104 * @param fileType generated file type
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530105 * @param curNode current YANG node
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530106 * @throws IOException when fails to generate java files
107 */
Bharat saraswal250a7472016-05-12 13:16:57 +0530108 @Override
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530109 public void generateJavaFile(int fileType, YangNode curNode)
110 throws IOException {
Bharat saraswal8beac342016-08-04 02:00:03 +0530111
112 addResolvedAugmentedDataNodeImports(curNode);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530113 List<String> imports = ((JavaCodeGeneratorInfo) curNode)
114 .getTempJavaCodeFragmentFiles().getServiceTempFiles()
Bharat saraswalaf413b82016-07-14 15:18:20 +0530115 .getJavaImportData().getImports();
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530116 createPackage(curNode);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530117 boolean notification = false;
Shankara-Huaweib7564772016-08-02 18:13:13 +0530118 if (curNode instanceof YangJavaModuleTranslator) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530119 if (!((YangJavaModuleTranslator) curNode).getNotificationNodes()
120 .isEmpty()) {
121 notification = true;
Bharat saraswal4aaab4d2016-05-17 14:19:38 +0530122 }
Shankara-Huaweib7564772016-08-02 18:13:13 +0530123 } else if (curNode instanceof YangJavaSubModuleTranslator) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530124 if (!((YangJavaSubModuleTranslator) curNode).getNotificationNodes()
125 .isEmpty()) {
126 notification = true;
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530127 }
Bharat saraswal4aaab4d2016-05-17 14:19:38 +0530128 }
129
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530130 if (notification) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530131 addListenersImport(curNode, imports, ADD);
Bharat saraswal4aaab4d2016-05-17 14:19:38 +0530132 }
Bharat saraswal64e7e232016-07-14 23:33:55 +0530133
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530134 serviceJavaFileHandle = getJavaFileHandle(getJavaClassName(SERVICE));
135 generateServiceInterfaceFile(serviceJavaFileHandle, curNode, imports);
Bharat saraswal64e7e232016-07-14 23:33:55 +0530136
137 // Close all the file handles.
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530138 freeTemporaryResources(false);
139 }
140
141 /**
142 * Adds rpc string information to applicable temp file.
143 *
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530144 * @param inAttr RPCs input node attribute info
145 * @param outAttr RPCs output node attribute info
146 * @param rpcName name of the rpc function
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530147 * @throws IOException IO operation fail
148 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530149 private void addRpcString(JavaAttributeInfo inAttr, JavaAttributeInfo outAttr,
150 String rpcName) throws IOException {
Bharat saraswal250a7472016-05-12 13:16:57 +0530151 String rpcInput = EMPTY_STRING;
152 String rpcOutput = VOID;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530153 String rpcIn = EMPTY_STRING;
154 if (inAttr != null) {
155 rpcInput = getCapitalCase(inAttr.getAttributeName());
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530156 }
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530157 if (outAttr != null) {
158 rpcOutput = getCapitalCase(outAttr.getAttributeName());
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530159 }
Bharat saraswal5cd9e9c2016-05-26 23:48:38 +0530160 if (!rpcInput.equals(EMPTY_STRING)) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530161 rpcIn = RPC_INPUT_VAR_NAME;
Bharat saraswal5cd9e9c2016-05-26 23:48:38 +0530162 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530163 appendToFile(rpcInterfaceTempFileHandle,
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530164 generateJavaDocForRpc(rpcName, rpcIn, rpcOutput) +
165 getRpcServiceMethod(rpcName, rpcInput, rpcOutput));
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530166 }
167
168 /**
169 * Adds the JAVA rpc snippet information.
170 *
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530171 * @param inAttr RPCs input node attribute info
172 * @param outAttr RPCs output node attribute info
173 * @param rpcName name of the rpc function
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530174 * @throws IOException IO operation fail
175 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530176 public void addJavaSnippetInfoToApplicableTempFiles(JavaAttributeInfo inAttr,
177 JavaAttributeInfo outAttr,
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530178 String rpcName)
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530179 throws IOException {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530180 addRpcString(inAttr, outAttr, rpcName);
181 }
182
183 /**
184 * Creates an attribute info object corresponding to a data model node and
185 * return it.
186 *
187 * @param childNode child data model node(input / output) for which the java code generation
188 * is being handled
189 * @param parentNode parent node (module / sub-module) in which the child node is an attribute
190 * @return AttributeInfo attribute details required to add in temporary
191 * files
192 */
193 public JavaAttributeInfo getChildNodeAsAttributeInParentService(
194 YangNode childNode, YangNode parentNode) {
195
196 String childNodeName = ((JavaFileInfoContainer) childNode)
197 .getJavaFileInfo().getJavaName();
198 /*
199 * Get the import info corresponding to the attribute for import in
200 * generated java files or qualified access
201 */
202 JavaQualifiedTypeInfoTranslator qualifiedTypeInfo =
203 getQualifiedTypeInfoOfCurNode(childNode,
204 getCapitalCase(childNodeName));
205 if (!(parentNode instanceof TempJavaCodeFragmentFilesContainer)) {
206 throw new TranslatorException("Parent node does not have file info");
207 }
208
209 boolean isQualified = addImportToService(qualifiedTypeInfo, parentNode);
210 return getAttributeInfoForTheData(qualifiedTypeInfo, childNodeName,
211 null, isQualified, false);
212 }
213
214 /**
215 * Adds to service class import list.
216 *
217 * @param importInfo import info
218 * @return true or false
219 */
220 private boolean addImportToService(
221 JavaQualifiedTypeInfoTranslator importInfo, YangNode curNode) {
222 JavaFileInfoTranslator fileInfo = ((JavaFileInfoContainer) curNode)
223 .getJavaFileInfo();
224 String name = fileInfo.getJavaName();
225 String clsInfo = importInfo.getClassInfo();
226
227 StringBuilder className = new StringBuilder()
228 .append(getCapitalCase(name))
229 .append(SERVICE);
230 return clsInfo.contentEquals(SERVICE) || clsInfo.contentEquals(className) ||
231 getJavaImportData().addImportInfo(importInfo, className.toString(),
232 fileInfo.getPackage());
233 }
234
235 /**
236 * Adds augmented rpc methods to service temp file.
237 *
238 * @param module root node
239 * @throws IOException when fails to do IO operations
240 */
241 public void addAugmentedRpcMethod(RpcNotificationContainer module)
242 throws IOException {
243 JavaAttributeInfo in = null;
244 JavaAttributeInfo out = null;
245 YangNode rpcChild;
246 YangRpc rpc;
247 YangInput input;
248 for (YangAugment info : module.getAugmentList()) {
249 input = (YangInput) info.getAugmentedNode();
250
251 if (input != null) {
252 rpc = (YangRpc) input.getParent();
253 rpcChild = rpc.getChild();
254 while (rpcChild != null) {
255 if (rpcChild instanceof YangInput) {
256 in = getChildNodeAsAttributeInParentService(
257 rpcChild, (YangNode) module);
258 }
259 if (rpcChild instanceof YangOutput) {
260 out = getChildNodeAsAttributeInParentService(
261 rpcChild, (YangNode) module);
262 }
263 rpcChild = rpcChild.getChild();
264 }
265 addJavaSnippetInfoToApplicableTempFiles(in, out, rpc
266 .getJavaClassNameOrBuiltInType());
267 }
268 }
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530269 }
270
271 /**
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530272 * Removes all temporary file handles.
273 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530274 * @param errorOccurred flag indicating error
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530275 * @throws IOException when failed to delete the temporary files
276 */
Bharat saraswal250a7472016-05-12 13:16:57 +0530277 @Override
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530278 public void freeTemporaryResources(boolean errorOccurred)
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530279 throws IOException {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530280 closeFile(serviceJavaFileHandle, errorOccurred);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530281 closeFile(rpcInterfaceTempFileHandle);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530282 closeFile(getGetterInterfaceTempFileHandle());
283 closeFile(getSetterInterfaceTempFileHandle());
284 closeFile(getSetterImplTempFileHandle());
285 super.freeTemporaryResources(errorOccurred);
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530286 }
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530287}