/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.user.field; import java.util.Date; import java.util.Locale; import java.util.TimeZone; import org.apache.commons.lang.StringUtils; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import com.enonic.cms.api.client.model.user.Gender; import com.enonic.cms.api.plugin.ext.userstore.UserField; import com.enonic.cms.api.plugin.ext.userstore.UserFieldType; import com.enonic.cms.core.resolver.locale.LocaleParser; public final class UserFieldHelper { private final DateTimeFormatter DATE_FORMAT = DateTimeFormat.forPattern( "yyyyMMdd" ); private final DateTimeFormatter dateFormat; private DateTimeFormatter[] getSupportedDateFormats() { final DateTimeFormatter iso = DateTimeFormat.forPattern( "yyyy-MM-dd" ); final DateTimeFormatter old = DateTimeFormat.forPattern( "dd.MM.yyyy" ); final DateTimeFormatter standard = DATE_FORMAT; return new DateTimeFormatter[]{iso, old, standard}; } public UserFieldHelper() { this( null ); } public UserFieldHelper( String format ) { this.dateFormat = format != null ? DateTimeFormat.forPattern( format ) : DATE_FORMAT; } public String toString( UserField field ) { if ( field == null ) { return null; } Object value = field.getValue(); if ( value == null ) { return null; } if ( value instanceof Date ) { return formatDate( (Date) value ); } if ( value instanceof Boolean ) { return formatBoolean( (Boolean) value ); } if ( value instanceof Gender ) { return formatGender( (Gender) value ); } if ( value instanceof Locale ) { return formatLocale( (Locale) value ); } if ( value instanceof TimeZone ) { return formatTimezone( (TimeZone) value ); } return value.toString(); } public Object fromString( UserFieldType type, String value ) { if ( value == null ) { return null; } if ( type.isOfType( String.class ) ) { return value; } if ( type.isOfType( Date.class ) ) { return parseDate( value ); } if ( type.isOfType( Boolean.class ) ) { return parseBoolean( value ); } if ( type.isOfType( Gender.class ) ) { return parseGender( value ); } if ( type.isOfType( Locale.class ) ) { return parseLocale( value ); } if ( type.isOfType( TimeZone.class ) ) { return parseTimeZone( value ); } throw new IllegalArgumentException( "Convertion of type [" + type.getTypeClass().getName() + "] not supported" ); } private String formatDate( Date value ) { return value == null ? null : this.dateFormat.print( value.getTime() ); } private String formatBoolean( Boolean value ) { return value.toString(); } private String formatGender( Gender value ) { return value.toString().toLowerCase(); } private String formatLocale( Locale value ) { return value.toString(); } private String formatTimezone( TimeZone value ) { return value.getID(); } private Boolean parseBoolean( String value ) { if ( StringUtils.isBlank( value ) ) { return null; } return "|1|true|on".indexOf( value ) > 0; } private Gender parseGender( String value ) { if ( StringUtils.isBlank( value ) ) { return null; } if ( value.equalsIgnoreCase( "m" ) || value.equalsIgnoreCase( "male" ) ) { return Gender.MALE; } if ( value.equalsIgnoreCase( "f" ) || value.equalsIgnoreCase( "female" ) ) { return Gender.FEMALE; } return null; } private Locale parseLocale( final String value ) { if ( StringUtils.isBlank( value ) ) { return null; } return LocaleParser.parseLocale( value ); } private TimeZone parseTimeZone( String value ) { if ( StringUtils.isBlank( value ) ) { return null; } return TimeZone.getTimeZone( value ); } private Date parseDate( String value ) { if ( StringUtils.isEmpty( value ) ) { return null; } for ( final DateTimeFormatter format : getSupportedDateFormats() ) { Date date = parseDate( value, format ); if ( date != null ) { return date; } } throw new IllegalArgumentException( "Could not parse date " + value ); } private Date parseDate( String value, DateTimeFormatter format ) { try { return format.parseDateTime( value ).toDate(); } catch ( Exception e ) { return null; } } }