1 package org.collectionspace.authentication;
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;
9 import java.util.logging.Level;
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;
23 * Checks to see if any of the webapps in the Tomcat container failed during startup. If so,
24 * we ask Tomcat to shutdown.
29 public class TomcatShutdownListener implements LifecycleListener {
31 java.util.logging.Logger logger = java.util.logging.Logger.getAnonymousLogger();
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);
40 triggerShutdown(isInit, server);
42 logger.log(Level.INFO, "CollectionSpace Startup successful.");
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);
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);
61 for (Executor executor : service.findExecutors()) {
62 failed |= checkState(isInit, executor);
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);
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");
87 private void triggerShutdown(final boolean isInit, final Server server) {
89 throw new RuntimeException("One or more required Tomcat components failed to initialize.");
94 } catch (LifecycleException e) {