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;
28 import java.util.logging.Level;
29 import java.util.logging.Logger;
31 import net.pterodactylus.util.logging.Logging;
36 * @author David ‘Bombe’ Roden <bombe@freenetproject.org>
38 public class CoreImpl implements Core, NodeListener, RequestListener {
41 private static final Logger logger = Logging.getLogger(CoreImpl.class.getName());
43 /** The core listeners. */
44 private final List<CoreListener> coreListeners = new ArrayList<CoreListener>();
47 private Executor threadPool = Executors.newCachedThreadPool();
49 /** The project manager. */
50 private ProjectManager projectManager;
52 /** The node manager. */
53 private NodeManager nodeManager;
55 /** The request manager. */
57 @SuppressWarnings("unused")
58 private RequestManager requestManager;
61 // LISTENER MANAGEMENT
67 public void addCoreListener(CoreListener coreListener) {
68 logger.log(Level.FINEST, "adding core listener: " + coreListener);
69 coreListeners.add(coreListener);
75 public void removeCoreListener(CoreListener coreListener) {
76 logger.log(Level.FINEST, "removing core listener: " + coreListener);
77 coreListeners.remove(coreListener);
81 * Notifies all listeners that the projects were loaded successfully.
84 * The directory the projects were loaded from
86 private void fireLoadingProjectsDone(String directory) {
87 logger.log(Level.FINEST, "firing loadingProjectsDone event with [directory=" + directory + "]");
88 for (CoreListener coreListener : coreListeners) {
89 coreListener.loadingProjectsDone(directory);
94 * Notifies all core listeners that loading the projects from the given
95 * directory has failed.
98 * The directory the projects were tried to load from
100 * The exception that occured when loading projects
102 private void fireLoadingProjectsFailed(String directory, Throwable throwable) {
103 logger.log(Level.FINEST, "firing loadingProjectsFailed event with [directory=" + directory + ",throwable=" + throwable + "]");
104 for (CoreListener coreListener : coreListeners) {
105 coreListener.loadingProjectsFailed(directory, throwable);
110 * Notifies all listeners that the projects were successfully saved.
113 * The directory the projects were saved to
115 private void fireSavingProjectsDone(String directory) {
116 logger.log(Level.FINEST, "firing savingProjectsDone event with [directory=" + directory + "]");
117 for (CoreListener coreListener : coreListeners) {
118 coreListener.savingProjectsDone(directory);
123 * Notifies all listeners that the projects could not be saved.
126 * The directory the projects were to be saved to
128 * The exception that occured when saving the projects
130 private void fireSavingProjectsFailed(String directory, Throwable throwable) {
131 logger.log(Level.FINEST, "firing savingProjectsFailed event with [directory=" + directory + ",throwable=" + throwable + "]");
132 for (CoreListener coreListener : coreListeners) {
133 coreListener.savingProjectsFailed(directory, throwable);
138 * Notifies all listeners that a project was added.
141 * The project that was added
143 private void fireProjectAdded(Project project) {
144 logger.log(Level.FINEST, "firing projectAdded event with [project=" + project + "]");
145 for (CoreListener coreListener : coreListeners) {
146 coreListener.projectAdded(project);
151 * Notifies all listeners that a project was cloned.
153 * @param clonedProject
154 * The project that was cloned
155 * @param projectClone
156 * The clone of the project
158 private void fireProjectCloned(Project clonedProject, Project projectClone) {
159 logger.log(Level.FINEST, "firing projectCloned event with [clonedProject=" + clonedProject + ",projectClone=" + projectClone + "]");
160 for (CoreListener coreListener : coreListeners) {
161 coreListener.projectCloned(clonedProject, projectClone);
166 * Notifies all listeners that a project was removed.
169 * The project that was removed
171 private void fireProjectRemoved(Project project) {
172 logger.log(Level.FINEST, "firing projectRemoved event with [project=" + project + "]");
173 for (CoreListener coreListener : coreListeners) {
174 coreListener.projectRemoved(project);
179 * Notifies all listeners that the nodes were successfully loaded.
182 * The directory the nodes were loaded from
184 private void fireLoadingNodesDone(String directory) {
185 logger.log(Level.FINEST, "firing loadingNodesDone event with [directory=" + directory + "]");
186 for (CoreListener coreListener : coreListeners) {
187 coreListener.loadingNodesDone(directory);
192 * Notifies all listeners that loading the nodes has failed.
195 * The directory the nodes were loaded from
197 * The exception that occured while loading the nodes
199 private void fireLoadingNodesFailed(String directory, Throwable throwable) {
200 logger.log(Level.FINEST, "firing loadingNodesFailed event with [directory=" + directory + ",throwable=" + throwable + "]");
201 for (CoreListener coreListener : coreListeners) {
202 coreListener.loadingNodesFailed(directory, throwable);
207 * Notifies all listeners that the nodes were saved successfully.
210 * The directory the nodes were saved to
212 private void fireSavingNodesDone(String directory) {
213 logger.log(Level.FINEST, "firing savingNodesDone event with [directory=" + directory + "]");
214 for (CoreListener coreListener : coreListeners) {
215 coreListener.savingNodesDone(directory);
220 * Notifies all listeners that saving the nodes has failed.
223 * The directory the nodes were saved to
225 * The exception that occured while saving the nodes
227 private void fireSavingNodesFailed(String directory, Throwable throwable) {
228 logger.log(Level.FINEST, "firing savingNodesFailed event with [directory=" + directory + ",throwable=" + throwable + "]");
229 for (CoreListener coreListener : coreListeners) {
230 coreListener.savingProjectsFailed(directory, throwable);
235 * Notifies all core listeners that the core has loaded and is ready to run.
237 private void fireCoreLoaded() {
238 logger.log(Level.FINEST, "firing coreLoaded event");
239 for (CoreListener coreListener : coreListeners) {
240 coreListener.coreLoaded();
245 * Notifies all listeners that the core was stopped.
247 private void fireCoreStopped() {
248 logger.log(Level.FINEST, "firing coreStopped event");
249 for (CoreListener coreListener : coreListeners) {
250 coreListener.coreStopped();
255 * Notifies all listeners that a node was added to the core.
258 * The node that was added
260 private void fireNodeAdded(Node node) {
261 logger.log(Level.FINEST, "firing nodeAdded event with [node=" + node + "]");
262 for (CoreListener coreListener : coreListeners) {
263 coreListener.nodeAdded(node);
268 * Notifies all listeners that a node was removed from the core.
271 * The node that was removed
273 private void fireNodeRemoved(Node node) {
274 logger.log(Level.FINEST, "firing nodeRemoved event with [node=" + node + "]");
275 for (CoreListener coreListener : coreListeners) {
276 coreListener.nodeRemoved(node);
281 * Notifies all listeners that a connection to the given node is now being
285 * The node that is being connected to
287 private void fireNodeConnecting(Node node) {
288 logger.log(Level.FINEST, "firing nodeConnecting event with [node=" + node + "]");
289 for (CoreListener coreListener : coreListeners) {
290 coreListener.nodeConnecting(node);
295 * Notifies all listeners that the given node is now connected.
298 * The node that is now connected
300 private void fireNodeConnected(Node node) {
301 logger.log(Level.FINEST, "firing nodeConnected event with [node=" + node + "]");
302 for (CoreListener coreListener : coreListeners) {
303 coreListener.nodeConnected(node);
308 * Notifies all listeners that a connection to a node has failed.
311 * The node that could not be connected
313 * The cause of the failure
315 private void fireNodeConnectionFailed(Node node, Throwable cause) {
316 logger.log(Level.FINEST, "firing nodeConnectionFailed event with [node=" + node + ",cause=" + cause + "]");
317 for (CoreListener coreListener : coreListeners) {
318 coreListener.nodeConnectionFailed(node, cause);
323 * Notifies all listeners that the given node was disconnected.
326 * The node that is now disconnected
328 * The exception that caused the disconnect, or <code>null</code>
329 * if there was no exception
331 private void fireNodeDisconnected(Node node, Throwable throwable) {
332 logger.log(Level.FINEST, "firing nodeDisconnected event with [node=" + node + ",throwable=" + throwable + "]");
333 for (CoreListener coreListener : coreListeners) {
334 coreListener.nodeDisconnected(node, throwable);
345 public Executor getThreadPool() {
350 * Returns the project manager.
352 * @return The project manager
354 public ProjectManager getProjectManager() {
355 return projectManager;
359 * Sets the project manager to use.
361 * @param projectManager
362 * The project manager to use
364 public void setProjectManager(ProjectManager projectManager) {
365 this.projectManager = projectManager;
369 * Returns the node manager.
371 * @return The node manager
373 public NodeManager getNodeManager() {
378 * Sets the node manager to use.
381 * The node manager to use
383 public void setNodeManager(NodeManager nodeManager) {
384 this.nodeManager = nodeManager;
388 * Sets the request manager to use.
390 * @param requestManager
391 * The request manager to use
393 public void setRequestManager(RequestManager requestManager) {
394 this.requestManager = requestManager;
400 public List<Node> getNodes() {
401 return nodeManager.getNodes();
407 public boolean isNodeConnected(Node node) {
408 return nodeManager.hasNode(node);
414 public List<Project> getProjects() {
415 return projectManager.getProjects();
425 public void start() {
426 logger.log(Level.INFO, "starting core…");
429 fireLoadingNodesDone(nodeManager.getDirectory());
430 } catch (IOException ioe1) {
431 fireLoadingNodesFailed(nodeManager.getDirectory(), ioe1);
434 projectManager.load();
435 fireLoadingProjectsDone(projectManager.getDirectory());
436 } catch (IOException ioe1) {
437 fireLoadingProjectsFailed(projectManager.getDirectory(), ioe1);
446 logger.log(Level.INFO, "stopping core…");
448 projectManager.save();
449 fireSavingProjectsDone(projectManager.getDirectory());
450 } catch (IOException ioe1) {
451 fireSavingProjectsFailed(projectManager.getDirectory(), ioe1);
455 fireSavingNodesDone(nodeManager.getDirectory());
456 } catch (IOException ioe1) {
457 fireSavingNodesFailed(nodeManager.getDirectory(), ioe1);
465 public boolean addNode(Node node) throws UnknownHostException {
466 logger.log(Level.FINEST, "addNode(node=" + node + ")");
467 return nodeManager.addNode(node);
473 public void removeNode(Node node) {
474 logger.log(Level.FINEST, "removeNode(node=" + node + ")");
475 nodeManager.removeNode(node);
481 public void connectToNode(Node node) {
482 logger.log(Level.FINEST, "connectToNode(node=" + node + ")");
483 fireNodeConnecting(node);
484 nodeManager.connect(node);
490 public void disconnectFromNode(Node node) {
491 logger.log(Level.FINEST, "disconnectFromNode(node=" + node + ")");
492 nodeManager.disconnect(node);
498 public void createProject() throws IOException, JSiteException {
499 logger.log(Level.FINEST, "createProject()");
500 Project newProject = projectManager.createProject();
501 fireProjectAdded(newProject);
507 public void cloneProject(Project project) {
508 logger.log(Level.FINEST, "cloneProject(project=" + project + ")");
509 Project projectClone = projectManager.cloneProject(project);
510 fireProjectCloned(project, projectClone);
516 public void removeProject(Project project) {
517 logger.log(Level.FINEST, "removeProject(project=" + project + ")");
518 projectManager.removeProject(project);
519 fireProjectRemoved(project);
527 * Loads the configuration.
529 @SuppressWarnings("unused")
530 private void loadConfig() {
531 logger.log(Level.FINEST, "loadConfig()");
536 * Saves the configuration.
538 @SuppressWarnings("unused")
539 private void saveConfig() {
540 logger.log(Level.FINEST, "saveConfig()");
545 // INTERFACE NodeListener
551 public void nodeAdded(Node node) {
558 public void nodeRemoved(Node node) {
559 fireNodeRemoved(node);
565 public void nodeConnected(Node node) {
566 fireNodeConnected(node);
572 public void nodeConnectionFailed(Node node, Throwable cause) {
573 fireNodeConnectionFailed(node, cause);
579 public void nodeDisconnected(Node node, Throwable throwable) {
580 fireNodeDisconnected(node, throwable);
584 // INTERFACE RequestListener
590 public void requestAdded(Request request) {
591 /* TODO - find project and process request */
595 * @see net.pterodactylus.jsite.core.RequestListener#requestProgressed(Request)
597 public void requestProgressed(Request request) {
598 /* TODO - find project and process request */
602 * @see net.pterodactylus.jsite.core.RequestListener#requestRemoved(net.pterodactylus.jsite.core.Request)
604 public void requestRemoved(Request request) {
605 /* TODO - find project and process request */
609 * @see net.pterodactylus.jsite.core.RequestListener#requestGeneratedURI(net.pterodactylus.jsite.core.Request,
612 public void requestGeneratedURI(Request request, String uri) {
613 /* TODO - find project and process request */
617 * @see net.pterodactylus.jsite.core.RequestListener#requestFinished(net.pterodactylus.jsite.core.Request)
619 public void requestFinished(Request request) {
620 /* TODO - find project and process request */