Call loadConfig() on start().
[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 {
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         @SuppressWarnings("unused")
47         private Executor threadPool = Executors.newCachedThreadPool();
48
49         /** The project manager. */
50         private ProjectManager projectManager;
51
52         /** The node manager. */
53         private NodeManager nodeManager;
54
55         //
56         // LISTENER MANAGEMENT
57         //
58
59         /**
60          * {@inheritDoc}
61          */
62         public void addCoreListener(CoreListener coreListener) {
63                 logger.log(Level.FINEST, "adding core listener: " + coreListener);
64                 coreListenerSupport.addListener(coreListener);
65         }
66
67         /**
68          * {@inheritDoc}
69          */
70         public void removeCoreListener(CoreListener coreListener) {
71                 logger.log(Level.FINEST, "removing core listener: " + coreListener);
72                 coreListenerSupport.removeListener(coreListener);
73         }
74
75         //
76         // ACCESSORS
77         //
78
79         /**
80          * Returns the project manager.
81          *
82          * @return The project manager
83          */
84         public ProjectManager getProjectManager() {
85                 return projectManager;
86         }
87
88         /**
89          * Sets the project manager to use.
90          *
91          * @param projectManager
92          *            The project manager to use
93          */
94         public void setProjectManager(ProjectManager projectManager) {
95                 this.projectManager = projectManager;
96         }
97
98         /**
99          * Returns the node manager.
100          *
101          * @return The node manager
102          */
103         public NodeManager getNodeManager() {
104                 return nodeManager;
105         }
106
107         /**
108          * Sets the node manager to use.
109          *
110          * @param nodeManager
111          *            The node manager to use
112          */
113         public void setNodeManager(NodeManager nodeManager) {
114                 this.nodeManager = nodeManager;
115         }
116
117         /**
118          * {@inheritDoc}
119          */
120         public List<Node> getNodes() {
121                 return nodeManager.getNodes();
122         }
123
124         /**
125          * {@inheritDoc}
126          */
127         public boolean isNodeConnected(Node node) {
128                 return nodeManager.isNodeConnected(node);
129         }
130
131         /**
132          * {@inheritDoc}
133          */
134         public List<Project> getProjects() {
135                 return projectManager.getProjects();
136         }
137
138         //
139         // ACTIONS
140         //
141
142         /**
143          * {@inheritDoc}
144          */
145         public void start() {
146                 logger.log(Level.INFO, "starting core…");
147                 loadConfig();
148                 try {
149                         nodeManager.load();
150                         coreListenerSupport.fireLoadingNodesDone(nodeManager.getDirectory());
151                 } catch (IOException ioe1) {
152                         coreListenerSupport.fireLoadingNodesFailed(nodeManager.getDirectory(), ioe1);
153                 }
154                 try {
155                         projectManager.load();
156                         coreListenerSupport.fireLoadingProjectsDone(projectManager.getDirectory());
157                 } catch (IOException ioe1) {
158                         coreListenerSupport.fireLoadingProjectsFailed(projectManager.getDirectory(), ioe1);
159                 }
160                 coreListenerSupport.fireCoreLoaded();
161         }
162
163         /**
164          * {@inheritDoc}
165          */
166         public void stop() {
167                 logger.log(Level.INFO, "stopping core…");
168                 try {
169                         projectManager.save();
170                         coreListenerSupport.fireSavingProjectsDone(projectManager.getDirectory());
171                 } catch (IOException ioe1) {
172                         coreListenerSupport.fireSavingProjectsFailed(projectManager.getDirectory(), ioe1);
173                 }
174                 try {
175                         nodeManager.save();
176                         coreListenerSupport.fireSavingNodesDone(nodeManager.getDirectory());
177                 } catch (IOException ioe1) {
178                         coreListenerSupport.fireSavingNodesFailed(nodeManager.getDirectory(), ioe1);
179                 }
180                 coreListenerSupport.fireCoreStopped();
181         }
182
183         /**
184          * {@inheritDoc}
185          */
186         public boolean addNode(Node node) throws UnknownHostException {
187                 logger.log(Level.FINEST, "addNode(node=" + node + ")");
188                 return nodeManager.addNode(node);
189         }
190
191         /**
192          * {@inheritDoc}
193          */
194         public void removeNode(Node node) {
195                 logger.log(Level.FINEST, "removeNode(node=" + node + ")");
196                 nodeManager.removeNode(node);
197         }
198
199         /**
200          * {@inheritDoc}
201          */
202         public void connectToNode(Node node) {
203                 logger.log(Level.FINEST, "connectToNode(node=" + node + ")");
204                 coreListenerSupport.fireNodeConnecting(node);
205                 nodeManager.connect(node);
206         }
207
208         /**
209          * {@inheritDoc}
210          */
211         public void disconnectFromNode(Node node) {
212                 logger.log(Level.FINEST, "disconnectFromNode(node=" + node + ")");
213                 nodeManager.disconnect(node);
214         }
215
216         /**
217          * {@inheritDoc}
218          */
219         public void createProject() throws IOException, JSiteException {
220                 logger.log(Level.FINEST, "createProject()");
221                 Project newProject = projectManager.createProject();
222                 coreListenerSupport.fireProjectAdded(newProject);
223         }
224
225         /**
226          * {@inheritDoc}
227          */
228         public void insertProject(Node node, Project project) {
229                 logger.log(Level.FINEST, "insertProject(node=" + node + ", project=" + project + ")");
230         }
231
232         /**
233          * {@inheritDoc}
234          */
235         public void cloneProject(Project project) {
236                 logger.log(Level.FINEST, "cloneProject(project=" + project + ")");
237                 Project projectClone = projectManager.cloneProject(project);
238                 coreListenerSupport.fireProjectCloned(project, projectClone);
239         }
240
241         /**
242          * {@inheritDoc}
243          */
244         public void removeProject(Project project) {
245                 logger.log(Level.FINEST, "removeProject(project=" + project + ")");
246                 projectManager.removeProject(project);
247                 coreListenerSupport.fireProjectRemoved(project);
248         }
249
250         //
251         // PRIVATE METHODS
252         //
253
254         /**
255          * Loads the configuration.
256          */
257         private void loadConfig() {
258                 logger.log(Level.FINEST, "loadConfig()");
259                 /* TODO */
260         }
261
262         /**
263          * Saves the configuration.
264          */
265         @SuppressWarnings("unused")
266         private void saveConfig() {
267                 logger.log(Level.FINEST, "saveConfig()");
268                 /* TODO */
269         }
270
271         //
272         // INTERFACE NodeListener
273         //
274
275         /**
276          * {@inheritDoc}
277          */
278         public void nodeAdded(Node node) {
279                 coreListenerSupport.fireNodeAdded(node);
280         }
281
282         /**
283          * {@inheritDoc}
284          */
285         public void nodeRemoved(Node node) {
286                 coreListenerSupport.fireNodeRemoved(node);
287         }
288
289         /**
290          * {@inheritDoc}
291          */
292         public void nodeConnected(Node node) {
293                 coreListenerSupport.fireNodeConnected(node);
294         }
295
296         /**
297          * {@inheritDoc}
298          */
299         public void nodeConnectionFailed(Node node, Throwable cause) {
300                 coreListenerSupport.fireNodeConnectionFailed(node, cause);
301         }
302
303         /**
304          * {@inheritDoc}
305          */
306         public void nodeDisconnected(Node node, Throwable throwable) {
307                 coreListenerSupport.fireNodeDisconnected(node, throwable);
308         }
309
310 }