Author: ggregory
Date: Fri May 30 16:47:59 2014
New Revision: 1598666
URL: http://svn.apache.org/r1598666
Log:
Sort members.
Modified:
logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/TypeConverters.java
Modified:
logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/TypeConverters.java
URL:
http://svn.apache.org/viewvc/logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/TypeConverters.java?rev=1598666&r1=1598665&r2=1598666&view=diff
==============================================================================
---
logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/TypeConverters.java
(original)
+++
logging/log4j/log4j2/trunk/log4j-core/src/main/java/org/apache/logging/log4j/core/config/plugins/util/TypeConverters.java
Fri May 30 16:47:59 2014
@@ -48,147 +48,66 @@ public final class TypeConverters {
// TODO: this could probably be combined with the usual plugin
architecture instead
- private static final Logger LOGGER = StatusLogger.getLogger();
-
- private final Map<Class<?>, TypeConverter<?>> registry =
- new ConcurrentHashMap<Class<?>, TypeConverter<?>>();
-
- private static final class Holder {
- private static final TypeConverters INSTANCE = new TypeConverters();
- }
-
/**
- * Constructs default TypeConverter registry. Used solely by singleton
instance.
+ * Parses a {@link String} into a {@link BigDecimal}.
*/
- private TypeConverters() {
- // Primitive wrappers
- registry.put(Boolean.class, new BooleanConverter());
- registry.put(Byte.class, new ByteConverter());
- registry.put(Character.class, new CharacterConverter());
- registry.put(Double.class, new DoubleConverter());
- registry.put(Float.class, new FloatConverter());
- registry.put(Integer.class, new IntegerConverter());
- registry.put(Long.class, new LongConverter());
- registry.put(Short.class, new ShortConverter());
- // Primitives
- registry.put(boolean.class, registry.get(Boolean.class));
- registry.put(byte.class, new ByteConverter());
- registry.put(char[].class, new CharArrayConverter());
- registry.put(double.class, registry.get(Double.class));
- registry.put(float.class, registry.get(Float.class));
- registry.put(int.class, registry.get(Integer.class));
- registry.put(long.class, registry.get(Long.class));
- registry.put(short.class, registry.get(Short.class));
- // Primitive arrays
- registry.put(byte[].class, new ByteArrayConverter());
- registry.put(char.class, new CharacterConverter());
- // Numbers
- registry.put(BigInteger.class, new BigIntegerConverter());
- registry.put(BigDecimal.class, new BigDecimalConverter());
- // JRE
- registry.put(String.class, new StringConverter());
- registry.put(Charset.class, new CharsetConverter());
- registry.put(File.class, new FileConverter());
- registry.put(URL.class, new UrlConverter());
- registry.put(URI.class, new UriConverter());
- registry.put(Class.class, new ClassConverter());
- registry.put(Pattern.class, new PatternConverter());
- // Log4J
- registry.put(Level.class, new LevelConverter());
- registry.put(Filter.Result.class, new
EnumConverter<Filter.Result>(Filter.Result.class));
- registry.put(Facility.class, new
EnumConverter<Facility>(Facility.class));
- registry.put(Protocol.class, new
EnumConverter<Protocol>(Protocol.class));
- registry.put(HtmlLayout.FontSize.class, new
EnumConverter<HtmlLayout.FontSize>(HtmlLayout.FontSize.class));
+ private static class BigDecimalConverter implements
TypeConverter<BigDecimal> {
+ @Override
+ public BigDecimal convert(final String s) {
+ return new BigDecimal(s);
+ }
}
/**
- * Locates a TypeConverter for a specified class.
- *
- * @param clazz the class to get a TypeConverter for
- * @return the associated TypeConverter for that class or {@code null} if
none could be found
+ * Parses a {@link String} into a {@link BigInteger}.
*/
- public static TypeConverter<?> findTypeConverter(final Class<?> clazz) {
- // TODO: what to do if there's no converter?
- // supplementary idea: automatically add type converters for enums
using EnglishEnums
- // Idea 1: use reflection to see if the class has a static "valueOf"
method and use that
- // Idea 2: reflect on class's declared methods to see if any methods
look suitable (probably too complex)
- return Holder.INSTANCE.registry.get(clazz);
+ private static class BigIntegerConverter implements
TypeConverter<BigInteger> {
+ @Override
+ public BigInteger convert(final String s) {
+ return new BigInteger(s);
+ }
}
/**
- * Registers a TypeConverter for a specified class. This will overwrite
any existing TypeConverter that may be
- * registered for the class.
- *
- * @param clazz the class to register the TypeConverter for
- * @param converter the TypeConverter to register
+ * Converts a {@link String} into a {@link Boolean}.
*/
- public static void registerTypeConverter(final Class<?> clazz, final
TypeConverter<?> converter) {
- Holder.INSTANCE.registry.put(clazz, converter);
+ private static class BooleanConverter implements TypeConverter<Boolean> {
+ @Override
+ public Boolean convert(final String s) {
+ return Boolean.valueOf(s);
+ }
}
/**
- * Converts a String to a given class if a TypeConverter is available for
that class. Falls back to the provided
- * default value if the conversion is unsuccessful. However, if the
default value is <em>also</em> invalid, then
- * {@code null} is returned (along with a nasty status log message).
- *
- * @param s the string to convert
- * @param clazz the class to try to convert the string to
- * @param defaultValue the fallback object to use if the conversion is
unsuccessful
- * @return the converted object which may be {@code null} if the string is
invalid for the given type
- * @throws NullPointerException if {@code clazz} is {@code null}
- * @throws IllegalArgumentException if no TypeConverter exists for the
given class
+ * Converts a {@link String} into a {@code byte[]}.
*/
- public static Object convert(final String s, final Class<?> clazz, final
Object defaultValue) {
- final TypeConverter<?> converter = findTypeConverter(
- Assert.requireNonNull(clazz, "No class specified to convert to."));
- if (converter == null) {
- throw new IllegalArgumentException("No type converter found for
class: " + clazz.getName());
- }
- if (s == null) {
- LOGGER.debug("Null string given to convert. Using default [{}].",
defaultValue);
- return parseDefaultValue(converter, defaultValue);
- }
- try {
- return converter.convert(s);
- } catch (final Exception e) {
- LOGGER.warn("Error while converting string [{}] to type [{}].
Using default value [{}].", s, clazz,
- defaultValue, e);
- return parseDefaultValue(converter, defaultValue);
- }
- }
-
- private static Object parseDefaultValue(final TypeConverter<?> converter,
final Object defaultValue) {
- if (defaultValue == null) {
- return null;
- }
- if (!(defaultValue instanceof String)) {
- return defaultValue;
- }
- try {
- return converter.convert((String) defaultValue);
- } catch (final Exception e) {
- LOGGER.debug("Can't parse default value [{}] for type [{}].",
defaultValue, converter.getClass(), e);
- return null;
+ private static class ByteArrayConverter implements TypeConverter<byte[]> {
+ @Override
+ public byte[] convert(final String s) {
+ return s.getBytes(Charset.defaultCharset());
}
}
/**
- * Returns the given {@link String}, no conversion takes place.
+ * Converts a {@link String} into a {@link Byte}.
*/
- private static class StringConverter implements TypeConverter<String> {
+ private static class ByteConverter implements TypeConverter<Byte> {
@Override
- public String convert(final String s) {
- return s;
+ public Byte convert(final String s) {
+ return Byte.valueOf(s);
}
}
/**
- * Converts a {@link String} into a {@link File}.
+ * Converts a {@link String} into a {@link Character}.
*/
- private static class FileConverter implements TypeConverter<File> {
+ private static class CharacterConverter implements
TypeConverter<Character> {
@Override
- public File convert(final String s) {
- return new File(s);
+ public Character convert(final String s) {
+ if (s.length() != 1) {
+ throw new IllegalArgumentException("Character string must be
of length 1: " + s);
+ }
+ return Character.valueOf(s.toCharArray()[0]);
}
}
@@ -203,12 +122,12 @@ public final class TypeConverters {
}
/**
- * Converts a {@link String} into a {@code byte[]}.
+ * Converts a {@link String} into a {@link Charset}.
*/
- private static class ByteArrayConverter implements TypeConverter<byte[]> {
+ private static class CharsetConverter implements TypeConverter<Charset> {
@Override
- public byte[] convert(final String s) {
- return s.getBytes(Charset.defaultCharset());
+ public Charset convert(final String s) {
+ return Charset.forName(s);
}
}
@@ -223,58 +142,57 @@ public final class TypeConverters {
}
/**
- * Converts a {@link String} into a {@link URI}.
+ * Converts a {@link String} into a {@link Double}.
*/
- private static class UriConverter implements TypeConverter<URI> {
+ private static class DoubleConverter implements TypeConverter<Double> {
@Override
- public URI convert(final String s) throws URISyntaxException {
- return new URI(s);
+ public Double convert(final String s) {
+ return Double.valueOf(s);
}
}
/**
- * Converts a {@link String} into a {@link URL}.
+ * Converts a {@link String} into a {@link Enum}. Returns {@code null} for
invalid enum names.
+ *
+ * @param <E> the enum class to parse.
*/
- private static class UrlConverter implements TypeConverter<URL> {
- @Override
- public URL convert(final String s) throws MalformedURLException {
- return new URL(s);
+ private static class EnumConverter<E extends Enum<E>> implements
TypeConverter<E> {
+ private final Class<E> clazz;
+
+ private EnumConverter(final Class<E> clazz) {
+ this.clazz = clazz;
}
- }
- /**
- * Converts a {@link String} into a {@link Boolean}.
- */
- private static class BooleanConverter implements TypeConverter<Boolean> {
@Override
- public Boolean convert(final String s) {
- return Boolean.valueOf(s);
+ public E convert(final String s) {
+ return EnglishEnums.valueOf(clazz, s);
}
}
/**
- * Converts a {@link String} into a {@link Byte}.
+ * Converts a {@link String} into a {@link File}.
*/
- private static class ByteConverter implements TypeConverter<Byte> {
+ private static class FileConverter implements TypeConverter<File> {
@Override
- public Byte convert(final String s) {
- return Byte.valueOf(s);
+ public File convert(final String s) {
+ return new File(s);
}
}
/**
- * Converts a {@link String} into a {@link Character}.
+ * Converts a {@link String} into a {@link Float}.
*/
- private static class CharacterConverter implements
TypeConverter<Character> {
+ private static class FloatConverter implements TypeConverter<Float> {
@Override
- public Character convert(final String s) {
- if (s.length() != 1) {
- throw new IllegalArgumentException("Character string must be
of length 1: " + s);
- }
- return Character.valueOf(s.toCharArray()[0]);
+ public Float convert(final String s) {
+ return Float.valueOf(s);
}
}
+ private static final class Holder {
+ private static final TypeConverters INSTANCE = new TypeConverters();
+ }
+
/**
* Converts a {@link String} into a {@link Integer}.
*/
@@ -286,12 +204,12 @@ public final class TypeConverters {
}
/**
- * Converts a {@link String} into a {@link Short}.
+ * Converts a {@link String} into a Log4j {@link Level}. Returns {@code
null} for invalid level names.
*/
- private static class ShortConverter implements TypeConverter<Short> {
+ private static class LevelConverter implements TypeConverter<Level> {
@Override
- public Short convert(final String s) {
- return Short.valueOf(s);
+ public Level convert(final String s) {
+ return Level.valueOf(s);
}
}
@@ -306,90 +224,172 @@ public final class TypeConverters {
}
/**
- * Converts a {@link String} into a {@link Float}.
+ * Converts a {@link String} into a {@link Pattern}.
*/
- private static class FloatConverter implements TypeConverter<Float> {
+ private static class PatternConverter implements TypeConverter<Pattern> {
@Override
- public Float convert(final String s) {
- return Float.valueOf(s);
+ public Pattern convert(final String s) {
+ return Pattern.compile(s);
}
}
/**
- * Converts a {@link String} into a {@link Double}.
+ * Converts a {@link String} into a {@link Short}.
*/
- private static class DoubleConverter implements TypeConverter<Double> {
+ private static class ShortConverter implements TypeConverter<Short> {
@Override
- public Double convert(final String s) {
- return Double.valueOf(s);
+ public Short convert(final String s) {
+ return Short.valueOf(s);
}
}
/**
- * Converts a {@link String} into a {@link Pattern}.
+ * Returns the given {@link String}, no conversion takes place.
*/
- private static class PatternConverter implements TypeConverter<Pattern> {
+ private static class StringConverter implements TypeConverter<String> {
@Override
- public Pattern convert(final String s) {
- return Pattern.compile(s);
+ public String convert(final String s) {
+ return s;
}
}
/**
- * Converts a {@link String} into a {@link Charset}.
+ * Converts a {@link String} into a {@link URI}.
*/
- private static class CharsetConverter implements TypeConverter<Charset> {
+ private static class UriConverter implements TypeConverter<URI> {
@Override
- public Charset convert(final String s) {
- return Charset.forName(s);
+ public URI convert(final String s) throws URISyntaxException {
+ return new URI(s);
}
}
/**
- * Parses a {@link String} into a {@link BigDecimal}.
+ * Converts a {@link String} into a {@link URL}.
*/
- private static class BigDecimalConverter implements
TypeConverter<BigDecimal> {
+ private static class UrlConverter implements TypeConverter<URL> {
@Override
- public BigDecimal convert(final String s) {
- return new BigDecimal(s);
+ public URL convert(final String s) throws MalformedURLException {
+ return new URL(s);
}
}
/**
- * Parses a {@link String} into a {@link BigInteger}.
+ * Converts a String to a given class if a TypeConverter is available for
that class. Falls back to the provided
+ * default value if the conversion is unsuccessful. However, if the
default value is <em>also</em> invalid, then
+ * {@code null} is returned (along with a nasty status log message).
+ *
+ * @param s the string to convert
+ * @param clazz the class to try to convert the string to
+ * @param defaultValue the fallback object to use if the conversion is
unsuccessful
+ * @return the converted object which may be {@code null} if the string is
invalid for the given type
+ * @throws NullPointerException if {@code clazz} is {@code null}
+ * @throws IllegalArgumentException if no TypeConverter exists for the
given class
*/
- private static class BigIntegerConverter implements
TypeConverter<BigInteger> {
- @Override
- public BigInteger convert(final String s) {
- return new BigInteger(s);
+ public static Object convert(final String s, final Class<?> clazz, final
Object defaultValue) {
+ final TypeConverter<?> converter = findTypeConverter(
+ Assert.requireNonNull(clazz, "No class specified to convert to."));
+ if (converter == null) {
+ throw new IllegalArgumentException("No type converter found for
class: " + clazz.getName());
+ }
+ if (s == null) {
+ LOGGER.debug("Null string given to convert. Using default [{}].",
defaultValue);
+ return parseDefaultValue(converter, defaultValue);
+ }
+ try {
+ return converter.convert(s);
+ } catch (final Exception e) {
+ LOGGER.warn("Error while converting string [{}] to type [{}].
Using default value [{}].", s, clazz,
+ defaultValue, e);
+ return parseDefaultValue(converter, defaultValue);
}
}
/**
- * Converts a {@link String} into a Log4j {@link Level}. Returns {@code
null} for invalid level names.
+ * Locates a TypeConverter for a specified class.
+ *
+ * @param clazz the class to get a TypeConverter for
+ * @return the associated TypeConverter for that class or {@code null} if
none could be found
*/
- private static class LevelConverter implements TypeConverter<Level> {
- @Override
- public Level convert(final String s) {
- return Level.valueOf(s);
+ public static TypeConverter<?> findTypeConverter(final Class<?> clazz) {
+ // TODO: what to do if there's no converter?
+ // supplementary idea: automatically add type converters for enums
using EnglishEnums
+ // Idea 1: use reflection to see if the class has a static "valueOf"
method and use that
+ // Idea 2: reflect on class's declared methods to see if any methods
look suitable (probably too complex)
+ return Holder.INSTANCE.registry.get(clazz);
+ }
+
+ private static Object parseDefaultValue(final TypeConverter<?> converter,
final Object defaultValue) {
+ if (defaultValue == null) {
+ return null;
+ }
+ if (!(defaultValue instanceof String)) {
+ return defaultValue;
+ }
+ try {
+ return converter.convert((String) defaultValue);
+ } catch (final Exception e) {
+ LOGGER.debug("Can't parse default value [{}] for type [{}].",
defaultValue, converter.getClass(), e);
+ return null;
}
}
/**
- * Converts a {@link String} into a {@link Enum}. Returns {@code null} for
invalid enum names.
+ * Registers a TypeConverter for a specified class. This will overwrite
any existing TypeConverter that may be
+ * registered for the class.
*
- * @param <E> the enum class to parse.
+ * @param clazz the class to register the TypeConverter for
+ * @param converter the TypeConverter to register
*/
- private static class EnumConverter<E extends Enum<E>> implements
TypeConverter<E> {
- private final Class<E> clazz;
+ public static void registerTypeConverter(final Class<?> clazz, final
TypeConverter<?> converter) {
+ Holder.INSTANCE.registry.put(clazz, converter);
+ }
- private EnumConverter(final Class<E> clazz) {
- this.clazz = clazz;
- }
+ private static final Logger LOGGER = StatusLogger.getLogger();
- @Override
- public E convert(final String s) {
- return EnglishEnums.valueOf(clazz, s);
- }
+ private final Map<Class<?>, TypeConverter<?>> registry =
+ new ConcurrentHashMap<Class<?>, TypeConverter<?>>();
+
+ /**
+ * Constructs default TypeConverter registry. Used solely by singleton
instance.
+ */
+ private TypeConverters() {
+ // Primitive wrappers
+ registry.put(Boolean.class, new BooleanConverter());
+ registry.put(Byte.class, new ByteConverter());
+ registry.put(Character.class, new CharacterConverter());
+ registry.put(Double.class, new DoubleConverter());
+ registry.put(Float.class, new FloatConverter());
+ registry.put(Integer.class, new IntegerConverter());
+ registry.put(Long.class, new LongConverter());
+ registry.put(Short.class, new ShortConverter());
+ // Primitives
+ registry.put(boolean.class, registry.get(Boolean.class));
+ registry.put(byte.class, new ByteConverter());
+ registry.put(char[].class, new CharArrayConverter());
+ registry.put(double.class, registry.get(Double.class));
+ registry.put(float.class, registry.get(Float.class));
+ registry.put(int.class, registry.get(Integer.class));
+ registry.put(long.class, registry.get(Long.class));
+ registry.put(short.class, registry.get(Short.class));
+ // Primitive arrays
+ registry.put(byte[].class, new ByteArrayConverter());
+ registry.put(char.class, new CharacterConverter());
+ // Numbers
+ registry.put(BigInteger.class, new BigIntegerConverter());
+ registry.put(BigDecimal.class, new BigDecimalConverter());
+ // JRE
+ registry.put(String.class, new StringConverter());
+ registry.put(Charset.class, new CharsetConverter());
+ registry.put(File.class, new FileConverter());
+ registry.put(URL.class, new UrlConverter());
+ registry.put(URI.class, new UriConverter());
+ registry.put(Class.class, new ClassConverter());
+ registry.put(Pattern.class, new PatternConverter());
+ // Log4J
+ registry.put(Level.class, new LevelConverter());
+ registry.put(Filter.Result.class, new
EnumConverter<Filter.Result>(Filter.Result.class));
+ registry.put(Facility.class, new
EnumConverter<Facility>(Facility.class));
+ registry.put(Protocol.class, new
EnumConverter<Protocol>(Protocol.class));
+ registry.put(HtmlLayout.FontSize.class, new
EnumConverter<HtmlLayout.FontSize>(HtmlLayout.FontSize.class));
}
}