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”)



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/argos/soap.rb', line 39

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)


17
18
19
# File 'lib/argos/soap.rb', line 17

def client
  @client
end

#filterObject

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



17
18
19
# File 'lib/argos/soap.rb', line 17

def filter
  @filter
end

#logObject

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



17
18
19
# File 'lib/argos/soap.rb', line 17

def log
  @log
end

#nbDaysFromNowObject

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



17
18
19
# File 'lib/argos/soap.rb', line 17

def nbDaysFromNow
  @nbDaysFromNow
end

#operationObject

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



17
18
19
# File 'lib/argos/soap.rb', line 17

def operation
  @operation
end

#password=(value) ⇒ Object (writeonly)

username [String] password [String]



21
22
23
# File 'lib/argos/soap.rb', line 21

def password=(value)
  @password = value
end

#period(startDate, endDate) ⇒ Object

Period request



17
18
19
# File 'lib/argos/soap.rb', line 17

def period
  @period
end

#platformIdObject

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



17
18
19
# File 'lib/argos/soap.rb', line 17

def platformId
  @platformId
end

#programNumberObject

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



17
18
19
# File 'lib/argos/soap.rb', line 17

def programNumber
  @programNumber
end

#requestString

Returns:

  • (String)


17
18
19
# File 'lib/argos/soap.rb', line 17

def request
  @request
end

#responseObject

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



17
18
19
# File 'lib/argos/soap.rb', line 17

def response
  @response
end

#username=(value) ⇒ Object (writeonly)

username [String] password [String]



21
22
23
# File 'lib/argos/soap.rb', line 21

def username=(value)
  @username = value
end

#xmlObject

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



17
18
19
# File 'lib/argos/soap.rb', line 17

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)


68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/argos/soap.rb', line 68

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.to_s =~ /\d+/ and @platformId.to_s =~ /\d+/
    baseRequest[:platformId] = @platformId # ignores programNumber
  elsif @programNumber.to_s =~ /\d+/ 
    baseRequest[:programNumber] = @programNumber
  elsif @platformId.to_s =~ /\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({
    # @todo 
    #<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)


129
130
131
# File 'lib/argos/soap.rb', line 129

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

#getCsvString

Returns:

  • (String)


134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# File 'lib/argos/soap.rb', line 134

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)


151
152
153
# File 'lib/argos/soap.rb', line 151

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

#getObsCsvText

choice: programNumber | platformId | wmo* nbMaxObs

Returns:

  • (Text)


206
207
208
209
210
211
212
213
# File 'lib/argos/soap.rb', line 206

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)


197
198
199
200
201
# File 'lib/argos/soap.rb', line 197

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)


158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'lib/argos/soap.rb', line 158

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)


183
184
185
186
187
# File 'lib/argos/soap.rb', line 183

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

#getXmlHash

Returns:

  • (Hash)


176
177
178
179
180
# File 'lib/argos/soap.rb', line 176

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

#getXsdHash

Returns:

  • (Hash)


190
191
192
# File 'lib/argos/soap.rb', line 190

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

#platformsArray

Platforms: array of platformId integers

Returns:

  • (Array)

    of [Integer]



217
218
219
220
221
222
223
224
225
226
227
228
229
230
# File 'lib/argos/soap.rb', line 217

def platforms
  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)


239
240
241
242
243
244
245
246
# File 'lib/argos/soap.rb', line 239

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)


249
250
251
# File 'lib/argos/soap.rb', line 249

def raw
  response.raw
end

#schemaObject



267
268
269
# File 'lib/argos/soap.rb', line 267

def schema
  Nokogiri::XML::Schema(File.read("#{__dir__}/_xsd/argos-data.xsd"))
end

#servicesHash

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

Returns:



263
264
265
# File 'lib/argos/soap.rb', line 263

def services
  client.services
end

#textString

Returns:

  • (String)


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

def text
  @text||=""
end

#validate(xml) ⇒ Object



271
272
273
274
275
276
277
# File 'lib/argos/soap.rb', line 271

def validate(xml)
  if xml.is_a? String
    xml = Nokogiri.XML(xml)
  end
  schema.validate(xml)
  
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