Changeset 5678


Ignore:
Timestamp:
11/09/09 09:06:10 (10 years ago)
Author:
melissa
Message:

Place timestamps in original metadata hashtable and populate PlaneTiming.DeltaT.

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • branches/4.1/components/bio-formats/src/loci/formats/in/FluoviewReader.java

    r5517 r5678  
    2727import java.util.StringTokenizer; 
    2828 
     29import loci.common.DateTools; 
    2930import loci.common.RandomAccessInputStream; 
    3031import loci.formats.CoreMetadata; 
     
    6061  private static final int MMSTAMP = 34362; 
    6162 
     63  /** Date format */ 
     64  private static final String DATE_FORMAT = "MM/dd/yyyy HH:mm:ss.SSS"; 
     65 
    6266  // -- Fields -- 
    6367 
    6468  /** Pixel dimensions for this file. */ 
    65   private float voxelX = 1f, voxelY = 1f, voxelZ = 1f, voxelC = 1f, voxelT = 1f; 
     69  private double voxelX = 1, voxelY = 1, voxelZ = 1, voxelC = 1, voxelT = 1; 
    6670 
    6771  private String dimensionOrder; 
     72  private String date = null; 
     73  private int timeIndex = -1; 
     74  private long[][] stamps = null; 
    6875 
    6976  // hardware settings 
    7077  private String[] gains, voltages, offsets, channelNames, lensNA; 
    7178  private String mag, detManu, objManu, comment; 
    72   private Double gamma; 
     79  private Float gamma; 
    7380 
    7481  // -- Constructor -- 
     
    143150    super.close(fileOnly); 
    144151    if (!fileOnly) { 
    145       voxelX = voxelY = voxelZ = voxelC = voxelT = 1f; 
     152      voxelX = voxelY = voxelZ = voxelC = voxelT = 1; 
    146153      dimensionOrder = null; 
    147154      gains = voltages = offsets = channelNames = lensNA = null; 
    148155      mag = detManu = objManu = comment = null; 
    149156      gamma = null; 
     157      date = null; 
     158      timeIndex = -1; 
     159      stamps = null; 
    150160    } 
    151161  } 
     
    230240    // now we need to read the MMSTAMP data to determine dimension order 
    231241 
    232     double[][] stamps = new double[8][ifds.size()]; 
     242    stamps = new long[8][ifds.size()]; 
    233243    for (int i=0; i<ifds.size(); i++) { 
    234244      s = ifds.get(i).getIFDShortArray(MMSTAMP, true); 
     
    240250      ras = new RandomAccessInputStream(stamp); 
    241251 
    242       // each stamp is 8 doubles, representing the position on dimensions 3-10 
     252      // each stamp is 8 longs, representing the position on dimensions 3-10 
    243253      for (int j=0; j<8; j++) { 
    244         stamps[j][i] = ras.readDouble(); 
     254        stamps[j][i] = ras.readLong() / 10000; 
    245255      } 
    246256    } 
     
    255265      String name = names[i]; 
    256266      int size = sizes[i]; 
    257       float voxel = (float) resolutions[i]; 
     267      double voxel = resolutions[i]; 
    258268      if (name == null || size == 0) continue; 
    259269      name = name.toLowerCase().trim(); 
     
    288298        } 
    289299        voxelT = voxel; 
     300        timeIndex = i - 2; 
    290301      } 
    291302      else { 
     
    330341    lensNA = new String[getSizeC()]; 
    331342 
    332     if (comment != null && comment.startsWith("[")) { 
    333       int start = comment.indexOf("[Acquisition Parameters]"); 
    334       int end = comment.indexOf("[Acquisition Parameters End]"); 
    335       if (start != -1 && end != -1 && end > start) { 
    336         String parms = comment.substring(start + 24, end).trim(); 
    337  
    338         // this is an INI-style comment, with one key/value pair per line 
    339  
    340         StringTokenizer st = new StringTokenizer(parms, "\n"); 
    341         while (st.hasMoreTokens()) { 
    342           String token = st.nextToken(); 
    343           int eq = token.indexOf("="); 
    344           if (eq != -1) { 
    345             String key = token.substring(0, eq); 
    346             String value = token.substring(eq + 1); 
    347             addGlobalMeta(key, value); 
    348             if (key.startsWith("Gain Ch")) { 
    349               for (int i=0; i<gains.length; i++) { 
    350                 if (gains[i] == null) { 
    351                   gains[i] = value; 
    352                   break; 
    353                 } 
     343    if (comment != null) { 
     344      // this is an INI-style comment, with one key/value pair per line 
     345 
     346      StringTokenizer st = new StringTokenizer(comment, "\n"); 
     347      while (st.hasMoreTokens()) { 
     348        String token = st.nextToken(); 
     349        int eq = token.indexOf("="); 
     350        if (eq != -1) { 
     351          String key = token.substring(0, eq); 
     352          String value = token.substring(eq + 1); 
     353          addGlobalMeta(key, value); 
     354          if (key.startsWith("Gain Ch")) { 
     355            for (int i=0; i<gains.length; i++) { 
     356              if (gains[i] == null) { 
     357                gains[i] = value; 
     358                break; 
    354359              } 
    355360            } 
    356             else if (key.startsWith("PMT Voltage Ch")) { 
    357               for (int i=0; i<voltages.length; i++) { 
    358                 if (voltages[i] == null) { 
    359                   voltages[i] = value; 
    360                   break; 
    361                 } 
     361          } 
     362          else if (key.startsWith("PMT Voltage Ch")) { 
     363            for (int i=0; i<voltages.length; i++) { 
     364              if (voltages[i] == null) { 
     365                voltages[i] = value; 
     366                break; 
    362367              } 
    363368            } 
    364             else if (key.startsWith("Offset Ch")) { 
    365               for (int i=0; i<offsets.length; i++) { 
    366                 if (offsets[i] == null) { 
    367                   offsets[i] = value; 
    368                   break; 
    369                 } 
     369          } 
     370          else if (key.startsWith("Offset Ch")) { 
     371            for (int i=0; i<offsets.length; i++) { 
     372              if (offsets[i] == null) { 
     373                offsets[i] = value; 
     374                break; 
    370375              } 
    371376            } 
    372             else if (key.equals("Magnification")) mag = value; 
    373             else if (key.equals("System Configuration")) detManu = value; 
    374             else if (key.equals("Objective Lens")) objManu = value; 
    375             else if (key.equals("Gamma")) gamma = new Double(value); 
    376             else if (key.startsWith("Channel ") && key.endsWith("Dye")) { 
    377               for (int i=0; i<channelNames.length; i++) { 
    378                 if (channelNames[i] == null) { 
    379                   channelNames[i] = value; 
    380                   break; 
    381                 } 
     377          } 
     378          else if (key.equals("Magnification")) mag = value; 
     379          else if (key.equals("System Configuration")) detManu = value; 
     380          else if (key.equals("Objective Lens")) objManu = value; 
     381          else if (key.equals("Gamma")) gamma = new Float(value); 
     382          else if (key.startsWith("Channel ") && key.endsWith("Dye")) { 
     383            for (int i=0; i<channelNames.length; i++) { 
     384              if (channelNames[i] == null) { 
     385                channelNames[i] = value; 
     386                break; 
    382387              } 
    383388            } 
    384             else if (key.startsWith("Confocal Aperture-Ch")) { 
    385               for (int i=0; i<lensNA.length; i++) { 
    386                 if (lensNA[i] == null) { 
    387                   lensNA[i] = value.substring(0, value.length() - 2); 
    388                   break; 
    389                 } 
     389          } 
     390          else if (key.startsWith("Confocal Aperture-Ch")) { 
     391            for (int i=0; i<lensNA.length; i++) { 
     392              if (lensNA[i] == null) { 
     393                lensNA[i] = value.substring(0, value.length() - 2); 
     394                break; 
    390395              } 
    391396            } 
    392397          } 
     398          else if (key.equals("Date")) { 
     399            date = value; 
     400          } 
     401          else if (key.equals("Time")) { 
     402            date += " " + value; 
     403          } 
    393404        } 
    394405      } 
    395  
    396       start = comment.indexOf("[Version Info]"); 
    397       end = comment.indexOf("[Version Info End]"); 
     406      if (date != null) { 
     407        date = DateTools.formatDate(date.trim(), 
     408          new String[] {"MM/dd/yyyy hh:mm:ss a", "MM-dd-yyyy hh:mm:ss"}, true); 
     409        if (timeIndex >= 0 && date != null) { 
     410          long ms = DateTools.getTime(date, DateTools.ISO8601_FORMAT); 
     411          int nChars = String.valueOf(getImageCount()).length(); 
     412          for (int i=0; i<getImageCount(); i++) { 
     413            int[] zct = getZCTCoords(i); 
     414            String key = String.format( 
     415              "Timestamp for Z=%2s, C=%2s, T=%2s", zct[0], zct[1], zct[2]); 
     416            long stamp = ms + stamps[timeIndex][i]; 
     417            addGlobalMeta(key, 
     418              DateTools.convertDate(stamp, DateTools.UNIX, DATE_FORMAT)); 
     419          } 
     420        } 
     421      } 
     422 
     423      int start = comment.indexOf("[Version Info]"); 
     424      int end = comment.indexOf("[Version Info End]"); 
    398425      if (start != -1 && end != -1 && end > start) { 
    399426        comment = comment.substring(start + 14, end).trim(); 
     
    413440    MetadataStore store = 
    414441      new FilterMetadata(getMetadataStore(), isMetadataFiltered()); 
     442    MetadataTools.populatePixels(store, this, true); 
    415443 
    416444    store.setImageDescription(comment, 0); 
     445    if (date != null) { 
     446      store.setImageCreationDate(date, 0); 
     447    } 
    417448 
    418449    // link Instrument and Image 
     
    420451    store.setInstrumentID(instrumentID, 0); 
    421452    store.setImageInstrumentRef(instrumentID, 0); 
     453 
     454    // populate timing data 
     455    if (timeIndex >= 0) { 
     456      for (int i=0; i<getImageCount(); i++) { 
     457        store.setPlaneTimingDeltaT( 
     458          new Float(stamps[timeIndex][i] / 1000.0), 0, 0, i); 
     459      } 
     460    } 
    422461 
    423462    // populate Dimensions 
     
    443482      // CTR CHECK 
    444483//      store.setDisplayChannel(new Integer(i), null, null, 
    445 //        gamma == null ? null : new Float(gamma.floatValue()), null); 
     484//        gamma == null ? null : new Double(gamma.doubleValue()), null); 
    446485 
    447486      if (voltages[i] != null) { 
  • branches/4.1/components/common/src/loci/common/DateTools.java

    r5457 r5678  
    7474  } 
    7575 
    76   /** Converts the given timestamp into an ISO 8601 date. */ 
     76  /** Converts the given timestamp into an ISO8601 date. */ 
    7777  public static String convertDate(long stamp, int format) { 
     78    return convertDate(stamp, format, ISO8601_FORMAT); 
     79  } 
     80 
     81  /** Converts the given timestamp into a date string with the given format. */ 
     82  public static String convertDate(long stamp, int format, String outputFormat) 
     83  { 
    7884    // see http://www.merlyn.demon.co.uk/critdate.htm for more information on 
    7985    // dates than you will ever need (or want) 
     
    96102    } 
    97103 
    98     SimpleDateFormat fmt = new SimpleDateFormat(ISO8601_FORMAT); 
     104    SimpleDateFormat fmt = new SimpleDateFormat(outputFormat); 
    99105    StringBuffer sb = new StringBuffer(); 
    100106 
     
    107113  /** 
    108114   * Formats the given date as an ISO 8601 date. 
     115   * Delegates to {@link formatDate(String, String, boolean)}, with the 
     116   * 'lenient' flag set to false. 
    109117   * 
    110118   * @param date The date to format as ISO 8601. 
     
    112120   */ 
    113121  public static String formatDate(String date, String format) { 
     122    return formatDate(date, format, false); 
     123  } 
     124 
     125  /** 
     126   * Formats the given date as an ISO 8601 date. 
     127   * 
     128   * @param date The date to format as ISO 8601. 
     129   * @param form The date's input format. 
     130   * @param lenient Whether or not to leniently parse the date. 
     131   */ 
     132  public static String formatDate(String date, String format, boolean lenient) { 
    114133    if (date == null) return null; 
    115134    SimpleDateFormat sdf = new SimpleDateFormat(format); 
    116     sdf.setLenient(false); 
     135    sdf.setLenient(lenient); 
    117136    Date d = sdf.parse(date, new ParsePosition(0)); 
    118137    if (d == null) return null; 
     
    123142  /** 
    124143   * Formats the given date as an ISO 8601 date. 
     144   * Delegates to {@link formatDates(String, String[], boolean)}, with the 
     145   * 'lenient' flag set to false. 
    125146   * 
    126147   * @param date The date to format as ISO 8601. 
     
    128149   */ 
    129150  public static String formatDate(String date, String[] formats) { 
     151    return formatDate(date, formats, false); 
     152  } 
     153 
     154  /** 
     155   * Formats the given date as an ISO 8601 date. 
     156   * 
     157   * @param date The date to format as ISO 8601. 
     158   * @param formats The date's possible input formats. 
     159   * @param lenient Whether or not to leniently parse the date. 
     160   */ 
     161  public static String formatDate(String date, String[] formats, 
     162    boolean lenient) 
     163  { 
    130164    for (int i=0; i<formats.length; i++) { 
    131       String result = formatDate(date, formats[i]); 
     165      String result = formatDate(date, formats[i], lenient); 
    132166      if (result != null) return result; 
    133167    } 
  • trunk/components/bio-formats/src/loci/formats/in/FluoviewReader.java

    r5624 r5678  
    2727import java.util.StringTokenizer; 
    2828 
     29import loci.common.DateTools; 
    2930import loci.common.RandomAccessInputStream; 
    3031import loci.formats.CoreMetadata; 
     
    6061  private static final int MMSTAMP = 34362; 
    6162 
     63  /** Date format */ 
     64  private static final String DATE_FORMAT = "MM/dd/yyyy HH:mm:ss.SSS"; 
     65 
    6266  // -- Fields -- 
    6367 
     
    6670 
    6771  private String dimensionOrder; 
     72  private String date = null; 
     73  private int timeIndex = -1; 
     74  private long[][] stamps = null; 
    6875 
    6976  // hardware settings 
     
    148155      mag = detManu = objManu = comment = null; 
    149156      gamma = null; 
     157      date = null; 
     158      timeIndex = -1; 
     159      stamps = null; 
    150160    } 
    151161  } 
     
    230240    // now we need to read the MMSTAMP data to determine dimension order 
    231241 
    232     double[][] stamps = new double[8][ifds.size()]; 
     242    stamps = new long[8][ifds.size()]; 
    233243    for (int i=0; i<ifds.size(); i++) { 
    234244      s = ifds.get(i).getIFDShortArray(MMSTAMP, true); 
     
    240250      ras = new RandomAccessInputStream(stamp); 
    241251 
    242       // each stamp is 8 doubles, representing the position on dimensions 3-10 
     252      // each stamp is 8 longs, representing the position on dimensions 3-10 
    243253      for (int j=0; j<8; j++) { 
    244         stamps[j][i] = ras.readDouble(); 
     254        stamps[j][i] = ras.readLong() / 10000; 
    245255      } 
    246256    } 
     
    288298        } 
    289299        voxelT = voxel; 
     300        timeIndex = i - 2; 
    290301      } 
    291302      else { 
     
    330341    lensNA = new String[getSizeC()]; 
    331342 
    332     if (comment != null && comment.startsWith("[")) { 
    333       int start = comment.indexOf("[Acquisition Parameters]"); 
    334       int end = comment.indexOf("[Acquisition Parameters End]"); 
    335       if (start != -1 && end != -1 && end > start) { 
    336         String parms = comment.substring(start + 24, end).trim(); 
    337  
    338         // this is an INI-style comment, with one key/value pair per line 
    339  
    340         StringTokenizer st = new StringTokenizer(parms, "\n"); 
    341         while (st.hasMoreTokens()) { 
    342           String token = st.nextToken(); 
    343           int eq = token.indexOf("="); 
    344           if (eq != -1) { 
    345             String key = token.substring(0, eq); 
    346             String value = token.substring(eq + 1); 
    347             addGlobalMeta(key, value); 
    348             if (key.startsWith("Gain Ch")) { 
    349               for (int i=0; i<gains.length; i++) { 
    350                 if (gains[i] == null) { 
    351                   gains[i] = value; 
    352                   break; 
    353                 } 
     343    if (comment != null) { 
     344      // this is an INI-style comment, with one key/value pair per line 
     345 
     346      StringTokenizer st = new StringTokenizer(comment, "\n"); 
     347      while (st.hasMoreTokens()) { 
     348        String token = st.nextToken(); 
     349        int eq = token.indexOf("="); 
     350        if (eq != -1) { 
     351          String key = token.substring(0, eq); 
     352          String value = token.substring(eq + 1); 
     353          addGlobalMeta(key, value); 
     354          if (key.startsWith("Gain Ch")) { 
     355            for (int i=0; i<gains.length; i++) { 
     356              if (gains[i] == null) { 
     357                gains[i] = value; 
     358                break; 
    354359              } 
    355360            } 
    356             else if (key.startsWith("PMT Voltage Ch")) { 
    357               for (int i=0; i<voltages.length; i++) { 
    358                 if (voltages[i] == null) { 
    359                   voltages[i] = value; 
    360                   break; 
    361                 } 
     361          } 
     362          else if (key.startsWith("PMT Voltage Ch")) { 
     363            for (int i=0; i<voltages.length; i++) { 
     364              if (voltages[i] == null) { 
     365                voltages[i] = value; 
     366                break; 
    362367              } 
    363368            } 
    364             else if (key.startsWith("Offset Ch")) { 
    365               for (int i=0; i<offsets.length; i++) { 
    366                 if (offsets[i] == null) { 
    367                   offsets[i] = value; 
    368                   break; 
    369                 } 
     369          } 
     370          else if (key.startsWith("Offset Ch")) { 
     371            for (int i=0; i<offsets.length; i++) { 
     372              if (offsets[i] == null) { 
     373                offsets[i] = value; 
     374                break; 
    370375              } 
    371376            } 
    372             else if (key.equals("Magnification")) mag = value; 
    373             else if (key.equals("System Configuration")) detManu = value; 
    374             else if (key.equals("Objective Lens")) objManu = value; 
    375             else if (key.equals("Gamma")) gamma = new Double(value); 
    376             else if (key.startsWith("Channel ") && key.endsWith("Dye")) { 
    377               for (int i=0; i<channelNames.length; i++) { 
    378                 if (channelNames[i] == null) { 
    379                   channelNames[i] = value; 
    380                   break; 
    381                 } 
     377          } 
     378          else if (key.equals("Magnification")) mag = value; 
     379          else if (key.equals("System Configuration")) detManu = value; 
     380          else if (key.equals("Objective Lens")) objManu = value; 
     381          else if (key.equals("Gamma")) gamma = new Double(value); 
     382          else if (key.startsWith("Channel ") && key.endsWith("Dye")) { 
     383            for (int i=0; i<channelNames.length; i++) { 
     384              if (channelNames[i] == null) { 
     385                channelNames[i] = value; 
     386                break; 
    382387              } 
    383388            } 
    384             else if (key.startsWith("Confocal Aperture-Ch")) { 
    385               for (int i=0; i<lensNA.length; i++) { 
    386                 if (lensNA[i] == null) { 
    387                   lensNA[i] = value.substring(0, value.length() - 2); 
    388                   break; 
    389                 } 
     389          } 
     390          else if (key.startsWith("Confocal Aperture-Ch")) { 
     391            for (int i=0; i<lensNA.length; i++) { 
     392              if (lensNA[i] == null) { 
     393                lensNA[i] = value.substring(0, value.length() - 2); 
     394                break; 
    390395              } 
    391396            } 
    392397          } 
     398          else if (key.equals("Date")) { 
     399            date = value; 
     400          } 
     401          else if (key.equals("Time")) { 
     402            date += " " + value; 
     403          } 
    393404        } 
    394405      } 
    395  
    396       start = comment.indexOf("[Version Info]"); 
    397       end = comment.indexOf("[Version Info End]"); 
     406      if (date != null) { 
     407        date = DateTools.formatDate(date.trim(), 
     408          new String[] {"MM/dd/yyyy hh:mm:ss a", "MM-dd-yyyy hh:mm:ss"}, true); 
     409        if (timeIndex >= 0 && date != null) { 
     410          long ms = DateTools.getTime(date, DateTools.ISO8601_FORMAT); 
     411          int nChars = String.valueOf(getImageCount()).length(); 
     412          for (int i=0; i<getImageCount(); i++) { 
     413            int[] zct = getZCTCoords(i); 
     414            String key = String.format( 
     415              "Timestamp for Z=%2s, C=%2s, T=%2s", zct[0], zct[1], zct[2]); 
     416            long stamp = ms + stamps[timeIndex][i]; 
     417            addGlobalMeta(key, 
     418              DateTools.convertDate(stamp, DateTools.UNIX, DATE_FORMAT)); 
     419          } 
     420        } 
     421      } 
     422 
     423      int start = comment.indexOf("[Version Info]"); 
     424      int end = comment.indexOf("[Version Info End]"); 
    398425      if (start != -1 && end != -1 && end > start) { 
    399426        comment = comment.substring(start + 14, end).trim(); 
     
    413440    MetadataStore store = 
    414441      new FilterMetadata(getMetadataStore(), isMetadataFiltered()); 
     442    MetadataTools.populatePixels(store, this, true); 
    415443 
    416444    store.setImageDescription(comment, 0); 
     445    if (date != null) { 
     446      store.setImageCreationDate(date, 0); 
     447    } 
    417448 
    418449    // link Instrument and Image 
     
    420451    store.setInstrumentID(instrumentID, 0); 
    421452    store.setImageInstrumentRef(instrumentID, 0); 
     453 
     454    // populate timing data 
     455    if (timeIndex >= 0) { 
     456      for (int i=0; i<getImageCount(); i++) { 
     457        store.setPlaneTimingDeltaT( 
     458          new Double(stamps[timeIndex][i] / 1000.0), 0, 0, i); 
     459      } 
     460    } 
    422461 
    423462    // populate Dimensions 
  • trunk/components/common/src/loci/common/DateTools.java

    r5457 r5678  
    7474  } 
    7575 
    76   /** Converts the given timestamp into an ISO 8601 date. */ 
     76  /** Converts the given timestamp into an ISO8601 date. */ 
    7777  public static String convertDate(long stamp, int format) { 
     78    return convertDate(stamp, format, ISO8601_FORMAT); 
     79  } 
     80 
     81  /** Converts the given timestamp into a date string with the given format. */ 
     82  public static String convertDate(long stamp, int format, String outputFormat) 
     83  { 
    7884    // see http://www.merlyn.demon.co.uk/critdate.htm for more information on 
    7985    // dates than you will ever need (or want) 
     
    96102    } 
    97103 
    98     SimpleDateFormat fmt = new SimpleDateFormat(ISO8601_FORMAT); 
     104    SimpleDateFormat fmt = new SimpleDateFormat(outputFormat); 
    99105    StringBuffer sb = new StringBuffer(); 
    100106 
     
    107113  /** 
    108114   * Formats the given date as an ISO 8601 date. 
     115   * Delegates to {@link formatDate(String, String, boolean)}, with the 
     116   * 'lenient' flag set to false. 
    109117   * 
    110118   * @param date The date to format as ISO 8601. 
     
    112120   */ 
    113121  public static String formatDate(String date, String format) { 
     122    return formatDate(date, format, false); 
     123  } 
     124 
     125  /** 
     126   * Formats the given date as an ISO 8601 date. 
     127   * 
     128   * @param date The date to format as ISO 8601. 
     129   * @param form The date's input format. 
     130   * @param lenient Whether or not to leniently parse the date. 
     131   */ 
     132  public static String formatDate(String date, String format, boolean lenient) { 
    114133    if (date == null) return null; 
    115134    SimpleDateFormat sdf = new SimpleDateFormat(format); 
    116     sdf.setLenient(false); 
     135    sdf.setLenient(lenient); 
    117136    Date d = sdf.parse(date, new ParsePosition(0)); 
    118137    if (d == null) return null; 
     
    123142  /** 
    124143   * Formats the given date as an ISO 8601 date. 
     144   * Delegates to {@link formatDates(String, String[], boolean)}, with the 
     145   * 'lenient' flag set to false. 
    125146   * 
    126147   * @param date The date to format as ISO 8601. 
     
    128149   */ 
    129150  public static String formatDate(String date, String[] formats) { 
     151    return formatDate(date, formats, false); 
     152  } 
     153 
     154  /** 
     155   * Formats the given date as an ISO 8601 date. 
     156   * 
     157   * @param date The date to format as ISO 8601. 
     158   * @param formats The date's possible input formats. 
     159   * @param lenient Whether or not to leniently parse the date. 
     160   */ 
     161  public static String formatDate(String date, String[] formats, 
     162    boolean lenient) 
     163  { 
    130164    for (int i=0; i<formats.length; i++) { 
    131       String result = formatDate(date, formats[i]); 
     165      String result = formatDate(date, formats[i], lenient); 
    132166      if (result != null) return result; 
    133167    } 
Note: See TracChangeset for help on using the changeset viewer.