first version of request table
[jSite2.git] / src / net / pterodactylus / jsite / core / CoreImpl.java
1 /*
2  * jSite2 - Core.java -
3  * Copyright © 2008 David Roden
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18  */
19
20 package net.pterodactylus.jsite.core;
21
22 import java.io.IOException;
23 import java.net.UnknownHostException;
24 import java.util.ArrayList;
25 import java.util.List;
26
27 /**
28  * The core of jSite.
29  * 
30  * @author David ‘Bombe’ Roden <bombe@freenetproject.org>
31  * @version $Id$
32  */
33 public class CoreImpl implements Core, NodeListener, RequestListener {
34
35         /** The core listeners. */
36         private final List<CoreListener> coreListeners = new ArrayList<CoreListener>();
37
38         /** The project manager. */
39         private ProjectManager projectManager;
40
41         /** The node manager. */
42         private NodeManager nodeManager;
43
44         /** The request manager. */
45         /* TODO - remove */
46         @SuppressWarnings("unused")
47         private RequestManager requestManager;
48
49         //
50         // LISTENER MANAGEMENT
51         //
52
53         /**
54          * {@inheritDoc}
55          */
56         public void addCoreListener(CoreListener coreListener) {
57                 coreListeners.add(coreListener);
58         }
59
60         /**
61          * {@inheritDoc}
62          */
63         public void removeCoreListener(CoreListener coreListener) {
64                 coreListeners.remove(coreListener);
65         }
66
67         /**
68          * Notifies all listeners that the projects were loaded successfully.
69          * 
70          * @param directory
71          *            The directory the projects were loaded from
72          */
73         private void fireLoadingProjectsDone(String directory) {
74                 for (CoreListener coreListener: coreListeners) {
75                         coreListener.loadingProjectsDone(directory);
76                 }
77         }
78
79         /**
80          * Notifies all core listeners that loading the projects from the given
81          * directory has failed.
82          * 
83          * @param directory
84          *            The directory the projects were tried to load from
85          * @param throwable
86          *            The exception that occured when loading projects
87          */
88         private void fireLoadingProjectsFailed(String directory, Throwable throwable) {
89                 for (CoreListener coreListener: coreListeners) {
90                         coreListener.loadingProjectsFailed(directory, throwable);
91                 }
92         }
93
94         /**
95          * Notifies all listeners that the projects were successfully saved.
96          * 
97          * @param directory
98          *            The directory the projects were saved to
99          */
100         private void fireSavingProjectsDone(String directory) {
101                 for (CoreListener coreListener: coreListeners) {
102                         coreListener.savingProjectsDone(directory);
103                 }
104         }
105
106         /**
107          * Notifies all listeners that the projects could not be saved.
108          * 
109          * @param directory
110          *            The directory the projects were to be saved to
111          * @param throwable
112          *            The exception that occured when saving the projects
113          */
114         private void fireSavingProjectsFailed(String directory, Throwable throwable) {
115                 for (CoreListener coreListener: coreListeners) {
116                         coreListener.savingProjectsFailed(directory, throwable);
117                 }
118         }
119
120         /**
121          * Notifies all listeners that the nodes were successfully loaded.
122          * 
123          * @param directory
124          *            The directory the nodes were loaded from
125          */
126         private void fireLoadingNodesDone(String directory) {
127                 for (CoreListener coreListener: coreListeners) {
128                         coreListener.loadingNodesDone(directory);
129                 }
130         }
131
132         /**
133          * Notifies all listeners that loading the nodes has failed.
134          * 
135          * @param directory
136          *            The directory the nodes were loaded from
137          * @param throwable
138          *            The exception that occured while loading the nodes
139          */
140         private void fireLoadingNodesFailed(String directory, Throwable throwable) {
141                 for (CoreListener coreListener: coreListeners) {
142                         coreListener.loadingNodesFailed(directory, throwable);
143                 }
144         }
145
146         /**
147          * Notifies all listeners that the nodes were saved successfully.
148          * 
149          * @param directory
150          *            The directory the nodes were saved to
151          */
152         private void fireSavingNodesDone(String directory) {
153                 for (CoreListener coreListener: coreListeners) {
154                         coreListener.savingNodesDone(directory);
155                 }
156         }
157
158         /**
159          * Notifies all listeners that saving the nodes has failed.
160          * 
161          * @param directory
162          *            The directory the nodes were saved to
163          * @param throwable
164          *            The exception that occured while saving the nodes
165          */
166         private void fireSavingNodesFailed(String directory, Throwable throwable) {
167                 for (CoreListener coreListener: coreListeners) {
168                         coreListener.savingProjectsFailed(directory, throwable);
169                 }
170         }
171
172         /**
173          * Notifies all core listeners that the core has loaded and is ready to run.
174          */
175         private void fireCoreLoaded() {
176                 for (CoreListener coreListener: coreListeners) {
177                         coreListener.coreLoaded();
178                 }
179         }
180
181         /**
182          * Notifies all listeners that the core was stopped.
183          */
184         private void fireCoreStopped() {
185                 for (CoreListener coreListener: coreListeners) {
186                         coreListener.coreStopped();
187                 }
188         }
189
190         /**
191          * Notifies all listeners that a node was added to the core.
192          * 
193          * @param node
194          *            The node that was added
195          */
196         private void fireNodeAdded(Node node) {
197                 for (CoreListener coreListener: coreListeners) {
198                         coreListener.nodeAdded(node);
199                 }
200         }
201
202         /**
203          * Notifies all listeners that a node was removed from the core.
204          * 
205          * @param node
206          *            The node that was removed
207          */
208         private void fireNodeRemoved(Node node) {
209                 for (CoreListener coreListener: coreListeners) {
210                         coreListener.nodeRemoved(node);
211                 }
212         }
213
214         /**
215          * Notifies all listeners that a connection to the given node is now being
216          * established.
217          * 
218          * @param node
219          *            The node that is being connected to
220          */
221         private void fireNodeConnecting(Node node) {
222                 for (CoreListener coreListener: coreListeners) {
223                         coreListener.nodeConnecting(node);
224                 }
225         }
226
227         /**
228          * Notifies all listeners that the given node is now connected.
229          * 
230          * @param node
231          *            The node that is now connected
232          */
233         private void fireNodeConnected(Node node) {
234                 for (CoreListener coreListener: coreListeners) {
235                         coreListener.nodeConnected(node);
236                 }
237         }
238
239         /**
240          * Notifies all listeners that a connection to a node has failed.
241          * 
242          * @param node
243          *            The node that could not be connected
244          * @param cause
245          *            The cause of the failure
246          */
247         private void fireNodeConnectionFailed(Node node, Throwable cause) {
248                 for (CoreListener coreListener: coreListeners) {
249                         coreListener.nodeConnectionFailed(node, cause);
250                 }
251         }
252
253         /**
254          * Notifies all listeners that the given node was disconnected.
255          * 
256          * @param node
257          *            The node that is now disconnected
258          * @param throwable
259          *            The exception that caused the disconnect, or <code>null</code>
260          *            if there was no exception
261          */
262         private void fireNodeDisconnected(Node node, Throwable throwable) {
263                 for (CoreListener coreListener: coreListeners) {
264                         coreListener.nodeDisconnected(node, throwable);
265                 }
266         }
267
268         /**
269          * Notifies all listeners that a request was added to a node.
270          * 
271          * @param request
272          *            The request that was added
273          */
274         private void fireRequestAdded(Request request) {
275                 for (CoreListener coreListener: coreListeners) {
276                         coreListener.requestAdded(request);
277                 }
278         }
279
280         /**
281          * Notifies all listeners that a request progressed.
282          * 
283          * @param request
284          *            The request
285          */
286         private void fireRequestProgressed(Request request) {
287                 for (CoreListener coreListener: coreListeners) {
288                         coreListener.requestProgressed(request);
289                 }
290         }
291
292         //
293         // ACCESSORS
294         //
295
296         /**
297          * Returns the project manager.
298          * 
299          * @return The project manager
300          */
301         public ProjectManager getProjectManager() {
302                 return projectManager;
303         }
304
305         /**
306          * Sets the project manager to use.
307          * 
308          * @param projectManager
309          *            The project manager to use
310          */
311         public void setProjectManager(ProjectManager projectManager) {
312                 this.projectManager = projectManager;
313         }
314
315         /**
316          * Returns the node manager.
317          * 
318          * @return The node manager
319          */
320         public NodeManager getNodeManager() {
321                 return nodeManager;
322         }
323
324         /**
325          * Sets the node manager to use.
326          * 
327          * @param nodeManager
328          *            The node manager to use
329          */
330         public void setNodeManager(NodeManager nodeManager) {
331                 this.nodeManager = nodeManager;
332         }
333
334         /**
335          * Sets the request manager to use.
336          * 
337          * @param requestManager
338          *            The request manager to use
339          */
340         public void setRequestManager(RequestManager requestManager) {
341                 this.requestManager = requestManager;
342         }
343
344         /**
345          * {@inheritDoc}
346          */
347         public List<Node> getNodes() {
348                 return nodeManager.getNodes();
349         }
350
351         /**
352          * {@inheritDoc}
353          */
354         public boolean isNodeConnected(Node node) {
355                 return nodeManager.hasNode(node);
356         }
357
358         //
359         // ACTIONS
360         //
361
362         /**
363          * {@inheritDoc}
364          */
365         public void start() {
366                 try {
367                         projectManager.load();
368                         fireLoadingProjectsDone(projectManager.getDirectory());
369                 } catch (IOException ioe1) {
370                         fireLoadingProjectsFailed(projectManager.getDirectory(), ioe1);
371                 }
372                 try {
373                         nodeManager.load();
374                         fireLoadingNodesDone(nodeManager.getDirectory());
375                 } catch (IOException ioe1) {
376                         fireLoadingNodesFailed(nodeManager.getDirectory(), ioe1);
377                 }
378                 fireCoreLoaded();
379         }
380
381         /**
382          * {@inheritDoc}
383          */
384         public void stop() {
385                 try {
386                         projectManager.save();
387                         fireSavingProjectsDone(projectManager.getDirectory());
388                 } catch (IOException ioe1) {
389                         fireSavingProjectsFailed(projectManager.getDirectory(), ioe1);
390                 }
391                 try {
392                         nodeManager.save();
393                         fireSavingNodesDone(nodeManager.getDirectory());
394                 } catch (IOException ioe1) {
395                         fireSavingNodesFailed(nodeManager.getDirectory(), ioe1);
396                 }
397                 fireCoreStopped();
398         }
399
400         /**
401          * {@inheritDoc}
402          */
403         public boolean addNode(Node node) throws UnknownHostException {
404                 return nodeManager.addNode(node);
405         }
406
407         /**
408          * {@inheritDoc}
409          */
410         public void removeNode(Node node) {
411                 nodeManager.removeNode(node);
412         }
413
414         /**
415          * {@inheritDoc}
416          */
417         public void connectToNode(Node node) {
418                 fireNodeConnecting(node);
419                 nodeManager.connect(node);
420         }
421
422         /**
423          * {@inheritDoc}
424          */
425         public void disconnectFromNode(Node node) {
426                 nodeManager.disconnect(node);
427         }
428
429         //
430         // PRIVATE METHODS
431         //
432
433         /**
434          * Loads the configuration.
435          */
436         @SuppressWarnings("unused")
437         private void loadConfig() {
438                 /* TODO */
439         }
440
441         /**
442          * Saves the configuration.
443          */
444         @SuppressWarnings("unused")
445         private void saveConfig() {
446                 /* TODO */
447         }
448
449         //
450         // INTERFACE NodeListener
451         //
452
453         /**
454          * {@inheritDoc}
455          */
456         public void nodeAdded(Node node) {
457                 fireNodeAdded(node);
458         }
459
460         /**
461          * {@inheritDoc}
462          */
463         public void nodeRemoved(Node node) {
464                 fireNodeRemoved(node);
465         }
466
467         /**
468          * {@inheritDoc}
469          */
470         public void nodeConnected(Node node) {
471                 fireNodeConnected(node);
472         }
473
474         /**
475          * {@inheritDoc}
476          */
477         public void nodeConnectionFailed(Node node, Throwable cause) {
478                 fireNodeConnectionFailed(node, cause);
479         }
480
481         /**
482          * {@inheritDoc}
483          */
484         public void nodeDisconnected(Node node, Throwable throwable) {
485                 fireNodeDisconnected(node, throwable);
486         }
487
488         //
489         // INTERFACE RequestListener
490         //
491
492         /**
493          * {@inheritDoc}
494          */
495         public void requestAdded(Request request) {
496                 fireRequestAdded(request);
497         }
498
499         /**
500          * @see net.pterodactylus.jsite.core.RequestListener#requestProgressed(Request)
501          */
502         public void requestProgressed(Request request) {
503                 fireRequestProgressed(request);
504         }
505
506         /**
507          * @see net.pterodactylus.jsite.core.RequestListener#requestRemoved(net.pterodactylus.jsite.core.Request)
508          */
509         public void requestRemoved(Request request) {
510                 /* TODO */
511         }
512
513 }