-
- 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);
- }
- }
-
- resources.add(zip);
- }
- } catch (Exception e) {
- getLog().warn("Exception while loading external yang files.", e);
- }
- return yangFiles;
- }
-
- private File createFileFromStream(InputStream is, String absoluteName)
- throws IOException {
- File f = new File(absoluteName);
- if (!f.exists()) {
- f.getParentFile().mkdirs();
- }
- f.createNewFile();
-
- FileOutputStream fos = new FileOutputStream(f);
- IOUtils.copy(is, fos);
- return f;
- }
-
- /**
- * Instantiate provider from class and call required method
- */
- private void provideResourcesWithOneProvider(Collection<File> yangFiles,
- ResourceProviderArg resourceProvider)
- throws ClassNotFoundException, InstantiationException,
- IllegalAccessException {
-
- resourceProvider.check();
-
- ResourceGenerator g = Util.getInstance(
- resourceProvider.getResourceProviderClass(),
- ResourceGenerator.class);
- getLog().info(
- Util.message("Resource provider instantiated from %s",
- LOG_PREFIX, resourceProvider.getResourceProviderClass()));
-
- g.generateResourceFiles(yangFiles, resourceProvider.getOutputBaseDir());
- getLog().info(
- Util.message("Resource provider %s call successful",
- LOG_PREFIX, resourceProvider.getResourceProviderClass()));
- }
-
- /**
- * Call generate on every generator from plugin configuration
- */
- private void generateSources(ContextHolder context)
- throws MojoFailureException {
- if (codeGenerators.length == 0) {
- getLog().warn(
- Util.message("No code generators provided", LOG_PREFIX));
- return;
- }
-
- Map<String, String> thrown = Maps.newHashMap();
- for (CodeGeneratorArg codeGenerator : codeGenerators) {
- try {
- generateSourcesWithOneGenerator(context, codeGenerator);
- } catch (Exception e) {
- // try other generators, exception will be thrown after
- getLog().error(
- Util.message(
- "Unable to generate sources with %s generator",
- LOG_PREFIX,
- codeGenerator.getCodeGeneratorClass()), e);
- thrown.put(codeGenerator.getCodeGeneratorClass(), e.getClass()
- .getCanonicalName());
- }
- }
-
- if (!thrown.isEmpty()) {
- String message = Util
- .message(
- "One or more code generators failed, including failed list(generatorClass=exception) %s",
- LOG_PREFIX, thrown.toString());
- getLog().error(message);
- throw new MojoFailureException(message);
- }
- }
-
- /**
- * Instantiate generator from class and call required method
- */
- private void generateSourcesWithOneGenerator(ContextHolder context,
- CodeGeneratorArg codeGeneratorCfg) throws ClassNotFoundException,
- InstantiationException, IllegalAccessException, IOException {
-
- codeGeneratorCfg.check();
-
- CodeGenerator g = Util.getInstance(
- codeGeneratorCfg.getCodeGeneratorClass(), CodeGenerator.class);
- getLog().info(
- Util.message("Code generator instantiated from %s", LOG_PREFIX,
- codeGeneratorCfg.getCodeGeneratorClass()));
-
- File outputDir = codeGeneratorCfg.getOutputBaseDir();
- if (project != null && outputDir != null) {
- project.addCompileSourceRoot(outputDir.getPath());
- }
- Collection<File> generated = g.generateSources(context.getContext(),
- outputDir, context.getYangModulesNames());
- getLog().info(
- Util.message("Sources generated by %s: %s", LOG_PREFIX,
- codeGeneratorCfg.getCodeGeneratorClass(), generated));
- }
-
- /**
- * Collection of resources which should be closed after use.
- */
- private final List<Closeable> resources = new ArrayList<Closeable>();
-
- /**
- * Search for yang files in dependent projects.
- *
- * @return files found as List of InputStream
- */
- private List<InputStream> getFilesFromDependenciesAsStream() {
- final List<InputStream> yangsFromDependencies = new ArrayList<InputStream>();
- 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);
- yangsFromDependencies.add(entryStream);
- resources.add(entryStream);
- }
-
- }
- resources.add(zip);
- }
- } catch (Exception e) {
- getLog().warn("Exception while searching yangs in dependencies", e);
- }
- return yangsFromDependencies;
- }
-
- /**
- * Internal utility method for closing open resources.
- */
- private void closeResources() {
- for (Closeable resource : resources) {
- try {
- resource.close();
- } catch (IOException e) {
- getLog().warn("Failed to close resources: " + resource, e);
- }
- }
- }
-
- private class ContextHolder {
- private final SchemaContext context;
- private final Set<String> yangModulesNames;
-
- private ContextHolder(SchemaContext context,
- Set<String> yangModulesNames) {
- this.context = context;
- this.yangModulesNames = yangModulesNames;
- }
-
- public SchemaContext getContext() {
- return context;
- }
-
- public Set<String> getYangModulesNames() {
- return yangModulesNames;
- }
- }
-