/*******************************************************************************
 * Copyright (c) 2006, 2010 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *   David Knibb               initial implementation      
 *   Matthew Webster           Eclipse 3.2 changes
 *   Martin Lippert            minor changes    
 *   Martin Lippert            extracted caching service factory
 *******************************************************************************/

package org.eclipse.equinox.weaving.internal.caching.j9;

import com.ibm.oti.shared.Shared;

import org.eclipse.equinox.service.weaving.ICachingServiceFactory;
import org.eclipse.osgi.service.debug.DebugOptions;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;

/**
 * The main plugin class to be used in the desktop.
 */
public class CachingServicePlugin implements BundleActivator {

    public static boolean DEBUG;

    public static boolean verbose = Boolean
            .getBoolean("org.aspectj.osgi.verbose");

    /**
     * The constructor.
     */
    public CachingServicePlugin() {
    }

    /**
     * This method is called upon plug-in activation
     */
    public void start(final BundleContext context) throws Exception {
        if (CachingServicePlugin.DEBUG)
            System.out.println("> CachingServicePlugin.start() context="
                    + context);

        loadOptions(context);

        //are we on J9?
        if (shouldRegister()) {
            if (verbose)
                System.err
                        .println("[org.eclipse.equinox.weaving.caching.j9] info starting J9 caching service ...");
            final String name = ICachingServiceFactory.class.getName();
            final CachingServiceFactory cachingServiceFactory = new CachingServiceFactory();
            context.registerService(name, cachingServiceFactory, null);
        } else {
            if (verbose)
                System.err
                        .println("[org.eclipse.equinox.weaving.caching.j9] warning cannot start J9 caching service");
        }

        if (CachingServicePlugin.DEBUG)
            System.out.println("< CachingServicePlugin.start()");
    }

    /**
     * This method is called when the plug-in is stopped
     */
    public void stop(final BundleContext context) throws Exception {
    }

    private void loadOptions(final BundleContext context) {
        // all this is only to get the application args		
        DebugOptions service = null;
        final ServiceReference<?> reference = context
                .getServiceReference(DebugOptions.class.getName());
        if (reference != null)
            service = (DebugOptions) context.getService(reference);
        if (service == null) return;
        try {
            DEBUG = service.getBooleanOption(
                    "org.aspectj.osgi.service.caching.j9/debug", false);
        } finally {
            // we have what we want - release the service
            context.ungetService(reference);
        }
    }

    private boolean shouldRegister() {
        if (CachingServicePlugin.DEBUG)
            System.out.println("> CachingServicePlugin.shouldRegister()");

        boolean enabled;
        try {
            Class.forName("com.ibm.oti.vm.VM"); //if this fails we are not on J9
            final boolean sharing = Shared.isSharingEnabled(); //if not using shared classes we want a different adaptor
            if (CachingServicePlugin.DEBUG)
                System.out
                        .println("- CachingServicePlugin.shouldRegister() sharing="
                                + sharing);

            if (sharing) {
                enabled = true;
            } else {
                enabled = false;
            }
        } catch (final ClassNotFoundException ex) {
            if (CachingServicePlugin.DEBUG)
                System.out
                        .println("E CachingServicePlugin.shouldRegister() ex="
                                + ex);
            //not on J9
            enabled = false;
        }

        if (CachingServicePlugin.DEBUG)
            System.out.println("< CachingServicePlugin.shouldRegister() "
                    + enabled);
        return enabled;
    }

}
