Changeset 2294


Ignore:
Timestamp:
02/16/07 20:22:49 (13 years ago)
Author:
chris
Message:

Notebook:
tiffdata parsing crap should all work fine, though
not extensively tested. All elements should be
reinserted properly. Only thing we need now is a
little menu tweaking and I'm going to do that
tomorrow because my brain hurts after the xml
parsing and I could really use a beer. Cheers!

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/loci/ome/notebook/MetadataPane.java

    r2293 r2294  
    3737import javax.swing.table.*; 
    3838import loci.formats.*; 
    39 import loci.formats.out.TiffWriter; 
     39import loci.formats.in.*; 
     40import loci.formats.out.*; 
    4041import org.openmicroscopy.xml.*; 
    4142import org.w3c.dom.*; 
     43import javax.xml.parsers.*; 
     44 
    4245 
    4346/** 
     
    142145  private int minPixNum; 
    143146   
    144   private boolean pixelsIDProblem; 
     147  private boolean pixelsIDProblem, isOMETiff; 
    145148   
     149  protected String fileID; 
     150   
     151  protected Hashtable tiffDataStore; 
    146152 
    147153  // -- Fields - raw panel -- 
     
    280286  public OMENode getRoot() { return thisOmeNode; } 
    281287   
    282   public boolean testThirdParty(IFormatReader read, File file) { 
    283     return false; 
     288  public boolean testThirdParty(File file) { 
     289    String id = file.getPath(); 
     290    if (!file.exists()) return false; 
     291    if (!isOMETiff) return false; 
     292    ImageReader read = new ImageReader(); 
     293    try { 
     294      if (read.getReader(id) instanceof TiffReader || 
     295        read.getReader(id) instanceof OMEXMLReader) return false; 
     296      else return false; 
     297    } 
     298    catch (FormatException exc) { 
     299      return true; 
     300    } 
     301    catch (IOException exc) { 
     302      return true; 
     303    } 
     304  } 
     305   
     306  public void askCompanionInstead(File file) { 
     307    Object[] options = {"Sounds good", "Cancel"}; 
     308         
     309    int n = JOptionPane.showOptionDialog(getTopLevelAncestor(), 
     310            "The file you are trying to save to is a third-party format." 
     311            + " Currently Notebook can only save to TIFF or OMEXML files." 
     312            + " Would you like to save to a companion file instead?", 
     313            "Can't Save to Third-Party Format", 
     314            JOptionPane.YES_NO_OPTION, 
     315            JOptionPane.QUESTION_MESSAGE, 
     316            (javax.swing.Icon)null, 
     317            options, 
     318            options[0]); 
     319    if(n == JOptionPane.YES_OPTION) saveCompanionFile(file); 
    284320  } 
    285321 
     
    289325      //use the node tree in the MetadataPane to write flattened OMECA 
    290326      //to a given file 
    291       if( testThirdParty(reader, file) ) return; 
     327      if( testThirdParty(file) ) { 
     328        askCompanionInstead(file); 
     329        return; 
     330      } 
    292331      if (originalTIFF != null) { 
    293332        String xml = thisOmeNode.writeOME(false); 
    294333 
    295         if (originalTIFF == file) { 
     334        if (originalTIFF.equals(file)) { 
    296335          //just rewrite image description of original file. 
    297336          RandomAccessFile raf = new RandomAccessFile(file, "rw"); 
     337          addTiffData(xml,file); 
    298338          TiffTools.overwriteIFDValue(raf, 0, TiffTools.IMAGE_DESCRIPTION, xml); 
    299339          raf.close(); 
     
    325365  public void saveCompanionFile(File file) throws RuntimeException { 
    326366    File compFile = new File(file.getPath() + ".ome"); 
     367    if (compFile.exists()) compFile.delete(); 
    327368    try { 
    328369      thisOmeNode.writeOME(compFile, false); 
     
    335376   
    336377  public void saveTiffFile(File file) throws RuntimeException{ 
    337     if(originalTIFF != null) saveFile(file); 
     378    if(originalTIFF.equals(file)) saveFile(file); 
    338379    else { 
    339380      String id = currentFile.getPath(); 
     
    349390      try {       
    350391        xml = thisOmeNode.writeOME(false); 
     392        addTiffData(xml, file); 
    351393        imageCount = reader.getImageCount(id); 
    352394      } 
     
    425467            "MetadataNotebook Error", JOptionPane.ERROR_MESSAGE); 
    426468    } 
     469  } 
     470   
     471  public void storeTiffData(File file) { 
     472    tiffDataStore = new Hashtable(); 
     473    Document doc; 
     474    Vector pixList = new Vector(); 
     475    DocumentBuilderFactory docFact =  
     476      DocumentBuilderFactory.newInstance(); 
     477    
     478    Hashtable ifd = new Hashtable(); 
     479    try {  
     480      RandomAccessStream in = new RandomAccessStream(file.getPath()); 
     481      ifd = TiffTools.getFirstIFD(in);   
     482      in.close(); 
     483    } 
     484    catch (IOException exc) { 
     485      exc.printStackTrace(); 
     486    } 
     487     
     488    // extract comment   
     489    Object o = TiffTools.getIFDValue(ifd, TiffTools.IMAGE_DESCRIPTION);   
     490    String comment = null;   
     491    if (o instanceof String) comment = (String) o;   
     492    else if (o instanceof String[]) {   
     493      String[] s = (String[]) o; 
     494      if (s.length > 0) comment = s[0];   
     495    }   
     496    else if (o != null) comment = o.toString(); 
     497     
     498    File tempFile = new File("tiffXML.temp"); 
     499    if (tempFile.exists()) tempFile.delete(); 
     500 
     501    try { 
     502      FileWriter fw = new FileWriter(tempFile); 
     503      fw.write(comment); 
     504      fw.close(); 
     505    } 
     506    catch (IOException exc) { 
     507      exc.printStackTrace(); 
     508    } 
     509     
     510    try { 
     511      DocumentBuilder db = docFact.newDocumentBuilder(); 
     512      doc = db.parse(getClass().getResourceAsStream(tempFile.getPath())); 
     513      pixList = DOMUtil.findElementList("Pixels",doc); 
     514    } 
     515    catch (IOException exc) { 
     516      exc.printStackTrace(); 
     517    } 
     518    catch (org.xml.sax.SAXException exc) { 
     519      exc.printStackTrace(); 
     520    } 
     521    catch (javax.xml.parsers.ParserConfigurationException exc) { 
     522      exc.printStackTrace(); 
     523    } 
     524     
     525    for(int i = 0;i<pixList.size();i++) { 
     526      Element thisEle = (Element) pixList.get(i); 
     527      String thisID = DOMUtil.getAttribute("ID", thisEle); 
     528      Vector dataList = DOMUtil.getChildElements("TiffData",thisEle); 
     529      tiffDataStore.put(thisID,dataList); 
     530    } 
     531     
     532    tempFile.delete(); 
     533  } 
     534   
     535  public void addTiffData(String xml, File file) { 
     536    Document doc; 
     537    Vector pixList = new Vector(); 
     538    DocumentBuilderFactory docFact =  
     539      DocumentBuilderFactory.newInstance(); 
     540     
     541    try { 
     542      DocumentBuilder db = docFact.newDocumentBuilder(); 
     543      doc = db.parse(getClass().getResourceAsStream(file.getPath())); 
     544      pixList = DOMUtil.findElementList("Pixels",doc); 
     545    } 
     546    catch (IOException exc) { 
     547      exc.printStackTrace(); 
     548    } 
     549    catch (org.xml.sax.SAXException exc) { 
     550      exc.printStackTrace(); 
     551    } 
     552    catch (javax.xml.parsers.ParserConfigurationException exc) { 
     553      exc.printStackTrace(); 
     554    } 
     555     
     556    //creating tiff from third party 
     557    if(!file.exists() && !isOMETiff) { 
     558      for(int i = 0;i<pixList.size();i++) { 
     559        Element thisEle = (Element) pixList.get(i); 
     560        DOMUtil.createChild(thisEle, "TiffData"); 
     561      } 
     562    } 
     563    //creating tiff from OMETiff file 
     564    else { 
     565      for(int i = 0;i<pixList.size();i++) { 
     566        Element thisEle = (Element) pixList.get(i); 
     567        String thisID = DOMUtil.getAttribute("ID", thisEle); 
     568        Vector dataEles = (Vector) tiffDataStore.get(thisID); 
     569        for(int j = 0;i<dataEles.size();i++) { 
     570          Element thisData = DOMUtil.createChild(thisEle, "TiffData"); 
     571          String[] attrNames = DOMUtil.getAttributeNames(thisData); 
     572          String[] attrValues = DOMUtil.getAttributeValues(thisData); 
     573          for(int k = 0;i<attrNames.length;i++) { 
     574            DOMUtil.setAttribute(attrNames[i],attrValues[i],thisData); 
     575          } 
     576        } 
     577      } 
     578    } 
     579  } 
     580   
     581  public boolean checkOMETiff(File file) { 
     582    Hashtable ifd; 
     583    try{ 
     584      RandomAccessStream in = new RandomAccessStream(file.getPath()); 
     585      ifd = TiffTools.getFirstIFD(in); 
     586      in.close(); 
     587    } 
     588    catch (IOException exc) { 
     589      return false; 
     590    } 
     591     
     592    // extract comment   
     593    Object o = TiffTools.getIFDValue(ifd, TiffTools.IMAGE_DESCRIPTION);   
     594    String comment = null;   
     595    if (o instanceof String) comment = (String) o;   
     596    else if (o instanceof String[]) {   
     597      String[] s = (String[]) o;  if (s.length > 0) comment = s[0];   
     598    }   
     599    else if (o != null) comment = o.toString(); 
     600    try { 
     601      OMENode testNode = new OMENode(comment); 
     602    } 
     603    catch (IOException exc) { 
     604      return false; 
     605    } 
     606    catch (javax.xml.parsers.ParserConfigurationException exc) { 
     607      return false; 
     608    } 
     609    catch (org.xml.sax.SAXException exc) { 
     610      return false; 
     611    } 
     612    catch (javax.xml.transform.TransformerConfigurationException exc) { 
     613      return false; 
     614    } 
     615    catch (javax.xml.transform.TransformerException exc) { 
     616      return false; 
     617    } 
     618    return true; 
    427619  } 
    428620 
     
    454646        // TIFF file 
    455647        originalTIFF = file; 
     648        isOMETiff = checkOMETiff(file); 
     649        storeTiffData(file); 
    456650      } 
    457651      else originalTIFF = null; 
     
    471665        reader.setMetadataStore(ms); 
    472666        String id = file.getPath(); 
     667        fileID = id; 
    473668        File companionFile = new File(id + ".ome"); 
    474669        if(companionFile.exists()) { 
     
    488683        } 
    489684 
     685        //Set up thumbnails 
    490686        int numSeries = reader.getSeriesCount(id); 
    491687        images = new BufferedImage[numSeries+1]; 
     
    515711        minPixNum = 0; 
    516712        pixelsIDProblem = false; 
     713        Vector pixList = new Vector(); 
    517714 
    518715        try {         
    519           Vector pixList = DOMUtil.findElementList("Pixels",ome.getOMEDocument(true)); 
     716          pixList = DOMUtil.findElementList("Pixels",ome.getOMEDocument(true)); 
    520717           
    521718          int lowestInt = -1; 
     
    549746        } 
    550747        catch(Exception exc) { exc.printStackTrace(); } 
     748         
     749        if (pixList.size() == 1) pixelsIDProblem = false; 
    551750         
    552751        setOMEXML(ome); 
     
    15991798      if (name.endsWith("Pixels")) { 
    16001799        if(pixelsIDProblem || on == null) {         
    1601           if (thumb != null) { 
     1800          if (thumb != null && !pixelsIDProblem) { 
    16021801            tableThumb = thumb; 
    16031802            tableImage = img; 
     
    16071806            imageLabel.addMouseListener(this); 
    16081807          } 
     1808          if (pixelsIDProblem) JOptionPane.showMessageDialog(this, 
     1809            "Thumbnails disabled due to multiple pixels with unsupported" 
     1810              + " ID naming scheme.", 
     1811            "MetadataNotebook Error", JOptionPane.ERROR_MESSAGE); 
    16091812        } 
    16101813        else { 
     
    16121815          int colonIndex = thisID.indexOf(":"); 
    16131816          String pixNumString = thisID.substring(colonIndex + 1); 
    1614           int pixNum = Integer.parseInt(pixNumString); 
    1615           int indexNum = pixNum - minPixNum; 
    1616           tableThumb = thumbs[indexNum]; 
    1617           tableImage = images[indexNum]; 
     1817          int pixNum = -1; 
     1818          try { 
     1819            pixNum = Integer.parseInt(pixNumString); 
     1820            int indexNum = pixNum - minPixNum; 
     1821            tableThumb = thumbs[indexNum]; 
     1822            tableImage = images[indexNum]; 
     1823          } 
     1824          catch (java.lang.NumberFormatException exc) { 
     1825            //this happens when multiple pixels aren't present 
     1826            //so we want to show just the one thumb 
     1827            tableThumb = thumb; 
     1828            tableImage = img; 
     1829          } 
    16181830          imageLabel = new JLabel(new ImageIcon(tableThumb)); 
    16191831          imageLabel.setToolTipText("The middle image of these pixels." + 
Note: See TracChangeset for help on using the changeset viewer.