/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.plugin.typescript.dto;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.LifecyclePhase;
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.apache.maven.project.MavenProjectHelper;
import java.io.File;
import java.io.IOException;
import java.io.Writer;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
/**
* Mojo for generating TypeScript DTO interface + implementation for handling JSON data.
* @author Florent Benoit
*/
@Mojo(name = "build",
defaultPhase = LifecyclePhase.PACKAGE,
requiresProject = true,
requiresDependencyCollection = ResolutionScope.RUNTIME)
public class TypeScriptDTOGeneratorMojo extends AbstractMojo {
/**
* Project providing artifact id, version and dependencies.
*/
@Parameter(defaultValue = "${project}", readonly = true)
private MavenProject project;
/**
* build directory used to write the intermediate bom file.
*/
@Parameter(defaultValue = "${project.build.directory}")
private File targetDirectory;
@Component
private MavenProjectHelper projectHelper;
/**
* Path to the generated typescript file
*/
private File typescriptFile;
/**
* Use of classpath instead of classloader
*/
private boolean useClassPath;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info("Generating TypeScript DTO");
TypeScriptDtoGenerator typeScriptDtoGenerator = new TypeScriptDtoGenerator();
typeScriptDtoGenerator.setUseClassPath(useClassPath);
// define output path for the file to write with typescript definition
String output = typeScriptDtoGenerator.execute();
this.typescriptFile = new File(targetDirectory, project.getArtifactId() + ".ts");
File parentDir = this.typescriptFile.getParentFile();
if (!parentDir.exists() && !parentDir.mkdirs()) {
throw new MojoExecutionException("Unable to create a directory for writing DTO typescript file '" + parentDir + "'.");
}
try (Writer fileWriter = Files.newBufferedWriter(this.typescriptFile.toPath(), StandardCharsets.UTF_8)) {
fileWriter.write(output);
} catch (IOException e) {
throw new MojoExecutionException("Cannot write DTO typescript file");
}
// attach this typescript file as maven artifact
projectHelper.attachArtifact(project, "ts", typescriptFile);
}
/**
* Gets the TypeScript generated file
* @return the generated file TypeScript link
*/
public File getTypescriptFile() {
return typescriptFile;
}
/**
* Allow to configure generator to use classpath instead of classloader
* @param useClassPath true if want to use classpath loading
*/
public void setUseClassPath(boolean useClassPath) {
this.useClassPath = useClassPath;
}
}