blob: 5e7f58767bcf99a63d57e8ca1a741c928c5959f4 [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 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
Vidyashree Rama7142d9c2016-04-26 15:06:06 +0530133 String searchDir = getDirectory(baseDir, yangFilesDir);
134 String 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);
Vidyashree Rama7142d9c2016-04-26 15:06:06 +0530138 conflictResolver.setReplacementForUnderscore(replacementForUnderscore);
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}