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}