/*
 * Copyright (c) 2009, 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package org.glassfish.extras.osgicontainer;

import org.glassfish.api.deployment.Deployer;
import org.glassfish.api.deployment.DeploymentContext;
import org.glassfish.api.deployment.MetaData;
import org.glassfish.api.deployment.OpsParams;
import org.jvnet.hk2.annotations.Service;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.BundleReference;
import org.osgi.service.packageadmin.PackageAdmin;

import java.io.File;

/**
 * OSGi deployer, takes care of loading and cleaning modules from the OSGi runtime.
 *
 * @author Jerome Dochez
 * @author Sanjeeb Sahoo
 */
@Service
public class OSGiDeployer implements Deployer<OSGiContainer, OSGiDeployedBundle> {

    public OSGiDeployedBundle load(OSGiContainer container, DeploymentContext context) {
        return new OSGiDeployedBundle(getApplicationBundle(context, true));
    }

    public void unload(OSGiDeployedBundle appContainer, DeploymentContext context) {
    }

    public void clean(DeploymentContext context) {
        try {
            OpsParams params = context.getCommandParameters(OpsParams.class);
            // we should clean for both undeployment and the failed deployment
            if (params.origin.isUndeploy() || params.origin.isDeploy()) {
                Bundle bundle = getApplicationBundle(context);
                bundle.uninstall();
                getPA().refreshPackages(new Bundle[]{bundle});
                System.out.println("Uninstalled " + bundle);
            }
        } catch (BundleException e) {
            throw new RuntimeException(e);
        }
    }

    private PackageAdmin getPA() {
        final BundleContext context = getBundleContext();
        return (PackageAdmin) context.getService(context.getServiceReference(PackageAdmin.class.getName()));
    }

    public MetaData getMetaData() {
        return null;
    }

    public <V> V loadMetaData(Class<V> type, DeploymentContext context) {
        return null;
    }

    public boolean prepare(DeploymentContext context) {
        File file = context.getSourceDir();
        OpsParams params = context.getCommandParameters(OpsParams.class);
        if (params.origin.isDeploy()) {
            assert(file.isDirectory());
            installBundle(makeBundleLocation(file));
        }
        return true;
    }

    private Bundle installBundle(final String location) {
        try {
            Bundle bundle = getBundleContext().installBundle(location);
            System.out.println("Installed " + bundle + " from " + bundle.getLocation());
            return bundle;
        } catch (BundleException e) {
            throw new RuntimeException(e);
        }
    }

    private BundleContext getBundleContext() {
        return BundleReference.class.cast(getClass().getClassLoader()).getBundle().getBundleContext();
    }

    private Bundle getApplicationBundle(DeploymentContext context, boolean reinstallIfAbsent) {
        String location = makeBundleLocation(context.getSourceDir());
        for(Bundle b : getBundleContext().getBundles()) {
            if (location.equals(b.getLocation())) {
                return b;
            }
        }
        if (reinstallIfAbsent) {
            System.out.println("Bundle does not exist, so reinstalling from " + location);
            return installBundle(location);
        }
        throw new RuntimeException("Unable to determine bundle corresponding to application location " + context.getSourceDir());
    }

    private Bundle getApplicationBundle(DeploymentContext context) {
        return getApplicationBundle(context, false);
    }

    private String makeBundleLocation(File file) {
        return "reference:" + file.toURI();
    }

}
