blob: b88d5dff4db142b01dbae2c86790df0cb6763ab3 [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 saraswale2d51d62016-03-23 19:40:35 +053055 * Goal of plugin is yang2java Execution phase in generate-sources requiresDependencyResolution at compile time.
Bharat saraswalec4ef7c2016-02-11 22:00:49 +053056 */
Bharat saraswale2d51d62016-03-23 19:40:35 +053057@Mojo(name = "yang2java", defaultPhase = GENERATE_SOURCES, requiresDependencyResolution = COMPILE,
58 requiresProject = true)
Vinod Kumar S7a004de2016-02-05 16:15:09 +053059public class YangUtilManager extends AbstractMojo {
60
Bharat saraswalec4ef7c2016-02-11 22:00:49 +053061 /**
62 * Source directory for YANG files.
63 */
64 @Parameter(property = "yangFilesDir", defaultValue = "src/main/yang")
65 private String yangFilesDir;
66
67 /**
Bharat saraswal8f2a6c52016-03-09 18:34:56 +053068 * Source directory for generated files.
69 */
70 @Parameter(property = "genFilesDir", defaultValue = "src/main/java")
71 private String genFilesDir;
72
73 /**
Bharat saraswal2f00b4b2016-03-04 20:08:09 +053074 * Base directory for project.
75 */
76 @Parameter(property = "basedir", defaultValue = "${basedir}")
77 private String baseDir;
78
79 /**
Bharat saraswalec4ef7c2016-02-11 22:00:49 +053080 * Output directory.
81 */
82 @Parameter(property = "project.build.outputDirectory", required = true, defaultValue = "target/classes")
Vinod Kumar S38046502016-03-23 15:30:27 +053083 private String outputDirectory;
Bharat saraswalec4ef7c2016-02-11 22:00:49 +053084
85 /**
86 * Current maven project.
87 */
88 @Parameter(property = "project", required = true, readonly = true, defaultValue = "${project}")
89 private MavenProject project;
90
91 /**
janani bde4ffab2016-04-15 16:18:30 +053092 * Replacement required for period special character in the identifier.
93 */
94 @Parameter(property = "replacementForPeriod")
95 private String replacementForPeriod;
96
97 /**
98 * Replacement required for underscore special character in the identifier.
99 */
100 @Parameter(property = "replacementForUnderscore")
101 private String replacementForUnderscore;
102
103 /**
104 * Replacement required for hyphen special character in the identifier.
105 */
106 @Parameter(property = "replacementForHyphen")
107 private String replacementForHyphen;
108
109 /**
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530110 * Build context.
111 */
112 @Component
113 private BuildContext context;
114
Bharat saraswal2f11f652016-03-25 18:19:46 +0530115 private static final String DEFAULT_PKG = SLASH + getPackageDirPathFromJavaJPackage(DEFAULT_BASE_PKG);
Vinod Kumar S38046502016-03-23 15:30:27 +0530116
Bharat saraswal870c56f2016-02-20 21:57:16 +0530117 private YangUtilsParser yangUtilsParser = new YangUtilsParserManager();
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530118 private String searchDir;
Bharat saraswal2f00b4b2016-03-04 20:08:09 +0530119 private String codeGenDir;
Bharat saraswal6ef0b762016-04-05 12:45:45 +0530120 private YangNode rootNode;
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530121
Vinod Kumar S7a004de2016-02-05 16:15:09 +0530122 @Override
123 public void execute() throws MojoExecutionException, MojoFailureException {
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530124
125 try {
Bharat saraswal870c56f2016-02-20 21:57:16 +0530126
Bharat saraswal870c56f2016-02-20 21:57:16 +0530127 /**
128 * For deleting the generated code in previous build.
129 */
Vinod Kumar S38046502016-03-23 15:30:27 +0530130 clean(getDirectory(baseDir, genFilesDir) + DEFAULT_PKG);
131 clean(getDirectory(baseDir, outputDirectory));
Bharat saraswal870c56f2016-02-20 21:57:16 +0530132
Vinod Kumar S38046502016-03-23 15:30:27 +0530133 searchDir = getDirectory(baseDir, yangFilesDir);
Bharat saraswale2d51d62016-03-23 19:40:35 +0530134 codeGenDir = getDirectory(baseDir, genFilesDir) + SLASH;
janani bde4ffab2016-04-15 16:18:30 +0530135 YangToJavaNamingConflictUtil conflictResolver = new YangToJavaNamingConflictUtil();
136 conflictResolver.setReplacementForPeriod(replacementForPeriod);
137 conflictResolver.setReplacementForHyphen(replacementForHyphen);
138 conflictResolver.setReplacementForUnderscore(replacementForHyphen);
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530139 List<String> yangFiles = YangFileScanner.getYangFiles(searchDir);
janani bde4ffab2016-04-15 16:18:30 +0530140 YangPluginConfig yangPlugin = new YangPluginConfig();
141 yangPlugin.setCodeGenDir(codeGenDir);
142 yangPlugin.setConflictResolver(conflictResolver);
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530143 Iterator<String> yangFileIterator = yangFiles.iterator();
144 while (yangFileIterator.hasNext()) {
145 String yangFile = yangFileIterator.next();
146 try {
147 YangNode yangNode = yangUtilsParser.getDataModel(yangFile);
Bharat saraswal6ef0b762016-04-05 12:45:45 +0530148 setRootNode(yangNode);
janani bde4ffab2016-04-15 16:18:30 +0530149 generateJavaCode(yangNode, yangPlugin);
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530150 } catch (ParserException e) {
Bharat saraswal870c56f2016-02-20 21:57:16 +0530151 String logInfo = "Error in file: " + e.getFileName();
152 if (e.getLineNumber() != 0) {
153 logInfo = logInfo + " at line: " + e.getLineNumber() + " at position: "
154 + e.getCharPositionInLine();
155
156 }
157 if (e.getMessage() != null) {
Bharat saraswale2d51d62016-03-23 19:40:35 +0530158 logInfo = logInfo + NEW_LINE + e.getMessage();
Bharat saraswal870c56f2016-02-20 21:57:16 +0530159 }
160 getLog().info(logInfo);
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530161 }
162 }
Bharat saraswal870c56f2016-02-20 21:57:16 +0530163
Vinod Kumar S38046502016-03-23 15:30:27 +0530164 addToSource(getDirectory(baseDir, genFilesDir) + DEFAULT_PKG, project, context);
165 copyYangFilesToTarget(yangFiles, getDirectory(baseDir, outputDirectory), project);
Bharat saraswal8f2a6c52016-03-09 18:34:56 +0530166 } catch (Exception e) {
Bharat saraswal6ef0b762016-04-05 12:45:45 +0530167 try {
168 translatorErrorHandler(getRootNode());
169 clean(getDirectory(baseDir, genFilesDir) + DEFAULT_PKG);
170 } catch (IOException | DataModelException ex) {
171 throw new MojoExecutionException("Error handler failed to delete files for data model node.");
172 }
Bharat saraswale2d51d62016-03-23 19:40:35 +0530173 throw new MojoExecutionException("Exception occured due to " + e.getLocalizedMessage());
Bharat saraswalec4ef7c2016-02-11 22:00:49 +0530174 }
Vinod Kumar S7a004de2016-02-05 16:15:09 +0530175 }
Bharat saraswal6ef0b762016-04-05 12:45:45 +0530176
177 /**
178 * Set current project.
179 *
180 * @param curProject maven project
181 */
182 public void setCurrentProject(MavenProject curProject) {
183 project = curProject;
184
185 }
186
187 /**
188 * Returns current project.
189 *
190 * @return current project
191 */
192 public MavenProject getCurrentProject() {
193 return project;
194 }
195
196 /**
197 * Returns current root YANG node of data-model tree.
198 *
199 * @return current root YANG node of data-model tree
200 */
201 public YangNode getRootNode() {
202 return rootNode;
203 }
204
205 /**
206 * Sets current root YANG node of data-model tree.
207 *
208 * @param rootNode current root YANG node of data-model tree
209 */
Bharat saraswal6ef0b762016-04-05 12:45:45 +0530210 public void setRootNode(YangNode rootNode) {
211 this.rootNode = rootNode;
212 }
213
Vinod Kumar S38046502016-03-23 15:30:27 +0530214}