All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.deblock.cucumber.datatable.backend.DatatableToBeanMappingBackend Maven / Gradle / Ivy

package com.deblock.cucumber.datatable.backend;

import com.deblock.cucumber.datatable.annotations.DataTableWithHeader;
import com.deblock.cucumber.datatable.backend.options.FullOptions;
import com.deblock.cucumber.datatable.mapper.DatatableMapper;
import com.deblock.cucumber.datatable.mapper.GenericMapperFactory;
import com.deblock.cucumber.datatable.mapper.MapperFactory;
import com.deblock.cucumber.datatable.mapper.typemetadata.CompositeTypeMetadataFactory;
import com.deblock.cucumber.datatable.mapper.typemetadata.collections.CollectionTypeMetadataFactory;
import com.deblock.cucumber.datatable.mapper.typemetadata.custom.CustomTypeMetadataFactory;
import com.deblock.cucumber.datatable.mapper.typemetadata.date.TemporalTypeMetadataFactory;
import com.deblock.cucumber.datatable.mapper.typemetadata.enumeration.EnumTypeMetadataFactory;
import com.deblock.cucumber.datatable.mapper.typemetadata.map.MapTypeMetadataFactory;
import com.deblock.cucumber.datatable.mapper.typemetadata.primitive.PrimitiveTypeMetadataFactoryImpl;
import com.deblock.cucumber.datatable.runtime.ColumnNameBuilderServiceLoader;
import com.deblock.cucumber.datatable.runtime.DateTimeServiceLoader;
import com.deblock.cucumber.datatable.runtime.FieldResolverServiceLoader;
import com.deblock.cucumber.datatable.validator.DataTableValidator;
import io.cucumber.core.backend.Backend;
import io.cucumber.core.backend.Glue;
import io.cucumber.core.backend.Lookup;
import io.cucumber.core.backend.Snippet;
import io.cucumber.core.resource.ClasspathScanner;
import io.cucumber.core.resource.ClasspathSupport;

import java.net.URI;
import java.util.Collection;
import java.util.List;
import java.util.function.Supplier;

import static io.cucumber.core.resource.ClasspathSupport.CLASSPATH_SCHEME;

public class DatatableToBeanMappingBackend implements Backend {
    private final ClasspathScanner classFinder;
    private final FieldResolverServiceLoader fieldResolveServiceLoader;
    private final DateTimeServiceLoader dateTimeServiceLoader;
    private final Lookup lookup;

    public DatatableToBeanMappingBackend(Supplier classLoaderSupplier, FullOptions options, Lookup lookup) {
        this.classFinder = new ClasspathScanner(classLoaderSupplier);
        final var columnNameBuilderServiceLoader = new ColumnNameBuilderServiceLoader(options, classLoaderSupplier);
        this.fieldResolveServiceLoader = new FieldResolverServiceLoader(options, classLoaderSupplier, columnNameBuilderServiceLoader);
        this.dateTimeServiceLoader = new DateTimeServiceLoader(options, classLoaderSupplier);
        this.lookup = lookup;
    }

    @Override
    public void loadGlue(Glue glue, List gluePaths) {
        final var customTypeMetadataFactory = new CustomTypeMetadataFactory(this.classFinder, gluePaths, lookup);
        final var typeMetadataFactory = new CompositeTypeMetadataFactory(
            customTypeMetadataFactory,
            new PrimitiveTypeMetadataFactoryImpl(),
            new TemporalTypeMetadataFactory(dateTimeServiceLoader.loadService()),
            new EnumTypeMetadataFactory(),
            new MapTypeMetadataFactory()
        );
        typeMetadataFactory.add(new CollectionTypeMetadataFactory(typeMetadataFactory));
        final var mapperFactory = new GenericMapperFactory(typeMetadataFactory, fieldResolveServiceLoader.loadService());

        gluePaths.stream()
                .filter(gluePath -> CLASSPATH_SCHEME.equals(gluePath.getScheme()))
                .map(ClasspathSupport::packageName)
                .map(classFinder::scanForClassesInPackage)
                .flatMap(Collection::stream)
                .distinct()
                .forEach(aGlueClass -> {
                    final var annotation = aGlueClass.getAnnotation(DataTableWithHeader.class);
                    if (annotation != null) {
                        registerDataTableDefinition(glue, aGlueClass, mapperFactory);
                    }
                });
    }

    private void registerDataTableDefinition(Glue glue, Class aGlueClass, MapperFactory mapperFactory) {
        DatatableMapper datatableMapper = mapperFactory.build(aGlueClass);
        final var validator = new DataTableValidator(datatableMapper.headers(), false);
        glue.addDataTableType(new BeanDatatableTypeDefinition(aGlueClass, validator, datatableMapper));
        glue.addDataTableType(new BeanListDatatableTypeDefinition(aGlueClass, validator, datatableMapper));
    }

    @Override
    public void buildWorld() {

    }

    @Override
    public void disposeWorld() {

    }

    @Override
    public Snippet getSnippet() {
        return null;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy