diff --git a/pom.xml b/pom.xml index a610b1a090..38d110f281 100644 --- a/pom.xml +++ b/pom.xml @@ -66,12 +66,6 @@ - - slf4j-api - org.slf4j - ${slf4j.version} - - junit junit diff --git a/scm-core/pom.xml b/scm-core/pom.xml index d87329b5ef..402fe938e5 100644 --- a/scm-core/pom.xml +++ b/scm-core/pom.xml @@ -24,6 +24,12 @@ provided + + slf4j-api + org.slf4j + ${slf4j.version} + + com.google.inject guice diff --git a/scm-server-api/pom.xml b/scm-server-api/pom.xml index 17b6b7a5c0..11a997ae89 100644 --- a/scm-server-api/pom.xml +++ b/scm-server-api/pom.xml @@ -15,14 +15,4 @@ 1.0-M7-SNAPSHOT scm-server-api - - - - sonia.scm - scm-core - 1.0-M7-SNAPSHOT - - - - diff --git a/scm-server-api/src/main/java/sonia/scm/server/Server.java b/scm-server-api/src/main/java/sonia/scm/server/Server.java index e2bc900368..eae0a657b9 100644 --- a/scm-server-api/src/main/java/sonia/scm/server/Server.java +++ b/scm-server-api/src/main/java/sonia/scm/server/Server.java @@ -29,6 +29,8 @@ * */ + + package sonia.scm.server; //~--- JDK imports ------------------------------------------------------------ @@ -63,14 +65,12 @@ public interface Server * Method description * * - * @param config * @param webapp * * @throws IOException * @throws ServerException */ - public void start(ServerConfig config, File webapp) - throws ServerException, IOException; + public void start(File webapp) throws ServerException, IOException; /** * Method description diff --git a/scm-server-api/src/main/java/sonia/scm/server/ServerApplication.java b/scm-server-api/src/main/java/sonia/scm/server/ServerApplication.java index fb7a5e3ebd..0ef85f19f1 100644 --- a/scm-server-api/src/main/java/sonia/scm/server/ServerApplication.java +++ b/scm-server-api/src/main/java/sonia/scm/server/ServerApplication.java @@ -33,23 +33,15 @@ package sonia.scm.server; -//~--- non-JDK imports -------------------------------------------------------- - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import sonia.scm.cli.CliException; -import sonia.scm.cli.CliParser; -import sonia.scm.cli.DefaultCliHelpBuilder; -import sonia.scm.util.IOUtil; -import sonia.scm.util.ServiceUtil; - //~--- JDK imports ------------------------------------------------------------ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.util.NoSuchElementException; +import java.util.ServiceLoader; + import javax.xml.bind.JAXB; /** @@ -74,48 +66,6 @@ public class ServerApplication /** Field description */ public static final String SERVERCONFIG = "/config.xml"; - /** Field description */ - private static final Logger logger = - LoggerFactory.getLogger(ServerApplication.class.getName()); - - //~--- get methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @return - */ - private static ServerConfig getServerConfig() - { - ServerConfig config = null; - InputStream input = - ServerApplication.class.getResourceAsStream(SERVERCONFIG); - - if (input != null) - { - try - { - config = JAXB.unmarshal(input, ServerConfig.class); - } - catch (Exception ex) - { - logger.error(ex.getMessage(), ex); - } - finally - { - IOUtil.close(input); - } - } - - if (config == null) - { - config = new ServerConfig(); - } - - return config; - } - //~--- methods -------------------------------------------------------------- /** @@ -124,12 +74,10 @@ public class ServerApplication * * @param args * - * @throws CliException * @throws IOException * @throws ServerException */ - public static void main(String[] args) - throws CliException, ServerException, IOException + public static void main(String[] args) throws ServerException, IOException { InputStream input = ServerApplication.class.getResourceAsStream(APPINFO); @@ -141,76 +89,68 @@ public class ServerApplication ApplicationInformation appInfo = JAXB.unmarshal(input, ApplicationInformation.class); - ServerConfig config = getServerConfig(); - CliParser parser = new CliParser(); + final Server server = getServer(); - parser.parse(config, args); - - if (config.getShowHelp()) + if (server == null) { - printHelp(appInfo, parser, config); + System.err.println("could not find an server implementation"); + System.exit(RETURNCODE_MISSING_SERVER_IMPLEMENTATION); } - else + + File webapp = new File("webapp", appInfo.getAppName()); + + server.start(webapp); + Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { - final Server server = ServiceUtil.getService(Server.class); - - if (server == null) + @Override + public void run() { - System.err.println("could not find an server implementation"); - System.exit(RETURNCODE_MISSING_SERVER_IMPLEMENTATION); - } - - File webapp = new File("webapp", appInfo.getAppName()); - - server.start(config, webapp); - Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() - { - @Override - public void run() + if (server.isRunning()) { - if (server.isRunning()) + try { - try - { - server.stop(); - } - catch (ServerException ex) - { - logger.error(ex.getMessage(), ex); - } - catch (IOException ex) - { - logger.error(ex.getMessage(), ex); - } + server.stop(); + } + catch (ServerException ex) + { + ex.printStackTrace(System.err); + } + catch (IOException ex) + { + ex.printStackTrace(System.err); } } - })); - } + } + })); } + //~--- get methods ---------------------------------------------------------- + /** * Method description * * - * - * @param appInfo - * @param parser - * @param config + * @return */ - private static void printHelp(ApplicationInformation appInfo, - CliParser parser, ServerConfig config) + private static Server getServer() { - String s = System.getProperty("line.separator"); - StringBuilder prefix = new StringBuilder(appInfo.getName()); + Server server = null; - prefix.append(" ").append(appInfo.getVersion()); - prefix.append(s).append("usage: "); - prefix.append(s); + try + { + ServiceLoader loader = ServiceLoader.load(Server.class); - DefaultCliHelpBuilder helpBuilder = - new DefaultCliHelpBuilder(prefix.toString(), null); + if (loader != null) + { + server = loader.iterator().next(); + } + } + catch (NoSuchElementException ex) + { - System.err.println(parser.createHelp(helpBuilder, config)); - System.exit(RETURNCODE_CLI_ERROR); + // no server available + } + + return server; } } diff --git a/scm-server-api/src/main/java/sonia/scm/server/ServerConfig.java b/scm-server-api/src/main/java/sonia/scm/server/ServerConfig.java deleted file mode 100644 index 027bdcea0c..0000000000 --- a/scm-server-api/src/main/java/sonia/scm/server/ServerConfig.java +++ /dev/null @@ -1,176 +0,0 @@ -/** - * 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.server; - -//~--- non-JDK imports -------------------------------------------------------- - -import sonia.scm.cli.Argument; - -/** - * - * @author Sebastian Sdorra - */ -public class ServerConfig -{ - - /** - * Constructs ... - * - */ - public ServerConfig() {} - - //~--- get methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @return - */ - public String getContextPath() - { - return contextPath; - } - - /** - * Method description - * - * - * @return - */ - public Integer getPort() - { - return port; - } - - /** - * Method description - * - * - * @return - */ - public String getResourcePath() - { - return resourcePath; - } - - /** - * Method description - * - * - * @return - */ - public Boolean getShowHelp() - { - return showHelp; - } - - //~--- set methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @param contextPath - */ - public void setContextPath(String contextPath) - { - this.contextPath = contextPath; - } - - /** - * Method description - * - * - * @param port - */ - public void setPort(Integer port) - { - this.port = port; - } - - /** - * Method description - * - * - * @param resourcePath - */ - public void setResourcePath(String resourcePath) - { - this.resourcePath = resourcePath; - } - - /** - * Method description - * - * - * @param showHelp - */ - public void setShowHelp(Boolean showHelp) - { - this.showHelp = showHelp; - } - - //~--- fields --------------------------------------------------------------- - - /** Field description */ - @Argument( - value = "c", - longName = "context-path", - description = "The Context-Path of the Jab-WebApp" - ) - private String contextPath = "/"; - - /** Field description */ - @Argument( - value = "p", - longName = "port", - description = "The port for the listener" - ) - private Integer port = Integer.valueOf(8080); - - /** Field description */ - @Argument( - value = "r", - longName = "resource-path", - description = "Path to the server resource directory" - ) - private String resourcePath; - - /** Field description */ - @Argument( - value = "h", - longName = "help", - description = "Shows this help" - ) - private Boolean showHelp = Boolean.FALSE; -} diff --git a/scm-server-jetty/src/main/java/sonia/scm/server/jetty/JettyServer.java b/scm-server-jetty/src/main/java/sonia/scm/server/jetty/JettyServer.java index 0a3b0783c0..d339118604 100644 --- a/scm-server-jetty/src/main/java/sonia/scm/server/jetty/JettyServer.java +++ b/scm-server-jetty/src/main/java/sonia/scm/server/jetty/JettyServer.java @@ -29,17 +29,17 @@ * */ + + package sonia.scm.server.jetty; //~--- non-JDK imports -------------------------------------------------------- -import org.eclipse.jetty.server.Connector; -import org.eclipse.jetty.server.nio.SelectChannelConnector; import org.eclipse.jetty.webapp.WebAppContext; +import org.eclipse.jetty.xml.XmlConfiguration; import sonia.scm.server.Server; import sonia.scm.server.ServerAllreadyRunningException; -import sonia.scm.server.ServerConfig; import sonia.scm.server.ServerException; import sonia.scm.server.ServerListener; @@ -48,6 +48,8 @@ import sonia.scm.server.ServerListener; import java.io.File; import java.io.IOException; +import java.net.URL; + import java.util.HashSet; import java.util.Set; @@ -58,6 +60,11 @@ import java.util.Set; public class JettyServer implements Server { + /** Field description */ + public static final String CONFIGURATION = "/server-config.xml"; + + //~--- methods -------------------------------------------------------------- + /** * Method description * @@ -86,44 +93,46 @@ public class JettyServer implements Server * Method description * * - * @param config * @param webapp * * @throws IOException * @throws ServerException */ @Override - public void start(ServerConfig config, File webapp) - throws ServerException, IOException + public void start(File webapp) throws ServerException, IOException { if (isRunning()) { throw new ServerAllreadyRunningException(); } - server = new org.eclipse.jetty.server.Server(); + URL configURL = JettyServer.class.getResource(CONFIGURATION); - Connector connector = new SelectChannelConnector(); - - for (ServerListener listener : listeners) + if (configURL == null) { - connector.addLifeCycleListener(new JettyServerListenerAdapter(listener)); + throw new ServerException("could not find server-config.xml"); } - connector.setPort(config.getPort()); - server.addConnector(connector); - - WebAppContext wac = new WebAppContext(); - - wac.setContextPath(config.getContextPath()); - wac.setWar(webapp.getAbsolutePath()); - wac.setExtractWAR(true); - server.setHandler(wac); - - // server.setStopAtShutdown(true); - try { + server = new org.eclipse.jetty.server.Server(); + + XmlConfiguration config = new XmlConfiguration(configURL); + + config.configure(server); + + for (ServerListener listener : listeners) + { + server.addLifeCycleListener(new JettyServerListenerAdapter(listener)); + } + + WebAppContext wac = new WebAppContext(); + + wac.setWar(webapp.getAbsolutePath()); + wac.setExtractWAR(true); + server.setHandler(wac); + + // server.setStopAtShutdown(true); server.start(); server.join(); } diff --git a/scm-server/pom.xml b/scm-server/pom.xml index 0a685971e0..fecd24fe0e 100644 --- a/scm-server/pom.xml +++ b/scm-server/pom.xml @@ -18,12 +18,6 @@ - - sonia.scm - scm-core - 1.0-M7-SNAPSHOT - - sonia.scm scm-server-api diff --git a/scm-server/src/main/assembly/scm-server-jsw.xml b/scm-server/src/main/assembly/scm-server-jsw.xml index 1f4699452b..97c0cf9deb 100644 --- a/scm-server/src/main/assembly/scm-server-jsw.xml +++ b/scm-server/src/main/assembly/scm-server-jsw.xml @@ -92,6 +92,11 @@ true conf + + src/main/conf/server-config.xml + true + conf + \ No newline at end of file