@Override
  public SortedKeyValueIterator<Key, Value> deepCopy(IteratorEnvironment env) {
    ValueSummingIterator iterator = new ValueSummingIterator();
    iterator.encoder = encoder;
    iterator.hasTop = true;
    iterator.sum = sum;
    iterator.type = type;

    switch (Type.valueOf(type)) {
      case VARLEN:
        iterator.encoder = VAR_LEN_ENCODER;
        break;
      case FIXEDLEN:
        iterator.encoder = FIXED_LEN_ENCODER;
        break;
      case STRING:
        iterator.encoder = STRING_ENCODER;
        break;
    }

    return iterator;
  }
  @Override
  public boolean validateOptions(Map<String, String> options) {
    try {
      this.type = options.get(TYPE);
      if (type == null) {
        throw new IllegalArgumentException("no type specified");
      }

      switch (Type.valueOf(type)) {
        case VARLEN:
          this.encoder = VAR_LEN_ENCODER;
          break;
        case FIXEDLEN:
          this.encoder = FIXED_LEN_ENCODER;
          break;
        case STRING:
          this.encoder = STRING_ENCODER;
          break;
      }
    } catch (Exception e) {
      throw new IllegalArgumentException("bad encoder option", e);
    }
    return true;
  }
 /**
  * A convenience method for setting the long encoding type.
  *
  * @param is IteratorSetting object to configure.
  * @param type LongCombiner.Type specifying the encoding type.
  */
 public static void setEncodingType(IteratorSetting is, Type type) {
   is.addOption(TYPE, type.toString());
 }