001/** 002 * Copyright (C) 2014 Universidade de Aveiro, DETI/IEETA, Bioinformatics Group - http://bioinformatics.ua.pt/ 003 * 004 * This file is part of Dicoogle/dicoogle. 005 * 006 * Dicoogle/dicoogle is free software: you can redistribute it and/or modify 007 * it under the terms of the GNU General Public License as published by 008 * the Free Software Foundation, either version 3 of the License, or 009 * (at your option) any later version. 010 * 011 * Dicoogle/dicoogle is distributed in the hope that it will be useful, 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 014 * GNU General Public License for more details. 015 * 016 * You should have received a copy of the GNU General Public License 017 * along with Dicoogle. If not, see <http://www.gnu.org/licenses/>. 018 */ 019package pt.ua.dicoogle.rGUI.client.UIHelper; 020 021import java.awt.FlowLayout; 022import java.awt.image.RenderedImage; 023import java.net.URI; 024import java.rmi.NoSuchObjectException; 025import java.rmi.RemoteException; 026import java.rmi.server.RMISocketFactory; 027import java.rmi.server.UnicastRemoteObject; 028import java.util.*; 029import org.slf4j.LoggerFactory; 030import javax.swing.JFrame; 031import javax.swing.JPanel; 032import javax.swing.tree.DefaultMutableTreeNode; 033import javax.swing.tree.DefaultTreeModel; 034import pt.ua.dicoogle.core.QueryHistorySupport; 035import pt.ua.dicoogle.rGUI.MultihomeRMIClientSocketFactory; 036import pt.ua.dicoogle.rGUI.client.UserRefs; 037import pt.ua.dicoogle.rGUI.client.signals.SearchSignal; 038import pt.ua.dicoogle.rGUI.client.windows.MainWindow; 039import pt.ua.dicoogle.rGUI.interfaces.controllers.ISearch; 040import pt.ua.dicoogle.rGUI.interfaces.signals.ISearchSignal; 041import pt.ua.dicoogle.sdk.datastructs.SearchResult; 042 043 044/** 045 * 046 * @author Samuel Campos <samuelcampos@ua.pt> 047 * @author Luís A. Bastião Silva <bastiao@ua.pt> 048 */ 049@Deprecated 050public class Result2Tree extends Observable 051{ 052 private static Result2Tree instance; 053 private static DefaultMutableTreeNode top = new DefaultMutableTreeNode("Search Results"); 054 private HashMap<String, SearchResult> pendingP2PThumbnails; 055 private Set<String> patients = new HashSet<>(); 056 private List<SearchResult> resultsList; 057 private long time; 058 private ISearch searchRef; 059 private ISearchSignal searchSignal; 060 /* Counter the DICOM (DIM) found */ 061 private int counterPatiends = 0; 062 private int counterImages = 0; 063 private javax.swing.JPanel jPanelThumbnail; 064 private boolean agressive = false; 065 066 private int MAX_DRAW = 20000; 067 068 069 070 public static synchronized Result2Tree getInstance() 071 { 072 if (instance == null) 073 { 074 instance = new Result2Tree(); 075 } 076 return instance; 077 } 078 079 private Result2Tree() 080 { 081 try 082 { 083 this.resultsList = new ArrayList(); 084 pendingP2PThumbnails = new HashMap<String, SearchResult>(); 085 086 searchSignal = new SearchSignal(this); 087 ISearchSignal searchSignalStub = (ISearchSignal) UnicastRemoteObject.exportObject(searchSignal, 0, new MultihomeRMIClientSocketFactory(), RMISocketFactory.getDefaultSocketFactory()); 088 089 searchRef = UserRefs.getInstance().getSearch(); 090 091 //System.out.println("1.4.3.chegou aqui"); 092 searchRef.RegisterSignalBack(searchSignalStub); 093 //System.out.println("1.4.4.chegou aqui"); 094 095 } catch (RemoteException ex) 096 { 097 LoggerFactory.getLogger(Result2Tree.class).error(ex.getMessage(), ex); 098 } 099 } 100 101 102 public void pruneQuery(String id) 103 { 104 try { 105 searchRef.pruneQuery(id); 106 } catch (RemoteException ex) { 107 LoggerFactory.getLogger(Result2Tree.class).error(ex.getMessage(), ex); 108 } 109 } 110 111 public void search(String query, boolean keywords, HashMap<String, Boolean> range) 112 { 113 // 114 this.deleteObservers(); 115 DefaultTreeModel model = (DefaultTreeModel) MainWindow.getInstance().getjTreeResults().getModel(); 116 model.setRoot(new DefaultMutableTreeNode("Search Results")); 117 MainWindow.getInstance().getjLabelResults().setText("Searching..."); 118 MainWindow.getInstance().getjLabelTime().setText(""); 119 try 120 { 121 this.time = System.nanoTime(); 122 this.resetCounters(); 123 this.resultsList.clear(); 124 125 searchRef.Search(query, keywords, range); 126 127 if (!query.equals("")) 128 { 129 QueryHistorySupport.getInstance().addQuery(query, keywords); 130 } 131 132 133 showImage("Image Thumbnail", null, jPanelThumbnail); 134 } catch (RemoteException ex) 135 { 136 LoggerFactory.getLogger(Result2Tree.class).error(ex.getMessage(), ex); 137 } 138 } 139 140 public void searchToExport(String query, boolean keywords, HashMap<String, Boolean> range, ArrayList<String> extraFields, Observer obs) 141 { 142 try 143 { 144 this.deleteObservers(); // delete all observers from the past 145 this.addObserver(obs); 146 147 searchRef.SearchToExport(query, keywords, range, extraFields, obs); 148 149 } catch (RemoteException ex) 150 { 151 LoggerFactory.getLogger(Result2Tree.class).error(ex.getMessage(), ex); 152 } 153 } 154 155 /** 156 * Search only for onde File to get the Thumbnail 157 * 158 * @param FileName 159 * @param FileHash 160 * @return 161 */ 162 public SearchResult searchThumbnail(URI FileName, String FileHash) 163 { 164 try 165 { 166 return searchRef.getThumbnail(FileName, FileHash); 167 } catch (RemoteException ex) 168 { 169 LoggerFactory.getLogger(Result2Tree.class).error(ex.getMessage(), ex); 170 } 171 172 return null; 173 } 174 175 176 public void finishSearch() 177 { 178 MainWindow.getInstance().finishQuery(); 179 } 180 181 182 /** 183 * Search only for one File to get the Thumbnail in P2P network 184 * 185 * @param result 186 */ 187 public void searchP2PThumbnail(SearchResult result) 188 { 189 try 190 { 191 searchRef.getP2PThumbnail(result.getURI(), (String)result.getExtraData().get("filehash"), result.getURI().toString()); 192 193 pendingP2PThumbnails.put((String)result.getExtraData().get("filehash"), result); 194 195 } catch (RemoteException ex) 196 { 197 LoggerFactory.getLogger(Result2Tree.class).error(ex.getMessage(), ex); 198 } 199 } 200 201 // <editor-fold defaultstate="collapsed" desc="showImage"> 202 public static void showImage(String title, RenderedImage image, JPanel panel) 203 { 204 if (panel == null) 205 { 206 207 /** It can be used to show image in external window*/ 208 JFrame f = new JFrame(title); 209 if (image != null) 210 { 211 f.getContentPane().add(new DisplayJAI(image)); 212 } 213 f.pack(); 214 //f.setVisible(true); 215 f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 216 } else 217 { 218 panel.removeAll(); 219 panel.setLayout(new FlowLayout()); 220 221 // Yet another bugfix 222 // If the indexed image does not have a thumbnail, it leads to a Null Pointer Exception 223 if (image != null) 224 { 225 panel.add(new DisplayJAI(image)); 226 } 227 228 panel.validate(); 229 panel.setVisible(true); 230 } 231 }// </editor-fold> 232 233 public DefaultMutableTreeNode convertQueryResult2Tree(List queryResultL) 234 { 235 LoggerFactory.getLogger(Result2Tree.class).trace("Chegou a convertQueryResult2Tree com :" + queryResultL.size()); 236 top.removeAllChildren(); 237 //this.resultsList = queryResultL; 238 239 if (queryResultL != null) 240 { 241 HashMap<String, HashMap> names = nameToTree(); 242 fillTree(names); 243 244 } 245 246 return top; 247 } 248 249 /** 250 * Convert a String indexed (given in UTF) to ASCII normal mode 251 * @param utfString utf string (2chars per bit) with terminal char 252 * @return n ascii string (1 char per bit) without terminal char 253 */ 254 private String asciiMode(String utfString) 255 { 256 /*String n = null; 257 try 258 { 259 n = new String(utfString.getBytes("US-ASCII")); 260 } catch (UnsupportedEncodingException ex) 261 { 262 ex.printStackTrace(); 263 return null; 264 }*/ 265 return utfString.trim(); 266 //return n.trim(); 267 268 } 269 270 /** 271 * This function is necessary to grep the resultList 272 * 273 * @param patientName - returns only the search results that have the same PatientName 274 * @return 275 */ 276 private ArrayList<SearchResult> grepByPatientName(String patientName) 277 { 278 ArrayList<SearchResult> tmpList = new ArrayList<SearchResult>(); 279 HashMap extra; 280 281 for (SearchResult tmp : resultsList) 282 { 283 String _n = null; 284 285 if (tmp instanceof SearchResult) 286 { 287 extra = tmp.getExtraData(); 288 _n = (String) extra.get("PatientName"); 289 } else if (tmp instanceof SearchResult) 290 { 291 // TODO... 292 } 293 294 if (_n != null && asciiMode(_n).equals(patientName)) 295 { 296 tmpList.add(tmp); 297 } 298 } 299 300 return tmpList; 301 } 302 303 private ArrayList<SearchResult> grepByStudyDate(String patientName, String studyDate) 304 { 305 306 ArrayList<SearchResult> tmpList = new ArrayList<SearchResult>(); 307 HashMap extra; 308 309 for (SearchResult tmp : resultsList) 310 { 311 String _patientName = null; 312 String _studyDate = null; 313 314 extra = tmp.getExtraData(); 315 _patientName = (String) extra.get("PatientName"); 316 _studyDate = (String) extra.get("StudyDate"); 317 318 if (_patientName != null && asciiMode(_patientName).equals(patientName) && _studyDate.equals(studyDate)) 319 { 320 tmpList.add(tmp); 321 } 322 } 323 324 return tmpList; 325 326 } 327 328 private ArrayList<SearchResult> grepByModality(String patientName, String studyDate, String modality) 329 { 330 ArrayList<SearchResult> tmpList = new ArrayList<SearchResult>(); 331 HashMap extra; 332 333 for (SearchResult tmp : resultsList) 334 { 335 String _patientName = null; 336 String _studyDate = null; 337 String _modality = null; 338 339 340 extra = tmp.getExtraData(); 341 _patientName = (String) extra.get("PatientName"); 342 _studyDate = (String) extra.get("StudyDate"); 343 _modality = (String) extra.get("Modality"); 344 345 if (_patientName != null && asciiMode(_patientName).equals(patientName) && _studyDate.equals(studyDate) 346 && _modality.equals(modality)) 347 { 348 tmpList.add(tmp); 349 } 350 } 351 return tmpList; 352 353 } 354 355 public void completeTree(javax.swing.event.TreeExpansionEvent evt) 356 { 357 if (agressive) 358 { 359 LoggerFactory.getLogger(Result2Tree.class).trace("completeTree, Aggressive mode"); 360 return; 361 } 362 363 //long tBegin = System.nanoTime(); 364 365 int level = evt.getPath().getPathCount(); 366 LoggerFactory.getLogger(Result2Tree.class).trace("level calculated {}", level); 367 if (level == 2) 368 { 369 // Study 370 //DebugManager.getInstance().debug("Study"); 371 //System.out.println("PatientName:" + evt.getPath().getPathComponent(1)); 372 LoggerFactory.getLogger(Result2Tree.class).trace("level 2"); 373 DefaultMutableTreeNode patient_name = (DefaultMutableTreeNode) evt.getPath().getPathComponent(1); 374 375 if (patient_name.getFirstChild().isLeaf()) 376 { 377 LoggerFactory.getLogger(Result2Tree.class).trace("PatientName: {}", patient_name ); 378 completeByName(patient_name); 379 } 380 381 382 //System.out.println("Chegou ao fim"); 383 } else if (level == 3) 384 { 385 // Serie 386 //DebugManager.getInstance().debug("Serie"); 387 //System.out.println("Study Date:" + evt.getPath().getPathComponent(2)); 388 LoggerFactory.getLogger(Result2Tree.class).trace("completeTree - level 3"); 389 DefaultMutableTreeNode study_date = (DefaultMutableTreeNode) evt.getPath().getPathComponent(2); 390 391 if (study_date.getFirstChild().isLeaf()) 392 { 393 completeByStudyDate(study_date); 394 } 395 } else if (level == 4) 396 { 397 // Image 398 //DebugManager.getInstance().debug("Image"); 399 //System.out.println("Modality:" + evt.getPath().getPathComponent(3)); 400 LoggerFactory.getLogger(Result2Tree.class).trace("completeTree - level 4"); 401 DefaultMutableTreeNode modality = (DefaultMutableTreeNode) evt.getPath().getPathComponent(3); 402 403 if (modality.getFirstChild().isLeaf()) 404 { 405 completeByModality(modality); 406 } 407 } 408 409 //long tEnd = System.nanoTime(); 410 411 //System.out.println("TIME COMPLETE TREE"); 412 //System.out.println(Integer.toString((int) ( ( tEnd - tBegin ) / 1000000L ))); 413 } 414 415 private void completeByName(DefaultMutableTreeNode patient_name) 416 { 417 ArrayList<SearchResult> result = grepByPatientName(patient_name.toString()); 418 419 patient_name.removeAllChildren(); 420 421 DefaultMutableTreeNode date; 422 HashMap extra; 423 HashSet<String> studyDates = new HashSet<String>(); // to elimitate repetition 424 425 LoggerFactory.getLogger(Result2Tree.class).trace("result size" + result.size()); 426 for (SearchResult temp : result) 427 { 428 extra = temp.getExtraData(); 429 studyDates.add((String) extra.get("StudyDate")); 430 } 431 Iterator<String> it = studyDates.iterator(); 432 433 while (it.hasNext()) 434 { 435 date = new DefaultMutableTreeNode(it.next()); 436 date.add(new DefaultMutableTreeNode("Loading..")); 437 438 patient_name.add(date); 439 } 440 441 DefaultTreeModel model = (DefaultTreeModel) MainWindow.getInstance().getjTreeResults().getModel(); 442 model.reload(patient_name); 443 } 444 445 private void completeByStudyDate(DefaultMutableTreeNode study_date) 446 { 447 DefaultMutableTreeNode patient_name = (DefaultMutableTreeNode) study_date.getParent(); 448 449 ArrayList<SearchResult> result = grepByStudyDate(patient_name.toString(), study_date.toString()); 450 451 study_date.removeAllChildren(); 452 453 DefaultMutableTreeNode modality; 454 HashMap extra; 455 HashSet<String> modalities = new HashSet<String>(); // to elimitate repetition 456 457 for (SearchResult temp : result) 458 { 459 extra = temp.getExtraData(); 460 modalities.add((String) extra.get("Modality")); 461 } 462 Iterator<String> it = modalities.iterator(); 463 464 while (it.hasNext()) 465 { 466 modality = new DefaultMutableTreeNode(it.next()); 467 modality.add(new DefaultMutableTreeNode("Loading..")); 468 469 study_date.add(modality); 470 } 471 472 DefaultTreeModel model = (DefaultTreeModel) MainWindow.getInstance().getjTreeResults().getModel(); 473 model.reload(study_date); 474 } 475 476 private void completeByModality(DefaultMutableTreeNode modality) 477 { 478 DefaultMutableTreeNode study_date = (DefaultMutableTreeNode) modality.getParent(); 479 DefaultMutableTreeNode patient_name = (DefaultMutableTreeNode) study_date.getParent(); 480 481 ArrayList<SearchResult> result = grepByModality(patient_name.toString(), study_date.toString(), modality.toString()); 482 483 modality.removeAllChildren(); 484 485 DefaultMutableTreeNode image; 486 Hashtable extra; 487 Hashtable<String, ArrayList<SearchResult>> files = new Hashtable<String, ArrayList<SearchResult>>(); 488 489 // to elimitate possible repetition from p2p 490 for (SearchResult temp : result) 491 { 492 ArrayList<SearchResult> list = files.get(temp.getURI() + " : " + temp.getExtraData().get("filehash")); 493 494 if (list == null) 495 { 496 list = new ArrayList<SearchResult>(); 497 files.put(temp.getURI() + " : " + temp.getExtraData().get("filehash"), list); 498 } 499 500 list.add(temp); 501 } 502 503 Iterator<String> it = files.keySet().iterator(); 504 505 while (it.hasNext()) 506 { 507 String fileDesc = it.next(); 508 509 ArrayList<SearchResult> sr = files.get(fileDesc); 510 511 DefaultMutableTreeNode DescFile = new DefaultMutableTreeNode(fileDesc); 512 513 Iterator<SearchResult> iter = sr.iterator(); 514 515 while (iter.hasNext()) 516 { 517 DescFile.add(new DefaultMutableTreeNode(iter.next())); 518 } 519 520 modality.add(DescFile); 521 } 522 523 524 DefaultTreeModel model = (DefaultTreeModel) MainWindow.getInstance().getjTreeResults().getModel(); 525 model.reload(modality); 526 } 527 528 529 private HashMap<String, HashMap> nameToTree() 530 { 531 /* Hashtable to support */ 532 HashMap<String, HashMap> tree = new HashMap<String, HashMap>(); 533 //resetCounters(); 534 535 for (SearchResult tmp : resultsList) 536 { 537 String _n = (String)tmp.getExtraData().get("PatientName"); 538 539 if (_n != null) 540 { 541 String n = asciiMode(_n); 542 543 HashMap<String, HashMap> studies = tree.get(n); 544 545 if( !this.patients.contains(n)) 546 547 { 548 this.patients.add(n); 549 counterPatiends++; 550 } 551 if (studies == null) 552 { 553 554 555 if (agressive) 556 { 557 studies = new HashMap<String, HashMap>(); 558 tree.put(n, studies); 559 560 dateToTree(studies, tmp); 561 } else 562 { 563 studies = new HashMap<String, HashMap>(); 564 studies.put("Loading", new HashMap()); 565 566 tree.put(n, studies); 567 } 568 } else if (agressive) 569 { 570 dateToTree(studies, tmp); 571 } 572 573 } else 574 { 575 System.out.println("Problem \"PatientName == null\""); 576 //the file indexed is not DICOM or there is a problem in the result 577 } 578 579 } 580 return tree; 581 } 582 583 private void dateToTree(HashMap<String, HashMap> studies, SearchResult result) 584 { 585 586 String date = (String) result.getExtraData().get("StudyDate"); 587 if (date.equals("")) 588 { 589 date = "00000000 "; 590 } 591 592 HashMap<String, HashMap> modalities = studies.get(date); 593 594 if (modalities == null) 595 { 596 modalities = new HashMap<String, HashMap>(); 597 studies.put(date, modalities); 598 } 599 600 modalityToTree(modalities, result); 601 } 602 603 private void modalityToTree(HashMap<String, HashMap> modalities, SearchResult result) 604 { 605 String m = (String)result.getExtraData().get("Modality"); 606 607 HashMap<String, ArrayList<SearchResult>> images = modalities.get(m); 608 609 if (images == null) 610 { 611 images = new HashMap<String, ArrayList<SearchResult>>(); 612 modalities.put(m, images); 613 } 614 615 resToTree(images, result); 616 } 617 618 private void resToTree(HashMap<String, ArrayList<SearchResult>> images, SearchResult result) 619 { 620 String fileDesc = result.getURI() + " : " + result.getExtraData().get("filehash"); 621 622 ArrayList<SearchResult> file = images.get(fileDesc); 623 624 if (file == null) 625 { 626 file = new ArrayList<>(); 627 628 images.put(fileDesc, file); 629 } 630 631 addressToTree(file, result); 632 } 633 634 private void addressToTree(ArrayList<SearchResult> fileList, SearchResult result) 635 { 636 fileList.add(result); 637 } 638 639 /** 640 * Fill the tree 641 * 642 * @param tree - HashTable with the tree 643 */ 644 private void fillTree(HashMap<String, HashMap> tree) 645 { 646 Iterator<String> en_tree = tree.keySet().iterator(); 647 648 while (en_tree.hasNext()) //Patient Names 649 { 650 String name = en_tree.next(); 651 652 HashMap<String, HashMap> t_date = tree.get(name); 653 654 DefaultMutableTreeNode patient_name = new DefaultMutableTreeNode(name); 655 656 Iterator<String> en_date = t_date.keySet().iterator(); 657 658 while (en_date.hasNext()) //Study Dates 659 { 660 String dt = en_date.next(); 661 662 HashMap<String, HashMap> t_mod = (HashMap) t_date.get(dt); 663 664 DefaultMutableTreeNode date = new DefaultMutableTreeNode(dt); 665 666 Iterator<String> en_mod = t_mod.keySet().iterator(); 667 668 while (en_mod.hasNext()) //Modalities 669 { 670 String md = en_mod.next(); 671 672 HashMap<String, ArrayList> t_name = t_mod.get(md); 673 674 DefaultMutableTreeNode modality = new DefaultMutableTreeNode(md); 675 676 Iterator<String> en_fname = t_name.keySet().iterator(); 677 678 while (en_fname.hasNext()) //FileDescription 679 { 680 681 String fname = en_fname.next(); 682 ArrayList<SearchResult> res = t_name.get(fname); 683 DefaultMutableTreeNode filename = new DefaultMutableTreeNode(fname); 684 685 for (SearchResult tmp : res) //SearchResult 686 { 687 DefaultMutableTreeNode details = new DefaultMutableTreeNode(tmp); 688 filename.add(details); 689 } 690 691 modality.add(filename); 692 } 693 date.add(modality); 694 } 695 patient_name.add(date); 696 } 697 top.add(patient_name); 698 } 699 700 if (this.resultsList.isEmpty()) 701 { 702 MainWindow.getInstance().getjLabelResults().setText("No matches found."); 703 } else 704 { 705 MainWindow.getInstance().getjLabelResults().setText("<HTML>" + counterImages + " matches found <BR>" 706 + "Patients:" + counterPatiends + "<BR>" 707 // + "Studies:"+ counterStudies +"<BR>" 708 // + "Series:"+ counterSeries+"<BR>" + 709 + "</HTML>"); 710 } 711 712 long timeEnd = System.nanoTime(); 713 MainWindow.getInstance().getjLabelTime().setText(Integer.toString((int) ((timeEnd - time) / 1000000L))); 714 } 715 716 private void resetCounters() 717 { 718 719 patients = new HashSet<String>(); 720 counterPatiends = 0; 721 counterImages = 0; 722 } 723 724 public void getSearchTime() 725 { 726 try 727 { 728 long serverSearchTime = searchRef.getSearchTime(); 729 730 MainWindow.getInstance().getjLabelTime().setText(String.valueOf(serverSearchTime)); 731 } catch (RemoteException ex) 732 { 733 LoggerFactory.getLogger(Result2Tree.class).error(ex.getMessage(), ex); 734 } 735 } 736 737 /** 738 * get the Local Search Results from the GUI Server 739 */ 740 public void getLocalSearchResults() 741 { 742 try 743 { 744 resultsList = searchRef.getSearchResults(); 745 746 DefaultTreeModel model = (DefaultTreeModel) MainWindow.getInstance().getjTreeResults().getModel(); 747 748 model.setRoot(convertQueryResult2Tree(resultsList)); 749 } catch (RemoteException ex) 750 { 751 LoggerFactory.getLogger(Result2Tree.class).error(ex.getMessage(), ex); 752 } 753 754 } 755 756 /** 757 * get the P2P Search Results from the GUI Server 758 */ 759 public void getP2PSearchResults() 760 { 761 762 LoggerFactory.getLogger(Result2Tree.class).trace("getP2PSearchResults"); 763 764 try 765 { 766 this.resultsList = new ArrayList(); 767 List<SearchResult> temp = searchRef.getP2PSearchResults(); 768 counterImages += temp.size(); 769 if (temp != null) 770 { 771 this.resultsList.addAll(temp); 772 //counterImages += resultsList.size(); 773 } 774 775 776 DefaultTreeModel model = (DefaultTreeModel) MainWindow.getInstance().getjTreeResults().getModel(); 777 778 DefaultMutableTreeNode root = convertQueryResult2Tree(temp); 779 if (temp.size()<=MAX_DRAW) 780 { 781 model.setRoot(root); 782 MainWindow.getInstance().repaint(); 783 784 } 785 786 LoggerFactory.getLogger(Result2Tree.class.getName()).trace("getP2PSearchResults, size of resultList {}", resultsList.size()); 787 788 LoggerFactory.getLogger(Result2Tree.class.getName()).trace("getP2PSearchResults, size of tmpSize {}", temp.size()); 789 790 791 792 } catch (RemoteException ex) 793 { 794 LoggerFactory.getLogger(Result2Tree.class).error(ex.getMessage(), ex); 795 } 796 797 } 798 799 /** 800 * get the Search Results with the selected extraFields to export data to a file 801 */ 802 public void getExportSearchResults() 803 { 804 try 805 { 806 List<SearchResult> temp = searchRef.getExportSearchResults(); 807 808 if (temp != null) 809 { 810 setChanged(); 811 notifyObservers(temp); 812 813 } 814 } catch (RemoteException ex) 815 { 816 LoggerFactory.getLogger(MainWindow.class).error(ex.getMessage(), ex); 817 } 818 } 819 820 public void getPendingP2PThumbnails() 821 { 822 try 823 { 824 ArrayList<SearchResult> thumbnails = searchRef.getPendingP2PThumnails(); 825 826 SearchResult res; 827 String thumb; 828 829 for (SearchResult temp : thumbnails) 830 { 831 res = pendingP2PThumbnails.remove(temp.get("filehash")); 832 thumb = (String) temp.get("Thumbnail"); 833 834 if (res != null && thumb != null) 835 { 836 res.put("Thumbnail", thumb); 837 MainWindow.getInstance().updateP2PThumbnail(res); 838 } 839 } 840 841 } catch (RemoteException ex) 842 { 843 LoggerFactory.getLogger(Result2Tree.class).error(ex.getMessage(), ex); 844 } 845 } 846 847 /** 848 * Unexport the remote object SearchSignal 849 */ 850 public void unexportSearchSignal() 851 { 852 try 853 { 854 if (searchSignal != null) 855 { 856 UnicastRemoteObject.unexportObject(searchSignal, true); 857 } 858 } catch (NoSuchObjectException ex) 859 { 860 LoggerFactory.getLogger(Result2Tree.class).error(ex.getMessage(), ex); 861 } 862 } 863 864 public DefaultMutableTreeNode getTop() 865 { 866 return top; 867 } 868}