package org.javers.repository.jql; import org.javers.common.collections.Sets; import org.javers.common.exception.JaversException; import org.javers.common.exception.JaversExceptionCode; import org.javers.core.metamodel.object.GlobalIdFactory; import org.javers.core.metamodel.type.EntityType; import org.javers.core.metamodel.type.ManagedType; import org.javers.core.metamodel.type.TypeMapper; import java.util.Set; abstract class FilterDefinition { abstract Filter compile(GlobalIdFactory globalIdFactory, TypeMapper typeMapper); static class IdFilterDefinition extends FilterDefinition { private final GlobalIdDTO globalIdDTO; IdFilterDefinition(GlobalIdDTO globalIdDTO) { this.globalIdDTO = globalIdDTO; } Filter compile(GlobalIdFactory globalIdFactory, TypeMapper typeMapper) { return new IdFilter(globalIdFactory.createFromDto(globalIdDTO)); } } static class ClassFilterDefinition extends FilterDefinition { private final Set<Class> requiredClasses; ClassFilterDefinition(Set<Class> requiredClasses) { this.requiredClasses = requiredClasses; } @Override Filter compile(GlobalIdFactory globalIdFactory, TypeMapper typeMapper) { return new ClassFilter(Sets.transform(requiredClasses, javaClass -> typeMapper.getJaversManagedType(javaClass))); } } static class InstanceFilterDefinition extends FilterDefinition { private final Object instance; InstanceFilterDefinition(Object instance) { this.instance = instance; } Filter compile(GlobalIdFactory globalIdFactory, TypeMapper typeMapper) { return new IdFilter(globalIdFactory.createId(instance)); } } static class VoOwnerFilterDefinition extends FilterDefinition { private final Class ownerEntityClass; private final String path; VoOwnerFilterDefinition(Class ownerEntityClass, String path) { this.ownerEntityClass = ownerEntityClass; this.path = path; } @Override Filter compile(GlobalIdFactory globalIdFactory, TypeMapper typeMapper) { ManagedType mType = typeMapper.getJaversManagedType(ownerEntityClass); if (! (mType instanceof EntityType)) { throw new JaversException( JaversExceptionCode.MALFORMED_JQL, "queryForChanges: ownerEntityClass {'"+ownerEntityClass.getName()+"'} should be an Entity"); } return new VoOwnerFilter((EntityType)mType, path); } } static class AnyDomainObjectFilterDefinition extends FilterDefinition { @Override Filter compile(GlobalIdFactory globalIdFactory, TypeMapper typeMapper) { return new AnyDomainObjectFilter(); } } }