Changeset 4930


Ignore:
Timestamp:
May 14, 2009, 11:41:44 AM (12 years ago)
Author:
Nicklas Nordborg
Message:

References #742: Refactor BioAssaySetExporter?

Base1PluginExecuter now uses the new exporter code.

Location:
trunk/src
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/core/net/sf/basedb/util/basefile/BaseFileWriter.java

    r4926 r4930  
    2424import java.io.PrintWriter;
    2525import java.io.Writer;
     26import java.util.regex.Pattern;
    2627
    2728import net.sf.basedb.core.InvalidDataException;
     
    152153    if (!hasBom) baseWriteBom();
    153154    baseEndSection();
    154     println(getMetadataPrefix() + "section\t" + name);
     155    println(getMetadataPrefix() + "section\t" + baseEscape(name));
    155156    setMode(true, false);
    156157  }
     
    176177    Prints a header in the BASEfile. This call is ignored if
    177178    no section has been started or if the current section is
    178     currently in data writing mode.
     179    currently in data writing mode. Line breaks (\n) and
     180    carriage returns (\r) in the value are converted to
     181    the literal string values '\n' and '\r'.
    179182    @param key The header key, 'section' is not allowed
    180183    @param value The value, if null the configured null value
     
    190193    }
    191194    String valueToWrite = value == null ? getNullValue() : value.toString();
    192     println(getMetadataPrefix() + key + "\t" + valueToWrite);
     195    println(getMetadataPrefix() + key + "\t" + baseEscape(valueToWrite));
    193196  }
    194197
     
    223226  }
    224227 
     228  private Pattern r = Pattern.compile("\r");
     229  private Pattern n = Pattern.compile("\r");
     230
     231  /**
     232    Escape new line and carrige return characters in the input
     233    to the literal string '\n' and '\r' in the output.
     234    @param in The input string
     235  */
     236  public String baseEscape(String in)
     237  {
     238    in = r.matcher(in).replaceAll("\\\\n");
     239    in = n.matcher(in).replaceAll("\\\\n");
     240    return in;
     241  }
     242 
    225243}
  • trunk/src/plugins/core/net/sf/basedb/plugins/Base1PluginExecuter.java

    r4919 r4930  
    4343import net.sf.basedb.core.FileParameterType;
    4444import net.sf.basedb.core.FloatParameterType;
    45 import net.sf.basedb.core.Formula;
    4645import net.sf.basedb.core.Include;
    4746import net.sf.basedb.core.IntegerParameterType;
     
    9392import net.sf.basedb.util.Diff3;
    9493import net.sf.basedb.util.Enumeration;
     94import net.sf.basedb.util.FileUtil;
    9595import net.sf.basedb.util.Values;
    9696import net.sf.basedb.util.XMLUtil;
     97import net.sf.basedb.util.basefile.BaseFileWriter;
     98import net.sf.basedb.util.export.spotdata.FieldConverter;
     99import net.sf.basedb.util.export.spotdata.BaseFileExporter;
     100import net.sf.basedb.util.export.spotdata.DynamicField;
     101import net.sf.basedb.util.export.spotdata.ExportableFieldFactory;
     102import net.sf.basedb.util.export.spotdata.MatrixBaseFileExporter;
     103import net.sf.basedb.util.export.spotdata.SerialBaseFileExporter;
    97104import net.sf.basedb.util.parser.FlatFileParser;
    98105
     
    100107import org.jdom.Element;
    101108import org.jdom.JDOMException;
    102 import org.jdom.filter.Filter;
     109import org.jdom.filter.ElementFilter;
    103110import org.jdom.output.Format;
    104111import org.jdom.output.XMLOutputter;
     
    113120import java.io.InputStream;
    114121import java.io.OutputStream;
     122import java.io.OutputStreamWriter;
    115123import java.net.URL;
    116124import java.sql.SQLException;
    117 import java.util.AbstractSet;
    118125import java.util.ArrayList;
    119126import java.util.Arrays;
     
    129136import java.util.TreeMap;
    130137import java.util.regex.Pattern;
    131 import java.util.regex.Matcher;
    132138
    133139/**
     
    504510      InputStream in = f.getDownloadStream(0);
    505511      FileOutputStream out = new FileOutputStream(target);
    506      
    507       StreamHandler sh = new StreamHandler(in, out);
    508       sh.run();
     512      new StreamHandler(in, out).run();
    509513    }
    510514  }
     
    795799    try
    796800    {
     801      // Exporting data to 'stdin.txt' which is sent to the plug-in
    797802      File file = File.getFile(dc, workingDirectory, "stdin.txt", true);
    798803      file.setMimeTypeAuto("text/plain", null);
    799804      dc.saveItem(file);
    800      
    801       BioAssaySet bas = getSourceBioAssaySet(dc);
    802      
    803       Map<String, String> nameMap = loadNameMap(dc, bas);
    804       String usedColumns = (String) configuration.getValue("usedColumns");
    805       List<String> reporterFields = usedColumns == null ?
    806         null : convertNames(nameMap, usedColumns.split("\\\\t"));
    807      
    808       String usedFields = (String) configuration.getValue("usedFields");
    809       List<String> spotFields = usedFields == null ?
    810         null : convertNames(nameMap, usedFields.split("\\\\t"));
    811      
    812       if (spotFields != null && spotFields.contains("_allIntensities"))
    813       {
    814         spotFields.remove("_allIntensities");
    815         int channels = bas.getRawDataType().getChannels();
    816         for (int i = 1; i <= channels; ++i)
    817         {
    818           spotFields.add("intensity"+i);
    819         }
    820       }
    821      
    822       Boolean mergeReporters = (Boolean) configuration.getValue("geneAverages");
    823      
    824       TreeMap<String, JobParameter> base1parametertype = getJobParameterObjectsFromXML(String.valueOf(configuration.getValue("jobParameters")), true);
    825       ListMap<String, String> parameters = new ListMap<String, String>();
    826       for (PluginParameter<?> pp : getJobParametersFromXML(String.valueOf(configuration.getValue("jobParameters")), true))
     805      BaseFileWriter out = new BaseFileWriter(
     806          new OutputStreamWriter(file.getUploadStream(false), Config.getCharset()));
     807     
     808      // Get configuration parameters
     809      BioAssaySet source = getSourceBioAssaySet(dc);
     810      boolean averageOnReporter = Boolean.TRUE.equals(configuration.getValue("geneAverages"));
     811     
     812      // Create the exporter
     813      BaseFileExporter exporter = null;
     814      if (Boolean.TRUE.equals(configuration.getValue("serialFormat")))
     815      {
     816        exporter = new SerialBaseFileExporter();
     817      }
     818      else
     819      {
     820        exporter = new MatrixBaseFileExporter();
     821      }
     822      exporter.setDbControl(dc);
     823      exporter.setSource(source);
     824      exporter.setProgressReporter(progress);
     825      exporter.setAverageOnReporter(averageOnReporter);
     826      exporter.setWriter(out);
     827     
     828      // Set job parameters
     829      for (PluginParameter<?> pp : getJobParametersFromXML((String)(configuration.getValue("jobParameters")), true))
    827830      {
    828831        String name = pp.getName();
    829832        Object value = job.getValue(name);
    830         String valueString = (value == null) ? "" : value.toString();
    831         JobParameter jp=base1parametertype.get(name);
    832         // replacing line breaks for Base1 TEXT and STRING types
    833         if (jp.getType() == Base1JobParameterType.STRING ||
    834             jp.getType() == Base1JobParameterType.TEXT)
    835         {
    836           Pattern p=Pattern.compile("\r");
    837           Matcher m=p.matcher(valueString);
    838           valueString = m.replaceAll("\\\\r");
    839           m.usePattern(Pattern.compile("\n"));
    840           m.reset(valueString);
    841           valueString = m.replaceAll("\\\\n");
    842         }
    843         parameters.put(name, valueString);
    844       }
    845      
    846       checkInterrupted();
    847       BioAssaySetExporter exporter = new BioAssaySetExporter();
    848       if ((Boolean) configuration.getValue("serialFormat"))
    849       {
    850         exporter.exportBaseFileSerial(bas, file, parameters, reporterFields, spotFields, mergeReporters, progress);
    851       }
    852       else
    853       {
    854         exporter.exportBaseFileMatrix(bas, file, parameters, reporterFields, spotFields, mergeReporters, progress);
    855       }
     833        exporter.setParameter(name, value == null ? "" : value.toString());
     834      }
     835     
     836      // Set reporter fields
     837      FieldConverter fieldConverter = new FieldConverter(dc, source);
     838      String usedColumns = (String)configuration.getValue("usedColumns");
     839      if (usedColumns != null)
     840      {
     841        for (String reporterField : usedColumns.split("\\\\t"))
     842        {
     843          DynamicField fld = fieldConverter.getReporterField(reporterField);
     844          if (fld == null)
     845          {
     846            throw new BaseException("Unknown reporter field: " + reporterField +
     847                " (you can add this field using a formula)");
     848          }
     849          exporter.addReporterField(fld);
     850        }
     851      }
     852     
     853      // Set spot fields
     854      String usedFields = (String)configuration.getValue("usedFields");
     855      if (usedFields != null)
     856      {
     857        for (String spotField : usedFields.split("\\\\t"))
     858        {
     859          if ("_allIntensities".equals(spotField))
     860          {
     861            int channels = source.getRawDataType().getChannels();
     862            for (int i = 1; i <= channels; ++i)
     863            {
     864              exporter.addSpotField(ExportableFieldFactory.channel(i, "intensity" + i, null));
     865            }
     866          }
     867          else
     868          {
     869            DynamicField fld = fieldConverter.getSpotField(spotField);
     870            if (fld == null)
     871            {
     872              throw new BaseException("Unknown spot field: " + spotField +
     873                  " (you can add this field using a formula)");
     874            }
     875            exporter.addSpotField(fld);
     876          }
     877        }
     878      }
     879      exporter.doExport();
    856880      return file;
    857881    }
     
    860884      throw new BaseException(e);
    861885    }
    862     catch (SQLException e)
    863     {
    864       throw new BaseException(e);
    865     }
    866   }
    867  
    868  
    869   /**
    870     Loads a map from BASE 1 -> BASE 2 names of things. The
    871     BASE 1 name must be the name of a formula or the external ID of an
    872     extra value in BASE 2 which should map to the corresponding value in BASE 2.
    873   */
    874   private Map<String, String> loadNameMap(DbControl dc, BioAssaySet bas)
    875   {
    876     Map<String, String> names = new HashMap<String, String>();
    877    
    878     ItemQuery<Formula> queryFormula = Formula.getQuery(Formula.Type.COLUMN_EXPRESSION,
    879       bas.getRawDataType(), bas.getIntensityTransform());
    880     queryFormula.include(Include.MINE, Include.SHARED, Include.IN_PROJECT, Include.OTHERS);
    881     queryFormula.order(Orders.asc(Hql.property("name")));
    882     for (Formula f : queryFormula.list(dc))
    883     {
    884       names.put(f.getName(), "frm."+f.getId());
    885     }
    886 
    887     for (ExtraValue ev : bas.getExtraValues().list(dc))
    888     {
    889       ExtraValueType evt = ev.getExtraValueType();
    890       names.put("_xc_"+evt.getExternalId(), "xtra."+evt.getExternalId());
    891     }
    892    
    893     return names;
    894   }
    895  
    896   /**
    897     Convert BASE 1 names to BASE 2 names. Names that can't be found in the name
    898     map are not converted.
    899     @param base1Names An array of BASE 1 names
    900   */
    901   private List<String> convertNames(Map<String, String> nameMap, String[] base1Names)
    902   {
    903     List<String> base2Names = new ArrayList<String>(base1Names.length);
    904     for (String name : base1Names)
    905     {
    906       if (nameMap.containsKey(name)) name = nameMap.get(name);
    907       base2Names.add(name);
    908     }
    909     return base2Names;
    910   }
    911  
     886  }
    912887 
    913888  /**
     
    986961
    987962
    988   @SuppressWarnings({ "unchecked", "serial" })
    989   private TreeMap<String, JobParameter>
    990     getJobParameterObjectsFromXML(String xml, boolean hideRemoved)
     963  @SuppressWarnings({ "unchecked" })
     964  private Map<String, JobParameter> getJobParameterObjectsFromXML(String xml, boolean hideRemoved)
    991965  {
    992966    try
     
    994968      String doctype = "<!DOCTYPE jobparameters SYSTEM \"base1-plugin-configuration-file.dtd\">";
    995969      Document doc = XMLUtil.getValidatedXml(doctype+xml, dtdFile);
    996       Iterator<Element> it = doc.getDescendants(new Filter()
    997       {
    998         public boolean matches(Object o)
    999         {
    1000           if (o instanceof Element)
    1001           {
    1002             Element e = (Element) o;
    1003             return e.getName().equals("parameter");
    1004           }
    1005           return false;
    1006         }
    1007       });
    1008 
    1009       TreeMap<String, JobParameter> pars= new TreeMap<String, JobParameter>();
     970      Iterator<Element> it = doc.getDescendants(new ElementFilter("parameter"));
     971      Map<String, JobParameter> pars = new TreeMap<String, JobParameter>();
    1010972      while (it.hasNext())
    1011973      {
     
    1016978          if (pars.containsKey(jp.getName()))
    1017979          {
    1018             throw new BaseException("Duplicate parameter at position "+jp.getPosition());
     980            throw new BaseException("Duplicate parameter '" + jp.getName() +
     981                "' at position "+jp.getPosition());
    1019982          }
    1020983          pars.put(jp.getName(), jp);
     
    1034997
    1035998
    1036   @SuppressWarnings({ "unchecked", "serial" })
     999  @SuppressWarnings({ "unchecked" })
    10371000  private List<PluginParameter<?>> getJobParametersFromXML(String xml, boolean hideRemoved)
    10381001  {
     
    10411004      String doctype = "<!DOCTYPE jobparameters SYSTEM \"base1-plugin-configuration-file.dtd\">";
    10421005      Document doc = XMLUtil.getValidatedXml(doctype+xml, dtdFile);
    1043       Iterator<Element> it = doc.getDescendants(new Filter()
    1044       {
    1045         public boolean matches(Object o)
    1046         {
    1047           if (o instanceof Element)
    1048           {
    1049             Element e = (Element) o;
    1050             return e.getName().equals("parameter");
    1051           }
    1052           return false;
    1053         }
    1054       });
    1055      
    1056       TreeMap<Integer, PluginParameter<?>> positionParameter = new TreeMap<Integer, PluginParameter<?>>();
     1006      Iterator<Element> it = doc.getDescendants(new ElementFilter("parameter"));
     1007      Map<Integer, PluginParameter<?>> positionParameter =
     1008        new TreeMap<Integer, PluginParameter<?>>();
    10571009      while (it.hasNext())
    10581010      {
     
    10631015          if (positionParameter.containsKey(jp.getPosition()))
    10641016          {
    1065             throw new BaseException("Duplicate parameter at position "+jp.getPosition());
     1017            throw new BaseException("Duplicate parameter '" + jp.getName() +
     1018                "' at position "+jp.getPosition());
    10661019          }
    10671020          positionParameter.put(jp.getPosition(), jp.getPluginParameter());
     
    16161569          if (progress != null && parsedBytes >= nextProgressReport)
    16171570          {
    1618             nextProgressReport += progressReportInterval;
     1571            nextProgressReport = parsedBytes + progressReportInterval;
    16191572            int percent = (int)((30L * parsedBytes) / totalBytes);
    16201573            progress.display(percent, "Importing spot data (first pass): " +
     
    16991652          if (progress != null && parsedBytes >= nextProgressReport)
    17001653          {
    1701             nextProgressReport += progressReportInterval;
     1654            nextProgressReport = parsedBytes + progressReportInterval;
    17021655            int percent = (int)((factor * parsedBytes) / totalBytes);
    17031656            progress.display(percent, "Importing reporter list: " +
     
    18441797    parentReporterPositions.clear();
    18451798   
    1846    
    1847     // Old code below
    1848 
    18491799    SpotBatcher spotBatcher = child.getSpotBatcher();
    18501800    HashMap<String, ExtraValueType> evtMap = new HashMap<String, ExtraValueType>();
     
    19601910          if (progress != null && parsedBytes >= nextProgressReport)
    19611911          {
    1962             nextProgressReport += progressReportInterval;
     1912            nextProgressReport = parsedBytes + progressReportInterval;
    19631913            int percent = 30 + (int)((70L * parsedBytes) / totalBytes);
    19641914            progress.display(percent, "Importing spot data (second pass): " +
     
    21022052      try
    21032053      {
    2104         byte[] buf = new byte[1024];
    2105         int i = 0;
    2106         while((i = is.read(buf)) != -1)
    2107         {
    2108           os.write(buf, 0, i);
    2109         }
    2110         is.close();
    2111         os.close();
     2054        FileUtil.copy(is, os);
    21122055      }
    21132056      catch (IOException e)
    21142057      {}
     2058      finally
     2059      {
     2060        FileUtil.close(is);
     2061        FileUtil.close(os);
     2062      }
    21152063    }
    21162064  }
     
    21682116    }
    21692117
    2170     @SuppressWarnings({ "unchecked", "serial" })
     2118    @SuppressWarnings({ "unchecked" })
    21712119    JobParameter(Element e)
    21722120    {
     
    21752123        position = e.getAttribute("position").getIntValue();
    21762124        type = Base1JobParameterType.get(e.getAttribute("type").getValue().charAt(0));
    2177         Iterator<Element> it = e.getDescendants(new Filter()
    2178         {
    2179           public boolean matches(Object o)
    2180           {
    2181             if (o instanceof Element)
    2182             {
    2183               return true;
    2184             }
    2185             return false;
    2186           }
    2187         });
     2125        Iterator<Element> it = e.getDescendants(new ElementFilter());
    21882126        while (it.hasNext())
    21892127        {
     
    22112149          else if (child.getName().equals("enumoptions"))
    22122150          {
    2213             Iterator<Element> it2 = child.getDescendants(new Filter()
    2214             {
    2215 
    2216               public boolean matches(Object o)
    2217               {
    2218                 if (o instanceof Element)
    2219                 {
    2220                   return true;
    2221                 }
    2222                 return false;
    2223               }
    2224             });
     2151            Iterator<Element> it2 = child.getDescendants(new ElementFilter());
    22252152            while (it2.hasNext())
    22262153            {
     
    23832310    }
    23842311  }
    2385  
    2386   private class ListMap<K, V> extends java.util.AbstractMap<K, V>
    2387   {
    2388     private List<K> keys = new ArrayList<K>();
    2389     private List<V> values = new ArrayList<V>();
    2390 
    2391     @Override
    2392     public Set<java.util.Map.Entry<K, V>> entrySet()
    2393     {
    2394       throw new UnsupportedOperationException();
    2395     }
    2396 
    2397     @Override
    2398     public V put(K key, V value)
    2399     {
    2400       V ret = null;
    2401       int index = keys.indexOf(key);
    2402       if (index == -1)
    2403       {
    2404         keys.add(key);
    2405         values.add(value);
    2406       }
    2407       else
    2408       {
    2409         keys.set(index, key);
    2410         ret = values.set(index, value);
    2411       }
    2412       return ret;
    2413     }
    2414 
    2415     @Override
    2416     public V get(Object key)
    2417     {
    2418       if (key == null) throw new NullPointerException();
    2419       int index = keys.indexOf(key);
    2420       V ret = null;
    2421       if (index != -1)
    2422       {
    2423         ret = values.get(index);
    2424       }
    2425       return ret;
    2426     }
    2427 
    2428     @Override
    2429     public boolean isEmpty()
    2430     {
    2431       return keys.isEmpty();
    2432     }
    2433 
    2434     @Override
    2435     public Set<K> keySet()
    2436     {
    2437       return new AbstractSet<K>()
    2438       {
    2439         @Override
    2440         public Iterator<K> iterator()
    2441         {
    2442           return Collections.unmodifiableList(keys).iterator();
    2443         }
    2444 
    2445         @Override
    2446         public int size()
    2447         {
    2448           return keys.size();
    2449         }
    2450       };
    2451     }
    2452    
    2453   }
    24542312
    24552313  private enum Base1JobParameterType
  • trunk/src/test/TestBase1PluginExecuter.java

    r4776 r4930  
    6868        "genepix", new String[] { "raw('ch1FgMedian')", "raw('ch2FgMedian')" }, false);
    6969   
    70     int formulaChromosomeId = TestFormula.test_create("chromosome",
    71         Formula.Type.COLUMN_EXPRESSION, "genepix", new String[] { "rep('chromosome')" }, false);
    7270    int posFormulaId = TestFormula.test_create("position",
    7371        Formula.Type.COLUMN_EXPRESSION, "genepix", new String[] { "pos()" }, false);
     
    153151    TestPluginConfiguration.test_delete(pluginConfigurationIdCleanStd);
    154152    TestFormula.test_delete(formulaId);
    155     TestFormula.test_delete(formulaChromosomeId);
    156153    TestFormula.test_delete(posFormulaId);
    157154    TestFormula.test_delete(reporterFormulaId);
  • trunk/src/test/TestJob.java

    r4889 r4930  
    100100      dc = TestUtil.getDbControl();
    101101      job = Job.getById(dc, id);
     102      if (!TestUtil.getSilent()) write("");
    102103      write_item(0, job);
    103104      write("--Execute job OK ("+response.getMessage()+")");
Note: See TracChangeset for help on using the changeset viewer.