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}