This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag maven-launchpad-plugin-2.0.10 in repository https://gitbox.apache.org/repos/asf/sling-maven-launchpad-plugin.git
commit 8c0ec781839a6127fcd5caebabaae5416c09047e Author: Justin Edelson <[email protected]> AuthorDate: Mon Mar 15 18:18:52 2010 +0000 SLING-1441 - adding run goal to launchpad plugin git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/maven/maven-launchpad-plugin@923372 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 16 ++ .../apache/sling/maven/projectsupport/RunMojo.java | 267 +++++++++++++++++++++ 2 files changed, 283 insertions(+) diff --git a/pom.xml b/pom.xml index 212bf9e..db71dd5 100644 --- a/pom.xml +++ b/pom.xml @@ -127,5 +127,21 @@ <artifactId>jdom</artifactId> <version>1.1</version> </dependency> + <dependency> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.launchpad.base</artifactId> + <version>2.1.1-SNAPSHOT</version> + </dependency> + <dependency> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.launchpad.base</artifactId> + <version>2.1.1-SNAPSHOT</version> + <classifier>app</classifier> + </dependency> + <dependency> + <groupId>org.osgi</groupId> + <artifactId>org.osgi.core</artifactId> + <version>4.2.0</version> + </dependency> </dependencies> </project> diff --git a/src/main/java/org/apache/sling/maven/projectsupport/RunMojo.java b/src/main/java/org/apache/sling/maven/projectsupport/RunMojo.java new file mode 100644 index 0000000..4d52086 --- /dev/null +++ b/src/main/java/org/apache/sling/maven/projectsupport/RunMojo.java @@ -0,0 +1,267 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to You 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.apache.sling.maven.projectsupport; + +import static org.apache.felix.framework.util.FelixConstants.*; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import org.apache.felix.framework.Logger; +import org.apache.maven.artifact.Artifact; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.sling.launchpad.base.impl.ResourceProvider; +import org.apache.sling.launchpad.base.impl.Sling; +import org.apache.sling.launchpad.base.shared.Notifiable; +import org.apache.sling.launchpad.base.shared.SharedConstants; +import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.Bundle; +import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.BundleList; +import org.apache.sling.maven.projectsupport.bundlelist.v1_0_0.StartLevel; +import org.osgi.framework.BundleException; + +/** + * Run a Launchpad application. + * + * @goal run + * @requiresDependencyResolution test + * + */ +public class RunMojo extends AbstractBundleListMojo implements Notifiable { + + /** Default log level setting if no set on command line (value is "INFO"). */ + private static final int DEFAULT_LOG_LEVEL = Logger.LOG_INFO; + + /** Mapping between log level numbers and names */ + private static final String[] logLevels = { "FATAL", "ERROR", "WARN", "INFO", "DEBUG" }; + + /** + * The configuration property setting the port on which the HTTP service + * listens + */ + private static final String PROP_PORT = "org.osgi.service.http.port"; + /** Return the log level code for the string */ + private static int toLogLevelInt(String level, int defaultLevel) { + for (int i = 0; i < logLevels.length; i++) { + if (logLevels[i].equalsIgnoreCase(level)) { + return i; + } + } + + return defaultLevel; + } + + /** + * @parameter expression="${http.port}" default-value="8080" + */ + private int httpPort; + + /** + * The definition of the package to be included to provide web support for + * JAR-packaged projects (i.e. pax-web). + * + * @parameter + */ + private ArtifactDefinition jarWebSupport; + + /** + * @parameter expression="${felix.log.level}" + */ + private String logLevel; + + private ResourceProvider resourceProvider = new ResourceProvider() { + + @Override + public Iterator<String> getChildren(String path) { + if (path.equals("resources/bundles")) { + List<String> levels = new ArrayList<String>(); + for (StartLevel level : getBundleList().getStartLevels()) { + levels.add(String.valueOf(level.getLevel()) + "/"); + } + return levels.iterator(); + } else if (path.equals("resources/corebundles")) { + List<String> empty = Collections.emptyList(); + return empty.iterator(); + } else { + try { + int i = Integer.parseInt(path); + List<String> bundles = new ArrayList<String>(); + for (StartLevel level : getBundleList().getStartLevels()) { + if (level.getLevel() == i) { + for (Bundle bundle : level.getBundles()) { + ArtifactDefinition d = new ArtifactDefinition(bundle, i); + try { + Artifact artifact = getArtifact(d); + bundles.add(artifact.getFile().toURI().toURL().toExternalForm()); + } catch (Exception e) { + getLog().error("Unable to resolve artifact ", e); + } + } + + break; + } + } + return bundles.iterator(); + + } catch (NumberFormatException e) { + getLog().warn("un-handlable path " + path); + return null; + + } + } + } + + @Override + public URL getResource(String path) { + if (path.endsWith(".properties")) { + return getClass().getResource("/" + path); + } else { + try { + return new URL(path); + } catch (MalformedURLException e) { + getLog().error("Expecting a real URL", e); + return null; + } + } + } + }; + + private Thread shutdown = new Thread() { + /** + * Called when the Java VM is being terminiated, for example because the + * KILL signal has been sent to the process. This method calls stop on + * the launched Sling instance to terminate the framework before + * returning. + */ + @Override + public void run() { + getLog().info("Java VM is shutting down", null); + shutdown(); + } + + // ---------- Shutdown support for control listener and shutdown hook + + void shutdown() { + // remove the shutdown hook, will fail if called from the + // shutdown hook itself. Otherwise this prevents shutdown + // from being called again + try { + Runtime.getRuntime().removeShutdownHook(this); + } catch (Throwable t) { + // don't care for problems removing the hook + } + + // now really shutdown sling + if (sling != null) { + getLog().info("Stopping Sling", null); + sling.destroy(); + } + } + }; + + private Sling sling; + + /** + * @parameter expression="${sling.home}" default-value="sling" + */ + private String slingHome; + + /** + * @parameter default-value="true" + */ + private boolean forceBundleLoad; + + public void stopped() { + sling = null; + } + + public void updated(File tmpFile) { + // TODO - should anything happen here? + getLog().info("File updated " + tmpFile.getAbsolutePath()); + } + + /** + * {@inheritDoc} + */ + @Override + protected void executeWithArtifacts() throws MojoExecutionException, MojoFailureException { + Runtime.getRuntime().addShutdownHook(shutdown); + + try { + final Map<String, String> props = new HashMap<String, String>(); + + props.put(SharedConstants.SLING_HOME, slingHome); + + if (forceBundleLoad) { + props.put(SharedConstants.FORCE_PACKAGE_BUNDLE_LOADING, "true"); + } + + // set up and configure Felix Logger + int logLevelNum; + if (logLevel == null) { + logLevelNum = DEFAULT_LOG_LEVEL; + } else { + logLevelNum = toLogLevelInt(logLevel, DEFAULT_LOG_LEVEL); + } + props.put(LOG_LEVEL_PROP, String.valueOf(logLevelNum)); + // Display port number on console, in case HttpService doesn't + getLog().info("HTTP server port: " + httpPort); + props.put(PROP_PORT, String.valueOf(httpPort)); + + // prevent tons of needless WARN from the framework + Logger logger = new Logger(); + logger.setLogLevel(Logger.LOG_ERROR); + + // creating the instance launches the framework and we are done here + sling = new Sling(this, logger, resourceProvider, props); + + // TODO this seems hacky! + while (sling != null) { + Thread.sleep(100); + } + + } catch (BundleException be) { + getLog().error("Failed to Start OSGi framework", be); + } catch (InterruptedException e) { + } + + } + + protected void initArtifactDefinitions(Properties dependencies) { + if (jarWebSupport == null) { + jarWebSupport = new ArtifactDefinition(); + } + jarWebSupport.initDefaults(dependencies.getProperty("jarWebSupport")); + } + + /** + * Add the JAR Web Support bundle to the bundle list. + */ + @Override + protected void initBundleList(BundleList bundleList) { + bundleList.add(jarWebSupport.toBundle()); + } + +} -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
