Call saveConfig() on stop().
[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                 saveConfig();
169                 try {
170                         projectManager.save();
171                         coreListenerSupport.fireSavingProjectsDone(projectManager.getDirectory());
172                 } catch (IOException ioe1) {
173                         coreListenerSupport.fireSavingProjectsFailed(projectManager.getDirectory(), ioe1);
174                 }
175                 try {
176                         nodeManager.save();
177                         coreListenerSupport.fireSavingNodesDone(nodeManager.getDirectory());
178                 } catch (IOException ioe1) {
179                         coreListenerSupport.fireSavingNodesFailed(nodeManager.getDirectory(), ioe1);
180                 }
181                 coreListenerSupport.fireCoreStopped();
182         }
183
184         /**
185          * {@inheritDoc}
186          */
187         public boolean addNode(Node node) throws UnknownHostException {
188                 logger.log(Level.FINEST, "addNode(node=" + node + ")");
189                 return nodeManager.addNode(node);
190         }
191
192         /**
193          * {@inheritDoc}
194          */
195         public void removeNode(Node node) {
196                 logger.log(Level.FINEST, "removeNode(node=" + node + ")");
197                 nodeManager.removeNode(node);
198         }
199
200         /**
201          * {@inheritDoc}
202          */
203         public void connectToNode(Node node) {
204                 logger.log(Level.FINEST, "connectToNode(node=" + node + ")");
205                 coreListenerSupport.fireNodeConnecting(node);
206                 nodeManager.connect(node);
207         }
208
209         /**
210          * {@inheritDoc}
211          */
212         public void disconnectFromNode(Node node) {
213                 logger.log(Level.FINEST, "disconnectFromNode(node=" + node + ")");
214                 nodeManager.disconnect(node);
215         }
216
217         /**
218          * {@inheritDoc}
219          */
220         public void createProject() throws IOException, JSiteException {
221                 logger.log(Level.FINEST, "createProject()");
222                 Project newProject = projectManager.createProject();
223                 coreListenerSupport.fireProjectAdded(newProject);
224         }
225
226         /**
227          * {@inheritDoc}
228          */
229         public void insertProject(Node node, Project project) {
230                 logger.log(Level.FINEST, "insertProject(node=" + node + ", project=" + project + ")");
231         }
232
233         /**
234          * {@inheritDoc}
235          */
236         public void cloneProject(Project project) {
237                 logger.log(Level.FINEST, "cloneProject(project=" + project + ")");
238                 Project projectClone = projectManager.cloneProject(project);
239                 coreListenerSupport.fireProjectCloned(project, projectClone);
240         }
241
242         /**
243          * {@inheritDoc}
244          */
245         public void removeProject(Project project) {
246                 logger.log(Level.FINEST, "removeProject(project=" + project + ")");
247                 projectManager.removeProject(project);
248                 coreListenerSupport.fireProjectRemoved(project);
249         }
250
251         //
252         // PRIVATE METHODS
253         //
254
255         /**
256          * Loads the configuration.
257          */
258         private void loadConfig() {
259                 logger.log(Level.FINEST, "loadConfig()");
260                 /* TODO */
261         }
262
263         /**
264          * Saves the configuration.
265          */
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 }