package fr.lteconsulting.hexa.persistence.client.legacy.persistence;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.persistence.FetchType;
import javax.persistence.GenerationType;
import fr.lteconsulting.hexa.client.classinfo.ClassInfo;
import fr.lteconsulting.hexa.client.classinfo.Clazz;
public class PersistenceConfiguration
{
HashMap<String, EntityConfiguration> entityConfigurations = new HashMap<String, EntityConfiguration>();
public EntityConfiguration addEntityConfiguration( Class<?> entityClass, Class<?> idFieldClass, String idFieldName, GenerationType idGenerationType )
{
if( entityClass == null )
return null;
if( entityConfigurations.containsKey( entityClass.getName() ) )
return null;
String tableName = entityClass.getName().substring( 1 + entityClass.getName().lastIndexOf( "." ) );
EntityConfiguration entityConfiguration = new EntityConfiguration( entityClass, tableName, idFieldClass, idFieldName, idGenerationType );
entityConfigurations.put( entityClass.getName(), entityConfiguration );
return entityConfiguration;
}
public EntityConfiguration getConfigurationForEntity( Class<?> clazz )
{
return entityConfigurations.get( clazz.getName() );
}
public static class EntityConfiguration
{
Class<?> entityClass;
Clazz<?> entityClazz;
String tableName;
GenerationType idGenerationType;
FieldConfiguration idField;
List<FieldConfiguration> directFields;
List<ManyToOneFieldConfiguration> manyToOneFields;
List<OneToManyFieldConfiguration> oneToManyFields;
public EntityConfiguration( Class<?> entityClass, String tableName, Class<?> idFieldClass, String idFieldName, GenerationType idGenerationType )
{
this.entityClass = entityClass;
this.entityClazz = ClassInfo.Clazz( entityClass );
this.tableName = tableName;
this.idGenerationType = idGenerationType;
this.idField = new FieldConfiguration( idFieldClass, idFieldName, idFieldName );
directFields = new ArrayList<FieldConfiguration>();
manyToOneFields = new ArrayList<ManyToOneFieldConfiguration>();
oneToManyFields = new ArrayList<OneToManyFieldConfiguration>();
}
public void addFieldConfiguration( Class<?> fieldClass, String fieldName )
{
directFields.add( new FieldConfiguration( fieldClass, fieldName, fieldName ) );
}
public void addManyToOneFieldConfiguration( Class<?> fieldClass, String fieldName, String columnName, FetchType fetchType )
{
manyToOneFields.add( new ManyToOneFieldConfiguration( fieldClass, fieldName, columnName, fetchType ) );
}
public void addOneToManyFieldConfiguration( Class<?> containerClass, Class<?> targetClass, String fieldName, String mappedBy, boolean isOrphanRemoval )
{
oneToManyFields.add( new OneToManyFieldConfiguration( containerClass, targetClass, fieldName, mappedBy, isOrphanRemoval ) );
}
public FieldConfiguration getFieldConfiguration( String fieldName )
{
if( idField.fieldName.equals( fieldName ) )
return idField;
for( FieldConfiguration c : directFields )
if( c.fieldName.equals( fieldName ) )
return c;
return null;
}
public ManyToOneFieldConfiguration getManyToOneFieldConfiguration( String fieldName )
{
for( ManyToOneFieldConfiguration c : manyToOneFields )
if( c.fieldName.equals( fieldName ) )
return c;
return null;
}
public Object createEntityProxy( EntityManagerImpl em )
{
Object proxy = null;
if( entityClass == Category.class )
proxy = new CategoryProxy( em );
return proxy;
}
}
public static class FieldConfiguration
{
Class<?> fieldClass;
String fieldName;
String columnName;
public FieldConfiguration( Class<?> fieldClass, String fieldName, String columnName )
{
this.fieldClass = fieldClass;
this.fieldName = fieldName;
this.columnName = columnName;
}
}
public static class ManyToOneFieldConfiguration
{
Class<?> fieldClass;
String fieldName;
String columnName;
FetchType fetchType;
public ManyToOneFieldConfiguration( Class<?> fieldClass, String fieldName, String columnName, FetchType fetchType )
{
this.fieldClass = fieldClass;
this.fieldName = fieldName;
this.columnName = columnName;
this.fetchType = fetchType;
}
}
public static class OneToManyFieldConfiguration
{
Class<?> containerClass;
Class<?> targetClass;
String fieldName;
String mappedBy;
boolean isOrphanRemoval;
public OneToManyFieldConfiguration( Class<?> containerClass, Class<?> targetClass, String fieldName, String mappedBy, boolean isOrphanRemoval )
{
this.containerClass = containerClass;
this.targetClass = targetClass;
this.fieldName = fieldName;
this.mappedBy = mappedBy;
this.isOrphanRemoval = isOrphanRemoval;
}
}
}