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   * http://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;
20  
21  import java.io.IOException;
22  import java.nio.file.Path;
23  import java.util.Date;
24  
25  /**
26   * An entry of an archive.
27   */
28  public interface ArchiveEntry {
29  
30      /**
31       * Special value ({@value}) indicating that the size is unknown.
32       */
33      long SIZE_UNKNOWN = -1;
34  
35      /**
36       * Gets the last modified date of this entry.
37       *
38       * @return the last modified date of this entry.
39       * @since 1.1
40       */
41      Date getLastModifiedDate();
42  
43      /**
44       * Gets the name of the entry in this archive. May refer to a file or directory or other item.
45       * <p>
46       * This method returns the raw name as it is stored inside of the archive.
47       * </p>
48       *
49       * @return The name of this entry in the archive.
50       */
51      String getName();
52  
53      /**
54       * Gets the uncompressed size of this entry. May be -1 (SIZE_UNKNOWN) if the size is unknown
55       *
56       * @return the uncompressed size of this entry.
57       */
58      long getSize();
59  
60      /**
61       * Tests whether this entry refers to a directory (true).
62       *
63       * @return true if this entry refers to a directory.
64       */
65      boolean isDirectory();
66  
67      /**
68       * Resolves this entry in the given parent Path.
69       *
70       * @param parentPath the {@link Path#resolve(Path)} receiver.
71       * @return a resolved and normalized Path.
72       * @throws IOException if this method detects a Zip slip.
73       * @since 1.26.0
74       */
75      default Path resolveIn(final Path parentPath) throws IOException {
76          final String name = getName();
77          final Path outputFile = parentPath.resolve(name).normalize();
78          if (!outputFile.startsWith(parentPath)) {
79              throw new IOException(String.format("Zip slip '%s' + '%s' -> '%s'", parentPath, name, outputFile));
80          }
81          return outputFile;
82      }
83  
84  }