blob: 88955603727f00043bd5603d2d7d985441a1bfe3 [file] [log] [blame]
Vinod Kumar S7a004de2016-02-05 16:15:09 +05301/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Vinod Kumar S7a004de2016-02-05 16:15:09 +05303 *
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.plugin.manager;
18
Bharat saraswal6ef0b762016-04-05 12:45:45 +053019import java.io.IOException;
Bharat saraswalec4ef7c2016-02-11 22:00:49 +053020import java.util.Iterator;
21import java.util.List;
22
Vinod Kumar S7a004de2016-02-05 16:15:09 +053023import org.apache.maven.plugin.AbstractMojo;
24import org.apache.maven.plugin.MojoExecutionException;
25import org.apache.maven.plugin.MojoFailureException;
Bharat saraswal870c56f2016-02-20 21:57:16 +053026import org.apache.maven.plugins.annotations.Component;
Vinod Kumar S7a004de2016-02-05 16:15:09 +053027import org.apache.maven.plugins.annotations.Mojo;
Bharat saraswal870c56f2016-02-20 21:57:16 +053028import org.apache.maven.plugins.annotations.Parameter;
Bharat saraswalec4ef7c2016-02-11 22:00:49 +053029import org.apache.maven.project.MavenProject;
Bharat saraswalec4ef7c2016-02-11 22:00:49 +053030import org.onosproject.yangutils.datamodel.YangNode;
Bharat saraswal6ef0b762016-04-05 12:45:45 +053031import org.onosproject.yangutils.datamodel.exceptions.DataModelException;
Bharat saraswalec4ef7c2016-02-11 22:00:49 +053032import org.onosproject.yangutils.parser.YangUtilsParser;
33import org.onosproject.yangutils.parser.exceptions.ParserException;
Bharat saraswal870c56f2016-02-20 21:57:16 +053034import org.onosproject.yangutils.parser.impl.YangUtilsParserManager;
Bharat saraswalec4ef7c2016-02-11 22:00:49 +053035import org.onosproject.yangutils.utils.io.impl.YangFileScanner;
Bharat saraswal870c56f2016-02-20 21:57:16 +053036import org.sonatype.plexus.build.incremental.BuildContext;
Vinod Kumar S7a004de2016-02-05 16:15:09 +053037
Bharat saraswale2d51d62016-03-23 19:40:35 +053038import static org.apache.maven.plugins.annotations.LifecyclePhase.GENERATE_SOURCES;
39import static org.apache.maven.plugins.annotations.ResolutionScope.COMPILE;
Vinod Kumar S38046502016-03-23 15:30:27 +053040import static org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorUtil.generateJavaCode;
Bharat saraswal6ef0b762016-04-05 12:45:45 +053041import static org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorUtil.translatorErrorHandler;
Bharat saraswal2f11f652016-03-25 18:19:46 +053042import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getPackageDirPathFromJavaJPackage;
Bharat saraswale2d51d62016-03-23 19:40:35 +053043import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT_BASE_PKG;
44import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
45import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
Vinod Kumar S38046502016-03-23 15:30:27 +053046import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.addToSource;
47import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.clean;
48import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.copyYangFilesToTarget;
49import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getDirectory;
50
Vinod Kumar S7a004de2016-02-05 16:15:09 +053051/**
Bharat saraswald9822e92016-04-05 15:13:44 +053052 * Represents ONOS YANG utility maven plugin.
Bharat saraswale2d51d62016-03-23 19:40:35 +053053 * Goal of plugin is yang2java Execution phase in generate-sources requiresDependencyResolution at compile time.
Bharat saraswalec4ef7c2016-02-11 22:00:49 +053054 */
Bharat saraswale2d51d62016-03-23 19:40:35 +053055@Mojo(name = "yang2java", defaultPhase = GENERATE_SOURCES, requiresDependencyResolution = COMPILE,
56 requiresProject = true)
Vinod Kumar S7a004de2016-02-05 16:15:09 +053057public class YangUtilManager extends AbstractMojo {
58
Bharat saraswalec4ef7c2016-02-11 22:00:49 +053059 /**
60 * Source directory for YANG files.
61 */
62 @Parameter(property = "yangFilesDir", defaultValue = "src/main/yang")
63 private String yangFilesDir;
64
65 /**
Bharat saraswal8f2a6c52016-03-09 18:34:56 +053066 * Source directory for generated files.
67 */
68 @Parameter(property = "genFilesDir", defaultValue = "src/main/java")
69 private String genFilesDir;
70
71 /**
Bharat saraswal2f00b4b2016-03-04 20:08:09 +053072 * Base directory for project.
73 */
74 @Parameter(property = "basedir", defaultValue = "${basedir}")
75 private String baseDir;
76
77 /**
Bharat saraswalec4ef7c2016-02-11 22:00:49 +053078 * Output directory.
79 */
80 @Parameter(property = "project.build.outputDirectory", required = true, defaultValue = "target/classes")
Vinod Kumar S38046502016-03-23 15:30:27 +053081 private String outputDirectory;
Bharat saraswalec4ef7c2016-02-11 22:00:49 +053082
83 /**
84 * Current maven project.
85 */
86 @Parameter(property = "project", required = true, readonly = true, defaultValue = "${project}")
87 private MavenProject project;
88
89 /**
90 * Build context.
91 */
92 @Component
93 private BuildContext context;
94
Bharat saraswal2f11f652016-03-25 18:19:46 +053095 private static final String DEFAULT_PKG = SLASH + getPackageDirPathFromJavaJPackage(DEFAULT_BASE_PKG);
Vinod Kumar S38046502016-03-23 15:30:27 +053096
Bharat saraswal870c56f2016-02-20 21:57:16 +053097 private YangUtilsParser yangUtilsParser = new YangUtilsParserManager();
Bharat saraswalec4ef7c2016-02-11 22:00:49 +053098 private String searchDir;
Bharat saraswal2f00b4b2016-03-04 20:08:09 +053099 private String codeGenDir;
Bharat saraswal6ef0b762016-04-05 12:45:45 +0530100 private YangNode rootNode;
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530101
Vinod Kumar S7a004de2016-02-05 16:15:09 +0530102 @Override
103 public void execute() throws MojoExecutionException, MojoFailureException {
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530104
105 try {
Bharat saraswal870c56f2016-02-20 21:57:16 +0530106
Bharat saraswal870c56f2016-02-20 21:57:16 +0530107 /**
108 * For deleting the generated code in previous build.
109 */
Vinod Kumar S38046502016-03-23 15:30:27 +0530110 clean(getDirectory(baseDir, genFilesDir) + DEFAULT_PKG);
111 clean(getDirectory(baseDir, outputDirectory));
Bharat saraswal870c56f2016-02-20 21:57:16 +0530112
Vinod Kumar S38046502016-03-23 15:30:27 +0530113 searchDir = getDirectory(baseDir, yangFilesDir);
Bharat saraswale2d51d62016-03-23 19:40:35 +0530114 codeGenDir = getDirectory(baseDir, genFilesDir) + SLASH;
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530115
116 List<String> yangFiles = YangFileScanner.getYangFiles(searchDir);
117 Iterator<String> yangFileIterator = yangFiles.iterator();
118 while (yangFileIterator.hasNext()) {
119 String yangFile = yangFileIterator.next();
120 try {
121 YangNode yangNode = yangUtilsParser.getDataModel(yangFile);
Bharat saraswal6ef0b762016-04-05 12:45:45 +0530122 setRootNode(yangNode);
Vinod Kumar S38046502016-03-23 15:30:27 +0530123 generateJavaCode(yangNode, codeGenDir);
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530124 } catch (ParserException e) {
Bharat saraswal870c56f2016-02-20 21:57:16 +0530125 String logInfo = "Error in file: " + e.getFileName();
126 if (e.getLineNumber() != 0) {
127 logInfo = logInfo + " at line: " + e.getLineNumber() + " at position: "
128 + e.getCharPositionInLine();
129
130 }
131 if (e.getMessage() != null) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530132 logInfo = logInfo + NEW_LINE + e.getMessage();
Bharat saraswal870c56f2016-02-20 21:57:16 +0530133 }
134 getLog().info(logInfo);
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530135 }
136 }
Bharat saraswal870c56f2016-02-20 21:57:16 +0530137
Vinod Kumar S38046502016-03-23 15:30:27 +0530138 addToSource(getDirectory(baseDir, genFilesDir) + DEFAULT_PKG, project, context);
139 copyYangFilesToTarget(yangFiles, getDirectory(baseDir, outputDirectory), project);
Bharat saraswal8f2a6c52016-03-09 18:34:56 +0530140 } catch (Exception e) {
Bharat saraswal6ef0b762016-04-05 12:45:45 +0530141 try {
142 translatorErrorHandler(getRootNode());
143 clean(getDirectory(baseDir, genFilesDir) + DEFAULT_PKG);
144 } catch (IOException | DataModelException ex) {
145 throw new MojoExecutionException("Error handler failed to delete files for data model node.");
146 }
Bharat saraswale2d51d62016-03-23 19:40:35 +0530147 throw new MojoExecutionException("Exception occured due to " + e.getLocalizedMessage());
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530148 }
Vinod Kumar S7a004de2016-02-05 16:15:09 +0530149 }
Bharat saraswal6ef0b762016-04-05 12:45:45 +0530150
151 /**
152 * Set current project.
153 *
154 * @param curProject maven project
155 */
156 public void setCurrentProject(MavenProject curProject) {
157 project = curProject;
158
159 }
160
161 /**
162 * Returns current project.
163 *
164 * @return current project
165 */
166 public MavenProject getCurrentProject() {
167 return project;
168 }
169
170 /**
171 * Returns current root YANG node of data-model tree.
172 *
173 * @return current root YANG node of data-model tree
174 */
175 public YangNode getRootNode() {
176 return rootNode;
177 }
178
179 /**
180 * Sets current root YANG node of data-model tree.
181 *
182 * @param rootNode current root YANG node of data-model tree
183 */
184
185 public void setRootNode(YangNode rootNode) {
186 this.rootNode = rootNode;
187 }
188
Vinod Kumar S38046502016-03-23 15:30:27 +0530189}