WIP
[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 the given node was disconnected.
241          * 
242          * @param node
243          *            The node that is now disconnected
244          * @param throwable
245          *            The exception that caused the disconnect, or <code>null</code>
246          *            if there was no exception
247          */
248         private void fireNodeDisconnected(Node node, Throwable throwable) {
249                 for (CoreListener coreListener: coreListeners) {
250                         coreListener.nodeDisconnected(node, throwable);
251                 }
252         }
253
254         /**
255          * Notifies all listeners that a request was added to a node.
256          * 
257          * @param node
258          *            The node the request was added to
259          * @param request
260          *            The request that was added
261          */
262         private void fireRequestAdded(Node node, Request request) {
263                 for (CoreListener coreListener: coreListeners) {
264                         coreListener.requestAdded(node, request);
265                 }
266         }
267
268         /**
269          * Notifies all listeners that a request progressed.
270          * 
271          * @param node
272          *            The node that runs the request
273          * @param request
274          *            The request
275          * @param totalBlocks
276          *            The total number of blocks
277          * @param requiredBlocks
278          *            The number of required blocks
279          * @param successfulBlocks
280          *            The number of successful blocks
281          * @param failedBlocks
282          *            The number of failed blocks
283          * @param fatallyFailedBlocks
284          *            The number of fatally failed blocks
285          * @param finalizedTotal
286          *            <code>true</code> if the total number of blocks in final,
287          *            <code>false</code> otherwise
288          */
289         private void fireRequestProgressed(Node node, Request request, int totalBlocks, int requiredBlocks, int successfulBlocks, int failedBlocks, int fatallyFailedBlocks, boolean finalizedTotal) {
290                 for (CoreListener coreListener: coreListeners) {
291                         coreListener.requestProgressed(request, totalBlocks, requiredBlocks, successfulBlocks, failedBlocks, fatallyFailedBlocks, finalizedTotal);
292                 }
293         }
294
295         //
296         // ACCESSORS
297         //
298
299         /**
300          * Returns the project manager.
301          * 
302          * @return The project manager
303          */
304         public ProjectManager getProjectManager() {
305                 return projectManager;
306         }
307
308         /**
309          * Sets the project manager to use.
310          * 
311          * @param projectManager
312          *            The project manager to use
313          */
314         public void setProjectManager(ProjectManager projectManager) {
315                 this.projectManager = projectManager;
316         }
317
318         /**
319          * Returns the node manager.
320          * 
321          * @return The node manager
322          */
323         public NodeManager getNodeManager() {
324                 return nodeManager;
325         }
326
327         /**
328          * Sets the node manager to use.
329          * 
330          * @param nodeManager
331          *            The node manager to use
332          */
333         public void setNodeManager(NodeManager nodeManager) {
334                 this.nodeManager = nodeManager;
335         }
336
337         /**
338          * Sets the request manager to use.
339          * 
340          * @param requestManager
341          *            The request manager to use
342          */
343         public void setRequestManager(RequestManager requestManager) {
344                 this.requestManager = requestManager;
345         }
346
347         /**
348          * {@inheritDoc}
349          */
350         public List<Node> getNodes() {
351                 return nodeManager.getNodes();
352         }
353
354         /**
355          * {@inheritDoc}
356          */
357         public boolean isNodeConnected(Node node) {
358                 return nodeManager.hasNode(node);
359         }
360
361         //
362         // ACTIONS
363         //
364
365         /**
366          * {@inheritDoc}
367          */
368         public void start() {
369                 try {
370                         projectManager.load();
371                         fireLoadingProjectsDone(projectManager.getDirectory());
372                 } catch (IOException ioe1) {
373                         fireLoadingProjectsFailed(projectManager.getDirectory(), ioe1);
374                 }
375                 try {
376                         nodeManager.load();
377                         fireLoadingNodesDone(nodeManager.getDirectory());
378                 } catch (IOException ioe1) {
379                         fireLoadingNodesFailed(nodeManager.getDirectory(), ioe1);
380                 }
381                 fireCoreLoaded();
382         }
383
384         /**
385          * {@inheritDoc}
386          */
387         public void stop() {
388                 try {
389                         projectManager.save();
390                         fireSavingProjectsDone(projectManager.getDirectory());
391                 } catch (IOException ioe1) {
392                         fireSavingProjectsFailed(projectManager.getDirectory(), ioe1);
393                 }
394                 try {
395                         nodeManager.save();
396                         fireSavingNodesDone(nodeManager.getDirectory());
397                 } catch (IOException ioe1) {
398                         fireSavingNodesFailed(nodeManager.getDirectory(), ioe1);
399                 }
400                 fireCoreStopped();
401         }
402
403         /**
404          * {@inheritDoc}
405          */
406         public void addNode(Node node) throws UnknownHostException {
407                 nodeManager.addNode(node);
408                 fireNodeAdded(node);
409         }
410
411         /**
412          * {@inheritDoc}
413          */
414         public void removeNode(Node node) {
415                 nodeManager.removeNode(node);
416                 fireNodeRemoved(node);
417         }
418
419         /**
420          * {@inheritDoc}
421          */
422         public void connectToNode(Node node) {
423                 fireNodeConnecting(node);
424                 nodeManager.connect(node);
425         }
426
427         /**
428          * {@inheritDoc}
429          */
430         public void disconnectFromNode(Node node) {
431                 nodeManager.disconnect(node);
432         }
433
434         //
435         // PRIVATE METHODS
436         //
437
438         /**
439          * Loads the configuration.
440          */
441         @SuppressWarnings("unused")
442         private void loadConfig() {
443                 /* TODO */
444         }
445
446         /**
447          * Saves the configuration.
448          */
449         @SuppressWarnings("unused")
450         private void saveConfig() {
451                 /* TODO */
452         }
453
454         //
455         // INTERFACE NodeListener
456         //
457
458         /**
459          * {@inheritDoc}
460          */
461         public void nodeAdded(Node node) {
462                 fireNodeAdded(node);
463         }
464
465         /**
466          * {@inheritDoc}
467          */
468         public void nodeRemoved(Node node) {
469                 fireNodeRemoved(node);
470         }
471
472         /**
473          * {@inheritDoc}
474          */
475         public void nodeConnected(Node node) {
476                 fireNodeConnected(node);
477         }
478
479         /**
480          * {@inheritDoc}
481          */
482         public void nodeDisconnected(Node node, Throwable throwable) {
483                 fireNodeDisconnected(node, throwable);
484         }
485
486         //
487         // INTERFACE RequestListener
488         //
489
490         /**
491          * {@inheritDoc}
492          */
493         public void requestAdded(Node node, Request request) {
494                 fireRequestAdded(node, request);
495         }
496
497         /**
498          * @see net.pterodactylus.jsite.core.RequestListener#requestProgressed(net.pterodactylus.jsite.core.Node,
499          *      net.pterodactylus.jsite.core.Request, int, int, int, int, int,
500          *      boolean)
501          */
502         public void requestProgressed(Node node, Request request, int totalBlocks, int requiredBlocks, int successfulBlocks, int failedBlocks, int fatallyFailedBlocks, boolean finalizedTotal) {
503         fireRequestProgressed(node, request, totalBlocks, requiredBlocks, successfulBlocks, failedBlocks, fatallyFailedBlocks, finalizedTotal);
504     }
505 }