You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by rv...@apache.org on 2016/05/19 15:14:47 UTC

[40/51] [partial] incubator-geode git commit: Add source for geode c++ and .net clients

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ac967000/geode-client-native/examples/dist/cacheRunner/CacheRunner.cpp
----------------------------------------------------------------------
diff --git a/geode-client-native/examples/dist/cacheRunner/CacheRunner.cpp b/geode-client-native/examples/dist/cacheRunner/CacheRunner.cpp
new file mode 100644
index 0000000..faf3a47
--- /dev/null
+++ b/geode-client-native/examples/dist/cacheRunner/CacheRunner.cpp
@@ -0,0 +1,1641 @@
+/*=========================================================================
+ * Copyright (c) 2002-2014 Pivotal Software, Inc. All Rights Reserved.
+ * This product is protected by U.S. and international copyright
+ * and intellectual property laws. Pivotal products are covered by
+ * more patents listed at http://www.pivotal.io/patents.
+ *=========================================================================
+ */
+
+/**
+ * @file cacheRunner.cpp
+ * @since   1.0
+ * @version 1.0
+ * @see
+ *
+ * This program demonstrates the functionality offered by the Gemfire
+ * Native Client C++ API.
+ */
+
+#ifdef WIN32
+#define _GS_ENABLE_WIN_MEMORY_LEAK_CHECK
+
+#ifdef _GS_ENABLE_WIN_MEMORY_LEAK_CHECK
+#include <crtdbg.h>
+#include <stdio.h>
+#endif
+
+#endif
+
+#define _GS_CACHE_RUNNER_SYSTEM     "theSystemTest"
+#define _GS_CACHE_RUNNER_CACHE      "theCache"
+#define _GS_CACHE_RUNNER_WITH_LLW     "listenerWriterLoader"
+
+#include <gfcpp/GemfireCppCache.hpp>
+#include <gfcpp/AttributesMutator.hpp>
+#include <gfcpp/AttributesFactory.hpp>
+#include <gfcpp/ScopeType.hpp>
+#include <gfcpp/Query.hpp>
+#include <gfcpp/QueryService.hpp>
+#include <gfcpp/SelectResults.hpp>
+#include <gfcpp/ResultSet.hpp>
+#include <gfcpp/StructSet.hpp>
+#include <gfcpp/Struct.hpp>
+#include <gfcpp/SelectResultsIterator.hpp>
+
+
+#include <typeinfo>
+
+#include "CacheRunner.hpp"
+#include "TestCacheListener.hpp"
+#include "TestCacheLoader.hpp"
+#include "TestCacheWriter.hpp"
+#include "ExampleObject.hpp"
+#include "Position.hpp"
+#include "Portfolio.hpp"
+#include "User.hpp"
+#include <assert.h>
+
+#ifdef WIN32
+#include <io.h>
+#define access _access
+#define F_OK 0
+#define R_OK 04
+#define atoll _atoi64
+#else
+#include <unistd.h>
+#endif
+
+// ----------------------------------------------------------------------------
+/**
+  * @brief ExampleObject class for testing the put functionality for object
+  * @brief User          class for testing the put functionality for object
+  */
+// ---------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+/**
+  * Test Parses the command line and runs the <code>CacheRunner</code> example.
+  */
+// ----------------------------------------------------------------------------
+using namespace std;
+using namespace testobject;
+
+int main (int argc, char **argv)
+{
+  std::string sXmlFileName;
+#ifdef _GS_ENABLE_WIN_MEMORY_LEAK_CHECK
+  _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
+#endif
+
+  if (argc != 2) {
+    printf("Usage: CacheRunner <cache.xml>\n");
+    exit(1);
+  }
+
+  sXmlFileName = argv[1];
+
+  // Does the cache file exist?
+  if (access(sXmlFileName.c_str(), F_OK) == -1){
+    printf("Supplied Cache config file <cache.xml> does not exist\n");
+    exit(1);
+  }
+  // Can we access the cache file?
+  if (access(sXmlFileName.c_str(), R_OK) == -1){
+    printf("Supplied Cache config file <cache.xml> can not be accessed\n");
+    exit(1);
+  }
+
+
+try{
+    CacheRunnerPtr cacheRunnerPtr = CacheRunner::create_Runner();
+
+    cacheRunnerPtr->setXmlFile(sXmlFileName);
+    cacheRunnerPtr->initialize();
+
+    cacheRunnerPtr->go();
+  } catch(OutOfMemoryException& ex)
+  {
+    printf("Out of Memory exception in main [%s]\n", ex.getMessage());
+    exit(1);
+  }
+
+  return 0;
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * Connect to distributed system and set properties
+  * returns true if success, false if failed
+  */
+// ----------------------------------------------------------------------------
+
+bool CacheRunner::connectDistributedSystem(const char* pszCacheXmlFileName)
+{
+  bool bSuccess = false;
+  disconnectDistributedSystem( );
+
+  try {
+    Serializable::registerType( ExampleObject::createInstance);
+    Serializable::registerType( User::createInstance);
+    Serializable::registerType( Position::createDeserializable);
+    Serializable::registerType( Portfolio::createDeserializable);
+    bSuccess = true;
+  } catch (IllegalArgumentException& ex)
+  {
+     fprintf(stderr, "Exception IllegalArgumentException in CacheRunner::initialize [%s]\n", ex.getMessage());
+     exit(1);
+  } catch (AlreadyConnectedException& ex)
+  {
+     fprintf(stderr, "Exception AlreadyConnectedException in CacheRunner::initialize [%s]\n", ex.getMessage());
+     exit(1);
+  }
+  catch (Exception& ex) {
+     fprintf(stderr, "Exception in CacheRunner::connectDistributedSystem [%s]\n", ex.getMessage());
+     exit(1);
+  }
+
+  if (bSuccess){
+    try{
+      PropertiesPtr systemProp = Properties::create();
+      systemProp->insert("cache-xml-file",pszCacheXmlFileName);
+      CacheFactoryPtr cacheFactory = CacheFactory::createCacheFactory(systemProp);
+      m_cachePtr =  cacheFactory->create();
+      VectorOfRegion vrp;
+      m_cachePtr->rootRegions(vrp);
+      m_currRegionPtr = m_cachePtr->getRegion(vrp.at(vrp.size() - 1)->getName());
+      m_currRegionAttributesPtr = m_currRegionPtr->getAttributes();
+
+      RegionFactoryPtr rgnFac = m_cachePtr->createRegionFactory(CACHING_PROXY);
+      if (m_currRegionAttributesPtr->getCacheListener() == NULLPTR) {
+        rgnFac->setCacheListener(CacheListenerPtr(new TestCacheListener()));
+      }
+      if (m_currRegionAttributesPtr->getCacheLoader() == NULLPTR) {
+        rgnFac->setCacheLoader(CacheLoaderPtr(new TestCacheLoader()));
+      }
+      if (m_currRegionAttributesPtr->getCacheWriter() == NULLPTR) {
+        rgnFac->setCacheWriter(CacheWriterPtr(new TestCacheWriter()));
+      }
+    }
+    catch (Exception& ex) {
+      fprintf(stderr, "Exception in CacheRunner::connectDistributedSystem [%s]\n", ex.getMessage());
+      exit(1);
+    }
+  }
+
+  return bSuccess;
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * Disconnect to distributed system and set properties
+  *   return true if success
+  *   return false if failed
+  */
+// ----------------------------------------------------------------------------
+
+void CacheRunner::disconnectDistributedSystem( )
+{
+  if (m_cachePtr != NULLPTR) {
+      m_cachePtr->close();
+      m_cachePtr=NULLPTR;
+  }
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * Initializes the <code>Cache</code> for this example program.
+  * Uses the {@link TestCacheListener}, {@link TestCacheLoader},
+  * {@link TestCacheWriter}, and {@link TestCapacityController}.
+  */
+// ----------------------------------------------------------------------------
+
+void CacheRunner::initialize( )
+{
+  if (connectDistributedSystem(m_sCacheXmlFileName.c_str())== false) {
+    exit(-1);
+  }
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * Sets the <code>cache.xml</code> file used to declaratively
+  * initialize the cache in this example.
+  */
+// ----------------------------------------------------------------------------
+
+void CacheRunner::setXmlFile( std::string cacheXmlFileName )
+{
+  m_sCacheXmlFileName = cacheXmlFileName;
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * Prompts the user for input and executes the command accordingly.
+  *
+  */
+// ----------------------------------------------------------------------------
+
+void CacheRunner::go( )
+{
+  CommandReader commandReader;
+
+  printf("Enter 'help' or '?' for help at the Command prompt.\n");
+  printf("\n");
+
+  while (true) {
+    try {
+
+      printf("%s> ", m_currRegionPtr->getFullPath());
+      fflush(stdout);
+      commandReader.readCommandLineFromStdin();
+
+        if (commandReader.isCommandStartsWith("exit") ||
+          commandReader.isCommandStartsWith("quit"))
+        {
+          if(m_cachePtr != NULLPTR){
+            m_cachePtr->close();
+            m_cachePtr=NULLPTR;
+          }
+          exit(0);
+  	    }
+        else if (commandReader.isCommandStartsWith("set")) {
+          setRgnAttr(commandReader);
+        }
+        else if (commandReader.isCommandStartsWith("putAll")) {
+          putAll(commandReader);
+        }
+        else if (commandReader.isCommandStartsWith("put")) {
+          put(commandReader);
+        }
+        else if (commandReader.isCommandStartsWith("create")) {
+          create(commandReader);
+        }
+        else if (commandReader.isCommandStartsWith("get")) {
+          get(commandReader);
+        }
+        else if (commandReader.isCommandStartsWith("run")) {
+          run(commandReader);
+        }
+        else if (commandReader.isCommand("reg")) {
+          registerKeys(commandReader);
+        }
+        else if (commandReader.isCommand("unreg")) {
+          unregisterKeys(commandReader);
+        }
+        else if (commandReader.isCommand("regex")) {
+          registerRegex(commandReader);
+        }
+        else if (commandReader.isCommand("unregex")) {
+          unregisterRegex(commandReader);
+        }
+        else if (commandReader.isCommandStartsWith("inv")) {
+          inv(commandReader);
+        }
+        else if (commandReader.isCommandStartsWith("des")) {
+          des(commandReader);
+        }
+        else if (commandReader.isCommandStartsWith("lsAttrs")) {
+  	      attr(commandReader);
+        }
+        else if (commandReader.isCommand("ls")) {
+          ls(commandReader);
+        }
+        else if (commandReader.isCommandStartsWith("mkrgn")) {
+          mkrgn(commandReader);
+        }
+        else if (commandReader.isCommandStartsWith("chrgn")) {
+          chrgn(commandReader);
+        }
+        else if (commandReader.isCommandStartsWith("load")) {
+          load(commandReader);
+        }
+        else if (commandReader.isCommandStartsWith("exec")) {
+          exec(commandReader);
+        }
+        else if (commandReader.isCommandStartsWith("query")) {
+          query(commandReader);
+        }
+        else if (commandReader.isCommandStartsWithNoCase("existsValue")) {
+          existsValue(commandReader);
+        }
+        else if (commandReader.isCommandStartsWithNoCase("selectValue")) {
+          selectValue(commandReader);
+        }
+        else if (commandReader.isCommandStartsWith("help") ||
+          commandReader.isCommandStartsWith("?"))
+        {
+          showHelp();
+        }
+        else if (commandReader.isCommand("lsrgn"))
+        {
+          cacheInfo();
+        }
+        else if (commandReader.getCommandString().size() != 0) {
+          printf("Unrecognized command. Enter 'help' or '?' to get a list of commands.\n");
+        }
+    }
+    catch (Exception& ex) {
+      fprintf(stderr, "Exception in CacheRunner [%s]\n", ex.getMessage());
+    }
+  }
+}
+
+// ----------------------------------------------------------------------------
+// ************ Command implementation methods ****************************
+// ----------------------------------------------------------------------------
+void CacheRunner::cacheInfo()
+{
+  VectorOfRegion vrp;
+  m_cachePtr->rootRegions(vrp);
+  printf("\nNumber of regions in Cache: %d\n", vrp.size());
+  int count = 1;
+  for (int rgnCnt = 0; rgnCnt < vrp.size(); rgnCnt++) {
+    printf("Region Name %d: %s\n", count++, vrp.at(rgnCnt)->getName());
+  }
+
+}
+// ----------------------------------------------------------------------------
+/**
+  * Creates a new region
+  * @see RegionFactory#create
+  */
+// ----------------------------------------------------------------------------
+
+void CacheRunner::mkrgn(CommandReader& commandReader) throw ( Exception )
+{
+  std::string sName = commandReader.getTokenString(1); // read second token from command string
+
+  if (sName.size() > 0) {
+    PoolFactoryPtr poolFactPtr = PoolManager::createFactory();
+    poolFactPtr->addServer("localhost", 50505);
+    if((PoolManager::find("examplePool"))== NULLPTR ) {// Pool does not exist with the same name.
+      PoolPtr pptr = poolFactPtr->create("examplePool");
+    }
+    RegionFactoryPtr regionFactory = m_cachePtr->createRegionFactory(CACHING_PROXY);
+    RegionPtr regionPtr = regionFactory
+         ->setCachingEnabled(true)
+         ->setPoolName("examplePool")
+         ->create(sName.c_str());
+  }
+}
+
+//----------------------------------------------------------------------------
+void CacheRunner::exec(CommandReader& commandReader) throw ( Exception )
+{
+  std::string sName = commandReader.getTokenString(1,true);
+  printf(" query string is %s\n",sName.c_str());
+  try {
+    QueryServicePtr qs = m_cachePtr->getQueryService("examplePool");
+    QueryPtr q = qs->newQuery(sName.c_str());
+    SelectResultsPtr sptr = q->execute();
+    SelectResultsIterator iptr = sptr->getIterator();
+    ResultSetPtr rsptr;
+    StructSetPtr ssptr;
+    StructPtr siptr;
+    CacheableStringPtr cStrptr;
+    printf("Query results : Found %d row \n",sptr->size());
+    for( int32_t rows = 0; rows < sptr->size(); rows++)
+    {
+      SerializablePtr tmps = (*sptr)[rows];
+      if (instanceOf<StructPtr>(tmps)) {
+        siptr = staticCast<StructPtr>(tmps);
+        printf("Struct with %d fields \n",siptr->length());
+        for(int32_t cols = 0; cols < siptr->length(); cols++)
+        {
+          SerializablePtr field = (*siptr)[cols];
+          if (field == NULLPTR) {
+            printf("we got null fields here, probably we have NULL data\n");
+            continue;
+          }
+          printStructSet(field, siptr, cols);
+        }
+      }
+      else{
+          printResultset(tmps);
+      }
+    }
+  } catch(Exception& ex)
+  {
+    printf("Exception in CacheRunner::exec [%s]\n", ex.getMessage());
+  }
+}
+
+//----------------------------------------------------------------------------
+void CacheRunner::query(CommandReader& commandReader) throw ( Exception )
+{
+  std::string sName = commandReader.getTokenString(1,true);
+  printf(" query predicate is %s\n",sName.c_str());
+  try {
+    SelectResultsPtr sptr = m_currRegionPtr->query(sName.c_str(), 123);
+    SelectResultsIterator iptr = sptr->getIterator();
+    ResultSetPtr rsptr;
+    StructSetPtr ssptr;
+    StructPtr siptr;
+    printf("Query results : Found %d row \n",sptr->size());
+    for( int32_t rows = 0; rows < sptr->size(); rows++)
+    {
+      SerializablePtr tmps = (*sptr)[rows];
+      if (instanceOf<StructPtr>(tmps)) {
+        siptr = staticCast<StructPtr>(tmps);
+        printf("Struct with %d fields \n",siptr->length());
+        for(int32_t cols = 0; cols < siptr->length(); cols++)
+        {
+          SerializablePtr field = (*siptr)[cols];
+          if (field == NULLPTR) {
+            printf("we got null fields here, probably we have NULL data\n");
+            continue;
+          }
+          printStructSet(field, siptr, cols);
+        }
+      }
+      else{
+          printResultset(tmps);
+      }
+    }
+  } catch(Exception& ex)
+  {
+    printf("Exception in CacheRunner::query [%s]\n", ex.getMessage());
+  }
+}
+
+//----------------------------------------------------------------------------
+void CacheRunner::existsValue(CommandReader& commandReader) throw ( Exception )
+{
+  std::string sName = commandReader.getTokenString(1,true);
+  printf(" query predicate is %s\n",sName.c_str());
+  try {
+    bool result = m_currRegionPtr->existsValue(sName.c_str());
+    if (result)
+    {
+      printf("Query result is TRUE\n");
+    }
+    else
+    {
+      printf("Query result is FALSE\n");
+    }
+  } catch(Exception& ex)
+  {
+    printf("Exception in CacheRunner::existsValue [%s]\n", ex.getMessage());
+  }
+}
+
+//----------------------------------------------------------------------------
+void CacheRunner::selectValue(CommandReader& commandReader) throw ( Exception )
+{
+  std::string sName = commandReader.getTokenString(1,true);
+  printf(" query predicate is %s\n",sName.c_str());
+  try {
+    SerializablePtr sptr = m_currRegionPtr->selectValue(sName.c_str());
+    ResultSetPtr rsptr;
+    StructSetPtr ssptr;
+    StructPtr siptr;
+    if (instanceOf<StructPtr>(sptr)) {
+      siptr = staticCast<StructPtr>(sptr);
+      printf("Struct with %d fields \n",siptr->length());
+      for(int32_t cols = 0; cols < siptr->length(); cols++)
+      {
+        SerializablePtr field = (*siptr)[cols];
+        if (field == NULLPTR) {
+          printf("we got null fields here, probably we have NULL data\n");
+          continue;
+        }
+        printStructSet(field, siptr, cols);
+      }
+    }
+    else{
+        printResultset(sptr);
+    }
+  } catch(Exception& ex)
+  {
+    printf("Exception in CacheRunner::selectValue [%s]\n", ex.getMessage());
+  }
+}
+
+void CacheRunner::printStructSet(CacheablePtr field, StructPtr ssptr,
+		int32_t& fields)
+{
+  CacheableStringArrayPtr strArr = NULLPTR;
+  CacheableHashMapPtr map = NULLPTR;
+  StructPtr structimpl = NULLPTR;
+
+  if (field != NULLPTR) {
+    if (instanceOf<CacheableStringArrayPtr> (field)) {
+      strArr = staticCast<CacheableStringArrayPtr> (field);
+      for (int stri = 0; stri < strArr->length(); stri++)
+        printf("%s(%d) - %s \n", ssptr->getFieldName(fields), stri,
+            strArr->operator[](stri)->asChar());
+    }
+    else if (instanceOf<CacheableHashMapPtr> (field)) {
+      map = staticCast<CacheableHashMapPtr> (field);
+      int index = 0;
+      for (CacheableHashMap::Iterator iter = map->begin(); iter != map->end();
+        ++iter) {
+        printf("hashMap %d of %d ... \n", ++index, map->size());
+        printStructSet(iter.first(), ssptr, fields);
+        printStructSet(iter.second(), ssptr, fields);
+      }
+      printf("end of map \n");
+    }
+    else if (instanceOf<StructPtr> (field)) {
+      structimpl = staticCast<StructPtr> (field);
+      printf("structImpl %s {\n", ssptr->getFieldName(fields));
+      for (int32_t inner_fields = 0; inner_fields < structimpl->length();
+        ++inner_fields) {
+        SerializablePtr field = (*structimpl)[inner_fields];
+        if (field == NULLPTR) {
+          printf("we got null fields here, probably we have NULL data\n");
+          continue;
+        }
+
+        printStructSet(field, structimpl, inner_fields);
+
+      } //end of field iterations
+      printf("   } //end of %s\n", ssptr->getFieldName(fields));
+    }
+    else
+      printf("%s : %s\n", ssptr->getFieldName(fields),
+          field->toString()->asChar());
+  }
+  else {
+    printf("unknown field data.. couldn't even convert it to "
+      "Cacheable variants\n");
+  }
+}
+
+void CacheRunner::printResultset(SerializablePtr field)
+{
+  CacheableStringArrayPtr strArr;
+  CacheableHashMapPtr map;
+  if (field != NULLPTR) {
+    if (instanceOf<CacheableStringArrayPtr> (field)) {
+      strArr = staticCast<CacheableStringArrayPtr> (field);
+      for (int stri = 0; stri < strArr->length(); ++stri)
+        printf("(%d) - %s \n", stri, strArr->operator[](stri)->asChar());
+    }
+    else if (instanceOf<CacheableHashMapPtr> (field)) {
+      map = staticCast<CacheableHashMapPtr> (field);
+      int index = 0;
+      for (CacheableHashMap::Iterator iter = map->begin(); iter != map->end();
+        ++iter) {
+        printf("hashMap %d of %d ... \n", ++index, map->size());
+        printResultset(field);
+        printResultset(field);
+      }
+      printf("end of map \n");
+    }
+    else {
+      printf("%s\n", field->toString()->asChar());
+    }
+  }
+  else {
+    printf("unknown field data.. couldn't even convert it to "
+      "Cacheable variants\n");
+  }
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * Changes the current region to another as specified by
+  * <code>command</code>.
+  *
+  * @see Cache#getRegion
+  * @see Region#getSubregion
+  * @see Region#getParentRegion
+  */
+// ----------------------------------------------------------------------------
+
+void CacheRunner::chrgn(CommandReader& commandReader) throw ( Exception )
+{
+  VectorOfRegion vrp;
+  if (commandReader.getNumberOfTokens() == 1) { // if only the command token exists
+    m_cachePtr->rootRegions(vrp);
+    RegionPtr regPtr1 = vrp.at(vrp.size()-1);
+
+    m_currRegionPtr = m_cachePtr->getRegion(vrp.at(vrp.size()-1)->getName());
+    return;
+  }
+  m_cachePtr->rootRegions(vrp);
+  std::string sName = commandReader.getTokenString(1); // read second token from command string
+
+  if (sName.size() == 0)
+    return;
+
+  RegionPtr tmpRgnPtr;
+
+  tmpRgnPtr = m_cachePtr->getRegion(sName.c_str());
+
+  if (tmpRgnPtr != NULLPTR) {
+    m_currRegionPtr = tmpRgnPtr;
+  }
+  else {
+    printf("Region %s not found\n", sName.c_str());
+  }
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * Invalidates (either local or distributed) a region or region
+  * entry depending on the contents of <code>command</code>.
+  *
+  * @see Region#invalidateRegion
+  * @see Region#invalidate
+  */
+// ----------------------------------------------------------------------------
+
+void CacheRunner::inv(CommandReader& commandReader) throw ( Exception )
+{
+  std::string arg1;
+  std::string arg2;
+  bool inv_l = false;
+
+  switch (commandReader.getNumberOfTokens()) {
+    case 1:
+      // inv followed by nothing invalidates the current region
+      m_currRegionPtr->invalidateRegion();
+      break;
+    case 2:
+      arg1 = commandReader.getTokenString(1);
+      inv_l = (arg1 == "-l") ? true : false;
+      if (inv_l) {
+        // inv -l local invalidates current region
+        m_currRegionPtr->localInvalidateRegion();
+      }
+      else {
+        // inv name invalidate the entry name in current region
+        m_currRegionPtr->invalidate(createKey( arg1.c_str() ));
+
+      }
+      break;
+    case 3:
+      // inv -l name local invalidates name in current region
+      arg1 = commandReader.getTokenString(1);
+      arg2 = commandReader.getTokenString(2);
+      inv_l = (arg1 == "-l") ? true : false;
+      if (inv_l) {
+        m_currRegionPtr->localInvalidate(createKey( arg2.c_str() ));
+      }
+      break;
+    default:
+      break;
+  }
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * Resets the current region attributes
+  */
+// ----------------------------------------------------------------------------
+
+void CacheRunner::reset() throw ( Exception )
+{
+  /** @todo could not find previously saved settings */
+  AttributesFactory* pAttributeFactory = new AttributesFactory( );
+  assert(pAttributeFactory != NULL);
+  if (pAttributeFactory){
+    m_currRegionAttributesPtr = pAttributeFactory->createRegionAttributes();
+    printf("attributes have been reset to defaults\n");
+
+    _GF_SAFE_DELETE(pAttributeFactory);
+  }
+}
+
+
+/**
+  * Gets a cached object from the current region and prints out its
+  * <code>String</code> value.
+  *
+  * @see Region#get
+  */
+// ----------------------------------------------------------------------------
+
+void CacheRunner::get(CommandReader& commandReader) throw (Exception)
+{
+  std::string sKey = commandReader.getTokenString(1); // read second token from command string
+
+  if (sKey.size() != 0) {
+    std::string sValue;
+    try {
+      CacheablePtr cacheablePtr = m_currRegionPtr->get(sKey.c_str());
+      CacheableKeyPtr sKeyPtr = CacheableString::create( sKey.c_str());
+
+      printEntry(sKeyPtr, cacheablePtr);
+    } catch ( const Exception& ex ) {
+      printf("Entry not found\n");
+    }
+
+  }
+}
+
+/**
+  * run a certain number of get() on the specified entry
+  *
+  * @see Region#get
+  */
+// ----------------------------------------------------------------------------
+
+int getUsedTime(struct timeval tv1, struct timeval tv2) {
+    int sec = tv2.tv_sec - tv1.tv_sec;
+    int usec = tv2.tv_usec - tv1.tv_usec;
+    if (usec < 0) {
+      sec--;
+      usec = 1000000-usec;
+    }
+    return(sec*1000000+usec);
+}
+
+void CacheRunner::run(CommandReader& commandReader) throw (Exception)
+{
+  int iTokenSize = commandReader.getNumberOfTokens();
+  std::string sValue = "null";
+  if (iTokenSize < 3 ) {
+    printf("Usage:run numberOfOp sizeOfData\n");
+    return;
+  }
+
+  sValue = commandReader.getTokenString(1);
+  int number = atoi(sValue.c_str());
+  sValue = commandReader.getTokenString(2);
+  int size = atoi(sValue.c_str());
+
+  // VectorOfCacheableKey keys;
+  std::string val(size,'a');
+  CacheablePtr value = CacheableBytes::create(( const unsigned char * )val.c_str(), val.length());
+
+  // for (int i=0; i<number; i++) {
+    // keys.push_back(CacheableKey::create( i ));
+  // }
+
+    // std::string val(10,'a');
+    HashMapOfCacheable map;
+    map.clear();
+#if defined(WIN32)
+    clock_t tv1 = clock();
+#else
+    struct timeval tv1;
+    gettimeofday(&tv1, NULL);
+#endif
+    for (int i=0; i<number; i++) {
+      CacheableKeyPtr keyPtr = CacheableKey::create( i );
+      if (size == 0) {
+        ExampleObjectPtr newObj(new ExampleObject(i));
+        map.insert(keyPtr, newObj);
+      } else {
+        CacheableBytesPtr valuePtr = CacheableBytes::create(
+            (const unsigned char *)val.c_str(), val.length());
+        map.insert(keyPtr, valuePtr);
+      }
+    }
+#if defined(WIN32)
+    clock_t tv2 = clock();
+#else
+    struct timeval tv2;
+    gettimeofday(&tv2, NULL);
+#endif
+    m_currRegionPtr->putAll(map);
+
+#if defined(WIN32)
+    clock_t tv3 = clock();
+    printf("prepare:%f, run:%f, %f\n", (tv2-tv1)*1.0/CLOCKS_PER_SEC, (tv3-tv2)*1.0/CLOCKS_PER_SEC, number*1.0*CLOCKS_PER_SEC/(tv3-tv2));
+#else
+    struct timeval tv3;
+    gettimeofday(&tv3, NULL);
+    int prep_t = getUsedTime(tv1, tv2);
+    int run_t = getUsedTime(tv1, tv3);
+    double run_tf = run_t/1000000.0;
+    printf("prepare:%d.%d, run:%d.%d, %f\n", prep_t/1000000, prep_t%1000000, run_t/1000000, run_t%1000000, number/run_tf);
+#endif
+
+#if 0
+  {
+    for (int i=0; i<number; i++) {
+      try {
+        m_currRegionPtr->put(keys[i], value);
+      } catch ( const Exception& ex ) {
+        printf("failed to put entry %d %s", i, ex.getMessage());
+      }
+    }
+    printf("Put: OpNum:%d, dataSize:%d\n", number, size);
+  }
+
+  {
+    for (int i=0; i<number; i++) {
+      try {
+        m_currRegionPtr->localInvalidate(keys[i]);
+      } catch ( const Exception& ex ) {
+        printf("localInvalidate failed\n");
+        return;
+      }
+    }
+  }
+
+  {
+    CacheablePtr valuePtr;
+    for (int i=0; i<number; i++) {
+      try {
+        valuePtr = m_currRegionPtr->get(keys[i]);
+      } catch ( const Exception& ex ) {
+        printf("Entry not found\n");
+        return;
+      }
+    }
+    printf("Get: OpNum:%d, dataSize:%d\n", number, size);
+  }
+
+  {
+    for (int i=0; i<number; i++) {
+      try {
+        m_currRegionPtr->localInvalidate(keys[i]);
+      } catch ( const Exception& ex ) {
+        printf("localInvalidate failed\n");
+      }
+    }
+  }
+
+  {
+    for (int i=0; i<number; i++) {
+      try {
+        m_currRegionPtr->destroy(keys[i]);
+      } catch ( const Exception& ex ) {
+        printf("failed to destroy entry %d %s", i, ex.getMessage());
+      }
+    }
+    printf("Destroy: OpNum:%d, dataSize:%d\n", number, size);
+  }
+#endif
+}
+
+/**
+  * register interested keys
+  *
+  * @see Region#registerKeys
+  */
+// ----------------------------------------------------------------------------
+
+void CacheRunner::registerKeys(CommandReader& commandReader) throw (Exception)
+{
+  int iTokenSize = commandReader.getNumberOfTokens();
+  std::string sValue = "null";
+  if (iTokenSize < 2 ) {
+    printf("Usage:reg k1 k2 ... kn\n");
+    return;
+  }
+
+  VectorOfCacheableKey keys;
+  for (int i=1; i<iTokenSize; i++)
+  {
+    sValue = commandReader.getTokenString(i);
+    keys.push_back(CacheableString::create( sValue.c_str() ));
+  }
+
+  try {
+    m_currRegionPtr->registerKeys(keys);
+  } catch ( const Exception& ex ) {
+    printf("failed to register keys %s", ex.getMessage());
+  }
+}
+
+/**
+  * register regular expression
+  *
+  * @see Region#registerRegex
+  */
+// ----------------------------------------------------------------------------
+
+void CacheRunner::registerRegex(CommandReader& commandReader) throw (Exception)
+{
+  int iTokenSize = commandReader.getNumberOfTokens();
+  std::string sValue = "null";
+  if (iTokenSize < 2 || iTokenSize > 2) {
+    printf("Usage:regex k.* or k-[2-3] ...Enter a regular expression string \n");
+    return;
+  }
+
+
+  try {
+    sValue = commandReader.getTokenString(1);
+    m_currRegionPtr->registerRegex(sValue.c_str());
+  } catch ( const Exception& ex ) {
+    printf("failed to register regular expression %s\n", ex.getMessage());
+  }
+}
+
+/**
+  * unregister interested keys
+  *
+  * @see Region#unregisterKeys
+  */
+// ----------------------------------------------------------------------------
+
+void CacheRunner::unregisterKeys(CommandReader& commandReader) throw (Exception)
+{
+  int iTokenSize = commandReader.getNumberOfTokens();
+  std::string sValue = "null";
+  if (iTokenSize < 2 ) {
+    printf("Usage:unreg k1 k2 ... kn\n");
+    return;
+  }
+
+  VectorOfCacheableKey keys;
+  for (int i=1; i<iTokenSize; i++)
+  {
+    sValue = commandReader.getTokenString(i);
+    keys.push_back(CacheableString::create( sValue.c_str() ));
+  }
+
+  try {
+    m_currRegionPtr->unregisterKeys(keys);
+  } catch ( const Exception& ex ) {
+    printf("failed to unregister keys %s", ex.getMessage());
+  }
+}
+
+/**
+  * unregister regular expression
+  *
+  * @see Region#unregisterRegex
+  */
+// ----------------------------------------------------------------------------
+
+void CacheRunner::unregisterRegex(CommandReader& commandReader) throw (Exception)
+{
+  int iTokenSize = commandReader.getNumberOfTokens();
+  std::string sValue = "null";
+  if (iTokenSize < 2 ) {
+    printf("Usage:unregex k.* or k-[2-3] ...Enter a regular expression string \n");
+    return;
+  }
+
+  try {
+    sValue = commandReader.getTokenString(1);
+    m_currRegionPtr->unregisterRegex(sValue.c_str());
+  } catch ( const Exception& ex ) {
+    printf("failed to unregister regular expression %s\n", ex.getMessage());
+  }
+}
+//----------------------------------------------------------------------------
+/**
+  * Creates a new entry in the current region
+  *
+  * @see Region#create
+  */
+// ----------------------------------------------------------------------------
+
+void CacheRunner::create(CommandReader& commandReader) throw ( Exception )
+{
+  int iTokenSize = commandReader.getNumberOfTokens();
+
+  if (iTokenSize < 2 ) {
+    printf("Error:create requires a name \n");
+  }
+  else {
+    std::string sKey = commandReader.getTokenString(1); // read second token from command string
+    if (iTokenSize > 2) {
+      std::string sValue = commandReader.getTokenString(2);
+      if (iTokenSize > 3) {
+        if (commandReader.isTokenNoCase("int", 3)){
+          /** @todo Could not find create for a integer */
+ 	  CacheableKeyPtr keyPtr = CacheableKey::create(sKey.c_str());
+          CacheableInt32Ptr ValuePtr = CacheableInt32::create( atoi(sValue.c_str()));
+          m_currRegionPtr->create(keyPtr,ValuePtr);
+        }
+        else if (commandReader.isTokenNoCase("long", 3)){
+          /** @todo Could not find create for a long long */
+ 	  CacheableKeyPtr keyPtr = CacheableKey::create(sKey.c_str());
+          CacheableInt64Ptr ValuePtr = CacheableInt64::create( atoll(sValue.c_str()));
+          m_currRegionPtr->create(keyPtr,ValuePtr);
+        }
+        else if (commandReader.isTokenNoCase("float", 3)){
+ 	  CacheableKeyPtr keyPtr = CacheableKey::create(sKey.c_str());
+	  CacheableFloatPtr ValuePtr = CacheableFloat::create(atof(sValue.c_str()));
+          m_currRegionPtr->create(keyPtr,ValuePtr);
+        }
+        else if (commandReader.isTokenNoCase("double", 3)){
+ 	  CacheableKeyPtr keyPtr = CacheableKey::create(sKey.c_str());
+	  CacheableDoublePtr ValuePtr = CacheableDouble::create(strtod(sValue.c_str(), NULL));
+          m_currRegionPtr->create(keyPtr,ValuePtr);
+        }
+        else if (commandReader.isTokenNoCase("str", 3)) {
+          CacheableKeyPtr keyPtr = CacheableKey::create(sKey.c_str());
+          CacheableStringPtr ValuePtr = CacheableString::create( sValue.c_str());
+          m_currRegionPtr->create(keyPtr, ValuePtr);
+        }
+	else if (commandReader.isTokenNoCase("obj", 3)) {
+          ExampleObjectPtr newObj(new ExampleObject(sValue));
+          CacheableKeyPtr keyPtr = CacheableKey::create(sKey.c_str());
+          m_currRegionPtr->put(keyPtr, newObj);
+        }
+        else if (commandReader.isTokenNoCase("usr", 3)) {
+          UserPtr newObj(new User(sValue.c_str(), ','));
+          CacheableKeyPtr keyPtr = CacheableKey::create(sKey.c_str());
+          m_currRegionPtr->put(keyPtr, newObj);
+        }
+        else if (commandReader.isTokenNoCase("portfolio",3)) {
+          PortfolioPtr newObj(new Portfolio(atoi(sValue.c_str()), 2));
+          CacheableKeyPtr keyPtr = CacheableKey::create(sKey.c_str());
+          m_currRegionPtr->put(keyPtr, newObj);
+        }
+      else if (commandReader.isTokenNoCase("position",3)) {
+          PositionPtr newObj(new Position(sValue.c_str(),atoi(sValue.c_str())));
+          CacheableKeyPtr keyPtr = CacheableKey::create(sKey.c_str());
+          m_currRegionPtr->put(keyPtr, newObj);
+      }
+        else {
+          printf("Invalid object type specified. Please see help.\n");
+        }
+      }
+      else {
+      	CacheableKeyPtr keyPtr = CacheableKey::create(sKey.c_str());
+	CacheableBytesPtr valuePtr = CacheableBytes::create(
+	    (uint8_t *)sValue.c_str(),sValue.size());
+        m_currRegionPtr->create(keyPtr, valuePtr);
+      }
+    }
+    else {
+      CacheableKeyPtr keyPtr = CacheableKey::create(sKey.c_str());
+      CacheablePtr valuePtr(NULLPTR);
+      m_currRegionPtr->create(keyPtr, valuePtr);
+
+    }
+  }
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * Puts an entry into the current region
+  *
+  * @see Region#put
+  */
+// ----------------------------------------------------------------------------
+
+void CacheRunner::put(CommandReader& commandReader) throw ( Exception )
+{
+  int iTokenSize = commandReader.getNumberOfTokens();
+  std::string sValue = "null";
+  if (iTokenSize < 3 ) {
+    printf("Error:put requires a name and a value\n");
+  }
+  else {
+    std::string sKey = commandReader.getTokenString(1); // read second token from command string
+    sValue = commandReader.getTokenString(2);
+    if (iTokenSize > 3) {
+      if (commandReader.isTokenNoCase("int", 3)) {
+        /** put for integer values */
+	CacheableKeyPtr keyPtr = CacheableKey::create(sKey.c_str());
+	CacheableInt32Ptr ValuePtr = CacheableInt32::create(atoi(sValue.c_str()));
+        m_currRegionPtr->put(keyPtr,ValuePtr);
+      }
+      else if (commandReader.isTokenNoCase("long", 3)) {
+        /** put for long integer values */
+	CacheableKeyPtr keyPtr = CacheableKey::create(sKey.c_str());
+	CacheableInt64Ptr ValuePtr = CacheableInt64::create(atoll(sValue.c_str()));
+        m_currRegionPtr->put(keyPtr,ValuePtr);
+      }
+      else if (commandReader.isTokenNoCase("float", 3)) {
+        /** put for float values */
+	CacheableKeyPtr keyPtr = CacheableKey::create(sKey.c_str());
+	CacheableFloatPtr ValuePtr = CacheableFloat::create(atof(sValue.c_str()));
+        m_currRegionPtr->put(keyPtr,ValuePtr);
+      }
+      else if (commandReader.isTokenNoCase("double", 3)) {
+        /** put for double values */
+	CacheableKeyPtr keyPtr = CacheableKey::create(sKey.c_str());
+	CacheableDoublePtr ValuePtr = CacheableDouble::create(strtod(sValue.c_str(), NULL));
+        m_currRegionPtr->put(keyPtr,ValuePtr);
+      }
+      else if (commandReader.isTokenNoCase("date", 3)) {
+        /** put for date values */
+	CacheableKeyPtr keyPtr = CacheableKey::create(sKey.c_str());
+        struct tm tm_dt = { 0 };
+        tm_dt.tm_isdst = -1; //determine by itself.
+        time_t epochtime = 0;
+#ifdef WIN32
+        int yr=0, mon=0, dy=0;
+        if( sscanf(sValue.c_str(), "%d-%d-%d%*s", &yr, &mon, &dy) != 3) {
+          printf("invalid date format - date should be ISO format yyyy-mm-dd\n");
+          return;
+        }
+        tm_dt.tm_year=yr-1900;
+        tm_dt.tm_mon=mon-1;
+        tm_dt.tm_mday=dy;
+        epochtime = mktime(&tm_dt);
+#elif !defined(WIN32)
+        if(strptime(sValue.c_str(), "%Y-%m-%d", &tm_dt) == NULL) {
+          printf("invalid date format - date should be ISO format yyyy-mm-dd\n");
+          return;
+        }
+        epochtime = mktime( &tm_dt );
+#endif
+        if(epochtime == -1) { printf("ERROR: epoch time could not be computed.\n"); }
+	CacheableDatePtr ValuePtr = CacheableDate::create(epochtime);
+        m_currRegionPtr->put(keyPtr,ValuePtr);
+      }
+      else if (commandReader.isTokenNoCase("str", 3)) {
+        CacheableKeyPtr keyPtr = CacheableKey::create(sKey.c_str());
+        CacheableStringPtr ValuePtr = CacheableString::create( sValue.c_str());
+        m_currRegionPtr->put(keyPtr, ValuePtr);
+      }
+      else if (commandReader.isTokenNoCase("obj", 3)) {
+	// ExampleObjectPtr newObj = new ExampleObject(atoi(sValue.c_str()),(atoi(sValue.c_str()))*4);
+        ExampleObjectPtr newObj(new ExampleObject(sValue));
+	CacheableKeyPtr keyPtr = CacheableKey::create(sKey.c_str());
+	m_currRegionPtr->put(keyPtr, newObj);
+      }
+      else if (commandReader.isTokenNoCase("usr", 3)) {
+        // UserPtr newObj = new User(name_str, atoi(userId_str.c_str()));
+        UserPtr newObj(new User(sValue, atoi(sValue.c_str())));
+        CacheableKeyPtr keyPtr = CacheableKey::create(sKey.c_str());
+        m_currRegionPtr->put(keyPtr, newObj);
+      }
+      else if (commandReader.isTokenNoCase("portfolio",3)) {
+          PortfolioPtr newObj(new Portfolio(atoi(sValue.c_str()), 2));
+          CacheableKeyPtr keyPtr = CacheableKey::create(sKey.c_str());
+          m_currRegionPtr->put(keyPtr, newObj);
+      }
+      else if (commandReader.isTokenNoCase("position",3)) {
+          PositionPtr newObj(new Position(sValue.c_str(),atoi(sValue.c_str())));
+          CacheableKeyPtr keyPtr = CacheableKey::create(sKey.c_str());
+          m_currRegionPtr->put(keyPtr, newObj);
+      }
+      else {
+        printf("Invalid object type specified. Please see help.\n");
+      }
+    }
+    else {
+      /**  put for bytes */
+      CacheableKeyPtr keyPtr = CacheableKey::create(sKey.c_str());
+      CacheableBytesPtr ValuePtr = CacheableBytes::create((uint8_t*)sValue.c_str(),sValue.size());
+      m_currRegionPtr->put(keyPtr,ValuePtr);
+    }
+  }
+}
+
+void CacheRunner::putAll(CommandReader& commandReader) throw ( Exception )
+{
+  std::string sValue = "null";
+    std::string sKey = commandReader.getTokenString(1); // read second token from command string
+    sValue = commandReader.getTokenString(2);
+    int size = atoi(sValue.c_str());
+    char buf[20];
+    std::string val(10,'a');
+    HashMapOfCacheable map;
+    map.clear();
+    for (int i=0; i<size; i++) {
+      sprintf(buf,"%s%d", sKey.c_str(), i);
+      CacheableKeyPtr keyPtr = CacheableKey::create(buf);
+      CacheableBytesPtr valuePtr = CacheableBytes::create(( const unsigned char * )val.c_str(), val.length());
+      map.insert(keyPtr, valuePtr);
+      // ExampleObjectPtr newObj = new ExampleObject(i);
+      // map.insert(keyPtr, newObj);
+    }
+    for ( HashMapOfCacheable::Iterator iter = map.begin( ); iter != map.end( ); ++iter ) {
+      CacheableKeyPtr key = iter.first();
+      CacheablePtr value = iter.second();
+printf("%s, %s\n", key->toString()->asChar(), value->toString()->asChar());
+    }
+    m_currRegionPtr->putAll(map, 35);
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * Destroys (local or distributed) a region or entry in the current
+  * region.
+  *
+  * @see Region#destroyRegion
+  */
+// ----------------------------------------------------------------------------
+
+void CacheRunner::des(CommandReader& commandReader) throw ( Exception )
+{
+  std::string arg1;
+  std::string arg2;
+  bool des_l= false;
+
+  switch (commandReader.getNumberOfTokens()) {
+    case 1:
+      // inv followed by nothing invalidates the current region
+      m_currRegionPtr->destroyRegion();
+      break;
+    case 2:
+      arg1 = commandReader.getTokenString(1); // read second token from command string
+      des_l= (arg1 == "-l") ? true : false;
+
+      if (des_l) {
+        // inv -l local invalidates current region
+        m_currRegionPtr->localDestroyRegion();
+      }
+      else {
+        // inv name invalidate the entry name in current region
+        m_currRegionPtr->destroy(createKey( arg1.c_str() ));
+      }
+      break;
+    case 3:
+      // inv -l name local invalidates name in current region
+      arg1 = commandReader.getTokenString(1); // read second token from command string
+      arg2 = commandReader.getTokenString(2); // read third token from command string
+      des_l = (arg1 == "-l") ? true : false;
+
+      if (des_l) {
+        m_currRegionPtr->localDestroy(createKey( arg2.c_str() ));
+      }
+      break;
+    default:
+      break;
+  }
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * Lists the contents of the current region.
+  *
+  * @see Region#entries
+  */
+// ----------------------------------------------------------------------------
+void  CacheRunner::printAttribute(RegionAttributesPtr& attr)
+{
+  std::string scope("null");
+  int option = attr->getScope();
+  switch( option) {
+    case 0:
+      scope = "LOCAL";
+      break;
+    case 1:
+      scope = "DISTRIBUTED_NO_ACK";
+      break;
+    case 2:
+      scope = "DISTRIBUTED_ACK";
+      break;
+    case 3:
+      scope = "GLOBAL";
+      break;
+    case 4:
+      scope = "INVALID";
+      break;
+
+  }
+  printf("Scope: %s\n",scope.c_str());
+  printf("CachingEnable: %s\n",attr->getCachingEnabled() ?"enabled" : "disabled");
+  printf("InitialCapacity: %d\n",attr->getInitialCapacity());
+  printf("LoadFactor: %f\n",attr->getLoadFactor());
+  printf("ConcurencyLevel: %d\n",attr->getConcurrencyLevel());
+  printf("RegionTimeToLive: %d\n",attr->getRegionTimeToLive());
+  printf("RegionIdleTimeout: %d\n",attr->getRegionIdleTimeout());
+  printf("EntryTimeToLive: %d\n",attr->getEntryTimeToLive());
+  printf("EntryIdleTimeout: %d\n",attr->getEntryIdleTimeout());
+  printf("getLruEntriesLimit: %d\n",attr->getLruEntriesLimit());
+
+}
+
+void CacheRunner::attr(CommandReader& commandReader) throw ( Exception )
+{
+  RegionAttributesPtr regionAttributePtr = m_currRegionPtr->getAttributes();
+
+  if (regionAttributePtr == NULLPTR) {
+    printf("region attributes: RegionNotFound\n");
+  }
+  else {
+    printAttribute(regionAttributePtr);
+  }
+}
+
+void CacheRunner::ls(CommandReader& commandReader) throw ( Exception )
+{
+  bool ls_l = commandReader.isToken("-l", 1) ? true : false;
+  if (ls_l) {
+    printf("%s attributes:\n", m_currRegionPtr->getFullPath());
+    m_currRegionAttributesPtr = m_currRegionPtr->getAttributes();
+    printAttribute(m_currRegionAttributesPtr);
+  }
+
+  printf("Region Entries:\n");
+
+  VectorOfRegionEntry regionEntryVector;
+  m_currRegionPtr->entries(regionEntryVector, false);  // do not recurse
+
+  RegionEntryPtr  regionEntryPtr;
+  CacheableKeyPtr cacheableKeyPtr;
+  CacheablePtr    cacheablePtr;
+
+  for (int32_t ulIndex = 0; ulIndex < regionEntryVector.size(); ulIndex++){
+    regionEntryPtr = regionEntryVector.at(ulIndex);
+    cacheableKeyPtr = regionEntryPtr->getKey();
+    cacheablePtr = regionEntryPtr->getValue();
+
+    printEntry(cacheableKeyPtr,cacheablePtr);
+  }
+
+  printf("\n");
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * Prints the key/value pair for an entry
+  * This method recognizes a subset of all possible object types.
+  */
+// ----------------------------------------------------------------------------
+
+void CacheRunner::printEntry(CacheableKeyPtr& sKey, CacheablePtr& valueBytes)
+{
+  std::string sValue = "null";
+   if (valueBytes != NULLPTR) {
+     int8_t typeId = valueBytes->typeId();
+     std::string objType;
+     if (typeId == GemfireTypeIds::CacheableBytes) {
+       objType = "Bytes: ";
+       CacheableBytesPtr cBytePtr = staticCast<CacheableBytesPtr>( valueBytes );
+       const uint8_t* bytType = cBytePtr->value();
+       const uint32_t len = cBytePtr->length();
+       char buff[1024];
+       sprintf(buff,"%s",(char*)bytType);
+       buff[len] = '\0';
+       std::string byteType(buff);
+       sValue = objType + byteType;
+     }
+     else {
+       switch (typeId)
+       {
+         case GemfireTypeIds::CacheableASCIIString: objType = "String: "; break;
+         case GemfireTypeIds::CacheableInt16: objType = "Int16: "; break;
+         case GemfireTypeIds::CacheableInt32: objType = "Int32: "; break;
+         case GemfireTypeIds::CacheableInt64: objType = "Int64: "; break;
+         case GemfireTypeIds::CacheableDouble: objType = "Double: "; break;
+         case GemfireTypeIds::CacheableFloat: objType = "Float: "; break;
+         case GemfireTypeIds::CacheableByte: objType = "Byte: "; break;
+         default: objType = ""; break;
+       }
+       sValue = objType + valueBytes->toString()->asChar();
+     }
+   }
+   else {
+     sValue = "No value in cache.";
+   }
+   printf("\n\t %s -> %s\n", sKey->toString()->asChar(), sValue.c_str());
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * Sets an expiration attribute of the current region
+  *
+  * @see Region#getAttributesMutator
+  */
+// ----------------------------------------------------------------------------
+
+void CacheRunner::setExpirationAttr(CommandReader& commandReader) throw ( Exception )
+{
+  AttributesMutatorPtr attributesMutatorPtr = m_currRegionPtr->getAttributesMutator();
+  ExpirationAttributes* pExpirationAttributes = NULL;
+
+  bool bRegionIdle = false;
+  bool bEntryIdle = false;
+  bool bEntryTtl = false;
+  bool bRegionTtl = false;
+  int  iTime = 0;
+
+  //Item 0 is the command itself
+
+  std::string sAttrName   = commandReader.getTokenString(2);
+  std::string sAttrValue  = commandReader.getTokenString(3);
+  std::string sAttrAction = commandReader.getTokenString(4);
+
+  if (sAttrValue.size() != 0) {
+    iTime  = atoi(sAttrValue.c_str());
+  }
+
+  if (commandReader.isTokenStartsWith("regionIdleTime", 2)) {
+    if (sAttrValue.size() != 0)
+      bRegionIdle = true;
+  }
+  else if (commandReader.isTokenStartsWith("entryIdleTime", 2)) {
+    if (sAttrValue.size() != 0)
+      bEntryIdle = true;
+  }
+  else if (commandReader.isTokenStartsWith("entryTTL", 2)) {
+    if (sAttrValue.size() != 0)
+      bEntryTtl = true;
+  }
+  else if (commandReader.isTokenStartsWith("regionTTL", 2)) {
+    if (sAttrValue.size() != 0)
+      bRegionTtl = true;
+  }
+  else {
+    printf("Unrecognized attribute name: %s", sAttrName.c_str());
+  }
+
+  if (bRegionIdle || bEntryIdle || bEntryTtl || bRegionTtl) {
+    pExpirationAttributes = parseExpAction(iTime, sAttrAction);
+    if (pExpirationAttributes == NULL)
+      pExpirationAttributes = new ExpirationAttributes(iTime, ExpirationAction::INVALIDATE);
+  }
+
+  if (bRegionIdle){
+    attributesMutatorPtr->setRegionIdleTimeout(pExpirationAttributes->getTimeout());
+    attributesMutatorPtr->setRegionIdleTimeoutAction(pExpirationAttributes->getAction());
+  }
+  else if (bEntryIdle){
+    attributesMutatorPtr->setEntryIdleTimeout(pExpirationAttributes->getTimeout());
+    attributesMutatorPtr->setEntryIdleTimeoutAction(pExpirationAttributes->getAction());
+    }
+  else if (bEntryTtl){
+    attributesMutatorPtr->setEntryTimeToLive(pExpirationAttributes->getTimeout());
+    attributesMutatorPtr->setEntryTimeToLiveAction(pExpirationAttributes->getAction());
+    }
+  else if(bRegionTtl){
+    attributesMutatorPtr->setRegionTimeToLive(pExpirationAttributes->getTimeout());
+    attributesMutatorPtr->setRegionTimeToLiveAction(pExpirationAttributes->getAction());
+    }
+  _GF_SAFE_DELETE(pExpirationAttributes);
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * Sets a region attribute of the current region
+  *
+  * @see #setExpirationAttr
+  * @see Region#getAttributesMutator
+  */
+// ----------------------------------------------------------------------------
+
+void CacheRunner::setRgnAttr(CommandReader& commandReader) throw ( Exception )
+{
+  std::string sName = commandReader.getTokenString(1); // read second token from command string
+
+  if (sName.size() == 0) {
+    printf("set argument is not provided, Please provide proper argument\n");
+    return;
+  }
+
+  if (sName == "expiration") {
+    setExpirationAttr(commandReader);
+    return;
+  }
+  else if(sName == "listener"){
+    std::string sValue;
+    sValue = commandReader.getTokenString(2);
+    AttributesMutatorPtr attrMutator = m_currRegionPtr->getAttributesMutator();
+    if(sValue == "null" || sValue == "NULL")
+      attrMutator->setCacheListener(NULLPTR);
+    else
+      attrMutator->setCacheListener(CacheListenerPtr(new TestCacheListener()));
+  }
+  else {
+    printf("Unrecognized attribute name: %s\n", sName.c_str());
+    return;
+  }
+
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * Specifies the <code>cache.xml</code> file to use when creating
+  * the <code>Cache</code>.  If the <code>Cache</code> has already
+  * been open, then the existing one is closed.
+  *
+  * @see CacheFactory#create
+  */
+// ----------------------------------------------------------------------------
+
+void CacheRunner::load(CommandReader& commandReader) throw ( Exception )
+{
+  printf("This Functionality Is Not Implemented \n");
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * Opens the <code>Cache</code> and sets the current region to the
+  * _GS_CACHE_RUNNER_REGION region.
+  *
+  * @see Cache#getRegion
+  */
+// ----------------------------------------------------------------------------
+
+void CacheRunner::open(CommandReader& commandReader) throw ( Exception )
+{
+  if (connectDistributedSystem(m_sCacheXmlFileName.c_str())){
+    reset();
+  }
+}
+
+// ----------------------------------------------------------------------------
+// ************************* Parsing methods **********************************
+// ----------------------------------------------------------------------------
+
+
+// ----------------------------------------------------------------------------
+/**
+  * Creates <code>ExpirationAttributes</code> from an expiration time
+  * and the name of an expiration action.
+  */
+// ----------------------------------------------------------------------------
+
+ExpirationAttributes* CacheRunner::parseExpAction( int iExpTime, std::string sActionName)
+{
+  ExpirationAttributes* pExpirationAttributes = NULL;
+
+  if (CommandReader::startsWith(sActionName.c_str(), "destroy")) {
+    pExpirationAttributes =
+      new ExpirationAttributes(iExpTime, ExpirationAction::DESTROY);
+  }
+  else if (CommandReader::startsWith(sActionName.c_str(), "inv")) {
+    pExpirationAttributes =
+      new ExpirationAttributes(iExpTime, ExpirationAction::INVALIDATE);
+  }
+  else if (CommandReader::startsWith(sActionName.c_str(), "localDes")) {
+    pExpirationAttributes =
+      new ExpirationAttributes(iExpTime, ExpirationAction::LOCAL_DESTROY);
+  }
+  else if (CommandReader::startsWith(sActionName.c_str(), "localInv")) {
+    pExpirationAttributes =
+      new ExpirationAttributes(iExpTime, ExpirationAction::LOCAL_INVALIDATE);
+  }
+  else {
+    printf("Expiration Action not understood: %s", sActionName.c_str());
+  }
+  return pExpirationAttributes;
+}
+
+// ----------------------------------------------------------------------------
+/* shows user help
+ */
+// ----------------------------------------------------------------------------
+
+void CacheRunner::showHelp( )
+{
+  printf("\nA distributed system is created with properties loaded from your gemfire.properties file.\n");
+  printf("You can specify alternative property files using -DgemfirePropertyFile=path.\n\n");
+
+  printf("load fileName - Re-initializes the cache based using a cache.xml file\n\n");
+
+  printf("Other commands:\n\n");
+
+  printf("ls - list all cache entries in current region and their stats.\n");
+  printf("lsAttrs - list the region attributes stored in the cache.\n\n");
+
+  printf("Entry creation and retrieval handles byte(default), String, Integer,\n");
+  printf("and a complex object generated using gfgen.\n\n");
+  printf("create name [value [str|int|long|float|double|obj|usr|portfolio] - define a new entry (see mkrgn create a region).\n");
+  printf("The complex object fields are filled based on the value provided.\n\n");
+  printf("put name value [str|int|long|float|double|date|obj|usr|portfolio|position] - associate a name with a value in the current region. Specify optionally the data type of the value \n");
+  printf("   As with create, the complex object fields are filled based on the value provided.\n\n");
+  printf("get name - get the value of a cache entry.\n\n");
+  printf("run number size - run a certain number of get() for this size.\n\n");
+  printf("putAll keyBase mapSize - putAll a map, each key is keyBase0, keyBase1, ...\n\n");
+  printf("reg k1 k2 ... kn - register the interested key list.\n\n");
+  printf("unreg k1 k2 ... kn - unregister the interested key list.\n\n");
+  printf("regex k.* or k-[2-3] - register the regular expression string.\n\n");
+  printf("unregex k.* or k-[2-3] - unregister the regular expression string.\n\n");
+  printf("des [-l] [name] - destroy an object or current region.  -l is for local destroy\n");
+  printf("inv [-l] [name] - invalidate a cache entry or current region.  -l is for local invalidation\n\n");
+
+  printf("mkrgn name - create a region with the current attributes settings\n");
+  printf("chrgn name - change current region (can use a local or global name)\n");
+  printf("chrgn - go to cache root level.\n\n");
+  printf("lsrgn - list all regions in cache.\n\n");
+  printf("exec queryExpr - Execute a query. All input after the exec command is considered the query string\n");
+  printf("query queryPredicate - Execute a standard query with the predicate on the current region. All input after the query command is considered the query predicate\n");
+  printf("existsValue queryPredicate - Execute a standard query with the predicate on the current region and check whether any result exists. All input after the query command is considered the query predicate\n");
+  printf("selectValue queryPredicate - Execute a standard query with the predicate on the current region and check for a single result item. All input after the query command is considered the query predicate\n");
+  printf("set expiration  <attribute [regionIdleTime | entryIdleTime | entryTTL | regionTTL ] > <value> <action [ destroy | inv | localDes | localInv ] > \n");
+  printf("set [listener] [null] - Add or remove a cache callback. Accepted values: listener. Use the optional null keyword to remove the cache callback");
+  printf("Usage:set expiration regionIdleTime 100 destroy - set regionIdleTimeout to 100 second and set the expiration action as destroy\n");
+  printf("\n");
+  printf("help or ? - list command descriptions\n");
+  printf("exit or quit: closes the current cache and exits\n\n");
+
+  printf("You have to use mkrgn and chrgn to create and descend into a region before using entry commands\n");
+
+  printf("\n");
+}
+
+void CacheRunner::showHelpForClientType( )
+{
+  printf("\nA distributed system is created with properties loaded from your gemfire.properties file.\n");
+  printf("You can specify alternative property files using -DgemfirePropertyFile=path.\n\n");
+
+  printf("load fileName - Re-initializes the cache based using a cache.xml file\n\n");
+
+  printf("Other commands:\n\n");
+
+  printf("ls - list all cache entries in current region and their stats.\n");
+
+  printf("Entry creation and retrieval handles byte(default), String, Integer,\n");
+  printf("and a complex object generated using gfgen.\n\n");
+  printf("create name [value [str|int|obj]] - define a new entry (see mkrgn create a region).\n");
+  printf("The complex object fields are filled based on the value provided.\n\n");
+  printf("put name value [str|int|obj|portfolio|position] - associate a name with a value in the current region\n");
+  printf("   As with create, the complex object fields are filled based on the value provided.\n\n");
+  printf("get name - get the value of a cache entry.\n\n");
+  printf("run number size - run a certain number of get() for this size.\n\n");
+  printf("reg k1 k2 ... kn - register the interested key list.\n\n");
+  printf("unreg k1 k2 ... kn - unregister the interested key list.\n\n");
+  printf("regex k.* or k-[2-3] - register the regular expression string.\n\n");
+  printf("unregex k.* or k-[2-3] - unregister the regular expression string.\n\n");
+  printf("set [listener] [null] - Add or remove a cache callback. Accepted values: listener. Use the optional null keyword to remove the cache callback");
+
+  printf("\n");
+  printf("help or ? - list command descriptions\n");
+  printf("exit or quit: closes the current cache and exits\n\n");
+
+  printf("You have to use mkrgn and chrgn to create and descend into a region before using entry commands\n");
+
+  printf("\n");
+}
+
+// ----------------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ac967000/geode-client-native/examples/dist/cacheRunner/CacheRunner.hpp
----------------------------------------------------------------------
diff --git a/geode-client-native/examples/dist/cacheRunner/CacheRunner.hpp b/geode-client-native/examples/dist/cacheRunner/CacheRunner.hpp
new file mode 100644
index 0000000..b1acee8
--- /dev/null
+++ b/geode-client-native/examples/dist/cacheRunner/CacheRunner.hpp
@@ -0,0 +1,318 @@
+/*=========================================================================
+ * Copyright (c) 2002-2014 Pivotal Software, Inc. All Rights Reserved.
+ * This product is protected by U.S. and international copyright
+ * and intellectual property laws. Pivotal products are covered by
+ * more patents listed at http://www.pivotal.io/patents.
+ *=========================================================================
+ */
+
+/**
+ * @file CacheRunner.hpp
+ * @since   1.0
+ * @version 1.0
+ * @see
+*/
+
+#ifndef __CACHE_RUNNER_HPP__
+#define __CACHE_RUNNER_HPP__
+
+#define _GF_SAFE_DELETE(PTR) if (PTR){ delete PTR; PTR = 0; }
+#define _GF_SAFE_DELETE_ARRAY(PTR) if (PTR){ delete []PTR; PTR = 0; }
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#include "CommandReader.hpp"
+
+#include <string>
+
+using namespace gemfire;
+
+// ----------------------------------------------------------------------------
+
+// forward declare
+class CacheRunner;
+
+// make a smart pointer for CacheRunner
+typedef SharedPtr< CacheRunner > CacheRunnerPtr;
+
+//typedef ACE_Hash_Map_Manager_Ex<CacheableKeyPtr, MapEntryPtr, ::ACE_Hash<CacheableKeyPtr>, ::ACE_Equal_To<CacheableKeyPtr>, ::ACE_Null_Mutex> CacheableKeyHashMap;
+
+// ----------------------------------------------------------------------------
+
+/**
+ * @class CacheRunner
+ *
+ * @brief This class is a command-line application that allows the user to
+ * exercise GemFire's eXtreme cache API}. The example allows the user
+ * to specify a <A HREF="{@docRoot}/../cacheRunner/cache.xml">cache.xml</A>
+ * file that specifies a parent region with certain properties and
+ * then allows the user to exercise the cache API
+ *
+ * @author GemStone Systems, Inc.
+ * @since 3.0
+ */
+
+class CacheRunner : public SharedBase
+{
+public:
+
+  CacheRunner( ) {}
+  ~CacheRunner( ) {}
+
+  /** @brief create an instance of CacheRunner.
+    * @throw OutOfMemoryException if not enough memory for the object creation.
+    */
+  inline static CacheRunnerPtr create_Runner( )
+      throw(OutOfMemoryException)
+    {
+      CacheRunnerPtr rptr;
+      rptr = NULLPTR;
+      CacheRunner* rp = new CacheRunner( );
+      if (!rp)
+      {
+        throw OutOfMemoryException("ReferenceCountedFactory::create_Runner: out of memory");
+      }
+      rptr = rp;
+      return rptr;
+  }
+
+  /**
+   * @brief Prints information on how this program should be used.
+   */
+  void showHelp( );
+  void showHelpForClientType( );
+
+  /**
+    * @brief Initializes the <code>Cache</code> for this example program.
+    * Uses the {@link TestCacheListener}, {@link TestCacheLoader},
+    * {@link TestCacheWriter}, and {@link TestCapacityController}.
+    */
+  void initialize( );
+
+  void setXmlFile( std::string cacheXmlFileName );
+  /**
+   * @brief Prints number of regions are created in the cache.
+   */
+  void cacheInfo();
+
+  /**
+    * @brief Prompts the user for input and executes the command accordingly.
+    */
+  void go( );
+
+
+private:
+  /**
+    * @brief Connect to distributed system and set properties
+    * @retval returns true if success, false if failed
+    */
+  bool connectDistributedSystem( const char* pszCacheXmlFileName = NULL);
+
+  /**
+    * @brief Disconnect to distributed system and set properties
+    * @retval returns true if success, false if failed
+    */
+  void disconnectDistributedSystem( );
+
+  /**
+    * @brief Prints out information about the current region
+    *
+    * @see Region#getStatistics
+    */
+  void status(CommandReader& commandReader) throw ( Exception );
+
+  /**
+    * @brief Creates a new subregion of the current region
+    *
+    * @see Region#createSubregion
+    */
+  void mkrgn(CommandReader& commandReader) throw ( Exception );
+
+  /**
+    * @brief Prints out information about the region entries that are
+    * currently locked.
+    */
+  void showlocks();
+
+  /**
+    * @brief Locks the current region or an entry in the current region based
+    * on the given <code>command</code>.
+    *
+    * @see Region#getRegionDistributedLock
+    * @see Region#getDistributedLock
+    */
+  void chrgn(CommandReader& commandReader) throw ( Exception );
+
+  /**
+    * @brief Invalidates (either local or distributed) a region or region
+    * entry depending on the contents of <code>command</code>.
+    *
+    * @see Region#invalidateRegion
+    * @see Region#invalidate
+    */
+  void inv(CommandReader& commandReader) throw ( Exception );
+
+  /**
+    * @brief Resets the current region attributes
+    */
+  void reset() throw ( Exception );
+
+  /**
+    * @brief Prints out the current region attributes
+    *
+    * @see Region#getAttributes
+    */
+  void attr(CommandReader& commandReader) throw ( Exception );
+
+  /**
+    * @brief Gets a cached object from the current region and prints out its
+    * <code>String</code> value.
+    *
+    * @see Region#get
+    */
+  void get(CommandReader& commandReader) throw ( Exception );
+
+  void run(CommandReader& commandReader) throw ( Exception );
+
+  void putAll(CommandReader& commandReader) throw ( Exception );
+
+  /**
+    * @brief Register keys in current region
+    *
+    * @see Region#registerKeys
+    */
+  void registerKeys(CommandReader& commandReader) throw ( Exception );
+
+  /**
+    * @brief unregister keys in current region
+    *
+    * @see Region#unregisterKeys
+    */
+  void unregisterKeys(CommandReader& commandReader) throw ( Exception );
+
+  /**
+    * @brief Register regular expression in current region
+    *
+    * @see Region#registerRegex
+    */
+  void registerRegex(CommandReader& commandReader) throw ( Exception );
+
+  /**
+    * @brief unregister regular expression in current region
+    *
+    * @see Region#unregisterRegex
+    */
+  void unregisterRegex(CommandReader& commandReader) throw ( Exception );
+
+  /**
+    * @brief Creates a new entry in the current region
+    *
+    * @see Region#create
+    */
+
+  void create(CommandReader& commandReader) throw ( Exception );
+
+  /**
+    * @brief Puts an entry into the current region
+    *
+    * @see Region#put
+    */
+  void put(CommandReader& commandReader) throw ( Exception );
+
+  /**
+    * @brief Destroys (local or distributed) a region or entry in the current
+    * region.
+    *
+    * @see Region#destroyRegion
+    */
+  void des(CommandReader& commandReader) throw ( Exception );
+
+  /**
+    * @brief Lists the contents of the current region.
+    *
+    * @see Region#entries
+    */
+  void ls(CommandReader& commandReader) throw ( Exception );
+
+  /**
+    * @brief Prints the key entry pair.
+    */
+
+  void  printEntry(CacheableKeyPtr& sKey, CacheablePtr& valueBytes);
+
+  /**
+    * @brief prints the region attributes.
+    */
+
+  void printAttribute(RegionAttributesPtr& attr);
+
+  /**
+    * @brief Sets an expiration attribute of the current region
+    *
+    * @see Region#getAttributesMutator
+    */
+  void setExpirationAttr(CommandReader& commandReader) throw ( Exception );
+
+  /**
+    * @brief Sets a region attribute of the current region
+    *
+    * @see #setExpirationAttr
+    * @see Region#getAttributesMutator
+    */
+  void setRgnAttr(CommandReader& commandReader) throw ( Exception );
+
+  /**
+    * @brief Specifies the <code>cache.xml</code> file to use when creating
+    * the <code>Cache</code>.  If the <code>Cache</code> has already
+    * been open, then the existing one is closed.
+    *
+    * @see CacheFactory#create
+    */
+  void load(CommandReader& commandReader) throw ( Exception );
+
+  /**
+    * @brief Opens the <code>Cache</code> and sets the current region to the
+    * _GS_CACHE_RUNNER_REGION region.
+    *
+    * @see Cache#getRegion
+    */
+  void open(CommandReader& commandReader) throw ( Exception );
+
+  /**
+    *  @brief Creates <code>ExpirationAttributes</code> from an expiration time
+    *  and the name of an expiration action.
+    */
+  ExpirationAttributes* parseExpAction( int iExpTime, std::string sActionName);
+
+  void exec(CommandReader& commandReader) throw ( Exception );
+  void query(CommandReader& commandReader) throw ( Exception );
+  void existsValue(CommandReader& commandReader) throw ( Exception );
+  void selectValue(CommandReader& commandReader) throw ( Exception );
+
+  void printStructSet(CacheablePtr field, StructPtr ssptr, int32_t& fields);
+  void printResultset(SerializablePtr field);
+
+private:
+  /** @brief Cache <code>Region</code> currently reviewed by this example  */
+  RegionPtr m_currRegionPtr;
+
+  /** @brief The cache used in the example */
+  CachePtr m_cachePtr;
+
+  /** @brief the attributes of the current region */
+  RegionAttributesPtr m_currRegionAttributesPtr;
+
+  /** @brief This example's connection to the distributed system */
+  DistributedSystemPtr m_distributedSystemPtr;
+
+  /** @brief The cache.xml file used to declaratively configure the cache */
+  std::string m_sCacheXmlFileName;
+
+};
+
+// ----------------------------------------------------------------------------
+
+#endif // __CACHE_RUNNER_HPP__
+

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ac967000/geode-client-native/examples/dist/cacheRunner/CommandReader.cpp
----------------------------------------------------------------------
diff --git a/geode-client-native/examples/dist/cacheRunner/CommandReader.cpp b/geode-client-native/examples/dist/cacheRunner/CommandReader.cpp
new file mode 100644
index 0000000..7e19e71
--- /dev/null
+++ b/geode-client-native/examples/dist/cacheRunner/CommandReader.cpp
@@ -0,0 +1,322 @@
+/*=========================================================================
+ * Copyright (c) 2002-2014 Pivotal Software, Inc. All Rights Reserved.  
+ * This product is protected by U.S. and international copyright
+ * and intellectual property laws. Pivotal products are covered by
+ * more patents listed at http://www.pivotal.io/patents.
+ *=========================================================================
+ */
+
+/** 
+ * @file CommandReader.cpp
+ * @since   1.0
+ * @version 1.0
+ * @see
+*/
+
+#include "CommandReader.hpp"
+#include <string.h> 
+#include <stdio.h>
+
+// ----------------------------------------------------------------------------
+
+CommandReader::CommandReader(void) :
+  m_sCommand("")
+{
+}
+//----------------------------------------------------------------------------
+
+CommandReader::CommandReader( std::string command ) :
+  m_sCommand(command)
+{
+  parseStringToList(m_sCommand, m_commandList);
+}
+// ----------------------------------------------------------------------------
+
+CommandReader::~CommandReader()
+{
+}
+
+// ----------------------------------------------------------------------------
+/**
+ * clears current command list and command string
+ */
+// ----------------------------------------------------------------------------
+
+void CommandReader::clearCommand( )
+{
+  m_commandList.clear();
+  m_sCommand.clear();
+}
+
+// ----------------------------------------------------------------------------
+/**
+ * read command line from stdin up to 80 characters and stores value to 
+ * current command list and current command string
+ */
+// ----------------------------------------------------------------------------
+
+void CommandReader::readCommandLineFromStdin( )
+{
+	char szLine[1024];
+
+  // clear the current command 
+  clearCommand();
+
+  // read up to 80 characters from stdin
+  fgets(szLine, 1022, stdin);
+  char *p;
+  if( (p = strchr( szLine, '\n' )) != NULL )
+    *p = '\0';
+  if (strlen(szLine) >= 1){
+    m_sCommand = szLine;
+	  parseStringToList(m_sCommand, m_commandList);
+  }
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * compares a command string to the current command 
+  * case is compared, length is compared
+  * return true if success, false if unsucessful
+  */
+// ----------------------------------------------------------------------------
+
+bool CommandReader::isCommand( const char* pszCommand )
+{
+  return isToken(pszCommand);
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * compares a command string to the current command
+  * case is compared, length of input string is compared
+  * return true if success, false if unsucessful
+  */
+// ----------------------------------------------------------------------------
+
+bool CommandReader::isCommandStartsWith( const char* pszCommand)
+{
+  return isTokenStartsWith(pszCommand);
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * compares a command string to the current command
+  * no case is compared, length is compared
+  * return true if success, false if unsucessful
+  */
+// ----------------------------------------------------------------------------
+
+bool CommandReader::isCommandNoCase( const char* pszCommand )
+{
+  return isTokenNoCase(pszCommand);
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * compares a command string to the current token 
+  * no case is compared, length of input is compared
+  * return true if success, false if unsucessful
+  */
+// ----------------------------------------------------------------------------
+
+bool CommandReader::isCommandStartsWithNoCase( const char* pszCommand )
+{
+  return isTokenStartsWithNoCase(pszCommand);
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * compares a token string to the current token
+  * case is compared, length is compared
+  * return true if success, false if unsucessful
+  */
+// ----------------------------------------------------------------------------
+
+bool CommandReader::isToken( const char* pszToken, int iIndex)
+{
+  bool bSuccess = false;
+
+  if (iIndex < (int)m_commandList.size() && pszToken){
+    if (!strcmp(pszToken, m_commandList[iIndex].c_str()))
+      bSuccess = true;
+  }
+
+  return bSuccess;
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * compares a token string to the current token
+  * case is compared, length of input string is compared
+  * return true if success, false if unsucessful
+  */
+// ----------------------------------------------------------------------------
+
+bool CommandReader::isTokenStartsWith( const char* pszToken, int iIndex )
+{
+  bool bSuccess = false;
+
+  if (iIndex < (int)m_commandList.size() && pszToken){
+    if (!strncmp(pszToken, m_commandList[iIndex].c_str(), strlen(pszToken)))
+    {
+      bSuccess = true;
+    }
+  }
+
+  return bSuccess;
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * compares a token string to the current token 
+  * no case is compared, length is compared
+  * return true if success, false if unsucessful
+  */
+// ----------------------------------------------------------------------------
+
+bool CommandReader::isTokenNoCase( const char* pszToken, int iIndex )
+{
+  bool bSuccess = false;
+
+  if (iIndex < (int)m_commandList.size() && pszToken){
+#ifdef _WIN32
+    if (!stricmp(pszToken, m_commandList[iIndex].c_str()))
+#else
+    if (!strcasecmp(pszToken, m_commandList[iIndex].c_str()))
+#endif
+      bSuccess = true;
+  }
+
+  return bSuccess;
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * compares a token string to the current token
+  * no case is compared, length of input string is compared
+  * return true if success, false if unsucessful
+  */
+// ----------------------------------------------------------------------------
+
+bool CommandReader::isTokenStartsWithNoCase(const char* pszToken, int iIndex )
+{
+  bool bSuccess = false;
+
+  if (iIndex < (int)m_commandList.size() && pszToken){
+#ifdef _WIN32
+    if (!strnicmp(pszToken, m_commandList[iIndex].c_str(), strlen(pszToken)))
+#else
+    if (!strncasecmp(pszToken, m_commandList[iIndex].c_str(), strlen(pszToken)))
+#endif
+    {
+      bSuccess = true;
+    }
+  }
+
+  return bSuccess;
+}
+
+// ----------------------------------------------------------------------------
+/**
+ * return parameter from command line input
+ */
+// ----------------------------------------------------------------------------
+
+std::string CommandReader::getTokenString( int iIndex ,bool isQuery)
+{
+  std::string sParameter;
+  
+  
+  if(isQuery) {
+    for(int queryCnt = iIndex; queryCnt < (int)m_commandList.size(); queryCnt++)
+    {
+      sParameter += m_commandList[queryCnt]; 
+      sParameter += ' ';
+    }
+  } else {
+    if (iIndex < (int)m_commandList.size()){
+      sParameter = m_commandList[iIndex];
+    }
+  }
+  return sParameter;
+}
+
+// ----------------------------------------------------------------------------
+/**
+ * returns the number of tokens from command line input
+ */
+// ----------------------------------------------------------------------------
+
+int CommandReader::getNumberOfTokens( )
+{
+  return (int)m_commandList.size();
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * returns the current command line text
+  */
+// ----------------------------------------------------------------------------
+
+std::string CommandReader::getCommandString( )
+{
+  return m_sCommand;
+}
+
+// ----------------------------------------------------------------------------
+/**
+  * parses a text string delimited by spaces into a vector array
+  */
+// ----------------------------------------------------------------------------
+
+void CommandReader::parseStringToList( const std::string& sText, tCommandReaderList& commandList )
+{
+  commandList.clear();  // make sure output string is cleared
+
+  size_t size = sText.size();
+
+  if (size){ // make sure input string has data
+    std::string sTmp;
+    char        cChar = 0;
+    size_t      index = 0;
+
+
+    while(index < size){
+      cChar = sText[index];
+
+      if (cChar == ' ') {
+	  if (sTmp.size())  // make sure there is data
+            commandList.push_back(sTmp);
+          sTmp.clear();
+      } else {
+          sTmp += cChar;
+      }
+      index++;
+    }
+
+    if (sTmp.size()) // add the last string if any
+      commandList.push_back(sTmp);
+  }
+}
+
+// ----------------------------------------------------------------------------
+/** helper function to compare strings
+ */
+// ----------------------------------------------------------------------------
+
+bool CommandReader::startsWith(const char* pszToken, const char* pszText)
+{
+  bool bSuccess = false;
+
+  if (pszToken && pszText){
+    if (!strncmp(pszToken, pszText, strlen(pszText)))
+    {
+      bSuccess = true;
+    }
+  }
+
+  return bSuccess;
+}
+
+// ----------------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/ac967000/geode-client-native/examples/dist/cacheRunner/CommandReader.hpp
----------------------------------------------------------------------
diff --git a/geode-client-native/examples/dist/cacheRunner/CommandReader.hpp b/geode-client-native/examples/dist/cacheRunner/CommandReader.hpp
new file mode 100644
index 0000000..16d928c
--- /dev/null
+++ b/geode-client-native/examples/dist/cacheRunner/CommandReader.hpp
@@ -0,0 +1,158 @@
+/*=========================================================================
+ * Copyright (c) 2002-2014 Pivotal Software, Inc. All Rights Reserved.  
+ * This product is protected by U.S. and international copyright
+ * and intellectual property laws. Pivotal products are covered by
+ * more patents listed at http://www.pivotal.io/patents.
+ *=========================================================================
+ */
+
+/** 
+ * @file CommandReader.hpp
+ * @since   1.0
+ * @version 1.0
+ * @see
+*/
+
+#ifndef __COMMAND_READER_HPP__
+#define __COMMAND_READER_HPP__
+
+#include <vector>
+#include <string>
+
+// ----------------------------------------------------------------------------
+
+typedef std::vector<std::string> tCommandReaderList;
+
+// ----------------------------------------------------------------------------
+
+/**
+ * @class CommandReader
+ *
+ * @brief Helper class for reading stdin and parsing commands 
+ */ 
+class CommandReader
+{
+public:
+  CommandReader(void);
+  CommandReader(std::string);
+  ~CommandReader();
+
+  /** 
+    * @brief helper function to compare strings 
+    * @param pszToken NULL terminated string token
+    * @param pszText NULL terminated string to compare token with
+    * @retval returns true if match, false if no match
+    */
+  static bool startsWith(const char* pszToken, const char* pszText);
+
+  /**
+    * @brief read command line from stdin up to 80 characters and stores value to 
+    * current command list and current command string
+    */
+  void readCommandLineFromStdin( );
+
+  /**
+    * @brief compares a command string to the current command, 
+    * case is compared, length is compared
+    * @param pszCommand NULL terminated string to search command
+    * @retval true if success, false if unsucessful
+    */
+  bool isCommand( const char* pszCommand);
+
+  /**
+    * @brief compares a command string to the current command, 
+    * case is compared, length of input string is compared
+    * @param pszCommand NULL terminated string to search command
+    * @retval true if success, false if unsucessful
+    */
+  bool isCommandStartsWith( const char* pszCommand);
+
+  /**
+    * @brief compares a command string to the current command, 
+    * no case is compared, length is compared
+    * @param pszCommand NULL terminated string to search command
+    * @retval true if success, false if unsucessful
+    */
+  bool isCommandNoCase( const char* pszCommand );
+
+  /**
+    * @brief compares a command string to the current token, 
+    * no case is compared, length of input is compared
+    * @param pszCommand NULL terminated string to search command
+    * @retval true if success, false if unsucessful
+    */
+  bool isCommandStartsWithNoCase( const char* pszCommand );
+
+  /**
+    * @brief compares a token string to the current token, 
+    * case is compared, length is compared
+    * @param pszToken NULL terminated string to search token
+    * @param iIndex index refenence of token
+    * @retval true if success, false if unsucessful
+    */
+  bool isToken( const char* pszToken, int iIndex = 0 );
+
+  /**
+    * @brief compares a token string to the current token, 
+    * case is compared, length of input string is compared
+    * @param pszToken NULL terminated string to search token
+    * @param iIndex index refenence of token
+    * @retval true if success, false if unsucessful
+    */
+  bool isTokenStartsWith( const char* pszToken, int iIndex = 0 );
+
+  /**
+    * @brief compares a token string to the current token, 
+    * no case is compared, length is compared
+    * @param pszToken NULL terminated string to search token
+    * @param iIndex index refenence of token
+    * @retval true if success, false if unsucessful
+    */
+  bool isTokenNoCase( const char* pszToken, int iIndex = 0);
+
+  /**
+    * @brief compares a token string to the current token, 
+    * no case is compared, length of input string is compared
+    * @param pszToken NULL terminated string to search token
+    * @param iIndex index refenence of token
+    * @retval true if success, false if unsucessful
+    */
+  bool isTokenStartsWithNoCase( const char* pszToken, int iIndex = 0 );
+
+  /**
+    * @brief gets command line string
+    * @retval returns the current command line string
+    */
+  std::string getCommandString( );
+  
+  /**
+    * @brief gets token of the command line string
+    * @retval returns a token from the command line string
+    */
+  std::string getTokenString( int iIndex , bool isQuery = false);
+
+  /**
+    * @brief returns the number of tokens, including the command token
+    * @retval returns the number of tokens from command line input
+    */
+  int getNumberOfTokens( );
+
+private:
+  /**
+    * @brief clears current command list and command string
+    */
+  void clearCommand( );
+  
+  /**
+    * @brief parses a text string delimited by spaces into a vector array
+    */
+  void parseStringToList( const std::string& sText, tCommandReaderList& commandList );
+
+private:
+  tCommandReaderList m_commandList;
+  std::string        m_sCommand;
+};
+
+// ----------------------------------------------------------------------------
+
+#endif // __COMMAND_READER_HPP__