private int parseColumns(final String path, int i) throws IllegalArgumentException {
    if (i >= path.length()) {
      return i;
    }
    try {
      char c;
      StringBuilder column = new StringBuilder();
      while (i < path.length() && (c = path.charAt(i)) != '/') {
        if (c == ',') {
          if (column.length() < 1) {
            throw new IllegalArgumentException("invalid path");
          }
          String s = URLDecoder.decode(column.toString(), HConstants.UTF8_ENCODING);
          this.columns.add(Bytes.toBytes(s));
          column.setLength(0);
          i++;
          continue;
        }
        column.append(c);
        i++;
      }
      i++;
      // trailing list entry
      if (column.length() > 0) {
        String s = URLDecoder.decode(column.toString(), HConstants.UTF8_ENCODING);
        this.columns.add(Bytes.toBytes(s));
      }
    } catch (IndexOutOfBoundsException e) {
      throw new IllegalArgumentException(e);
    } catch (UnsupportedEncodingException e) {
      // shouldn't happen
      throw new RuntimeException(e);
    }
    return i;
  }
Parses a path based row/column/timestamp specification into its component elements.
<p>
hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/RowSpec.java