Class: Argos::Soap

Inherits:
Object
  • Object
show all
Defined in:
lib/argos/soap.rb

Constant Summary collapse

URI =
"http://ws-argos.cls.fr/argosDws/services/DixService"
WSDL =
"#{URI}?wsdl"
ARGOS_NS =
"http://service.dataxmldistribution.argos.cls.fr/types"
SOAP_NS =
"http://www.w3.org/2003/05/soap-envelope"
NAMESPACES =
{
  "soap" => SOAP_NS,
  "argos" => ARGOS_NS
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config = {}) ⇒ Soap

Constructor soap = Argos::Soap.new(“argos-system-user”, password: “argos-system-pw”)



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/argos/soap.rb', line 57

def initialize(config={})
  config.each do |k,v|
    case k.to_sym
    when :username
      @username=v
    when :password
      @password=v
    when :wsdl
      @wsdl=v
    when :programNumber
      @programNumber = v
    when :platformId
      @platformId = v
    when :nbDaysFromNow
      @nbDaysFromNow = v.to_i
    when :period
      @period = v
    when :filter
      @filter = v
    else
      #raise ArgumentError, "Unkown config key: #{k}"
    end
  end
end

Instance Attribute Details

#clientSavon

Returns:

  • (Savon)


34
35
36
# File 'lib/argos/soap.rb', line 34

def client
  @client
end

#filterObject

client [Savon] request [String] Soap:Envelope (XML request body) response [Savon::Response] operation [Savon::Operation] xml [String] (Extracted, inner) XML filter FIXME platformId [String] Comma-separated list of platforms programNumber [String] Comma-separated list of programs nbDaysFromNow period



34
35
36
# File 'lib/argos/soap.rb', line 34

def filter
  @filter
end

#nbDaysFromNowObject

client [Savon] request [String] Soap:Envelope (XML request body) response [Savon::Response] operation [Savon::Operation] xml [String] (Extracted, inner) XML filter FIXME platformId [String] Comma-separated list of platforms programNumber [String] Comma-separated list of programs nbDaysFromNow period



34
35
36
# File 'lib/argos/soap.rb', line 34

def nbDaysFromNow
  @nbDaysFromNow
end

#operationObject

client [Savon] request [String] Soap:Envelope (XML request body) response [Savon::Response] operation [Savon::Operation] xml [String] (Extracted, inner) XML filter FIXME platformId [String] Comma-separated list of platforms programNumber [String] Comma-separated list of programs nbDaysFromNow period



34
35
36
# File 'lib/argos/soap.rb', line 34

def operation
  @operation
end

#password=(value) ⇒ Object (writeonly)

username [String] password [String]



39
40
41
# File 'lib/argos/soap.rb', line 39

def password=(value)
  @password = value
end

#period(startDate, endDate) ⇒ Object

Period request



34
35
36
# File 'lib/argos/soap.rb', line 34

def period
  @period
end

#platformIdObject

client [Savon] request [String] Soap:Envelope (XML request body) response [Savon::Response] operation [Savon::Operation] xml [String] (Extracted, inner) XML filter FIXME platformId [String] Comma-separated list of platforms programNumber [String] Comma-separated list of programs nbDaysFromNow period



34
35
36
# File 'lib/argos/soap.rb', line 34

def platformId
  @platformId
end

#programNumberObject

client [Savon] request [String] Soap:Envelope (XML request body) response [Savon::Response] operation [Savon::Operation] xml [String] (Extracted, inner) XML filter FIXME platformId [String] Comma-separated list of platforms programNumber [String] Comma-separated list of programs nbDaysFromNow period



34
35
36
# File 'lib/argos/soap.rb', line 34

def programNumber
  @programNumber
end

#requestString

Returns:

  • (String)


34
35
36
# File 'lib/argos/soap.rb', line 34

def request
  @request
end

#responseObject

client [Savon] request [String] Soap:Envelope (XML request body) response [Savon::Response] operation [Savon::Operation] xml [String] (Extracted, inner) XML filter FIXME platformId [String] Comma-separated list of platforms programNumber [String] Comma-separated list of programs nbDaysFromNow period



34
35
36
# File 'lib/argos/soap.rb', line 34

def response
  @response
end

#username=(value) ⇒ Object (writeonly)

username [String] password [String]



39
40
41
# File 'lib/argos/soap.rb', line 39

def username=(value)
  @username = value
end

#xmlObject

client [Savon] request [String] Soap:Envelope (XML request body) response [Savon::Response] operation [Savon::Operation] xml [String] (Extracted, inner) XML filter FIXME platformId [String] Comma-separated list of platforms programNumber [String] Comma-separated list of programs nbDaysFromNow period



34
35
36
# File 'lib/argos/soap.rb', line 34

def xml
  @xml
end

Instance Method Details

#baseRequestHash

Build baseRequest Hash The service requires programNumber or PlatformId, but if you do not provide any, this method will call the service (@see #programs) and get the current user’s programs

Returns:

  • (Hash)


86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/argos/soap.rb', line 86

def baseRequest
  # if override key is platformId... delete programNumber...
  # if override key is period... delete nbDaysFromNow...
  baseRequest = { username: _username, password: _password }
  
  # First choice (program or platform)
  if @programNumber.nil? and @platformId.nil?
    # Fetch all programs if neither is provided
    baseRequest[:programNumber] = programs.map {|p|p.to_s}.join(",")
  elsif @programNumber =~ /\d+/ and @platformId =~ /\d+/
    raise "Cannot provide both programNumber and platformId"
  elsif @programNumber =~ /\d+/ 
    baseRequest[:programNumber] = @programNumber
  elsif @platformId =~ /\d+/
    baseRequest[:platformId] = @platformId
  end
  
  # 2nd choice (time)
  if @nbDaysFromNow.nil? and @period.nil?
    # Default to 20 days of data (the maximum)
    baseRequest[:nbDaysFromNow] = 20
  elsif @nbDaysFromNow =~ /\d+/ and not @period.nil?
    raise "Cannot provide both nbDaysFromNow and period"
  elsif @nbDaysFromNow.to_s =~ /\d+/ 
    baseRequest[:nbDaysFromNow] = @nbDaysFromNow.to_i
  else
    baseRequest[:period] = @period
  end
  
  baseRequest = baseRequest.merge({ 
    #<xs:element minOccurs="0" name="referenceDate" type="tns:referenceDateType"/>
    #<xs:element minOccurs="0" name="locClass" type="xs:string"/>
    #<xs:element minOccurs="0" name="geographicArea" type="xs:string"/>
    #<xs:element minOccurs="0" name="compression" type="xs:int"/>
    #<xs:element minOccurs="0" name="mostRecentPassages" type="xs:boolean"/>
  })
  baseRequest
  
end

#filter?Boolean

Returns:

  • (Boolean)


146
147
148
# File 'lib/argos/soap.rb', line 146

def filter?
  not @filter.nil? and filter.respond_to?(:call)
end

#getCsvString

Returns:

  • (String)


151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/argos/soap.rb', line 151

def getCsv
  o = _operation(:getCsv)
  o.body = { csvRequest: baseRequest.merge(
    showHeader: true).merge(xmlRequest)
  }
  @response = o.call
  @request = o.build
  
  # Handle faults (before extracting data)
  _envelope.xpath("soap:Body/soap:Fault", namespaces).each do | fault |
    raise fault.to_s
  end
  
  @text = _extract_escaped_xml("csvResponse").call(response)
end

#getKmlHash

Returns:

  • (Hash)


168
169
170
# File 'lib/argos/soap.rb', line 168

def getKml
  _call_xml_operation(:getKml, { kmlRequest: baseRequest.merge(xmlRequest)}, _extract_escaped_xml("kmlResponse"))
end

#getObsCsvText

choice: programNumber | platformId | wmo* nbMaxObs

Returns:

  • (Text)


223
224
225
226
227
228
229
230
# File 'lib/argos/soap.rb', line 223

def getObsCsv
  o = _operation(:getObsCsv)
  o.body = { observationRequest: baseRequest.merge(xmlRequest)
  }
  @response = o.call
  @request = o.build
  @text = _extract_escaped_xml("observationResponse").call(response)
end

#getObsXmlHash

choice: programNumber | platformId | wmo* nbMaxObs

Returns:

  • (Hash)


214
215
216
217
218
# File 'lib/argos/soap.rb', line 214

def getObsXml
  _call_xml_operation(:getObsXml,
    { observationRequest: baseRequest.merge(xmlRequest)},
    _extract_escaped_xml("observationResponse"))
end

#getPlatformListHash

{“data”:{“program”:[{“programNumber”:“9660”,“platform”:[{ .. },{ .. }]}],“@version”:“1.0”}} Each platform Hash (.. above): Argos::Soap.“platformId”:“129990”,“lastLocationClass”:“3”,“lastCollectDate”:“2013-10-03T08:32:24.000Z”,“lastLocationDate”:“2013-05-22T04:55:15.000Z”,“lastLatitude”:“47.67801”,“lastLongitude”:“-122“platformId”:“129990”,“lastLocationClass”:“3”,“lastCollectDate”:“2013-10-03T08:32:24.000Z”,“lastLocationDate”:“2013-05-22T04:55:15.000Z”,“lastLatitude”:“47.67801”,“lastLongitude”:“-122.13419”

Returns:

  • (Hash)


175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
# File 'lib/argos/soap.rb', line 175

def getPlatformList
  platformList = _call_xml_operation(:getPlatformList, { platformListRequest:
    # Cannot use #baseRequest here because that methods calls #programs which also calls #getPlatformList...
    { username: _username, password: _password },
  }, _extract_escaped_xml("platformListResponse"))
  
  # Raise error if no programs
  if platformList["data"]["program"].nil?
    raise platformList.to_json
  end
  # Force Array
  if not platformList["data"]["program"].is_a? Array
    platformList["data"]["program"] = [platformList["data"]["program"]]
  end
  platformList
end

#getStreamXmlHash

Returns:

  • (Hash)


200
201
202
203
204
# File 'lib/argos/soap.rb', line 200

def getStreamXml
  _call_xml_operation(:getStreamXml,
    { streamXmlRequest: baseRequest.merge(xmlRequest)},
    _extract_motm)
end

#getXmlHash

Returns:

  • (Hash)


193
194
195
196
197
# File 'lib/argos/soap.rb', line 193

def getXml
  _call_xml_operation(:getXml,
    { xmlRequest: baseRequest.merge(xmlRequest)},
    _extract_escaped_xml("xmlResponse"))
end

#getXsdHash

Returns:

  • (Hash)


207
208
209
# File 'lib/argos/soap.rb', line 207

def getXsd  
  _call_xml_operation(:getXsd, { xsdRequest: {} }, _extract_escaped_xml("xsdResponse"))
end

#namespacesObject



289
290
291
# File 'lib/argos/soap.rb', line 289

def namespaces
  NAMESPACES
end

#operationsArray

Returns [:getCsv, :getStreamXml, :getKml, :getXml, :getXsd, :getPlatformList, :getObsCsv, :getObsXml].

Returns:

  • (Array)
    :getCsv, :getStreamXml, :getKml, :getXml, :getXsd, :getPlatformList, :getObsCsv, :getObsXml


285
286
287
# File 'lib/argos/soap.rb', line 285

def operations
  @response = client.operations(:DixService, :DixServicePort)
end

#platforms(programNumber = nil) ⇒ Array

Platforms: array of platformId integers

Returns:

  • (Array)

    of [Integer]



234
235
236
237
238
239
240
241
242
243
244
245
246
# File 'lib/argos/soap.rb', line 234

def platforms(programNumber=nil)
  platforms = []

  platformListPrograms = getPlatformList["data"]["program"]

  if programNumber.to_s =~ /\d+/
    platformListPrograms.select! {|p| p["programNumber"].to_i == programNumber.to_i }
  end
  platformListPrograms.each do |program|
    platforms  += program["platform"].map {|p| p["platformId"].to_i}
  end
  platforms
end

#programsArray

Programs: Array of programNumber integers

Returns:

  • (Array)


255
256
257
258
259
260
261
262
# File 'lib/argos/soap.rb', line 255

def programs
  platformList = getPlatformList
  if platformList.key?("data") and platformList["data"].key?("program")
    platformList["data"]["program"].map {|p| p["programNumber"].to_i }
  else
    raise platformList
  end
end

#rawString

Returns:

  • (String)


265
266
267
# File 'lib/argos/soap.rb', line 265

def raw
  response.raw
end

#servicesHash

Returns href="http://schemas.xmlsoap.org/wsdl/soap12">schemas.xmlsoap.org/wsdl/soap12/”,“location”:“ws-argos.cls.fr/argosDws/services/DixService”}}}.

Returns:



275
276
277
# File 'lib/argos/soap.rb', line 275

def services
  client.services
end

#textString

Returns:

  • (String)


280
281
282
# File 'lib/argos/soap.rb', line 280

def text
  @text||=""
end

#xmlRequestObject



293
294
295
296
297
298
299
300
301
302
303
304
305
# File 'lib/argos/soap.rb', line 293

def xmlRequest
  {
    displayLocation: true,
    displayDiagnostic: true,
    displayMessage: true,
    displayCollect: true,
    displayRawData: true,
    displaySensor: true,
    #argDistrib: "",
    displayImageLocation: true,
    displayHexId: true  
  }
end