/* * Copyright 2010 Stephen Colebourne * * 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 org.joda.convert; import java.io.File; import java.math.BigDecimal; import java.math.BigInteger; import java.net.InetAddress; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; import java.net.UnknownHostException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Currency; import java.util.Date; import java.util.GregorianCalendar; import java.util.Locale; import java.util.TimeZone; import java.util.UUID; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; /** * Conversion between JDK classes and a {@code String}. */ enum JDKStringConverter implements StringConverter<Object> { /** * String converter. */ STRING(String.class) { public Object convertFromString(Class<?> cls, String str) { return str; } }, /** * CharSequence converter. */ CHAR_SEQUENCE(CharSequence.class) { public Object convertFromString(Class<?> cls, String str) { return str; } }, /** * StringBuffer converter. */ STRING_BUFFER(StringBuffer.class) { public Object convertFromString(Class<?> cls, String str) { return new StringBuffer(str); } }, /** * StringBuilder converter. */ STRING_BUILDER(StringBuilder.class) { public Object convertFromString(Class<?> cls, String str) { return new StringBuilder(str); } }, /** * Long converter. */ LONG(Long.class) { public Object convertFromString(Class<?> cls, String str) { return new Long(str); } }, /** * Integer converter. */ INTEGER(Integer.class) { public Object convertFromString(Class<?> cls, String str) { return new Integer(str); } }, /** * Short converter. */ SHORT (Short.class) { public Object convertFromString(Class<?> cls, String str) { return new Short(str); } }, /** * Byte converter. */ BYTE(Byte.class) { public Object convertFromString(Class<?> cls, String str) { return new Byte(str); } }, /** * Character converter. */ CHARACTER(Character.class) { public Object convertFromString(Class<?> cls, String str) { if (str.length() != 1) { throw new IllegalArgumentException("Character value must be a string length 1"); } return new Character(str.charAt(0)); } }, /** * Boolean converter. */ BOOLEAN(Boolean.class) { public Object convertFromString(Class<?> cls, String str) { if ("true".equalsIgnoreCase(str)) { return Boolean.TRUE; } if ("false".equalsIgnoreCase(str)) { return Boolean.FALSE; } throw new IllegalArgumentException("Boolean value must be 'true' or 'false', case insensitive"); } }, /** * Double converter. */ DOUBLE(Double.class) { public Object convertFromString(Class<?> cls, String str) { return new Double(str); } }, /** * Float converter. */ FLOAT(Float.class) { public Object convertFromString(Class<?> cls, String str) { return new Float(str); } }, /** * BigInteger converter. */ BIG_INTEGER(BigInteger.class) { public Object convertFromString(Class<?> cls, String str) { return new BigInteger(str); } }, /** * BigDecimal converter. */ BIG_DECIMAL(BigDecimal.class) { public Object convertFromString(Class<?> cls, String str) { return new BigDecimal(str); } }, /** * AtomicLong converter. */ ATOMIC_LONG(AtomicLong.class) { public Object convertFromString(Class<?> cls, String str) { long val = Long.parseLong(str); return new AtomicLong(val); } }, /** * AtomicLong converter. */ ATOMIC_INTEGER(AtomicInteger.class) { public Object convertFromString(Class<?> cls, String str) { int val = Integer.parseInt(str); return new AtomicInteger(val); } }, /** * AtomicBoolean converter. */ ATOMIC_BOOLEAN(AtomicBoolean.class) { public Object convertFromString(Class<?> cls, String str) { if ("true".equalsIgnoreCase(str)) { return new AtomicBoolean(true); } if ("false".equalsIgnoreCase(str)) { return new AtomicBoolean(false); } throw new IllegalArgumentException("Boolean value must be 'true' or 'false', case insensitive"); } }, /** * Locale converter. */ LOCALE(Locale.class) { public Object convertFromString(Class<?> cls, String str) { String[] split = str.split("_", 3); switch (split.length) { case 1: return new Locale(split[0]); case 2: return new Locale(split[0], split[1]); case 3: return new Locale(split[0], split[1], split[2]); } throw new IllegalArgumentException("Unable to parse Locale: " + str); } }, /** * Class converter. */ CLASS(Class.class) { @Override public String convertToString(Object object) { return ((Class<?>) object).getName(); } public Object convertFromString(Class<?> cls, String str) { try { return getClass().getClassLoader().loadClass(str); } catch (ClassNotFoundException ex) { throw new RuntimeException("Unable to create class: " + str, ex); } } }, /** * Package converter. */ PACKAGE(Package.class) { @Override public String convertToString(Object object) { return ((Package) object).getName(); } public Object convertFromString(Class<?> cls, String str) { return Package.getPackage(str); } }, /** * Currency converter. */ CURRENCY(Currency.class) { public Object convertFromString(Class<?> cls, String str) { return Currency.getInstance(str); } }, /** * TimeZone converter. */ TIME_ZONE(TimeZone.class) { @Override public String convertToString(Object object) { return ((TimeZone) object).getID(); } public Object convertFromString(Class<?> cls, String str) { return TimeZone.getTimeZone(str); } }, /** * UUID converter. */ UUID(UUID.class) { public Object convertFromString(Class<?> cls, String str) { return java.util.UUID.fromString(str); } }, /** * URL converter. */ URL(URL.class) { public Object convertFromString(Class<?> cls, String str) { try { return new URL(str); } catch (MalformedURLException ex) { throw new RuntimeException(ex.getMessage(), ex); } } }, /** * URI converter. */ URI(URI.class) { public Object convertFromString(Class<?> cls, String str) { return java.net.URI.create(str); } }, /** * InetAddress converter. */ INET_ADDRESS(InetAddress.class) { @Override public String convertToString(Object object) { return ((InetAddress) object).getHostAddress(); } public Object convertFromString(Class<?> cls, String str) { try { return InetAddress.getByName(str); } catch (UnknownHostException ex) { throw new RuntimeException(ex); } } }, /** * File converter. */ FILE(File.class) { public Object convertFromString(Class<?> cls, String str) { return new File(str); } }, /** * Date converter. */ DATE(Date.class) { @Override public String convertToString(Object object) { SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); String str = f.format(object); return str.substring(0, 26) + ":" + str.substring(26); } public Object convertFromString(Class<?> cls, String str) { if (str.length() != 29) { throw new IllegalArgumentException("Unable to parse date: " + str); } str = str.substring(0, 26) + str.substring(27); SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); try { return f.parseObject(str); } catch (ParseException ex) { throw new RuntimeException(ex); } } }, /** * Calendar converter. */ CALENDAR(Calendar.class) { @Override public String convertToString(Object object) { if (object instanceof GregorianCalendar == false) { throw new RuntimeException("Unable to convert calendar as it is not a GregorianCalendar"); } GregorianCalendar cal = (GregorianCalendar) object; SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); f.setCalendar(cal); String str = f.format(cal.getTime()); return str.substring(0, 26) + ":" + str.substring(26) + "[" + cal.getTimeZone().getID() + "]"; } public Object convertFromString(Class<?> cls, String str) { if (str.length() < 31 || str.charAt(26) != ':' || str.charAt(29) != '[' || str.charAt(str.length() - 1) != ']') { throw new IllegalArgumentException("Unable to parse date: " + str); } TimeZone zone = TimeZone.getTimeZone(str.substring(30, str.length() - 1)); str = str.substring(0, 26) + str.substring(27, 29); SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); GregorianCalendar cal = new GregorianCalendar(zone); cal.setTimeInMillis(0); f.setCalendar(cal); try { f.parseObject(str); return f.getCalendar(); } catch (ParseException ex) { throw new RuntimeException(ex); } } }, /** * Enum converter. */ ENUM(Enum.class) { @SuppressWarnings("rawtypes") public String convertToString(Object object) { return ((Enum) object).name(); // avoid toString() as that can be overridden } @SuppressWarnings({ "unchecked", "rawtypes" }) public Object convertFromString(Class cls, String str) { return Enum.valueOf(cls, str); } }, ; /** The type. */ private Class<?> type; /** * Creates an enum. * @param type the type, not null */ private JDKStringConverter(Class<?> type) { this.type = type; } /** * Gets the type of the converter. * @return the type, not null */ Class<?> getType() { return type; } //----------------------------------------------------------------------- public String convertToString(Object object) { return object.toString(); } }