diff --git a/maven/scm-maven-plugin/src/main/java/sonia/scm/maven/JettyStopMonitorThread.java b/maven/scm-maven-plugin/src/main/java/sonia/scm/maven/JettyStopMonitorThread.java new file mode 100644 index 0000000000..55bb98111a --- /dev/null +++ b/maven/scm-maven-plugin/src/main/java/sonia/scm/maven/JettyStopMonitorThread.java @@ -0,0 +1,140 @@ +/** + * 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.maven; + +//~--- non-JDK imports -------------------------------------------------------- + +import org.apache.commons.io.IOUtils; + +import org.eclipse.jetty.server.Server; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.BufferedReader; +import java.io.InputStreamReader; + +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.Socket; + +/** + * + * @author Sebastian Sdorra + */ +public class JettyStopMonitorThread extends Thread +{ + + /** Field description */ + public static final String ADDRESS_LOCALHOST = "127.0.0.1"; + + /** Field description */ + public static final String NAME = "JettyStopMonitor"; + + //~--- constructors --------------------------------------------------------- + + /** + * Constructs ... + * + * + * @param server + * @param stopPort + * @param stopKey + */ + public JettyStopMonitorThread(Server server, int stopPort, String stopKey) + { + this.server = server; + this.stopKey = stopKey; + setDaemon(true); + setName(NAME); + + try + { + socket = new ServerSocket(stopPort, 1, + InetAddress.getByName(ADDRESS_LOCALHOST)); + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + */ + @Override + public void run() + { + BufferedReader reader = null; + Socket accept = null; + + try + { + accept = socket.accept(); + reader = + new BufferedReader(new InputStreamReader(accept.getInputStream())); + + String line = reader.readLine(); + + if (stopKey.equals(line)) + { + server.stop(); + socket.close(); + } + + accept.close(); + } + catch (Exception e) + { + throw new RuntimeException(e); + } + finally + { + IOUtils.closeQuietly(reader); + } + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + private Server server; + + /** Field description */ + private ServerSocket socket; + + /** Field description */ + private String stopKey; +} diff --git a/maven/scm-maven-plugin/src/main/java/sonia/scm/maven/RunMojo.java b/maven/scm-maven-plugin/src/main/java/sonia/scm/maven/RunMojo.java index 3bdd14f978..2db38c4d03 100644 --- a/maven/scm-maven-plugin/src/main/java/sonia/scm/maven/RunMojo.java +++ b/maven/scm-maven-plugin/src/main/java/sonia/scm/maven/RunMojo.java @@ -117,6 +117,39 @@ public class RunMojo extends AbstractBaseScmMojo return port; } + /** + * Method description + * + * + * @return + */ + public String getStopKey() + { + return stopKey; + } + + /** + * Method description + * + * + * @return + */ + public int getStopPort() + { + return stopPort; + } + + /** + * Method description + * + * + * @return + */ + public boolean isBackgroud() + { + return backgroud; + } + /** * Method description * @@ -130,6 +163,17 @@ public class RunMojo extends AbstractBaseScmMojo //~--- set methods ---------------------------------------------------------- + /** + * Method description + * + * + * @param backgroud + */ + public void setBackgroud(boolean backgroud) + { + this.backgroud = backgroud; + } + /** * Method description * @@ -175,6 +219,28 @@ public class RunMojo extends AbstractBaseScmMojo this.port = port; } + /** + * Method description + * + * + * @param stopKey + */ + public void setStopKey(String stopKey) + { + this.stopKey = stopKey; + } + + /** + * Method description + * + * + * @param stopPort + */ + public void setStopPort(int stopPort) + { + this.stopPort = stopPort; + } + //~--- methods -------------------------------------------------------------- /** @@ -216,8 +282,10 @@ public class RunMojo extends AbstractBaseScmMojo warContext.setExtractWAR(true); warContext.setWar(warFile.getAbsolutePath()); server.setHandler(warContext); + new JettyStopMonitorThread(server, stopPort, stopKey).start(); server.start(); - server.join(); + + // server.join(); } catch (Exception ex) { @@ -227,6 +295,11 @@ public class RunMojo extends AbstractBaseScmMojo //~--- fields --------------------------------------------------------------- + /** + * @parameter + */ + private boolean backgroud = false; + /** * @parameter */ @@ -242,6 +315,16 @@ public class RunMojo extends AbstractBaseScmMojo */ private int port = 8081; + /** + * @parameter + */ + private String stopKey = "stop"; + + /** + * @parameter + */ + private int stopPort = 8085; + /** * @parameter expression="${openBrowser}" default-value="true" */ diff --git a/maven/scm-maven-plugin/src/main/java/sonia/scm/maven/StopMojo.java b/maven/scm-maven-plugin/src/main/java/sonia/scm/maven/StopMojo.java new file mode 100644 index 0000000000..81fab453d5 --- /dev/null +++ b/maven/scm-maven-plugin/src/main/java/sonia/scm/maven/StopMojo.java @@ -0,0 +1,165 @@ +/** + * 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.maven; + +//~--- non-JDK imports -------------------------------------------------------- + +import org.apache.commons.io.IOUtils; +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; + +//~--- JDK imports ------------------------------------------------------------ + +import java.io.IOException; +import java.io.PrintWriter; + +import java.net.InetAddress; +import java.net.Socket; + +/** + * @goal stop + * @author Sebastian Sdorra + */ +public class StopMojo extends AbstractMojo +{ + + /** Field description */ + public static final String ADDRESS_LOCALHOST = "127.0.0.1"; + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @throws MojoExecutionException + * @throws MojoFailureException + */ + @Override + public void execute() throws MojoExecutionException, MojoFailureException + { + Socket socket = null; + PrintWriter writer = null; + + try + { + socket = new Socket(InetAddress.getByName(ADDRESS_LOCALHOST), stopPort); + writer = new PrintWriter(socket.getOutputStream()); + writer.println(stopKey); + writer.flush(); + } + catch (Exception ex) + { + getLog().warn("could not stop jetty", ex); + } + finally + { + IOUtils.closeQuietly(writer); + + if (socket != null) + { + try + { + socket.close(); + } + catch (IOException ex) + { + + // ignore ex + } + } + } + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @return + */ + public String getStopKey() + { + return stopKey; + } + + /** + * Method description + * + * + * @return + */ + public int getStopPort() + { + return stopPort; + } + + //~--- set methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param stopKey + */ + public void setStopKey(String stopKey) + { + this.stopKey = stopKey; + } + + /** + * Method description + * + * + * @param stopPort + */ + public void setStopPort(int stopPort) + { + this.stopPort = stopPort; + } + + //~--- fields --------------------------------------------------------------- + + /** + * @parameter + */ + private String stopKey = "stop"; + + /** + * @parameter + */ + private int stopPort = 8085; +}