configファイルとか

S2Struts限定ではなくてStrutsでもOKだと思うけど、、、

TilesにはReloadActionがあるので、マネしてstruts-config.xmlとかpropertiesファイルとかを読み込む(Reloadする)Servletを作ってみた。
とりあえず、うまく動いてそう。

public class ReloadActionServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void service(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        ActionServlet actionServlet = this.getActionServlet();
        response.setContentType("text/plain");
        PrintWriter writer = response.getWriter();

        try {
            this.destroyRequestProcessors();
            actionServlet.destroy();
            actionServlet.init();
            writer.println("OK");
        } catch (Exception e) {
            writer.println("FAIL - " + e.toString());
            e.printStackTrace(writer);
        }

        writer.flush();
        writer.close();
    }

    private ActionServlet getActionServlet() {
        return (ActionServlet) this.getServletContext().getAttribute(
                Globals.ACTION_SERVLET_KEY);
    }

    private void destroyRequestProcessors() {
        ArrayList values = new ArrayList();
        Enumeration names = getServletContext().getAttributeNames();

        while (names.hasMoreElements()) {
            values.add(names.nextElement());
        }

        Iterator keys = values.iterator();

        while (keys.hasNext()) {
            String name = (String) keys.next();
            Object value = getServletContext().getAttribute(name);

            if (!(value instanceof RequestProcessor)) {
                continue;
            }

            RequestProcessor processor = (RequestProcessor) value;
            processor.destroy();
            getServletContext().removeAttribute(name);
        }
    }

}

もしかして設定ファイルはrequestのたびに読み込んですぐに反映するより、修正したら一発URLをたたいてもらうほうがストレスが少ないのかも。。。


#よく考えたら、こういう再読み込みのものってすでにたくさん作られてそうだなー
#自分が気づかなかっただけか。。。