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;
29 import net.pterodactylus.jsite.project.Project;
30 import net.pterodactylus.jsite.project.ProjectManager;
35 * @author David ‘Bombe’ Roden <bombe@freenetproject.org>
37 public class CoreImpl implements Core, NodeListener, RequestListener {
39 /** The core listeners. */
40 private final List<CoreListener> coreListeners = new ArrayList<CoreListener>();
43 private Executor threadPool = Executors.newCachedThreadPool();
45 /** The project manager. */
46 private ProjectManager projectManager;
48 /** The node manager. */
49 private NodeManager nodeManager;
51 /** The request manager. */
53 @SuppressWarnings("unused")
54 private RequestManager requestManager;
57 // LISTENER MANAGEMENT
63 public void addCoreListener(CoreListener coreListener) {
64 coreListeners.add(coreListener);
70 public void removeCoreListener(CoreListener coreListener) {
71 coreListeners.remove(coreListener);
75 * Notifies all listeners that the projects were loaded successfully.
78 * The directory the projects were loaded from
80 private void fireLoadingProjectsDone(String directory) {
81 for (CoreListener coreListener : coreListeners) {
82 coreListener.loadingProjectsDone(directory);
87 * Notifies all core listeners that loading the projects from the given
88 * directory has failed.
91 * The directory the projects were tried to load from
93 * The exception that occured when loading projects
95 private void fireLoadingProjectsFailed(String directory, Throwable throwable) {
96 for (CoreListener coreListener : coreListeners) {
97 coreListener.loadingProjectsFailed(directory, throwable);
102 * Notifies all listeners that the projects were successfully saved.
105 * The directory the projects were saved to
107 private void fireSavingProjectsDone(String directory) {
108 for (CoreListener coreListener : coreListeners) {
109 coreListener.savingProjectsDone(directory);
114 * Notifies all listeners that the projects could not be saved.
117 * The directory the projects were to be saved to
119 * The exception that occured when saving the projects
121 private void fireSavingProjectsFailed(String directory, Throwable throwable) {
122 for (CoreListener coreListener : coreListeners) {
123 coreListener.savingProjectsFailed(directory, throwable);
128 * Notifies all listeners that a project was added.
131 * The project that was added
133 private void fireProjectAdded(Project project) {
134 for (CoreListener coreListener : coreListeners) {
135 coreListener.projectAdded(project);
140 * Notifies all listeners that a project was cloned.
142 * @param clonedProject
143 * The project that was cloned
144 * @param projectClone
145 * The clone of the project
147 private void fireProjectCloned(Project clonedProject, Project projectClone) {
148 for (CoreListener coreListener : coreListeners) {
149 coreListener.projectCloned(clonedProject, projectClone);
154 * Notifies all listeners that a project was removed.
157 * The project that was removed
159 private void fireProjectRemoved(Project project) {
160 for (CoreListener coreListener : coreListeners) {
161 coreListener.projectRemoved(project);
166 * Notifies all listeners that the nodes were successfully loaded.
169 * The directory the nodes were loaded from
171 private void fireLoadingNodesDone(String directory) {
172 for (CoreListener coreListener : coreListeners) {
173 coreListener.loadingNodesDone(directory);
178 * Notifies all listeners that loading the nodes has failed.
181 * The directory the nodes were loaded from
183 * The exception that occured while loading the nodes
185 private void fireLoadingNodesFailed(String directory, Throwable throwable) {
186 for (CoreListener coreListener : coreListeners) {
187 coreListener.loadingNodesFailed(directory, throwable);
192 * Notifies all listeners that the nodes were saved successfully.
195 * The directory the nodes were saved to
197 private void fireSavingNodesDone(String directory) {
198 for (CoreListener coreListener : coreListeners) {
199 coreListener.savingNodesDone(directory);
204 * Notifies all listeners that saving the nodes has failed.
207 * The directory the nodes were saved to
209 * The exception that occured while saving the nodes
211 private void fireSavingNodesFailed(String directory, Throwable throwable) {
212 for (CoreListener coreListener : coreListeners) {
213 coreListener.savingProjectsFailed(directory, throwable);
218 * Notifies all core listeners that the core has loaded and is ready to run.
220 private void fireCoreLoaded() {
221 for (CoreListener coreListener : coreListeners) {
222 coreListener.coreLoaded();
227 * Notifies all listeners that the core was stopped.
229 private void fireCoreStopped() {
230 for (CoreListener coreListener : coreListeners) {
231 coreListener.coreStopped();
236 * Notifies all listeners that a node was added to the core.
239 * The node that was added
241 private void fireNodeAdded(Node node) {
242 for (CoreListener coreListener : coreListeners) {
243 coreListener.nodeAdded(node);
248 * Notifies all listeners that a node was removed from the core.
251 * The node that was removed
253 private void fireNodeRemoved(Node node) {
254 for (CoreListener coreListener : coreListeners) {
255 coreListener.nodeRemoved(node);
260 * Notifies all listeners that a connection to the given node is now being
264 * The node that is being connected to
266 private void fireNodeConnecting(Node node) {
267 for (CoreListener coreListener : coreListeners) {
268 coreListener.nodeConnecting(node);
273 * Notifies all listeners that the given node is now connected.
276 * The node that is now connected
278 private void fireNodeConnected(Node node) {
279 for (CoreListener coreListener : coreListeners) {
280 coreListener.nodeConnected(node);
285 * Notifies all listeners that a connection to a node has failed.
288 * The node that could not be connected
290 * The cause of the failure
292 private void fireNodeConnectionFailed(Node node, Throwable cause) {
293 for (CoreListener coreListener : coreListeners) {
294 coreListener.nodeConnectionFailed(node, cause);
299 * Notifies all listeners that the given node was disconnected.
302 * The node that is now disconnected
304 * The exception that caused the disconnect, or <code>null</code>
305 * if there was no exception
307 private void fireNodeDisconnected(Node node, Throwable throwable) {
308 for (CoreListener coreListener : coreListeners) {
309 coreListener.nodeDisconnected(node, throwable);
320 public Executor getThreadPool() {
325 * Returns the project manager.
327 * @return The project manager
329 public ProjectManager getProjectManager() {
330 return projectManager;
334 * Sets the project manager to use.
336 * @param projectManager
337 * The project manager to use
339 public void setProjectManager(ProjectManager projectManager) {
340 this.projectManager = projectManager;
344 * Returns the node manager.
346 * @return The node manager
348 public NodeManager getNodeManager() {
353 * Sets the node manager to use.
356 * The node manager to use
358 public void setNodeManager(NodeManager nodeManager) {
359 this.nodeManager = nodeManager;
363 * Sets the request manager to use.
365 * @param requestManager
366 * The request manager to use
368 public void setRequestManager(RequestManager requestManager) {
369 this.requestManager = requestManager;
375 public List<Node> getNodes() {
376 return nodeManager.getNodes();
382 public boolean isNodeConnected(Node node) {
383 return nodeManager.hasNode(node);
389 public List<Project> getProjects() {
390 return projectManager.getProjects();
400 public void start() {
402 projectManager.load();
403 fireLoadingProjectsDone(projectManager.getDirectory());
404 } catch (IOException ioe1) {
405 fireLoadingProjectsFailed(projectManager.getDirectory(), ioe1);
409 fireLoadingNodesDone(nodeManager.getDirectory());
410 } catch (IOException ioe1) {
411 fireLoadingNodesFailed(nodeManager.getDirectory(), ioe1);
421 projectManager.save();
422 fireSavingProjectsDone(projectManager.getDirectory());
423 } catch (IOException ioe1) {
424 fireSavingProjectsFailed(projectManager.getDirectory(), ioe1);
428 fireSavingNodesDone(nodeManager.getDirectory());
429 } catch (IOException ioe1) {
430 fireSavingNodesFailed(nodeManager.getDirectory(), ioe1);
438 public boolean addNode(Node node) throws UnknownHostException {
439 return nodeManager.addNode(node);
445 public void removeNode(Node node) {
446 nodeManager.removeNode(node);
452 public void connectToNode(Node node) {
453 fireNodeConnecting(node);
454 nodeManager.connect(node);
460 public void disconnectFromNode(Node node) {
461 nodeManager.disconnect(node);
467 public void createProject() throws IOException, JSiteException {
468 Project newProject = projectManager.createProject();
469 fireProjectAdded(newProject);
475 public void cloneProject(Project project) {
476 Project projectClone = projectManager.cloneProject(project);
477 fireProjectCloned(project, projectClone);
483 public void removeProject(Project project) {
484 projectManager.removeProject(project);
485 fireProjectRemoved(project);
493 * Loads the configuration.
495 @SuppressWarnings("unused")
496 private void loadConfig() {
501 * Saves the configuration.
503 @SuppressWarnings("unused")
504 private void saveConfig() {
509 // INTERFACE NodeListener
515 public void nodeAdded(Node node) {
522 public void nodeRemoved(Node node) {
523 fireNodeRemoved(node);
529 public void nodeConnected(Node node) {
530 fireNodeConnected(node);
536 public void nodeConnectionFailed(Node node, Throwable cause) {
537 fireNodeConnectionFailed(node, cause);
543 public void nodeDisconnected(Node node, Throwable throwable) {
544 fireNodeDisconnected(node, throwable);
548 // INTERFACE RequestListener
554 public void requestAdded(Request request) {
555 /* TODO - find project and process request */
559 * @see net.pterodactylus.jsite.core.RequestListener#requestProgressed(Request)
561 public void requestProgressed(Request request) {
562 /* TODO - find project and process request */
566 * @see net.pterodactylus.jsite.core.RequestListener#requestRemoved(net.pterodactylus.jsite.core.Request)
568 public void requestRemoved(Request request) {
569 /* TODO - find project and process request */
573 * @see net.pterodactylus.jsite.core.RequestListener#requestGeneratedURI(net.pterodactylus.jsite.core.Request,
576 public void requestGeneratedURI(Request request, String uri) {
577 /* TODO - find project and process request */
581 * @see net.pterodactylus.jsite.core.RequestListener#requestFinished(net.pterodactylus.jsite.core.Request)
583 public void requestFinished(Request request) {
584 /* TODO - find project and process request */