package au.com.acpfg.misc.jemboss.local; import java.awt.BorderLayout; import java.awt.Container; import java.util.HashMap; import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.JScrollPane; import org.knime.core.node.InvalidSettingsException; import au.com.acpfg.misc.jemboss.settings.ListSetting; import au.com.acpfg.misc.jemboss.settings.ProgramSetting; /** * The runnable instance requires two parameters: * 1) the name of the emboss program to highlight and display results for * 2) the dialog instance to customise with the settings for the chosen program * * @author andrew.cassin */ public class MyRunnable implements Runnable { private String m_prog; private JEmbossProcessorNodeDialog m_dlg; public MyRunnable(String prog, JEmbossProcessorNodeDialog dlg) { m_prog = prog; m_dlg = dlg; } private String find_params(Matcher m, String section) { String ret = ""; Pattern p = Pattern.compile("^\\s+\\]\\s*$", Pattern.MULTILINE); Matcher m2 = p.matcher(section); if (m2.find()) { return section.substring(0, m2.start()); } return ret; } private String extract_value(String trimmed) { String val= trimmed.substring(trimmed.indexOf('"')+1); if (val.endsWith("\"")) { return val.substring(0, val.length()-1); } // BUG: dont set value iff no close quote? return ""; } public ProgramSettingsModel make_program_settings(String prog, String acd_text) throws InvalidSettingsException { ProgramSettingsModel model = new ProgramSettingsModel(); model.setProgram(prog); /** * Do a "poor mans parse" on the ACD file. Maybe we could re-use code from jemboss??? */ String[] acd_sections = acd_text.split("endsection\\:\\s*\\w+"); // BUG TODO: p doesnt match fuzznuc:pattern correctly due to lazy qualifier when looking for a ] Pattern p = Pattern.compile("^\\s+(\\w+):\\s+(\\w+)\\s+\\[\\s*$", Pattern.MULTILINE); for (String section : acd_sections) { Matcher m = p.matcher(section); String section_type = "unknown"; while (m.find()) { String field_type = m.group(1); String field_name = m.group(2); String params = find_params(m, section.substring(m.start())); if (field_type.equals("section")) { section_type = field_name; continue; } //Logger.getAnonymousLogger().info(section_type+":"+field_name+"\n"+params); HashMap<String,String> attrs = new HashMap<String,String>(); attrs.put("type", field_type); attrs.put("name", field_name); boolean null_ok = false; for (String line : params.split("\n")) { String trimmed = line.trim(); if (trimmed.startsWith("default:")) { attrs.put("default-value", extract_value(trimmed)); } else if (trimmed.startsWith("minimum:")) { attrs.put("lowerbound", extract_value(trimmed)); } else if (trimmed.startsWith("maximum:")) { attrs.put("upperbound", extract_value(trimmed)); } else if (trimmed.startsWith("information:")) { attrs.put("description", extract_value(trimmed)); } else if (trimmed.startsWith("size:")) { attrs.put("size", extract_value(trimmed)); } else if (trimmed.startsWith("nullok:")) { String val = extract_value(trimmed); attrs.put("nullok", val); null_ok = val.toLowerCase().equals("y"); } } // list values specified? int start_idx = params.indexOf("values:"); if (start_idx >= 0) { String lv = params.substring(start_idx+8); attrs.put("list-values", lv.replaceAll("\n", "")); } if ((section_type.equals("required") || section_type.equals("input"))) { attrs.put("is-input", new Boolean(true).toString()); } else if (section_type.equals("output")) { attrs.put("is-output", new Boolean(true).toString()); } else { attrs.put("is-optional", new Boolean(true).toString()); } // instantiate the setting via the factory method ProgramSetting ps = ProgramSetting.make(attrs); // only add once is-* attrs are set, so that the model counts setting types correctly model.add(ps); } } return model; } @Override public void run() { String acd_text = JEmbossProcessorNodeModel.getACDText(m_prog); if (acd_text.length() < 1) { Logger.getAnonymousLogger().warning("No help text available for "+m_prog); } ProgramSettingsModel model = null; try { model = make_program_settings(m_prog, acd_text); ProgramSettingsModel dflt_mdl = m_dlg.getEmbossSettings(); if (model.isProgram(dflt_mdl)) { model.assign(dflt_mdl); } } catch (InvalidSettingsException ise) { Logger.getAnonymousLogger().warning("cannot load settings for "+m_prog); } m_dlg.update_options(model); String html_fragment = JEmbossProcessorNodeModel.run_emboss_command("acdtable "+m_prog); m_dlg.update_html(m_prog, html_fragment); } }