#!/usr/bin/env python
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

from __future__ import print_function
import sys
from qpid.messaging import *

broker =  "localhost:5672"
connection = Connection(broker)

try:
  connection.open()
  session = connection.session()

# Set up the receiver
  query = """
   let $w := ./weather
   return $w/station = 'Raleigh-Durham International Airport (KRDU)'
      and $w/temperature_f > 50
      and $w/temperature_f - $w/dewpoint > 5
      and $w/wind_speed_mph > 7
      and $w/wind_speed_mph < 20   """

#  query="./weather"

  address = """
    xml; {
       create: always, 
       node:{ type: queue }, 
       link: { 
         x-bindings: [{ exchange: xml, key: weather, arguments: { xquery: %r} }] 
       } 
    }
    """ % query

  receiver = session.receiver(address)

# Send an observation

  observations = """
      <weather>
         <station>Raleigh-Durham International Airport (KRDU)</station>
         <wind_speed_mph>16</wind_speed_mph>
         <temperature_f>70</temperature_f>
         <dewpoint>35</dewpoint>
      </weather>  """

  message = Message(subject="weather", content=observations)
  sender = session.sender("xml")
  sender.send(message)

# Retrieve matching message from the receiver and print it

  message = receiver.fetch(timeout=1)
  print(message.content)
  session.acknowledge()

except MessagingError as m:
  print(m)

connection.close()
