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

cdc.impex.demos.DemoSupport Maven / Gradle / Ivy

There is a newer version: 0.54.0
Show newest version
package cdc.impex.demos;

import java.io.File;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import cdc.impex.ImpExCatalog;
import cdc.impex.ImpExStatus;
import cdc.impex.exports.CheckedSheetExporter;
import cdc.impex.exports.ExportRow;
import cdc.impex.imports.BatchSheetImporter;
import cdc.impex.imports.SheetImporter;
import cdc.impex.templates.ColumnTemplate;
import cdc.impex.templates.SheetTemplate;
import cdc.impex.templates.SheetTemplateInstance;
import cdc.impex.templates.Usage;
import cdc.issues.Issue;
import cdc.issues.IssueSeverity;
import cdc.issues.IssuesHandler;
import cdc.office.ss.ContentValidation;
import cdc.office.tables.Header;
import cdc.util.lang.Checks;
import cdc.validation.checkers.defaults.IsInRange;

class DemoSupport {
    private static final Logger LOGGER = LogManager.getLogger(DemoSupport.class);

    protected DemoSupport() {
    }

    enum Enum1 {
        A,
        B,
        C
    }

    /**
     * An enum that can not be encoded in an explicit validation list.
     */
    enum Enum2 {
        LONG_NAME_00,
        LONG_NAME_01,
        LONG_NAME_02,
        LONG_NAME_03,
        LONG_NAME_04,
        LONG_NAME_05,
        LONG_NAME_06,
        LONG_NAME_07,
        LONG_NAME_08,
        LONG_NAME_09,
        LONG_NAME_10,
        LONG_NAME_11,
        LONG_NAME_12,
        LONG_NAME_13,
        LONG_NAME_14,
        LONG_NAME_15,
        LONG_NAME_16,
        LONG_NAME_17,
        LONG_NAME_18,
        LONG_NAME_19,
        LONG_NAME_20,
        LONG_NAME_21,
        LONG_NAME_22,
        LONG_NAME_23,
        LONG_NAME_24,
        LONG_NAME_25,
        LONG_NAME_26,
        LONG_NAME_27,
        LONG_NAME_28,
        LONG_NAME_29
    }

    static final File[] SAMPLE_FILES = {
            new File("src/main/resources/demo-import.json"),
            new File("src/main/resources/demo-import.csv"),
            new File("src/main/resources/demo-import.xlsx")
    };

    static class VerboseBatchImporter extends BatchSheetImporter {
        public VerboseBatchImporter(SheetImporter delegate) {
            super(delegate);
        }

        @Override
        public void batch() {
            LOGGER.info("batch");
        }
    }

    static class DemoExporter extends CheckedSheetExporter {
        private final int rows;
        private int next = 0;

        public DemoExporter(int rows) {
            this.rows = rows;
        }

        public static void fill(ExportRow row) {
            final Header header = row.getTemplateInstance().getHeader();
            final SheetTemplate template = row.getTemplate();
            for (final String name : header.getSortedNames()) {
                final ColumnTemplate column = template.getMatchingColumn(name);
                final Class dataType = column.getDataType();
                final Object data;
                if (dataType.equals(String.class)) {
                    if (column.isPattern()) {
                        data = "String " + row.getNumber() + " for pattern column";
                    } else {
                        data = "String " + row.getNumber();
                    }
                } else if (dataType.equals(Boolean.class) || dataType.equals(boolean.class)) {
                    data = true;
                } else if (dataType.equals(Byte.class) || dataType.equals(byte.class)) {
                    data = (byte) row.getNumber();
                } else if (dataType.equals(Short.class) || dataType.equals(short.class)) {
                    data = (short) row.getNumber();
                } else if (dataType.equals(Integer.class) || dataType.equals(int.class)) {
                    data = row.getNumber();
                } else if (dataType.equals(Long.class) || dataType.equals(long.class)) {
                    data = (long) row.getNumber();
                } else if (dataType.equals(Double.class) || dataType.equals(double.class)) {
                    data = (double) row.getNumber();
                } else if (dataType.equals(Float.class) || dataType.equals(float.class)) {
                    data = (float) row.getNumber();
                } else if (dataType.isEnum()) {
                    data = dataType.getEnumConstants()[row.getNumber() % dataType.getEnumConstants().length];
                } else {
                    data = null;
                }
                row.setData(name, data);
            }
        }

        @Override
        public void beginSheetExport(SheetTemplateInstance templateInstance,
                                     IssuesHandler issuesHandler) {
            super.beginSheetExport(templateInstance, issuesHandler);
            next = 1;
        }

        @Override
        public int getNumberOfRemainingRows() {
            checkStatus(ImpExStatus.SHEET);
            return rows - next + 1;
        }

        @Override
        public void exportRow(ExportRow row,
                              IssuesHandler issuesHandler) {
            checkStatus(ImpExStatus.SHEET);

            Checks.assertTrue(next <= rows, "No more rows");
            fill(row);
            next++;
        }
    }

    static final ColumnTemplate ID =
            ColumnTemplate.builder(String.class)
                          .name("Id")
                          .description("Identifier whose length is in range [5,10]")
                          .usage(Usage.MANDATORY_RO_ID)
                          .cvType(ContentValidation.Type.TEXT_LENGTH)
                          .cvOperator(ContentValidation.Operator.BETWEEN)
                          .cvValues("5", "10")
                          .build();

    static final ColumnTemplate DERIVED =
            ColumnTemplate.builder(String.class)
                          .name("Derived")
                          .description("Derived attribute.")
                          .usage(Usage.DERIVED_RO_ATT)
                          .build();

    static final ColumnTemplate RO =
            ColumnTemplate.builder(String.class)
                          .name("Read Only")
                          .description("Read-only attribute")
                          .usage(Usage.MANDATORY_RO_ATT)
                          .build();

    static final ColumnTemplate STRING =
            ColumnTemplate.builder(String.class)
                          .name("String")
                          .description("Define a string in this column")
                          .build();
    static final ColumnTemplate META =
            ColumnTemplate.builder(String.class)
                          .pattern("Meta:.+")
                          .description("Define a set of meta data columns")
                          .build();
    static final ColumnTemplate FLOAT =
            ColumnTemplate.builder(float.class)
                          .name("Float")
                          .checker(IsInRange.from(0.0f, 10.5f))
                          .checkFailureSeverity(IssueSeverity.MINOR)
                          .description("Define\n a\n float \nin \nthis\n column")
                          .cvOperator(ContentValidation.Operator.BETWEEN)
                          .cvValues("0.0", "10.5")
                          .build();
    static final ColumnTemplate BOOLEAN =
            ColumnTemplate.builder(boolean.class)
                          .name("Boolean")
                          .build();
    static final ColumnTemplate ENUM1 =
            ColumnTemplate.builder(Enum1.class)
                          .name("Enum1")
                          .build();
    static final ColumnTemplate ENUM2 =
            ColumnTemplate.builder(Enum2.class)
                          .name("Enum2")
                          .description("A enum that can not be encoded in an explicit validation list.")
                          .build();
    static final ColumnTemplate DOUBLE =
            ColumnTemplate.builder(double.class)
                          .name("Double")
                          .checker(IsInRange.from(0.0, 10.0))
                          .exportConverter(x -> {
                              if (((int) x.doubleValue()) % 2 == 0) {
                                  throw new IllegalArgumentException();
                              } else {
                                  return Double.toString(x);
                              }
                          })
                          .cvOperator(ContentValidation.Operator.BETWEEN)
                          .cvValues("0.0", "10.0")
                          .build();
    static final SheetTemplate TEMPLATE1 =
            SheetTemplate.builder()
                         .domain("Demo")
                         .name("Template1")
                         .description("Description of template 1")
                         .column(ID)
                         .column(RO)
                         .column(STRING)
                         .column(FLOAT)
                         .column(ENUM1)
                         .column(ENUM2)
                         .column(DERIVED)
                         .build();
    static final SheetTemplate TEMPLATE2 =
            SheetTemplate.builder()
                         .domain("Demo")
                         .name("Template2")
                         .description("Description of template 2 that uses patterns")
                         .column(BOOLEAN)
                         .column(DOUBLE)
                         .column(META)
                         .build();
    static final SheetTemplateInstance TEMPLATE1_INSTANCE =
            SheetTemplateInstance.replace(TEMPLATE1);
    static final SheetTemplateInstance TEMPLATE2_INSTANCE =
            SheetTemplateInstance.replace(TEMPLATE2, "Meta:Meta1", "Meta:Meta2");

    public static SheetTemplateInstance instancier(SheetTemplate template) {
        if (template == TEMPLATE1) {
            return TEMPLATE1_INSTANCE;
        } else if (template == TEMPLATE2) {
            return TEMPLATE2_INSTANCE;
        } else {
            return null;
        }
    }

    static final ImpExCatalog CATALOG =
            new ImpExCatalog().register(TEMPLATE1, new VerboseBatchImporter(SheetImporter.VERBOSE_VOID).setBatchSize(4))
                              .register(TEMPLATE2, new VerboseBatchImporter(SheetImporter.VERBOSE_VOID).setBatchSize(4))
                              .register(TEMPLATE1, new DemoExporter(250))
                              .register(TEMPLATE2, new DemoExporter(500));
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy