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 ) { } } }
A package - private method that supports all kinds of profile modification including renaming or deleting one or more profiles .