All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.projectmonkey.object.mapper.construction.converter.DateConverter Maven / Gradle / Ivy

Go to download

Object mapping implementation written as an alternative to modelmapper which is able to support inheritance, handles flattening / expanding in a precise way, and is extensible / configurable

The newest version!
package net.projectmonkey.object.mapper.construction.converter;

import net.projectmonkey.object.mapper.construction.PopulationContext;
import net.projectmonkey.object.mapper.context.ConversionConfiguration;
import net.projectmonkey.object.mapper.context.ExecutionContext;
import org.apache.commons.lang3.StringUtils;
import sun.util.BuddhistCalendar;

import java.sql.Time;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/*
 *
 *  * Copyright 2012 the original author or authors.
 *  *
 *  * 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.
 *
 */

/**
 * Converts:
 * 

*

    *
  • Date
  • *
  • Calendar
  • *
  • java.sql.Timestamp
  • *
  • Long
  • *
  • String
  • *
*

* instances to destination instances of: *

*

    *
  • java.util.Date
  • *
  • java.util.Calendar
  • *
  • java.sql.Date
  • *
  • java.sql.Time
  • *
  • java.sql.Timestamp
  • *
*

* adapted from ModelMapper (modelmapper.org) * * @author Jonathan Halterman * @author Andy Moody */ public class DateConverter implements CacheableConverter { private static final String ISO_DATE_TIME_FORMAT = "yyyyMMdd'T'HH:mm:ss'Z'"; private static final String ISO_DATE_TIME_WITH_TZ_FORMAT = "yyyyMMdd'T'HH:mm:ss z"; private static final String ISO_EXTENDED_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'"; private static final String ISO_EXTENDED_DATE_TIME_WITH_TZ_FORMAT = "yyyy-MM-dd'T'HH:mm:ss z"; static final String[] DATE_AND_TIME_FORMATS = new String[]{ISO_DATE_TIME_FORMAT, ISO_DATE_TIME_WITH_TZ_FORMAT, ISO_EXTENDED_DATE_TIME_FORMAT, ISO_EXTENDED_DATE_TIME_WITH_TZ_FORMAT, "yyyy-MM-dd", "HH:mm:ss"}; public static final DateConverter INSTANCE = new DateConverter(); private DateConverter() { } @Override public Object convert(final PopulationContext context) { Object source = context.getSource(); Class destinationType = context.getDestinationType(); Object toReturn = null; if(source != null) { Calendar cal = null; if(source instanceof Calendar) { cal = (Calendar)source; } else if(source instanceof Date) { cal = Calendar.getInstance(); cal.setTime((Date)source); } else if(source instanceof Long) { cal = Calendar.getInstance(); cal.setTimeInMillis((Long) source); } else if(source instanceof String) { cal = getCalendarFor((String) source); } toReturn = dateFor(cal, destinationType); } return toReturn; } @Override public boolean canConvert(final PopulationContext context) { Class destinationType = context.getDestinationType(); return Date.class.isAssignableFrom(destinationType) || Calendar.class.isAssignableFrom(destinationType); } Object dateFor(Calendar source, Class destinationType) { Object toReturn; if(destinationType.equals(Date.class)) { toReturn = source.getTime(); } else if(destinationType.equals(Calendar.class)) { return source; } else if(destinationType.equals(java.sql.Date.class)) { toReturn = new java.sql.Date(source.getTimeInMillis()); } else if(destinationType.equals(Time.class)) { toReturn = new Time(source.getTimeInMillis()); } else if(destinationType.equals(Timestamp.class)) { toReturn = new Timestamp(source.getTimeInMillis()); } else { throw new IllegalArgumentException("Unknown destination type " + destinationType); } return toReturn; } private Calendar getCalendarFor(String source) { if(StringUtils.isBlank(source)) { throw new IllegalArgumentException("Cannot convert empty string to Calendar"); } String sourceString = source.trim(); Calendar calendar = parseUsingTimestamp(sourceString); if(calendar == null) { calendar = parseUsingConfiguredFormat(sourceString); } if(calendar == null) { throw new IllegalArgumentException("Unknown format, unable to convert string " + source + " to Calendar"); } return calendar; } private Calendar parseUsingConfiguredFormat(final String sourceString) { Collection customFormats = getConfiguration().getDateFormats(); List formats = new ArrayList(customFormats); formats.addAll(Arrays.asList(DATE_AND_TIME_FORMATS)); for(String format : formats) { try { SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format); simpleDateFormat.setLenient(false); simpleDateFormat.parse(sourceString); return simpleDateFormat.getCalendar(); } catch(ParseException e) { //ignore } } return null; } private Calendar parseUsingTimestamp(final String sourceString) { Calendar calendar = null; try { Timestamp timestamp = Timestamp.valueOf(sourceString); calendar = Calendar.getInstance(); calendar.setTimeInMillis(timestamp.getTime()); } catch(Exception e) { //ignore } return calendar; } public ConversionConfiguration getConfiguration() { return ExecutionContext.getConfiguration(); } @Override public Class[] getApplicableSourceTypes() { return new Class[]{Date.class, java.sql.Date.class, Time.class, Timestamp.class, Calendar.class, GregorianCalendar.class, BuddhistCalendar.class, Long.class, Long.TYPE, String.class}; } @Override public Class[] getApplicableDestinationTypes() { return new Class[]{Date.class, java.sql.Date.class, Time.class, Timestamp.class, Calendar.class, GregorianCalendar.class, BuddhistCalendar.class}; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy