blob: 1ab604780a92921d5686657d84a57db591c71cb7 [file] [log] [blame]
// Copyright 2015 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.archivepatcher.shared;
/**
* Encapsulates JRE-compatible deflate parameters. There are a total of 54 possible values, which
* correspond to 9 levels, 3 strategies and 2 wrapping choices (i.e., 9 x 3 x 2). In practice only
* two of these are frequently encountered: (level 6, strategy 0, nowrap) and (level 9, strategy 0,
* nowrap); these correspond to the default and maximum-compression settings found in almost all zip
* tools.
*/
public enum JreDeflateParameters {
LEVEL1_STRATEGY0_NOWRAP(1, 0, true),
LEVEL2_STRATEGY0_NOWRAP(2, 0, true),
LEVEL3_STRATEGY0_NOWRAP(3, 0, true),
LEVEL4_STRATEGY0_NOWRAP(4, 0, true),
LEVEL5_STRATEGY0_NOWRAP(5, 0, true),
LEVEL6_STRATEGY0_NOWRAP(6, 0, true), // Default for almost all zip tools.
LEVEL7_STRATEGY0_NOWRAP(7, 0, true),
LEVEL8_STRATEGY0_NOWRAP(8, 0, true),
LEVEL9_STRATEGY0_NOWRAP(9, 0, true), // Also frequently encountered.
LEVEL1_STRATEGY1_NOWRAP(1, 1, true),
LEVEL2_STRATEGY1_NOWRAP(2, 1, true),
LEVEL3_STRATEGY1_NOWRAP(3, 1, true),
LEVEL4_STRATEGY1_NOWRAP(4, 1, true),
LEVEL5_STRATEGY1_NOWRAP(5, 1, true),
LEVEL6_STRATEGY1_NOWRAP(6, 1, true),
LEVEL7_STRATEGY1_NOWRAP(7, 1, true),
LEVEL8_STRATEGY1_NOWRAP(8, 1, true),
LEVEL9_STRATEGY1_NOWRAP(9, 1, true),
LEVEL1_STRATEGY2_NOWRAP(1, 2, true),
LEVEL2_STRATEGY2_NOWRAP(2, 2, true),
LEVEL3_STRATEGY2_NOWRAP(3, 2, true),
LEVEL4_STRATEGY2_NOWRAP(4, 2, true),
LEVEL5_STRATEGY2_NOWRAP(5, 2, true),
LEVEL6_STRATEGY2_NOWRAP(6, 2, true),
LEVEL7_STRATEGY2_NOWRAP(7, 2, true),
LEVEL8_STRATEGY2_NOWRAP(8, 2, true),
LEVEL9_STRATEGY2_NOWRAP(9, 2, true),
LEVEL1_STRATEGY0_WRAP(1, 0, false),
LEVEL2_STRATEGY0_WRAP(2, 0, false),
LEVEL3_STRATEGY0_WRAP(3, 0, false),
LEVEL4_STRATEGY0_WRAP(4, 0, false),
LEVEL5_STRATEGY0_WRAP(5, 0, false),
LEVEL6_STRATEGY0_WRAP(6, 0, false),
LEVEL7_STRATEGY0_WRAP(7, 0, false),
LEVEL8_STRATEGY0_WRAP(8, 0, false),
LEVEL9_STRATEGY0_WRAP(9, 0, false),
LEVEL1_STRATEGY1_WRAP(1, 1, false),
LEVEL2_STRATEGY1_WRAP(2, 1, false),
LEVEL3_STRATEGY1_WRAP(3, 1, false),
LEVEL4_STRATEGY1_WRAP(4, 1, false),
LEVEL5_STRATEGY1_WRAP(5, 1, false),
LEVEL6_STRATEGY1_WRAP(6, 1, false),
LEVEL7_STRATEGY1_WRAP(7, 1, false),
LEVEL8_STRATEGY1_WRAP(8, 1, false),
LEVEL9_STRATEGY1_WRAP(9, 1, false),
LEVEL1_STRATEGY2_WRAP(1, 2, false),
LEVEL2_STRATEGY2_WRAP(2, 2, false),
LEVEL3_STRATEGY2_WRAP(3, 2, false),
LEVEL4_STRATEGY2_WRAP(4, 2, false),
LEVEL5_STRATEGY2_WRAP(5, 2, false),
LEVEL6_STRATEGY2_WRAP(6, 2, false),
LEVEL7_STRATEGY2_WRAP(7, 2, false),
LEVEL8_STRATEGY2_WRAP(8, 2, false),
LEVEL9_STRATEGY2_WRAP(9, 2, false);
/**
* The level of the deflate compressor.
*/
public final int level;
/**
* The strategy used by the deflate compressor.
*/
public final int strategy;
/**
* Whether or not nowrap is enabled for the deflate compressor.
*/
public final boolean nowrap;
/**
* Creates a new parameters object having the specified configuration.
* @param level the level for the deflate compressor
* @param strategy the strategy for the deflate compressor
* @param nowrap whether or not nowrap is enabled for the deflate compressor
*/
private JreDeflateParameters(int level, int strategy, boolean nowrap) {
if (level < 1 || level > 9 || strategy < 0 || strategy > 2) {
throw new IllegalArgumentException("Only levels 1-9 and strategies 0-2 are valid.");
}
this.level = level;
this.strategy = strategy;
this.nowrap = nowrap;
}
public static JreDeflateParameters of(int level, int strategy, boolean nowrap) {
int id = (level * 100) + (strategy * 10) + (nowrap ? 1 : 0);
switch (id) {
case 100:
return LEVEL1_STRATEGY0_WRAP;
case 200:
return LEVEL2_STRATEGY0_WRAP;
case 300:
return LEVEL3_STRATEGY0_WRAP;
case 400:
return LEVEL4_STRATEGY0_WRAP;
case 500:
return LEVEL5_STRATEGY0_WRAP;
case 600:
return LEVEL6_STRATEGY0_WRAP;
case 700:
return LEVEL7_STRATEGY0_WRAP;
case 800:
return LEVEL8_STRATEGY0_WRAP;
case 900:
return LEVEL9_STRATEGY0_WRAP;
case 110:
return LEVEL1_STRATEGY1_WRAP;
case 210:
return LEVEL2_STRATEGY1_WRAP;
case 310:
return LEVEL3_STRATEGY1_WRAP;
case 410:
return LEVEL4_STRATEGY1_WRAP;
case 510:
return LEVEL5_STRATEGY1_WRAP;
case 610:
return LEVEL6_STRATEGY1_WRAP;
case 710:
return LEVEL7_STRATEGY1_WRAP;
case 810:
return LEVEL8_STRATEGY1_WRAP;
case 910:
return LEVEL9_STRATEGY1_WRAP;
case 120:
return LEVEL1_STRATEGY2_WRAP;
case 220:
return LEVEL2_STRATEGY2_WRAP;
case 320:
return LEVEL3_STRATEGY2_WRAP;
case 420:
return LEVEL4_STRATEGY2_WRAP;
case 520:
return LEVEL5_STRATEGY2_WRAP;
case 620:
return LEVEL6_STRATEGY2_WRAP;
case 720:
return LEVEL7_STRATEGY2_WRAP;
case 820:
return LEVEL8_STRATEGY2_WRAP;
case 920:
return LEVEL9_STRATEGY2_WRAP;
case 101:
return LEVEL1_STRATEGY0_NOWRAP;
case 201:
return LEVEL2_STRATEGY0_NOWRAP;
case 301:
return LEVEL3_STRATEGY0_NOWRAP;
case 401:
return LEVEL4_STRATEGY0_NOWRAP;
case 501:
return LEVEL5_STRATEGY0_NOWRAP;
case 601:
return LEVEL6_STRATEGY0_NOWRAP;
case 701:
return LEVEL7_STRATEGY0_NOWRAP;
case 801:
return LEVEL8_STRATEGY0_NOWRAP;
case 901:
return LEVEL9_STRATEGY0_NOWRAP;
case 111:
return LEVEL1_STRATEGY1_NOWRAP;
case 211:
return LEVEL2_STRATEGY1_NOWRAP;
case 311:
return LEVEL3_STRATEGY1_NOWRAP;
case 411:
return LEVEL4_STRATEGY1_NOWRAP;
case 511:
return LEVEL5_STRATEGY1_NOWRAP;
case 611:
return LEVEL6_STRATEGY1_NOWRAP;
case 711:
return LEVEL7_STRATEGY1_NOWRAP;
case 811:
return LEVEL8_STRATEGY1_NOWRAP;
case 911:
return LEVEL9_STRATEGY1_NOWRAP;
case 121:
return LEVEL1_STRATEGY2_NOWRAP;
case 221:
return LEVEL2_STRATEGY2_NOWRAP;
case 321:
return LEVEL3_STRATEGY2_NOWRAP;
case 421:
return LEVEL4_STRATEGY2_NOWRAP;
case 521:
return LEVEL5_STRATEGY2_NOWRAP;
case 621:
return LEVEL6_STRATEGY2_NOWRAP;
case 721:
return LEVEL7_STRATEGY2_NOWRAP;
case 821:
return LEVEL8_STRATEGY2_NOWRAP;
case 921:
return LEVEL9_STRATEGY2_NOWRAP;
default:
throw new IllegalArgumentException("No such parameters");
}
}
@Override
public String toString() {
return "level=" + level + ",strategy=" + strategy + ",nowrap=" + nowrap;
}
/**
* Given an input string formatted like the output of {@link #toString()}, parse the string into
* an instance of this class.
* @param input the input string to parse
* @return an equivalent object of this class
*/
public static JreDeflateParameters parseString(String input) {
String[] parts = input.split(",");
return of(
Integer.parseInt(parts[0].split("=")[1]),
Integer.parseInt(parts[1].split("=")[1]),
Boolean.parseBoolean(parts[2].split("=")[1]));
}
}