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}