package tc.oc.pgm.xml.parser; import javax.inject.Inject; import com.google.common.cache.LoadingCache; import com.google.inject.TypeLiteral; import tc.oc.commons.core.reflect.Types; import tc.oc.commons.core.util.CacheUtils; import tc.oc.commons.core.util.NumberFactory; import tc.oc.pgm.xml.Node; public class NumberParser<T extends Number> extends TransfiniteParser<T> { private final NumberFactory<T> factory; @Inject private NumberParser(TypeLiteral<T> type, NumberFactory<T> factory) { super(Types.toToken(type)); this.factory = factory; } private NumberParser(Class<T> type) { this(TypeLiteral.get(type), NumberFactory.get(type)); } private static final LoadingCache<Class<? extends Number>, NumberParser<?>> byType = CacheUtils.newCache(NumberParser::new); @Deprecated // @Inject me! public static <T extends Number> NumberParser<T> get(Class<T> type) { return (NumberParser<T>) byType.getUnchecked(type); } @Override protected T infinity(boolean sign) { return factory.infinity(sign); } @Override protected T parseFinite(Node node, String text) throws FormatException { try { return factory.parseFinite(text); } catch(NumberFormatException e) { throw new FormatException(); } } }