All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.ibm.cloud.objectstorage.auth.profile.internal.BasicProfileConfigLoader Maven / Gradle / Ivy

Go to download

A single bundled dependency that includes all service and dependent JARs with third-party libraries relocated to different namespaces.

There is a newer version: 2.13.4
Show newest version
/*
 * Copyright 2014-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 *
 *  http://aws.amazon.com/apache2.0
 *
 * or in the "license" file accompanying this file. 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.ibm.cloud.objectstorage.auth.profile.internal;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.ibm.cloud.objectstorage.SdkClientException;
import com.ibm.cloud.objectstorage.annotation.SdkInternalApi;
import com.ibm.cloud.objectstorage.util.StringUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;

/**
 * Class to load a CLI style config or credentials file. Performs only basic validation on
 * properties and profiles.
 */
@SdkInternalApi
public class BasicProfileConfigLoader {

    private static final Log LOG = LogFactory.getLog(BasicProfileConfigLoader.class);

    public static final BasicProfileConfigLoader INSTANCE = new BasicProfileConfigLoader();

    private BasicProfileConfigLoader() {
    }

    public AllProfiles loadProfiles(File file) {
        if (file == null) {
            throw new IllegalArgumentException(
                    "Unable to load AWS profiles: specified file is null.");
        }

        if (!file.exists() || !file.isFile()) {
            throw new IllegalArgumentException(
                    "AWS credential profiles file not found in the given path: " +
                    file.getAbsolutePath());
        }

        FileInputStream fis = null;
        try {
            fis = new FileInputStream(file);
            return loadProfiles(fis);
        } catch (IOException ioe) {
            throw new SdkClientException(
                    "Unable to load AWS credential profiles file at: " + file.getAbsolutePath(),
                    ioe);
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException ioe) {
                }
            }
        }
    }

    /**
     * Loads the credential profiles from the given input stream.
     *
     * @param is input stream from where the profile details are read.
     */
    private AllProfiles loadProfiles(InputStream is) throws IOException {
        ProfilesConfigFileLoaderHelper helper = new ProfilesConfigFileLoaderHelper();
        Map> allProfileProperties = helper
                .parseProfileProperties(new Scanner(is, StringUtils.UTF8.name()));

        // Convert the loaded property map to credential objects
        Map profilesByName = new LinkedHashMap();

        for (Entry> entry : allProfileProperties.entrySet()) {
            String profileName = entry.getKey();
            Map properties = entry.getValue();

            if (profileName.startsWith("profile ")) {
                LOG.warn(
                        "The legacy profile format requires the 'profile ' prefix before the profile name. " +
                        "The latest code does not require such prefix, and will consider it as part of the profile name. " +
                        "Please remove the prefix if you are seeing this warning.");
            }

            assertParameterNotEmpty(profileName,
                                    "Unable to load properties from profile: Profile name is empty.");
            profilesByName.put(profileName, new BasicProfile(profileName, properties));
        }

        return new AllProfiles(profilesByName);
    }

    /**
     * 

Asserts that the specified parameter value is neither empty nor null, and if * it is, throws a SdkClientException with the specified error message.

* * @param parameterValue The parameter value being checked. * @param errorMessage The error message to include in the SdkClientException if the * specified parameter value is empty. */ private void assertParameterNotEmpty(String parameterValue, String errorMessage) { if (StringUtils.isNullOrEmpty(parameterValue)) { throw new SdkClientException(errorMessage); } } /** * Implementation of AbstractProfilesConfigFileScanner that groups profile properties into a map * while scanning through the credentials profile. */ private static class ProfilesConfigFileLoaderHelper extends AbstractProfilesConfigFileScanner { /** * Map from the parsed profile name to the map of all the property values included the * specific profile */ protected final Map> allProfileProperties = new LinkedHashMap>(); /** * Parses the input and returns a map of all the profile properties. */ public Map> parseProfileProperties(Scanner scanner) { allProfileProperties.clear(); run(scanner); return new LinkedHashMap>(allProfileProperties); } @Override protected void onEmptyOrCommentLine(String profileName, String line) { // Ignore empty or comment line } @Override protected void onProfileStartingLine(String newProfileName, String line) { // If the same profile name has already been declared, clobber the // previous one allProfileProperties.put(newProfileName, new HashMap()); } @Override protected void onProfileEndingLine(String prevProfileName) { // No-op } @Override protected void onProfileProperty(String profileName, String propertyKey, String propertyValue, boolean isSupportedProperty, String line) { Map properties = allProfileProperties.get(profileName); if (properties.containsKey(propertyKey)) { throw new IllegalArgumentException( "Duplicate property values for [" + propertyKey + "]."); } properties.put(propertyKey, propertyValue); } @Override protected void onEndOfFile() { // No-op } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy