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