/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.user.field;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import com.enonic.cms.api.client.model.user.Address;
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;
public final class AddressTransformer
{
private final static int MAX_INDEX = 100;
private final static String F_COUNTRY = "country";
private final static String F_ISO_COUNTRY = "iso-country";
private final static String F_REGION = "region";
private final static String F_ISO_REGION = "iso-region";
private final static String F_LABEL = "label";
private final static String F_STREET = "street";
private final static String F_POSTAL_CODE = "postal-code";
private final static String F_POSTAL_ADDRESS = "postal-address";
private Address[] toAddresses( UserFields fields )
{
LinkedList<Address> list = new LinkedList<Address>();
for ( UserField field : fields.getFields( UserFieldType.ADDRESS ) )
{
list.add( (Address) field.getValue() );
}
return list.toArray( new Address[list.size()] );
}
public Map<String, String> toStoreableMap( UserFields fields )
{
HashMap<String, String> result = new HashMap<String, String>();
Address[] addresses = toAddresses( fields );
for ( int i = 0; i < addresses.length; i++ )
{
addAddress( result, addresses[i], i );
}
return result;
}
private void addAddress( Map<String, String> result, Address address, int index )
{
String prefix = UserFieldType.ADDRESS.getName() + "[" + index + "].";
addIfNotNull( result, prefix + F_COUNTRY, address.getCountry() );
addIfNotNull( result, prefix + F_ISO_COUNTRY, address.getIsoCountry() );
addIfNotNull( result, prefix + F_ISO_REGION, address.getIsoRegion() );
addIfNotNull( result, prefix + F_LABEL, address.getLabel() );
addIfNotNull( result, prefix + F_POSTAL_CODE, address.getPostalCode() );
addIfNotNull( result, prefix + F_POSTAL_ADDRESS, address.getPostalAddress() );
addIfNotNull( result, prefix + F_REGION, address.getRegion() );
addIfNotNull( result, prefix + F_STREET, address.getStreet() );
}
private static void addIfNotNull( Map<String, String> result, String name, String value )
{
if ( value != null )
{
result.put( name, value );
}
}
private LinkedList<Address> parseAddresses( Map<String, String> map )
{
LinkedList<Address> result = new LinkedList<Address>();
for ( int i = 0; i < MAX_INDEX; i++ )
{
Address address = parseAddress( map, i );
if ( address != null )
{
result.add( address );
}
}
return result;
}
private Address parseAddress( Map<String, String> map, int index )
{
String prefix = UserFieldType.ADDRESS.getName() + "[" + index + "].";
if ( !hasKeysWithPrefix( map, prefix ) )
{
return null;
}
Address address = new Address();
address.setLabel( map.get( prefix + F_LABEL ) );
address.setCountry( map.get( prefix + F_COUNTRY ) );
address.setIsoCountry( map.get( prefix + F_ISO_COUNTRY ) );
address.setRegion( map.get( prefix + F_REGION ) );
address.setIsoRegion( map.get( prefix + F_ISO_REGION ) );
address.setStreet( map.get( prefix + F_STREET ) );
address.setPostalCode( map.get( prefix + F_POSTAL_CODE ) );
address.setPostalAddress( map.get( prefix + F_POSTAL_ADDRESS ) );
return address;
}
public UserFields fromStoreableMap( Map<String, String> map )
{
UserFields fields = new UserFields( true );
for ( Address address : parseAddresses( map ) )
{
fields.add( new UserField( UserFieldType.ADDRESS, address ) );
}
return fields;
}
private boolean hasKeysWithPrefix( final Map<String, String> map, final String prefix )
{
for ( final String key : map.keySet() )
{
if ( key.startsWith( prefix ) )
{
return true;
}
}
return false;
}
}