Home | History | Annotate | Download | only in zip
      1 /*
      2  * Copyright (C) 2016 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.tools.build.apkzlib.zip;
     18 
     19 import com.android.tools.build.apkzlib.zip.compress.DeflateExecutionCompressor;
     20 import com.android.tools.build.apkzlib.zip.utils.ByteTracker;
     21 import java.util.function.Supplier;
     22 import java.util.zip.Deflater;
     23 import javax.annotation.Nonnull;
     24 
     25 /**
     26  * Options to create a {@link ZFile}.
     27  */
     28 public class ZFileOptions {
     29 
     30     /**
     31      * The byte tracker.
     32      */
     33     @Nonnull
     34     private ByteTracker tracker;
     35 
     36     /**
     37      * The compressor to use.
     38      */
     39     @Nonnull
     40     private Compressor compressor;
     41 
     42     /**
     43      * Should timestamps be zeroed?
     44      */
     45     private boolean noTimestamps;
     46 
     47     /**
     48      * The alignment rule to use.
     49      */
     50     @Nonnull
     51     private AlignmentRule alignmentRule;
     52 
     53     /**
     54      * Should the extra field be used to cover empty space?
     55      */
     56     private boolean coverEmptySpaceUsingExtraField;
     57 
     58     /**
     59      * Should files be automatically sorted before update?
     60      */
     61     private boolean autoSortFiles;
     62 
     63     /**
     64      * Factory creating verification logs to use.
     65      */
     66     @Nonnull
     67     private Supplier<VerifyLog> verifyLogFactory;
     68 
     69     /**
     70      * Creates a new options object. All options are set to their defaults.
     71      */
     72     public ZFileOptions() {
     73         tracker = new ByteTracker();
     74         compressor =
     75                 new DeflateExecutionCompressor(
     76                         Runnable::run,
     77                         tracker,
     78                         Deflater.DEFAULT_COMPRESSION);
     79         alignmentRule = AlignmentRules.compose();
     80         verifyLogFactory = VerifyLogs::devNull;
     81     }
     82 
     83     /**
     84      * Obtains the ZFile's byte tracker.
     85      *
     86      * @return the byte tracker
     87      */
     88     @Nonnull
     89     public ByteTracker getTracker() {
     90         return tracker;
     91     }
     92 
     93     /**
     94      * Obtains the compressor to use.
     95      *
     96      * @return the compressor
     97      */
     98     @Nonnull
     99     public Compressor getCompressor() {
    100         return compressor;
    101     }
    102 
    103     /**
    104      * Sets the compressor to use.
    105      *
    106      * @param compressor the compressor
    107      */
    108     public ZFileOptions setCompressor(@Nonnull Compressor compressor) {
    109         this.compressor = compressor;
    110         return this;
    111     }
    112 
    113     /**
    114      * Obtains whether timestamps should be zeroed.
    115      *
    116      * @return should timestamps be zeroed?
    117      */
    118     public boolean getNoTimestamps() {
    119         return noTimestamps;
    120     }
    121 
    122     /**
    123      * Sets whether timestamps should be zeroed.
    124      *
    125      * @param noTimestamps should timestamps be zeroed?
    126      */
    127     public ZFileOptions setNoTimestamps(boolean noTimestamps) {
    128         this.noTimestamps = noTimestamps;
    129         return this;
    130     }
    131 
    132     /**
    133      * Obtains the alignment rule.
    134      *
    135      * @return the alignment rule
    136      */
    137     @Nonnull
    138     public AlignmentRule getAlignmentRule() {
    139         return alignmentRule;
    140     }
    141 
    142     /**
    143      * Sets the alignment rule.
    144      *
    145      * @param alignmentRule the alignment rule
    146      */
    147     public ZFileOptions setAlignmentRule(@Nonnull AlignmentRule alignmentRule) {
    148         this.alignmentRule = alignmentRule;
    149         return this;
    150     }
    151 
    152     /**
    153      * Obtains whether the extra field should be used to cover empty spaces. See {@link ZFile} for
    154      * an explanation on using the extra field for covering empty spaces.
    155      *
    156      * @return should the extra field be used to cover empty spaces?
    157      */
    158     public boolean getCoverEmptySpaceUsingExtraField() {
    159         return coverEmptySpaceUsingExtraField;
    160     }
    161 
    162     /**
    163      * Sets whether the extra field should be used to cover empty spaces. See {@link ZFile} for an
    164      * explanation on using the extra field for covering empty spaces.
    165      *
    166      * @param coverEmptySpaceUsingExtraField should the extra field be used to cover empty spaces?
    167      */
    168     public ZFileOptions setCoverEmptySpaceUsingExtraField(boolean coverEmptySpaceUsingExtraField) {
    169         this.coverEmptySpaceUsingExtraField = coverEmptySpaceUsingExtraField;
    170         return this;
    171     }
    172 
    173     /**
    174      * Obtains whether files should be automatically sorted before updating the zip file. See
    175      * {@link ZFile} for an explanation on automatic sorting.
    176      *
    177      * @return should the file be automatically sorted?
    178      */
    179     public boolean getAutoSortFiles() {
    180         return autoSortFiles;
    181     }
    182 
    183     /**
    184      * Sets whether files should be automatically sorted before updating the zip file. See {@link
    185      * ZFile} for an explanation on automatic sorting.
    186      *
    187      * @param autoSortFiles should the file be automatically sorted?
    188      */
    189     public ZFileOptions setAutoSortFiles(boolean autoSortFiles) {
    190         this.autoSortFiles = autoSortFiles;
    191         return this;
    192     }
    193 
    194     /**
    195      * Sets the verification log factory.
    196      *
    197      * @param verifyLogFactory verification log factory
    198      */
    199     public ZFileOptions setVerifyLogFactory(@Nonnull Supplier<VerifyLog> verifyLogFactory) {
    200         this.verifyLogFactory = verifyLogFactory;
    201         return this;
    202     }
    203 
    204     /**
    205      * Obtains the verification log factory. By default, the verification log doesn't store
    206      * anything and will always return an empty log.
    207      *
    208      * @return the verification log factory
    209      */
    210     @Nonnull
    211     public Supplier<VerifyLog> getVerifyLogFactory() {
    212         return verifyLogFactory;
    213     }
    214 }
    215