150 lines
4.9 KiB
Java
150 lines
4.9 KiB
Java
Jar byte loader
|
|
|
|
|
|
|
|
package com.ack.tools.jarinfo;
|
|
|
|
import java.io.BufferedInputStream;
|
|
import java.io.FileInputStream;
|
|
import java.io.IOException;
|
|
import java.util.zip.ZipEntry;
|
|
import java.util.zip.ZipInputStream;
|
|
|
|
import com.ack.tools.jarinfo.JarInfo;
|
|
import com.ack.tools.jarinfo.JarInfoException;
|
|
import com.ack.tools.jarinfo.ByteLoader;
|
|
import com.ack.tools.jarinfo.ZipEntryFilter;
|
|
|
|
/**
|
|
* This class provides an abstraction for resources within
|
|
* a jar/zip file. It takes either a com.ack.tools.jarinfo.JarInfo object,
|
|
* or a jar/zip file and a ZipEntry filter.
|
|
*
|
|
* JarByteLoader provides clients with a means to load
|
|
* resources from the jar/zip file into a byte array.
|
|
*
|
|
*
|
|
*/
|
|
public class JarByteLoader {
|
|
private JarInfo fInfo;
|
|
private ByteLoader fByteLoader;
|
|
|
|
/**
|
|
* Create a JarClassTable that is a cache for bytes
|
|
* for classes within the supplied zip file
|
|
*
|
|
* @exception com.ack.tools.jarinfo.JarInfoException reports problems reading the zip file
|
|
* @param the jar/zip file to search for classes
|
|
* @param filter to be applied to the zip file
|
|
*/
|
|
public JarByteLoader( String zipFile, ZipEntryFilter filter )
|
|
throws JarInfoException {
|
|
// creates a JarInfo object that contains zip entries according to the filter
|
|
fInfo = new JarInfo( zipFile, filter );
|
|
fByteLoader = new ByteLoader();
|
|
}
|
|
|
|
/**
|
|
* Creates a JarByteLoader from JarInfo
|
|
*
|
|
* @param a view on a jar file
|
|
* @return reports problems with the JarInfo object
|
|
* @exception com.ack.tools.jarinfo.JarInfoException reports problems with JarInfo
|
|
*/
|
|
public JarByteLoader( JarInfo info ) throws JarInfoException {
|
|
if( ( fInfo = info ) == null )
|
|
throw new JarInfoException( "supplied JarInfo object was null" );
|
|
fByteLoader = new ByteLoader();
|
|
}
|
|
|
|
/**
|
|
* get the class bytes for the named class. this will first
|
|
* look in its internal cache for the bytes for the named class
|
|
* and if it is not found in there load it from the underlying
|
|
* jar/zip file.
|
|
*
|
|
* @param the class name
|
|
* @return bytes for the named class. if it can't be found
|
|
* this method returns null
|
|
* @exception com.ack.tools.jarinfo.JarInfoException reports problems getting resources from jar
|
|
*/
|
|
public byte[] getResourceAsBytes( String resourceName ) throws JarInfoException {
|
|
if( resourceName == null )
|
|
throw new JarInfoException( "supplied resourceName to getResourceAsBytes() was null" );
|
|
|
|
ZipEntry ze = fInfo.getZipEntry( resourceName );
|
|
if( ze == null )
|
|
throw new JarInfoException( "no such resource '" +
|
|
resourceName + "' in archive -> " + fInfo.zipFileName() );
|
|
return loadBytes( ze );
|
|
}
|
|
|
|
/**
|
|
* Load the supplied ZipEntry resource from JarByteLoader's java
|
|
* archive into a byte array
|
|
*
|
|
* @param the ZipEntry to be loaded
|
|
* @return the byte array holding the contains of the ZipEntry
|
|
* @exception com.ack.tools.jarinfo.JarInfoException reports problems trying to load supplied resource
|
|
*/
|
|
public byte[] getResourceAsBytes( ZipEntry resource ) throws JarInfoException {
|
|
return loadBytes( resource );
|
|
}
|
|
|
|
/**
|
|
* accessor method for the JarInfo object
|
|
*
|
|
* @return the JarInfo object
|
|
*/
|
|
public JarInfo getJarInfo() {
|
|
return fInfo;
|
|
}
|
|
|
|
/**
|
|
* Extract the bytes for a resource from the jar/zip file
|
|
* based on the supplied resource name
|
|
*
|
|
* @exception com.ack.tools.jarinfo.JarInfoException reports any problem trying to get the
|
|
* the resource bytes from the ZipEntry
|
|
* @param the full pathname of the resource
|
|
* @return the bytes for the named resource
|
|
*/
|
|
private byte[] loadBytes( ZipEntry zentry ) throws JarInfoException {
|
|
// get the zip entry for the named class from JarInfo
|
|
if( zentry == null )
|
|
throw new JarInfoException( "supplied zip entry to Java archive '" +
|
|
fInfo.zipFileName() + "' was null" );
|
|
byte[] b = null;
|
|
ZipInputStream zis = null;
|
|
try {
|
|
// if there is such a ZipEntry, open up the jar/zip file
|
|
FileInputStream fis = new FileInputStream( fInfo.zipFileName() );
|
|
BufferedInputStream bis = new BufferedInputStream( fis );
|
|
zis = new ZipInputStream( bis );
|
|
b = fByteLoader.loadBytesFromZipEntry( zis, zentry );
|
|
}
|
|
catch( IOException ioe ) {
|
|
ioe.printStackTrace();
|
|
throw new JarInfoException( ioe.getMessage() );
|
|
}
|
|
catch( ClassFormatError cfe ) {
|
|
cfe.printStackTrace();
|
|
throw new JarInfoException( cfe.getMessage() );
|
|
}
|
|
finally {
|
|
if( zis != null )
|
|
try {
|
|
zis.close();
|
|
}
|
|
catch( IOException ioe ) {
|
|
}
|
|
}
|
|
|
|
if( b == null )
|
|
throw new JarInfoException( "no such resource '" + zentry.getName() +
|
|
"' inside Java archive -> " + fInfo.zipFileName() );
|
|
|
|
return b;
|
|
}
|
|
}
|