Skip to content

Commit

Permalink
Support multi-valued parameters for configurable resources. Resolves #18
Browse files Browse the repository at this point in the history
.

Also, fix the multi value parameter setting dialog to not jump out after adding values.
  • Loading branch information
khituras committed Sep 23, 2021
1 parent c94a6f3 commit df47379
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 57 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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<Description> allDelegates, Stream<AnalysisEngineDescription> 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<String, MetaDataObject> delegatesWithImports = aaeDesc.getDelegateAnalysisEngineSpecifiersWithImports();
delegatesWithImports.clear();
List<String> flowNames = new ArrayList<>();
Expand Down Expand Up @@ -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<Description> 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);
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
}

Expand All @@ -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.<String>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<Object> 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.<String>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<Object> 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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
public class ActivationDialog extends AbstractComponentSelectionDialog {
@Override
public IMenuItem executeMenuItem(JCoReUIMAPipeline pipeline, TextIO textIO, Deque<String> 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.<IMenuItem>newGenericInputReader(null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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.<IMenuItem>newGenericInputReader(null).withNumberedPossibleValues(itemList)
Expand All @@ -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;
Expand Down

0 comments on commit df47379

Please sign in to comment.