package net.sourceforge.seqware.pipeline.plugins; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.util.ArrayList; import java.util.List; import joptsimple.ArgumentAcceptingOptionSpec; import net.sourceforge.seqware.common.module.ReturnValue; import net.sourceforge.seqware.common.module.ReturnValue.ExitStatus; import net.sourceforge.seqware.common.util.Log; import net.sourceforge.seqware.common.util.Rethrow; import net.sourceforge.seqware.pipeline.plugin.Plugin; import net.sourceforge.seqware.pipeline.plugin.PluginInterface; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.openide.util.lookup.ServiceProvider; @ServiceProvider(service = PluginInterface.class) public class ProcessingDataStructure2Dot extends Plugin { private final ArgumentAcceptingOptionSpec<String> processingSWIDSpec; private final ArgumentAcceptingOptionSpec<String> outputFileSpec; public ProcessingDataStructure2Dot() { super(); this.processingSWIDSpec = parser.accepts("parent-accession", "The SWID of the processing").withRequiredArg().ofType(String.class) .required().describedAs("The SWID of the processing."); this.outputFileSpec = parser.accepts("output-file", "Optional: file name").withRequiredArg().ofType(String.class) .describedAs("Output File Name").defaultsTo("output.dot"); } @Override public ReturnValue init() { return new ReturnValue(); } @Override public ReturnValue do_test() { return new ReturnValue(); } @Override public ReturnValue do_run() { String swAccession = options.valueOf(processingSWIDSpec); String outputFile = options.valueOf(outputFileSpec); String output = metadata.getProcessingRelations(swAccession); if (output == null) { Log.stderr("Could not find processing event, please check that this is a valid processing SWID"); return new ReturnValue(ExitStatus.INVALIDPARAMETERS); } Log.stdout("Writing dot file to " + outputFile); try (Writer writer = new BufferedWriter(new FileWriter(outputFile))) { writer.write(output); } catch (IOException e) { throw Rethrow.rethrow(e); } return new ReturnValue(); } @Override public String get_description() { return "This plugin will take in a sw_accession of a processing, and translate the hierarchy of the processing relationship into dot format"; } @Override public ReturnValue clean_up() { return new ReturnValue(); } private class DotNode { private final List<DotNode> children; private final String processingId; public DotNode(String pid) { this.children = new ArrayList<>(); this.processingId = pid; } public void addChild(DotNode node) { if (!this.children.contains(node)) this.children.add(node); } @Override public String toString() { return this.processingId; } public List<DotNode> getChildren() { return this.children; } @Override public boolean equals(Object obj) { if (obj instanceof DotNode == false) return false; if (obj == this) return true; DotNode rhs = (DotNode) obj; return new EqualsBuilder().appendSuper(super.equals(obj)).append(this.processingId, rhs.processingId).isEquals(); } @Override public int hashCode() { return new HashCodeBuilder(17, 37).append(this.processingId).toHashCode(); } } }