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

org.sfm.map.impl.FieldMapperColumnDefinition Maven / Gradle / Ivy

Go to download

Java library to map flat record - ResultSet, csv - to java object with minimum configuration and low footprint.

The newest version!
package org.sfm.map.impl;

import org.sfm.map.ColumnDefinition;
import org.sfm.map.FieldKey;
import org.sfm.reflect.Getter;
import org.sfm.reflect.TypeHelper;

import java.lang.reflect.Type;
import java.sql.ResultSet;


public abstract class FieldMapperColumnDefinition, S> extends ColumnDefinition {

    public abstract FieldMapper getCustomFieldMapper();

    public abstract Getter getCustomGetter();

    public static , S> FieldMapperColumnDefinition identity() {
        return new IdentityColumnDefinition();
    }

    public static , S> FieldMapperColumnDefinition compose(final FieldMapperColumnDefinition def1, final FieldMapperColumnDefinition def2) {
        if (def1.getClass().equals(IdentityColumnDefinition.class)) {
            return def2;
        }
        if (def2.getClass().equals(IdentityColumnDefinition.class)) {
            return def1;
        }
        return new ComposeColumnDefinition(def1, def2);
    }

    public static , S> FieldMapperColumnDefinition customFieldMapperDefinition(final FieldMapper mapper) {
        return new IdentityColumnDefinition() {
            @Override
            public FieldMapper getCustomFieldMapper() {
                return mapper;
            }
        };
    }

    public static , S> FieldMapperColumnDefinition customGetter(final Getter getter) {
        return new IdentityColumnDefinition() {
            @Override
            public Getter getCustomGetter() {
                return getter;
            }

            @Override
            public boolean hasCustomSource() {
                return true;
            }

            @Override
            public Type getCustomSourceReturnType() {
                Type[] paramTypesForInterface = TypeHelper.getParamTypesForInterface(getter.getClass(), Getter.class);
                return paramTypesForInterface != null ? paramTypesForInterface[1] : null;
            }
        };
    }

    public static , S> FieldMapperColumnDefinition renameDefinition(final String name) {
        return new IdentityColumnDefinition() {
            @Override
            public K rename(K key) {
                return key.alias(name);
            }
        };
    }
    static class IdentityColumnDefinition, S> extends FieldMapperColumnDefinition {
        @Override
        public K rename(K key) {
            return key;
        }

        @Override
        public boolean hasCustomSource() {
            return false;
        }

        @Override
        public Type getCustomSourceReturnType() {
            throw new IllegalStateException();
        }

        @Override
        public FieldMapper getCustomFieldMapper() {
            return null;
        }

        @Override
        public Getter getCustomGetter() {
            return null;
        }
    }

    static final class ComposeColumnDefinition, S> extends FieldMapperColumnDefinition {
        private final FieldMapperColumnDefinition def1;
        private final FieldMapperColumnDefinition def2;

        public ComposeColumnDefinition(FieldMapperColumnDefinition def1, FieldMapperColumnDefinition def2) {
            this.def1 = def1;
            this.def2 = def2;
        }

        @Override
        public K rename(K key) {
            return def2.rename(def1.rename(key));
        }

        @Override
        public FieldMapper getCustomFieldMapper() {
            FieldMapper fm = def1.getCustomFieldMapper();

            if (fm == null) {
                fm = def2.getCustomFieldMapper();
            }
            return fm;
        }

        @Override
        public Getter getCustomGetter() {
            Getter fm = def1.getCustomGetter();

            if (fm == null) {
                fm = def2.getCustomGetter();
            }
            return fm;
        }

        @Override
        public boolean hasCustomSource() {
            return def1.hasCustomSource() || def2.hasCustomSource();
        }

        @Override
        public Type getCustomSourceReturnType() {
            if (def1.hasCustomSource()) {
                return def1.getCustomSourceReturnType();
            } else if (def2.hasCustomSource()){
                return def2.getCustomSourceReturnType();
            } else {
                throw new IllegalStateException();
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy