3 * Copyright © 2008 David Roden
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.
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.
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.
20 package net.pterodactylus.jsite.core;
22 import java.io.IOException;
23 import java.net.UnknownHostException;
24 import java.util.ArrayList;
25 import java.util.List;
26 import java.util.concurrent.Executor;
27 import java.util.concurrent.Executors;
33 * @author David ‘Bombe’ Roden <bombe@freenetproject.org>
35 public class CoreImpl implements Core, NodeListener, RequestListener {
37 /** The core listeners. */
38 private final List<CoreListener> coreListeners = new ArrayList<CoreListener>();
41 private Executor threadPool = Executors.newCachedThreadPool();
43 /** The project manager. */
44 private ProjectManager projectManager;
46 /** The node manager. */
47 private NodeManager nodeManager;
49 /** The request manager. */
51 @SuppressWarnings("unused")
52 private RequestManager requestManager;
55 // LISTENER MANAGEMENT
61 public void addCoreListener(CoreListener coreListener) {
62 coreListeners.add(coreListener);
68 public void removeCoreListener(CoreListener coreListener) {
69 coreListeners.remove(coreListener);
73 * Notifies all listeners that the projects were loaded successfully.
76 * The directory the projects were loaded from
78 private void fireLoadingProjectsDone(String directory) {
79 for (CoreListener coreListener : coreListeners) {
80 coreListener.loadingProjectsDone(directory);
85 * Notifies all core listeners that loading the projects from the given
86 * directory has failed.
89 * The directory the projects were tried to load from
91 * The exception that occured when loading projects
93 private void fireLoadingProjectsFailed(String directory, Throwable throwable) {
94 for (CoreListener coreListener : coreListeners) {
95 coreListener.loadingProjectsFailed(directory, throwable);
100 * Notifies all listeners that the projects were successfully saved.
103 * The directory the projects were saved to
105 private void fireSavingProjectsDone(String directory) {
106 for (CoreListener coreListener : coreListeners) {
107 coreListener.savingProjectsDone(directory);
112 * Notifies all listeners that the projects could not be saved.
115 * The directory the projects were to be saved to
117 * The exception that occured when saving the projects
119 private void fireSavingProjectsFailed(String directory, Throwable throwable) {
120 for (CoreListener coreListener : coreListeners) {
121 coreListener.savingProjectsFailed(directory, throwable);
126 * Notifies all listeners that a project was added.
129 * The project that was added
131 private void fireProjectAdded(Project project) {
132 for (CoreListener coreListener : coreListeners) {
133 coreListener.projectAdded(project);
138 * Notifies all listeners that a project was cloned.
140 * @param clonedProject
141 * The project that was cloned
142 * @param projectClone
143 * The clone of the project
145 private void fireProjectCloned(Project clonedProject, Project projectClone) {
146 for (CoreListener coreListener : coreListeners) {
147 coreListener.projectCloned(clonedProject, projectClone);
152 * Notifies all listeners that a project was removed.
155 * The project that was removed
157 private void fireProjectRemoved(Project project) {
158 for (CoreListener coreListener : coreListeners) {
159 coreListener.projectRemoved(project);
164 * Notifies all listeners that the nodes were successfully loaded.
167 * The directory the nodes were loaded from
169 private void fireLoadingNodesDone(String directory) {
170 for (CoreListener coreListener : coreListeners) {
171 coreListener.loadingNodesDone(directory);
176 * Notifies all listeners that loading the nodes has failed.
179 * The directory the nodes were loaded from
181 * The exception that occured while loading the nodes
183 private void fireLoadingNodesFailed(String directory, Throwable throwable) {
184 for (CoreListener coreListener : coreListeners) {
185 coreListener.loadingNodesFailed(directory, throwable);
190 * Notifies all listeners that the nodes were saved successfully.
193 * The directory the nodes were saved to
195 private void fireSavingNodesDone(String directory) {
196 for (CoreListener coreListener : coreListeners) {
197 coreListener.savingNodesDone(directory);
202 * Notifies all listeners that saving the nodes has failed.
205 * The directory the nodes were saved to
207 * The exception that occured while saving the nodes
209 private void fireSavingNodesFailed(String directory, Throwable throwable) {
210 for (CoreListener coreListener : coreListeners) {
211 coreListener.savingProjectsFailed(directory, throwable);
216 * Notifies all core listeners that the core has loaded and is ready to run.
218 private void fireCoreLoaded() {
219 for (CoreListener coreListener : coreListeners) {
220 coreListener.coreLoaded();
225 * Notifies all listeners that the core was stopped.
227 private void fireCoreStopped() {
228 for (CoreListener coreListener : coreListeners) {
229 coreListener.coreStopped();
234 * Notifies all listeners that a node was added to the core.
237 * The node that was added
239 private void fireNodeAdded(Node node) {
240 for (CoreListener coreListener : coreListeners) {
241 coreListener.nodeAdded(node);
246 * Notifies all listeners that a node was removed from the core.
249 * The node that was removed
251 private void fireNodeRemoved(Node node) {
252 for (CoreListener coreListener : coreListeners) {
253 coreListener.nodeRemoved(node);
258 * Notifies all listeners that a connection to the given node is now being
262 * The node that is being connected to
264 private void fireNodeConnecting(Node node) {
265 for (CoreListener coreListener : coreListeners) {
266 coreListener.nodeConnecting(node);
271 * Notifies all listeners that the given node is now connected.
274 * The node that is now connected
276 private void fireNodeConnected(Node node) {
277 for (CoreListener coreListener : coreListeners) {
278 coreListener.nodeConnected(node);
283 * Notifies all listeners that a connection to a node has failed.
286 * The node that could not be connected
288 * The cause of the failure
290 private void fireNodeConnectionFailed(Node node, Throwable cause) {
291 for (CoreListener coreListener : coreListeners) {
292 coreListener.nodeConnectionFailed(node, cause);
297 * Notifies all listeners that the given node was disconnected.
300 * The node that is now disconnected
302 * The exception that caused the disconnect, or <code>null</code>
303 * if there was no exception
305 private void fireNodeDisconnected(Node node, Throwable throwable) {
306 for (CoreListener coreListener : coreListeners) {
307 coreListener.nodeDisconnected(node, throwable);
318 public Executor getThreadPool() {
323 * Returns the project manager.
325 * @return The project manager
327 public ProjectManager getProjectManager() {
328 return projectManager;
332 * Sets the project manager to use.
334 * @param projectManager
335 * The project manager to use
337 public void setProjectManager(ProjectManager projectManager) {
338 this.projectManager = projectManager;
342 * Returns the node manager.
344 * @return The node manager
346 public NodeManager getNodeManager() {
351 * Sets the node manager to use.
354 * The node manager to use
356 public void setNodeManager(NodeManager nodeManager) {
357 this.nodeManager = nodeManager;
361 * Sets the request manager to use.
363 * @param requestManager
364 * The request manager to use
366 public void setRequestManager(RequestManager requestManager) {
367 this.requestManager = requestManager;
373 public List<Node> getNodes() {
374 return nodeManager.getNodes();
380 public boolean isNodeConnected(Node node) {
381 return nodeManager.hasNode(node);
387 public List<Project> getProjects() {
388 return projectManager.getProjects();
398 public void start() {
401 fireLoadingNodesDone(nodeManager.getDirectory());
402 } catch (IOException ioe1) {
403 fireLoadingNodesFailed(nodeManager.getDirectory(), ioe1);
406 projectManager.load();
407 fireLoadingProjectsDone(projectManager.getDirectory());
408 } catch (IOException ioe1) {
409 fireLoadingProjectsFailed(projectManager.getDirectory(), ioe1);
419 projectManager.save();
420 fireSavingProjectsDone(projectManager.getDirectory());
421 } catch (IOException ioe1) {
422 fireSavingProjectsFailed(projectManager.getDirectory(), ioe1);
426 fireSavingNodesDone(nodeManager.getDirectory());
427 } catch (IOException ioe1) {
428 fireSavingNodesFailed(nodeManager.getDirectory(), ioe1);
436 public boolean addNode(Node node) throws UnknownHostException {
437 return nodeManager.addNode(node);
443 public void removeNode(Node node) {
444 nodeManager.removeNode(node);
450 public void connectToNode(Node node) {
451 fireNodeConnecting(node);
452 nodeManager.connect(node);
458 public void disconnectFromNode(Node node) {
459 nodeManager.disconnect(node);
465 public void createProject() throws IOException, JSiteException {
466 Project newProject = projectManager.createProject();
467 fireProjectAdded(newProject);
473 public void cloneProject(Project project) {
474 Project projectClone = projectManager.cloneProject(project);
475 fireProjectCloned(project, projectClone);
481 public void removeProject(Project project) {
482 projectManager.removeProject(project);
483 fireProjectRemoved(project);
491 * Loads the configuration.
493 @SuppressWarnings("unused")
494 private void loadConfig() {
499 * Saves the configuration.
501 @SuppressWarnings("unused")
502 private void saveConfig() {
507 // INTERFACE NodeListener
513 public void nodeAdded(Node node) {
520 public void nodeRemoved(Node node) {
521 fireNodeRemoved(node);
527 public void nodeConnected(Node node) {
528 fireNodeConnected(node);
534 public void nodeConnectionFailed(Node node, Throwable cause) {
535 fireNodeConnectionFailed(node, cause);
541 public void nodeDisconnected(Node node, Throwable throwable) {
542 fireNodeDisconnected(node, throwable);
546 // INTERFACE RequestListener
552 public void requestAdded(Request request) {
553 /* TODO - find project and process request */
557 * @see net.pterodactylus.jsite.core.RequestListener#requestProgressed(Request)
559 public void requestProgressed(Request request) {
560 /* TODO - find project and process request */
564 * @see net.pterodactylus.jsite.core.RequestListener#requestRemoved(net.pterodactylus.jsite.core.Request)
566 public void requestRemoved(Request request) {
567 /* TODO - find project and process request */
571 * @see net.pterodactylus.jsite.core.RequestListener#requestGeneratedURI(net.pterodactylus.jsite.core.Request,
574 public void requestGeneratedURI(Request request, String uri) {
575 /* TODO - find project and process request */
579 * @see net.pterodactylus.jsite.core.RequestListener#requestFinished(net.pterodactylus.jsite.core.Request)
581 public void requestFinished(Request request) {
582 /* TODO - find project and process request */