package sk.stuba.fiit.perconik.utilities.constant; import java.io.InvalidObjectException; import java.io.ObjectInputStream; import java.util.Set; import javax.annotation.Nonnull; import com.google.common.base.Function; import static com.google.common.base.Preconditions.checkArgument; public final class StringConstantSupport<E extends Enum<E> & StringConstant> extends AbstractConstantSupport<String, E> { private static final long serialVersionUID = -2957728433673208288L; private StringConstantSupport(final Class<E> type) { super(type); } private enum Transformation implements Function<StringConstant, String> { INSTANCE; public String apply(@Nonnull final StringConstant constant) { return constant.getValue(); } } @Override @SuppressWarnings("unchecked") Function<E, String> transformation() { return (Function<E, String>) Transformation.INSTANCE; } public static <E extends Enum<E> & StringConstant> StringConstantSupport<E> of(final Class<E> type) { return new StringConstantSupport<>(type); } private static final class SerializationProxy<E extends Enum<E> & StringConstant> extends AbstractSerializationProxy<String, E, StringConstantSupport<E>> { private static final long serialVersionUID = 6916645039794185238L; SerializationProxy(final StringConstantSupport<E> support) { super(support); } @Override StringConstantSupport<E> resolve(final Class<E> type) { return of(type); } } @SuppressWarnings({"static-method", "unused"}) private void readObject(final ObjectInputStream in) throws InvalidObjectException { throw new InvalidObjectException("Serialization proxy required"); } private Object writeReplace() { return new SerializationProxy<>(this); } public Set<String> getStrings() { return this.map.keySet(); } public E getConstant(final String value) { E constant = this.map.get(value); checkArgument(constant != null, "Constant for value %s not found", value); return constant; } }