diff --git a/jcore-pipeline-builder-base/src/main/java/de/julielab/jcore/pipeline/builder/base/main/JCoReUIMAPipeline.java b/jcore-pipeline-builder-base/src/main/java/de/julielab/jcore/pipeline/builder/base/main/JCoReUIMAPipeline.java index 3c7f15c..b3bbe49 100644 --- a/jcore-pipeline-builder-base/src/main/java/de/julielab/jcore/pipeline/builder/base/main/JCoReUIMAPipeline.java +++ b/jcore-pipeline-builder-base/src/main/java/de/julielab/jcore/pipeline/builder/base/main/JCoReUIMAPipeline.java @@ -482,7 +482,7 @@ private void storeCPE(File descDir, File cmFile, File aaeFile, File ccFile) { // I'm actually not sure why we need 'allDelegates' and 'aaeElements'. Perhaps we don't. Try it when there is time. private AnalysisEngineDescription createAAE(File descDir, String name, List allDelegates, Stream aaeElements, boolean filterDeactivated, Description flowControllerDescription) throws ResourceInitializationException, SAXException, IOException, InvalidXMLException, PipelineIOException { - AnalysisEngineDescription aaeDesc = flowControllerDescription == null ? AnalysisEngineFactory.createEngineDescription(aaeElements.toArray(AnalysisEngineDescription[]::new)) : AnalysisEngineFactory.createEngineDescription(flowControllerDescription.getDescriptorAsFlowControllerDescriptor(), aaeElements.toArray(AnalysisEngineDescription[]::new)); + AnalysisEngineDescription aaeDesc = flowControllerDescription == null || !flowControllerDescription.isActive() ? AnalysisEngineFactory.createEngineDescription(aaeElements.toArray(AnalysisEngineDescription[]::new)) : AnalysisEngineFactory.createEngineDescription(flowControllerDescription.getDescriptorAsFlowControllerDescriptor(), aaeElements.toArray(AnalysisEngineDescription[]::new)); Map delegatesWithImports = aaeDesc.getDelegateAnalysisEngineSpecifiersWithImports(); delegatesWithImports.clear(); List flowNames = new ArrayList<>(); @@ -618,26 +618,6 @@ public void storeArtifacts(File directory) throws MavenException { if (ccDelegates != null) descriptions = Stream.concat(descriptions, ccDelegates.stream().filter(d -> Objects.nonNull(d.getMetaDescription()))); storeArtifactsOfDescriptions(descriptions, libDir); - -// File libDir = new File(directory.getAbsolutePath() + File.separator + DIR_LIB); -// if (!libDir.exists()) -// libDir.mkdirs(); -// if (crDescription != null && crDescription.getMetaDescription() != null) { -// AetherUtilities.storeArtifactWithDependencies(crDescription.getMetaDescription().getMavenArtifact(), libDir); -// } -// Consumer storeArtifacts = desc -> { -// try { -// AetherUtilities.storeArtifactWithDependencies(desc.getMetaDescription().getMavenArtifact(), libDir); -// } catch (MavenException e) { -// log.error("Could not store dependencies of description {}", desc, e); -// } -// }; -// if (cmDelegates != null) -// cmDelegates.stream().filter(d -> Objects.nonNull(d.getMetaDescription())).forEach(storeArtifacts); -// if (aeDelegates != null) -// aeDelegates.stream().filter(d -> !d.getMetaDescription().isPear() && Objects.nonNull(d.getMetaDescription())).forEach(storeArtifacts); -// if (ccDelegates != null) -// ccDelegates.stream().filter(d -> Objects.nonNull(d.getMetaDescription())).forEach(storeArtifacts); } /** diff --git a/jcore-pipeline-builder-cli/src/main/java/de/julielab/jcore/pipeline/builder/cli/menu/MultiValuedParameterEditingMenuItem.java b/jcore-pipeline-builder-cli/src/main/java/de/julielab/jcore/pipeline/builder/cli/menu/MultiValuedParameterEditingMenuItem.java index d79743a..de090fa 100644 --- a/jcore-pipeline-builder-cli/src/main/java/de/julielab/jcore/pipeline/builder/cli/menu/MultiValuedParameterEditingMenuItem.java +++ b/jcore-pipeline-builder-cli/src/main/java/de/julielab/jcore/pipeline/builder/cli/menu/MultiValuedParameterEditingMenuItem.java @@ -1,11 +1,14 @@ package de.julielab.jcore.pipeline.builder.cli.menu; -import de.julielab.jcore.pipeline.builder.base.main.Description; import de.julielab.jcore.pipeline.builder.cli.menu.dialog.IMenuDialog; import de.julielab.jcore.pipeline.builder.cli.util.PrintLine; import de.julielab.jcore.pipeline.builder.cli.util.TextIOUtils; import org.apache.commons.lang.StringUtils; +import org.apache.uima.resource.ConfigurableDataResourceSpecifier; +import org.apache.uima.resource.ResourceCreationSpecifier; +import org.apache.uima.resource.ResourceSpecifier; import org.apache.uima.resource.metadata.ConfigurationParameter; +import org.apache.uima.resource.metadata.ResourceMetaData; import org.beryx.textio.TextIO; import java.util.ArrayList; @@ -18,11 +21,11 @@ public class MultiValuedParameterEditingMenuItem implements IMenuDialog { - private final Description description; + private final ResourceSpecifier descriptor; private final ConfigurationParameter parameter; - public MultiValuedParameterEditingMenuItem(Description description, ConfigurationParameter parameter) { - this.description = description; + public MultiValuedParameterEditingMenuItem(ResourceSpecifier description, ConfigurationParameter parameter) { + this.descriptor = description; this.parameter = parameter; } @@ -43,40 +46,55 @@ public void setParameterValue(TextIO textIO) { lineStream = Stream.concat(lineStream, Stream.of(TextIOUtils.createPrintLine("No parameter description is available.", DEFAULT))); TextIOUtils.printLines(lineStream, textIO); - Object[] array = (Object[]) description.getConfigurationParameterValue(parameter.getName()); + ResourceMetaData md; + if (descriptor instanceof ResourceCreationSpecifier) { + md = ((ResourceCreationSpecifier) descriptor).getMetaData(); + } else if (descriptor instanceof ConfigurableDataResourceSpecifier) { + md = ((ConfigurableDataResourceSpecifier) descriptor).getMetaData(); + } else { + throw new IllegalArgumentException("Unhandled descriptor type " + descriptor.getClass().getCanonicalName() + ". This type must be explicitly handled in the code, contact the developer."); + } + + Object[] array = (Object[]) md.getConfigurationParameterSettings().getParameterValue(parameter.getName()); if (array == null) array = new Object[0]; printCurrentValues(array, textIO); - String response = textIO.newGenericInputReader(null).withNumberedPossibleValues( - "Add element", - "Remove element", - "Back"). - read("Select an action:"); - switch (response) { - case "Add element": - while ((array = addValue(array, textIO)) != null) { - description.setConfigurationParameterValue(parameter.getName(), array); - printCurrentValues(array, textIO); - } - break; - - case "Remove element": - Integer toRemove; - do { - toRemove = textIO.newIntInputReader().withMinVal(0).withMaxVal(array.length).withDefaultValue(0).read("Select an item to remove or 0 for none:"); - if (toRemove > 0) { - List objList = new ArrayList<>(Arrays.asList(array)); - objList.remove(toRemove - 1); - array = objList.toArray(new Object[0]); - description.setConfigurationParameterValue(parameter.getName(), array); + String response; + do { + response = textIO.newGenericInputReader(null).withNumberedPossibleValues( + "Add element", + "Remove element", + "Back"). + withDefaultValue("Back"). + read("Select an action:"); + switch (response) { + case "Add element": + while ((array = addValue(array, textIO)) != null) { + md.getConfigurationParameterSettings().setParameterValue(parameter.getName(), array); printCurrentValues(array, textIO); } - } while (toRemove > 0); - break; - } - - + // The loop above terminates when the input value is null which sets the local 'array' variable + // to null. But the do-while continues to work on 'array' in the next round, if more user + // wishes to make more changes. Thus, we need to set the complete current value to the variable. + array = (Object[]) md.getConfigurationParameterSettings().getParameterValue(parameter.getName()); + break; + + case "Remove element": + Integer toRemove; + do { + toRemove = textIO.newIntInputReader().withMinVal(0).withMaxVal(array.length).withDefaultValue(0).read("Select an item to remove or 0 for none:"); + if (toRemove > 0) { + List objList = new ArrayList<>(Arrays.asList(array)); + objList.remove(toRemove - 1); + array = objList.toArray(new Object[0]); + md.getConfigurationParameterSettings().setParameterValue(parameter.getName(), array); + printCurrentValues(array, textIO); + } + } while (toRemove > 0); + break; + } + } while (!response.equals("Back")); } private void printCurrentValues(Object[] array, TextIO textIO) { diff --git a/jcore-pipeline-builder-cli/src/main/java/de/julielab/jcore/pipeline/builder/cli/menu/dialog/ActivationDialog.java b/jcore-pipeline-builder-cli/src/main/java/de/julielab/jcore/pipeline/builder/cli/menu/dialog/ActivationDialog.java index ce0a85d..28b6881 100644 --- a/jcore-pipeline-builder-cli/src/main/java/de/julielab/jcore/pipeline/builder/cli/menu/dialog/ActivationDialog.java +++ b/jcore-pipeline-builder-cli/src/main/java/de/julielab/jcore/pipeline/builder/cli/menu/dialog/ActivationDialog.java @@ -17,7 +17,7 @@ public class ActivationDialog extends AbstractComponentSelectionDialog { @Override public IMenuItem executeMenuItem(JCoReUIMAPipeline pipeline, TextIO textIO, Deque path) throws MenuItemExecutionException { - init(pipeline, EnumSet.of(PipelineBuilderConstants.JcoreMeta.Category.multiplier, PipelineBuilderConstants.JcoreMeta.Category.ae, PipelineBuilderConstants.JcoreMeta.Category.consumer)); + init(pipeline, EnumSet.of(PipelineBuilderConstants.JcoreMeta.Category.multiplier, PipelineBuilderConstants.JcoreMeta.Category.ae, PipelineBuilderConstants.JcoreMeta.Category.consumer, PipelineBuilderConstants.JcoreMeta.Category.flowcontroller)); printPosition(textIO, path); StatusPrinter.printPipelineStatus(pipeline, PipelineBuilderCLI.statusVerbosity, textIO); IMenuItem choice = textIO.newGenericInputReader(null) diff --git a/jcore-pipeline-builder-cli/src/main/java/de/julielab/jcore/pipeline/builder/cli/menu/dialog/DescriptorConfigurationDialog.java b/jcore-pipeline-builder-cli/src/main/java/de/julielab/jcore/pipeline/builder/cli/menu/dialog/DescriptorConfigurationDialog.java index 2903d30..a2d097f 100644 --- a/jcore-pipeline-builder-cli/src/main/java/de/julielab/jcore/pipeline/builder/cli/menu/dialog/DescriptorConfigurationDialog.java +++ b/jcore-pipeline-builder-cli/src/main/java/de/julielab/jcore/pipeline/builder/cli/menu/dialog/DescriptorConfigurationDialog.java @@ -51,7 +51,7 @@ public String toString() { description.getConfigurationParameters().values().stream(). map(p -> { if (p.isMultiValued()) - return new MultiValuedParameterEditingMenuItem(description, p); + return new MultiValuedParameterEditingMenuItem((ResourceSpecifier) description.getDescriptor(), p); return new ParameterEditingMenuItem((ResourceSpecifier) description.getDescriptor(), p); }). forEach(itemList::add); diff --git a/jcore-pipeline-builder-cli/src/main/java/de/julielab/jcore/pipeline/builder/cli/menu/dialog/ExternalResourceConfigurationDialog.java b/jcore-pipeline-builder-cli/src/main/java/de/julielab/jcore/pipeline/builder/cli/menu/dialog/ExternalResourceConfigurationDialog.java index e2659d0..e343751 100644 --- a/jcore-pipeline-builder-cli/src/main/java/de/julielab/jcore/pipeline/builder/cli/menu/dialog/ExternalResourceConfigurationDialog.java +++ b/jcore-pipeline-builder-cli/src/main/java/de/julielab/jcore/pipeline/builder/cli/menu/dialog/ExternalResourceConfigurationDialog.java @@ -3,6 +3,7 @@ import de.julielab.jcore.pipeline.builder.base.main.Description; import de.julielab.jcore.pipeline.builder.cli.menu.BackMenuItem; import de.julielab.jcore.pipeline.builder.cli.menu.IMenuItem; +import de.julielab.jcore.pipeline.builder.cli.menu.MultiValuedParameterEditingMenuItem; import de.julielab.jcore.pipeline.builder.cli.menu.ParameterEditingMenuItem; import de.julielab.jcore.pipeline.builder.cli.util.StatusPrinter; import org.apache.uima.resource.ConfigurableDataResourceSpecifier; @@ -85,8 +86,8 @@ public String toString() { // Create the items for fixed information about resources: Their resource URL, their name and their description // Now add items for the parameters specific to this resource. Stream.of(spec.getMetaData().getConfigurationParameterDeclarations(). - getConfigurationParameters()). - map(p -> new ParameterEditingMenuItem(resourceDescription.getResourceSpecifier(), p)). + getConfigurationParameters()). + map(p -> p.isMultiValued() ? new MultiValuedParameterEditingMenuItem(resourceDescription.getResourceSpecifier(), p) : new ParameterEditingMenuItem(resourceDescription.getResourceSpecifier(), p)). forEach(itemList::add); itemList.add(BackMenuItem.get()); IMenuItem response = textIO.newGenericInputReader(null).withNumberedPossibleValues(itemList) @@ -105,6 +106,9 @@ public String toString() { } else if (response instanceof ParameterEditingMenuItem) { ParameterEditingMenuItem item = (ParameterEditingMenuItem) response; item.setParameterValue(textIO); + } else if (response instanceof MultiValuedParameterEditingMenuItem) { + MultiValuedParameterEditingMenuItem item = (MultiValuedParameterEditingMenuItem) response; + item.setParameterValue(textIO); } else return response; clearTerminal(textIO); return response;