/* * Copyright 2004-2015 the Seasar Foundation and the Others. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ package org.seasar.framework.container.hotdeploy; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.seasar.framework.container.impl.S2ContainerBehavior; /** * HOT deploy用の {@link Filter}です。 * * @author higa * */ public class HotdeployFilter implements Filter { private static final String MODE = "mode"; private static final String AUTO = "auto"; private static final String MANUAL = "manual"; private static final String PATH = "/hotdeploy"; private static final String KEY = HotdeployFilter.class.getName(); private boolean autoMode = true; /** * {@link HotdeployFilter}を作成します。 */ public HotdeployFilter() { } public void init(FilterConfig config) throws ServletException { } public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (HotdeployUtil.isHotdeploy()) { doHotdeployFilter((HttpServletRequest) request, (HttpServletResponse) response, chain); return; } chain.doFilter(request, response); } private void doHotdeployFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { final String path = request.getPathInfo(); if (PATH.equals(path)) { changeMode(request, response); return; } if (request.getAttribute(KEY) != null) { ClassLoader cl = (ClassLoader) request.getAttribute(KEY); Thread.currentThread().setContextClassLoader(cl); chain.doFilter(request, response); return; } HotdeployBehavior ondemand = (HotdeployBehavior) S2ContainerBehavior .getProvider(); synchronized (HotdeployFilter.class) { ondemand.start(); HotdeployHttpServletRequest hotdeployRequest = new HotdeployHttpServletRequest( (HttpServletRequest) request); try { request.setAttribute(KEY, Thread.currentThread() .getContextClassLoader()); chain.doFilter(hotdeployRequest, response); } finally { HotdeployHttpSession session = (HotdeployHttpSession) hotdeployRequest .getSession(false); if (session != null) { session.flush(); } request.removeAttribute(KEY); ondemand.stop(); } } } private void changeMode(final HttpServletRequest request, final HttpServletResponse response) throws IOException, ServletException { synchronized (HotdeployFilter.class) { HotdeployBehavior ondemand = (HotdeployBehavior) S2ContainerBehavior .getProvider(); response.setContentType("text/html"); final PrintWriter writer = response.getWriter(); final String mode = request.getParameter(MODE); if (AUTO.equals(mode) || MANUAL.equals(mode)) { autoMode = AUTO.equals(mode); ondemand.setKeep(!autoMode); writer.println("<html><body>HOT deploy mode : " + mode + "</body></html>"); } else { writer .println("<html><body>ERROR! Invalid HOT deploy mode : " + mode + "<br>Valid values : 'auto' or 'manual'</body></html>"); } } } }