package org.javers.core.graph;
import org.javers.common.collections.Lists;
import org.javers.common.reflection.JaversMember;
import org.javers.core.metamodel.object.Cdo;
import org.javers.core.metamodel.object.CdoWrapper;
import org.javers.core.metamodel.object.UnboundedValueObjectId;
import org.javers.core.metamodel.property.Property;
import org.javers.core.metamodel.scanner.ClassScanner;
import org.javers.core.metamodel.type.JaversProperty;
import org.javers.core.metamodel.type.TypeMapper;
import org.javers.core.metamodel.type.ValueObjectType;
/**
* @author pawelszymczyk
*/
public class CollectionsCdoFactory {
private final ClassScanner classScanner;
private final TailoredJaversMemberFactory memberGenericTypeInjector;
private final TypeMapper typeMapper;
public CollectionsCdoFactory(ClassScanner classScanner, TailoredJaversMemberFactory memberGenericTypeInjector, TypeMapper typeMapper) {
this.classScanner = classScanner;
this.memberGenericTypeInjector = memberGenericTypeInjector;
this.typeMapper = typeMapper;
}
public Cdo createCdo(final CollectionWrapper wrapper, final Class<?> clazz) {
Property primaryProperty = classScanner.scan(wrapper.getClass()).getProperties().get(0);
JaversMember javersMember = memberGenericTypeInjector.create(primaryProperty, clazz);
Property fixedProperty = new Property(javersMember, false);
JaversProperty fixedJProperty = new JaversProperty(() -> typeMapper.getPropertyType(fixedProperty), fixedProperty);
ValueObjectType valueObject = new ValueObjectType(wrapper.getClass(), Lists.asList(fixedJProperty));
return new CdoWrapper(wrapper, new UnboundedValueObjectId(valueObject.getName()), valueObject);
}
}