From 1afe36e60a24e037881510b8c0967bd900479f48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Dywicki?= Date: Thu, 13 Dec 2018 11:28:16 +0100 Subject: [PATCH] Sources and resource generator mojo which doesn't use value sets. (#852) * Resource and sources generator mojo which doesn't use value sets. * Avoid unecessary reference to javassist. --- .../fhir/tinder/AbstractGeneratorMojo.java | 50 +++++++ .../ca/uhn/fhir/tinder/Configuration.java | 134 ++++++++++++++++++ .../tinder/TinderResourceGeneratorMojo.java | 75 ++++++++++ .../tinder/TinderSourcesGeneratorMojo.java | 53 +++++++ .../tinder/parser/BaseStructureParser.java | 4 +- 5 files changed, 314 insertions(+), 2 deletions(-) create mode 100644 hapi-tinder-plugin/src/main/java/ca/uhn/fhir/tinder/AbstractGeneratorMojo.java create mode 100644 hapi-tinder-plugin/src/main/java/ca/uhn/fhir/tinder/Configuration.java create mode 100644 hapi-tinder-plugin/src/main/java/ca/uhn/fhir/tinder/TinderResourceGeneratorMojo.java create mode 100644 hapi-tinder-plugin/src/main/java/ca/uhn/fhir/tinder/TinderSourcesGeneratorMojo.java diff --git a/hapi-tinder-plugin/src/main/java/ca/uhn/fhir/tinder/AbstractGeneratorMojo.java b/hapi-tinder-plugin/src/main/java/ca/uhn/fhir/tinder/AbstractGeneratorMojo.java new file mode 100644 index 00000000000..113b8eaaad2 --- /dev/null +++ b/hapi-tinder-plugin/src/main/java/ca/uhn/fhir/tinder/AbstractGeneratorMojo.java @@ -0,0 +1,50 @@ +package ca.uhn.fhir.tinder; + +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.Parameter; +import org.apache.maven.project.MavenProject; + +import java.io.File; +import java.util.List; + +/** + * Base class for mojo generatorss. + */ +public abstract class AbstractGeneratorMojo extends AbstractMojo { + + protected final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(getClass()); + + @Parameter(required = true, defaultValue = "${project.build.directory}/..") + protected String baseDir; + + @Parameter + protected String packageBase = ""; + + @Parameter + protected List baseResourceNames; + + @Parameter + protected List excludeResourceNames; + + @Parameter + protected String templateName; + + @Parameter(required = true) + protected String version; + + @Component + protected MavenProject myProject; + + @Override + public final void execute() throws MojoExecutionException, MojoFailureException { + doExecute(new Configuration(this.version, baseDir, getTargetDirectory(), this.packageBase, this.baseResourceNames, this.excludeResourceNames)); + } + + protected abstract void doExecute(Configuration mavenGeneratorConfiguration) throws MojoExecutionException, MojoFailureException; + + protected abstract File getTargetDirectory(); + +} diff --git a/hapi-tinder-plugin/src/main/java/ca/uhn/fhir/tinder/Configuration.java b/hapi-tinder-plugin/src/main/java/ca/uhn/fhir/tinder/Configuration.java new file mode 100644 index 00000000000..b6034ceefda --- /dev/null +++ b/hapi-tinder-plugin/src/main/java/ca/uhn/fhir/tinder/Configuration.java @@ -0,0 +1,134 @@ +package ca.uhn.fhir.tinder; + +import ca.uhn.fhir.context.FhirContext; +import ca.uhn.fhir.context.FhirVersionEnum; +import ca.uhn.fhir.tinder.parser.BaseStructureSpreadsheetParser; +import org.apache.commons.lang.WordUtils; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import java.util.TreeSet; + +public class Configuration { + + private final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(Configuration.class); + + private String version; + private File targetDirectory; + private String packageSuffix; + + private String packageBase; + private FhirContext fhirContext; + private File packageDirectoryBase; + + private final List resourceNames = new ArrayList<>(); + private String baseDir; + + public Configuration(String version, String baseDir, File targetDirectory, String packageBase, List baseResourceNames, List excludeResourceNames) { + this.targetDirectory = targetDirectory; + this.packageBase = packageBase; + this.packageDirectoryBase = new File(targetDirectory, packageBase.replace(".", File.separatorChar + "")); + + switch (version) { + case "dstu2": + fhirContext = FhirContext.forDstu2(); + break; + case "dstu3": + fhirContext = FhirContext.forDstu3(); + packageSuffix = ".dstu3"; + break; + case "r4": + fhirContext = FhirContext.forR4(); + packageSuffix = ".r4"; + break; + default: + throw new IllegalArgumentException("Unknown version configured: " + version); + } + + this.version = version; + if (baseResourceNames == null || baseResourceNames.isEmpty()) { + ourLog.info("No resource names supplied, going to use all resources from version: {}", fhirContext.getVersion().getVersion()); + + Properties p = new Properties(); + try { + p.load(fhirContext.getVersion().getFhirVersionPropertiesFile()); + } catch (IOException e) { + throw new IllegalArgumentException("Failed to load version property file", e); + } + + ourLog.debug("Property file contains: {}", p); + + TreeSet keys = new TreeSet(); + for (Object next : p.keySet()) { + keys.add((String) next); + } + for (String next : keys) { + if (next.startsWith("resource.")) { + resourceNames.add(next.substring("resource.".length()).toLowerCase()); + } + } + + if (fhirContext.getVersion().getVersion() == FhirVersionEnum.DSTU3) { + resourceNames.remove("conformance"); + } + } else { + for (String resourceName : baseResourceNames) { + resourceNames.add(resourceName.toLowerCase()); + } + } + + if (excludeResourceNames != null) { + for (String resourceName : excludeResourceNames) { + resourceNames.remove(resourceName.toLowerCase()); + } + } + + ourLog.info("Including the following resources: {}", resourceNames); + } + + public File getPackageDirectoryBase() { + return packageDirectoryBase; + } + + public String getPackageSuffix() { + return packageSuffix; + } + + public List getResourceNames() { + return resourceNames; + } + + public String getPackageBase() { + return packageBase; + } + + public String getVersion() { + return version; + } + + public String getResourcePackage() { + if (BaseStructureSpreadsheetParser.determineVersionEnum(version).isRi()) { + return "org.hl7.fhir." + version + ".model"; + } + return "ca.uhn.fhir.model." + version + ".resource"; + } + + public String getVersionCapitalized() { + String capitalize = WordUtils.capitalize(version); + if ("Dstu".equals(capitalize)) { + return "Dstu1"; + } + return capitalize; + } + + public File getTargetDirectory() { + return targetDirectory; + } + + public String getBaseDir() { + return baseDir; + } +} diff --git a/hapi-tinder-plugin/src/main/java/ca/uhn/fhir/tinder/TinderResourceGeneratorMojo.java b/hapi-tinder-plugin/src/main/java/ca/uhn/fhir/tinder/TinderResourceGeneratorMojo.java new file mode 100644 index 00000000000..2aadac24a13 --- /dev/null +++ b/hapi-tinder-plugin/src/main/java/ca/uhn/fhir/tinder/TinderResourceGeneratorMojo.java @@ -0,0 +1,75 @@ +package ca.uhn.fhir.tinder; + +import ca.uhn.fhir.tinder.parser.ResourceGeneratorUsingModel; +import ca.uhn.fhir.tinder.parser.ResourceGeneratorUsingSpreadsheet; +import org.apache.maven.model.Resource; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.VelocityEngine; +import org.apache.velocity.tools.generic.EscapeTool; + +import java.io.*; + +@Mojo(name = "generate-resource", defaultPhase = LifecyclePhase.GENERATE_RESOURCES) +public class TinderResourceGeneratorMojo extends AbstractGeneratorMojo { + + @Parameter(required = true, defaultValue = "${project.build.directory}/generated-resources/tinder") + protected File targetDirectory; + + @Parameter(required = true) + protected String fileName = ""; + + @Override + protected void doExecute(Configuration configuration) throws MojoExecutionException, MojoFailureException { + File packageDirectoryBase = configuration.getPackageDirectoryBase(); + packageDirectoryBase.mkdirs(); + + ResourceGeneratorUsingModel gen = new ResourceGeneratorUsingModel(configuration.getVersion(), configuration.getBaseDir()); + gen.setBaseResourceNames(configuration.getResourceNames()); + + try { + gen.parse(); + + VelocityContext ctx = new VelocityContext(); + ctx.put("resources", gen.getResources()); + ctx.put("packageBase", configuration.getPackageBase()); + ctx.put("version", configuration.getVersion()); + ctx.put("package_suffix", configuration.getPackageSuffix()); + ctx.put("esc", new EscapeTool()); + + ctx.put("resourcePackage", configuration.getResourcePackage()); + ctx.put("versionCapitalized", configuration.getVersionCapitalized()); + + VelocityEngine v = new VelocityEngine(); + v.setProperty("resource.loader", "cp"); + v.setProperty("cp.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + v.setProperty("runtime.references.strict", Boolean.TRUE); + + InputStream templateIs = ResourceGeneratorUsingSpreadsheet.class.getResourceAsStream(templateName); + InputStreamReader templateReader = new InputStreamReader(templateIs); + + File file = new File(packageDirectoryBase, fileName); + OutputStreamWriter w = new OutputStreamWriter(new FileOutputStream(file, false), "UTF-8"); + v.evaluate(ctx, w, "", templateReader); + w.close(); + + Resource resource = new Resource(); + resource.setDirectory(packageDirectoryBase.getAbsolutePath()); + //resource.setDirectory(targetDirectory.getAbsolutePath()); + //resource.addInclude(packageBase); + myProject.addResource(resource); + + } catch (Exception e) { + throw new MojoFailureException("Failed to generate resources", e); + } + } + + @Override + public File getTargetDirectory() { + return targetDirectory; + } +} diff --git a/hapi-tinder-plugin/src/main/java/ca/uhn/fhir/tinder/TinderSourcesGeneratorMojo.java b/hapi-tinder-plugin/src/main/java/ca/uhn/fhir/tinder/TinderSourcesGeneratorMojo.java new file mode 100644 index 00000000000..1e53068895b --- /dev/null +++ b/hapi-tinder-plugin/src/main/java/ca/uhn/fhir/tinder/TinderSourcesGeneratorMojo.java @@ -0,0 +1,53 @@ +package ca.uhn.fhir.tinder; + +import java.io.*; +import java.util.*; + +import org.apache.maven.plugin.*; +import org.apache.maven.plugins.annotations.*; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.project.MavenProject; + +import ca.uhn.fhir.context.FhirContext; +import ca.uhn.fhir.context.FhirVersionEnum; +import ca.uhn.fhir.tinder.parser.*; + +@Mojo(name = "generate-sources", defaultPhase = LifecyclePhase.GENERATE_SOURCES) +public class TinderSourcesGeneratorMojo extends AbstractGeneratorMojo { + + @Parameter(required = true, defaultValue = "${project.build.directory}/generated-sources/tinder") + protected File targetDirectory; + + @Parameter + private String filenameSuffix = "ResourceProvider"; + + @Parameter + private String filenamePrefix = ""; + + @Override + public void doExecute(Configuration configuration) throws MojoExecutionException, MojoFailureException { + File packageDirectoryBase = configuration.getPackageDirectoryBase(); + packageDirectoryBase.mkdirs(); + + ResourceGeneratorUsingModel gen = new ResourceGeneratorUsingModel(configuration.getVersion(), configuration.getBaseDir()); + gen.setBaseResourceNames(configuration.getResourceNames()); + + try { + gen.parse(); + + gen.setFilenameSuffix(filenameSuffix); + gen.setFilenamePrefix(filenamePrefix); + gen.setTemplate(templateName); + gen.writeAll(packageDirectoryBase, null, configuration.getPackageBase()); + } catch (Exception e) { + throw new MojoFailureException("Failed to generate server", e); + } + + myProject.addCompileSourceRoot(configuration.getTargetDirectory().getAbsolutePath()); + } + + @Override + protected File getTargetDirectory() { + return targetDirectory; + } +} diff --git a/hapi-tinder-plugin/src/main/java/ca/uhn/fhir/tinder/parser/BaseStructureParser.java b/hapi-tinder-plugin/src/main/java/ca/uhn/fhir/tinder/parser/BaseStructureParser.java index 63f9d423d23..f51a1147e7b 100644 --- a/hapi-tinder-plugin/src/main/java/ca/uhn/fhir/tinder/parser/BaseStructureParser.java +++ b/hapi-tinder-plugin/src/main/java/ca/uhn/fhir/tinder/parser/BaseStructureParser.java @@ -711,7 +711,7 @@ public abstract class BaseStructureParser { return null; } - public static FhirVersionEnum determineVersionEnum(String version) throws MojoFailureException { + public static FhirVersionEnum determineVersionEnum(String version) { FhirVersionEnum versionEnum; if ("dstu2".equals(version)) { versionEnum = FhirVersionEnum.DSTU2; @@ -720,7 +720,7 @@ public abstract class BaseStructureParser { } else if ("r4".equals(version)) { versionEnum = FhirVersionEnum.R4; } else { - throw new MojoFailureException("Unknown version: " + version); + throw new IllegalArgumentException("Unknown version: " + version); } return versionEnum; }