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;
30 * @author David ‘Bombe’ Roden <bombe@freenetproject.org>
33 public class CoreImpl implements Core, NodeListener, RequestListener {
35 /** The core listeners. */
36 private final List<CoreListener> coreListeners = new ArrayList<CoreListener>();
38 /** The project manager. */
39 private ProjectManager projectManager;
41 /** The node manager. */
42 private NodeManager nodeManager;
44 /** The request manager. */
46 @SuppressWarnings("unused")
47 private RequestManager requestManager;
50 // LISTENER MANAGEMENT
56 public void addCoreListener(CoreListener coreListener) {
57 coreListeners.add(coreListener);
63 public void removeCoreListener(CoreListener coreListener) {
64 coreListeners.remove(coreListener);
68 * Notifies all listeners that the projects were loaded successfully.
71 * The directory the projects were loaded from
73 private void fireLoadingProjectsDone(String directory) {
74 for (CoreListener coreListener: coreListeners) {
75 coreListener.loadingProjectsDone(directory);
80 * Notifies all core listeners that loading the projects from the given
81 * directory has failed.
84 * The directory the projects were tried to load from
86 * The exception that occured when loading projects
88 private void fireLoadingProjectsFailed(String directory, Throwable throwable) {
89 for (CoreListener coreListener: coreListeners) {
90 coreListener.loadingProjectsFailed(directory, throwable);
95 * Notifies all listeners that the projects were successfully saved.
98 * The directory the projects were saved to
100 private void fireSavingProjectsDone(String directory) {
101 for (CoreListener coreListener: coreListeners) {
102 coreListener.savingProjectsDone(directory);
107 * Notifies all listeners that the projects could not be saved.
110 * The directory the projects were to be saved to
112 * The exception that occured when saving the projects
114 private void fireSavingProjectsFailed(String directory, Throwable throwable) {
115 for (CoreListener coreListener: coreListeners) {
116 coreListener.savingProjectsFailed(directory, throwable);
121 * Notifies all listeners that the nodes were successfully loaded.
124 * The directory the nodes were loaded from
126 private void fireLoadingNodesDone(String directory) {
127 for (CoreListener coreListener: coreListeners) {
128 coreListener.loadingNodesDone(directory);
133 * Notifies all listeners that loading the nodes has failed.
136 * The directory the nodes were loaded from
138 * The exception that occured while loading the nodes
140 private void fireLoadingNodesFailed(String directory, Throwable throwable) {
141 for (CoreListener coreListener: coreListeners) {
142 coreListener.loadingNodesFailed(directory, throwable);
147 * Notifies all listeners that the nodes were saved successfully.
150 * The directory the nodes were saved to
152 private void fireSavingNodesDone(String directory) {
153 for (CoreListener coreListener: coreListeners) {
154 coreListener.savingNodesDone(directory);
159 * Notifies all listeners that saving the nodes has failed.
162 * The directory the nodes were saved to
164 * The exception that occured while saving the nodes
166 private void fireSavingNodesFailed(String directory, Throwable throwable) {
167 for (CoreListener coreListener: coreListeners) {
168 coreListener.savingProjectsFailed(directory, throwable);
173 * Notifies all core listeners that the core has loaded and is ready to run.
175 private void fireCoreLoaded() {
176 for (CoreListener coreListener: coreListeners) {
177 coreListener.coreLoaded();
182 * Notifies all listeners that the core was stopped.
184 private void fireCoreStopped() {
185 for (CoreListener coreListener: coreListeners) {
186 coreListener.coreStopped();
191 * Notifies all listeners that a node was added to the core.
194 * The node that was added
196 private void fireNodeAdded(Node node) {
197 for (CoreListener coreListener: coreListeners) {
198 coreListener.nodeAdded(node);
203 * Notifies all listeners that a node was removed from the core.
206 * The node that was removed
208 private void fireNodeRemoved(Node node) {
209 for (CoreListener coreListener: coreListeners) {
210 coreListener.nodeRemoved(node);
215 * Notifies all listeners that a connection to the given node is now being
219 * The node that is being connected to
221 private void fireNodeConnecting(Node node) {
222 for (CoreListener coreListener: coreListeners) {
223 coreListener.nodeConnecting(node);
228 * Notifies all listeners that the given node is now connected.
231 * The node that is now connected
233 private void fireNodeConnected(Node node) {
234 for (CoreListener coreListener: coreListeners) {
235 coreListener.nodeConnected(node);
240 * Notifies all listeners that the given node was disconnected.
243 * The node that is now disconnected
245 * The exception that caused the disconnect, or <code>null</code>
246 * if there was no exception
248 private void fireNodeDisconnected(Node node, Throwable throwable) {
249 for (CoreListener coreListener: coreListeners) {
250 coreListener.nodeDisconnected(node, throwable);
255 * Notifies all listeners that a request was added to a node.
258 * The node the request was added to
260 * The request that was added
262 private void fireRequestAdded(Node node, Request request) {
263 for (CoreListener coreListener: coreListeners) {
264 coreListener.requestAdded(node, request);
269 * Notifies all listeners that a request progressed.
272 * The node that runs the request
276 * The total number of blocks
277 * @param requiredBlocks
278 * The number of required blocks
279 * @param successfulBlocks
280 * The number of successful blocks
281 * @param failedBlocks
282 * The number of failed blocks
283 * @param fatallyFailedBlocks
284 * The number of fatally failed blocks
285 * @param finalizedTotal
286 * <code>true</code> if the total number of blocks in final,
287 * <code>false</code> otherwise
289 private void fireRequestProgressed(Node node, Request request, int totalBlocks, int requiredBlocks, int successfulBlocks, int failedBlocks, int fatallyFailedBlocks, boolean finalizedTotal) {
290 for (CoreListener coreListener: coreListeners) {
291 coreListener.requestProgressed(request, totalBlocks, requiredBlocks, successfulBlocks, failedBlocks, fatallyFailedBlocks, finalizedTotal);
300 * Returns the project manager.
302 * @return The project manager
304 public ProjectManager getProjectManager() {
305 return projectManager;
309 * Sets the project manager to use.
311 * @param projectManager
312 * The project manager to use
314 public void setProjectManager(ProjectManager projectManager) {
315 this.projectManager = projectManager;
319 * Returns the node manager.
321 * @return The node manager
323 public NodeManager getNodeManager() {
328 * Sets the node manager to use.
331 * The node manager to use
333 public void setNodeManager(NodeManager nodeManager) {
334 this.nodeManager = nodeManager;
338 * Sets the request manager to use.
340 * @param requestManager
341 * The request manager to use
343 public void setRequestManager(RequestManager requestManager) {
344 this.requestManager = requestManager;
350 public List<Node> getNodes() {
351 return nodeManager.getNodes();
357 public boolean isNodeConnected(Node node) {
358 return nodeManager.hasNode(node);
368 public void start() {
370 projectManager.load();
371 fireLoadingProjectsDone(projectManager.getDirectory());
372 } catch (IOException ioe1) {
373 fireLoadingProjectsFailed(projectManager.getDirectory(), ioe1);
377 fireLoadingNodesDone(nodeManager.getDirectory());
378 } catch (IOException ioe1) {
379 fireLoadingNodesFailed(nodeManager.getDirectory(), ioe1);
389 projectManager.save();
390 fireSavingProjectsDone(projectManager.getDirectory());
391 } catch (IOException ioe1) {
392 fireSavingProjectsFailed(projectManager.getDirectory(), ioe1);
396 fireSavingNodesDone(nodeManager.getDirectory());
397 } catch (IOException ioe1) {
398 fireSavingNodesFailed(nodeManager.getDirectory(), ioe1);
406 public void addNode(Node node) throws UnknownHostException {
407 nodeManager.addNode(node);
414 public void removeNode(Node node) {
415 nodeManager.removeNode(node);
416 fireNodeRemoved(node);
422 public void connectToNode(Node node) {
423 fireNodeConnecting(node);
424 nodeManager.connect(node);
430 public void disconnectFromNode(Node node) {
431 nodeManager.disconnect(node);
439 * Loads the configuration.
441 @SuppressWarnings("unused")
442 private void loadConfig() {
447 * Saves the configuration.
449 @SuppressWarnings("unused")
450 private void saveConfig() {
455 // INTERFACE NodeListener
461 public void nodeAdded(Node node) {
468 public void nodeRemoved(Node node) {
469 fireNodeRemoved(node);
475 public void nodeConnected(Node node) {
476 fireNodeConnected(node);
482 public void nodeDisconnected(Node node, Throwable throwable) {
483 fireNodeDisconnected(node, throwable);
487 // INTERFACE RequestListener
493 public void requestAdded(Node node, Request request) {
494 fireRequestAdded(node, request);
498 * @see net.pterodactylus.jsite.core.RequestListener#requestProgressed(net.pterodactylus.jsite.core.Node,
499 * net.pterodactylus.jsite.core.Request, int, int, int, int, int,
502 public void requestProgressed(Node node, Request request, int totalBlocks, int requiredBlocks, int successfulBlocks, int failedBlocks, int fatallyFailedBlocks, boolean finalizedTotal) {
503 fireRequestProgressed(node, request, totalBlocks, requiredBlocks, successfulBlocks, failedBlocks, fatallyFailedBlocks, finalizedTotal);