package com.vmware.appcloud.tomcat; import org.apache.catalina.Container; import org.apache.catalina.Lifecycle; import org.apache.catalina.LifecycleEvent; import org.apache.catalina.LifecycleListener; import org.apache.catalina.core.StandardContext; import org.apache.catalina.core.StandardEngine; import javax.management.Notification; import javax.management.NotificationListener; import java.io.*; public class AppCloudLifecycleListener implements LifecycleListener, NotificationListener { private String stateFile; private static final String APPCLOUD_STATE_FILE = "tomcat.state"; private static final String J2EE_RUNNING_STATE = "j2ee.state.running"; public void lifecycleEvent(LifecycleEvent event) { Lifecycle lifecycle = event.getLifecycle(); if (lifecycle instanceof StandardContext) { StandardContext context = (StandardContext) lifecycle; if (event.getType().equals(Lifecycle.BEFORE_START_EVENT)) { Container grandParent = context.getParent().getParent(); if (grandParent instanceof StandardEngine) { StandardEngine engine = (StandardEngine) grandParent; String relativePath = new StringBuilder() .append("..") .append(File.separator) .append(APPCLOUD_STATE_FILE) .toString(); stateFile = new File(engine.getBaseDir(), relativePath).getAbsolutePath(); context.addNotificationListener(this, null, null); } } else if (event.getType().equals(Lifecycle.AFTER_STOP_EVENT)) { System.err.println("Stopping Tomcat because the context stopped."); System.exit(1); } } } public void handleNotification(Notification notification, Object handback) { if (J2EE_RUNNING_STATE.equals(notification.getType())) { try { PrintWriter writer = new PrintWriter(stateFile); writer.println("{\"state\": \"RUNNING\"}"); writer.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } } } }