Changeset 5204


Ignore:
Timestamp:
Dec 16, 2009, 2:29:50 PM (12 years ago)
Author:
Nicklas Nordborg
Message:

Fixes #1437: Base1PluginExecuter should store 'value' instead of 'key' for enumerated parameters

Note that this fix only affects jobs that have been executed after this fix has been installed. Existing jobs will still store (and display) the 'key' values.

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/doc/src/docbook/appendix/incompatible.xml

    r5060 r5204  
    4343    </para>
    4444  </note>
     45 
     46  <sect1 id="appendix.incompatible.2.15">
     47    <title>BASE 2.15 release</title>
     48
     49    <bridgehead>
     50      Base1PluginExecuter and enumerated parameters
     51    </bridgehead>
     52   
     53    <para>
     54      Enumerated parameters as handled by the Base1PluginExecuter consists
     55      of key/value pairs, for example 0=No, 1=Yes. The 'value' is what the user
     56      sees in the GUI while running jobs and the 'key' is what is sent to
     57      the plug-in in the parameter file. Starting with BASE 2.15 the 'value'
     58      is saved in the database instead of the 'key'. At runtime, a reverse
     59      lookup is used to convert the 'value' into the 'key' that is written
     60      to the parameters file. <emphasis>The reverse lookup only works
     61      if all values are unique.</emphasis> BASE will check for this at
     62      configuration time and throw an exception if this is not the
     63      case. To solve this problem the plug-in should be reconfigured.
     64    </para>
     65   
     66  </sect1>
    4567 
    4668  <sect1 id="appendix.incompatible.2.13">
  • trunk/src/plugins/core/net/sf/basedb/plugins/Base1PluginExecuter.java

    r5187 r5204  
    4545import net.sf.basedb.core.ItemQuery;
    4646import net.sf.basedb.core.Job;
     47import net.sf.basedb.core.ParameterType;
    4748import net.sf.basedb.core.Path;
    4849import net.sf.basedb.core.PathParameterType;
     
    6162import net.sf.basedb.core.plugin.GuiContext;
    6263import net.sf.basedb.core.plugin.InteractivePlugin;
    63 import net.sf.basedb.core.plugin.ParameterValues;
    6464import net.sf.basedb.core.plugin.Permissions;
    6565import net.sf.basedb.core.plugin.Request;
     
    474474        for (PluginParameter<?> p : getJobParameters())
    475475        {
    476           storeValue(job, request, p);
     476          ParameterType<?> pType = p.getParameterType();
     477          Object value = request.getParameterValue(p.getName());
     478          if (pType.isEnumeration() && value != null)
     479          {
     480            // The 'key' value is sent in the request, but we
     481            // want to store the 'value' value instead
     482            Enumeration<?, String> e = pType.getEnumeration();
     483            for (int i = 0; i < e.size(); ++i)
     484            {
     485              if (value.equals(e.getKey(i)))
     486              {
     487                value = e.getValue(i);
     488                break;
     489              }
     490            }
     491            ParameterType<String> tmp = new StringParameterType(65535, null, false);
     492            job.setValue(p.getName(), tmp, (String)value);
     493          }
     494          else
     495          {
     496            storeValue(job, request, p);
     497          }
    477498        }
    478499        response.setDone("Job configuration complete", Job.ExecutionTime.SHORT);
     
    860881        String name = pp.getName();
    861882        Object value = job.getValue(name);
     883        ParameterType<?> pType = pp.getParameterType();
     884        if (pType.isEnumeration() && value != null)
     885        {
     886          // The 'value' value is stored in the database, but
     887          // we need to export the 'key' value
     888          Enumeration<?, String> e = pType.getEnumeration();
     889          for (int i = 0; i < e.size(); ++i)
     890          {
     891            if (value.equals(e.getValue(i)))
     892            {
     893              value = e.getKey(i);
     894              break;
     895            }
     896          }
     897        }
    862898        exporter.setParameter(name, value == null ? "" : value.toString());
    863899      }
     
    15761612        String[] enums = base1ConfigLine[6].split("\\\\t");
    15771613        if (enums.length % 2 != 0) throw new BaseException("name/value pairs in enum isnt even: "+base1ConfigLine[6]);
     1614        Set<String> values = new HashSet<String>();
    15781615        for (int i = 0; i < enums.length; i += 2)
    15791616        {
    15801617          enumOptions.add(enums[i], enums[i+1]);
     1618          if (!values.add(enums[i+1]))
     1619          {
     1620            throw new BaseException("Enumeration value for parameter '" + name +
     1621                "' is not unique: " + enums[i+1]);
     1622          }
    15811623        }
    15821624      }
     
    16171659          else if (child.getName().equals("enumoptions"))
    16181660          {
     1661            Set<String> values = new HashSet<String>();
    16191662            Iterator<Element> it2 = child.getDescendants(new ElementFilter());
    16201663            while (it2.hasNext())
     
    16221665              Element value = it2.next();
    16231666              enumOptions.add(value.getAttributeValue("key"), value.getValue());
     1667              if (!values.add(value.getValue()))
     1668              {
     1669                throw new BaseException("Enumeration value for parameter '" + name +
     1670                    "' is not unique: " + value.getValue());
     1671              }
    16241672            }
    16251673          }
  • trunk/src/test/data/test.nullplugin.base

    r4537 r5204  
    2020%
    21211 h section   30  settings    0
    22 2 t str String paramer  30  test    0
     222 t str String parameter  30  test    0
    23233 i int Integer parameter 30      0
    24244 f float Float parameter 30      0
    25255 a text  Text parameter  30,30     0
    26 6 n ann annotation paremeter  30  0   0
     266 n ann Annotation parameter  30  0   0
    27277 h hstr    30      0
    28 8 e enum  Enum paremter 30  1 0\tYes\t1\tNo\t2\tMaybe 0
     288 e enum  Enum parameter  30  1 0\tYes\t1\tNo\t2\tMaybe 0
    2929
  • trunk/src/test/data/test.nullplugin.cleanstd.base

    r4776 r5204  
    2020%
    21211 h section   30  settings    0
    22 2 t str String paramer  30  test    0
     222 t str String parameter  30  test    0
    23233 i int Integer parameter 30      0
    24244 f float Float parameter 30      0
    25255 a text  Text parameter  30,30     0
    26 6 n ann annotation paremeter  30  0   0
     266 n ann Annotation parameter  30  0   0
    27277 h hstr    30      0
    28 8 e enum  Enum paremter 30  1 0\tYes\t1\tNo\t2\tMaybe 0
     288 e enum  Enum parameter  30  1 0\tYes\t1\tNo\t2\tMaybe 0
    2929
  • trunk/src/test/data/test.nullplugin.matrix.base

    r4537 r5204  
    2020%
    21211 h section   30  settings    0
    22 2 t str String paramer  30  test    0
     222 t str String parameter  30  test    0
    23233 i int Integer parameter 30      0
    24244 f float Float parameter 30      0
    25255 a text  Text parameter  30,30     0
    26 6 n ann annotation paremeter  30  0   0
     266 n ann Annotation parameter  30  0   0
    27277 h hstr    30      0
    28 8 e enum  Enum paremter 30  1 0\tYes\t1\tNo\t2\tMaybe 0
     288 e enum  Enum parameter  30  1 0\tYes\t1\tNo\t2\tMaybe 0
    2929
Note: See TracChangeset for help on using the changeset viewer.