com.fasterxml.jackson.datatype.joda.ser.JacksonJodaFormat.java Source code

Java tutorial

Introduction

Here is the source code for com.fasterxml.jackson.datatype.joda.ser.JacksonJodaFormat.java

Source

package com.fasterxml.jackson.datatype.joda.ser;

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

import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.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);
    }
}