/*
 * 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.logging.log4j.core.config.plugins.osgi;

import java.util.concurrent.atomic.AtomicReference;

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.plugins.util.PluginManager;
import org.apache.logging.log4j.core.util.BundleResourceLoader;
import org.apache.logging.log4j.status.StatusLogger;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleEvent;
import org.osgi.framework.SynchronousBundleListener;

/**
 * OSGi BundleActivator.
 */
public final class Activator implements org.osgi.framework.BundleActivator {

    private static final Logger LOGGER = StatusLogger.getLogger();

    private final AtomicReference<BundleContext> context = new AtomicReference<BundleContext>();

    @Override
    public void start(final BundleContext context) throws Exception {
        if (this.context.compareAndSet(null, context)) {
            context.addBundleListener(new Listener());
            // done after the BundleListener as to not miss any new bundle installs in the interim
            scanInstalledBundlesForPlugins(context);
        }
    }

    private static void scanInstalledBundlesForPlugins(final BundleContext context) {
        final Bundle[] bundles = context.getBundles();
        for (final Bundle bundle : bundles) {
            if (bundle.getState() == Bundle.ACTIVE) {
                // TODO: bundle state can change during this
                scanBundleForPlugins(bundle);
            }
        }
    }

    private static void scanBundleForPlugins(final Bundle bundle) {
        LOGGER.debug("Scanning bundle [{}] for plugins.", bundle.getSymbolicName());
        PluginManager.loadPlugins(new BundleResourceLoader(bundle));
    }

    @Override
    public void stop(final BundleContext context) throws Exception {
        // not much can be done that isn't already automated by the framework
        this.context.compareAndSet(context, null);
    }

    private static class Listener implements SynchronousBundleListener {

        @Override
        public void bundleChanged(final BundleEvent event) {
            switch (event.getType()) {
                case BundleEvent.STARTED:
                    scanBundleForPlugins(event.getBundle());
                    break;

                default:
                    break;
            }
        }
    }
}

@@ -1171,16 +1171,59 @@
 Bundle;%0A
+import org.osgi.framework.BundleActivator;%0A
 import o
@@ -1425,41 +1425,49 @@
 nts 
-org.osgi.framework.BundleActivato
+BundleActivator, SynchronousBundleListene
 r %7B%0A
@@ -1816,22 +1816,12 @@
 ner(
-new Listener()
+this
 );%0A 
@@ -2454,13 +2454,13 @@
 GER.
-debug
+trace
 (%22Sc
@@ -2819,86 +2819,8 @@
  %7D%0A%0A
-    private static class Listener implements SynchronousBundleListener %7B%0A%0A    
     
@@ -2833,20 +2833,16 @@
 ide%0A    
- 
-   
 public v
@@ -2859,22 +2859,16 @@
 Changed(
-final 
 BundleEv
@@ -2876,28 +2876,24 @@
 nt event) %7B%0A
-    
         swit
@@ -2927,20 +2927,16 @@
         
-   
- 
 case Bun
@@ -2953,20 +2953,16 @@
 TARTED:%0A
-    
         
@@ -3030,20 +3030,16 @@
     
-    
 break;%0A%0A
     
@@ -3034,20 +3034,16 @@
 break;%0A%0A
-    
         
@@ -3075,33 +3075,15 @@
     
-   
- 
 break;%0A
-            %7D%0A
     

Remove inner class in bundle activator.