- super();
- parser = new YangParserImpl();
- }
-
- @Override
- public void execute() throws MojoExecutionException, MojoFailureException {
- ContextHolder context = processYang();
- generateSources(context);
- generateResources();
-
- closeResources();
- }
-
- /**
- * Generate {@link SchemaContext} with {@link YangModelParserImpl}
- */
- private ContextHolder processYang() throws MojoExecutionException {
- try {
- List<InputStream> yangFiles = Util
- .listFilesAsStream(yangFilesRootDir);
- Set<Module> yangModules = parser
- .parseYangModelsFromStreams(yangFiles);
-
- List<InputStream> yangFilesFromDependencies = getFilesFromDependenciesAsStream();
- Set<Module> yangModulesFromDependencies = parser
- .parseYangModelsFromStreams(yangFilesFromDependencies);
-
- Set<Module> parsedYang = new HashSet<Module>(yangModules);
- parsedYang.addAll(yangModulesFromDependencies);
-
- if (yangFiles.isEmpty() && yangFilesFromDependencies.isEmpty()) {
- getLog().warn(
- Util.message(
- "No %s file found in %s or in dependencies",
- LOG_PREFIX, Util.YANG_SUFFIX, yangFilesRootDir));
- Set<Module> modules = Collections.emptySet();
- return new ContextHolder(null, modules);
- }
-
- SchemaContext resolveSchemaContext = parser
- .resolveSchemaContext(parsedYang);
- getLog().info(
- Util.message("%s files parsed from %s", LOG_PREFIX,
- Util.YANG_SUFFIX, yangFiles));
- return new ContextHolder(resolveSchemaContext, yangModules);
-
- // MojoExecutionException is thrown since execution cannot continue
- } catch (Exception e) {
- String message = Util.message("Unable to parse %s files from %s",
- LOG_PREFIX, Util.YANG_SUFFIX, yangFilesRootDir);
- getLog().error(message, e);
- throw new MojoExecutionException(message, e);
- }
- }
-
- private void generateResources() throws MojoExecutionException,
- MojoFailureException {
- if (resourceProviders.length == 0) {
- getLog().warn(
- Util.message("No resource provider classes provided",
- LOG_PREFIX));
- return;
- }
-
- Resource res = new Resource();
- String baseDirName = project.getBasedir().getAbsolutePath();
- res.setDirectory(baseDirName + OUTPUT_RESOURCE_DIR);
- res.setTargetPath(INPUT_RESOURCE_DIR);
- project.addResource(res);
-
- Map<String, String> thrown = Maps.newHashMap();
-
- Collection<File> yangFiles = new ArrayList<File>();
-
- // load files from yang root
- yangFiles.addAll(getFilesFromYangRoot());
-
- // load files from dependencies
- Collection<File> filesFromDependencies = getFilesFromDependencies();
- yangFiles.addAll(filesFromDependencies);
-
- for (ResourceProviderArg resourceProvider : resourceProviders) {
- try {
- provideResourcesWithOneProvider(yangFiles, resourceProvider);
- } catch (Exception e) {
- // try other generators, exception will be thrown after
- getLog().error(
- Util.message(
- "Unable to provide resources with %s resource provider",
- LOG_PREFIX,
- resourceProvider.getResourceProviderClass()), e);
- thrown.put(resourceProvider.getResourceProviderClass(), e
- .getClass().getCanonicalName());
- }
- }
-
- if (!thrown.isEmpty()) {
- String message = Util
- .message(
- "One or more code resource provider failed, including failed list(resourceProviderClass=exception) %s",
- LOG_PREFIX, thrown.toString());
- getLog().error(message);
- throw new MojoFailureException(message);
- }
- }
-
- private Collection<File> getFilesFromYangRoot() {
- Collection<File> yangFilesLoaded = null;
-
- File rootDir = new File(yangFilesRootDir);
- try {
- if (rootDir.isAbsolute()) {
- yangFilesLoaded = Util.listFiles(yangFilesRootDir);
- } else {
- String path = project.getBasedir().getAbsolutePath()
- + File.separator + yangFilesRootDir;
- yangFilesLoaded = Util.listFiles(path);
- }
- } catch (FileNotFoundException e) {
- getLog().warn(
- "yangFilesRootDir[" + rootDir.getAbsolutePath()
- + "] does not exists.");
- yangFilesLoaded = new ArrayList<File>();
- }
-
- Collection<File> yangFiles = new ArrayList<File>(yangFilesLoaded);
-
- try {
- for (File yangFile : yangFilesLoaded) {
- InputStream is = new FileInputStream(yangFile);
- yangFiles.add(createFileFromStream(is,
- project.getBasedir().getAbsolutePath()
- + OUTPUT_RESOURCE_DIR + yangFile.getName()));
- resources.add(is);
- }
- } catch (IOException e) {
- getLog().warn("Exception while loading yang files.", e);
- }
- return yangFiles;
- }
-
- private Collection<File> getFilesFromDependencies() {
- Collection<File> yangFiles = new ArrayList<File>();
-
- try {
- List<File> filesOnCp = Util.getClassPath(project);
- List<String> filter = Lists.newArrayList(".yang");
- for (File file : filesOnCp) {
- ZipFile zip = new ZipFile(file);
- Enumeration<? extends ZipEntry> entries = zip.entries();
-
- while (entries.hasMoreElements()) {
- ZipEntry entry = entries.nextElement();
- String entryName = entry.getName();
- if (entryName.startsWith(INPUT_RESOURCE_DIR)) {
- if (entry.isDirectory()) {
- continue;
- }
- if (!Util.acceptedFilter(entryName, filter)) {
- continue;
- }
- InputStream entryStream = zip.getInputStream(entry);
- String newEntryName = entryName
- .substring(INPUT_RESOURCE_DIR.length());
- File tmp = Files.createTempDir();
- File f = createFileFromStream(entryStream,
- tmp.getAbsolutePath() + newEntryName);
- yangFiles.add(f);
-
- resources.add(entryStream);
- }
- }