#!/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.
#

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,m:
  print m

connection.close()
