xref: /aosp_15_r20/dalvik/dx/src/com/android/multidex/ArchivePathElement.java (revision 055d459012065f78d96b68be8421640240ddf631)
1*055d4590SKeyi Gui /*
2*055d4590SKeyi Gui  * Copyright (C) 2013 The Android Open Source Project
3*055d4590SKeyi Gui  *
4*055d4590SKeyi Gui  * Licensed under the Apache License, Version 2.0 (the "License");
5*055d4590SKeyi Gui  * you may not use this file except in compliance with the License.
6*055d4590SKeyi Gui  * You may obtain a copy of the License at
7*055d4590SKeyi Gui  *
8*055d4590SKeyi Gui  *      http://www.apache.org/licenses/LICENSE-2.0
9*055d4590SKeyi Gui  *
10*055d4590SKeyi Gui  * Unless required by applicable law or agreed to in writing, software
11*055d4590SKeyi Gui  * distributed under the License is distributed on an "AS IS" BASIS,
12*055d4590SKeyi Gui  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*055d4590SKeyi Gui  * See the License for the specific language governing permissions and
14*055d4590SKeyi Gui  * limitations under the License.
15*055d4590SKeyi Gui  */
16*055d4590SKeyi Gui 
17*055d4590SKeyi Gui package com.android.multidex;
18*055d4590SKeyi Gui 
19*055d4590SKeyi Gui import java.io.FileNotFoundException;
20*055d4590SKeyi Gui import java.io.IOException;
21*055d4590SKeyi Gui import java.io.InputStream;
22*055d4590SKeyi Gui import java.util.Enumeration;
23*055d4590SKeyi Gui import java.util.Iterator;
24*055d4590SKeyi Gui import java.util.NoSuchElementException;
25*055d4590SKeyi Gui import java.util.zip.ZipEntry;
26*055d4590SKeyi Gui import java.util.zip.ZipFile;
27*055d4590SKeyi Gui 
28*055d4590SKeyi Gui /**
29*055d4590SKeyi Gui  * A zip element.
30*055d4590SKeyi Gui  */
31*055d4590SKeyi Gui class ArchivePathElement implements ClassPathElement {
32*055d4590SKeyi Gui 
33*055d4590SKeyi Gui     static class DirectoryEntryException extends IOException {
34*055d4590SKeyi Gui     }
35*055d4590SKeyi Gui 
36*055d4590SKeyi Gui     private final ZipFile archive;
37*055d4590SKeyi Gui 
ArchivePathElement(ZipFile archive)38*055d4590SKeyi Gui     public ArchivePathElement(ZipFile archive) {
39*055d4590SKeyi Gui         this.archive = archive;
40*055d4590SKeyi Gui     }
41*055d4590SKeyi Gui 
42*055d4590SKeyi Gui     @Override
open(String path)43*055d4590SKeyi Gui     public InputStream open(String path) throws IOException {
44*055d4590SKeyi Gui         ZipEntry entry = archive.getEntry(path);
45*055d4590SKeyi Gui         if (entry == null) {
46*055d4590SKeyi Gui             throw new FileNotFoundException("File \"" + path + "\" not found");
47*055d4590SKeyi Gui         } else if (entry.isDirectory()) {
48*055d4590SKeyi Gui             throw new DirectoryEntryException();
49*055d4590SKeyi Gui         } else {
50*055d4590SKeyi Gui             return archive.getInputStream(entry);
51*055d4590SKeyi Gui         }
52*055d4590SKeyi Gui     }
53*055d4590SKeyi Gui 
54*055d4590SKeyi Gui     @Override
close()55*055d4590SKeyi Gui     public void close() throws IOException {
56*055d4590SKeyi Gui         archive.close();
57*055d4590SKeyi Gui     }
58*055d4590SKeyi Gui 
59*055d4590SKeyi Gui     @Override
list()60*055d4590SKeyi Gui     public Iterable<String> list() {
61*055d4590SKeyi Gui         return new Iterable<String>() {
62*055d4590SKeyi Gui 
63*055d4590SKeyi Gui             @Override
64*055d4590SKeyi Gui             public Iterator<String> iterator() {
65*055d4590SKeyi Gui                 return new Iterator<String>() {
66*055d4590SKeyi Gui                     Enumeration<? extends ZipEntry> delegate = archive.entries();
67*055d4590SKeyi Gui                     ZipEntry next = null;
68*055d4590SKeyi Gui 
69*055d4590SKeyi Gui                     @Override
70*055d4590SKeyi Gui                     public boolean hasNext() {
71*055d4590SKeyi Gui                         while (next == null && delegate.hasMoreElements()) {
72*055d4590SKeyi Gui                             next = delegate.nextElement();
73*055d4590SKeyi Gui                             if (next.isDirectory()) {
74*055d4590SKeyi Gui                                 next = null;
75*055d4590SKeyi Gui                             }
76*055d4590SKeyi Gui                         }
77*055d4590SKeyi Gui                         return next != null;
78*055d4590SKeyi Gui                     }
79*055d4590SKeyi Gui 
80*055d4590SKeyi Gui                     @Override
81*055d4590SKeyi Gui                     public String next() {
82*055d4590SKeyi Gui                         if (hasNext()) {
83*055d4590SKeyi Gui                             String name = next.getName();
84*055d4590SKeyi Gui                             next = null;
85*055d4590SKeyi Gui                             return name;
86*055d4590SKeyi Gui                         } else {
87*055d4590SKeyi Gui                             throw new NoSuchElementException();
88*055d4590SKeyi Gui                         }
89*055d4590SKeyi Gui                     }
90*055d4590SKeyi Gui 
91*055d4590SKeyi Gui                     @Override
92*055d4590SKeyi Gui                     public void remove() {
93*055d4590SKeyi Gui                         throw new UnsupportedOperationException();
94*055d4590SKeyi Gui                     }
95*055d4590SKeyi Gui                 };
96*055d4590SKeyi Gui             }
97*055d4590SKeyi Gui         };
98*055d4590SKeyi Gui     }
99*055d4590SKeyi Gui 
100*055d4590SKeyi Gui }
101