Changeset 3969


Ignore:
Timestamp:
04/23/08 09:55:11 (12 years ago)
Author:
melissa
Message:

OMEWriter now uploads original metadata (if available). Also added a utility method to DataTools that removes invalid characters from an XML string.

Location:
trunk/loci/formats
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/formats/DataTools.java

    r3951 r3969  
    602602  } 
    603603 
     604  /** Remove invalid characters from an XML string. */ 
     605  public static String sanitizeXML(String s) { 
     606    for (int i=0; i<s.length(); i++) { 
     607      char c = s.charAt(i); 
     608      if (Character.isISOControl(c) || !Character.isDefined(c) || c > '~') { 
     609        s = s.replace(c, ' '); 
     610      } 
     611    } 
     612    return s; 
     613  } 
     614 
    604615  /** 
    605616   * Load a list of metadata tags and their corresponding descriptions. 
  • trunk/loci/formats/in/LIFReader.java

    r3854 r3969  
    234234      "</LEICA>"; 
    235235 
    236     // strip out invalid characters 
    237     for (int i=0; i<xml.length(); i++) { 
    238       char c = xml.charAt(i); 
    239       if (Character.isISOControl(c) || !Character.isDefined(c)) { 
    240         xml = xml.replace(c, ' '); 
    241       } 
    242     } 
     236    xml = DataTools.sanitizeXML(xml); 
    243237 
    244238    try { 
  • trunk/loci/formats/in/ND2Reader.java

    r3929 r3969  
    260260  { 
    261261    if (legacy) return openImage(no, x, y, w, h); 
    262     if (!isJPEG) { 
    263       return ImageTools.makeImage(openBytes(no, x, y, w, h), core.sizeX[series], 
    264         core.sizeY[series], getRGBChannelCount(), core.interleaved[series], 
    265         FormatTools.getBytesPerPixel(core.pixelType[series]), 
    266         core.littleEndian[series]); 
    267     } 
     262    if (!isJPEG) return super.openImage(no, x, y, w, h); 
    268263 
    269264    FormatTools.assertId(currentId, true, 1); 
     
    372367      in.order(true); 
    373368 
    374       byte[] b = new byte[1024 * 1024]; 
     369      byte[] b = new byte[10 * 1024 * 1024]; 
    375370      int numValidPlanes = 0; 
    376371      while (in.getFilePointer() < in.length()) { 
     
    407402            int pt = 13; 
    408403            while (b[pt] != '!') { 
    409               sb.append((char) b[pt]); 
    410               pt++; 
     404              sb.append((char) b[pt++]); 
    411405            } 
    412406            int ndx = Integer.parseInt(sb.toString()); 
     
    437431 
    438432            // strip out invalid characters 
    439             int off = 0; 
    440             for (int i=0; i<len; i++) { 
    441               char c = (char) b[i]; 
    442               if ((off == 0 && c == '!') || c == 0) off = i + 1; 
    443  
    444               if (Character.isISOControl(c) || !Character.isDefined(c)) { 
    445                 b[i] = (byte) ' '; 
    446               } 
    447             } 
    448  
    449             if (len - off >= 5 && b[off] == '<' && b[off + 1] == '?' && 
    450               b[off + 2] == 'x' && b[off + 3] == 'm' && 
    451               b[off + 4] == 'l') // b.substring(off, off + 5).equals("<?xml") 
    452             { 
    453               ByteArrayInputStream s = 
    454                 new ByteArrayInputStream(b, off, len - off); 
     433            String xml = DataTools.sanitizeXML(new String(b, 0, len)).trim(); 
     434 
     435            if (xml.startsWith("<?xml")) { 
     436              ByteArrayInputStream s = new ByteArrayInputStream(xml.getBytes()); 
    455437 
    456438              try { 
     
    613595        store.setImageCreationDate( 
    614596          DataTools.convertDate(System.currentTimeMillis(), DataTools.UNIX), i); 
    615        
     597 
    616598        if (tsT.size() > 0) { 
    617599          setSeries(i); 
     
    622604            store.setPlaneTheT(new Integer(coords[2]), i, 0, n); 
    623605            float stamp = ((Double) tsT.get(coords[2])).floatValue(); 
    624             store.setPlaneTimingDeltaT(new Float(stamp), i, 0, n);  
     606            store.setPlaneTimingDeltaT(new Float(stamp), i, 0, n); 
    625607          } 
    626608        } 
     
    653635      box = in.readInt(); 
    654636      pos = in.getFilePointer(); 
    655       length -= 8; 
    656637 
    657638      if (box == 0x6a703263) { 
    658639        vs.add(new Long(in.getFilePointer())); 
    659640      } 
    660       if (!lastBoxFound) in.seek(pos + length); 
     641      if (!lastBoxFound) in.skipBytes(length - 8); 
    661642    } 
    662643 
     
    669650    boolean found = false; 
    670651    long off = -1; 
    671     byte[] buf = new byte[2048]; 
     652    byte[] buf = new byte[1024 * 1024]; 
    672653    while (!found && in.getFilePointer() < in.length()) { 
    673654      int read = 0; 
     
    708689      while (st.hasMoreTokens()) { 
    709690        String token = st.nextToken(); 
    710         token = token.replaceAll("<!--.*-->", ""); 
     691        //token = token.replaceAll("<!--.*-->", ""); 
    711692        token = token.replaceAll(".*xml", "").trim(); 
    712693        token = token.substring(0, token.lastIndexOf(">") + 1); 
     
    719700 
    720701      // strip out invalid characters 
    721       int offset = 0; 
    722       byte[] b = xml.getBytes(); 
    723       int len = b.length; 
    724       for (int i=0; i<len; i++) { 
    725         char c = (char) b[i]; 
    726         if (offset == 0 && c == '!') offset = i + 1; 
    727  
    728         if (Character.isISOControl(c) || !Character.isDefined(c)) { 
    729           b[i] = (byte) ' '; 
    730         } 
    731       } 
    732  
    733       ByteArrayInputStream s = 
    734         new ByteArrayInputStream(b, offset, len - offset); 
     702      xml = DataTools.sanitizeXML(xml); 
     703 
     704      ByteArrayInputStream s = new ByteArrayInputStream(xml.getBytes()); 
    735705 
    736706      try { 
  • trunk/loci/formats/in/OMETiffReader.java

    r3920 r3969  
    9393 
    9494    OMETiffHandler handler = new OMETiffHandler(false); 
    95     String comment = TiffTools.getComment(ifds[0]); 
    96  
    97     // remove invalid characters from comment 
    98  
    99     for (int i=0; i<comment.length(); i++) { 
    100       char c = comment.charAt(i); 
    101       if (Character.isISOControl(c) || !Character.isDefined(c)) { 
    102         comment = comment.replace(c, ' '); 
    103       } 
    104     } 
     95    String comment = DataTools.sanitizeXML(TiffTools.getComment(ifds[0])); 
    10596 
    10697    currentSeries = -1; 
  • trunk/loci/formats/ome/OMEWriter.java

    r3831 r3969  
    2727import java.awt.Image; 
    2828import java.io.*; 
     29import java.util.Hashtable; 
    2930import loci.formats.*; 
    3031import loci.formats.meta.MetadataRetrieve; 
     
    340341        r.exec("physical.setModuleExecution(ii)"); 
    341342        r.exec("df.update(physical)"); 
     343 
     344        // upload original metadata, if available 
     345 
     346        if (MetadataTools.isOMEXMLMetadata(metadataRetrieve)) { 
     347          r.setVar("metadata", metadataRetrieve); 
     348          Hashtable meta = (Hashtable) r.exec("metadata.getOriginalMetadata()"); 
     349          String[] keys = (String[]) meta.keySet().toArray(new String[0]); 
     350          r.setVar("ORIGINAL_METADATA", "OriginalMetadata"); 
     351          r.setVar("NAME", "Name"); 
     352          r.setVar("VALUE", "Value"); 
     353          for (int i=0; i<keys.length; i++) { 
     354            r.exec("attribute = df.createNew(ORIGINAL_METADATA)"); 
     355            r.setVar("K", DataTools.sanitizeXML(keys[i])); 
     356            r.setVar("V", DataTools.sanitizeXML((String) meta.get(keys[i]))); 
     357            r.exec("attribute.setStringElement(NAME, K)"); 
     358            r.exec("attribute.setStringElement(VALUE, V)"); 
     359            r.exec("attribute.setImage(img)"); 
     360            r.exec("attribute.setModuleExecution(ii)"); 
     361            r.exec("df.update(attribute)"); 
     362          } 
     363        } 
    342364 
    343365        r.setVar("FINISHED", "FINISHED"); 
     
    537559 
    538560    FileStitcher reader = new FileStitcher(); 
     561    reader.setOriginalMetadataPopulated(true); 
    539562    reader.setMetadataStore(MetadataTools.createOMEXMLMetadata()); 
    540563    reader.setId(id); 
  • trunk/loci/formats/ome/OMEXMLMetadata.java

    r3840 r3969  
    2525package loci.formats.ome; 
    2626 
     27import java.util.Hashtable; 
     28import java.util.List; 
    2729import loci.formats.*; 
    2830import loci.formats.meta.MetadataRetrieve; 
     
    114116  } 
    115117 
     118  /** Get a list of all OriginalMetadata key/value pairs. */ 
     119  public Hashtable getOriginalMetadata() { 
     120    Element ome = root.getDOMElement(); 
     121    Element image = DOMUtil.getChildElement("Image", ome); 
     122    if (image == null) return null; 
     123 
     124    Element ca = DOMUtil.getChildElement("CustomAttributes", image); 
     125    if (ca == null) return null; 
     126 
     127    String key = "OriginalMetadata"; 
     128    List elements = DOMUtil.getChildElements(key, ca); 
     129    if (elements == null) return null; 
     130 
     131    Hashtable h = new Hashtable(); 
     132    for (int i=0; i<elements.size(); i++) { 
     133      Element e = (Element) elements.get(i); 
     134      h.put(DOMUtil.getAttribute("Name", e), DOMUtil.getAttribute("Value", e)); 
     135    } 
     136    return h; 
     137  } 
     138 
    116139  // -- MetadataStore API methods -- 
    117140 
Note: See TracChangeset for help on using the changeset viewer.