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; 020 021import java.io.IOException; 022import java.util.ArrayList; 023import java.util.Collection; 024import java.util.Collections; 025import java.util.List; 026import java.util.Observable; 027import java.util.Observer; 028import org.slf4j.LoggerFactory; 029import pt.ua.dicoogle.sdk.Utils.QueryNumber; 030import pt.ua.dicoogle.sdk.Utils.TaskQueue; 031import pt.ua.dicoogle.sdk.Utils.TaskRequest; 032import pt.ua.dicoogle.sdk.datastructs.SearchResult; 033import pt.ua.dicoogle.sdk.observables.FileObservable; 034import pt.ua.dicoogle.sdk.observables.ListObservable; 035import pt.ua.dicoogle.sdk.observables.ListObservableSearch; 036import pt.ua.dicoogle.sdk.observables.MessageObservable; 037import pt.ua.dicoogle.sdk.p2p.Messages.Builders.MessageBuilder; 038import pt.ua.dicoogle.sdk.p2p.Messages.Handlers.MainMessageHandler; 039import pt.ua.dicoogle.sdk.p2p.Messages.MessageI; 040 041/** 042 * 043 * @author Carlos Ferreira 044 */ 045public abstract class NetworkPluginAdapter implements GenericPluginInterface, Observer 046{ 047 048 private boolean isRunning = false; 049 protected MainMessageHandler MMH; 050 private ListObservableSearch<SearchResult> searchResults = new ListObservableSearch<>(); 051 private TaskQueue TaskRequestsList; 052 private MessageObservable mo; 053 private List<FileObservable> requestedFiles = Collections.synchronizedList(new ArrayList<FileObservable>()); 054 055 @Override 056 public abstract String getName(); 057 058 public abstract NetworkPluginAdapter getInstance(); 059 060 public abstract MessageObservable initialize(); 061 062 public abstract void connect(); 063 064 public abstract void disconnect(); 065 066 public abstract boolean isConnected(); 067 068 public abstract void send(Object message); 069 070 public abstract void send(Object toSend, String address); 071 072 public abstract void sendFile(String path, String destAddress); 073 074 public abstract ListObservableSearch<String> getMembers(); 075 076 public abstract String getLocalAddress(); 077 078 protected abstract MessageObservable getLastmessage(); 079 080 public List<FileObservable> getRequestedFiles() 081 { 082 return this.requestedFiles; 083 } 084 085 public TaskQueue getTaskRequestsList() 086 { 087 return TaskRequestsList; 088 } 089 090 @Override 091 public void attendTask(TaskRequest task) 092 { 093 } 094 095 @Override 096 public void initialize(TaskQueue tasks) 097 { 098 //System.out.println("NetworkPluginAdapter initialize"); 099 this.isRunning = true; 100 this.TaskRequestsList = tasks; 101 mo = getInstance().initialize(); 102 mo.addObserver(getInstance()); 103 this.MMH = new MainMessageHandler(this); 104 } 105 106 @Override 107 public void Stop() 108 { 109 mo.deleteObserver(getInstance()); 110 this.isRunning = false; 111 this.disconnect(); 112 } 113 114 @Override 115 public ListObservableSearch<SearchResult> search(String query, Collection<String> extrafields) 116 { 117 MessageBuilder mb = new MessageBuilder(); 118 MessageI message = null; 119 try 120 { 121 Integer qNumber; 122 synchronized (this.searchResults) 123 { 124 qNumber = QueryNumber.getInstance().getNewQueryNumber(); 125 this.searchResults.resetArray(); 126 } 127 message = mb.buildQueryMessage(query, extrafields, this.getName(), qNumber); 128 } catch (IOException ex) 129 { 130 LoggerFactory.getLogger(NetworkPluginAdapter.class).error(ex.getMessage(), ex); 131 return null; 132 } 133 134 send(message); 135 return this.searchResults; 136 } 137 138 @Override 139 public ListObservableSearch<SearchResult> searchOne(String query, Collection<String> Extrafields, String address) 140 { 141 MessageBuilder mb = new MessageBuilder(); 142 MessageI message = null; 143 try 144 { 145 Integer qNumber; 146 synchronized (this.searchResults) 147 { 148 qNumber = QueryNumber.getInstance().getNewQueryNumber(); 149 this.searchResults.resetArray(); 150 } 151 message = mb.buildQueryMessage(query, Extrafields, this.getName(), qNumber); 152 } catch (IOException ex) 153 { 154 LoggerFactory.getLogger(NetworkPluginAdapter.class).error(ex.getMessage(), ex); 155 return null; 156 } 157 158 send(message, address); 159 return this.searchResults; 160 } 161 162 @Override 163 public FileObservable requestFile(String address, String name, String hash) 164 { 165 MessageBuilder mb = new MessageBuilder(); 166 MessageI message = null; 167 try 168 { 169 message = mb.buildFileRequest(name, hash, this.getName()); 170 } catch (IOException ex) 171 { 172 LoggerFactory.getLogger(NetworkPluginAdapter.class).error(ex.getMessage(), ex); 173 return null; 174 } 175 FileObservable newFileObservable = new FileObservable(address, name); 176 this.requestedFiles.add(newFileObservable); 177 send(message, address); 178 return newFileObservable; 179 } 180 181 @Override 182 public boolean isLocalPlugin() 183 { 184 return false; 185 } 186 187 @Override 188 public boolean isRunning() 189 { 190 return this.isRunning; 191 } 192 193 @Override 194 public void update(Observable o, Object arg) 195 { 196 //System.out.println("NetworkPluginPanel....some message received..."+ o.toString()); 197 if (MessageObservable.class.isInstance(o)) 198 { 199 MessageObservable message = (MessageObservable) o; 200 //System.out.println("NPA....received the message:\n"+ message); 201 this.MMH.handleMessage((MessageI) message.getMessage(), message.getAddress()); 202 203 } 204 } 205 206 public ListObservable<SearchResult> getSearchResults() 207 { 208 return searchResults; 209 } 210 211 212}