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

com.sap.cloud.sdk.service.csn2jpa.mvn.Csn2JpaPlugin Maven / Gradle / Ivy

/*******************************************************************************
 * * © 2018 SAP SE or an SAP affiliate company. All rights reserved. *
 ******************************************************************************/
package com.sap.cloud.sdk.service.csn2jpa.mvn;

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.function.Consumer;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;

import com.sap.cloud.sdk.service.cds.tools.generator.api.FileSystem;
import com.sap.cloud.sdk.service.cds.tools.generator.api.GeneratedFile;
import com.sap.cloud.sdk.service.cds.tools.generator.api.GeneratorMode;
import com.sap.cloud.sdk.service.cds.tools.generator.api.AbstractGenerator.Result;
import com.sap.cloud.sdk.service.cds.tools.generator.api.AbstractGenerator.Result.Status;
import com.sap.cloud.sdk.service.cds.tools.reader.issuecollector.IssueType;
import com.sap.cloud.sdk.service.csn2jpa.api.Csn2Jpa;
import com.sap.cloud.sdk.service.csn2jpa.jpa.Configuration;
import com.sap.cloud.sdk.service.csn2jpa.jpa.ConfigurationImpl;

@Mojo(name = "csn2jpa", defaultPhase = LifecyclePhase.GENERATE_RESOURCES, threadSafe = false, requiresProject = false)
public class Csn2JpaPlugin extends AbstractMojo {

	@Parameter(property = "csnFile", required = true)
	private String csnFile;

	@Parameter(property = "outputDirectory", required = false, defaultValue = "src/gen")
	private String outputDirectory;

	@Parameter(property = "persistenceXml", required = false)
	private String persistenceXml;

	@Parameter(property = "persistenceUnitName", required = false)
	private String persistenceUnitName;

	@Parameter(property = "persistenceProvider", required = false)
	private String persistenceProvider;

	@Parameter(property = "basePackage", required = false)
	private String basePackage;

	@Parameter(property = "namingScheme", required = false)
	private String namingScheme;

	@Parameter(property = "generateEnums", required = false)
	private boolean generateEnums;

	@Parameter(property = "implementSerializable", required = false)
	private boolean implementSerializable;

	@Parameter(property = "parserMode", required = false)
	private String parserMode;

	@Parameter(property = "generatorMode", required = false)
	private String generatorMode;

	@Override
	public void execute() throws MojoFailureException {
		Configuration cfg;
		Result result;
		try {
			cfg = createConfig();
			GeneratedFile.Accessor fs = new FileSystem(Paths.get(outputDirectory), true);
			result = new Csn2Jpa(cfg).generate(() -> Files.readAllBytes(Paths.get(csnFile)), fs, fs);

		} catch (Exception e) { // NOSONAR: catch all exceptions
			throw new MojoFailureException("Failed to generate JPA classes: ", e);
		}

		final Log logger = getLog();
		if (result.getStatus() == Status.SUCCESS) {
			logger.info("Class generation finished successfull");
		} else {
			logger.error("Class generation failed");
		}

		result.getIssues().stream().forEach(issue -> {
			String msg = String.format("[%s] %s : %s", issue.getType(), issue.getLocation(), issue.getMessage());
			if ((issue.getType() == IssueType.CRITICAL)
					|| (issue.getType() == IssueType.ERROR && cfg.getGeneratorMode() == GeneratorMode.STRICT)) {
				logger.error(msg);
			} else {
				logger.warn(msg);
			}
		});

		if (result.getStatus() == Status.FAILURE) {
			throw new MojoFailureException("Failed to generate JPA classes");
		}
	}

	private Configuration createConfig() {
		ConfigurationImpl cfg = new ConfigurationImpl();
		setIfNotNull(cfg::setPersistenceXml, persistenceXml);
		setIfNotNull(cfg::setPersistenceUnitName, persistenceUnitName);
		setIfNotNull(cfg::setPersistenceProvider, persistenceProvider);
		setIfNotNull(cfg::setBasePackage, basePackage);
		setIfNotNull(cfg::setImplementSerializable, implementSerializable);
		setIfNotNull(cfg::setGenerateEnums, generateEnums);
		setIfNotNull(cfg::setParserMode, parserMode);
		setIfNotNull(cfg::setGeneratorMode, generatorMode);
		setIfNotNull(cfg::setNamingScheme, namingScheme);

		return cfg;
	}

	private  void setIfNotNull(Consumer setter, T value) {
		if (value != null) {
			setter.accept(value);
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy