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}