Move CoreListener event firing to CoreListenerSupport.
[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.List;
25 import java.util.concurrent.Executor;
26 import java.util.concurrent.Executors;
27 import java.util.logging.Level;
28 import java.util.logging.Logger;
29
30 import net.pterodactylus.util.logging.Logging;
31
32 /**
33  * The core of jSite.
34  *
35  * @author David ‘Bombe’ Roden <bombe@freenetproject.org>
36  */
37 public class CoreImpl implements Core, NodeListener, RequestListener {
38
39         /** The logger. */
40         private static final Logger logger = Logging.getLogger(CoreImpl.class.getName());
41
42         /** The core listener support. */
43         private final CoreListenerSupport coreListenerSupport = new CoreListenerSupport();
44
45         /** Thread pool. */
46         private Executor threadPool = Executors.newCachedThreadPool();
47
48         /** The project manager. */
49         private ProjectManager projectManager;
50
51         /** The node manager. */
52         private NodeManager nodeManager;
53
54         /** The request manager. */
55         /* TODO - remove */
56         @SuppressWarnings("unused")
57         private RequestManager requestManager;
58
59         //
60         // LISTENER MANAGEMENT
61         //
62
63         /**
64          * {@inheritDoc}
65          */
66         public void addCoreListener(CoreListener coreListener) {
67                 logger.log(Level.FINEST, "adding core listener: " + coreListener);
68                 coreListenerSupport.addListener(coreListener);
69         }
70
71         /**
72          * {@inheritDoc}
73          */
74         public void removeCoreListener(CoreListener coreListener) {
75                 logger.log(Level.FINEST, "removing core listener: " + coreListener);
76                 coreListenerSupport.removeListener(coreListener);
77         }
78
79         //
80         // ACCESSORS
81         //
82
83         /**
84          * {@inheritDoc}
85          */
86         public Executor getThreadPool() {
87                 return threadPool;
88         }
89
90         /**
91          * Returns the project manager.
92          *
93          * @return The project manager
94          */
95         public ProjectManager getProjectManager() {
96                 return projectManager;
97         }
98
99         /**
100          * Sets the project manager to use.
101          *
102          * @param projectManager
103          *            The project manager to use
104          */
105         public void setProjectManager(ProjectManager projectManager) {
106                 this.projectManager = projectManager;
107         }
108
109         /**
110          * Returns the node manager.
111          *
112          * @return The node manager
113          */
114         public NodeManager getNodeManager() {
115                 return nodeManager;
116         }
117
118         /**
119          * Sets the node manager to use.
120          *
121          * @param nodeManager
122          *            The node manager to use
123          */
124         public void setNodeManager(NodeManager nodeManager) {
125                 this.nodeManager = nodeManager;
126         }
127
128         /**
129          * Sets the request manager to use.
130          *
131          * @param requestManager
132          *            The request manager to use
133          */
134         public void setRequestManager(RequestManager requestManager) {
135                 this.requestManager = requestManager;
136         }
137
138         /**
139          * {@inheritDoc}
140          */
141         public List<Node> getNodes() {
142                 return nodeManager.getNodes();
143         }
144
145         /**
146          * {@inheritDoc}
147          */
148         public boolean isNodeConnected(Node node) {
149                 return nodeManager.hasNode(node);
150         }
151
152         /**
153          * {@inheritDoc}
154          */
155         public List<Project> getProjects() {
156                 return projectManager.getProjects();
157         }
158
159         //
160         // ACTIONS
161         //
162
163         /**
164          * {@inheritDoc}
165          */
166         public void start() {
167                 logger.log(Level.INFO, "starting core…");
168                 try {
169                         nodeManager.load();
170                         coreListenerSupport.fireLoadingNodesDone(nodeManager.getDirectory());
171                 } catch (IOException ioe1) {
172                         coreListenerSupport.fireLoadingNodesFailed(nodeManager.getDirectory(), ioe1);
173                 }
174                 try {
175                         projectManager.load();
176                         coreListenerSupport.fireLoadingProjectsDone(projectManager.getDirectory());
177                 } catch (IOException ioe1) {
178                         coreListenerSupport.fireLoadingProjectsFailed(projectManager.getDirectory(), ioe1);
179                 }
180                 coreListenerSupport.fireCoreLoaded();
181         }
182
183         /**
184          * {@inheritDoc}
185          */
186         public void stop() {
187                 logger.log(Level.INFO, "stopping core…");
188                 try {
189                         projectManager.save();
190                         coreListenerSupport.fireSavingProjectsDone(projectManager.getDirectory());
191                 } catch (IOException ioe1) {
192                         coreListenerSupport.fireSavingProjectsFailed(projectManager.getDirectory(), ioe1);
193                 }
194                 try {
195                         nodeManager.save();
196                         coreListenerSupport.fireSavingNodesDone(nodeManager.getDirectory());
197                 } catch (IOException ioe1) {
198                         coreListenerSupport.fireSavingNodesFailed(nodeManager.getDirectory(), ioe1);
199                 }
200                 coreListenerSupport.fireCoreStopped();
201         }
202
203         /**
204          * {@inheritDoc}
205          */
206         public boolean addNode(Node node) throws UnknownHostException {
207                 logger.log(Level.FINEST, "addNode(node=" + node + ")");
208                 return nodeManager.addNode(node);
209         }
210
211         /**
212          * {@inheritDoc}
213          */
214         public void removeNode(Node node) {
215                 logger.log(Level.FINEST, "removeNode(node=" + node + ")");
216                 nodeManager.removeNode(node);
217         }
218
219         /**
220          * {@inheritDoc}
221          */
222         public void connectToNode(Node node) {
223                 logger.log(Level.FINEST, "connectToNode(node=" + node + ")");
224                 coreListenerSupport.fireNodeConnecting(node);
225                 nodeManager.connect(node);
226         }
227
228         /**
229          * {@inheritDoc}
230          */
231         public void disconnectFromNode(Node node) {
232                 logger.log(Level.FINEST, "disconnectFromNode(node=" + node + ")");
233                 nodeManager.disconnect(node);
234         }
235
236         /**
237          * {@inheritDoc}
238          */
239         public void createProject() throws IOException, JSiteException {
240                 logger.log(Level.FINEST, "createProject()");
241                 Project newProject = projectManager.createProject();
242                 coreListenerSupport.fireProjectAdded(newProject);
243         }
244
245         /**
246          * {@inheritDoc}
247          */
248         public void cloneProject(Project project) {
249                 logger.log(Level.FINEST, "cloneProject(project=" + project + ")");
250                 Project projectClone = projectManager.cloneProject(project);
251                 coreListenerSupport.fireProjectCloned(project, projectClone);
252         }
253
254         /**
255          * {@inheritDoc}
256          */
257         public void removeProject(Project project) {
258                 logger.log(Level.FINEST, "removeProject(project=" + project + ")");
259                 projectManager.removeProject(project);
260                 coreListenerSupport.fireProjectRemoved(project);
261         }
262
263         //
264         // PRIVATE METHODS
265         //
266
267         /**
268          * Loads the configuration.
269          */
270         @SuppressWarnings("unused")
271         private void loadConfig() {
272                 logger.log(Level.FINEST, "loadConfig()");
273                 /* TODO */
274         }
275
276         /**
277          * Saves the configuration.
278          */
279         @SuppressWarnings("unused")
280         private void saveConfig() {
281                 logger.log(Level.FINEST, "saveConfig()");
282                 /* TODO */
283         }
284
285         //
286         // INTERFACE NodeListener
287         //
288
289         /**
290          * {@inheritDoc}
291          */
292         public void nodeAdded(Node node) {
293                 coreListenerSupport.fireNodeAdded(node);
294         }
295
296         /**
297          * {@inheritDoc}
298          */
299         public void nodeRemoved(Node node) {
300                 coreListenerSupport.fireNodeRemoved(node);
301         }
302
303         /**
304          * {@inheritDoc}
305          */
306         public void nodeConnected(Node node) {
307                 coreListenerSupport.fireNodeConnected(node);
308         }
309
310         /**
311          * {@inheritDoc}
312          */
313         public void nodeConnectionFailed(Node node, Throwable cause) {
314                 coreListenerSupport.fireNodeConnectionFailed(node, cause);
315         }
316
317         /**
318          * {@inheritDoc}
319          */
320         public void nodeDisconnected(Node node, Throwable throwable) {
321                 coreListenerSupport.fireNodeDisconnected(node, throwable);
322         }
323
324         //
325         // INTERFACE RequestListener
326         //
327
328         /**
329          * {@inheritDoc}
330          */
331         public void requestAdded(Request request) {
332                 /* TODO - find project and process request */
333         }
334
335         /**
336          * @see net.pterodactylus.jsite.core.RequestListener#requestProgressed(Request)
337          */
338         public void requestProgressed(Request request) {
339                 /* TODO - find project and process request */
340         }
341
342         /**
343          * @see net.pterodactylus.jsite.core.RequestListener#requestRemoved(net.pterodactylus.jsite.core.Request)
344          */
345         public void requestRemoved(Request request) {
346                 /* TODO - find project and process request */
347         }
348
349         /**
350          * @see net.pterodactylus.jsite.core.RequestListener#requestGeneratedURI(net.pterodactylus.jsite.core.Request,
351          *      java.lang.String)
352          */
353         public void requestGeneratedURI(Request request, String uri) {
354                 /* TODO - find project and process request */
355         }
356
357         /**
358          * @see net.pterodactylus.jsite.core.RequestListener#requestFinished(net.pterodactylus.jsite.core.Request)
359          */
360         public void requestFinished(Request request) {
361                 /* TODO - find project and process request */
362         }
363
364 }