SLING-2376 : New Startup Features

git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1233447 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/pom.xml b/pom.xml
index 71b2261..d8ded26 100644
--- a/pom.xml
+++ b/pom.xml
@@ -55,13 +55,13 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.launchpad.api</artifactId>
-            <version>1.0.0</version>
+            <version>1.0.1-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.installer.core</artifactId>
-            <version>3.2.2</version>
+            <version>3.3.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
diff --git a/src/main/java/org/apache/sling/launchpad/installer/impl/LaunchpadListener.java b/src/main/java/org/apache/sling/launchpad/installer/impl/LaunchpadListener.java
new file mode 100644
index 0000000..22836a1
--- /dev/null
+++ b/src/main/java/org/apache/sling/launchpad/installer/impl/LaunchpadListener.java
@@ -0,0 +1,47 @@
+/*
+ * 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.launchpad.installer.impl;
+
+import org.apache.sling.installer.api.event.InstallationEvent;
+import org.apache.sling.installer.api.event.InstallationListener;
+import org.apache.sling.launchpad.api.StartupHandler;
+
+public class LaunchpadListener implements InstallationListener {
+
+    private final StartupHandler startupHandler;
+
+    private volatile boolean started = false;
+
+    public LaunchpadListener(final StartupHandler startupHandler) {
+        this.startupHandler = startupHandler;
+    }
+
+    /**
+     * @see org.apache.sling.installer.api.event.InstallationListener#onEvent(org.apache.sling.installer.api.event.InstallationEvent)
+     */
+    public void onEvent(final InstallationEvent event) {
+        if ( event.getType() == InstallationEvent.TYPE.STARTED ) {
+            this.startupHandler.waitWithStartup(true);
+            started = true;
+        } else if ( event.getType() == InstallationEvent.TYPE.SUSPENDED ) {
+            if ( started ) {
+                this.startupHandler.waitWithStartup(false);
+            }
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/launchpad/installer/impl/ServicesListener.java b/src/main/java/org/apache/sling/launchpad/installer/impl/ServicesListener.java
index 170c2d0..6d7f08c 100644
--- a/src/main/java/org/apache/sling/launchpad/installer/impl/ServicesListener.java
+++ b/src/main/java/org/apache/sling/launchpad/installer/impl/ServicesListener.java
@@ -19,13 +19,16 @@
 package org.apache.sling.launchpad.installer.impl;
 
 import org.apache.sling.installer.api.OsgiInstaller;
+import org.apache.sling.installer.api.event.InstallationListener;
 import org.apache.sling.launchpad.api.LaunchpadContentProvider;
+import org.apache.sling.launchpad.api.StartupHandler;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceEvent;
 import org.osgi.framework.ServiceListener;
 import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
 
 /**
  * The <code>ServicesListener</code> listens for the required services
@@ -43,12 +46,21 @@
     /** The listener for the provider. */
     private final Listener providerListener;
 
+    /** The listener for the startup handler. */
+    private final Listener startupListener;
+
+    private ServiceRegistration launchpadListenerReg;
+
+    private volatile boolean installed = false;
+
     public ServicesListener(final BundleContext bundleContext) {
         this.bundleContext = bundleContext;
         this.installerListener = new Listener(OsgiInstaller.class.getName());
         this.providerListener = new Listener(LaunchpadContentProvider.class.getName());
+        this.startupListener = new Listener(StartupHandler.class.getName());
         this.installerListener.start();
         this.providerListener.start();
+        this.startupListener.start();
     }
 
     public synchronized void notifyChange() {
@@ -57,7 +69,22 @@
         final LaunchpadContentProvider lcp = (LaunchpadContentProvider)this.providerListener.getService();
 
         if ( installer != null && lcp != null ) {
-            LaunchpadConfigInstaller.install(installer, lcp);
+            if ( !installed ) {
+                installed = true;
+                LaunchpadConfigInstaller.install(installer, lcp);
+            }
+        }
+        final StartupHandler handler = (StartupHandler)this.startupListener.getService();
+        if ( handler != null ) {
+            if ( launchpadListenerReg == null ) {
+                final LaunchpadListener launchpadListener = new LaunchpadListener(handler);
+                launchpadListenerReg = this.bundleContext.registerService(InstallationListener.class.getName(), launchpadListener, null);
+            }
+        } else {
+            if ( launchpadListenerReg != null ) {
+                launchpadListenerReg.unregister();
+                launchpadListenerReg = null;
+            }
         }
     }
 
@@ -67,6 +94,7 @@
     public void deactivate() {
         this.installerListener.deactivate();
         this.providerListener.deactivate();
+        this.startupListener.deactivate();
     }
 
     protected final class Listener implements ServiceListener {