/** * Licensed to jclouds, Inc. (jclouds) under one or more * contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. jclouds 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.jclouds.karaf.services.modules; import java.io.IOException; import java.util.Collection; import java.util.Dictionary; import java.util.Enumeration; import java.util.LinkedHashMap; import java.util.Map; import java.util.Properties; import java.util.Set; import org.jclouds.domain.Credentials; import org.jclouds.karaf.core.CredentialStore; import org.jclouds.rest.ConfiguresCredentialStore; import org.osgi.service.cm.Configuration; import org.osgi.service.cm.ConfigurationAdmin; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @ConfiguresCredentialStore public class ConfigurationAdminCredentialStore extends CredentialStore { private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurationAdminCredentialStore.class); public static final String CREDENTIAL_STORE_PID = "org.jclouds.credentials"; private ConfigurationAdmin configurationAdmin; private Configuration configuration; public void init() throws IOException { this.configuration = configurationAdmin.getConfiguration(CREDENTIAL_STORE_PID); this.store = new ConfigurationAdminBacking(configuration); } /** * Configures a {@link com.google.inject.Binder} via the exposed methods. */ @Override protected void configure() { } public ConfigurationAdmin getConfigurationAdmin() { return configurationAdmin; } public void setConfigurationAdmin(ConfigurationAdmin configurationAdmin) { this.configurationAdmin = configurationAdmin; } private class ConfigurationAdminBacking implements Map<String, Credentials> { private final Configuration configuration; private final Map<String, Credentials> credentialsMap = new LinkedHashMap<String, Credentials>(); private ConfigurationAdminBacking(Configuration configuration) { this.configuration = configuration; try { Dictionary dictionary = configuration.getProperties(); if (dictionary == null) { dictionary = newDictionary(); } Enumeration keys = dictionary.keys(); while (keys.hasMoreElements()) { String key = (String) keys.nextElement(); if (key != null && key.startsWith("node#")) { String stripedKey = key.substring(0, key.lastIndexOf("/")); if (!credentialsMap.containsKey(stripedKey)) { String identityKey = stripedKey + "/identity"; String credentialKey = stripedKey + "/credential"; String identity = (String) dictionary.get(identityKey); String credential = (String) dictionary.get(credentialKey); Credentials credentials = new Credentials(identity, credential); credentialsMap.put(stripedKey, credentials); } } } configuration.update(dictionary); } catch (IOException e) { LOGGER.warn("Failed to store jclouds credentials to configuration admin.",e); } } public Dictionary newDictionary() { Dictionary dictionary = new Properties(); return dictionary; } public int size() { return credentialsMap.size(); } public boolean isEmpty() { return credentialsMap.isEmpty(); } public boolean containsKey(Object o) { return credentialsMap.containsKey(o); } public boolean containsValue(Object o) { return credentialsMap.containsValue(o); } public Credentials get(Object o) { return credentialsMap.get(o); } public Credentials put(String s, Credentials credentials) { if (credentials != null) { try { Dictionary dictionary = configuration.getProperties(); if (dictionary == null) { } String identityKey = s + "/identity"; String credentialKey = s + "/credential"; if (credentials.identity != null) { dictionary.put(identityKey, credentials.identity); } if (credentials.credential != null) { dictionary.put(credentialKey, credentials.credential); } configuration.update(dictionary); } catch (IOException e) { LOGGER.warn("Failed to store jclouds credentials to configuration admin.", e); } return credentialsMap.put(s, credentials); } return credentials; } public Credentials remove(Object o) { try { Dictionary dictionary = configuration.getProperties(); if (dictionary == null) { dictionary = newDictionary(); } String identityKey = o + "/identity"; dictionary.remove(identityKey); configuration.update(dictionary); } catch (IOException e) { LOGGER.warn("Failed to store jclouds credentials to configuration admin.", e); } return credentialsMap.remove(o); } public void putAll(Map<? extends String, ? extends Credentials> map) { for (Map.Entry<? extends String, ? extends Credentials> entry : map.entrySet()) { String s = entry.getKey(); Credentials credential = entry.getValue(); put(s,credential); } } public void clear() { try { configuration.update(newDictionary()); } catch (IOException e) { LOGGER.warn("Failed to clear configuration admin jclouds credentials store.", e); } credentialsMap.clear(); } public Set<String> keySet() { return credentialsMap.keySet(); } public Collection<Credentials> values() { return credentialsMap.values(); } public Set<Map.Entry<String, Credentials>> entrySet() { return credentialsMap.entrySet(); } @Override public boolean equals(Object o) { return credentialsMap.equals(o); } @Override public int hashCode() { return credentialsMap.hashCode(); } } }