Changeset 6612


Ignore:
Timestamp:
06/30/10 20:48:48 (9 years ago)
Author:
melissa
Message:

Fixed parsing of large OME-XML files and pre-2010-04 files with little-endian pixel data.

Location:
trunk/components
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/components/bio-formats/src/loci/formats/in/OMEXMLReader.java

    r6601 r6612  
    9090  private Vector<Long> binDataLengths; 
    9191  private Vector<String> compression; 
    92   private Vector<Boolean> bigEndian; 
    9392 
    9493  private String omexml; 
     
    245244      binDataOffsets = null; 
    246245      binDataLengths = null; 
    247       bigEndian = null; 
    248246      omexml = null; 
    249247      hasSPW = false; 
     
    263261    binDataLengths = new Vector<Long>(); 
    264262    compression = new Vector<String>(); 
    265     bigEndian = new Vector<Boolean>(); 
    266263 
    267264    DefaultHandler handler = new OMEXMLHandler(); 
    268265    try { 
    269       XMLTools.parseXML(in, handler); 
     266      RandomAccessInputStream s = new RandomAccessInputStream(id); 
     267      XMLTools.parseXML(s, handler); 
     268      s.close(); 
    270269    } 
    271270    catch (IOException e) { 
     
    321320      } 
    322321 
    323       Boolean endian = bigEndian.get(imageIndex); 
     322      Boolean endian = omexmlMeta.getPixelsBinDataBigEndian(imageIndex, 0); 
    324323      String pixType = omexmlMeta.getPixelsType(i).toString(); 
    325324      core[i].dimensionOrder = omexmlMeta.getPixelsDimensionOrder(i).toString(); 
     
    372371 
    373372    public void endElement(String uri, String localName, String qName) { 
    374       if (qName.indexOf("BinData") == -1) { 
    375         xmlBuffer.append("</"); 
    376         xmlBuffer.append(qName); 
    377         xmlBuffer.append(">"); 
    378       } 
    379       else { 
     373      xmlBuffer.append("</"); 
     374      xmlBuffer.append(qName); 
     375      xmlBuffer.append(">"); 
     376      if (qName.indexOf("BinData") >= 0) { 
    380377        binDataOffsets.add(new Long(nextBinDataOffset - binDataChars)); 
    381378      } 
     
    403400          String key = attributes.getQName(i); 
    404401          String value = attributes.getValue(i); 
     402          if (key.equals("BigEndian")) { 
     403            String endian = value.toLowerCase(); 
     404            if (!endian.equals("true") && !endian.equals("false")) { 
     405              // hack for files that specify 't' or 'f' instead of 
     406              // 'true' or 'false' 
     407              if (endian.startsWith("t")) endian = "true"; 
     408              else if (endian.startsWith("f")) endian = "false"; 
     409            } 
     410            value = endian; 
     411          } 
    405412          xmlBuffer.append(" "); 
    406413          xmlBuffer.append(key); 
     
    420427        compression.add(compress == null ? "" : compress); 
    421428        binDataChars = 0; 
    422         String endian = attributes.getValue("BigEndian"); 
    423         bigEndian.add(new Boolean(endian)); 
     429 
     430        xmlBuffer.append("<"); 
     431        xmlBuffer.append(qName); 
     432        for (int i=0; i<attributes.getLength(); i++) { 
     433          String key = attributes.getQName(i); 
     434          String value = attributes.getValue(i); 
     435          if (key.equals("Length")) value = "0"; 
     436          xmlBuffer.append(" "); 
     437          xmlBuffer.append(key); 
     438          xmlBuffer.append("=\""); 
     439          xmlBuffer.append(value); 
     440          xmlBuffer.append("\""); 
     441        } 
     442        xmlBuffer.append(">"); 
    424443      } 
    425444 
  • trunk/components/common/src/loci/common/RandomAccessInputStream.java

    r6495 r6612  
    360360  /** Read bytes from the stream into the given array. */ 
    361361  public int read(byte[] array) throws IOException { 
    362     return raf.read(array); 
     362    int rtn = raf.read(array); 
     363    if (rtn == 0 && raf.getFilePointer() >= raf.length() - 1) rtn = -1; 
     364    return rtn; 
    363365  } 
    364366 
     
    367369   */ 
    368370  public int read(byte[] array, int offset, int n) throws IOException { 
    369     return raf.read(array, offset, n); 
     371    int rtn = raf.read(array, offset, n); 
     372    if (rtn == 0 && raf.getFilePointer() >= raf.length() - 1) rtn = -1; 
     373    return rtn; 
    370374  } 
    371375 
  • trunk/components/common/src/loci/common/xml/XMLTools.java

    r6495 r6612  
    247247 
    248248  /** 
    249    * Parses the given XML string into a list of key/value pairs 
     249   * Parses the given XML string using the specified XML handler. 
     250   */ 
     251  public static void parseXML(String xml, DefaultHandler handler) 
     252    throws IOException 
     253  { 
     254    parseXML(xml.getBytes(), handler); 
     255  } 
     256 
     257  /** 
     258   * Parses the XML contained in the given input stream into 
    250259   * using the specified XML handler. 
    251    */ 
    252   public static void parseXML(String xml, DefaultHandler handler) 
    253     throws IOException 
    254   { 
    255     parseXML(xml.getBytes(), handler); 
    256   } 
    257  
    258   /** 
    259    * Parses the XML string from the given input stream into 
    260    * a list of key/value pairs using the specified XML handler. 
     260   * Be very careful, as 'stream' <b>will</b> be closed by the SAX parser. 
    261261   */ 
    262262  public static void parseXML(RandomAccessInputStream stream, 
    263263    DefaultHandler handler) throws IOException 
    264264  { 
    265     byte[] b = new byte[(int) (stream.length() - stream.getFilePointer())]; 
    266     stream.readFully(b); 
    267     parseXML(b, handler); 
    268     b = null; 
    269   } 
    270  
    271   /** 
    272    * Parses the XML string from the given byte array into 
    273    * a list of key/value pairs using the specified XML handler. 
     265    parseXML((InputStream) stream, handler); 
     266  } 
     267 
     268  /** 
     269   * Parses the XML contained in the given byte array into 
     270   * using the specified XML handler. 
    274271   */ 
    275272  public static void parseXML(byte[] xml, DefaultHandler handler) 
    276273    throws IOException 
    277274  { 
     275    parseXML(new ByteArrayInputStream(xml), handler); 
     276  } 
     277 
     278  /** 
     279   * Parses the XML contained in the given InputStream using the 
     280   * specified XML handler. 
     281   */ 
     282  public static void parseXML(InputStream xml, DefaultHandler handler) 
     283    throws IOException 
     284  { 
    278285    try { 
    279286      // Java XML factories are not declared to be thread safe 
    280       SAXParserFactory factory = SAXParserFactory.newInstance();  
     287      SAXParserFactory factory = SAXParserFactory.newInstance(); 
    281288      SAXParser parser = factory.newSAXParser(); 
    282       parser.parse(new ByteArrayInputStream(xml), handler); 
     289      parser.parse(xml, handler); 
    283290    } 
    284291    catch (ParserConfigurationException exc) { 
Note: See TracChangeset for help on using the changeset viewer.