blob: 86203c6232c505e5448e98d3716849b54b41c5c0 [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;
janani bde4ffab2016-04-15 16:18:30 +053035import org.onosproject.yangutils.translator.tojava.utils.YangPluginConfig;
36import org.onosproject.yangutils.translator.tojava.utils.YangToJavaNamingConflictUtil;
Bharat saraswalec4ef7c2016-02-11 22:00:49 +053037import org.onosproject.yangutils.utils.io.impl.YangFileScanner;
Bharat saraswal870c56f2016-02-20 21:57:16 +053038import org.sonatype.plexus.build.incremental.BuildContext;
Vinod Kumar S7a004de2016-02-05 16:15:09 +053039
Bharat saraswale2d51d62016-03-23 19:40:35 +053040import static org.apache.maven.plugins.annotations.LifecyclePhase.GENERATE_SOURCES;
41import static org.apache.maven.plugins.annotations.ResolutionScope.COMPILE;
Vinod Kumar S38046502016-03-23 15:30:27 +053042import static org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorUtil.generateJavaCode;
Bharat saraswal6ef0b762016-04-05 12:45:45 +053043import static org.onosproject.yangutils.translator.tojava.JavaCodeGeneratorUtil.translatorErrorHandler;
Bharat saraswal2f11f652016-03-25 18:19:46 +053044import static org.onosproject.yangutils.translator.tojava.utils.JavaIdentifierSyntax.getPackageDirPathFromJavaJPackage;
Bharat saraswale2d51d62016-03-23 19:40:35 +053045import static org.onosproject.yangutils.utils.UtilConstants.DEFAULT_BASE_PKG;
46import static org.onosproject.yangutils.utils.UtilConstants.NEW_LINE;
47import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
Vinod Kumar S38046502016-03-23 15:30:27 +053048import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.addToSource;
49import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.clean;
50import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.copyYangFilesToTarget;
51import static org.onosproject.yangutils.utils.io.impl.YangIoUtils.getDirectory;
52
Vinod Kumar S7a004de2016-02-05 16:15:09 +053053/**
Bharat saraswald9822e92016-04-05 15:13:44 +053054 * Represents ONOS YANG utility maven plugin.
Bharat saraswalef2e6392016-04-19 19:50:32 +053055 * Goal of plugin is yang2java.
56 * Execution phase is generate-sources.
57 * requiresDependencyResolution at compile time.
Bharat saraswalec4ef7c2016-02-11 22:00:49 +053058 */
Bharat saraswale2d51d62016-03-23 19:40:35 +053059@Mojo(name = "yang2java", defaultPhase = GENERATE_SOURCES, requiresDependencyResolution = COMPILE,
60 requiresProject = true)
Vinod Kumar S7a004de2016-02-05 16:15:09 +053061public class YangUtilManager extends AbstractMojo {
62
Bharat saraswalec4ef7c2016-02-11 22:00:49 +053063 /**
64 * Source directory for YANG files.
65 */
66 @Parameter(property = "yangFilesDir", defaultValue = "src/main/yang")
67 private String yangFilesDir;
68
69 /**
Bharat saraswal8f2a6c52016-03-09 18:34:56 +053070 * Source directory for generated files.
71 */
72 @Parameter(property = "genFilesDir", defaultValue = "src/main/java")
73 private String genFilesDir;
74
75 /**
Bharat saraswal2f00b4b2016-03-04 20:08:09 +053076 * Base directory for project.
77 */
78 @Parameter(property = "basedir", defaultValue = "${basedir}")
79 private String baseDir;
80
81 /**
Bharat saraswalec4ef7c2016-02-11 22:00:49 +053082 * Output directory.
83 */
84 @Parameter(property = "project.build.outputDirectory", required = true, defaultValue = "target/classes")
Vinod Kumar S38046502016-03-23 15:30:27 +053085 private String outputDirectory;
Bharat saraswalec4ef7c2016-02-11 22:00:49 +053086
87 /**
88 * Current maven project.
89 */
90 @Parameter(property = "project", required = true, readonly = true, defaultValue = "${project}")
91 private MavenProject project;
92
93 /**
janani bde4ffab2016-04-15 16:18:30 +053094 * Replacement required for period special character in the identifier.
95 */
96 @Parameter(property = "replacementForPeriod")
97 private String replacementForPeriod;
98
99 /**
100 * Replacement required for underscore special character in the identifier.
101 */
102 @Parameter(property = "replacementForUnderscore")
103 private String replacementForUnderscore;
104
105 /**
106 * Replacement required for hyphen special character in the identifier.
107 */
108 @Parameter(property = "replacementForHyphen")
109 private String replacementForHyphen;
110
111 /**
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530112 * Build context.
113 */
114 @Component
115 private BuildContext context;
116
Bharat saraswal2f11f652016-03-25 18:19:46 +0530117 private static final String DEFAULT_PKG = SLASH + getPackageDirPathFromJavaJPackage(DEFAULT_BASE_PKG);
Vinod Kumar S38046502016-03-23 15:30:27 +0530118
Bharat saraswal870c56f2016-02-20 21:57:16 +0530119 private YangUtilsParser yangUtilsParser = new YangUtilsParserManager();
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530120 private String searchDir;
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530121 private String codeGenDir;
Bharat saraswal6ef0b762016-04-05 12:45:45 +0530122 private YangNode rootNode;
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530123
Vinod Kumar S7a004de2016-02-05 16:15:09 +0530124 @Override
125 public void execute() throws MojoExecutionException, MojoFailureException {
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530126
127 try {
Bharat saraswal870c56f2016-02-20 21:57:16 +0530128
Bharat saraswal870c56f2016-02-20 21:57:16 +0530129 /**
130 * For deleting the generated code in previous build.
131 */
Vinod Kumar S38046502016-03-23 15:30:27 +0530132 clean(getDirectory(baseDir, genFilesDir) + DEFAULT_PKG);
133 clean(getDirectory(baseDir, outputDirectory));
Bharat saraswal870c56f2016-02-20 21:57:16 +0530134
Vinod Kumar S38046502016-03-23 15:30:27 +0530135 searchDir = getDirectory(baseDir, yangFilesDir);
Bharat saraswale2d51d62016-03-23 19:40:35 +0530136 codeGenDir = getDirectory(baseDir, genFilesDir) + SLASH;
janani bde4ffab2016-04-15 16:18:30 +0530137 YangToJavaNamingConflictUtil conflictResolver = new YangToJavaNamingConflictUtil();
138 conflictResolver.setReplacementForPeriod(replacementForPeriod);
139 conflictResolver.setReplacementForHyphen(replacementForHyphen);
140 conflictResolver.setReplacementForUnderscore(replacementForHyphen);
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530141 List<String> yangFiles = YangFileScanner.getYangFiles(searchDir);
janani bde4ffab2016-04-15 16:18:30 +0530142 YangPluginConfig yangPlugin = new YangPluginConfig();
143 yangPlugin.setCodeGenDir(codeGenDir);
144 yangPlugin.setConflictResolver(conflictResolver);
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530145 Iterator<String> yangFileIterator = yangFiles.iterator();
146 while (yangFileIterator.hasNext()) {
147 String yangFile = yangFileIterator.next();
148 try {
149 YangNode yangNode = yangUtilsParser.getDataModel(yangFile);
Bharat saraswal6ef0b762016-04-05 12:45:45 +0530150 setRootNode(yangNode);
janani bde4ffab2016-04-15 16:18:30 +0530151 generateJavaCode(yangNode, yangPlugin);
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530152 } catch (ParserException e) {
Bharat saraswal870c56f2016-02-20 21:57:16 +0530153 String logInfo = "Error in file: " + e.getFileName();
154 if (e.getLineNumber() != 0) {
155 logInfo = logInfo + " at line: " + e.getLineNumber() + " at position: "
156 + e.getCharPositionInLine();
157
158 }
159 if (e.getMessage() != null) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530160 logInfo = logInfo + NEW_LINE + e.getMessage();
Bharat saraswal870c56f2016-02-20 21:57:16 +0530161 }
162 getLog().info(logInfo);
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530163 }
164 }
Bharat saraswal870c56f2016-02-20 21:57:16 +0530165
Vinod Kumar S38046502016-03-23 15:30:27 +0530166 addToSource(getDirectory(baseDir, genFilesDir) + DEFAULT_PKG, project, context);
167 copyYangFilesToTarget(yangFiles, getDirectory(baseDir, outputDirectory), project);
Bharat saraswal8f2a6c52016-03-09 18:34:56 +0530168 } catch (Exception e) {
Bharat saraswal6ef0b762016-04-05 12:45:45 +0530169 try {
170 translatorErrorHandler(getRootNode());
171 clean(getDirectory(baseDir, genFilesDir) + DEFAULT_PKG);
172 } catch (IOException | DataModelException ex) {
173 throw new MojoExecutionException("Error handler failed to delete files for data model node.");
174 }
Bharat saraswale2d51d62016-03-23 19:40:35 +0530175 throw new MojoExecutionException("Exception occured due to " + e.getLocalizedMessage());
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530176 }
Vinod Kumar S7a004de2016-02-05 16:15:09 +0530177 }
Bharat saraswal6ef0b762016-04-05 12:45:45 +0530178
179 /**
180 * Set current project.
181 *
182 * @param curProject maven project
183 */
184 public void setCurrentProject(MavenProject curProject) {
185 project = curProject;
186
187 }
188
189 /**
190 * Returns current project.
191 *
192 * @return current project
193 */
194 public MavenProject getCurrentProject() {
195 return project;
196 }
197
198 /**
199 * Returns current root YANG node of data-model tree.
200 *
201 * @return current root YANG node of data-model tree
202 */
203 public YangNode getRootNode() {
204 return rootNode;
205 }
206
207 /**
208 * Sets current root YANG node of data-model tree.
209 *
210 * @param rootNode current root YANG node of data-model tree
211 */
Bharat saraswal6ef0b762016-04-05 12:45:45 +0530212 public void setRootNode(YangNode rootNode) {
213 this.rootNode = rootNode;
214 }
215
Vinod Kumar S38046502016-03-23 15:30:27 +0530216}