Search in sources :

Example 16 with Port

use of com.genericworkflownodes.knime.port.Port in project GenericKnimeNodes by genericworkflownodes.

the class DynamicGenericNodeModel method getOutputBaseNames.

/**
 * Tries to guess the optimal output file names given all the input edges.
 * The file names will be extracted from the configuration, hence the file
 * names need to be transferred into config prior to using this method. See
 * {@link GenericKnimeNodeModel#transferIncomingPorts2Config(PortObject[])}.
 *
 * @return A list of base names for the output files.
 * @throws Exception
 */
private List<String> getOutputBaseNames() throws Exception {
    // 1. we select always the list with the highest number of files.
    // 2. we prefer lists over files (independent of the number of
    // elements).
    // 3. we prefer files over prefixes since we assume that prefixes are
    // often indices or reference data
    // 4. ignore optional parameters
    List<String> basenames = new ArrayList<String>();
    // find the port
    int naming_port = 0;
    int max_size = -1;
    boolean seen_prefix = false;
    boolean isFileParameter = false;
    for (int i = 0; i < m_nodeConfig.getInputPorts().size(); ++i) {
        Port port = m_nodeConfig.getInputPorts().get(i);
        String name = port.getName();
        Parameter<?> p = m_nodeConfig.getParameter(name);
        // we don't assume that optional ports are naming relevant
        if (p.isOptional()) {
            continue;
        }
        if (p instanceof FileListParameter) {
            FileListParameter flp = (FileListParameter) p;
            if (max_size == -1 || (isFileParameter && (max_size <= flp.getValue().size()))) {
                max_size = flp.getValue().size();
                naming_port = i;
            } else if (flp.getValue().size() != max_size) {
                throw new Exception("The number of output files cannot be determined since multiple input file lists with disagreeing numbers exist.");
            }
        } else if (max_size == -1 || seen_prefix) {
            // is a regular incoming port but we have no better option
            max_size = 1;
            naming_port = i;
            // indicating that we have (for now) selected a file parameter
            // which will be overruled by any FileListParameter
            isFileParameter = true;
            seen_prefix = port.isPrefix();
        }
    }
    if (m_nodeConfig.getInputPorts().size() > 0) {
        // generate the filenames if there are input ports
        // without ports, the names are set in transferOutgoingPorts2Config
        Port port = m_nodeConfig.getInputPorts().get(naming_port);
        String name = port.getName();
        Parameter<?> p = m_nodeConfig.getParameter(name);
        if (p instanceof FileListParameter) {
            // we have multiple base names
            FileListParameter flp = (FileListParameter) p;
            for (String fName : flp.getValue()) {
                basenames.add(FilenameUtils.getBaseName(fName));
            }
        } else {
            // we only have a single basename
            // FilenameUtils.getBaseName()
            basenames.add(FilenameUtils.getBaseName(((FileParameter) p).getValue()));
        }
    }
    return basenames;
}
Also used : FileListParameter(com.genericworkflownodes.knime.parameter.FileListParameter) Port(com.genericworkflownodes.knime.port.Port) ArrayList(java.util.ArrayList) FileParameter(com.genericworkflownodes.knime.parameter.FileParameter) IFileParameter(com.genericworkflownodes.knime.parameter.IFileParameter) InvalidSettingsException(org.knime.core.node.InvalidSettingsException) InvalidParameterValueException(com.genericworkflownodes.knime.parameter.InvalidParameterValueException) ExecutionFailedException(com.genericworkflownodes.knime.generic_node.ExecutionFailedException) UnknownToolExecutorException(com.genericworkflownodes.knime.execution.UnknownToolExecutorException) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) NoBinaryAvailableException(com.genericworkflownodes.knime.custom.config.NoBinaryAvailableException) UnknownCommandGeneratorException(com.genericworkflownodes.knime.execution.UnknownCommandGeneratorException)

Example 17 with Port

use of com.genericworkflownodes.knime.port.Port in project GenericKnimeNodes by genericworkflownodes.

the class GenericKnimeNodeModel method transferIncomingPorts2Config.

/**
 * Transfers the incoming ports into the config, that it can be written out
 * into a config file or can be transferred to the command line.
 *
 * @param inData
 *            The incoming port objects.
 * @throws Exception
 */
private void transferIncomingPorts2Config(PortObject[] inData) throws Exception {
    // Transfer settings from the input ports into the configuration object
    for (int i = 0; i < inData.length; i++) {
        // find the internal port for this PortObject
        Port port = m_nodeConfig.getInputPorts().get(i);
        IURIPortObject po = (IURIPortObject) inData[i];
        String name = port.getName();
        // find the associated parameter in the configuration
        Parameter<?> p = m_nodeConfig.getParameter(name);
        boolean isMultiFile = port.isMultiFile();
        boolean isPrefix = port.isPrefix();
        // skip optional and unconnected inport ports
        if (inData[i] == null) {
            p.setValue(null);
            continue;
        }
        // connected: check contents
        List<URIContent> uris = po.getURIContents();
        // check validity of subtypes with actual inputs
        if (uris.size() > 1 && (!isMultiFile && !isPrefix)) {
            throw new Exception("IURIPortObject with multiple URIs supplied at single URI port #" + i);
        }
        // port
        if (!(p instanceof IFileParameter)) {
            throw new Exception("Invalid reference from port to non-file parameter. URI port #" + i);
        }
        if (isPrefix) {
            // we pass only the prefix to the tool
            IPrefixURIPortObject puri = (IPrefixURIPortObject) inData[i];
            ((FileParameter) p).setValue(puri.getPrefix());
        } else if (isMultiFile) {
            // we need to collect all filenames and then set them as a batch
            // in the config
            List<String> filenames = new ArrayList<String>();
            for (URIContent uric : uris) {
                URI uri = uric.getURI();
                filenames.add(new File(uri).getAbsolutePath());
            }
            ((FileListParameter) p).setValue(filenames);
        } else {
            // just one filename
            URI uri = uris.get(0).getURI();
            String filename = new File(uri).getAbsolutePath();
            ((FileParameter) p).setValue(filename);
        }
    }
}
Also used : IPrefixURIPortObject(com.genericworkflownodes.knime.base.data.port.IPrefixURIPortObject) Port(com.genericworkflownodes.knime.port.Port) URI(java.net.URI) InvalidSettingsException(org.knime.core.node.InvalidSettingsException) InvalidParameterValueException(com.genericworkflownodes.knime.parameter.InvalidParameterValueException) UnknownToolExecutorException(com.genericworkflownodes.knime.execution.UnknownToolExecutorException) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) NoBinaryAvailableException(com.genericworkflownodes.knime.custom.config.NoBinaryAvailableException) UnknownCommandGeneratorException(com.genericworkflownodes.knime.execution.UnknownCommandGeneratorException) IFileParameter(com.genericworkflownodes.knime.parameter.IFileParameter) IURIPortObject(org.knime.core.data.uri.IURIPortObject) ArrayList(java.util.ArrayList) List(java.util.List) FileParameter(com.genericworkflownodes.knime.parameter.FileParameter) IFileParameter(com.genericworkflownodes.knime.parameter.IFileParameter) File(java.io.File) URIContent(org.knime.core.data.uri.URIContent)

Example 18 with Port

use of com.genericworkflownodes.knime.port.Port in project GenericKnimeNodes by genericworkflownodes.

the class GenericKnimeNodeModel method transferOutgoingPorts2Config.

/**
 * Creates a list of lists of output files (as {@link URI}s) pointing to the
 * files that will be generated by the executed tool.
 *
 * @param jobdir
 *            The working directory of the executable.
 * @param inData
 *            The input data as {@link PortObject} array
 * @return A list of lists of output files
 * @throws Exception
 *             If the input has an invalid configuration.
 */
private List<PortObject> transferOutgoingPorts2Config(final File jobdir, PortObject[] inData, ExecutionContext exec) throws Exception {
    final int nOut = m_nodeConfig.getOutputPorts().size();
    List<PortObject> outPorts = new ArrayList<PortObject>(nOut);
    for (int i = 0; i < nOut; i++) {
        Port port = m_nodeConfig.getOutputPorts().get(i);
        // Before we know about its extension, a port is reset to active
        port.setActive(true);
        String name = port.getName();
        String ext = "";
        boolean isPrefix = port.isPrefix();
        if (!isPrefix) {
            ext = getOutputType(i);
        }
        if (ext.toLowerCase().equals("inactive")) {
            port.setActive(false);
            outPorts.add(InactiveBranchPortObject.INSTANCE);
            continue;
        }
        Parameter<?> p = m_nodeConfig.getParameter(name);
        // basenames and number of output files guessed from input
        List<String> basenames = getOutputBaseNames();
        if (p instanceof FileListParameter && port.isMultiFile()) {
            // we currently do not support lists of prefixes
            if (isPrefix) {
                throw new InvalidSettingsException("GKN currently does not support lists of prefixes as output.");
            }
            FileListParameter flp = (FileListParameter) p;
            List<String> fileNames = new ArrayList<String>();
            if (basenames.size() == 0) {
                throw new Exception("Cannot determine number of output files if no input file is given.");
            }
            PortObject fsupo = new FileStoreURIPortObject(exec.createFileStore(m_nodeConfig.getName() + "_" + i));
            for (int f = 0; f < basenames.size(); ++f) {
                // create basename: <base_name>_<port_nr>_<outfile_nr>
                String file_basename = String.format("%s_%d", basenames.get(f), f);
                File file = ((FileStoreURIPortObject) fsupo).registerFile(file_basename + "." + ext);
                fileNames.add(file.getAbsolutePath());
            }
            // add filled portobject
            outPorts.add(fsupo);
            // overwrite existing settings with new values generated by the
            // stash
            flp.setValue(fileNames);
        } else if (p instanceof FileParameter && !port.isMultiFile()) {
            PortObject po;
            // if we have no basename to use (e.g., Node without input-file)
            // we use the nodename
            String basename;
            if (basenames.isEmpty()) {
                basename = m_nodeConfig.getName();
            } else {
                basename = basenames.get(0);
            }
            // create basename: <base_name>_<outfile_nr>
            String fileName = basename;
            if (!isPrefix) {
                fileName += '.' + ext;
            }
            if (isPrefix) {
                po = new FileStorePrefixURIPortObject(exec.createFileStore(m_nodeConfig.getName() + "_" + i), fileName);
                ((FileParameter) p).setValue(((FileStorePrefixURIPortObject) po).getPrefix());
                LOGGER.debug("> setting param " + name + "->" + ((FileStorePrefixURIPortObject) po).getPrefix());
            } else {
                po = new FileStoreURIPortObject(exec.createFileStore(m_nodeConfig.getName() + "_" + i));
                // we do not append the file extension if we have a prefix
                File file = ((FileStoreURIPortObject) po).registerFile(fileName);
                ((FileParameter) p).setValue(file.getAbsolutePath());
                LOGGER.debug("> setting param " + name + "->" + file);
            }
            // remember output file
            outPorts.add(po);
        } else {
            throw new Exception("Invalid connection between ports and parameters.");
        }
    }
    return outPorts;
}
Also used : FileListParameter(com.genericworkflownodes.knime.parameter.FileListParameter) FileStoreURIPortObject(com.genericworkflownodes.knime.base.data.port.FileStoreURIPortObject) Port(com.genericworkflownodes.knime.port.Port) ArrayList(java.util.ArrayList) FileStorePrefixURIPortObject(com.genericworkflownodes.knime.base.data.port.FileStorePrefixURIPortObject) InvalidSettingsException(org.knime.core.node.InvalidSettingsException) InvalidParameterValueException(com.genericworkflownodes.knime.parameter.InvalidParameterValueException) UnknownToolExecutorException(com.genericworkflownodes.knime.execution.UnknownToolExecutorException) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) NoBinaryAvailableException(com.genericworkflownodes.knime.custom.config.NoBinaryAvailableException) UnknownCommandGeneratorException(com.genericworkflownodes.knime.execution.UnknownCommandGeneratorException) InvalidSettingsException(org.knime.core.node.InvalidSettingsException) FileParameter(com.genericworkflownodes.knime.parameter.FileParameter) IFileParameter(com.genericworkflownodes.knime.parameter.IFileParameter) InactiveBranchPortObject(org.knime.core.node.port.inactive.InactiveBranchPortObject) IURIPortObject(org.knime.core.data.uri.IURIPortObject) IPrefixURIPortObject(com.genericworkflownodes.knime.base.data.port.IPrefixURIPortObject) FileStorePrefixURIPortObject(com.genericworkflownodes.knime.base.data.port.FileStorePrefixURIPortObject) PortObject(org.knime.core.node.port.PortObject) FileStoreURIPortObject(com.genericworkflownodes.knime.base.data.port.FileStoreURIPortObject) File(java.io.File)

Example 19 with Port

use of com.genericworkflownodes.knime.port.Port in project GenericKnimeNodes by genericworkflownodes.

the class NodeModelTemplate method fillMimeTypes.

private void fillMimeTypes(INodeConfiguration config) throws UnknownMimeTypeException {
    String clazzez = "";
    for (Port port : config.getInputPorts()) {
        if (port.getMimeTypes().isEmpty()) {
            clazzez += "{}, ";
        } else {
            String tmp = "{";
            for (String type : port.getMimeTypes()) {
                String ext = type.toLowerCase();
                if (ext == null) {
                    throw new UnknownMimeTypeException(type);
                }
                tmp += "\"" + ext + "\" ,";
            }
            tmp = tmp.substring(0, tmp.length() - 1);
            tmp += "}, ";
            clazzez += tmp;
        }
    }
    if (!clazzez.equals("")) {
        clazzez = clazzez.substring(0, clazzez.length() - 1);
    }
    clazzez += "}";
    createInClazzezModel(clazzez);
    clazzez = "";
    for (Port port : config.getOutputPorts()) {
        if (port.getMimeTypes().isEmpty()) {
            clazzez += "{},";
        } else {
            String tmp = "{";
            for (String type : port.getMimeTypes()) {
                String ext = type.toLowerCase();
                if (ext == null) {
                    throw new UnknownMimeTypeException(type);
                }
                tmp += "\"" + ext + "\" ,";
            }
            tmp = tmp.substring(0, tmp.length() - 1);
            tmp += "}, ";
            clazzez += tmp;
        }
    }
    if (!clazzez.equals("")) {
        clazzez = clazzez.substring(0, clazzez.length() - 1);
    }
    clazzez += "}";
    createOutClazzezModel(clazzez);
}
Also used : Port(com.genericworkflownodes.knime.port.Port) UnknownMimeTypeException(com.genericworkflownodes.knime.nodegeneration.exceptions.UnknownMimeTypeException)

Aggregations

Port (com.genericworkflownodes.knime.port.Port)19 IOException (java.io.IOException)8 InvalidSettingsException (org.knime.core.node.InvalidSettingsException)8 FileParameter (com.genericworkflownodes.knime.parameter.FileParameter)7 IFileParameter (com.genericworkflownodes.knime.parameter.IFileParameter)7 ArrayList (java.util.ArrayList)7 NoBinaryAvailableException (com.genericworkflownodes.knime.custom.config.NoBinaryAvailableException)6 UnknownCommandGeneratorException (com.genericworkflownodes.knime.execution.UnknownCommandGeneratorException)6 UnknownToolExecutorException (com.genericworkflownodes.knime.execution.UnknownToolExecutorException)6 InvalidParameterValueException (com.genericworkflownodes.knime.parameter.InvalidParameterValueException)6 ExecutionException (java.util.concurrent.ExecutionException)6 FileListParameter (com.genericworkflownodes.knime.parameter.FileListParameter)5 IPrefixURIPortObject (com.genericworkflownodes.knime.base.data.port.IPrefixURIPortObject)4 File (java.io.File)4 IURIPortObject (org.knime.core.data.uri.IURIPortObject)4 ExecutionFailedException (com.genericworkflownodes.knime.generic_node.ExecutionFailedException)3 FileStorePrefixURIPortObject (com.genericworkflownodes.knime.base.data.port.FileStorePrefixURIPortObject)2 FileStoreURIPortObject (com.genericworkflownodes.knime.base.data.port.FileStoreURIPortObject)2 INodeConfiguration (com.genericworkflownodes.knime.config.INodeConfiguration)2 InvalidCTDFileException (com.genericworkflownodes.knime.config.reader.InvalidCTDFileException)2