Open Source Repository

Home /json/flexjson-2.1 | Repository Home



flexjson/factories/DateObjectFactory.java
package flexjson.factories;

import flexjson.ObjectFactory;
import flexjson.JSONException;
import flexjson.ObjectBinder;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Type;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.List;
import java.util.ArrayList;
import java.util.Date;

public class DateObjectFactory implements ObjectFactory {
    List<DateFormat> dateFormats;

    public DateObjectFactory() {
        dateFormats = new ArrayList<DateFormat>();
        dateFormats.addDateFormat.getDateTimeInstance() );
        dateFormats.add(DateFormat.getDateTimeInstanceDateFormat.LONG, DateFormat.LONG ) );
        dateFormats.add(DateFormat.getDateTimeInstanceDateFormat.MEDIUM, DateFormat.MEDIUM ) );
        dateFormats.add(DateFormat.getDateTimeInstanceDateFormat.SHORT, DateFormat.SHORT ) );
        dateFormats.addnew SimpleDateFormat("EEE MMM d hh:mm:ss a z yyyy") );
        dateFormats.addnew SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy") );
        dateFormats.addnew SimpleDateFormat("MM/dd/yy hh:mm:ss a"));
        dateFormats.addnew SimpleDateFormat("MM/dd/yy") );
    }

    public DateObjectFactory(List<DateFormat> dateFormats) {
        this.dateFormats = dateFormats;
    }

    public Object instantiate(ObjectBinder context, Object value, Type targetType, Class targetClass) {
        try {
            ifvalue instanceof Double ) {
                return instantiateDate( (Class)targetType, ((Double)value).longValue(), context );
            else ifvalue instanceof Long ) {
                return instantiateDate( (Class)targetType, (Long)value, context );
            else {
                forDateFormat format : dateFormats ) {
                    try {
                        return format.parsevalue.toString() );
                    catch (ParseException e) {
                        // try next format
                    }
                }
                throw new JSONExceptionString.format("%s:  Parsing date %s was not recognized as a date format", context.getCurrentPath(), value ) );
            }
        catch (IllegalAccessException e) {
            throw new JSONExceptionString.format("%s:  Error encountered trying to instantiate %s", context.getCurrentPath()((Class)targetType).getName() ), e);
        catch (InstantiationException e) {
            throw new JSONExceptionString.format("%s:  Error encountered trying to instantiate %s.  Make sure there is a public constructor that accepts a single Long.", context.getCurrentPath()((Class)targetType).getName() ), e);
        catch (InvocationTargetException e) {
            throw new JSONExceptionString.format("%s:  Error encountered trying to instantiate %s.  Make sure there is a public constructor that accepts a single Long.", context.getCurrentPath()((Class)targetType).getName() ), e);
        }
    }

    private Date instantiateDateClass targetType, Long value, ObjectBinder context throws IllegalAccessException, InstantiationException, InvocationTargetException {
        try {
            Constructor constructor = targetType.getConstructor(Long.TYPE);
            return (Date)constructor.newInstancevalue );
        catch (NoSuchMethodException e) {
            Date d = (Date)targetType.newInstance();
            d.setTimevalue );
            return d;
        }
    }
}