diff --git a/src/main/groovy/to/wetransform/halecli/project/alignment/ExportAlignmentCommand.groovy b/src/main/groovy/to/wetransform/halecli/project/alignment/ExportAlignmentCommand.groovy new file mode 100644 index 0000000..6a74c54 --- /dev/null +++ b/src/main/groovy/to/wetransform/halecli/project/alignment/ExportAlignmentCommand.groovy @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018 wetransform GmbH + * + * All rights reserved. This program and the accompanying materials are made + * available under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution. If not, see . + * + * Contributors: + * wetransform GmbH + */ + +package to.wetransform.halecli.project.alignment + +import java.net.URI + +import eu.esdihumboldt.hale.common.cli.project.AbstractProjectEnvironmentCommand +import eu.esdihumboldt.hale.common.core.report.ReportHandler +import eu.esdihumboldt.hale.common.headless.impl.ProjectTransformationEnvironment +import eu.esdihumboldt.util.cli.CommandContext +import groovy.util.OptionAccessor +import to.wetransform.halecli.util.AlignmentCLI + +/** + * Command to export an alignment. + * + * @author Simon Templer + */ +class ExportAlignmentCommand extends AbstractProjectEnvironmentCommand { + + void setupOptions(CliBuilder cli) { + super.setupOptions(cli) + + // options for saving alignment + AlignmentCLI.saveAlignmentOptions(cli) + } + + @Override + public boolean runForProject(ProjectTransformationEnvironment project, URI projectLocation, OptionAccessor options, + CommandContext context, ReportHandler reports) { + //FIXME restrict to use with single project?! Or support multi-project execution? + + AlignmentCLI.saveAlignment(project.alignment, project.sourceSchema, project.targetSchema, options) + + return true + } + + final String shortDescription = 'Export a project alignment with specific settings' + + final boolean experimental = true + +} diff --git a/src/main/groovy/to/wetransform/halecli/util/AlignmentCLI.groovy b/src/main/groovy/to/wetransform/halecli/util/AlignmentCLI.groovy new file mode 100644 index 0000000..76524ad --- /dev/null +++ b/src/main/groovy/to/wetransform/halecli/util/AlignmentCLI.groovy @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018 wetransform GmbH + * + * All rights reserved. This program and the accompanying materials are made + * available under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the License, + * or (at your option) any later version. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution. If not, see . + * + * Contributors: + * wetransform GmbH + */ + +package to.wetransform.halecli.util + +import static eu.esdihumboldt.hale.app.transform.ExecUtil.fail; +import static to.wetransform.halecli.util.HaleIOHelper.* + +import java.io.InputStream +import java.net.URI; +import java.util.Map + +import eu.esdihumboldt.hale.common.align.io.AlignmentWriter +import eu.esdihumboldt.hale.common.align.model.Alignment +import eu.esdihumboldt.hale.common.cli.HaleCLIUtil; +import eu.esdihumboldt.hale.common.core.io.HaleIO +import eu.esdihumboldt.hale.common.core.io.Value +import eu.esdihumboldt.hale.common.core.io.impl.LogProgressIndicator; +import eu.esdihumboldt.hale.common.core.io.project.model.IOConfiguration; +import eu.esdihumboldt.hale.common.core.io.report.IOReport; +import eu.esdihumboldt.hale.common.core.io.supplier.DefaultInputSupplier; +import eu.esdihumboldt.hale.common.core.io.supplier.LocatableInputSupplier; +import eu.esdihumboldt.hale.common.core.report.ReportHandler +import eu.esdihumboldt.hale.common.instance.io.InstanceReader +import eu.esdihumboldt.hale.common.instance.io.InstanceWriter; +import eu.esdihumboldt.hale.common.instance.model.InstanceCollection; +import eu.esdihumboldt.hale.common.schema.io.SchemaIO; +import eu.esdihumboldt.hale.common.schema.io.SchemaReader +import eu.esdihumboldt.hale.common.schema.io.SchemaWriter; +import eu.esdihumboldt.hale.common.schema.model.Schema +import eu.esdihumboldt.hale.common.schema.model.SchemaSpace; +import eu.esdihumboldt.hale.common.schema.model.impl.DefaultSchemaSpace +import eu.esdihumboldt.util.Pair; +import eu.esdihumboldt.util.cli.CLIUtil +import groovy.transform.CompileStatic +import groovy.util.CliBuilder +import groovy.util.OptionAccessor;;;; + +/** + * Common utility functions for setting up a CliBuilder for processing alignments. + * + * @author Simon Templer + */ +class AlignmentCLI { + + // save alignment + + static void saveAlignmentOptions(CliBuilder cli, String argName = 'target', String descr = 'Target location') { + cli._(longOpt: argName, args:1, argName: 'file-or-URI', descr) + cli._(longOpt: argName + '-setting', args:2, valueSeparator:'=', argName:'setting=value', + 'Setting for target writer (optional, repeatable)') + cli._(longOpt: argName + '-writer', args:1, argName: 'provider-id', + 'Identifier of alignment writer to use') + } + + private static AlignmentWriter getWriter(OptionAccessor options, String argName = 'target') { + def location = options."$argName" + if (location) { + URI loc = CLIUtil.fileOrUri(location) + + def settings = options."${argName}-settings" + settings = settings ? settings.toSpreadMap() : [:] + + String providerId = options."${argName}-writer" ?: null + + return getWriter(loc, settings, providerId) + } + else { + return null + } + } + + @CompileStatic + private static AlignmentWriter getWriter(URI loc, Map settings, String providerId) { + return prepareWriter(providerId, AlignmentWriter, settings, loc); + } + + @CompileStatic + static IOReport saveAlignment(Alignment alignment, SchemaSpace sourceSchema, SchemaSpace targetSchema, + OptionAccessor options, String argName = 'target') { + AlignmentWriter writer = getWriter(options, argName) + def loc = writer.getTarget()?.location + println "Writing alignment to ${loc}..." + + writer.setAlignment(alignment) + writer.setSourceSchema(sourceSchema) + writer.setTargetSchema(targetSchema) + + IOReport report = writer.execute(new LogProgressIndicator()) + HaleCLIUtil.createReportHandler(options).publishReport(report) + + return report + } + +} diff --git a/src/main/resources/plugin.xml b/src/main/resources/plugin.xml index 110c8e1..fddf737 100644 --- a/src/main/resources/plugin.xml +++ b/src/main/resources/plugin.xml @@ -72,5 +72,11 @@ id="hale-cli.schema.rewrite" name="rewrite"> + +