All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.sarl.maven.docs.generator.SARLDocGenerate Maven / Gradle / Ivy

There is a newer version: 0.12.0
Show newest version
/*
 * $Id: io/sarl/maven/docs/generator/SARLDocGenerate.java v0.3.1 2016-01-23 23:01:10$
 *
 * SARL is an general-purpose agent programming language.
 * More details on http://www.sarl.io
 *
 * Copyright (C) 2014-2015 the original authors or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package io.sarl.maven.docs.generator;

import java.io.File;
import java.io.FileInputStream;
import java.io.FilenameFilter;
import java.net.URI;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map.Entry;

import com.google.common.base.Function;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.Provider;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.apache.maven.project.MavenProject;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.xtend.core.compiler.batch.XtendBatchCompiler;
import org.eclipse.xtend.lib.macro.file.Path;
import org.eclipse.xtend.maven.MavenProjectAdapter;
import org.eclipse.xtend.maven.XtendTestCompile;
import org.eclipse.xtext.ISetup;
import org.eclipse.xtext.util.Strings;
import org.eclipse.xtext.xbase.file.ProjectConfig;
import org.eclipse.xtext.xbase.file.RuntimeWorkspaceConfigProvider;
import org.eclipse.xtext.xbase.file.WorkspaceConfig;
import org.jnario.compiler.HtmlAssetsCompiler;
import org.jnario.compiler.JnarioDocCompiler;
import org.jnario.feature.FeatureStandaloneSetup;
import org.jnario.maven.JnarioMavenProjectResourceSetProvider;
import org.jnario.report.Executable2ResultMapping;
import org.jnario.report.HashBasedSpec2ResultMapping;
import org.jnario.report.SpecResultParser;
import org.jnario.suite.SuiteStandaloneSetup;

/** Maven MOJO that is generating the documentation for the SARL project.
 *
 * 

Copied from JnarioDocGenerate (version 1.0.1). * * @author Stéphane Galland * @version 0.3.1 2016-01-23 23:01:10 * @mavengroupid io.sarl.maven * @mavenartifactid io.sarl.maven.docs.generator */ @Mojo(name = "generate", requiresDependencyResolution = ResolutionScope.TEST) public class SARLDocGenerate extends XtendTestCompile { /** * Location of the generated documentation. */ @Parameter(defaultValue = "${basedir}/target/jnario-doc", required = true) protected String docOutputDirectory; /** * Location of the generated JUnit XML reports. */ @Parameter(defaultValue = "${basedir}/target/surefire-reports", required = true) protected String reportsDirectory; /** * Location of the generated JUnit XML reports. */ @Parameter protected String sourceDirectory; /** * Location of the generated JUnit XML reports. */ @Parameter(defaultValue = "true") protected boolean sectionNumbering; /** * The project itself. This parameter is set by maven. */ @Parameter(required = true, defaultValue = "${project}") @SuppressWarnings("hiding") protected MavenProject project; /** * Set this to true to skip compiling Xtend sources. */ @Parameter(defaultValue = "false") @SuppressWarnings("hiding") protected boolean skipXtend; /** * Xtend-File encoding argument for the compiler. */ @Parameter(defaultValue = "${project.build.sourceEncoding}") @SuppressWarnings("hiding") protected String encoding; /** * Set this to false to suppress the creation of *._trace files. */ @Parameter(defaultValue = "true") @SuppressWarnings("hiding") protected boolean writeTraceFiles; @Inject private RuntimeWorkspaceConfigProvider workspaceConfigProvider; private Provider resourceSetProvider; @Override protected void internalExecute() throws MojoExecutionException { // Only for injecting the attributes from Maven. super.project = this.project; super.skipXtend = this.skipXtend; super.encoding = this.encoding; super.writeTraceFiles = this.writeTraceFiles; getLog().debug("Set section numbering: " + Boolean.toString(this.sectionNumbering)); //$NON-NLS-1$ MavenConfig.setSectionNumbering(this.sectionNumbering); getLog().info("Generating Jnario reports to " + this.docOutputDirectory); //$NON-NLS-1$ // the order is important, the suite compiler must be executed last List injectors = createInjectors( new SARLSpecStandaloneSetup(), new FeatureStandaloneSetup(), new SuiteStandaloneSetup()); generateCssAndJsFiles(injectors); this.resourceSetProvider = new JnarioMavenProjectResourceSetProvider(this.project); HashBasedSpec2ResultMapping resultMapping = createSpec2ResultMapping(injectors); for (Injector injector : injectors) { generateDoc(injector, resultMapping); } } /** * @param injectors - the injector list. * @return the mapping * @throws MojoExecutionException when no Surefire report was found. */ protected HashBasedSpec2ResultMapping createSpec2ResultMapping(List injectors) throws MojoExecutionException { HashBasedSpec2ResultMapping resultMapping = injectors.get(2).getInstance(HashBasedSpec2ResultMapping.class); File reportFolder = new File(this.reportsDirectory); if (reportFolder.exists()) { addExecutionResults(resultMapping, reportFolder); } else { throw new MojoExecutionException("Surefire Report folder does not exist"); //$NON-NLS-1$ } return resultMapping; } /** * @param injectors - the injector list. */ protected void generateCssAndJsFiles(List injectors) { HtmlAssetsCompiler assetsCompiler = injectors.get(0).getInstance(HtmlAssetsCompiler.class); assetsCompiler.setOutputPath(this.docOutputDirectory); getLog().info("Generating HTML assets to " + this.docOutputDirectory); //$NON-NLS-1$ assetsCompiler.compile(); } /** * @param resultMapping - the result mapping * @param reportFolder - the report folder. * @throws MojoExecutionException when parsing error. */ protected void addExecutionResults(HashBasedSpec2ResultMapping resultMapping, File reportFolder) throws MojoExecutionException { SpecResultParser specResultParser = new SpecResultParser(); for (File file : reportFolder.listFiles(new XmlFiles())) { try (FileInputStream is = new FileInputStream(file)) { specResultParser.parse(is, resultMapping); } catch (Exception e) { throw new MojoExecutionException("Exception while parsing spec for: " + file, e); //$NON-NLS-1$ } } } @Override protected void compileTestSources(XtendBatchCompiler xtend2BatchCompiler) throws MojoExecutionException { List testCompileSourceRoots = Lists.newArrayList(this.project.getTestCompileSourceRoots()); String testClassPath = Strings.concat(File.pathSeparator, getTestClassPath()); if (this.sourceDirectory != null && !this.sourceDirectory.isEmpty()) { testCompileSourceRoots = Collections.singletonList(this.sourceDirectory); } getLog().debug("source folders: " + testCompileSourceRoots); //$NON-NLS-1$ compile(xtend2BatchCompiler, testClassPath, testCompileSourceRoots, this.docOutputDirectory); } private void generateDoc(Injector injector, Executable2ResultMapping resultMapping) throws MojoExecutionException { JnarioDocCompiler docCompiler = injector.getInstance(JnarioDocCompiler.class); docCompiler.setExecutable2ResultMapping(resultMapping); compileTestSources(docCompiler); } @Override protected void compile(XtendBatchCompiler xtend2BatchCompiler, String classPath, List sourceDirectories, String outputPath) throws MojoExecutionException { configureWorkspace(sourceDirectories, outputPath); this.resourceSetProvider.get().eAdapters().clear(); xtend2BatchCompiler.setResourceSetProvider(this.resourceSetProvider); MavenProjectAdapter.install(this.resourceSetProvider.get(), this.project); Iterable filtered = Iterables.filter(sourceDirectories, FILE_EXISTS); if (Iterables.isEmpty(filtered)) { getLog().info( "skip compiling sources because the configured directory '" //$NON-NLS-1$ + Iterables.toString(sourceDirectories) + "' does not exists."); //$NON-NLS-1$ return; } getLog().debug("Set temp directory: " + getTempDirectory()); //$NON-NLS-1$ xtend2BatchCompiler.setTempDirectory(getTempDirectory()); getLog().debug("Set DeleteTempDirectory: " + false); //$NON-NLS-1$ xtend2BatchCompiler.setDeleteTempDirectory(false); getLog().debug("Set classpath: " + classPath); //$NON-NLS-1$ xtend2BatchCompiler.setClassPath(classPath); getLog().debug("Set source path: " + Strings.concat(File.pathSeparator, Lists.newArrayList(filtered))); //$NON-NLS-1$ xtend2BatchCompiler.setSourcePath(Strings.concat(File.pathSeparator, Lists.newArrayList(filtered))); getLog().debug("Set output path: " + outputPath); //$NON-NLS-1$ xtend2BatchCompiler.setOutputPath(outputPath); getLog().debug("Set encoding: " + this.encoding); //$NON-NLS-1$ xtend2BatchCompiler.setFileEncoding(this.encoding); getLog().debug("Set writeTraceFiles: " + this.writeTraceFiles); //$NON-NLS-1$ xtend2BatchCompiler.setWriteTraceFiles(this.writeTraceFiles); if (!xtend2BatchCompiler.compile()) { throw new MojoExecutionException("Error compiling xtend sources in '" //$NON-NLS-1$ + Strings.concat(File.pathSeparator, Lists.newArrayList(filtered)) + "'."); //$NON-NLS-1$ } } private void configureWorkspace(List sourceDirectories, String outputPath) throws MojoExecutionException { WorkspaceConfig workspaceConfig = new WorkspaceConfig(this.project.getBasedir().getParentFile().getAbsolutePath()); ProjectConfig projectConfig = new ProjectConfig(this.project.getBasedir().getName()); URI absoluteRootPath = this.project.getBasedir().getAbsoluteFile().toURI(); URI relativizedTarget = absoluteRootPath.relativize(new File(outputPath).toURI()); if (relativizedTarget.isAbsolute()) { throw new MojoExecutionException("Output path '" + outputPath //$NON-NLS-1$ + "' must be a child of the project folder '" + absoluteRootPath + "'"); //$NON-NLS-1$ //$NON-NLS-2$ } for (String source : sourceDirectories) { URI relativizedSrc = absoluteRootPath.relativize(new File(source).toURI()); if (relativizedSrc.isAbsolute()) { throw new MojoExecutionException("Source folder " + source //$NON-NLS-1$ + " must be a child of the project folder " + absoluteRootPath); //$NON-NLS-1$ } projectConfig.addSourceFolderMapping(relativizedSrc.getPath(), relativizedTarget.getPath()); } workspaceConfig.addProjectConfig(projectConfig); this.workspaceConfigProvider.setWorkspaceConfig(workspaceConfig); if (getLog().isDebugEnabled()) { getLog().debug("WS config root: " + workspaceConfig.getAbsoluteFileSystemPath()); //$NON-NLS-1$ getLog().debug("Project name: " + projectConfig.getName()); //$NON-NLS-1$ getLog().debug("Project root path: " + projectConfig.getRootPath()); //$NON-NLS-1$ for (Entry entry : projectConfig.getSourceFolderMappings().entrySet()) { getLog().debug("Source path: " + entry.getKey() + " -> " + entry.getValue()); //$NON-NLS-1$//$NON-NLS-2$ } } } private static List createInjectors(ISetup... setups) { return Lists.transform(Arrays.asList(setups), new Function() { @Override public Injector apply(ISetup input) { return input.createInjectorAndDoEMFRegistration(); } }); } /** Copied from JnarioDocGenerate (version 1.0.1). * * @author Stéphane Galland * @version 0.3.1 2016-01-23 23:01:10 * @mavengroupid io.sarl.maven * @mavenartifactid io.sarl.maven.docs.generator */ private final class XmlFiles implements FilenameFilter { XmlFiles() { // } @Override public boolean accept(File dir, String name) { return name.endsWith("xml"); //$NON-NLS-1$ } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy