blob: 0cb63e1605a8cef4010074cf21edc7cedcf9e791 [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;
Bharat saraswal0663aff2016-10-18 23:16:14 +053043import static org.onosproject.yangutils.utils.UtilConstants.HYPHEN;
44import static org.onosproject.yangutils.utils.UtilConstants.INPUT;
45import static org.onosproject.yangutils.utils.UtilConstants.OUTPUT;
Gaurav Agrawal3b57f362016-09-07 13:16:35 +053046import static org.onosproject.yangutils.utils.UtilConstants.Operation.ADD;
Bharat saraswal250a7472016-05-12 13:16:57 +053047import static org.onosproject.yangutils.utils.UtilConstants.RPC_INPUT_VAR_NAME;
Bharat saraswal9fab16b2016-09-23 23:27:24 +053048import static org.onosproject.yangutils.utils.UtilConstants.SERVICE;
Bharat saraswal250a7472016-05-12 13:16:57 +053049import static org.onosproject.yangutils.utils.UtilConstants.VOID;
Bharat saraswalaf413b82016-07-14 15:18:20 +053050import static org.onosproject.yangutils.utils.io.impl.FileSystemUtil.closeFile;
Bharat saraswalaf413b82016-07-14 15:18:20 +053051import static org.onosproject.yangutils.utils.io.impl.JavaDocGen.generateJavaDocForRpc;
Bharat saraswalaf413b82016-07-14 15:18:20 +053052import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getAbsolutePackagePath;
Bharat saraswal0663aff2016-10-18 23:16:14 +053053import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCamelCase;
Bharat saraswalaf413b82016-07-14 15:18:20 +053054import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getCapitalCase;
Vinod Kumar S79a374b2016-04-30 21:09:15 +053055
56/**
Gaurav Agrawal3b57f362016-09-07 13:16:35 +053057 * Represents implementation of java service code fragments temporary
58 * implementations. Maintains the temp files required specific for service
59 * and manager java snippet generation.
Vinod Kumar S79a374b2016-04-30 21:09:15 +053060 */
Gaurav Agrawal3b57f362016-09-07 13:16:35 +053061public class TempJavaServiceFragmentFiles extends TempJavaFragmentFiles {
Vinod Kumar S79a374b2016-04-30 21:09:15 +053062
63 /**
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +053064 * File name for rpc method.
65 */
66 private static final String RPC_INTERFACE_FILE_NAME = "Rpc";
67
68 /**
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +053069 * Temporary file handle for rpc interface.
70 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +053071 private final File rpcInterfaceTempFileHandle;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +053072
73 /**
74 * Java file handle for rpc interface file.
75 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +053076 private File serviceJavaFileHandle;
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +053077
78 /**
Bharat saraswalaf413b82016-07-14 15:18:20 +053079 * Creates an instance of temporary java code fragment.
80 *
81 * @param javaFileInfo generated file information
82 * @throws IOException when fails to create new file handle
83 */
Bharat saraswale50edca2016-08-05 01:58:25 +053084 TempJavaServiceFragmentFiles(JavaFileInfoTranslator javaFileInfo)
Bharat saraswalaf413b82016-07-14 15:18:20 +053085 throws IOException {
86 setJavaExtendsListHolder(new JavaExtendsListHolder());
87 setJavaImportData(new JavaImportData());
88 setJavaFileInfo(javaFileInfo);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +053089 setAbsoluteDirPath(getAbsolutePackagePath(
90 getJavaFileInfo().getBaseCodeGenPath(),
Bharat saraswalaf413b82016-07-14 15:18:20 +053091 getJavaFileInfo().getPackageFilePath()));
92 addGeneratedTempFile(RPC_INTERFACE_MASK);
Bharat saraswal9fab16b2016-09-23 23:27:24 +053093 rpcInterfaceTempFileHandle = getTemporaryFileHandle(RPC_INTERFACE_FILE_NAME);
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +053094 }
95
96 /**
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +053097 * Returns rpc method's temporary file handle.
98 *
99 * @return temporary file handle
100 */
101 public File getRpcInterfaceTempFileHandle() {
102 return rpcInterfaceTempFileHandle;
103 }
104
105 /**
Bharat saraswal4aaab4d2016-05-17 14:19:38 +0530106 * Constructs java code exit.
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530107 *
108 * @param fileType generated file type
VinodKumarS-Huaweid81eccb2016-06-01 14:30:22 +0530109 * @param curNode current YANG node
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530110 * @throws IOException when fails to generate java files
111 */
Bharat saraswal250a7472016-05-12 13:16:57 +0530112 @Override
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530113 public void generateJavaFile(int fileType, YangNode curNode)
114 throws IOException {
Bharat saraswal8beac342016-08-04 02:00:03 +0530115
116 addResolvedAugmentedDataNodeImports(curNode);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530117 List<String> imports = ((JavaCodeGeneratorInfo) curNode)
118 .getTempJavaCodeFragmentFiles().getServiceTempFiles()
Bharat saraswalaf413b82016-07-14 15:18:20 +0530119 .getJavaImportData().getImports();
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530120 createPackage(curNode);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530121 boolean notification = false;
Shankara-Huaweib7564772016-08-02 18:13:13 +0530122 if (curNode instanceof YangJavaModuleTranslator) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530123 if (!((YangJavaModuleTranslator) curNode).getNotificationNodes()
124 .isEmpty()) {
125 notification = true;
Bharat saraswal4aaab4d2016-05-17 14:19:38 +0530126 }
Shankara-Huaweib7564772016-08-02 18:13:13 +0530127 } else if (curNode instanceof YangJavaSubModuleTranslator) {
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530128 if (!((YangJavaSubModuleTranslator) curNode).getNotificationNodes()
129 .isEmpty()) {
130 notification = true;
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530131 }
Bharat saraswal4aaab4d2016-05-17 14:19:38 +0530132 }
133
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530134 if (notification) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530135 addListenersImport(curNode, imports, ADD);
Bharat saraswal4aaab4d2016-05-17 14:19:38 +0530136 }
Bharat saraswal64e7e232016-07-14 23:33:55 +0530137
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530138 serviceJavaFileHandle = getJavaFileHandle(getJavaClassName(SERVICE));
139 generateServiceInterfaceFile(serviceJavaFileHandle, curNode, imports);
Bharat saraswal64e7e232016-07-14 23:33:55 +0530140
141 // Close all the file handles.
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530142 freeTemporaryResources(false);
143 }
144
145 /**
146 * Adds rpc string information to applicable temp file.
147 *
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530148 * @param inAttr RPCs input node attribute info
149 * @param outAttr RPCs output node attribute info
150 * @param rpcName name of the rpc function
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530151 * @throws IOException IO operation fail
152 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530153 private void addRpcString(JavaAttributeInfo inAttr, JavaAttributeInfo outAttr,
154 String rpcName) throws IOException {
Bharat saraswal0663aff2016-10-18 23:16:14 +0530155 String rpcInput = null;
156 String rpcOutput = VOID;
157 String rpcIn = EMPTY_STRING;
158 if (inAttr != null) {
159 rpcInput = getCapitalCase(inAttr.getAttributeName());
160 }
161 if (outAttr != null) {
162 rpcOutput = getCapitalCase(outAttr.getAttributeName());
163 }
164 if (rpcInput != null) {
165 rpcIn = RPC_INPUT_VAR_NAME;
166 }
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530167 appendToFile(rpcInterfaceTempFileHandle,
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530168 generateJavaDocForRpc(rpcName, rpcIn, rpcOutput) +
169 getRpcServiceMethod(rpcName, rpcInput, rpcOutput));
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530170 }
171
172 /**
173 * Adds the JAVA rpc snippet information.
174 *
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530175 * @param inAttr RPCs input node attribute info
176 * @param outAttr RPCs output node attribute info
177 * @param rpcName name of the rpc function
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530178 * @throws IOException IO operation fail
179 */
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530180 public void addJavaSnippetInfoToApplicableTempFiles(JavaAttributeInfo inAttr,
181 JavaAttributeInfo outAttr,
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530182 String rpcName)
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530183 throws IOException {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530184 addRpcString(inAttr, outAttr, rpcName);
185 }
186
187 /**
188 * Creates an attribute info object corresponding to a data model node and
189 * return it.
190 *
191 * @param childNode child data model node(input / output) for which the java code generation
192 * is being handled
193 * @param parentNode parent node (module / sub-module) in which the child node is an attribute
Bharat saraswal0663aff2016-10-18 23:16:14 +0530194 * @param rpcName rpc name
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530195 * @return AttributeInfo attribute details required to add in temporary
196 * files
197 */
198 public JavaAttributeInfo getChildNodeAsAttributeInParentService(
Bharat saraswal0663aff2016-10-18 23:16:14 +0530199 YangNode childNode, YangNode parentNode, String rpcName) {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530200
Bharat saraswal0663aff2016-10-18 23:16:14 +0530201 JavaFileInfoTranslator fileInfo = ((JavaFileInfoContainer) childNode)
202 .getJavaFileInfo();
203 String childNodeName = fileInfo.getJavaName();
204 if (childNodeName == null) {
205 if (childNode instanceof YangInput) {
206 childNodeName = rpcName + HYPHEN + INPUT;
207 } else {
208 childNodeName = rpcName + HYPHEN + OUTPUT;
209 }
210 childNodeName = getCamelCase(childNodeName, null);
211 }
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530212 /*
213 * Get the import info corresponding to the attribute for import in
214 * generated java files or qualified access
215 */
216 JavaQualifiedTypeInfoTranslator qualifiedTypeInfo =
217 getQualifiedTypeInfoOfCurNode(childNode,
218 getCapitalCase(childNodeName));
219 if (!(parentNode instanceof TempJavaCodeFragmentFilesContainer)) {
220 throw new TranslatorException("Parent node does not have file info");
221 }
222
223 boolean isQualified = addImportToService(qualifiedTypeInfo, parentNode);
224 return getAttributeInfoForTheData(qualifiedTypeInfo, childNodeName,
225 null, isQualified, false);
226 }
227
228 /**
229 * Adds to service class import list.
230 *
231 * @param importInfo import info
232 * @return true or false
233 */
234 private boolean addImportToService(
235 JavaQualifiedTypeInfoTranslator importInfo, YangNode curNode) {
236 JavaFileInfoTranslator fileInfo = ((JavaFileInfoContainer) curNode)
237 .getJavaFileInfo();
238 String name = fileInfo.getJavaName();
239 String clsInfo = importInfo.getClassInfo();
240
241 StringBuilder className = new StringBuilder()
242 .append(getCapitalCase(name))
243 .append(SERVICE);
244 return clsInfo.contentEquals(SERVICE) || clsInfo.contentEquals(className) ||
245 getJavaImportData().addImportInfo(importInfo, className.toString(),
246 fileInfo.getPackage());
247 }
248
249 /**
250 * Adds augmented rpc methods to service temp file.
251 *
252 * @param module root node
253 * @throws IOException when fails to do IO operations
254 */
255 public void addAugmentedRpcMethod(RpcNotificationContainer module)
256 throws IOException {
257 JavaAttributeInfo in = null;
258 JavaAttributeInfo out = null;
259 YangNode rpcChild;
260 YangRpc rpc;
Bharat saraswal0663aff2016-10-18 23:16:14 +0530261 String rpcName;
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530262 YangInput input;
Bharat saraswal0663aff2016-10-18 23:16:14 +0530263
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530264 for (YangAugment info : module.getAugmentList()) {
265 input = (YangInput) info.getAugmentedNode();
266
267 if (input != null) {
268 rpc = (YangRpc) input.getParent();
Bharat saraswal0663aff2016-10-18 23:16:14 +0530269 if (!validateForIntraFile(module, (RpcNotificationContainer) rpc
270 .getParent())) {
271 rpcChild = rpc.getChild();
272
273 rpcName = getCamelCase(rpc.getName(), null);
274 while (rpcChild != null) {
275 if (rpcChild instanceof YangInput) {
276 in = getChildNodeAsAttributeInParentService(
277 rpcChild, (YangNode) module, rpcName);
278 }
279 if (rpcChild instanceof YangOutput) {
280 out = getChildNodeAsAttributeInParentService(
281 rpcChild, (YangNode) module, rpcName);
282 }
283 rpcChild = rpcChild.getNextSibling();
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530284 }
Bharat saraswal0663aff2016-10-18 23:16:14 +0530285 addJavaSnippetInfoToApplicableTempFiles(in, out, rpcName);
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530286 }
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530287 }
288 }
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530289 }
290
Bharat saraswal0663aff2016-10-18 23:16:14 +0530291 private boolean validateForIntraFile(RpcNotificationContainer parent,
292 RpcNotificationContainer curModule) {
293 return parent.getPrefix().equals(curModule.getPrefix());
294 }
295
Bharat saraswal715d3fc2016-05-17 19:59:16 +0530296 /**
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530297 * Removes all temporary file handles.
298 *
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530299 * @param errorOccurred flag indicating error
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530300 * @throws IOException when failed to delete the temporary files
301 */
Bharat saraswal250a7472016-05-12 13:16:57 +0530302 @Override
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530303 public void freeTemporaryResources(boolean errorOccurred)
VinodKumarS-Huawei6266db32016-05-10 17:58:57 +0530304 throws IOException {
Bharat saraswal9fab16b2016-09-23 23:27:24 +0530305 closeFile(serviceJavaFileHandle, errorOccurred);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530306 closeFile(rpcInterfaceTempFileHandle);
Gaurav Agrawal3b57f362016-09-07 13:16:35 +0530307 closeFile(getGetterInterfaceTempFileHandle());
308 closeFile(getSetterInterfaceTempFileHandle());
309 closeFile(getSetterImplTempFileHandle());
310 super.freeTemporaryResources(errorOccurred);
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530311 }
Vinod Kumar S79a374b2016-04-30 21:09:15 +0530312}