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}