# @GPL_HEADER_START
# Use of the RAVE and related source code is subject to the terms
# of the following licenses:
# 
# GNU Public License (GPL) Rights pursuant to Version 2, June 1991
# Government Purpose License Rights (GPLR) pursuant to DFARS 252.225-7013
# 
# NO WARRANTY
# 
# ANY INFORMATION, MATERIALS, SERVICES, INTELLECTUAL PROPERTY OR OTHER
# PROPERTY OR RIGHTS GRANTED OR PROVIDED BY CARNEGIE MELLON UNIVERSITY
# PURSUANT TO THIS LICENSE (HEREINAFTER THE "DELIVERABLES") ARE ON AN
# "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY
# KIND, EITHER EXPRESS OR IMPLIED AS TO ANY MATTER INCLUDING, BUT NOT
# LIMITED TO, WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE,
# MERCHANTABILITY, INFORMATIONAL CONTENT, NONINFRINGEMENT, OR ERROR-FREE
# OPERATION. CARNEGIE MELLON UNIVERSITY SHALL NOT BE LIABLE FOR INDIRECT,
# SPECIAL OR CONSEQUENTIAL DAMAGES, SUCH AS LOSS OF PROFITS OR INABILITY
# TO USE SAID INTELLECTUAL PROPERTY, UNDER THIS LICENSE, REGARDLESS OF
# WHETHER SUCH PARTY WAS AWARE OF THE POSSIBILITY OF SUCH DAMAGES.
# LICENSEE AGREES THAT IT WILL NOT MAKE ANY WARRANTY ON BEHALF OF
# CARNEGIE MELLON UNIVERSITY, EXPRESS OR IMPLIED, TO ANY PERSON
# CONCERNING THE APPLICATION OF OR THE RESULTS TO BE OBTAINED WITH THE
# DELIVERABLES UNDER THIS LICENSE.
# 
# Licensee hereby agrees to defend, indemnify, and hold harmless Carnegie
# Mellon University, its trustees, officers, employees, and agents from
# all claims or demands made against them (and any related losses,
# expenses, or attorney's fees) arising out of, or relating to Licensee's
# and/or its sub licensees' negligent use or willful misuse of or
# negligent conduct or willful misconduct regarding the Software,
# facilities, or other rights or assistance granted by Carnegie Mellon
# University under this License, including, but not limited to, any
# claims of product liability, personal injury, death, damage to
# property, or violation of any laws or regulations.
# 
# Carnegie Mellon University Software Engineering Institute authored
# documents are sponsored by the U.S. Department of Defense under
# Contract F19628-00-C-0003. Carnegie Mellon University retains
# copyrights in all material produced under this contract. The U.S.
# Government retains a non-exclusive, royalty-free license to publish or
# reproduce these documents, or allow others to do so, for U.S.
# Government purposes only pursuant to the copyright license under the
# contract clause at 252.227.7013.
# 
# @GPL_HEADER_END
#!/usr/bin/env python
# rave-get - retrieve a visualization from a RAVE server

import sys
from rave.client import fetch_ticket, RaveCommunicationError
from optparse import OptionParser

buffer_size=65536

parser = OptionParser(usage="usage: %prog [options] query [X=Y ...]")
parser.add_option("--service", dest="service_url",
                  default='http://localhost:8888/',
                  help="Request from RAVE running at URL", metavar="URL")
parser.add_option("--output", dest="output_file",
                  help="Write result to FILE", metavar="FILE")
parser.add_option("-v", "--verbose", dest="verbose", action="store_true",
                  help="Verbose output", default=False)
parser.add_option("--wait", dest="wait_secs", 
                  help=("Wait until the request is complete, or for SECS, " +
                        "whichever comes first."),
                  metavar='SECS', default=None)

(options, args) = parser.parse_args()

if len(args) < 1:
    parser.print_help()
    sys.exit(-1)

query_name = args[0]
args = args[1:]

def arg_to_param(arg):
    arg_parts = arg.split('=', 1)
    if len(arg_parts) == 1:
        return (arg_parts[0], '')
    else:
        return tuple(arg_parts)
params = dict(map(arg_to_param, args))

service_url = options.service_url
output_file = options.output_file or None
wait_secs = options.wait_secs or None
verbose_mode = options.verbose or False

try:
    t = fetch_ticket(service_url, query_name, params, wait_secs)
except RaveCommunicationError, e:
    if e.code == 404:
        print >>sys.stderr, "Error: Request URI not found"
    elif e.code == 500:
        print >>sys.stderr, "Error: %s" % e.msg
    else:
        print >>sys.stderr, "Error: %s %s" % (e.code, e.msg)
    sys.exit(-1)

if verbose_mode:
    print >>sys.stderr, "Ticket URI: %s\n  Content-Type: %s" % \
          (t.get_uri(), t.get_content_type())

if output_file:
    out = file(output_file, 'w')
    s = t.get_stream()
    data = s.read(buffer_size)
    while data <> '':
        out.write(data)
        data = s.read(buffer_size)
    s.close()
    out.close()
