lukefx/arcserver.rb

View on GitHub
lib/arcserver/rest/gp_server.rb

Summary

Maintainability
A
0 mins
Test Coverage
# encoding: utf-8

module ArcServer
  module REST
    class GPServer

      include HTTParty
      format :json
      # debug_output $stdout

      # The REST url of a map service
      attr_reader :url

      # @param [String] url the REST url of a map service
      # @example
      #   ArcServer::GPServer.new("http://sampleserver2.arcgisonline.com/ArcGIS/rest/services/PublicSafety/EMModels/GPServer/ERGByChemical")
      def initialize(url)
        @url = url
      end

      def execute(params)
        defaults = { f: 'json' }.merge(params)
        self.class.get("#{url}/execute", query: defaults)['results']
      end

      def checkJobStatus
        @status
      end

      def build_params(results, esri_job_id)

        all_params = {}
        results['results'].each do |r|
          result_param = self.class.get("#{url}/jobs/#{esri_job_id}/#{r[1]['paramUrl']}", query: { f: 'json' }).with_indifferent_access
          case result_param['dataType']
            when 'GPFeatureRecordSetLayer'
              all_params[result_param['paramName']] = Graphics::FeatureSet.new(result_param['value'])
            else
              all_params[result_param['paramName']] = result_param['value']
          end
        end
        all_params.with_indifferent_access
      end

      def submitJob(params)

        defaults = { f: 'json' }.merge(params)
        esri_job_id = self.class.get("#{url}/submitJob", query: defaults)['jobId']

        s = Rufus::Scheduler.new
        s.every '2s' do |job|

          results = self.class.get("#{url}/jobs/#{esri_job_id}", query: { f: 'json' })
          @status = results['jobStatus']

          case @status
            when 'esriJobSucceeded'
              yield build_params(results, esri_job_id)
              s.shutdown
            when 'esriJobWaiting'
              nil
            when 'esriJobSubmitted'
              nil
            when 'esriJobExecuting'
              nil
            when 'esriJobCancelled'
              nil
            when 'esriJobFailed'
              nil
            when 'esriJobCancelling'
              nil
          end
        end
        s.join

      end

    end
  end
end