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

org.kuali.student.r2.common.criteria.LookupCustomizer Maven / Gradle / Ivy

package org.kuali.student.r2.common.criteria;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.kuali.rice.core.api.criteria.Predicate;
import org.kuali.rice.core.api.mo.ModelBuilder;
import org.kuali.rice.core.framework.persistence.jpa.criteria.Criteria;

public class LookupCustomizer {
    
    private List additionalTransforms;
    private List predicateTransforms;
    private final Transform resultTransform;

    private LookupCustomizer(Builder builder) {
        this.additionalTransforms = builder.getAdditionalTransforms();
        this.predicateTransforms = builder.getPredicateTransforms();
        this.resultTransform = builder.getResultTransform() != null ? builder.getResultTransform() : IndentityTransform.getInstance();
    }
    
    public Predicate applyAdditionalTransforms(Predicate predicate, Criteria criteria) {
        for (PredicateTransform transform : additionalTransforms){
            predicate = transform.apply(predicate, criteria);
        }
        return predicate;
    }

    public Predicate applyPredicateTransforms(Predicate predicate, Criteria criteria) {
        for (PredicateTransform transform : predicateTransforms){
            predicate = transform.apply(predicate, criteria);
        }
        return predicate;
    }

    public T applyResultTransforms(Object o) {
        return null;
    }
    
    public List getAdditionalTransforms() {
        return additionalTransforms;
    }

    public void setAdditionalTransforms(List additionalTransforms) {
        this.additionalTransforms = additionalTransforms;
    }

    public List getPredicateTransforms() {
        return predicateTransforms;
    }

    public void setPredicateTransforms(List predicateTransforms) {
        this.predicateTransforms = predicateTransforms;
    }

    public Transform getResultTransform() {
        return resultTransform;
    }
    
    public static final class Builder implements ModelBuilder, Serializable {

        private List additionalTransforms;
        private List predicateTransforms;
        private Transform resultTransform;

        private Builder() {

        }

        public static  Builder create() {
            return new Builder();
        }

        public List getAdditionalTransforms() {
            return additionalTransforms;
        }

        public void setAdditionalTransforms(List additionalTransforms) {
            this.additionalTransforms = additionalTransforms;
        }

        public List getPredicateTransforms() {
            return predicateTransforms;
        }

        public void setPredicateTransforms(List predicateTransforms) {
            this.predicateTransforms = predicateTransforms;
        }

        public Transform getResultTransform() {
            return resultTransform;
        }

        public void setResultTransform(final Transform resultTransform) {
            this.resultTransform = resultTransform;
        }

        @Override
        public LookupCustomizer build() {
            if (additionalTransforms == null){
                additionalTransforms = new ArrayList();
            }
            if (predicateTransforms == null){
                predicateTransforms = new ArrayList();
            }
            return new LookupCustomizer(this);
        }
    }

    public interface PredicateTransform {
        Predicate apply(Predicate input, Criteria criteria);
    }
    
    public interface Transform {
        R apply(P input);
    }

    /**
     * f: x -> x.  This function just returns the passed in parameter.
     *
     * @param  the type the function acts on.
     */
    private static final class IndentityTransform implements Transform {

        @SuppressWarnings("unchecked")
        private static final Transform INSTANCE = new IndentityTransform();

        @SuppressWarnings("unchecked")
        public static  Transform getInstance() {
            return INSTANCE;
        }

        @Override
        public I apply(final I input) {
            return input;
        }
    }

}