/**
 * Copyright 2010 Wealthfront Inc. Licensed under the Apache License,
 * Version 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law
 * or agreed to in writing, software distributed under the License is
 * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the specific language
 * governing permissions and limitations under the License.
 */
package com.kaching.platform.converters;

import static com.google.common.collect.Maps.newHashMap;

import java.util.Map;

/**
 * A converter for a finite set of values.
 */
public class FiniteConverter<T> extends NullHandlingConverter<T> {

  private final Map<String, T> s2o;
  private final Map<T, String> o2s;

  public FiniteConverter(Map<String, T> conversion) {
    this.s2o = conversion;
    this.o2s = newHashMap();
    for (Map.Entry<String, T> e : s2o.entrySet()) {
      o2s.put(e.getValue(), e.getKey());
    }
  }

  @Override
  protected T fromNonNullableString(String representation) {
    T o = s2o.get(representation);
    if (o != null) {
      return o;
    } else {
      throw new IllegalArgumentException(representation);
    }
  }

  @Override
  protected String nonNullableToString(T value) {
    String s = o2s.get(value);
    if (s != null) {
      return s;
    } else {
      throw new IllegalArgumentException();
    }
  }

}

/**
 * Copyright 2010 Wealthfront Inc. Licensed under the Apache License,
 * Version 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law
 * or agreed to in writing, software distributed under the License is
 * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the specific language
 * governing permissions and limitations under the License.
 */
package com.kaching.platform.converters;

import static com.google.common.collect.Maps.newHashMap;
import static java.lang.String.format;

import java.util.Map;

/**
 * A converter for a finite set of values.
 */
public class FiniteConverter<T> extends NullHandlingConverter<T> {

  private final Map<String, T> s2o;
  private final Map<T, String> o2s;

  public FiniteConverter(Map<String, T> conversion) {
    this.s2o = conversion;
    this.o2s = newHashMap();
    for (Map.Entry<String, T> e : s2o.entrySet()) {
      o2s.put(e.getValue(), e.getKey());
    }
  }

  @Override
  protected T fromNonNullableString(String representation) {
    T o = s2o.get(representation);
    if (o != null) {
      return o;
    } else {
      throw new IllegalArgumentException(format("Invalid representation: \"%s\"", representation));
    }
  }

  @Override
  protected String nonNullableToString(T value) {
    String s = o2s.get(value);
    if (s != null) {
      return s;
    } else {
      throw new IllegalArgumentException();
    }
  }

}

Improve error message from FiniteConverter.