package com.redhat.jboss.support;
import java.io.IOException;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.exoplatform.container.web.AbstractFilter;
/**
* Improved version of org.gatein.portal.init.PortalCheckInitFilter to overcome BZ1321009
*
* @See https://bugzilla.redhat.com/show_bug.cgi?id=1321009
*/
public class PortalCheckInitFilter2 extends AbstractFilter {
private static volatile boolean isPortalStarted = false;
private static final String ERROR_MSG = "Server is starting, please try in a few seconds...";
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException,
ServletException {
if (!isPortalStarted) {
try {
String urlString = System.getProperty("jmx.service.url", "service:jmx:remoting-jmx://localhost:9999");
JMXServiceURL serviceURL = new JMXServiceURL(urlString);
JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceURL, null);
MBeanServerConnection connection = jmxConnector.getMBeanServerConnection();
ObjectName objectName = new ObjectName("jboss.as:management-root=server");
String value = (String)connection.getAttribute(objectName, "serverState");
if (value != null && value.equals("running")) {
isPortalStarted = true;
}
jmxConnector.close();
} catch (Exception e) {
e.printStackTrace();
}
if (!isPortalStarted) {
HttpServletResponse httpResp = (HttpServletResponse)resp;
httpResp.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE, ERROR_MSG);
} else {
chain.doFilter(req, resp);
}
} else {
chain.doFilter(req, resp);
}
}
@Override
public void destroy() {
// nothing to do
}
}