static void modifyProfiles(File destination, Map<String, Profile> modifications) {
        final boolean inPlaceModify = destination.exists();
        File stashLocation = null;

        // Stash the original file, before we apply the changes
        if (inPlaceModify) {
            boolean stashed = false;

            try {
                // We can't use File.createTempFile, since it will always create
                // that file no matter what, and File.reNameTo does not allow
                // the destination to be an existing file
                stashLocation = new File(destination.getParentFile(),
                        destination.getName() + ".bak."
                                + UUID.randomUUID().toString());
                stashed = destination.renameTo(stashLocation);

                if (LOG.isDebugEnabled()) {
                    LOG.debug(String
                            .format("The original credentials file is stashed to loaction (%s).",
                                    stashLocation.getAbsolutePath()));
                }

            } finally {
                if (!stashed) {
                    throw new SdkClientException(
                            "Failed to stash the existing credentials file " +
                            "before applying the changes.");
                }
            }
        }

        OutputStreamWriter writer = null;
        try {
            writer = new OutputStreamWriter(new FileOutputStream(destination), StringUtils.UTF8);
            ProfilesConfigFileWriterHelper writerHelper = new ProfilesConfigFileWriterHelper(writer, modifications);

            if (inPlaceModify) {
                Scanner existingContent = new Scanner(stashLocation, StringUtils.UTF8.name());
                writerHelper.writeWithExistingContent(existingContent);
            } else {
                writerHelper.writeWithoutExistingContent();
            }

            // Make sure the output is valid and can be loaded by the loader
            new ProfilesConfigFile(destination);

            if ( inPlaceModify && !stashLocation.delete() ) {
                if (LOG.isDebugEnabled()) {
                    LOG.debug(String
                            .format("Successfully modified the credentials file. But failed to " +
                                    "delete the stashed copy of the original file (%s).",
                                    stashLocation.getAbsolutePath()));
                }
            }

        } catch (Exception e) {
            // Restore the stashed file
            if (inPlaceModify) {
                boolean restored = false;

                try {
                    // We don't really care about what destination.delete()
                    // returns, since the file might not have been created when
                    // the error occurred.
                    if ( !destination.delete() ) {
                        LOG.debug("Unable to remove the credentials file "
                                + "before restoring the original one.");
                    }
                    restored = stashLocation.renameTo(destination);
                } finally {
                    if (!restored) {
                        throw new SdkClientException(
                                "Unable to restore the original credentials file. " +
                                "File content stashed in " + stashLocation.getAbsolutePath());
                    }
                }
            }

            throw new SdkClientException(
                    "Unable to modify the credentials file. " +
                    "(The original file has been restored.)",
                    e);

        } finally {
            try {
                if (writer != null) writer.close();
            } catch (IOException e) {}
        }
    }
static void modifyProfiles ( File destination , Map < String , Profile > modifications ) { final boolean inPlaceModify = destination . exists ( ) ; File stashLocation = null ; if ( inPlaceModify ) { boolean stashed = false ; try { stashLocation = new File ( destination . getParentFile ( ) , destination . getName ( ) + ".bak." + UUID . randomUUID ( ) . toString ( ) ) ; stashed = destination . renameTo ( stashLocation ) ; if ( LOG . isDebugEnabled ( ) ) { LOG . debug ( String . format ( "The original credentials file is stashed to loaction (%s)." , stashLocation . getAbsolutePath ( ) ) ) ; } } finally { if ( ! stashed ) { throw new SdkClientException ( "Failed to stash the existing credentials file " + "before applying the changes." ) ; } } } OutputStreamWriter writer = null ; try { writer = new OutputStreamWriter ( new FileOutputStream ( destination ) , StringUtils . UTF8 ) ; ProfilesConfigFileWriterHelper writerHelper = new ProfilesConfigFileWriterHelper ( writer , modifications ) ; if ( inPlaceModify ) { Scanner existingContent = new Scanner ( stashLocation , StringUtils . UTF8 . name ( ) ) ; writerHelper . writeWithExistingContent ( existingContent ) ; } else { writerHelper . writeWithoutExistingContent ( ) ; } new ProfilesConfigFile ( destination ) ; if ( inPlaceModify && ! stashLocation . delete ( ) ) { if ( LOG . isDebugEnabled ( ) ) { LOG . debug ( String . format ( "Successfully modified the credentials file. But failed to " + "delete the stashed copy of the original file (%s)." , stashLocation . getAbsolutePath ( ) ) ) ; } } } catch ( Exception e ) { if ( inPlaceModify ) { boolean restored = false ; try { if ( ! destination . delete ( ) ) { LOG . debug ( "Unable to remove the credentials file " + "before restoring the original one." ) ; } restored = stashLocation . renameTo ( destination ) ; } finally { if ( ! restored ) { throw new SdkClientException ( "Unable to restore the original credentials file. " + "File content stashed in " + stashLocation . getAbsolutePath ( ) ) ; } } } throw new SdkClientException ( "Unable to modify the credentials file. " + "(The original file has been restored.)" , e ) ; } finally { try { if ( writer != null ) writer . close ( ) ; } catch ( IOException e ) { } } }
A package-private method that supports all kinds of profile modification,
including renaming or deleting one or more profiles.

@param modifications
Use null key value to indicate a profile that is to be
deleted.