# 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.
#!/usr/bin/env python
#
# Autogenerated by Thrift Compiler (0.9.3)
#
# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
#
#  options string: py
#

import sys
import pprint
from urlparse import urlparse
from thrift.transport import TTransport
from thrift.transport import TSocket
from thrift.transport import TSSLSocket
from thrift.transport import THttpClient
from thrift.protocol import TBinaryProtocol

from accumulo import AccumuloProxy
from accumulo.ttypes import *

if len(sys.argv) <= 1 or sys.argv[1] == '--help':
  print('')
  print('Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] [-s[sl]] function [arg1 [arg2...]]')
  print('')
  print('Functions:')
  print('  string login(string principal,  loginProperties)')
  print('  i32 addConstraint(string login, string tableName, string constraintClassName)')
  print('  void addSplits(string login, string tableName,  splits)')
  print('  void attachIterator(string login, string tableName, IteratorSetting setting,  scopes)')
  print('  void checkIteratorConflicts(string login, string tableName, IteratorSetting setting,  scopes)')
  print('  void clearLocatorCache(string login, string tableName)')
  print('  void cloneTable(string login, string tableName, string newTableName, bool flush,  propertiesToSet,  propertiesToExclude)')
  print('  void compactTable(string login, string tableName, string startRow, string endRow,  iterators, bool flush, bool wait, CompactionStrategyConfig compactionStrategy)')
  print('  void cancelCompaction(string login, string tableName)')
  print('  void createTable(string login, string tableName, bool versioningIter, TimeType type)')
  print('  void deleteTable(string login, string tableName)')
  print('  void deleteRows(string login, string tableName, string startRow, string endRow)')
  print('  void exportTable(string login, string tableName, string exportDir)')
  print('  void flushTable(string login, string tableName, string startRow, string endRow, bool wait)')
  print('   getDiskUsage(string login,  tables)')
  print('   getLocalityGroups(string login, string tableName)')
  print('  IteratorSetting getIteratorSetting(string login, string tableName, string iteratorName, IteratorScope scope)')
  print('  string getMaxRow(string login, string tableName,  auths, string startRow, bool startInclusive, string endRow, bool endInclusive)')
  print('   getTableProperties(string login, string tableName)')
  print('  void importDirectory(string login, string tableName, string importDir, string failureDir, bool setTime)')
  print('  void importTable(string login, string tableName, string importDir)')
  print('   listSplits(string login, string tableName, i32 maxSplits)')
  print('   listTables(string login)')
  print('   listIterators(string login, string tableName)')
  print('   listConstraints(string login, string tableName)')
  print('  void mergeTablets(string login, string tableName, string startRow, string endRow)')
  print('  void offlineTable(string login, string tableName, bool wait)')
  print('  void onlineTable(string login, string tableName, bool wait)')
  print('  void removeConstraint(string login, string tableName, i32 constraint)')
  print('  void removeIterator(string login, string tableName, string iterName,  scopes)')
  print('  void removeTableProperty(string login, string tableName, string property)')
  print('  void renameTable(string login, string oldTableName, string newTableName)')
  print('  void setLocalityGroups(string login, string tableName,  groups)')
  print('  void setTableProperty(string login, string tableName, string property, string value)')
  print('   splitRangeByTablets(string login, string tableName, Range range, i32 maxSplits)')
  print('  bool tableExists(string login, string tableName)')
  print('   tableIdMap(string login)')
  print('  bool testTableClassLoad(string login, string tableName, string className, string asTypeName)')
  print('  void pingTabletServer(string login, string tserver)')
  print('   getActiveScans(string login, string tserver)')
  print('   getActiveCompactions(string login, string tserver)')
  print('   getSiteConfiguration(string login)')
  print('   getSystemConfiguration(string login)')
  print('   getTabletServers(string login)')
  print('  void removeProperty(string login, string property)')
  print('  void setProperty(string login, string property, string value)')
  print('  bool testClassLoad(string login, string className, string asTypeName)')
  print('  bool authenticateUser(string login, string user,  properties)')
  print('  void changeUserAuthorizations(string login, string user,  authorizations)')
  print('  void changeLocalUserPassword(string login, string user, string password)')
  print('  void createLocalUser(string login, string user, string password)')
  print('  void dropLocalUser(string login, string user)')
  print('   getUserAuthorizations(string login, string user)')
  print('  void grantSystemPermission(string login, string user, SystemPermission perm)')
  print('  void grantTablePermission(string login, string user, string table, TablePermission perm)')
  print('  bool hasSystemPermission(string login, string user, SystemPermission perm)')
  print('  bool hasTablePermission(string login, string user, string table, TablePermission perm)')
  print('   listLocalUsers(string login)')
  print('  void revokeSystemPermission(string login, string user, SystemPermission perm)')
  print('  void revokeTablePermission(string login, string user, string table, TablePermission perm)')
  print('  void grantNamespacePermission(string login, string user, string namespaceName, NamespacePermission perm)')
  print('  bool hasNamespacePermission(string login, string user, string namespaceName, NamespacePermission perm)')
  print('  void revokeNamespacePermission(string login, string user, string namespaceName, NamespacePermission perm)')
  print('  string createBatchScanner(string login, string tableName, BatchScanOptions options)')
  print('  string createScanner(string login, string tableName, ScanOptions options)')
  print('  bool hasNext(string scanner)')
  print('  KeyValueAndPeek nextEntry(string scanner)')
  print('  ScanResult nextK(string scanner, i32 k)')
  print('  void closeScanner(string scanner)')
  print('  void updateAndFlush(string login, string tableName,  cells)')
  print('  string createWriter(string login, string tableName, WriterOptions opts)')
  print('  void update(string writer,  cells)')
  print('  void flush(string writer)')
  print('  void closeWriter(string writer)')
  print('  ConditionalStatus updateRowConditionally(string login, string tableName, string row, ConditionalUpdates updates)')
  print('  string createConditionalWriter(string login, string tableName, ConditionalWriterOptions options)')
  print('   updateRowsConditionally(string conditionalWriter,  updates)')
  print('  void closeConditionalWriter(string conditionalWriter)')
  print('  Range getRowRange(string row)')
  print('  Key getFollowing(Key key, PartialKey part)')
  print('  string systemNamespace()')
  print('  string defaultNamespace()')
  print('   listNamespaces(string login)')
  print('  bool namespaceExists(string login, string namespaceName)')
  print('  void createNamespace(string login, string namespaceName)')
  print('  void deleteNamespace(string login, string namespaceName)')
  print('  void renameNamespace(string login, string oldNamespaceName, string newNamespaceName)')
  print('  void setNamespaceProperty(string login, string namespaceName, string property, string value)')
  print('  void removeNamespaceProperty(string login, string namespaceName, string property)')
  print('   getNamespaceProperties(string login, string namespaceName)')
  print('   namespaceIdMap(string login)')
  print('  void attachNamespaceIterator(string login, string namespaceName, IteratorSetting setting,  scopes)')
  print('  void removeNamespaceIterator(string login, string namespaceName, string name,  scopes)')
  print('  IteratorSetting getNamespaceIteratorSetting(string login, string namespaceName, string name, IteratorScope scope)')
  print('   listNamespaceIterators(string login, string namespaceName)')
  print('  void checkNamespaceIteratorConflicts(string login, string namespaceName, IteratorSetting setting,  scopes)')
  print('  i32 addNamespaceConstraint(string login, string namespaceName, string constraintClassName)')
  print('  void removeNamespaceConstraint(string login, string namespaceName, i32 id)')
  print('   listNamespaceConstraints(string login, string namespaceName)')
  print('  bool testNamespaceClassLoad(string login, string namespaceName, string className, string asTypeName)')
  print('')
  sys.exit(0)

pp = pprint.PrettyPrinter(indent = 2)
host = 'localhost'
port = 9090
uri = ''
framed = False
ssl = False
http = False
argi = 1

if sys.argv[argi] == '-h':
  parts = sys.argv[argi+1].split(':')
  host = parts[0]
  if len(parts) > 1:
    port = int(parts[1])
  argi += 2

if sys.argv[argi] == '-u':
  url = urlparse(sys.argv[argi+1])
  parts = url[1].split(':')
  host = parts[0]
  if len(parts) > 1:
    port = int(parts[1])
  else:
    port = 80
  uri = url[2]
  if url[4]:
    uri += '?%s' % url[4]
  http = True
  argi += 2

if sys.argv[argi] == '-f' or sys.argv[argi] == '-framed':
  framed = True
  argi += 1

if sys.argv[argi] == '-s' or sys.argv[argi] == '-ssl':
  ssl = True
  argi += 1

cmd = sys.argv[argi]
args = sys.argv[argi+1:]

if http:
  transport = THttpClient.THttpClient(host, port, uri)
else:
  socket = TSSLSocket.TSSLSocket(host, port, validate=False) if ssl else TSocket.TSocket(host, port)
  if framed:
    transport = TTransport.TFramedTransport(socket)
  else:
    transport = TTransport.TBufferedTransport(socket)
protocol = TBinaryProtocol.TBinaryProtocol(transport)
client = AccumuloProxy.Client(protocol)
transport.open()

if cmd == 'login':
  if len(args) != 2:
    print('login requires 2 args')
    sys.exit(1)
  pp.pprint(client.login(args[0],eval(args[1]),))

elif cmd == 'addConstraint':
  if len(args) != 3:
    print('addConstraint requires 3 args')
    sys.exit(1)
  pp.pprint(client.addConstraint(args[0],args[1],args[2],))

elif cmd == 'addSplits':
  if len(args) != 3:
    print('addSplits requires 3 args')
    sys.exit(1)
  pp.pprint(client.addSplits(args[0],args[1],eval(args[2]),))

elif cmd == 'attachIterator':
  if len(args) != 4:
    print('attachIterator requires 4 args')
    sys.exit(1)
  pp.pprint(client.attachIterator(args[0],args[1],eval(args[2]),eval(args[3]),))

elif cmd == 'checkIteratorConflicts':
  if len(args) != 4:
    print('checkIteratorConflicts requires 4 args')
    sys.exit(1)
  pp.pprint(client.checkIteratorConflicts(args[0],args[1],eval(args[2]),eval(args[3]),))

elif cmd == 'clearLocatorCache':
  if len(args) != 2:
    print('clearLocatorCache requires 2 args')
    sys.exit(1)
  pp.pprint(client.clearLocatorCache(args[0],args[1],))

elif cmd == 'cloneTable':
  if len(args) != 6:
    print('cloneTable requires 6 args')
    sys.exit(1)
  pp.pprint(client.cloneTable(args[0],args[1],args[2],eval(args[3]),eval(args[4]),eval(args[5]),))

elif cmd == 'compactTable':
  if len(args) != 8:
    print('compactTable requires 8 args')
    sys.exit(1)
  pp.pprint(client.compactTable(args[0],args[1],args[2],args[3],eval(args[4]),eval(args[5]),eval(args[6]),eval(args[7]),))

elif cmd == 'cancelCompaction':
  if len(args) != 2:
    print('cancelCompaction requires 2 args')
    sys.exit(1)
  pp.pprint(client.cancelCompaction(args[0],args[1],))

elif cmd == 'createTable':
  if len(args) != 4:
    print('createTable requires 4 args')
    sys.exit(1)
  pp.pprint(client.createTable(args[0],args[1],eval(args[2]),eval(args[3]),))

elif cmd == 'deleteTable':
  if len(args) != 2:
    print('deleteTable requires 2 args')
    sys.exit(1)
  pp.pprint(client.deleteTable(args[0],args[1],))

elif cmd == 'deleteRows':
  if len(args) != 4:
    print('deleteRows requires 4 args')
    sys.exit(1)
  pp.pprint(client.deleteRows(args[0],args[1],args[2],args[3],))

elif cmd == 'exportTable':
  if len(args) != 3:
    print('exportTable requires 3 args')
    sys.exit(1)
  pp.pprint(client.exportTable(args[0],args[1],args[2],))

elif cmd == 'flushTable':
  if len(args) != 5:
    print('flushTable requires 5 args')
    sys.exit(1)
  pp.pprint(client.flushTable(args[0],args[1],args[2],args[3],eval(args[4]),))

elif cmd == 'getDiskUsage':
  if len(args) != 2:
    print('getDiskUsage requires 2 args')
    sys.exit(1)
  pp.pprint(client.getDiskUsage(args[0],eval(args[1]),))

elif cmd == 'getLocalityGroups':
  if len(args) != 2:
    print('getLocalityGroups requires 2 args')
    sys.exit(1)
  pp.pprint(client.getLocalityGroups(args[0],args[1],))

elif cmd == 'getIteratorSetting':
  if len(args) != 4:
    print('getIteratorSetting requires 4 args')
    sys.exit(1)
  pp.pprint(client.getIteratorSetting(args[0],args[1],args[2],eval(args[3]),))

elif cmd == 'getMaxRow':
  if len(args) != 7:
    print('getMaxRow requires 7 args')
    sys.exit(1)
  pp.pprint(client.getMaxRow(args[0],args[1],eval(args[2]),args[3],eval(args[4]),args[5],eval(args[6]),))

elif cmd == 'getTableProperties':
  if len(args) != 2:
    print('getTableProperties requires 2 args')
    sys.exit(1)
  pp.pprint(client.getTableProperties(args[0],args[1],))

elif cmd == 'importDirectory':
  if len(args) != 5:
    print('importDirectory requires 5 args')
    sys.exit(1)
  pp.pprint(client.importDirectory(args[0],args[1],args[2],args[3],eval(args[4]),))

elif cmd == 'importTable':
  if len(args) != 3:
    print('importTable requires 3 args')
    sys.exit(1)
  pp.pprint(client.importTable(args[0],args[1],args[2],))

elif cmd == 'listSplits':
  if len(args) != 3:
    print('listSplits requires 3 args')
    sys.exit(1)
  pp.pprint(client.listSplits(args[0],args[1],eval(args[2]),))

elif cmd == 'listTables':
  if len(args) != 1:
    print('listTables requires 1 args')
    sys.exit(1)
  pp.pprint(client.listTables(args[0],))

elif cmd == 'listIterators':
  if len(args) != 2:
    print('listIterators requires 2 args')
    sys.exit(1)
  pp.pprint(client.listIterators(args[0],args[1],))

elif cmd == 'listConstraints':
  if len(args) != 2:
    print('listConstraints requires 2 args')
    sys.exit(1)
  pp.pprint(client.listConstraints(args[0],args[1],))

elif cmd == 'mergeTablets':
  if len(args) != 4:
    print('mergeTablets requires 4 args')
    sys.exit(1)
  pp.pprint(client.mergeTablets(args[0],args[1],args[2],args[3],))

elif cmd == 'offlineTable':
  if len(args) != 3:
    print('offlineTable requires 3 args')
    sys.exit(1)
  pp.pprint(client.offlineTable(args[0],args[1],eval(args[2]),))

elif cmd == 'onlineTable':
  if len(args) != 3:
    print('onlineTable requires 3 args')
    sys.exit(1)
  pp.pprint(client.onlineTable(args[0],args[1],eval(args[2]),))

elif cmd == 'removeConstraint':
  if len(args) != 3:
    print('removeConstraint requires 3 args')
    sys.exit(1)
  pp.pprint(client.removeConstraint(args[0],args[1],eval(args[2]),))

elif cmd == 'removeIterator':
  if len(args) != 4:
    print('removeIterator requires 4 args')
    sys.exit(1)
  pp.pprint(client.removeIterator(args[0],args[1],args[2],eval(args[3]),))

elif cmd == 'removeTableProperty':
  if len(args) != 3:
    print('removeTableProperty requires 3 args')
    sys.exit(1)
  pp.pprint(client.removeTableProperty(args[0],args[1],args[2],))

elif cmd == 'renameTable':
  if len(args) != 3:
    print('renameTable requires 3 args')
    sys.exit(1)
  pp.pprint(client.renameTable(args[0],args[1],args[2],))

elif cmd == 'setLocalityGroups':
  if len(args) != 3:
    print('setLocalityGroups requires 3 args')
    sys.exit(1)
  pp.pprint(client.setLocalityGroups(args[0],args[1],eval(args[2]),))

elif cmd == 'setTableProperty':
  if len(args) != 4:
    print('setTableProperty requires 4 args')
    sys.exit(1)
  pp.pprint(client.setTableProperty(args[0],args[1],args[2],args[3],))

elif cmd == 'splitRangeByTablets':
  if len(args) != 4:
    print('splitRangeByTablets requires 4 args')
    sys.exit(1)
  pp.pprint(client.splitRangeByTablets(args[0],args[1],eval(args[2]),eval(args[3]),))

elif cmd == 'tableExists':
  if len(args) != 2:
    print('tableExists requires 2 args')
    sys.exit(1)
  pp.pprint(client.tableExists(args[0],args[1],))

elif cmd == 'tableIdMap':
  if len(args) != 1:
    print('tableIdMap requires 1 args')
    sys.exit(1)
  pp.pprint(client.tableIdMap(args[0],))

elif cmd == 'testTableClassLoad':
  if len(args) != 4:
    print('testTableClassLoad requires 4 args')
    sys.exit(1)
  pp.pprint(client.testTableClassLoad(args[0],args[1],args[2],args[3],))

elif cmd == 'pingTabletServer':
  if len(args) != 2:
    print('pingTabletServer requires 2 args')
    sys.exit(1)
  pp.pprint(client.pingTabletServer(args[0],args[1],))

elif cmd == 'getActiveScans':
  if len(args) != 2:
    print('getActiveScans requires 2 args')
    sys.exit(1)
  pp.pprint(client.getActiveScans(args[0],args[1],))

elif cmd == 'getActiveCompactions':
  if len(args) != 2:
    print('getActiveCompactions requires 2 args')
    sys.exit(1)
  pp.pprint(client.getActiveCompactions(args[0],args[1],))

elif cmd == 'getSiteConfiguration':
  if len(args) != 1:
    print('getSiteConfiguration requires 1 args')
    sys.exit(1)
  pp.pprint(client.getSiteConfiguration(args[0],))

elif cmd == 'getSystemConfiguration':
  if len(args) != 1:
    print('getSystemConfiguration requires 1 args')
    sys.exit(1)
  pp.pprint(client.getSystemConfiguration(args[0],))

elif cmd == 'getTabletServers':
  if len(args) != 1:
    print('getTabletServers requires 1 args')
    sys.exit(1)
  pp.pprint(client.getTabletServers(args[0],))

elif cmd == 'removeProperty':
  if len(args) != 2:
    print('removeProperty requires 2 args')
    sys.exit(1)
  pp.pprint(client.removeProperty(args[0],args[1],))

elif cmd == 'setProperty':
  if len(args) != 3:
    print('setProperty requires 3 args')
    sys.exit(1)
  pp.pprint(client.setProperty(args[0],args[1],args[2],))

elif cmd == 'testClassLoad':
  if len(args) != 3:
    print('testClassLoad requires 3 args')
    sys.exit(1)
  pp.pprint(client.testClassLoad(args[0],args[1],args[2],))

elif cmd == 'authenticateUser':
  if len(args) != 3:
    print('authenticateUser requires 3 args')
    sys.exit(1)
  pp.pprint(client.authenticateUser(args[0],args[1],eval(args[2]),))

elif cmd == 'changeUserAuthorizations':
  if len(args) != 3:
    print('changeUserAuthorizations requires 3 args')
    sys.exit(1)
  pp.pprint(client.changeUserAuthorizations(args[0],args[1],eval(args[2]),))

elif cmd == 'changeLocalUserPassword':
  if len(args) != 3:
    print('changeLocalUserPassword requires 3 args')
    sys.exit(1)
  pp.pprint(client.changeLocalUserPassword(args[0],args[1],args[2],))

elif cmd == 'createLocalUser':
  if len(args) != 3:
    print('createLocalUser requires 3 args')
    sys.exit(1)
  pp.pprint(client.createLocalUser(args[0],args[1],args[2],))

elif cmd == 'dropLocalUser':
  if len(args) != 2:
    print('dropLocalUser requires 2 args')
    sys.exit(1)
  pp.pprint(client.dropLocalUser(args[0],args[1],))

elif cmd == 'getUserAuthorizations':
  if len(args) != 2:
    print('getUserAuthorizations requires 2 args')
    sys.exit(1)
  pp.pprint(client.getUserAuthorizations(args[0],args[1],))

elif cmd == 'grantSystemPermission':
  if len(args) != 3:
    print('grantSystemPermission requires 3 args')
    sys.exit(1)
  pp.pprint(client.grantSystemPermission(args[0],args[1],eval(args[2]),))

elif cmd == 'grantTablePermission':
  if len(args) != 4:
    print('grantTablePermission requires 4 args')
    sys.exit(1)
  pp.pprint(client.grantTablePermission(args[0],args[1],args[2],eval(args[3]),))

elif cmd == 'hasSystemPermission':
  if len(args) != 3:
    print('hasSystemPermission requires 3 args')
    sys.exit(1)
  pp.pprint(client.hasSystemPermission(args[0],args[1],eval(args[2]),))

elif cmd == 'hasTablePermission':
  if len(args) != 4:
    print('hasTablePermission requires 4 args')
    sys.exit(1)
  pp.pprint(client.hasTablePermission(args[0],args[1],args[2],eval(args[3]),))

elif cmd == 'listLocalUsers':
  if len(args) != 1:
    print('listLocalUsers requires 1 args')
    sys.exit(1)
  pp.pprint(client.listLocalUsers(args[0],))

elif cmd == 'revokeSystemPermission':
  if len(args) != 3:
    print('revokeSystemPermission requires 3 args')
    sys.exit(1)
  pp.pprint(client.revokeSystemPermission(args[0],args[1],eval(args[2]),))

elif cmd == 'revokeTablePermission':
  if len(args) != 4:
    print('revokeTablePermission requires 4 args')
    sys.exit(1)
  pp.pprint(client.revokeTablePermission(args[0],args[1],args[2],eval(args[3]),))

elif cmd == 'grantNamespacePermission':
  if len(args) != 4:
    print('grantNamespacePermission requires 4 args')
    sys.exit(1)
  pp.pprint(client.grantNamespacePermission(args[0],args[1],args[2],eval(args[3]),))

elif cmd == 'hasNamespacePermission':
  if len(args) != 4:
    print('hasNamespacePermission requires 4 args')
    sys.exit(1)
  pp.pprint(client.hasNamespacePermission(args[0],args[1],args[2],eval(args[3]),))

elif cmd == 'revokeNamespacePermission':
  if len(args) != 4:
    print('revokeNamespacePermission requires 4 args')
    sys.exit(1)
  pp.pprint(client.revokeNamespacePermission(args[0],args[1],args[2],eval(args[3]),))

elif cmd == 'createBatchScanner':
  if len(args) != 3:
    print('createBatchScanner requires 3 args')
    sys.exit(1)
  pp.pprint(client.createBatchScanner(args[0],args[1],eval(args[2]),))

elif cmd == 'createScanner':
  if len(args) != 3:
    print('createScanner requires 3 args')
    sys.exit(1)
  pp.pprint(client.createScanner(args[0],args[1],eval(args[2]),))

elif cmd == 'hasNext':
  if len(args) != 1:
    print('hasNext requires 1 args')
    sys.exit(1)
  pp.pprint(client.hasNext(args[0],))

elif cmd == 'nextEntry':
  if len(args) != 1:
    print('nextEntry requires 1 args')
    sys.exit(1)
  pp.pprint(client.nextEntry(args[0],))

elif cmd == 'nextK':
  if len(args) != 2:
    print('nextK requires 2 args')
    sys.exit(1)
  pp.pprint(client.nextK(args[0],eval(args[1]),))

elif cmd == 'closeScanner':
  if len(args) != 1:
    print('closeScanner requires 1 args')
    sys.exit(1)
  pp.pprint(client.closeScanner(args[0],))

elif cmd == 'updateAndFlush':
  if len(args) != 3:
    print('updateAndFlush requires 3 args')
    sys.exit(1)
  pp.pprint(client.updateAndFlush(args[0],args[1],eval(args[2]),))

elif cmd == 'createWriter':
  if len(args) != 3:
    print('createWriter requires 3 args')
    sys.exit(1)
  pp.pprint(client.createWriter(args[0],args[1],eval(args[2]),))

elif cmd == 'update':
  if len(args) != 2:
    print('update requires 2 args')
    sys.exit(1)
  pp.pprint(client.update(args[0],eval(args[1]),))

elif cmd == 'flush':
  if len(args) != 1:
    print('flush requires 1 args')
    sys.exit(1)
  pp.pprint(client.flush(args[0],))

elif cmd == 'closeWriter':
  if len(args) != 1:
    print('closeWriter requires 1 args')
    sys.exit(1)
  pp.pprint(client.closeWriter(args[0],))

elif cmd == 'updateRowConditionally':
  if len(args) != 4:
    print('updateRowConditionally requires 4 args')
    sys.exit(1)
  pp.pprint(client.updateRowConditionally(args[0],args[1],args[2],eval(args[3]),))

elif cmd == 'createConditionalWriter':
  if len(args) != 3:
    print('createConditionalWriter requires 3 args')
    sys.exit(1)
  pp.pprint(client.createConditionalWriter(args[0],args[1],eval(args[2]),))

elif cmd == 'updateRowsConditionally':
  if len(args) != 2:
    print('updateRowsConditionally requires 2 args')
    sys.exit(1)
  pp.pprint(client.updateRowsConditionally(args[0],eval(args[1]),))

elif cmd == 'closeConditionalWriter':
  if len(args) != 1:
    print('closeConditionalWriter requires 1 args')
    sys.exit(1)
  pp.pprint(client.closeConditionalWriter(args[0],))

elif cmd == 'getRowRange':
  if len(args) != 1:
    print('getRowRange requires 1 args')
    sys.exit(1)
  pp.pprint(client.getRowRange(args[0],))

elif cmd == 'getFollowing':
  if len(args) != 2:
    print('getFollowing requires 2 args')
    sys.exit(1)
  pp.pprint(client.getFollowing(eval(args[0]),eval(args[1]),))

elif cmd == 'systemNamespace':
  if len(args) != 0:
    print('systemNamespace requires 0 args')
    sys.exit(1)
  pp.pprint(client.systemNamespace())

elif cmd == 'defaultNamespace':
  if len(args) != 0:
    print('defaultNamespace requires 0 args')
    sys.exit(1)
  pp.pprint(client.defaultNamespace())

elif cmd == 'listNamespaces':
  if len(args) != 1:
    print('listNamespaces requires 1 args')
    sys.exit(1)
  pp.pprint(client.listNamespaces(args[0],))

elif cmd == 'namespaceExists':
  if len(args) != 2:
    print('namespaceExists requires 2 args')
    sys.exit(1)
  pp.pprint(client.namespaceExists(args[0],args[1],))

elif cmd == 'createNamespace':
  if len(args) != 2:
    print('createNamespace requires 2 args')
    sys.exit(1)
  pp.pprint(client.createNamespace(args[0],args[1],))

elif cmd == 'deleteNamespace':
  if len(args) != 2:
    print('deleteNamespace requires 2 args')
    sys.exit(1)
  pp.pprint(client.deleteNamespace(args[0],args[1],))

elif cmd == 'renameNamespace':
  if len(args) != 3:
    print('renameNamespace requires 3 args')
    sys.exit(1)
  pp.pprint(client.renameNamespace(args[0],args[1],args[2],))

elif cmd == 'setNamespaceProperty':
  if len(args) != 4:
    print('setNamespaceProperty requires 4 args')
    sys.exit(1)
  pp.pprint(client.setNamespaceProperty(args[0],args[1],args[2],args[3],))

elif cmd == 'removeNamespaceProperty':
  if len(args) != 3:
    print('removeNamespaceProperty requires 3 args')
    sys.exit(1)
  pp.pprint(client.removeNamespaceProperty(args[0],args[1],args[2],))

elif cmd == 'getNamespaceProperties':
  if len(args) != 2:
    print('getNamespaceProperties requires 2 args')
    sys.exit(1)
  pp.pprint(client.getNamespaceProperties(args[0],args[1],))

elif cmd == 'namespaceIdMap':
  if len(args) != 1:
    print('namespaceIdMap requires 1 args')
    sys.exit(1)
  pp.pprint(client.namespaceIdMap(args[0],))

elif cmd == 'attachNamespaceIterator':
  if len(args) != 4:
    print('attachNamespaceIterator requires 4 args')
    sys.exit(1)
  pp.pprint(client.attachNamespaceIterator(args[0],args[1],eval(args[2]),eval(args[3]),))

elif cmd == 'removeNamespaceIterator':
  if len(args) != 4:
    print('removeNamespaceIterator requires 4 args')
    sys.exit(1)
  pp.pprint(client.removeNamespaceIterator(args[0],args[1],args[2],eval(args[3]),))

elif cmd == 'getNamespaceIteratorSetting':
  if len(args) != 4:
    print('getNamespaceIteratorSetting requires 4 args')
    sys.exit(1)
  pp.pprint(client.getNamespaceIteratorSetting(args[0],args[1],args[2],eval(args[3]),))

elif cmd == 'listNamespaceIterators':
  if len(args) != 2:
    print('listNamespaceIterators requires 2 args')
    sys.exit(1)
  pp.pprint(client.listNamespaceIterators(args[0],args[1],))

elif cmd == 'checkNamespaceIteratorConflicts':
  if len(args) != 4:
    print('checkNamespaceIteratorConflicts requires 4 args')
    sys.exit(1)
  pp.pprint(client.checkNamespaceIteratorConflicts(args[0],args[1],eval(args[2]),eval(args[3]),))

elif cmd == 'addNamespaceConstraint':
  if len(args) != 3:
    print('addNamespaceConstraint requires 3 args')
    sys.exit(1)
  pp.pprint(client.addNamespaceConstraint(args[0],args[1],args[2],))

elif cmd == 'removeNamespaceConstraint':
  if len(args) != 3:
    print('removeNamespaceConstraint requires 3 args')
    sys.exit(1)
  pp.pprint(client.removeNamespaceConstraint(args[0],args[1],eval(args[2]),))

elif cmd == 'listNamespaceConstraints':
  if len(args) != 2:
    print('listNamespaceConstraints requires 2 args')
    sys.exit(1)
  pp.pprint(client.listNamespaceConstraints(args[0],args[1],))

elif cmd == 'testNamespaceClassLoad':
  if len(args) != 4:
    print('testNamespaceClassLoad requires 4 args')
    sys.exit(1)
  pp.pprint(client.testNamespaceClassLoad(args[0],args[1],args[2],args[3],))

else:
  print('Unrecognized method %s' % cmd)
  sys.exit(1)

transport.close()
