]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
eba6ea56f007f801d4b53ae4ff4d39b4e877f0aa
[tmp/jakarta-migration.git] /
1 package org.collectionspace.authentication;
2
3 import static org.apache.catalina.Lifecycle.AFTER_INIT_EVENT;
4 import static org.apache.catalina.Lifecycle.AFTER_START_EVENT;
5 import static org.apache.catalina.LifecycleState.INITIALIZED;
6 import static org.apache.catalina.LifecycleState.NEW;
7 import static org.apache.catalina.LifecycleState.STARTED;
8
9 import java.util.logging.Level;
10
11 import org.apache.catalina.Container;
12 import org.apache.catalina.Executor;
13 import org.apache.catalina.Lifecycle;
14 import org.apache.catalina.LifecycleEvent;
15 import org.apache.catalina.LifecycleException;
16 import org.apache.catalina.LifecycleListener;
17 import org.apache.catalina.LifecycleState;
18 import org.apache.catalina.Server;
19 import org.apache.catalina.Service;
20 import org.apache.catalina.connector.Connector;
21
22 /**
23  * Checks to see if any of the webapps in the Tomcat container failed during startup.  If so,
24  * we ask Tomcat to shutdown.
25  * 
26  * @author remillet
27  *
28  */
29 public class TomcatShutdownListener implements LifecycleListener {
30         
31         java.util.logging.Logger logger = java.util.logging.Logger.getAnonymousLogger();
32
33         @Override
34         public void lifecycleEvent(final LifecycleEvent event) {
35                 boolean isInit = AFTER_INIT_EVENT.equals(event.getType());
36                 if (isInit || AFTER_START_EVENT.equals(event.getType())) {
37                         Server server = (Server) event.getLifecycle();
38                         boolean failed = checkServer(isInit, server);
39                         if (failed) {
40                                 triggerShutdown(isInit, server);
41                         } else if (!isInit) {
42                                 logger.log(Level.INFO, "CollectionSpace Startup successful.");
43                         }
44                 }
45         }
46
47         private boolean checkServer(final boolean isInit, final Server server) {
48                 boolean failed = checkState(isInit, server);
49                 for (Service service : server.findServices()) {
50                         failed |= checkService(isInit, service);
51                 }
52                 return failed;
53         }
54
55         private boolean checkService(final boolean isInit, final Service service) {
56                 boolean failed = checkState(isInit, service);
57                 failed |= checkContainer(isInit, service.getContainer());
58                 for (Connector connector : service.findConnectors()) {
59                         failed |= checkState(isInit, connector);
60                 }
61                 for (Executor executor : service.findExecutors()) {
62                         failed |= checkState(isInit, executor);
63                 }
64                 return failed;
65         }
66
67         private boolean checkContainer(final boolean isInit, final Container container) {
68                 boolean failed = checkState(isInit, container);
69                 for (Container child : container.findChildren()) {
70                         failed |= checkContainer(isInit, child);
71                 }
72                 return failed;
73         }
74
75         private boolean checkState(final boolean isInit, final Lifecycle lifecycle) {
76                 LifecycleState state = lifecycle.getState();
77                 if (isInit ? state != NEW && state != INITIALIZED : state != STARTED) {
78                         logger.log(Level.SEVERE, "CollectionSpace Startup Failure\n###\n### - CollectionSpace Startup failure, initiating Tomcat shutdown...\n###");
79                         logger.log(Level.SEVERE, String.format("Required CollectionSpace Component {%s} failed to {%s}: state {%s}.", lifecycle.toString(),
80                                         isInit ? "initialize" : "start", state.toString()));
81                         logger.log(Level.SEVERE, "See other Tomcat log files for possible failure reasons and details.\n");
82                         return true;
83                 }
84                 return false;
85         }
86
87         private void triggerShutdown(final boolean isInit, final Server server) {
88                 if (isInit) {
89                         throw new RuntimeException("One or more required Tomcat components failed to initialize.");
90                 }
91                 try {
92                         server.stop();
93                         server.destroy();
94                 } catch (LifecycleException e) {
95                         e.printStackTrace();
96                 }
97         }
98 }