/* * Copyright 2008-2012 Amazon Technologies, Inc. * * Licensed 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://aws.amazon.com/apache2.0 * * This file 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 com.amazonaws.eclipse.core.accounts.preferences; import org.eclipse.jface.preference.IPreferenceStore; import com.amazonaws.eclipse.core.accounts.AccountOptionalConfiguration; import com.amazonaws.eclipse.core.preferences.PreferenceConstants; /** * Concrete implementation of AccountOptionalConfiguration, which uses the * preference store instance to persist the account optional configurations. */ public class PluginPreferenceStoreAccountOptionalConfiguration extends AccountOptionalConfiguration { private final IPreferenceStore prefStore; /** The names of the preference properties relating to this account */ private final String userIdPreferenceName; private final String ec2PrivateKeyFilePreferenceName; private final String ec2CertificateFilePreferenceName; /** The property values set in memory */ private String userIdInMemory; private String ec2PrivateKeyFileInMemory; private String ec2CertificateFileInMemory; /** * @param preferenceNamePrefix * The prefix of the preference names for the optional * configurations. Legacy accounts use the internal accountId as * the prefix, while the profile-based accounts use the profile * name as the prefix. The reason for such difference is because * the profile accounts might be assigned with a new accountId * after the credentials file is reloaded for multiple times. We * want to always associate the optional configuration to the * same profile account no matter what the current accountId it * is assigned to. */ public PluginPreferenceStoreAccountOptionalConfiguration( IPreferenceStore prefStore, String preferenceNamePrefix) { if (prefStore == null) throw new IllegalAccessError("prefStore must not be null."); if (preferenceNamePrefix == null) throw new IllegalAccessError("preferenceNamePrefix must not be null."); this.prefStore = prefStore; this.userIdPreferenceName = String.format("%s:%s", preferenceNamePrefix, PreferenceConstants.P_USER_ID); this.ec2PrivateKeyFilePreferenceName = String.format("%s:%s", preferenceNamePrefix, PreferenceConstants.P_PRIVATE_KEY_FILE); this.ec2CertificateFilePreferenceName = String.format("%s:%s", preferenceNamePrefix, PreferenceConstants.P_CERTIFICATE_FILE); } @Override public String getUserId() { // User-id is stored in B64-encoded format return this.userIdInMemory != null ? this.userIdInMemory : PreferenceValueEncodingUtil.decodeString( prefStore.getString(userIdPreferenceName)); } @Override public void setUserId(String userId) { this.userIdInMemory = userId; } @Override public String getEc2PrivateKeyFile() { return this.ec2PrivateKeyFileInMemory != null ? this.ec2PrivateKeyFileInMemory : prefStore.getString(ec2PrivateKeyFilePreferenceName); } @Override public void setEc2PrivateKeyFile(String ec2PrivateKeyFile) { this.ec2PrivateKeyFileInMemory = ec2PrivateKeyFile; } @Override public String getEc2CertificateFile() { return this.ec2CertificateFileInMemory != null ? this.ec2CertificateFileInMemory : prefStore.getString(ec2CertificateFilePreferenceName); } @Override public void setEc2CertificateFile(String ec2CertificateFile) { this.ec2CertificateFileInMemory = ec2CertificateFile; } /** * Persist all the in-memory property values in the preference store. */ @Override public void save() { // Clean up the AWS User-id and store it in B64-encoded format if (userIdInMemory != null) { String newUserId = userIdInMemory.replace("-", ""); newUserId = newUserId.replace(" ", ""); prefStore.setValue(userIdPreferenceName, PreferenceValueEncodingUtil.encodeString(newUserId)); } if (ec2PrivateKeyFileInMemory != null) { prefStore.setValue(ec2PrivateKeyFilePreferenceName, ec2PrivateKeyFileInMemory); } if (ec2CertificateFileInMemory != null) { prefStore.setValue(ec2CertificateFilePreferenceName, ec2CertificateFileInMemory); } clearInMemoryValue(); } /** * Remove all the preference properties relating to this account's * optional configurations */ @Override public void delete() { prefStore.setToDefault(userIdPreferenceName); prefStore.setToDefault(ec2PrivateKeyFilePreferenceName); prefStore.setToDefault(ec2CertificateFilePreferenceName); clearInMemoryValue(); } @Override public boolean isDirty() { // For performance reason, we only check whether there exists in-memory // property values (no matter it differs from the source value or not.) return userIdInMemory != null || ec2PrivateKeyFileInMemory != null || ec2CertificateFileInMemory != null; } private void clearInMemoryValue() { userIdInMemory = null; ec2PrivateKeyFileInMemory = null; ec2CertificateFileInMemory = null; } }