package org.fcrepo.server; import java.io.File; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import org.fcrepo.common.Constants; import org.fcrepo.server.utilities.status.ServerState; import org.fcrepo.server.utilities.status.ServerStatusFile; import org.springframework.context.ApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; @SuppressWarnings("serial") public abstract class SpringServlet extends HttpServlet { protected ApplicationContext m_appContext; protected Server m_server; protected ServerStatusFile m_status; /** * Prints a "FEDORA STARTUP ERROR" to STDERR along with the stacktrace of * the Throwable (if given) and finally, throws a ServletException. */ protected void failStartup(String message, Throwable th) throws ServletException { System.err.println("\n**************************"); System.err.println("** FEDORA STARTUP ERROR **"); System.err.println("**************************\n"); System.err.println(message); if (th == null) { System.err.println(); throw new ServletException(message); } else { th.printStackTrace(); System.err.println(); throw new ServletException(message, th); } } @Override public void init(ServletConfig config) throws ServletException { super.init(config); File fedoraHomeDir = getFedoraHomeDir(); // get file for writing startup status try { m_status = new ServerStatusFile(new File(fedoraHomeDir, "server")); } catch (Throwable th) { failStartup("Error initializing server status file", th); } try { m_appContext = WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext()); m_server = (Server)m_appContext.getBean("org.fcrepo.server.Server"); if (m_server == null) failStartup("Could not retrieve org.fcrepo.server.Server bean",null); } catch (Throwable th) { String msg = "Fedora startup failed"; try { m_status.appendError(ServerState.STARTUP_FAILED, th); } catch (Exception e) { } failStartup(msg, th); } } @Override public void destroy(){ m_appContext = null; m_status = null; } /** * Validates and returns the value of FEDORA_HOME. * * @return the FEDORA_HOME directory. * @throws ServletException * if FEDORA_HOME (or fedora.home) was not set, does not denote an * existing directory, or is not writable by the current user. */ private File getFedoraHomeDir() throws ServletException { String fedoraHome = Constants.FEDORA_HOME; if (fedoraHome == null) { failStartup("FEDORA_HOME was not configured properly. It must be " + "set via the fedora.home servlet init-param (preferred), " + "the fedora.home system property, or the FEDORA_HOME " + "environment variable.", null); } File fedoraHomeDir = new File(fedoraHome); if (!fedoraHomeDir.isDirectory()) { failStartup("The FEDORA_HOME directory, " + fedoraHomeDir.getPath() + " does not exist", null); } File writeTest = new File(fedoraHomeDir, "writeTest.tmp"); String writeErrorMessage = "The FEDORA_HOME directory, " + fedoraHomeDir.getPath() + " is not writable by " + "the current user, " + System.getProperty("user.name"); try { writeTest.createNewFile(); if (!writeTest.exists()) { throw new IOException(""); } writeTest.delete(); } catch (IOException e) { failStartup(writeErrorMessage, null); } return fedoraHomeDir; } }