001/** 002 * Copyright (C) 2014 Universidade de Aveiro, DETI/IEETA, Bioinformatics Group - http://bioinformatics.ua.pt/ 003 * 004 * This file is part of Dicoogle/dicoogle. 005 * 006 * Dicoogle/dicoogle is free software: you can redistribute it and/or modify 007 * it under the terms of the GNU General Public License as published by 008 * the Free Software Foundation, either version 3 of the License, or 009 * (at your option) any later version. 010 * 011 * Dicoogle/dicoogle is distributed in the hope that it will be useful, 012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 014 * GNU General Public License for more details. 015 * 016 * You should have received a copy of the GNU General Public License 017 * along with Dicoogle. If not, see <http://www.gnu.org/licenses/>. 018 */ 019package pt.ua.dicoogle.server; 020 021import java.io.File; 022import java.io.IOException; 023import java.util.List; 024import org.slf4j.Logger; 025import pt.ua.dicoogle.server.queryretrieve.QueryRetrieve; 026 027import org.slf4j.LoggerFactory; 028import pt.ua.dicoogle.core.ServerSettings; 029import pt.ua.dicoogle.rGUI.interfaces.controllers.IServices; 030import pt.ua.dicoogle.rGUI.server.controllers.Logs; 031import pt.ua.dicoogle.server.web.DicoogleWeb; 032import pt.ua.dicoogle.taskManager.TaskManager; 033 034/** 035 * 036 * @author Samuel Campos <samuelcampos@ua.pt> 037 */ 038public class ControlServices implements IServices 039{ 040 private static final Logger logger = LoggerFactory.getLogger(ControlServices.class); 041 042 private static ControlServices instance = null; 043 // Services vars 044 private RSIStorage storage = null; 045 private boolean webServicesRunning = false; 046 private boolean webServerRunning = false; 047 private QueryRetrieve retrieve = null; 048 049 private DicoogleWeb webServices; 050 051 private ControlServices() 052 { 053 TaskManager taskManager = new TaskManager(Integer.parseInt(System.getProperty("dicoogle.taskManager.nThreads", "4"))); 054 055 startInicialServices(); 056 } 057 058 public static synchronized ControlServices getInstance() 059 { 060// sem.acquire(); 061 if (instance == null) 062 { 063 instance = new ControlServices(); 064 } 065// sem.release(); 066 return instance; 067 } 068 069 070 /* Strats the inicial services based on ServerSettings */ 071 private void startInicialServices() 072 { 073 ServerSettings settings = ServerSettings.getInstance(); 074 075 try 076 { 077 /* if (settings.isP2P()) 078 { 079 startP2P(); 080 }*/ 081 082 if (settings.isStorage()) 083 { 084 startStorage(); 085 } 086 087 if (settings.isQueryRetrive()) 088 { 089 startQueryRetrieve(); 090 } 091 092 if(settings.getWeb().isWebServer()){ 093 startWebServer(); 094 } 095 096 if (settings.getWeb().isWebServices()) 097 { 098 startWebServices(); 099 } 100 101 } catch (Exception ex) 102 { 103 logger.error(ex.getMessage(), ex); 104 } 105 } 106 107 /* Stop all services that are running */ 108 @Override 109 public boolean stopAllServices() 110 { 111 try 112 { 113 //TODO: DELETED 114 //PluginController.getInstance().stopAll(); 115 // stopP2P(); 116 stopStorage(); 117 stopQueryRetrieve(); 118 stopWebServices(); 119 } catch (Exception ex) 120 { 121 logger.error(ex.getMessage(), ex); 122 return false; 123 } 124 125 return true; 126 } 127 128 /** 129 * 130 * @return 0 - if everything is fine and the service was started 131 * -1 - if the server's storage path is not defined 132 * -2 - service is already running 133 * 134 * @throws IOException 135 */ 136 @Override 137 public int startStorage() throws IOException 138 { 139 if (storage == null) 140 { 141 ServerSettings settings = ServerSettings.getInstance(); 142 143 SOPList list = SOPList.getInstance(); 144 //list.setDefaultSettings(); 145 146 int i; 147 148 List l = list.getKeys(); 149 String[] keys = new String[l.size()]; 150 151 for (i = 0; i < l.size(); i++) 152 { 153 keys[i] = (String) l.get(i); 154 } 155 storage = new RSIStorage(keys, list); 156 storage.start(); 157 158 //DebugManager.getInstance().debug("Starting DICOM Storage SCP"); 159 Logs.getInstance().addServerLog("Starting DICOM Storage SCP"); 160 161 return 0; 162 } 163 164 return -2; 165 } 166 167 @Override 168 public void stopStorage() 169 { 170 if (storage != null) 171 { 172 storage.stop(); 173 storage = null; 174 //DebugManager.getInstance().debug("Stopping DICOM Storage SCP"); 175 Logs.getInstance().addServerLog("Stopping DICOM Storage SCP"); 176 } 177 } 178 179 @Override 180 public boolean storageIsRunning() 181 { 182 return storage != null; 183 } 184 185 @Override 186 public void startQueryRetrieve() 187 { 188 if (retrieve == null) 189 { 190 retrieve = new QueryRetrieve(); 191 retrieve.startListening(); 192 //DebugManager.getInstance().debug("Starting DICOM QueryRetrive"); 193 Logs.getInstance().addServerLog("Starting DICOM QueryRetrive"); 194 } 195 } 196 197 @Override 198 public void stopQueryRetrieve() 199 { 200 if (retrieve != null) 201 { 202 retrieve.stopListening(); 203 retrieve = null; 204 //DebugManager.getInstance().debug("Stopping DICOM QueryRetrive"); 205 Logs.getInstance().addServerLog("Stopping DICOM QueryRetrive"); 206 } 207 } 208 209 @Override 210 public boolean queryRetrieveIsRunning() 211 { 212 return retrieve != null; 213 } 214 215 @Override 216 public boolean webServerIsRunning() 217 { 218 return webServerRunning; 219 } 220 221 @Override 222 @Deprecated 223 public void startWebServices() 224 { 225 } 226 227 @Override 228 @Deprecated 229 public void stopWebServices() 230 { 231 } 232 233 @Override 234 public boolean webServicesIsRunning() 235 { 236 return webServicesRunning; 237 } 238 239 //TODO: Review those below! 240 @Override 241 public void startWebServer(){ 242 logger.info("Starting WebServer"); 243 244 try { 245 if (webServices == null) { 246 webServices = new DicoogleWeb(ServerSettings.getInstance().getWeb().getServerPort()); 247 webServerRunning = true; 248 webServicesRunning = true; 249 logger.info("Starting Dicoogle Web"); 250 } 251 } catch (Exception ex) { 252 logger.error("Failed to launch the web server", ex); 253 } 254 255 } 256 257 @Override 258 public void stopWebServer(){ 259 logger.info("Stopping Web Server"); 260 261 if(webServices != null){ 262 try { 263 webServicesRunning = false; 264 webServerRunning = false; 265 266 webServices.stop(); 267 268 webServices = null; 269 } catch (Exception ex) { 270 logger.error(ex.getMessage(), ex); 271 } 272 } 273 logger.info("Stopping Dicoogle Web"); 274 } 275 276 public DicoogleWeb getWebServicePlatform(){ 277 return webServices; 278 } 279 280}