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