diff --git a/scm-core/src/main/java/sonia/scm/web/cgi/AbstractCGIExecutor.java b/scm-core/src/main/java/sonia/scm/web/cgi/AbstractCGIExecutor.java index 74e23aec64..a4271e613c 100644 --- a/scm-core/src/main/java/sonia/scm/web/cgi/AbstractCGIExecutor.java +++ b/scm-core/src/main/java/sonia/scm/web/cgi/AbstractCGIExecutor.java @@ -68,6 +68,19 @@ public abstract class AbstractCGIExecutor implements CGIExecutor return environment; } + /** + * {@inheritDoc} + * + * + * @return + * @since 1.15 + */ + @Override + public CGIExceptionHandler getExceptionHandler() + { + return exceptionHandler; + } + /** * Method description * @@ -80,6 +93,19 @@ public abstract class AbstractCGIExecutor implements CGIExecutor return interpreter; } + /** + * {@inheritDoc} + * + * + * @return + * @since 1.15 + */ + @Override + public CGIStatusCodeHandler getStatusCodeHandler() + { + return statusCodeHandler; + } + /** * Method description * @@ -142,6 +168,19 @@ public abstract class AbstractCGIExecutor implements CGIExecutor this.environment = environment; } + /** + * {@inheritDoc} + * + * + * @param exceptionHandler + * @since 1.15 + */ + @Override + public void setExceptionHandler(CGIExceptionHandler exceptionHandler) + { + this.exceptionHandler = exceptionHandler; + } + /** * Method description * @@ -178,6 +217,19 @@ public abstract class AbstractCGIExecutor implements CGIExecutor this.passShellEnvironment = passShellEnvironment; } + /** + * {@inheritDoc} + * + * + * @param statusCodeHandler + * @since 1.15 + */ + @Override + public void setStatusCodeHandler(CGIStatusCodeHandler statusCodeHandler) + { + this.statusCodeHandler = statusCodeHandler; + } + /** * Method description * @@ -198,6 +250,9 @@ public abstract class AbstractCGIExecutor implements CGIExecutor /** Field description */ protected EnvList environment; + /** Field description */ + protected CGIExceptionHandler exceptionHandler; + /** Field description */ protected boolean ignoreExitCode = false; @@ -207,6 +262,9 @@ public abstract class AbstractCGIExecutor implements CGIExecutor /** Field description */ protected boolean passShellEnvironment = false; + /** Field description */ + protected CGIStatusCodeHandler statusCodeHandler; + /** Field description */ protected File workDirectory; } diff --git a/scm-core/src/main/java/sonia/scm/web/cgi/CGIExecutor.java b/scm-core/src/main/java/sonia/scm/web/cgi/CGIExecutor.java index 19951a2267..19239dcbdd 100644 --- a/scm-core/src/main/java/sonia/scm/web/cgi/CGIExecutor.java +++ b/scm-core/src/main/java/sonia/scm/web/cgi/CGIExecutor.java @@ -176,6 +176,15 @@ public interface CGIExecutor */ public String getInterpreter(); + /** + * Returns the status code handler. + * + * + * @return status code handler + * @since 1.15 + */ + public CGIStatusCodeHandler getStatusCodeHandler(); + /** * Method description * @@ -268,6 +277,15 @@ public interface CGIExecutor */ public void setPassShellEnvironment(boolean passShellEnvironment); + /** + * Sets the status code handler. + * + * + * @param statusCodeHandler the handler to set + * @since 1.15 + */ + public void setStatusCodeHandler(CGIStatusCodeHandler statusCodeHandler); + /** * Method description * diff --git a/scm-core/src/main/java/sonia/scm/web/cgi/CGIStatusCodeHandler.java b/scm-core/src/main/java/sonia/scm/web/cgi/CGIStatusCodeHandler.java new file mode 100644 index 0000000000..430dfb82e5 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/web/cgi/CGIStatusCodeHandler.java @@ -0,0 +1,59 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. 2. Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. 3. Neither the name of SCM-Manager; + * nor the names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.web.cgi; + +//~--- JDK imports ------------------------------------------------------------ + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * Interface for handling return codes of processes + * executed by the {@link CGIExecutor}. + * + * @author Sebastian Sdorra + * @since 1.15 + */ +public interface CGIStatusCodeHandler +{ + + /** + * Handles the return code of the process executed by {@link CGIExecutor}. + * + * + * @param request the http request + * @param response the http response + * @param statusCode process return code + */ + public void handleStatusCode(HttpServletRequest request, + HttpServletResponse response, int statusCode); +} diff --git a/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIExecutor.java b/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIExecutor.java index 9705631a9f..a936a07059 100644 --- a/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIExecutor.java +++ b/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIExecutor.java @@ -210,6 +210,23 @@ public class DefaultCGIExecutor extends AbstractCGIExecutor return exceptionHandler; } + /** + * Method description + * + * + * @return + */ + @Override + public CGIStatusCodeHandler getStatusCodeHandler() + { + if (statusCodeHandler == null) + { + statusCodeHandler = new DefaultCGIStatusCodeHandler(); + } + + return statusCodeHandler; + } + /** * Method description * @@ -237,18 +254,6 @@ public class DefaultCGIExecutor extends AbstractCGIExecutor this.contentLengthWorkaround = contentLengthWorkaround; } - /** - * Method description - * - * - * @param exceptionHandler - */ - @Override - public void setExceptionHandler(CGIExceptionHandler exceptionHandler) - { - this.exceptionHandler = exceptionHandler; - } - //~--- methods -------------------------------------------------------------- /** @@ -582,9 +587,19 @@ public class DefaultCGIExecutor extends AbstractCGIExecutor { int exitCode = process.waitFor(); - if ((exitCode != 0) &&!ignoreExitCode) + if (!ignoreExitCode) { - logger.warn("process ends with exit code {}", exitCode); + if (logger.isTraceEnabled()) + { + logger.trace("handle status code {} with statusCodeHandler", + exitCode); + } + + getStatusCodeHandler().handleStatusCode(request, response, exitCode); + } + else if (logger.isDebugEnabled()) + { + logger.debug("ignore status code {}", exitCode); } } catch (InterruptedException ex) @@ -629,9 +644,6 @@ public class DefaultCGIExecutor extends AbstractCGIExecutor /** Field description */ private ServletContext context; - /** Field description */ - private CGIExceptionHandler exceptionHandler; - /** Field description */ private HttpServletRequest request; diff --git a/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIStatusCodeHandler.java b/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIStatusCodeHandler.java new file mode 100644 index 0000000000..005394b109 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/web/cgi/DefaultCGIStatusCodeHandler.java @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. 2. Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. 3. Neither the name of SCM-Manager; + * nor the names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.web.cgi; + +//~--- non-JDK imports -------------------------------------------------------- + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +//~--- JDK imports ------------------------------------------------------------ + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * + * @author Sebastian Sdorra + */ +public class DefaultCGIStatusCodeHandler implements CGIStatusCodeHandler +{ + + /** + * the logger for DefaultCGIStatusCodeHandler + */ + private static final Logger logger = + LoggerFactory.getLogger(DefaultCGIStatusCodeHandler.class); + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param request + * @param response + * @param statusCode + */ + @Override + public void handleStatusCode(HttpServletRequest request, + HttpServletResponse response, int statusCode) + { + if (statusCode != 0) + { + logger.warn("process ends with exit code {}", statusCode); + } + } +}