docs: public static Deferred<Tree> fetchTree(final TSDB tsdb, final int tree_id) {
      if (tree_id < 1 || tree_id > 65535) {
        throw new IllegalArgumentException("Invalid Tree ID");
      }
  
      // fetch the whole row
      final GetRequest get = new GetRequest(tsdb.treeTable(), idToBytes(tree_id));
      get.family(TREE_FAMILY);
      
      /**
       * Called from the GetRequest with results from storage. Loops through the
       * columns and loads the tree definition and rules
       */
      final class FetchTreeCB implements Callback<Deferred<Tree>, 
        ArrayList<KeyValue>> {
    
        @Override
        public Deferred<Tree> call(ArrayList<KeyValue> row) throws Exception {
          if (row == null || row.isEmpty()) {
            return Deferred.fromResult(null);
          }
          
          final Tree tree = new Tree();
          
          // WARNING: Since the JSON in storage doesn't store the tree ID, we need
          // to loadi t from the row key.
          tree.setTreeId(bytesToId(row.get(0).key()));
          
          for (KeyValue column : row) {
            if (Bytes.memcmp(TREE_QUALIFIER, column.qualifier()) == 0) {
              // it's *this* tree. We deserialize to a new object and copy
              // since the columns could be in any order and we may get a rule 
              // before the tree object
              final Tree local_tree = JSON.parseToObject(column.value(), Tree.class);
              tree.created = local_tree.created;
              tree.description = local_tree.description;
              tree.name = local_tree.name;
              tree.notes = local_tree.notes;
              tree.strict_match = local_tree.strict_match;
              tree.enabled = local_tree.enabled;
              tree.store_failures = local_tree.store_failures;
              
            // Tree rule
            } else if (Bytes.memcmp(TreeRule.RULE_PREFIX(), column.qualifier(), 0, 
                TreeRule.RULE_PREFIX().length) == 0) {
              final TreeRule rule = TreeRule.parseFromStorage(column);
              tree.addRule(rule);
            }
          }
          
          return Deferred.fromResult(tree);
        }
        
      }
      
      // issue the get request
      return tsdb.getClient().get(get).addCallbackDeferring(new FetchTreeCB());
    }