make class public again for Main class
[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          * Notifies all listeners that a request was removed.
294          * 
295          * @param request
296          *            The request that was removed
297          */
298         private void fireRequestRemoved(Request request) {
299                 for (CoreListener coreListener: coreListeners) {
300                         coreListener.requestRemoved(request);
301                 }
302         }
303
304         //
305         // ACCESSORS
306         //
307
308         /**
309          * Returns the project manager.
310          * 
311          * @return The project manager
312          */
313         public ProjectManager getProjectManager() {
314                 return projectManager;
315         }
316
317         /**
318          * Sets the project manager to use.
319          * 
320          * @param projectManager
321          *            The project manager to use
322          */
323         public void setProjectManager(ProjectManager projectManager) {
324                 this.projectManager = projectManager;
325         }
326
327         /**
328          * Returns the node manager.
329          * 
330          * @return The node manager
331          */
332         public NodeManager getNodeManager() {
333                 return nodeManager;
334         }
335
336         /**
337          * Sets the node manager to use.
338          * 
339          * @param nodeManager
340          *            The node manager to use
341          */
342         public void setNodeManager(NodeManager nodeManager) {
343                 this.nodeManager = nodeManager;
344         }
345
346         /**
347          * Sets the request manager to use.
348          * 
349          * @param requestManager
350          *            The request manager to use
351          */
352         public void setRequestManager(RequestManager requestManager) {
353                 this.requestManager = requestManager;
354         }
355
356         /**
357          * {@inheritDoc}
358          */
359         public List<Node> getNodes() {
360                 return nodeManager.getNodes();
361         }
362
363         /**
364          * {@inheritDoc}
365          */
366         public boolean isNodeConnected(Node node) {
367                 return nodeManager.hasNode(node);
368         }
369
370         /**
371          * {@inheritDoc}
372          */
373         public List<Project> getProjects() {
374                 return projectManager.getProjects();
375         }
376
377         //
378         // ACTIONS
379         //
380
381         /**
382          * {@inheritDoc}
383          */
384         public void start() {
385                 try {
386                         projectManager.load();
387                         fireLoadingProjectsDone(projectManager.getDirectory());
388                 } catch (IOException ioe1) {
389                         fireLoadingProjectsFailed(projectManager.getDirectory(), ioe1);
390                 }
391                 try {
392                         nodeManager.load();
393                         fireLoadingNodesDone(nodeManager.getDirectory());
394                 } catch (IOException ioe1) {
395                         fireLoadingNodesFailed(nodeManager.getDirectory(), ioe1);
396                 }
397                 fireCoreLoaded();
398         }
399
400         /**
401          * {@inheritDoc}
402          */
403         public void stop() {
404                 try {
405                         projectManager.save();
406                         fireSavingProjectsDone(projectManager.getDirectory());
407                 } catch (IOException ioe1) {
408                         fireSavingProjectsFailed(projectManager.getDirectory(), ioe1);
409                 }
410                 try {
411                         nodeManager.save();
412                         fireSavingNodesDone(nodeManager.getDirectory());
413                 } catch (IOException ioe1) {
414                         fireSavingNodesFailed(nodeManager.getDirectory(), ioe1);
415                 }
416                 fireCoreStopped();
417         }
418
419         /**
420          * {@inheritDoc}
421          */
422         public boolean addNode(Node node) throws UnknownHostException {
423                 return nodeManager.addNode(node);
424         }
425
426         /**
427          * {@inheritDoc}
428          */
429         public void removeNode(Node node) {
430                 nodeManager.removeNode(node);
431         }
432
433         /**
434          * {@inheritDoc}
435          */
436         public void connectToNode(Node node) {
437                 fireNodeConnecting(node);
438                 nodeManager.connect(node);
439         }
440
441         /**
442          * {@inheritDoc}
443          */
444         public void disconnectFromNode(Node node) {
445                 nodeManager.disconnect(node);
446         }
447
448         /**
449          * {@inheritDoc}
450          */
451         public Project createProject() throws IOException, NoNodeException {
452                 return projectManager.createProject();
453         }
454
455         //
456         // PRIVATE METHODS
457         //
458
459         /**
460          * Loads the configuration.
461          */
462         @SuppressWarnings("unused")
463         private void loadConfig() {
464                 /* TODO */
465         }
466
467         /**
468          * Saves the configuration.
469          */
470         @SuppressWarnings("unused")
471         private void saveConfig() {
472                 /* TODO */
473         }
474
475         //
476         // INTERFACE NodeListener
477         //
478
479         /**
480          * {@inheritDoc}
481          */
482         public void nodeAdded(Node node) {
483                 fireNodeAdded(node);
484         }
485
486         /**
487          * {@inheritDoc}
488          */
489         public void nodeRemoved(Node node) {
490                 fireNodeRemoved(node);
491         }
492
493         /**
494          * {@inheritDoc}
495          */
496         public void nodeConnected(Node node) {
497                 fireNodeConnected(node);
498         }
499
500         /**
501          * {@inheritDoc}
502          */
503         public void nodeConnectionFailed(Node node, Throwable cause) {
504                 fireNodeConnectionFailed(node, cause);
505         }
506
507         /**
508          * {@inheritDoc}
509          */
510         public void nodeDisconnected(Node node, Throwable throwable) {
511                 fireNodeDisconnected(node, throwable);
512         }
513
514         //
515         // INTERFACE RequestListener
516         //
517
518         /**
519          * {@inheritDoc}
520          */
521         public void requestAdded(Request request) {
522                 fireRequestAdded(request);
523         }
524
525         /**
526          * @see net.pterodactylus.jsite.core.RequestListener#requestProgressed(Request)
527          */
528         public void requestProgressed(Request request) {
529                 fireRequestProgressed(request);
530         }
531
532         /**
533          * @see net.pterodactylus.jsite.core.RequestListener#requestRemoved(net.pterodactylus.jsite.core.Request)
534          */
535         public void requestRemoved(Request request) {
536                 fireRequestRemoved(request);
537         }
538
539 }