/*
* ELW : e-learning workspace
* Copyright (C) 2010 Anton Kraievoy
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package elw.web;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
@Controller
@RequestMapping("/err/**")
public class ErrController {
private static final Logger log = LoggerFactory.getLogger(ErrController.class);
@SuppressWarnings({"RedundantArrayCreation"})
private final List<String> ignoredUris = Arrays.asList(new String[]{
"/s/elw.dp.ui.Applet",
"/s/META-INF/services/javax.xml.parsers.DocumentBuilderFactory",
"/s/org/apache/log4j/PatternLayoutBeanInfo.class",
"/s/org/apache/log4j/LayoutBeanInfo.class",
"/s/java/lang/ObjectBeanInfo.class",
"/s/com/ibm/uvm/tools/DebugSupport.class"
});
@RequestMapping(value = "*")
public ModelAndView do_handle(final HttpServletRequest req, final HttpServletResponse resp) throws IOException {
final String url = (String) req.getAttribute("javax.servlet.error.request_uri");
final Integer statusCode = (Integer) req.getAttribute("javax.servlet.error.status_code");
if (statusCode != null && 404 == statusCode && ignoredUris.contains(url)) {
resp.sendError(410, "ignored");
return null;
}
try {
final String message = (String) req.getAttribute("javax.servlet.error.message");
final Throwable throwable = (Throwable) req.getAttribute("javax.servlet.error.exception");
final String eventId = Long.toString(System.currentTimeMillis(), 36);
final StringWriter logDest = new StringWriter();
final PrintWriter logOut = new PrintWriter(logDest);
final HttpSession session = req.getSession(false);
logOut.println("web error: eventId=" + eventId + " status=" + statusCode + " message='" + message + "'");
logOut.println("url: " + url);
logOut.print("attributes: ");
final Enumeration reqAttrNames = req.getAttributeNames();
while (reqAttrNames.hasMoreElements()) {
final String aName = (String) reqAttrNames.nextElement();
if (!aName.startsWith("javax.servlet") && !aName.startsWith("org.springframework")) {
logOut.print(aName + "=" + String.valueOf(req.getAttribute(aName)) + " ");
}
}
logOut.println();
if (session != null) {
logOut.println("session id: " + session.getId());
logOut.print("session: ");
final Enumeration sessAttrNames = session.getAttributeNames();
while (sessAttrNames.hasMoreElements()) {
final String aName = (String) sessAttrNames.nextElement();
if (!aName.startsWith("javax.servlet") && !aName.startsWith("org.springframework")) {
logOut.print(aName + "=" + String.valueOf(session.getAttribute(aName)) + " ");
}
}
logOut.println();
}
log.error(
logDest.toString(), throwable
);
final PrintWriter out = resp.getWriter();
out.print(
"<html><title>HTTP status " + statusCode + " : " + message + "</title>" +
"<body><h3>HTTP status " + statusCode + " : " + message + "</h3>" +
"Sorry for inconvenience and thanks for finding just another bug out there.<br/>" +
"For the time being, you may log out, log in and then try the operation once again.<br/><br/>" +
"Event reference id: <b>" + eventId + "</b>." +
"</body></html>"
);
} catch (Throwable t) {
log.error("failed on reporting error", t);
}
return null;
}
}