/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.user.field; import java.util.HashMap; import java.util.Map; import org.apache.commons.fileupload.FileItem; import com.enonic.esl.containers.ExtendedMap; import com.enonic.cms.api.plugin.ext.userstore.UserField; import com.enonic.cms.api.plugin.ext.userstore.UserFieldType; import com.enonic.cms.api.plugin.ext.userstore.UserFields; import com.enonic.cms.api.plugin.ext.userstore.UserStoreConfig; public final class UserFieldTransformer { private final AddressTransformer addressTransformer = new AddressTransformer(); private final UserFieldHelper helper = new UserFieldHelper(); private boolean transformNullValuesToBlanksForConfiguredFields = false; private boolean transformNullHtmlEmailValueToFalseIfConfigured = false; private UserStoreConfig userStoreConfig = null; public UserFieldTransformer transformNullValuesToBlanksForConfiguredFields( UserStoreConfig userStoreConfig ) { transformNullValuesToBlanksForConfiguredFields = true; this.userStoreConfig = userStoreConfig; return this; } public UserFieldTransformer transformNullHtmlEmailValueToFalseIfConfigured( UserStoreConfig userStoreConfig ) { transformNullHtmlEmailValueToFalseIfConfigured = true; this.userStoreConfig = userStoreConfig; return this; } public UserFields toUserFields( ExtendedMap formValues ) { Map<String, String> map = toStringStringMap( formValues ); UserFields fields = fromStoreableMap( map ); FileItem item = formValues.getFileItem( UserFieldType.PHOTO.getName(), null ); if ( item != null ) { updatePhoto( fields, UserPhotoHelper.convertPhoto( item.get() ) ); } return fields; } public UserFields fromStoreableMap( Map<String, String> map ) { UserFields fields = new UserFields( true ); for ( UserFieldType type : UserFieldType.values() ) { updateUserField( fields, type, map ); } fields.addAll( this.addressTransformer.fromStoreableMap( map ).getAll() ); return fields; } public void updatePhoto( UserFields fields, byte[] value ) { if ( value != null ) { fields.add( new UserField( UserFieldType.PHOTO, value ) ); } } public Map<String, String> toStoreableMap( UserFields fields ) { HashMap<String, String> result = new HashMap<String, String>(); for ( UserField field : fields ) { if ( !field.isAddress() && !field.isPhoto() ) { addSimpleField( result, field ); } } result.putAll( this.addressTransformer.toStoreableMap( fields ) ); return result; } private Map<String, String> toStringStringMap( ExtendedMap formValues ) { HashMap<String, String> map = new HashMap<String, String>(); for ( Object key : formValues.keySet() ) { String name = key.toString().replace( "_", "-" ); Object value = formValues.get( key ); if ( value instanceof String ) { map.put( name, (String) value ); } } return map; } private void updateUserField( UserFields fields, UserFieldType type, Map<String, String> map ) { if ( type == UserFieldType.ADDRESS ) { return; } if ( type != UserFieldType.PHOTO ) { updateSimpleField( fields, type, map ); } } private void updateSimpleField( UserFields fields, UserFieldType type, Map<String, String> map ) { String value = map.get( type.getName() ); if ( value == null && type == UserFieldType.HTML_EMAIL && transformNullHtmlEmailValueToFalseIfConfigured && fieldIsConfigured( type ) ) { value = "false"; } else if ( value == null && transformNullValuesToBlanksForConfiguredFields && fieldIsConfigured( type ) ) { value = ""; } if ( value != null ) { Object typedValue = this.helper.fromString( type, value ); fields.add( new UserField( type, typedValue ) ); } } private boolean fieldIsConfigured( UserFieldType type ) { return userStoreConfig.getUserFieldConfig( type ) != null; } private void addSimpleField( Map<String, String> result, UserField field ) { UserFieldType type = field.getType(); String strValue = this.helper.toString( field ); if ( !field.getType().isStringBased() ) { addNullable( result, type.getName(), strValue ); } else { addIfNotNull( result, type.getName(), strValue ); } } private void addIfNotNull( Map<String, String> result, String name, String value ) { if ( value != null ) { result.put( name, value ); } } private void addNullable( Map<String, String> result, String name, String value ) { result.put( name, value ); } }