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-sdk-ext.
005 *
006 * Dicoogle/dicoogle-sdk-ext 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-sdk-ext 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.sdk.p2p.Messages.Handlers;
020
021import java.util.Observable;
022import pt.ua.dicoogle.sdk.p2p.Messages.MessageFields;
023import pt.ua.dicoogle.sdk.p2p.Messages.MessageXML;
024import pt.ua.dicoogle.sdk.p2p.Messages.SearchResultFields;
025import java.io.ByteArrayInputStream;
026import java.util.ArrayList;
027import java.util.HashMap;
028import java.util.List;
029import java.util.Map;
030import java.util.Observer;
031import org.dom4j.Document;
032import org.dom4j.DocumentException;
033import org.dom4j.Element;
034import org.dom4j.io.SAXReader;
035import pt.ua.dicoogle.sdk.NetworkPluginAdapter;
036import pt.ua.dicoogle.sdk.Utils.TaskRequest;
037import pt.ua.dicoogle.sdk.Utils.TaskRequestsConstants;
038import pt.ua.dicoogle.sdk.datastructs.SearchResult;
039import pt.ua.dicoogle.sdk.p2p.Messages.MessageI;
040
041/**
042 *
043 * @author Carlos Ferreira
044 */
045public class FileRequestHandler implements MessageHandler, Observer
046{
047
048    private NetworkPluginAdapter NPA;
049
050    public FileRequestHandler(NetworkPluginAdapter NPA)
051    {
052        this.NPA = NPA;
053    }
054
055    public void handleMessage(MessageI message, String address)
056    {
057        if (!MessageXML.class.isInstance(message))
058        {
059            return;
060        }
061        byte[] msg = (byte[]) message.getMessage();
062
063        SAXReader saxReader = new SAXReader();
064
065        Document document = null;
066        try
067        {
068            document = saxReader.read(new ByteArrayInputStream(msg));
069        } catch (DocumentException ex)
070        {
071            ex.printStackTrace(System.out);
072        }
073
074        Element root = document.getRootElement();
075        if (root == null)
076        {
077            return;
078        }
079
080        Element tmp = root.element(MessageFields.FILE_REQUESTED);
081        if (tmp == null)
082        {
083            return;
084        }
085        Element temp2 = tmp.element(SearchResultFields.FILE_NAME);
086        String Filename = temp2.getText();
087        temp2 = tmp.element(SearchResultFields.FILE_HASH);
088        String Filehash = temp2.getText();
089
090        //public TaskRequest(int Task, String RequesterPlugin, Map<Integer , Object> Parameters)
091        HashMap<Integer, Object> parameters = new HashMap<Integer, Object>();
092        parameters.put(TaskRequestsConstants.P_QUERY, "FileHash:" + Filehash + " AND FileName:\"" + Filename+"\"");
093        parameters.put(TaskRequestsConstants.P_EXTRAFIELDS, new ArrayList<String>());
094        parameters.put(TaskRequestsConstants.P_REQUESTER_ADDRESS, address);
095
096        TaskRequest task = new TaskRequest(TaskRequestsConstants.T_QUERY_LOCALLY, this.NPA.getName(), parameters);
097        task.addObserver(this);
098        this.NPA.getTaskRequestsList().addTask(task);
099        //System.out.println("handle message do FileRequestHandler....\n The query is: " + "FileHash:" + Filehash + " and FileName:" + Filename);
100
101        //List<SearchResult> sr = IndexEngine.getInstance().search("FileHash:"+Filehash+" and FileName:"+Filename, null);
102        //String filepath = new String(Base64.decodeBase64(tmp.getText().getBytes()));
103
104    }
105
106    /*  public void update(Observable o, Object arg)
107    {
108    if (!TaskRequest.class.isInstance(o))
109    {
110    return;
111    }
112    
113    TaskRequest task = (TaskRequest) o;
114    
115    if (task.hasChanged())
116    {
117    List<SearchResult> sr = (List<SearchResult>) task.getResults().get(TaskRequestsConstants.R_SEARCH_RESULTS);
118    
119    if ((sr == null) || (sr.isEmpty()))
120    {
121    return;
122    }
123    this.NPA.sendFile(sr.get(0).getOrigin(), this.NPA.getName());
124    }
125    }*/
126    public void update(Observable o, Object arg)
127    {
128        //System.out.println("Update do FileRequestHandler.........");
129        if (TaskRequest.class.isInstance(o))
130        {
131            //System.out.println("Update do FileRequestHandler -> 1");
132            TaskRequest tr = (TaskRequest) o;
133            if (tr.getTask() != TaskRequestsConstants.T_QUERY_LOCALLY)
134            {
135                //System.out.println("Update do FileRequestHandler -> 2");
136                return;
137            }
138            //System.out.println("Update do FileRequestHandler -> 3");
139            Map<Integer, Object> parameters = tr.getParameters();
140            Map<Integer, Object> results = tr.getResults();
141            if ((parameters.get(TaskRequestsConstants.P_REQUESTER_ADDRESS) != null) && (results.get(TaskRequestsConstants.R_SEARCH_RESULTS) != null)
142                    && List.class.isInstance(results.get(TaskRequestsConstants.R_SEARCH_RESULTS)))
143            {
144                //System.out.println("Update do FileRequestHandler -> 4");
145                List srList = (List) results.get(TaskRequestsConstants.R_SEARCH_RESULTS);
146                if (srList.isEmpty() || (!SearchResult.class.isInstance(srList.get(0))))
147                {
148                    //System.out.println("The list has " + srList.size() + " elements");
149                    return;
150                }
151                SearchResult sr = (SearchResult) srList.get(0);
152
153                NPA.sendFile(sr.getURI().toString(), (String) parameters.get(TaskRequestsConstants.P_REQUESTER_ADDRESS));
154                //System.out.println("Message Sent?");
155            }
156        }
157    }
158}