/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.api.plugin.ext.userstore;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.TimeZone;
import com.enonic.cms.api.client.model.user.Address;
import com.enonic.cms.api.client.model.user.Gender;
public final class UserFields
implements Iterable<UserField>
{
private final boolean multipleAddresses;
private final List<UserFieldType> typeList;
private final List<UserField> userFieldList;
public UserFields()
{
this( true );
}
public UserFields( boolean multipleAddresses )
{
this.multipleAddresses = multipleAddresses;
this.typeList = new ArrayList<UserFieldType>();
this.userFieldList = new ArrayList<UserField>();
}
public void add( final UserField field )
{
final UserFieldType type = field.getType();
if ( type == UserFieldType.ADDRESS )
{
if ( this.multipleAddresses || !hasField( type ) )
{
internalAdd( type, field );
}
}
else
{
remove( type );
internalAdd( type, field );
}
}
private void internalAdd( final UserFieldType type, final UserField field )
{
this.typeList.add( type );
this.userFieldList.add( field );
}
public boolean hasField( final UserFieldType type )
{
return this.typeList.contains( type );
}
public UserField getField( UserFieldType type )
{
final Collection<UserField> result = getFields( type );
if ( ( result != null ) && !result.isEmpty() )
{
return result.iterator().next();
}
else
{
return null;
}
}
public Collection<UserField> getFields( UserFieldType type )
{
final List<UserField> fields = new ArrayList<UserField>();
final int size = typeList.size();
for ( int i = 0; i < size; i++ )
{
if ( type.equals( typeList.get( i ) ) )
{
fields.add( userFieldList.get( i ) );
}
}
return fields;
}
public Iterator<UserField> iterator()
{
return getAll().iterator();
}
public void addAll( Collection<UserField> fields )
{
for ( final UserField field : fields )
{
add( field );
}
}
public void addAll( UserFields fields )
{
for ( final UserField field : fields )
{
add( field );
}
}
public Collection<UserField> getAll()
{
return this.userFieldList;
}
public void clear()
{
this.typeList.clear();
this.userFieldList.clear();
}
public int getSize()
{
return this.typeList.size();
}
public void remove( UserFieldType type )
{
for ( int i = typeList.size() - 1; i >= 0; i-- )
{
if ( type.equals( typeList.get( i ) ) )
{
this.typeList.remove( i );
this.userFieldList.remove( i );
}
}
}
public void remove( Collection<UserFieldType> types )
{
for ( final UserFieldType type : types )
{
remove( type );
}
}
public void retain( Collection<UserFieldType> types )
{
final Set<UserFieldType> set = new HashSet<UserFieldType>( this.typeList );
set.removeAll( types );
remove( set );
}
/**
* Removes all remote fields and adds given remote fields.
*/
public void replaceAllRemoteFieldsOnly( UserFields fields, UserStoreConfig config )
{
remove( config.getRemoteOnlyUserFieldTypes() );
addAll( fields.getRemoteFields( config ) );
}
/**
* @return An new instance that only contains configured user fields.
*/
public UserFields getConfiguredFieldsOnly( final UserStoreConfig userStoreConfig )
{
return getConfiguredFieldsOnly( userStoreConfig, false );
}
public UserFields getConfiguredFieldsOnly( final UserStoreConfig userStoreConfig, boolean includeMissing )
{
final UserFields configuredFieldsOnly = clone();
configuredFieldsOnly.retain( userStoreConfig.getUserFieldTypes() );
if ( includeMissing )
{
for ( UserFieldType type : userStoreConfig.getUserFieldTypes() )
{
if ( !configuredFieldsOnly.hasField( type ) )
{
configuredFieldsOnly.add( new UserField( type, null ) );
}
}
}
// Set unused address part to null
if ( configuredFieldsOnly.hasField( UserFieldType.ADDRESS ) )
{
final List<Address> addresses = configuredFieldsOnly.getAddresses();
for ( Address address : addresses )
{
if ( userStoreConfig.getUserFieldConfig( UserFieldType.ADDRESS ).useIso() )
{
address.setCountry( null );
address.setRegion( null );
}
else
{
address.setIsoCountry( null );
address.setIsoRegion( null );
}
}
}
return configuredFieldsOnly;
}
public UserFields getRemoteFields( final UserStoreConfig userStoreConfig )
{
UserFields remoteFields = clone();
remoteFields.retain( userStoreConfig.getRemoteOnlyUserFieldTypes() );
return remoteFields;
}
public UserFields getChangedUserFields( final UserFields otherUserFields, final boolean includeMissing )
{
final UserFields changedUserFields = new UserFields( true );
for ( UserField currentUserField : getAll() )
{
UserField otherField = otherUserFields.getField( currentUserField.getType() );
if ( currentUserField.getValue() == null && otherField == null )
{
continue;
}
if ( !currentUserField.equals( otherField ) )
{
changedUserFields.add( currentUserField );
}
}
if ( includeMissing )
{
for ( UserField otherField : otherUserFields )
{
UserField matchingUserField = getField( otherField.getType() );
if ( matchingUserField == null )
{
changedUserFields.add( new UserField( otherField.getType(), null ) );
}
}
}
return changedUserFields;
}
public void removeReadOnlyFields( final UserStoreConfig config )
{
for ( final UserStoreConfigField userFieldConfig : config.getUserFieldConfigs() )
{
if ( userFieldConfig.isReadOnly() && hasField( userFieldConfig.getType() ) )
{
remove( userFieldConfig.getType() );
}
}
}
public UserFields emptiesToNull()
{
final UserFields newUserFields = clone();
for ( UserField field : newUserFields.getAll() )
{
if ( field.getValue() != null && field.getType().isStringBased() )
{
if ( field.getValueAsString().equals( "" ) )
{
field.setValue( null );
}
}
}
return newUserFields;
}
public boolean existingFieldsEquals( UserFields otherFields )
{
for ( UserField currentField : this )
{
final UserField otherField = otherFields.getField( currentField.getType() );
if ( !currentField.equals( otherField ) )
{
return false;
}
}
return true;
}
@Override
public boolean equals( Object o )
{
if ( this == o )
{
return true;
}
if ( o == null || getClass() != o.getClass() )
{
return false;
}
final UserFields that = (UserFields) o;
if ( !this.typeList.equals( that.typeList ) )
{
return false;
}
if ( !this.userFieldList.equals( that.userFieldList ) )
{
return false;
}
return true;
}
@Override
public int hashCode()
{
return this.typeList.hashCode() + this.userFieldList.hashCode();
}
public UserFields clone()
{
final UserFields newMap = new UserFields( this.multipleAddresses );
newMap.addAll( this.getAll() );
return newMap;
}
public UserFields setAddresses( Address... addresses )
{
for ( Address address : addresses )
{
add( new UserField( UserFieldType.ADDRESS, address ) );
}
return this;
}
public UserFields setBirthday( Date value )
{
add( new UserField( UserFieldType.BIRTHDAY, value ) );
return this;
}
public UserFields setCountry( String value )
{
add( new UserField( UserFieldType.COUNTRY, value ) );
return this;
}
public UserFields setDescription( String value )
{
add( new UserField( UserFieldType.DESCRIPTION, value ) );
return this;
}
public UserFields setFax( String value )
{
add( new UserField( UserFieldType.FAX, value ) );
return this;
}
public UserFields setFirstName( String value )
{
add( new UserField( UserFieldType.FIRST_NAME, value ) );
return this;
}
public UserFields setGender( Gender value )
{
add( new UserField( UserFieldType.GENDER, value ) );
return this;
}
public UserFields setGlobalPosition( String value )
{
add( new UserField( UserFieldType.GLOBAL_POSITION, value ) );
return this;
}
public UserFields setHomePage( String value )
{
add( new UserField( UserFieldType.HOME_PAGE, value ) );
return this;
}
public UserFields setHtmlEmail( Boolean value )
{
add( new UserField( UserFieldType.HTML_EMAIL, value ) );
return this;
}
public UserFields setInitials( String value )
{
add( new UserField( UserFieldType.INITIALS, value ) );
return this;
}
public UserFields setLastName( String value )
{
add( new UserField( UserFieldType.LAST_NAME, value ) );
return this;
}
public UserFields setLocale( Locale value )
{
add( new UserField( UserFieldType.LOCALE, value ) );
return this;
}
public UserFields setMemberId( String value )
{
add( new UserField( UserFieldType.MEMBER_ID, value ) );
return this;
}
public UserFields setMiddleName( String value )
{
add( new UserField( UserFieldType.MIDDLE_NAME, value ) );
return this;
}
public UserFields setMobile( String value )
{
add( new UserField( UserFieldType.MOBILE, value ) );
return this;
}
public UserFields setNickName( String value )
{
add( new UserField( UserFieldType.NICK_NAME, value ) );
return this;
}
public UserFields setOrganization( String value )
{
add( new UserField( UserFieldType.ORGANIZATION, value ) );
return this;
}
public UserFields setPersonalId( String value )
{
add( new UserField( UserFieldType.PERSONAL_ID, value ) );
return this;
}
public UserFields setPhone( String value )
{
add( new UserField( UserFieldType.PHONE, value ) );
return this;
}
public UserFields setPhoto( byte[] value )
{
add( new UserField( UserFieldType.PHOTO, value ) );
return this;
}
public UserFields setPrefix( String value )
{
add( new UserField( UserFieldType.PREFIX, value ) );
return this;
}
public UserFields setSuffix( String value )
{
add( new UserField( UserFieldType.SUFFIX, value ) );
return this;
}
public UserFields setTimezone( TimeZone value )
{
add( new UserField( UserFieldType.TIME_ZONE, value ) );
return this;
}
public UserFields setTitle( String value )
{
add( new UserField( UserFieldType.TITLE, value ) );
return this;
}
public String getPrefix()
{
return getUserFieldValueAsString( UserFieldType.PREFIX );
}
public String getFirstName()
{
return getUserFieldValueAsString( UserFieldType.FIRST_NAME );
}
public String getMiddleName()
{
return getUserFieldValueAsString( UserFieldType.MIDDLE_NAME );
}
public String getLastName()
{
return getUserFieldValueAsString( UserFieldType.LAST_NAME );
}
public String getSuffix()
{
return getUserFieldValueAsString( UserFieldType.SUFFIX );
}
public String getNickName()
{
return getUserFieldValueAsString( UserFieldType.NICK_NAME );
}
public String getInitials()
{
return getUserFieldValueAsString( UserFieldType.INITIALS );
}
public String getCountry()
{
return getUserFieldValueAsString( UserFieldType.COUNTRY );
}
public Date getBirthday()
{
return getUserFieldValueAsDate( UserFieldType.BIRTHDAY );
}
public String getHomePage()
{
return getUserFieldValueAsString( UserFieldType.HOME_PAGE );
}
public String getOrganization()
{
return getUserFieldValueAsString( UserFieldType.ORGANIZATION );
}
public String getPhone()
{
return getUserFieldValueAsString( UserFieldType.PHONE );
}
public Locale getLocale()
{
return getUserFieldValueAsLocale( UserFieldType.LOCALE );
}
public Boolean getHtmlEmail()
{
return getUserFieldValueAsBoolean( UserFieldType.HTML_EMAIL );
}
public Gender getGender()
{
return getUserFieldValueAsGender( UserFieldType.GENDER );
}
public byte[] getPhoto()
{
return getUserFieldValueAsBytes( UserFieldType.PHOTO );
}
public List<Address> getAddresses()
{
return getUserFieldValueAsAddresses( UserFieldType.ADDRESS );
}
public TimeZone getTimeZone()
{
return getUserFieldValueAsTimeZone( UserFieldType.TIME_ZONE );
}
public String getTitle()
{
return getUserFieldValueAsString( UserFieldType.TITLE );
}
public String getDescription()
{
return getUserFieldValueAsString( UserFieldType.DESCRIPTION );
}
private String getUserFieldValueAsString( UserFieldType type )
{
final UserField userField = getField( type );
if ( userField == null )
{
return null;
}
return userField.getValueAsString();
}
private Date getUserFieldValueAsDate( UserFieldType type )
{
final UserField userField = getField( type );
if ( userField == null )
{
return null;
}
return userField.getValueAsDate();
}
private Locale getUserFieldValueAsLocale( UserFieldType type )
{
final UserField userField = getField( type );
if ( userField == null )
{
return null;
}
return userField.getValueAsLocale();
}
private Boolean getUserFieldValueAsBoolean( UserFieldType type )
{
final UserField userField = getField( type );
if ( userField == null )
{
return null;
}
return userField.getValueAsBoolean();
}
private Gender getUserFieldValueAsGender( UserFieldType type )
{
final UserField userField = getField( type );
if ( userField == null )
{
return null;
}
return userField.getValueAsGender();
}
private TimeZone getUserFieldValueAsTimeZone( UserFieldType type )
{
final UserField userField = getField( type );
if ( userField == null )
{
return null;
}
return userField.getValueAsTimeZone();
}
private byte[] getUserFieldValueAsBytes( UserFieldType type )
{
final UserField userField = getField( type );
if ( userField == null )
{
return null;
}
return userField.getValueAsBytes();
}
private List<Address> getUserFieldValueAsAddresses( UserFieldType type )
{
final List<Address> addresses = new ArrayList<Address>();
for ( final UserField userField : getFields( type ) )
{
addresses.add( userField.getValueAsAddress() );
}
return addresses;
}
}