View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   https://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.commons.compress.archivers.sevenz;
20  
21  import java.util.Objects;
22  
23  /**
24   * Combines a SevenZMethod with configuration options for the method.
25   *
26   * <p>
27   * The exact type and interpretation of options depends on the method being configured. Currently supported are:
28   * </p>
29   *
30   * <table>
31   * <caption>Options</caption>
32   * <tr>
33   * <th>Method</th>
34   * <th>Option Type</th>
35   * <th>Description</th>
36   * </tr>
37   * <tr>
38   * <td>BZIP2</td>
39   * <td>Number</td>
40   * <td>Block Size - an number between 1 and 9</td>
41   * </tr>
42   * <tr>
43   * <td>DEFLATE</td>
44   * <td>Number</td>
45   * <td>Compression Level - an number between 1 and 9</td>
46   * </tr>
47   * <tr>
48   * <td>LZMA2</td>
49   * <td>Number</td>
50   * <td>Dictionary Size - a number between 4096 and 768 MiB (768 &lt;&lt; 20)</td>
51   * </tr>
52   * <tr>
53   * <td>LZMA2</td>
54   * <td>org.tukaani.xz.LZMA2Options</td>
55   * <td>Whole set of LZMA2 options.</td>
56   * </tr>
57   * <tr>
58   * <td>DELTA_FILTER</td>
59   * <td>Number</td>
60   * <td>Delta Distance - a number between 1 and 256</td>
61   * </tr>
62   * </table>
63   *
64   * @Immutable
65   * @since 1.8
66   */
67  public class SevenZMethodConfiguration {
68      private final SevenZMethod method;
69      private final Object options;
70  
71      /**
72       * Doesn't configure any additional options.
73       *
74       * @param method the method to use
75       */
76      public SevenZMethodConfiguration(final SevenZMethod method) {
77          this(method, null);
78      }
79  
80      /**
81       * Specifies and method plus configuration options.
82       *
83       * @param method  the method to use
84       * @param options the options to use
85       * @throws IllegalArgumentException if the method doesn't understand the options specified.
86       */
87      public SevenZMethodConfiguration(final SevenZMethod method, final Object options) {
88          this.method = method;
89          this.options = options;
90          if (options != null && !Coders.findByMethod(method).isOptionInstance(options)) {
91              throw new IllegalArgumentException("The " + method + " method doesn't support options of type " + options.getClass());
92          }
93      }
94  
95      @Override
96      public boolean equals(final Object obj) {
97          if (this == obj) {
98              return true;
99          }
100         if (obj == null || getClass() != obj.getClass()) {
101             return false;
102         }
103         final SevenZMethodConfiguration other = (SevenZMethodConfiguration) obj;
104         return Objects.equals(method, other.method) && Objects.equals(options, other.options);
105     }
106 
107     /**
108      * The specified method.
109      *
110      * @return the method
111      */
112     public SevenZMethod getMethod() {
113         return method;
114     }
115 
116     /**
117      * The specified options.
118      *
119      * @return the options
120      */
121     public Object getOptions() {
122         return options;
123     }
124 
125     @Override
126     public int hashCode() {
127         return method == null ? 0 : method.hashCode();
128     }
129 }