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.server;
020
021import java.net.URI;
022import java.util.ArrayList;
023import java.util.HashMap;
024import java.util.Observable;
025import java.util.Observer;
026
027import pt.ua.dicoogle.plugins.PluginController;
028import pt.ua.dicoogle.rGUI.server.controllers.Search;
029import pt.ua.dicoogle.sdk.Utils.TaskRequest;
030import pt.ua.dicoogle.sdk.Utils.TaskRequestsConstants;
031import pt.ua.dicoogle.sdk.datastructs.SearchResult;
032import pt.ua.dicoogle.sdk.observables.ListObservableSearch;
033
034/**
035 *
036 * @author Samuel Campos <samuelcampos@ua.pt>
037 */
038@Deprecated
039public class SearchHelper implements Observer
040{
041
042    private ListObservableSearch<SearchResult> SearchResList = null;
043    private boolean export = false; // indicates whether the search is to export or do not
044    private long time;
045    private Search searchControler;
046
047    public SearchHelper(Search search)
048    {
049        this.searchControler = search;
050
051
052    }
053
054    public void setList(ListObservableSearch<SearchResult> SearchResList)
055    {
056        this.SearchResList = SearchResList;
057    }
058    
059    
060    public ListObservableSearch<SearchResult> search(String query, ArrayList<String> extrafields,
061            HashMap<String, Boolean> plugins, boolean export, Observer obs)
062    {
063    
064        this.export = export;
065        this.time = System.nanoTime();
066
067    ArrayList<String> plugins2 = new ArrayList<String>();    
068        for (String pi : plugins.keySet())
069        {
070            Boolean value = plugins.get(pi);
071            if (value)
072            {
073                    plugins2.add(pi);
074
075            }
076            
077        }
078        
079        
080        Thread seachThread = new SearchLocal(query, extrafields, plugins2, obs);
081        seachThread.start();
082        return SearchResList;
083        
084        
085    }
086    
087    
088    public void search(String query, ArrayList<String> extrafields,
089            HashMap<String, Boolean> plugins, boolean export)
090    {
091        search(query, extrafields, plugins, export, this);
092    
093    }
094
095    public SearchResult searchThumbnail(URI FileName, String FileHash)
096    {
097        ArrayList<SearchResult> queryResultListLocal;
098
099        ArrayList<String> extrafields = new ArrayList<String>();
100        extrafields.add("Thumbnail");
101
102        String query = "FileName:" + FileName + " AND FileHash:" + FileHash;
103        // TODO: Implement it.
104        return null;
105    }
106
107    public void searchP2PThumbnail(URI FileName, String FileHash, String addr)
108    {
109
110        ArrayList<String> extrafields = new ArrayList<String>();
111        extrafields.add("Thumbnail");
112
113        String query = "FileName:" + FileName + " AND FileHash:" + FileHash;
114        // TODO: Implement it.
115    }
116
117    @Override
118    public void update(Observable o, Object arg)
119    {
120        
121        ArrayList tmp = ((ListObservableSearch) o).getArray();
122        Boolean finished = ((ListObservableSearch) o).isFinish();
123        System.out.println("SearchHelper...recebeu os resultados: " + tmp.size());
124        ArrayList<SearchResult> resultsList;
125        
126        if (tmp.isEmpty())
127        {
128            return;
129                  
130        } else
131        {
132            
133            ((ListObservableSearch) o).resetArray();
134            
135            if (SearchResult.class.isInstance(tmp.get(0)))
136            {
137                
138                if (finished)
139                {
140                    searchControler.queryFinished();
141                }
142                
143                    resultsList = tmp;
144
145                    if (resultsList.size() == 1 && resultsList.get(0).getExtraData().size() == 0)
146                    {
147                       return;
148                    }
149
150                    //if the result is just the requested Thumbnail
151                    if (resultsList.size() == 1 && resultsList.get(0).getExtraData().size() == 1
152                            && resultsList.get(0).getExtraData().get("Thumbnail") != null)
153                    {
154                        searchControler.setP2PThumbnails(resultsList);
155                        
156                    } else
157                    {
158                        ((ListObservableSearch) o).resetArray();
159                        long timeEnd = System.nanoTime();
160
161                        if (!export)
162                        {
163                            searchControler.setSearchTime(((int) ((timeEnd - time) / 1000000L)));
164                            searchControler.setP2PSearchResult(resultsList);
165                        } else
166                        {
167                            searchControler.setExportSearchResult(resultsList);
168                        }
169                        
170                        PluginController.getInstance().addTask(new TaskRequest(TaskRequestsConstants.T_BLOCK_SIGNAL, null, null));
171                    }
172           
173            }
174            
175            
176            // Memory monitoring 
177             long freeMemory = Runtime.getRuntime().freeMemory() / 1024 / 1024;
178             long totalMemory = Runtime.getRuntime().totalMemory() / 1024 / 1024;
179             long maxMemory = Runtime.getRuntime().maxMemory() / 1024 / 1024;
180             
181             double percentage = freeMemory / totalMemory;
182             
183             if (percentage>0.8)
184             {
185                 // Prune query!!! 
186                 PluginController.getInstance().addTask(new TaskRequest(TaskRequestsConstants.T_QUERY_PRUNE, null, null));
187             }
188        }
189        
190    }
191
192    /**
193     * Private class that implements one Thread to search in IndexEngine
194     */
195    private class SearchLocal extends Thread
196    {
197
198        private String query;
199        private ArrayList<String> extrafields;
200        private ArrayList<String> pluginsLocals;
201        private Observer searchHelper;
202
203        public SearchLocal(String query, ArrayList<String> extrafields, ArrayList<String> pluginsLocals , Observer searchHelper)
204        {
205            this.query = query;
206            this.extrafields = extrafields;
207            this.pluginsLocals = pluginsLocals;
208            this.searchHelper = searchHelper;
209        }
210
211        @Override
212        public void run()
213        {
214            //TODO: DELETED
215                //SearchResList = PluginController.getInstance().search(pluginsLocals, query, extrafields, searchHelper);
216        }
217    }
218}