Refactoring: rename duplicated Util classes
[jabaws.git] / webservices / compbio / ws / server / MainManager.java
1 /* Copyright (c) 2011 Peter Troshin\r
2  *  \r
3  *  JAva Bioinformatics Analysis Web Services (JABAWS) @version: 2.0     \r
4  * \r
5  *  This library is free software; you can redistribute it and/or modify it under the terms of the\r
6  *  Apache License version 2 as published by the Apache Software Foundation\r
7  * \r
8  *  This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without\r
9  *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Apache \r
10  *  License for more details.\r
11  * \r
12  *  A copy of the license is in apache_license.txt. It is also available here:\r
13  * @see: http://www.apache.org/licenses/LICENSE-2.0.txt\r
14  * \r
15  * Any republication or derived work distributed in source code form\r
16  * must include this copyright and license notice.\r
17  */\r
18 package compbio.ws.server;\r
19 \r
20 import java.util.concurrent.Executors;\r
21 import java.util.concurrent.ScheduledExecutorService;\r
22 import java.util.concurrent.ScheduledFuture;\r
23 import java.util.concurrent.TimeUnit;\r
24 \r
25 import javax.servlet.ServletContextEvent;\r
26 import javax.servlet.ServletContextListener;\r
27 \r
28 import org.apache.log4j.Logger;\r
29 \r
30 import compbio.stat.collector.DirCleaner;\r
31 import compbio.stat.collector.StatDB;\r
32 import compbio.engine.conf.PropertyHelperManager;\r
33 import compbio.engine.local.ExecutableWrapper;\r
34 import compbio.engine.local.LocalExecutorService;\r
35 import compbio.engine.client.EngineUtil;\r
36 import compbio.util.PropertyHelper;\r
37 \r
38 /**\r
39  * Two tasks:\r
40  * 1. Switch off engines if JABAWS web application is un-deployed, or web server is shutdown\r
41  * 2. delete old job directories\r
42  * \r
43  * @author Peter Troshin\r
44  * @author Alexander Sherstnev\r
45  * @version 2.0\r
46  */\r
47 public class MainManager implements ServletContextListener {\r
48 \r
49         private final Logger log = Logger.getLogger(MainManager.class);\r
50         static PropertyHelper ph = PropertyHelperManager.getPropertyHelper();\r
51         \r
52         private ScheduledFuture<?> localcl;\r
53         private ScheduledFuture<?> clustercl;\r
54         private ScheduledExecutorService executor;\r
55         \r
56         @Override\r
57         public void contextDestroyed(ServletContextEvent ignored) {\r
58                 // stop cleaning job directories\r
59                 try {\r
60                         if (null != localcl) {\r
61                                 localcl.cancel(true);\r
62                         }\r
63                         if (null != clustercl) {\r
64                                 clustercl.cancel(true);\r
65                         }\r
66                         executor.shutdown();\r
67                         executor.awaitTermination(3, TimeUnit.SECONDS);\r
68                 } catch (InterruptedException e) {\r
69                         log.warn(e.getMessage(), e);\r
70                 }\r
71 \r
72                         // Shutdown local and cluster engines\r
73                         log.info("JABAWS context is destroyed. Shutting down engines...");\r
74                         LocalExecutorService.shutDown();\r
75                         log.info("Local engine is shutdown OK");\r
76                         ExecutableWrapper.shutdownService();\r
77                         log.info("Individual executables stream engine is shutdown OK");\r
78                         StatDB.shutdownDBServer();\r
79         }\r
80 \r
81         @Override\r
82         public void contextInitialized(ServletContextEvent arg0) {\r
83                 log.info("Initializing directory cleaners");\r
84                 executor = Executors.newScheduledThreadPool(2);\r
85 \r
86                 // configure cluster cleaner\r
87                 String clusterWorkDir = getClusterJobDir();\r
88                 int clusterDirLifespan = PropertyHelperManager.getIntProperty(ph.getProperty("cluster.jobdir.maxlifespan"));\r
89                 int clusterCleaningRate = PropertyHelperManager.getIntProperty(ph.getProperty("cluster.jobdir.cleaning.frequency"));\r
90                 boolean cleanClasterDir = PropertyHelperManager.getBooleanProperty(ph.getProperty("cluster.stat.collector.enable"));\r
91                 \r
92                 if (0 < clusterDirLifespan && cleanClasterDir) {\r
93                         DirCleaner clusterDirCleaner = new DirCleaner(clusterWorkDir, clusterDirLifespan);\r
94                         clustercl = executor.scheduleAtFixedRate(clusterDirCleaner, 1, clusterCleaningRate, TimeUnit.MINUTES);\r
95                         log.info("Cleaning local job directory every " + clusterCleaningRate + " minutes");\r
96                 } else {\r
97                         log.info("Cluster job directory cleaner is disabled. ");\r
98                 }\r
99 \r
100                 // configure local cleaner\r
101                 String localWorkDir = EngineUtil.convertToAbsolute(getLocalJobDir());\r
102                 int localDirLiveSpan = PropertyHelperManager.getIntProperty(ph.getProperty("local.jobdir.maxlifespan"));\r
103                 int localCleaningRate = PropertyHelperManager.getIntProperty(ph.getProperty("local.jobdir.cleaning.frequency"));\r
104                 boolean cleanLocalDir = PropertyHelperManager.getBooleanProperty(ph.getProperty("local.stat.collector.enable"));\r
105 \r
106                 if (0 < localDirLiveSpan && cleanLocalDir) {\r
107                         DirCleaner localDirCleaner = new DirCleaner(localWorkDir, localDirLiveSpan);\r
108                         localcl = executor.scheduleAtFixedRate(localDirCleaner, 1, localCleaningRate, TimeUnit.MINUTES);\r
109                         log.info("Cleaning local job directory every " + localCleaningRate + " minutes");\r
110                 } else {\r
111                         log.info("Local job directory cleaner is disabled. ");\r
112                 }\r
113         }\r
114 \r
115         static String getClusterJobDir() {\r
116                 String ln = ph.getProperty("cluster.tmp.directory");\r
117                 if (null != ln ) {\r
118                   ln = ln.trim();\r
119                 }\r
120                 return ln;\r
121         }\r
122 \r
123         static String getLocalJobDir() {\r
124                 String ln = ph.getProperty("local.tmp.directory");\r
125                 if (null != ln ) {\r
126                         ln = ln.trim();\r
127                 }\r
128                 return ln;\r
129         }\r
130 }\r