Title: Apache Accumulo Proxy
Notice:    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.

This module provides proxy server for Apache Accumulo. It enables using languages 
other than Java to interact with the database.

1. Building

The proxy server is built by the Accumulo build process. Read ../README
for more information.

2. Installation

The proxy server is installed during the Accumulo installation process. Read ../README
for more information.

3. Configuration

Please note the proxy server only functions correctly when connected to an 
Accumulo 1.5 instance, or when run standalone in the Mock configuration.

 - Edit the proxy.properties file.
    - Change the useMockInstance value to 'true' if you wish to use an in-memory Mock instance.
    - Change the useMiniAccumulo value to 'true' if you wish to use a Mini Accumulo Cluster.
    - When using a "real" Accumulo instance:
        - Ensure useMockInstance and useMiniAccumulo are both set to 'false'
        - Set the instance name
        - Set the list of ZooKeepers

4. Execution

Run the following command.

 ./bin/accumulo proxy -p ./opt/proxy/proxy.properties

5. Clients

You need the language-specific library for Thrift installed to be able to use said Thrift client 
code in that language. In other words, you need to install the Python Thrift library to use the Python 
example. Typically, your operating system's package manager will be able to automatically install
these for you in an expected location such as /usr/lib/python/site-packages/thrift.

An example Java client is incuded with this distribution in the class TestProxyClient. Also the 
unit tests included show how to use the proxy. Normal Accumulo APIs are emulated wherever possible.

Additional client examples can be found in the examples directory. These clients are tested and 
functional; however, the setup for each language is beyond the scope of this document currently.
