proguard.io.JarReader Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of proguard-core Show documentation
Show all versions of proguard-core Show documentation
ProGuardCORE is a free library to read, analyze, modify, and write Java class files.
/*
* ProGuardCORE -- library to process Java bytecode.
*
* Copyright (c) 2002-2020 Guardsquare NV
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package proguard.io;
import java.io.IOException;
import java.nio.charset.*;
import java.util.Enumeration;
import java.util.zip.*;
/**
* This {@link DataEntryReader} lets a given {@link DataEntryReader} read all data entries of the
* read archive data entries.
*
* @author Eric Lafortune
*/
public class JarReader implements DataEntryReader {
private final boolean jmod;
private final DataEntryReader dataEntryReader;
/**
* Creates a new JarReader.
*
* @param dataEntryReader the reader that can process the jar entries.
*/
public JarReader(DataEntryReader dataEntryReader) {
this(false, dataEntryReader);
}
/**
* Creates a new JarReader that optionally reads jmod files.
*
* @param jmod specifies whether the input jar is actually a jmod file.
* @param dataEntryReader the reader that can process the jar entries.
*/
public JarReader(boolean jmod, DataEntryReader dataEntryReader) {
this.jmod = jmod;
this.dataEntryReader = dataEntryReader;
}
// Implementation for DataEntryReader.
@Override
public void read(DataEntry dataEntry) throws IOException {
// Can we parse the jar entries more robustly from a file?
if (dataEntry instanceof FileDataEntry) {
// Read the data entry using its file.
FileDataEntry fileDataEntry = (FileDataEntry) dataEntry;
ZipFile zipFile = new ZipFile(fileDataEntry.getFile(), StandardCharsets.UTF_8);
try {
Enumeration entries = zipFile.entries();
// Get all entries from the input jar.
while (entries.hasMoreElements()) {
ZipEntry zipEntry = (ZipEntry) entries.nextElement();
// Delegate the actual reading to the data entry reader.
dataEntryReader.read(new ZipFileDataEntry(dataEntry, zipEntry, zipFile));
}
} finally {
zipFile.close();
}
} else {
if (jmod) {
// Eat the magic bytes
dataEntry.getInputStream().read(new byte[4]);
}
// Read the data entry using its stream.
ZipInputStream zipInputStream =
new ZipInputStream(dataEntry.getInputStream(), StandardCharsets.UTF_8);
try {
// Get all entries from the input jar.
while (true) {
// Can we get another entry?
ZipEntry zipEntry = zipInputStream.getNextEntry();
if (zipEntry == null) {
break;
}
// Delegate the actual reading to the data entry reader.
dataEntryReader.read(new ZipDataEntry(dataEntry, zipEntry, zipInputStream));
}
} finally {
dataEntry.closeInputStream();
}
}
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy