Package io.fabric8.fab.osgi.commands.module

Source Code of io.fabric8.fab.osgi.commands.module.InstallCommand

/**
*  Copyright 2005-2014 Red Hat, Inc.
*
*  Red Hat 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 io.fabric8.fab.osgi.commands.module;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;

import org.apache.felix.gogo.commands.Argument;
import org.apache.felix.gogo.commands.Command;
import org.apache.felix.gogo.commands.Option;
import io.fabric8.fab.ModuleRegistry;
import io.fabric8.fab.VersionedDependencyId;
import io.fabric8.fab.osgi.commands.CommandSupport;
import io.fabric8.fab.osgi.internal.Activator;
import io.fabric8.fab.osgi.internal.OsgiModuleRegistry;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleException;

import static io.fabric8.utils.Strings.join;

@Command(name = "install", scope = "module", description = "Install a module")
public class InstallCommand extends CommandSupport {

    @Argument(index = 0, required = true, description = "Name of the module to install")
    private String name;

    @Argument(index = 1, required = false, description = "Extensions to enable or disable", multiValued = true)
    private String extensions[] = new String[]{};

    @Option(name = "--version", description = "Version to install")
    private String version;

    @Option(name = "--force", description = "Force install")
    private boolean force;

    @Option(name = "--no-start", description = "Do not start the module once installed")
    private boolean noStart;

    @Override
    protected Object doExecute() throws Exception {
        OsgiModuleRegistry registry = getModuleRegistry();
        List<ModuleRegistry.Module> modules = registry.getApplicationModules();
        Map<VersionedDependencyId, Bundle> installed = registry.getInstalled();
        for (ModuleRegistry.Module module : modules) {
            if( name.equals(module.getName()) ) {
                HashSet<VersionedDependencyId> s = new HashSet<VersionedDependencyId>(module.getVersionIds());
                s.retainAll(installed.keySet());
                boolean isInstalled = !s.isEmpty();
                if( isInstalled && !force) {
                    throw new Exception("The module is already installed");
                }

                ModuleRegistry.VersionedModule versionedModule = null;
                if( version!=null ) {
                    versionedModule = module.getVersions().get(version);
                    if( versionedModule ==null ) {
                        throw new Exception("Invalid version: "+version);
                    }
                } else {
                    versionedModule = module.latest();
                }

                VersionedDependencyId id = versionedModule.getId();
                String v = version!=null ? version : id.getVersion();

                List<String> extensionAdjustments = Arrays.asList(extensions);
                if( !extensionAdjustments.isEmpty() ) {
                    List<String> enabled = new ArrayList<String>(versionedModule.getDefaultExtensions());
                    for (String adjustment : extensionAdjustments) {
                        if( adjustment.startsWith("+") ) {
                            String name = adjustment.substring(1);
                            enabled.add(name);
                        } else if( adjustment.startsWith("-") ) {
                            String name = adjustment.substring(1);
                            enabled.remove(name);
                        } else {
                            throw new IllegalArgumentException("Expected extension argument '"+adjustment+"' to be prefixed with '+' or '-'");
                        }
                    }
                    versionedModule.setEnabledExtensions(enabled);
                    if( !enabled.isEmpty() ) {
                        println("Enabling extensions: "+join(enabled, ", "));
                    }
                }
                //

                String url = "fab:mvn:"+id.getGroupId()+"/"+id.getArtifactId()+"/"+v+"/"+id.getExtension()+
                        (id.getClassifier()==null ? "" : "/"+id.getClassifier());

                println("Installing: "+url);

                Bundle bundle = install(url);
                if( bundle!=null ) {
                    println("Installed bundle: %d", bundle.getBundleId());
                    if( !noStart ) {
                        bundle.start();
                    }
                }
            }
        }

        return null;
    }

    protected Bundle install(String location) {
        try {
            return getBundleContext().installBundle(location, null);
        } catch (BundleException ex) {
            if (ex.getNestedException() != null) {
                println(ex.getNestedException().toString());
            } else {
                println(ex.toString());
            }
        } catch (Exception ex) {
            println(ex.toString());
        }
        return null;
    }
}
TOP

Related Classes of io.fabric8.fab.osgi.commands.module.InstallCommand

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.