# File lib/oauth/cli.rb, line 31
    def execute(stdout, stdin, stderr, arguments = [])
      @stdout = stdout
      @stdin  = stdin
      @stderr = stderr
      extract_command_and_parse_options(arguments)

      if sufficient_options? && valid_command?
        if command == "debug"
          @command = "sign"
          @options[:verbose] = true
        end

        case command
        # TODO move command logic elsewhere
        when "authorize"
          begin
            consumer = OAuth::Consumer.new \
              options[:oauth_consumer_key],
              options[:oauth_consumer_secret],
              :access_token_url  => options[:access_token_url],
              :authorize_url     => options[:authorize_url],
              :request_token_url => options[:request_token_url],
              :scheme            => options[:scheme]

            # parameters for OAuth 1.0a
            oauth_verifier = nil

            # get a request token
            request_token = consumer.get_request_token({ :oauth_callback => options[:oauth_callback] }, { :scope => options[:scope] })

            if request_token.callback_confirmed?
              stdout.puts "Server appears to support OAuth 1.0a; enabling support."
              options[:version] = "1.0a"
            end

            stdout.puts "Please visit this url to authorize:"
            stdout.puts request_token.authorize_url

            if options[:version] == "1.0a"
              stdout.puts "Please enter the verification code provided by the SP (oauth_verifier):"
              oauth_verifier = stdin.gets.chomp
            else
              stdout.puts "Press return to continue..."
              stdin.gets
            end

            begin
              # get an access token
              access_token = request_token.get_access_token(:oauth_verifier => oauth_verifier)

              stdout.puts "Response:"
              access_token.params.each do |k,v|
                stdout.puts "  #{k}: #{v}" unless k.is_a?(Symbol)
              end
            rescue OAuth::Unauthorized => e
              stderr.puts "A problem occurred while attempting to obtain an access token:"
              stderr.puts e
              stderr.puts e.request.body
            end
          rescue OAuth::Unauthorized => e
            stderr.puts "A problem occurred while attempting to authorize:"
            stderr.puts e
            stderr.puts e.request.body
          end
        when "query"
          consumer = OAuth::Consumer.new \
            options[:oauth_consumer_key],
            options[:oauth_consumer_secret],
            :scheme => options[:scheme]

          access_token = OAuth::AccessToken.new(consumer, options[:oauth_token], options[:oauth_token_secret])

          response = access_token.request(options[:method].downcase.to_sym, options[:uri])
          puts "#{response.code} #{response.message}"
          puts response.body
        when "sign"
          parameters = prepare_parameters

          request = OAuth::RequestProxy.proxy \
             "method"     => options[:method],
             "uri"        => options[:uri],
             "parameters" => parameters

          if verbose?
            stdout.puts "OAuth parameters:"
            request.oauth_parameters.each do |k,v|
              stdout.puts "  " + [k, v] * ": "
            end
            stdout.puts

            if request.non_oauth_parameters.any?
              stdout.puts "Parameters:"
              request.non_oauth_parameters.each do |k,v|
                stdout.puts "  " + [k, v] * ": "
              end
              stdout.puts
            end
          end

          request.sign! \
            :consumer_secret => options[:oauth_consumer_secret],
            :token_secret    => options[:oauth_token_secret]

          if verbose?
            stdout.puts "Method: #{request.method}"
            stdout.puts "URI: #{request.uri}"
            stdout.puts "Normalized params: #{request.normalized_parameters}" unless options[:xmpp]
            stdout.puts "Signature base string: #{request.signature_base_string}"

            if options[:xmpp]
              stdout.puts
              stdout.puts "XMPP Stanza:"
              stdout.puts "<oauth xmlns='urn:xmpp:oauth:0'>\n<oauth_consumer_key>\#{request.oauth_consumer_key}</oauth_consumer_key>\n<oauth_token>\#{request.oauth_token}</oauth_token>\n<oauth_signature_method>\#{request.oauth_signature_method}</oauth_signature_method>\n<oauth_signature>\#{request.oauth_signature}</oauth_signature>\n<oauth_timestamp>\#{request.oauth_timestamp}</oauth_timestamp>\n<oauth_nonce>\#{request.oauth_nonce}</oauth_nonce>\n<oauth_version>\#{request.oauth_version}</oauth_version>\n</oauth>\n"
              stdout.puts
              stdout.puts "Note: You may want to use bare JIDs in your URI."
              stdout.puts
            else
              stdout.puts "OAuth Request URI: #{request.signed_uri}"
              stdout.puts "Request URI: #{request.signed_uri(false)}"
              stdout.puts "Authorization header: #{request.oauth_header(:realm => options[:realm])}"
            end
            stdout.puts "Signature:         #{request.oauth_signature}"
            stdout.puts "Escaped signature: #{OAuth::Helper.escape(request.oauth_signature)}"
          else
            stdout.puts request.oauth_signature
          end
        when "version"
          puts "OAuth for Ruby #{OAuth::VERSION}"
        end
      else
        usage
      end
    end