package com.metamx.common.parsers;

import com.google.common.base.Preconditions;
import com.google.common.collect.Maps;
import com.metamx.common.exception.FormattedException;

import java.util.List;
import java.util.Map;

/**
 */
public class ToLowerCaseParser implements Parser<String, Object>
{
  private final Parser baseParser;

  public ToLowerCaseParser(Parser baseParser)
  {
    this.baseParser = baseParser;
  }

  @Override
  public Map parse(String input) throws FormattedException
  {
    Map<String, Object> line = baseParser.parse(input);
    Map<String, Object> retVal = Maps.newLinkedHashMap();
    for (Map.Entry<String, Object> entry : line.entrySet()) {
      String k = entry.getKey().toLowerCase();

      Preconditions.checkState(!retVal.containsKey(k), "Duplicate key [%s]", k);
      retVal.put(k, entry.getValue());
    }
    return retVal;
  }

  @Override
  public void setFieldNames(Iterable<String> fieldNames)
  {
    baseParser.setFieldNames(fieldNames);
  }

  @Override
  public List<String> getFieldNames()
  {
    return baseParser.getFieldNames();
  }
}

@@ -724,82 +724,295 @@
     
-Preconditions.checkState(!retVal.containsKey(k), %22Duplicate key %5B%25s%5D%22, k);
+if(retVal.containsKey(k)) %7B%0A        // Duplicate key, case-insensitively%0A        throw new FormattedException.Builder()%0A            .withErrorCode(FormattedException.ErrorCode.UNPARSABLE_ROW)%0A            .withMessage(String.format(%22Duplicate key %5B%25s%5D%22, k))%0A            .build();%0A      %7D%0A
 %0A   

Throw FormattedException on duplicate key