001package org.kuali.common.util.metainf.model;
002
003import com.google.common.collect.ImmutableList;
004import org.kuali.common.util.metainf.spring.MetaInfDataLocation;
005import org.kuali.common.util.metainf.spring.MetaInfDataType;
006
007import java.util.Collections;
008import java.util.Comparator;
009import java.util.List;
010
011/**
012 * <p>
013 * Sort first by the data passed into the configurable comparator, then sort lexicographically by directory structure,
014 * then filename of the locations contained in each {@code MetaInfResource}
015 * </p>
016 *
017 * For example:
018 *
019 * <pre>
020 *   2 - server/demo/a/foo2.txt         1 - client/bootstrap/a/foo1.txt
021 *   3 - server/demo/a/b/foo.txt        2 - server/demo/a/foo2.txt
022 *   1 - client/bootstrap/a/foo1.txt    3 - server/demo/a/b/foo.txt
023 * </pre>
024 *
025 */
026public class MetaInfResourceConfigurablePathComparator implements Comparator<MetaInfResource> {
027
028    private ConfigurablePathComparator comparator = ConfigurablePathComparator.builder().build();
029
030    @Override
031    public int compare(MetaInfResource one, MetaInfResource two) {
032        return comparator.compare(one.getLocation(), two.getLocation());
033    }
034
035    public static Builder builder() {
036        return new Builder();
037    }
038
039    public static class Builder {
040
041        // Optional
042        private List<String> qualifierOrder = Collections.emptyList();
043        private List<MetaInfDataLocation> locationOrder = Collections.emptyList();
044        private List<MetaInfDataType> typeOrder = Collections.emptyList();
045
046        public Builder qualifierOrder(List<String> qualifierOrder) {
047            this.qualifierOrder = qualifierOrder;
048            return this;
049        }
050
051        public Builder locationOrder(List<MetaInfDataLocation> locationOrder) {
052            this.locationOrder = locationOrder;
053            return this;
054        }
055
056        public Builder typeOrder(List<MetaInfDataType> typeOrder) {
057            this.typeOrder = typeOrder;
058            return this;
059        }
060
061        public MetaInfResourceConfigurablePathComparator build() {
062            this.qualifierOrder = ImmutableList.copyOf(qualifierOrder);
063            this.locationOrder = ImmutableList.copyOf(locationOrder);
064            this.typeOrder = ImmutableList.copyOf(typeOrder);
065            return new MetaInfResourceConfigurablePathComparator(this);
066        }
067
068    }
069
070    private MetaInfResourceConfigurablePathComparator(Builder builder) {
071        ConfigurablePathComparator.Builder comparatorBuilder = ConfigurablePathComparator.builder();
072        comparatorBuilder = comparatorBuilder.qualifierOrder(builder.qualifierOrder);
073        comparatorBuilder = comparatorBuilder.locationOrder(builder.locationOrder);
074        comparatorBuilder = comparatorBuilder.typeOrder(builder.typeOrder);
075        comparator = comparatorBuilder.build();
076    }
077
078}