/*
* (C) Copyright 2011 Nuxeo SAS (http://nuxeo.com/) and contributors.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser General Public License
* (LGPL) version 2.1 which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl.html
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* Contributors:
* Julien Carsique
*
*/
package org.nuxeo.ecm.core.management.statuses;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuxeo.runtime.RuntimeService;
import org.nuxeo.runtime.api.Framework;
import org.nuxeo.runtime.osgi.OSGiRuntimeService;
/**
* Servlet for retrieving Nuxeo services running status
*/
public class StatusServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final Log log = LogFactory.getLog(StatusServlet.class);
public static final String PARAM = "info";
public static final String PARAM_STARTED = "started";
public static final String PARAM_SUMMARY = "summary";
public static final String PARAM_SUMMARY_KEY = "key";
public static final String PARAM_RELOAD = "reload";
// duplicated from org.nuxeo.launcher.config.ConfigurationGenerator to avoid
// dependencies on nuxeo-launcher-commons
public static final String PARAM_STATUS_KEY = "server.status.key";
private OSGiRuntimeService runtimeService;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String param = req.getParameter(PARAM);
if (param != null) {
doPost(req, resp);
} else {
sendResponse(resp, "Ok");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
StringBuilder response = new StringBuilder();
String requestedInfo = req.getParameter(PARAM);
if (requestedInfo.equals(PARAM_STARTED)) {
getStartedInfo(response);
} else if (requestedInfo.equals(PARAM_SUMMARY)) {
String givenKey = req.getParameter(PARAM_SUMMARY_KEY);
if (getRuntimeService().getProperty(PARAM_STATUS_KEY).equals(
givenKey)) {
getSummaryInfo(response);
} else {
resp.setStatus(HttpServletResponse.SC_FORBIDDEN);
}
} else if (requestedInfo.equals(PARAM_RELOAD)) {
if (isStarted()) {
response.append("reload();");
} else {
resp.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
}
}
sendResponse(resp, response.toString());
}
protected void sendResponse(HttpServletResponse resp, String response)
throws IOException {
resp.setContentType("text/plain");
resp.setContentLength(response.getBytes().length);
OutputStream out = resp.getOutputStream();
out.write(response.getBytes());
out.close();
}
private RuntimeService getRuntimeService() {
if (runtimeService == null) {
try {
runtimeService = (OSGiRuntimeService) Framework.getRuntime();
} catch (Exception e) {
log.error(e);
}
}
return runtimeService;
}
protected void getSummaryInfo(StringBuilder response) {
if (isStarted()) {
StringBuilder msg = new StringBuilder();
boolean isFine = runtimeService.getStatusMessage(msg);
response.append(isFine).append("\n");
response.append(msg);
} else {
response.append(false).append("\n");
response.append("Runtime failed to start");
}
}
protected void getStartedInfo(StringBuilder response) {
response.append(isStarted()).toString();
}
private boolean isStarted() {
return getRuntimeService() != null && runtimeService.isStarted();
}
@Override
public void init() throws ServletException {
log.debug("Ready.");
}
}