Package com.facebook.presto.jdbc.internal.jackson.datatype.joda.ser

Source Code of com.facebook.presto.jdbc.internal.jackson.datatype.joda.ser.JacksonJodaFormat

package com.facebook.presto.jdbc.internal.jackson.datatype.joda.ser;

import java.util.Locale;
import java.util.TimeZone;

import com.facebook.presto.jdbc.internal.joda.time.DateTimeZone;
import com.facebook.presto.jdbc.internal.joda.time.format.DateTimeFormat;
import com.facebook.presto.jdbc.internal.joda.time.format.DateTimeFormatter;

import com.facebook.presto.jdbc.internal.jackson.databind.SerializationFeature;
import com.facebook.presto.jdbc.internal.jackson.databind.SerializerProvider;

/**
* Simple container used to encapsulate (some of) gory details of
* customizations related to date/time formatting.
*/
public class JacksonJodaFormat
{
    private final static String JODA_STYLE_CHARS = "SMLF-";

    protected final static Locale DEFAULT_LOCALE;
    static {
        DEFAULT_LOCALE = Locale.getDefault();
    }

    protected final DateTimeFormatter _formatter;
   
    /**
     * Flag that indicates that serialization must be done as the
     * Java timestamp, regardless of other settings.
     */
    protected final Boolean _useTimestamp;
   
    protected final TimeZone _jdkTimezone;

    protected final boolean _explicitTimezone;
   
    protected final Locale _locale;

    protected final boolean _explicitLocale;
   
    public JacksonJodaFormat(DateTimeFormatter defaultFormatter) {
        _useTimestamp = null;
        _jdkTimezone = defaultFormatter.getZone().toTimeZone();
        _locale = DEFAULT_LOCALE;
        _formatter = defaultFormatter;
        _explicitTimezone = false;
        _explicitLocale = false;
    }

    public JacksonJodaFormat(JacksonJodaFormat base, Boolean useTimestamp)
    {
        _useTimestamp = useTimestamp;
        _formatter = base._formatter;
        _jdkTimezone = base._jdkTimezone;
        _explicitTimezone = base._explicitTimezone;
        _locale = base._locale;
        _explicitLocale = base._explicitLocale;
    }
   
    public JacksonJodaFormat(JacksonJodaFormat base,
            DateTimeFormatter formatter)
    {
        _useTimestamp = base._useTimestamp;
        _formatter = formatter;
        _jdkTimezone = base._jdkTimezone;
        _explicitTimezone = base._explicitTimezone;
        _locale = base._locale;
        _explicitLocale = base._explicitLocale;
    }

    public JacksonJodaFormat(JacksonJodaFormat base, TimeZone jdkTimezone)
    {
        _useTimestamp = base._useTimestamp;
        _jdkTimezone = jdkTimezone;
        _explicitTimezone = true;
        _locale = base._locale;
        _explicitLocale = base._explicitLocale;
        _formatter = base._formatter.withZone(DateTimeZone.forTimeZone(jdkTimezone));
    }

    public JacksonJodaFormat(JacksonJodaFormat base, Locale locale)
    {
        _useTimestamp = base._useTimestamp;
        _jdkTimezone = base._jdkTimezone;
        _explicitTimezone = base._explicitTimezone;
        _locale = locale;
        _explicitLocale = true;
        _formatter = base._formatter.withLocale(locale);
    }

    /*
    /**********************************************************
    /* Factory methods
    /**********************************************************
     */

    protected JacksonJodaFormat withUseTimestamp(Boolean useTimestamp) {
        if (_useTimestamp != null && _useTimestamp.equals(useTimestamp)) {
            return this;
        }
        return new JacksonJodaFormat(this, useTimestamp);
    }
   
    protected JacksonJodaFormat withFormat(String format) {
        if (format == null || format.isEmpty()) {
            return this;
        }
        DateTimeFormatter formatter;

        if (_isStyle(format)) {
            formatter = DateTimeFormat.forStyle(format);
        } else {
            formatter = DateTimeFormat.forPattern(format);
        }
        if (_locale != null) {
            formatter = formatter.withLocale(_locale);
        }
        formatter = formatter.withZone(_formatter.getZone());
        return new JacksonJodaFormat(this, formatter);
    }
   
    protected JacksonJodaFormat withTimeZone(TimeZone tz) {
        if ((tz == null) || (_jdkTimezone != null && _jdkTimezone.equals(tz))) {
            return this;
        }
        return new JacksonJodaFormat(this, tz);
    }

    protected JacksonJodaFormat withLocale(Locale locale) {
        if ((locale == null) || (_locale != null && _locale.equals(locale))) {
            return this;
        }
        return new JacksonJodaFormat(this, locale);
    }

    /*
    /**********************************************************
    /* Factory methods for other types
    /**********************************************************
     */

    public boolean useTimestamp(SerializerProvider provider)
    {
        if (_useTimestamp != null) {
            return _useTimestamp.booleanValue();
        }
        return provider.isEnabled(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    }
   
    public DateTimeFormatter createFormatter(SerializerProvider provider)
    {
        DateTimeFormatter formatter = _formatter;
       
        if (!_explicitLocale) {
            Locale loc = provider.getLocale();
            if (loc != null && !loc.equals(_locale)) {
                formatter = formatter.withLocale(loc);
            }
        }
        if (!_explicitTimezone) {
            TimeZone tz = provider.getTimeZone();
            if (tz != null && !tz.equals(_jdkTimezone)) {
                formatter = formatter.withZone(DateTimeZone.forTimeZone(tz));
            }
        }
       
        return formatter;
    }
   
    /*
    /**********************************************************
    /* Helper methods
    /**********************************************************
     */
   
    protected static boolean _isStyle(String formatStr) {
        if (formatStr.length() != 2) {
            return false;
        }
        return (JODA_STYLE_CHARS.indexOf(formatStr.charAt(0)) >= 0)
                && (JODA_STYLE_CHARS.indexOf(formatStr.charAt(0)) >= 0);
    }
}
TOP

Related Classes of com.facebook.presto.jdbc.internal.jackson.datatype.joda.ser.JacksonJodaFormat

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.