/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.api.plugin.ext.userstore;
import java.util.Arrays;
import java.util.Date;
import java.util.Locale;
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 UserField
{
private final UserFieldType type;
private Object value;
public UserField( UserFieldType type )
{
this( type, null );
}
public UserField( UserFieldType type, Object value )
{
this.type = type;
setValue( value );
}
public UserFieldType getType()
{
return this.type;
}
public boolean isOfType( UserFieldType type )
{
return this.type == type;
}
public boolean isBirthday()
{
return isOfType( UserFieldType.BIRTHDAY );
}
public boolean isAddress()
{
return isOfType( UserFieldType.ADDRESS );
}
public boolean isPhoto()
{
return isOfType( UserFieldType.PHOTO );
}
public Object getValue()
{
return this.value;
}
public String getValueAsString()
{
return (String) this.value;
}
public Date getValueAsDate()
{
return (Date) this.value;
}
public Locale getValueAsLocale()
{
return (Locale) this.value;
}
public Boolean getValueAsBoolean()
{
return (Boolean) this.value;
}
public Gender getValueAsGender()
{
return (Gender) this.value;
}
public TimeZone getValueAsTimeZone()
{
return (TimeZone) this.value;
}
public byte[] getValueAsBytes()
{
return (byte[]) this.value;
}
public Address getValueAsAddress()
{
return (Address) this.value;
}
public void setValue( Object value )
{
checkType( value );
this.value = value;
}
private void checkType( Object value )
{
if ( value == null )
{
return;
}
Class<?> clz = value.getClass();
if ( !this.type.isOfType( clz ) )
{
throw new IllegalArgumentException( "Value must be of type [" + this.type.getTypeClass() + "]" );
}
}
public boolean equals( UserField compareField )
{
if ( compareField == null )
{
return false;
}
else if ( getType() != compareField.getType() )
{
return false;
}
else if ( getValue() == null && compareField.getValue() == null )
{
return true;
}
else if ( getValue() == null && compareField.getValue() != null )
{
return false;
}
else if ( getValue() != null && compareField.getValue() == null )
{
return false;
}
else
{
if ( isOfType( UserFieldType.PHOTO ) )
{
byte[] commandPhoto = (byte[]) getValue();
byte[] remotePhoto = (byte[]) compareField.getValue();
if ( !( Arrays.equals( commandPhoto, remotePhoto ) ) )
{
return false;
}
}
else
{
if ( bothAreBlankStrings( getValue(), compareField.getValue() ) )
{
return true;
}
if ( !( getValue().equals( compareField.getValue() ) ) )
{
return false;
}
}
}
return true;
}
private boolean bothAreBlankStrings( Object a, Object b )
{
if ( a instanceof String )
{
if ( isBlank( (String) a ) && isBlank( (String) b ) )
{
return true;
}
}
return false;
}
private boolean isBlank( final String string )
{
return string == null || "".equals( string );
}
@Override
public boolean equals( Object o )
{
if ( this == o )
{
return true;
}
if ( o == null || getClass() != o.getClass() )
{
return false;
}
UserField userField = (UserField) o;
if ( type != userField.type )
{
return false;
}
if ( value != null ? !value.equals( userField.value ) : userField.value != null )
{
return false;
}
return true;
}
@Override
public int hashCode()
{
return type.hashCode() + value.hashCode();
}
}