Preferences entityPrefs = root.node( identity.identity() );
String type = entityPrefs.get( "type", null );
EntityStatus status = EntityStatus.LOADED;
EntityDescriptor entityDescriptor = module.entityDescriptor( type );
if( entityDescriptor == null )
{
throw new EntityTypeNotFoundException( type );
}
Map<QualifiedName, Object> properties = new HashMap<>();
Preferences propsPrefs = null;
for( PropertyDescriptor persistentPropertyDescriptor : entityDescriptor.state().properties() )
{
if( persistentPropertyDescriptor.qualifiedName().name().equals( "identity" ) )
{
// Fake identity property
properties.put( persistentPropertyDescriptor.qualifiedName(), identity.identity() );
continue;
}
if( propsPrefs == null )
{
propsPrefs = entityPrefs.node( "properties" );
}
ValueType propertyType = persistentPropertyDescriptor.valueType();
Class<?> mainType = propertyType.mainType();
if( Number.class.isAssignableFrom( mainType ) )
{
if( mainType.equals( Long.class ) )
{
properties.put( persistentPropertyDescriptor.qualifiedName(),
this.getNumber( propsPrefs, persistentPropertyDescriptor, LONG_PARSER ) );
}
else if( mainType.equals( Integer.class ) )
{
properties.put( persistentPropertyDescriptor.qualifiedName(),
this.getNumber( propsPrefs, persistentPropertyDescriptor, INT_PARSER ) );
}
else if( mainType.equals( Double.class ) )
{
properties.put( persistentPropertyDescriptor.qualifiedName(),
this.getNumber( propsPrefs, persistentPropertyDescriptor, DOUBLE_PARSER ) );
}
else if( mainType.equals( Float.class ) )
{
properties.put( persistentPropertyDescriptor.qualifiedName(),
this.getNumber( propsPrefs, persistentPropertyDescriptor, FLOAT_PARSER ) );
}
else
{
// Load as string even though it's a number
String json = propsPrefs.get( persistentPropertyDescriptor.qualifiedName().name(), null );
Object value;
if( json == null )
{
value = null;
}
else
{
value = valueSerialization.deserialize( persistentPropertyDescriptor.valueType(), json );
}
properties.put( persistentPropertyDescriptor.qualifiedName(), value );
}
}
else if( mainType.equals( Boolean.class ) )
{
Boolean initialValue = (Boolean) persistentPropertyDescriptor.initialValue( module );
properties.put( persistentPropertyDescriptor.qualifiedName(),
propsPrefs.getBoolean( persistentPropertyDescriptor.qualifiedName().name(),
initialValue == null ? false : initialValue ) );
}
else if( propertyType instanceof ValueCompositeType
|| propertyType instanceof MapType
|| propertyType instanceof CollectionType
|| propertyType instanceof EnumType )
{
String json = propsPrefs.get( persistentPropertyDescriptor.qualifiedName().name(), null );
Object value;
if( json == null )
{
value = null;
}
else
{
value = valueSerialization.deserialize( persistentPropertyDescriptor.valueType(), json );
}
properties.put( persistentPropertyDescriptor.qualifiedName(), value );
}
else
{
String json = propsPrefs.get( persistentPropertyDescriptor.qualifiedName().name(), null );
if( json == null )
{
if( persistentPropertyDescriptor.initialValue( module ) != null )
{
properties.put( persistentPropertyDescriptor.qualifiedName(), persistentPropertyDescriptor.initialValue( module ) );
}
else
{
properties.put( persistentPropertyDescriptor.qualifiedName(), null );
}
}
else
{
Object value = valueSerialization.deserialize( propertyType, json );
properties.put( persistentPropertyDescriptor.qualifiedName(), value );
}
}
}
// Associations
Map<QualifiedName, EntityReference> associations = new HashMap<>();
Preferences assocs = null;
for( AssociationDescriptor associationType : entityDescriptor.state().associations() )
{
if( assocs == null )
{
assocs = entityPrefs.node( "associations" );
}
String associatedEntity = assocs.get( associationType.qualifiedName().name(), null );
EntityReference value = associatedEntity == null
? null
: EntityReference.parseEntityReference( associatedEntity );
associations.put( associationType.qualifiedName(), value );
}
// ManyAssociations
Map<QualifiedName, List<EntityReference>> manyAssociations = new HashMap<>();
Preferences manyAssocs = null;
for( AssociationDescriptor manyAssociationType : entityDescriptor.state().manyAssociations() )
{
if( manyAssocs == null )
{
manyAssocs = entityPrefs.node( "manyassociations" );
}
List<EntityReference> references = new ArrayList<>();
String entityReferences = manyAssocs.get( manyAssociationType.qualifiedName().name(), null );
if( entityReferences == null )
{
// ManyAssociation not found, default to empty one
manyAssociations.put( manyAssociationType.qualifiedName(), references );
}
else
{
String[] refs = entityReferences.split( "\n" );
for( String ref : refs )
{
EntityReference value = ref == null
? null
: EntityReference.parseEntityReference( ref );
references.add( value );
}
manyAssociations.put( manyAssociationType.qualifiedName(), references );
}
}
// NamedAssociations
Map<QualifiedName, Map<String, EntityReference>> namedAssociations = new HashMap<>();
Preferences namedAssocs = null;
for( AssociationDescriptor namedAssociationType : entityDescriptor.state().namedAssociations() )
{
if( namedAssocs == null )
{
namedAssocs = entityPrefs.node( "namedassociations" );
}