package grails.plugin.lightweightdeploy.connector;
import com.google.common.base.Function;
import com.google.common.base.Objects;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import org.eclipse.jetty.http.HttpHeaders;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;
import java.util.zip.Deflater;
public class GzipConfiguration {
private boolean enabled = true;
private int minimumEntitySize = 256;
private int bufferSize = 8 * 1024;
private Set<String> excludedUserAgents;
private Set<String> compressedMimeTypes;
private Set<String> includedMethods;
private Set<Pattern> excludedUserAgentPatterns;
private boolean gzipCompatibleDeflation = true;
private String vary = HttpHeaders.ACCEPT_ENCODING;
private int deflateCompressionLevel = Deflater.DEFAULT_COMPRESSION;
public GzipConfiguration() { }
public GzipConfiguration(final Map<String, ?> gzipConfig) {
this.enabled = Objects.firstNonNull((Boolean) gzipConfig.get("enabled"), enabled);
this.minimumEntitySize = Objects.firstNonNull((Integer) gzipConfig.get("minimumEntitySize"), minimumEntitySize);
this.bufferSize = Objects.firstNonNull((Integer) gzipConfig.get("bufferSize"), bufferSize);
this.excludedUserAgents = Optional.fromNullable(extractConfiguredStringSet(gzipConfig, "excludedUserAgents")).or(Optional.fromNullable(excludedUserAgents)).orNull();
this.compressedMimeTypes = Optional.fromNullable(extractConfiguredStringSet(gzipConfig, "compressedMimeTypes")).or(Optional.fromNullable(compressedMimeTypes)).orNull();
this.includedMethods = Optional.fromNullable(extractConfiguredStringSet(gzipConfig, "includedMethods")).or(Optional.fromNullable(includedMethods)).orNull();
this.excludedUserAgentPatterns = Optional.fromNullable(extractConfiguredPatternSet(gzipConfig, "excludedUserAgentPatterns")).or(Optional.fromNullable(excludedUserAgentPatterns)).orNull();
this.gzipCompatibleDeflation = Objects.firstNonNull((Boolean) gzipConfig.get("gzipCompatibleDeflation"), gzipCompatibleDeflation);
this.vary = Objects.firstNonNull((String) gzipConfig.get("vary"), vary);
this.deflateCompressionLevel = Objects.firstNonNull((Integer) gzipConfig.get("deflateCompressionLevel"), deflateCompressionLevel);
}
@SuppressWarnings("unchecked")
private List<String> extractConfiguredStringList(final Map<String, ?> config, final String key) {
return (List<String>) config.get(key);
}
private Set<String> extractConfiguredStringSet(final Map<String, ?> config, final String key) {
List<String> values = extractConfiguredStringList(config, key);
return values == null ? null : ImmutableSet.copyOf(values);
}
private Set<Pattern> extractConfiguredPatternSet(final Map<String, ?> config, final String key) {
List<String> values = extractConfiguredStringList(config, key);
return values == null ? null : ImmutableSet.copyOf(Lists.transform(values, new Function<String, Pattern>() {
@Override
public Pattern apply(String input) {
return Pattern.compile(input);
}
}));
}
public boolean isEnabled() {
return enabled;
}
public int getMinimumEntitySize() {
return minimumEntitySize;
}
public int getBufferSize() {
return bufferSize;
}
public int getDeflateCompressionLevel() {
return deflateCompressionLevel;
}
public String getVary() {
return vary;
}
public Set<String> getExcludedUserAgents() {
return excludedUserAgents;
}
public Set<String> getCompressedMimeTypes() {
return compressedMimeTypes;
}
public Set<String> getIncludedMethods() {
return includedMethods;
}
public Set<Pattern> getExcludedUserAgentPatterns() {
return excludedUserAgentPatterns;
}
public boolean isGzipCompatibleDeflation() {
return gzipCompatibleDeflation;
}
}