Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
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.commands;
 
 import java.util.List;
 import java.util.Map;
 
 import jline.Terminal;
 
 import  org.apache.felix.gogo.commands.Argument;
 import  org.apache.felix.gogo.commands.Command;
 import  org.apache.felix.gogo.commands.Option;
 
 
 import  org.apache.karaf.shell.console.AbstractAction;
 
 @Command(name = "profile-edit", scope = "fabric", description = "Edits the specified version of the specified profile (where the version defaults to the current default version)", detailedDescription = "classpath:profileEdit.txt")
 public class ProfileEditAction extends AbstractAction {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(ProfileEditAction.class);
 
     static final String FEATURE_PREFIX = "feature.";
     static final String REPOSITORY_PREFIX = "repository.";
     static final String BUNDLE_PREFIX = "bundle.";
     static final String FAB_PREFIX = "fab.";
     static final String OVERRIDE_PREFIX = "override.";
     static final String CONFIG_PREFIX = "config.";
     static final String SYSTEM_PREFIX = "system.";
     static final String LIB_PREFIX = "lib.";
     static final String ENDORSED_PREFIX = "endorsed.";
     static final String EXT_PREFIX = "ext.";
     static final String DELIMITER = ",";
     static final String PID_KEY_SEPARATOR = "/";
 
     static final String FILE_INSTALL_FILENAME_PROPERTY = "felix.fileinstall.filename";
 
 
     @Option(name = "-r", aliases = {"--repositories"}, description = "Edit the features repositories. To specify multiple repositories, specify this flag multiple times.", required = false, multiValued = true)
     private String[] repositories;
 
     @Option(name = "-f", aliases = {"--features"}, description = "Edit features. To specify multiple features, specify this flag multiple times. For example, --features foo --features bar.", required = false, multiValued = true)
     private String[] features;
 
     @Option(name = "-l", aliases = {"--libs"}, description = "Edit libraries. To specify multiple libraries, specify this flag multiple times.", required = false, multiValued = true)
     private String[] libs;
 
     @Option(name = "-n", aliases = {"--endorsed"}, description = "Edit endorsed libraries. To specify multiple libraries, specify this flag multiple times.", required = false, multiValued = true)
     private String[] endorsed;
 
     @Option(name = "-x", aliases = {"--extension"}, description = "Edit extension libraries. To specify multiple libraries, specify this flag multiple times.", required = false, multiValued = true)
     private String[] extension;
 
     @Option(name = "-b", aliases = {"--bundles"}, description = "Edit bundles. To specify multiple bundles, specify this flag multiple times.", required = false, multiValued = true)
     private String[] bundles;
 
     @Option(name = "--fabs", description = "Edit fabs. To specify multiple fabs, specify this flag multiple times.", required = false, multiValued = true)
     private String[] fabs;
 
     @Option(name = "-o", aliases = {"--overrides"}, description = "Edit overrides. To specify multiple libraries, specify this flag multiple times.", required = false, multiValued = true)
     private String[] overrides;
 
     @Option(name = "-p", aliases = {"--pid"}, description = "Edit an OSGi configuration property, specified in the format <PID>/<Property>. To specify multiple properties, specify this flag multiple times.", required = false, multiValued = true)
     private String[] pidProperties;
 
     @Option(name = "-s", aliases = {"--system"}, description = "Edit the Java system properties that affect installed bundles (analogous to editing etc/system.properties in a root container).", required = false, multiValued = true)
     private String[] systemProperties;
    @Option(name = "-c", aliases = {"--config"}, description = "Edit the Java system properties that affect the karaf container (analogous to editing etc/config.properties in a root container).", required = false, multiValued = true)
    private String[] configProperties;
    @Option(name = "-i", aliases = {"--import-pid"}, description = "Imports the pids that are edited, from local OSGi config admin", required = false, multiValued = false)
    private boolean importPid = false;
    @Option(name = "--resource", description = "Selects a resource under the profile to edit. This option should only be used alone.", required = false, multiValued = false)
    private String resource;
    @Option(name = "--set", description = "Set or create values (selected by default).")
    private boolean set = true;
    @Option(name = "--delete", description = "Delete values. This option can be used to delete a feature, a bundle or a pid from the profile.")
    private boolean delete = false;
    @Option(name = "--append", description = "Append value to a delimited list. It is only usable with the system, config & pid options")
    private boolean append = false;
    @Option(name = "--remove", description = "Removes value from a delimited list. It is only usable with the system, config & pid options")
    private boolean remove = false;
    @Option(name = "--delimiter", description = "Specifies the delimiter to use for appends and removals.")
    private String delimiter = ",";
    @Argument(index = 0, name = "profile", description = "The target profile to edit", required = true, multiValued = false)
    private String profileName;
    @Argument(index = 1, name = "version", description = "The version of the profile to edit. Defaults to the current default version.", required = false, multiValued = false)
    private String versionName;
    private final FabricService fabricService;
    private final ConfigurationAdmin configurationAdmin;
    private final EditorFactory editorFactory;
    ProfileEditAction(FabricService fabricServiceConfigurationAdmin configurationAdminEditorFactory editorFactory) {
        this. = fabricService;
        this. = configurationAdmin;
        this. = editorFactory;
    }
    @Override
    protected Object doExecute() throws Exception {
        FabricValidations.validateProfileName();
        if () {
             = false;
        }
        Version version =  != null ? .getVersion() : .getDefaultVersion();
        for (Profile profile : version.getProfiles()) {
            if (.equals(profile.getId())) {
                editProfile(profile);
            }
        }
        return null;
    }
    private void editProfile(Profile profilethrows Exception {
        boolean editInLine = false;
        if ( || ) {
            editInLine = true;
        }
        if ( != null && . > 0) {
            editInLine = true;
            handleFeatures(profile);
        }
        if ( != null && . > 0) {
            editInLine = true;
            handleFeatureRepositories(profile);
        }
        if ( != null && . > 0) {
            editInLine = true;
            handleLibraries(profile"lib");
        }
        if ( != null && . > 0) {
            editInLine = true;
            handleLibraries(profile"endorsed lib");
        }
        if ( != null && . > 0) {
            editInLine = true;
            handleLibraries(profile"extension lib");
        }
        if ( != null && . > 0) {
            editInLine = true;
            handleBundles(profile);
        }
        if ( != null && . > 0) {
            editInLine = true;
            handleFabs(profile);
        }
        if ( != null && . > 0) {
            editInLine = true;
            handleOverrides(profile);
        }
        if ( != null && . > 0) {
            editInLine = handlePid(profile);
        }
        if ( != null && . > 0) {
            editInLine = true;
            handleSystemProperties(profile);
        }
        if ( != null && . > 0) {
            editInLine = true;
            handleConfigProperties(profile);
        }
        if (!editInLine) {
             =  != null ?  : "io.fabric8.agent.properties";
            //If a single pid has been selected, but not a key value has been specified or import has been selected,
            //then open the resource in the editor.
            if ( != null && . == 1) {
                 = [0] + ".properties";
            }
            openInEditor(profile);
        }
    }

    
Adds or remove the specified features to the specified profile.

Parameters:
features The array of feature names.
profile The target profile.
    private void handleFeatures(String[] featuresProfile profile) {
        Map<StringStringconf = profile.getConfiguration(.);
        for (String feature : features) {
            if () {
                ..println("Deleting feature:" + feature + " from profile:" + profile.getId() + " version:" + profile.getVersion());
            } else {
                ..println("Adding feature:" + feature + " to profile:" + profile.getId() + " version:" + profile.getVersion());
            }
            updateConfig(conf + feature.replace('/''_'), feature);
            profile.setConfiguration(.conf);
        }
    }

    
Adds or remove the specified feature repositories to the specified profile.

Parameters:
repositories The array of feature repositories.
profile The target profile.
    private void handleFeatureRepositories(String[] repositoriesProfile profile) {
        Map<StringStringconf = profile.getConfiguration(.);
        for (String repositoryURI : repositories) {
            if () {
                ..println("Adding feature repository:" + repositoryURI + " to profile:" + profile.getId() + " version:" + profile.getVersion());
            } else if () {
                ..println("Deleting feature repository:" + repositoryURI + " from profile:" + profile.getId() + " version:" + profile.getVersion());
            }
            updateConfig(conf + repositoryURI.replace('/''_'), repositoryURI);
        }
        profile.setConfiguration(.conf);
    }

    
Adds or remove the specified libraries to the specified profile.

Parameters:
libs The array of libs.
profile The target profile.
libType The type of lib. Used just for the command output.
libPrefix The prefix of the lib.
    private void handleLibraries(String[] libsProfile profileString libTypeString libPrefix) {
        Map<StringStringconf = profile.getConfiguration(.);
        for (String lib : libs) {
            if () {
                ..println("Adding "+libType+":" + lib + " to profile:" + profile.getId() + " version:" + profile.getVersion());
            } else if () {
                ..println("Deleting "+libType+":" + lib + " from profile:" + profile.getId() + " version:" + profile.getVersion());
            }
            updateConfig(conflibPrefix + lib.replace('/''_'), lib);
        }
        profile.setConfiguration(.conf);
    }

    
Adds or remove the specified bundles to the specified profile.

Parameters:
bundles The array of bundles.
profile The target profile.
    private void handleBundles(String[] bundlesProfile profile) {
        Map<StringStringconf = profile.getConfiguration(.);
        for (String bundle : bundles) {
            if () {
                ..println("Adding bundle:" + bundle + " to profile:" + profile.getId() + " version:" + profile.getVersion());
            } else if () {
                ..println("Deleting bundle:" + bundle + " from profile:" + profile.getId() + " version:" + profile.getVersion());
            }
            updateConfig(conf + bundle.replace('/''_'), bundle);
        }
        profile.setConfiguration(.conf);
    }

    
Adds or remove the specified fabs to the specified profile.

Parameters:
fabs The array of fabs.
profile The target profile.
    private void handleFabs(String[] fabsProfile profile) {
        Map<StringStringconf = profile.getConfiguration(.);
        for (String fab : fabs) {
            if () {
                ..println("Adding FAB:" + fab + " to profile:" + profile.getId() + " version:" + profile.getVersion());
            } else if () {
                ..println("Deleting FAB:" + fab + " from profile:" + profile.getId() + " version:" + profile.getVersion());
            }
            updateConfig(conf + fab.replace('/''_'), fab);
        }
        profile.setConfiguration(.conf);
    }

    
Adds or remove the specified overrides to the specified profile.

Parameters:
overrides The array of overrides.
profile The target profile.
    private void handleOverrides(String[] overridesProfile profile) {
        Map<StringStringconf = profile.getConfiguration(.);
        for (String overrie : overrides) {
            if () {
                ..println("Adding override:" + overrie + " to profile:" + profile.getId() + " version:" + profile.getVersion());
            } else if () {
                ..println("Deleting override:" + overrie + " from profile:" + profile.getId() + " version:" + profile.getVersion());
            }
            updateConfig(conf + overrie.replace('/''_'), overrie);
        }
        profile.setConfiguration(.conf);
    }

    
Adds or remove the specified system properties to the specified profile.

Parameters:
pidProperties The array of system properties.
profile The target profile.
Returns:
True if the edit can take place in line.
    private boolean handlePid(String[] pidPropertiesProfile profile) {
        boolean editInline = true;
        for (String pidProperty : pidProperties) {
            String currentPid = null;
            String keyValuePair = "";
            if (pidProperty.contains()) {
                currentPid = pidProperty.substring(0, pidProperty.indexOf());
                keyValuePair = pidProperty.substring(pidProperty.indexOf() + 1);
            } else {
                currentPid = pidProperty;
            }
            Map<StringStringconf = profile.getConfiguration(currentPid);
            //We only support import when a single pid is specified
            if (pidProperties.length == 1 && ) {
                ..println("Importing pid:" + currentPid + " to profile:" + profile.getId() + " version:" + profile.getVersion());
                importPidFromLocalConfigAdmin(currentPidconf);
                profile.setConfiguration(currentPidconf);
                return true;
            }
            Map<StringStringconfigMap = extractConfigs(keyValuePair);
            if (configMap.isEmpty() && ) {
                editInline = false;
            } else if (configMap.isEmpty() && ) {
                editInline = true;
                ..println("Deleting pid:" + currentPid + " from profile:" + profile.getId() + " version:" + profile.getVersion());
                Map<StringMap<String,String>> profileConfigs = profile.getConfigurations();
                profileConfigs.remove(currentPid);
                profile.setConfigurations(profileConfigs);
            } else {
                for (Map.Entry<StringStringconfigEntries : configMap.entrySet()) {
                    String key = configEntries.getKey();
                    String value = configEntries.getValue();
                    if (value == null && ) {
                        ..println("Deleting key:" + key + " from pid:" + currentPid + " and profile:" + profile.getId() + " version:" +  profile.getVersion());
                        conf.remove(key);
                    } else {
                        if () {
                            ..println("Appending value:" + value + " key:" + key + " to pid:" + currentPid + " and profile:" + profile.getId() + " version:" +  profile.getVersion());
                        } else if () {
                            ..println("Removing value:" + value + " key:" + key + " from pid:" + currentPid + " and profile:" + profile.getId() + " version:" +  profile.getVersion());
                        } else if() {
                            ..println("Setting value:" + value + " key:" + key + " on pid:" + currentPid + " and profile:" + profile.getId() + " version:" +  profile.getVersion());
                        }
                        updatedDelimitedList(confkeyvalue);
                    }
                }
                editInline = true;
                profile.setConfiguration(currentPidconf);
            }
        }
        return editInline;
    }


    
Adds or remove the specified system properties to the specified profile.

Parameters:
systemProperties The array of system properties.
profile The target profile.
    private void handleSystemProperties(String[] systemPropertiesProfile profile) {
        Map<StringStringconf = profile.getConfiguration(.);
        for (String systemProperty : systemProperties) {
            Map<StringStringconfigMap = extractConfigs(systemProperty);
            for (Map.Entry<StringStringconfigEntries : configMap.entrySet()) {
                String key = configEntries.getKey();
                String value = configEntries.getValue();
                if () {
                    ..println("Appending value:" + value + " key:" + key + " from system properties and profile:" + profile.getId() + " version:" + profile.getVersion());
                } else if () {
                    ..println("Deleting key:" + key + " from system properties and profile:" + profile.getId() + " version:" + profile.getVersion());
                } else if () {
                    ..println("Setting value:" + value + " key:" + key + " from system properties and profile:" + profile.getId() + " version:" + profile.getVersion());
                } else {
                    ..println("Removing value:" + value + " key:" + key + " from system properties and profile:" + profile.getId() + " version:" + profile.getVersion());
                }
                updatedDelimitedList(conf + keyvalue);
            }
        }
        profile.setConfiguration(.conf);
    }

    
Adds or remove the specified config properties to the specified profile.

Parameters:
configProperties The array of config properties.
profile The target profile.
    private void handleConfigProperties(String[] configPropertiesProfile profile) {
        Map<StringStringconf = profile.getConfiguration(.);
        for (String configProperty : configProperties) {
            Map<StringStringconfigMap = extractConfigs(configProperty);
            for (Map.Entry<StringStringconfigEntries : configMap.entrySet()) {
                String key = configEntries.getKey();
                String value = configEntries.getValue();
                if () {
                    ..println("Appending value:" + value + " key:" + key + " from config properties and profile:" + profile + " version:" + );
                } else if () {
                    ..println("Deleting key:" + key + " from config properties and profile:" + profile + " version:" + );
                } else if () {
                    ..println("Setting value:" + value + " key:" + key + " from config properties and profile:" + profile + " version:" + );
                }
                updatedDelimitedList(conf + keyvalue);
            }
        }
        profile.setConfiguration(.conf);
    }
    private void openInEditor(Profile profileString resourcethrows Exception {
        String id = profile.getId();
        String version = profile.getVersion();
        String location = id + " " + version + " " + resource;
        //Call the editor
        ConsoleEditor editor = .create("simple",getTerminal(), ..);
        editor.setTitle("Profile");
        editor.setOpenEnabled(false);
        editor.open(locationid + " " + version);
        editor.start();
    }
    public void updatedDelimitedList(Map<StringStringmapString keyString valueString delimiterboolean setboolean deleteboolean appendboolean remove) {
        if (append || remove) {
            String oldValue = map.containsKey(key) ? map.get(key) : "";
            List<Stringparts = new LinkedList<String>(Arrays.asList(oldValue.split(delimiter)));
            //We need to remove any possible blanks.
            parts.remove("");
            if (append) {
                parts.add(value);
            }
            if (remove) {
                parts.remove(value);
            }
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < parts.size(); i++) {
                if (i != 0) {
                    sb.append(delimiter);
                }
                sb.append(parts.get(i));
            }
            map.put(keysb.toString());
        } else if (set) {
            map.put(keyvalue);
        } else if (delete) {
            map.remove(key);
        }
    }
    public void updateConfig(Map<StringStringmapString keyString valueboolean setboolean delete) {
        if (set) {
            map.put(keyvalue);
        } else if (delete) {
            map.remove(key);
        }
    }

    
Imports the pid to the target Map.

Parameters:
pid
target
    private void importPidFromLocalConfigAdmin(String pidMap<StringStringtarget) {
        try {
            Configuration[] configuration = .listConfigurations("(service.pid=" + pid + ")");
            if (configuration != null && configuration.length > 0) {
                Dictionary dictionary = configuration[0].getProperties();
                Enumeration keyEnumeration = dictionary.keys();
                while (keyEnumeration.hasMoreElements()) {
                    String key = String.valueOf(keyEnumeration.nextElement());
                    //file.install.filename needs to be skipped as it specific to the current container.
                    if (!key.equals()) {
                        String value = String.valueOf(dictionary.get(key));
                        target.put(keyvalue);
                    }
                }
            }
        } catch (Exception e) {
            .warn("Error while importing configuration {} to profile."pid);
        }
    }

    
Extracts Key value pairs from a delimited string of key value pairs. Note: The value may contain commas.

Parameters:
configs
Returns:
    private Map<StringStringextractConfigs(String configs) {
        Map<StringStringconfigMap = new HashMap<StringString>();
        //If contains key values.
        String key = null;
        String value = null;
        if (configs.contains("=")) {
            key = configs.substring(0, configs.indexOf("="));
            value = configs.substring(configs.indexOf("=") + 1);
        }  else {
            key = configs;
            value = null;
        }
        if (key != null && !key.isEmpty()) {
            configMap.put(keyvalue);
        }
        return configMap;
    }

    
Gets the jline.Terminal from the current session.

Returns:
Throws:
Exception
    private Terminal getTerminal() throws Exception {
        Object terminalObject = session.get(".jline.terminal");
        if (terminalObject instanceof Terminal) {
            return (TerminalterminalObject;
        }
        throw new IllegalStateException("Could not get Terminal from CommandSession.");
    }
New to GrepCode? Check out our FAQ X