jtulach@144: /* jtulach@144: * Copyright (c) 2002, 2006, Oracle and/or its affiliates. All rights reserved. jtulach@144: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. jtulach@144: * jtulach@144: * This code is free software; you can redistribute it and/or modify it jtulach@144: * under the terms of the GNU General Public License version 2 only, as jtulach@144: * published by the Free Software Foundation. Oracle designates this jtulach@144: * particular file as subject to the "Classpath" exception as provided jtulach@144: * by Oracle in the LICENSE file that accompanied this code. jtulach@144: * jtulach@144: * This code is distributed in the hope that it will be useful, but WITHOUT jtulach@144: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or jtulach@144: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License jtulach@144: * version 2 for more details (a copy is included in the LICENSE file that jtulach@144: * accompanied this code). jtulach@144: * jtulach@144: * You should have received a copy of the GNU General Public License version jtulach@144: * 2 along with this work; if not, write to the Free Software Foundation, jtulach@144: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. jtulach@144: * jtulach@144: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA jtulach@144: * or visit www.oracle.com if you need additional information or have any jtulach@144: * questions. jtulach@144: */ jtulach@144: jtulach@144: jtulach@144: package sun.tools.javap; jtulach@144: jtulach@144: import java.util.*; jtulach@144: import java.io.*; jtulach@144: import java.util.jar.*; jtulach@144: jtulach@144: jtulach@144: /** jtulach@144: * Strores flag values according to command line options jtulach@144: * and sets path where to find classes. jtulach@144: * jtulach@144: * @author Sucheta Dambalkar jtulach@144: */ jtulach@144: public class JavapEnvironment { jtulach@144: jtulach@144: //Access flags jtulach@144: public static final int PRIVATE = 0; jtulach@144: public static final int PROTECTED = 1; jtulach@144: public static final int PACKAGE = 2; jtulach@144: public static final int PUBLIC = 3; jtulach@144: jtulach@144: //search path flags. jtulach@144: private static final int start = 0; jtulach@144: private static final int cmdboot= 1; jtulach@144: private static final int sunboot = 2; jtulach@144: private static final int javaclass= 3; jtulach@144: private static final int cmdextdir= 4; jtulach@144: private static final int javaext= 5; jtulach@144: private static final int cmdclasspath= 6; jtulach@144: private static final int envclasspath= 7; jtulach@144: private static final int javaclasspath= 8; jtulach@144: private static final int currentdir = 9; jtulach@144: jtulach@144: jtulach@144: // JavapEnvironment flag settings jtulach@144: boolean showLineAndLocal = false; jtulach@144: int showAccess = PACKAGE; jtulach@144: boolean showDisassembled = false; jtulach@144: boolean showVerbose = false; jtulach@144: boolean showInternalSigs = false; jtulach@144: String classPathString = null; jtulach@144: String bootClassPathString = null; jtulach@144: String extDirsString = null; jtulach@144: boolean extDirflag = false; jtulach@144: boolean nothingToDo = true; jtulach@144: boolean showallAttr = false; jtulach@144: String classpath = null; jtulach@144: int searchpath = start; jtulach@144: jtulach@144: /** jtulach@144: * According to which flags are set, jtulach@144: * returns file input stream for classfile to disassemble. jtulach@144: */ jtulach@144: jtulach@144: public InputStream getFileInputStream(String Name){ jtulach@144: InputStream fileInStream = null; jtulach@144: searchpath = cmdboot; jtulach@144: try{ jtulach@144: if(searchpath == cmdboot){ jtulach@144: if(bootClassPathString != null){ jtulach@144: //search in specified bootclasspath. jtulach@144: classpath = bootClassPathString; jtulach@144: if((fileInStream = resolvefilename(Name)) != null) return fileInStream; jtulach@144: //no classes found in search path. jtulach@144: else searchpath = cmdextdir; jtulach@144: } jtulach@144: else searchpath = sunboot; jtulach@144: } jtulach@144: jtulach@144: if(searchpath == sunboot){ jtulach@144: if(System.getProperty("sun.boot.class.path") != null){ jtulach@144: //search in sun.boot.class.path jtulach@144: classpath = System.getProperty("sun.boot.class.path"); jtulach@144: if((fileInStream = resolvefilename(Name)) != null) return fileInStream; jtulach@144: //no classes found in search path jtulach@144: else searchpath = cmdextdir; jtulach@144: } jtulach@144: else searchpath = javaclass; jtulach@144: } jtulach@144: jtulach@144: if(searchpath == javaclass){ jtulach@144: if(System.getProperty("java.class.path") != null){ jtulach@144: //search in java.class.path jtulach@144: classpath =System.getProperty("java.class.path"); jtulach@144: if((fileInStream = resolvefilename(Name)) != null) return fileInStream; jtulach@144: //no classes found in search path jtulach@144: else searchpath = cmdextdir; jtulach@144: } jtulach@144: else searchpath = cmdextdir; jtulach@144: } jtulach@144: jtulach@144: if(searchpath == cmdextdir){ jtulach@144: if(extDirsString != null){ jtulach@144: //search in specified extdir. jtulach@144: classpath = extDirsString; jtulach@144: extDirflag = true; jtulach@144: if((fileInStream = resolvefilename(Name)) != null) return fileInStream; jtulach@144: //no classes found in search path jtulach@144: else { jtulach@144: searchpath = cmdclasspath; jtulach@144: extDirflag = false; jtulach@144: } jtulach@144: } jtulach@144: else searchpath = javaext; jtulach@144: } jtulach@144: jtulach@144: if(searchpath == javaext){ jtulach@144: if(System.getProperty("java.ext.dirs") != null){ jtulach@144: //search in java.ext.dirs jtulach@144: classpath = System.getProperty("java.ext.dirs"); jtulach@144: extDirflag = true; jtulach@144: if((fileInStream = resolvefilename(Name)) != null) return fileInStream; jtulach@144: //no classes found in search path jtulach@144: else { jtulach@144: searchpath = cmdclasspath; jtulach@144: extDirflag = false; jtulach@144: } jtulach@144: } jtulach@144: else searchpath = cmdclasspath; jtulach@144: } jtulach@144: if(searchpath == cmdclasspath){ jtulach@144: if(classPathString != null){ jtulach@144: //search in specified classpath. jtulach@144: classpath = classPathString; jtulach@144: if((fileInStream = resolvefilename(Name)) != null) return fileInStream; jtulach@144: //no classes found in search path jtulach@144: else searchpath = 8; jtulach@144: } jtulach@144: else searchpath = envclasspath; jtulach@144: } jtulach@144: jtulach@144: if(searchpath == envclasspath){ jtulach@144: if(System.getProperty("env.class.path")!= null){ jtulach@144: //search in env.class.path jtulach@144: classpath = System.getProperty("env.class.path"); jtulach@144: if((fileInStream = resolvefilename(Name)) != null) return fileInStream; jtulach@144: //no classes found in search path. jtulach@144: else searchpath = javaclasspath; jtulach@144: } jtulach@144: else searchpath = javaclasspath; jtulach@144: } jtulach@144: jtulach@144: if(searchpath == javaclasspath){ jtulach@144: if(("application.home") == null){ jtulach@144: //search in java.class.path jtulach@144: classpath = System.getProperty("java.class.path"); jtulach@144: if((fileInStream = resolvefilename(Name)) != null) return fileInStream; jtulach@144: //no classes found in search path. jtulach@144: else searchpath = currentdir; jtulach@144: } jtulach@144: else searchpath = currentdir; jtulach@144: } jtulach@144: jtulach@144: if(searchpath == currentdir){ jtulach@144: classpath = "."; jtulach@144: //search in current dir. jtulach@144: if((fileInStream = resolvefilename(Name)) != null) return fileInStream; jtulach@144: else { jtulach@144: //no classes found in search path. jtulach@144: error("Could not find "+ Name); jtulach@144: System.exit(1); jtulach@144: } jtulach@144: } jtulach@144: }catch(SecurityException excsec){ jtulach@144: excsec.printStackTrace(); jtulach@144: error("fatal exception"); jtulach@144: }catch(NullPointerException excnull){ jtulach@144: excnull.printStackTrace(); jtulach@144: error("fatal exception"); jtulach@144: }catch(IllegalArgumentException excill){ jtulach@144: excill.printStackTrace(); jtulach@144: error("fatal exception"); jtulach@144: } jtulach@144: jtulach@144: return null; jtulach@144: } jtulach@144: jtulach@144: jtulach@144: public void error(String msg) { jtulach@144: System.err.println("ERROR:" +msg); jtulach@144: } jtulach@144: jtulach@144: /** jtulach@144: * Resolves file name for classfile to disassemble. jtulach@144: */ jtulach@144: public InputStream resolvefilename(String name){ jtulach@144: String classname = name.replace('.', '/') + ".class"; jtulach@144: while (true) { jtulach@144: InputStream instream = extDirflag jtulach@144: ? resolveExdirFilename(classname) jtulach@144: : resolveclasspath(classname); jtulach@144: if (instream != null) jtulach@144: return instream; jtulach@144: int lastindex = classname.lastIndexOf('/'); jtulach@144: if (lastindex == -1) return null; jtulach@144: classname = classname.substring(0, lastindex) + "$" + jtulach@144: classname.substring(lastindex + 1); jtulach@144: } jtulach@144: } jtulach@144: jtulach@144: /** jtulach@144: * Resolves file name for classfile to disassemble if flag exdir is set. jtulach@144: */ jtulach@144: public InputStream resolveExdirFilename(String classname){ jtulach@144: if(classpath.indexOf(File.pathSeparator) != -1){ jtulach@144: //separates path jtulach@144: StringTokenizer st = new StringTokenizer(classpath, File.pathSeparator); jtulach@144: while(st.hasMoreTokens()){ jtulach@144: String path = st.nextToken(); jtulach@144: InputStream in = resolveExdirFilenamehelper(path, classname); jtulach@144: if (in != null) jtulach@144: return in; jtulach@144: } jtulach@144: }else return (resolveExdirFilenamehelper(classpath, classname)); jtulach@144: jtulach@144: return null; jtulach@144: } jtulach@144: jtulach@144: /** jtulach@144: * Resolves file name for classfile to disassemble. jtulach@144: */ jtulach@144: public InputStream resolveclasspath(String classname){ jtulach@144: if(classpath.indexOf(File.pathSeparator) != -1){ jtulach@144: StringTokenizer st = new StringTokenizer(classpath, File.pathSeparator); jtulach@144: //separates path. jtulach@144: while(st.hasMoreTokens()){ jtulach@144: String path = (st.nextToken()).trim(); jtulach@144: InputStream in = resolveclasspathhelper(path, classname); jtulach@144: if(in != null) return in; jtulach@144: jtulach@144: } jtulach@144: return null; jtulach@144: } jtulach@144: else return (resolveclasspathhelper(classpath, classname)); jtulach@144: } jtulach@144: jtulach@144: jtulach@144: /** jtulach@144: * Returns file input stream for classfile to disassemble if exdir is set. jtulach@144: */ jtulach@144: public InputStream resolveExdirFilenamehelper(String path, String classname){ jtulach@144: File fileobj = new File(path); jtulach@144: if(fileobj.isDirectory()){ jtulach@144: // gets list of files in that directory. jtulach@144: File[] filelist = fileobj.listFiles(); jtulach@144: for(int i = 0; i < filelist.length; i++){ jtulach@144: try{ jtulach@144: //file is a jar file. jtulach@144: if(filelist[i].toString().endsWith(".jar")){ jtulach@144: JarFile jfile = new JarFile(filelist[i]); jtulach@144: if((jfile.getEntry(classname)) != null){ jtulach@144: jtulach@144: InputStream filein = jfile.getInputStream(jfile.getEntry(classname)); jtulach@144: int bytearraysize = filein.available(); jtulach@144: byte []b = new byte[bytearraysize]; jtulach@144: int totalread = 0; jtulach@144: while(totalread < bytearraysize){ jtulach@144: totalread += filein.read(b, totalread, bytearraysize-totalread); jtulach@144: } jtulach@144: InputStream inbyte = new ByteArrayInputStream(b); jtulach@144: filein.close(); jtulach@144: return inbyte; jtulach@144: } jtulach@144: } else { jtulach@144: //not a jar file. jtulach@144: String filename = path+"/"+ classname; jtulach@144: File file = new File(filename); jtulach@144: if(file.isFile()){ jtulach@144: return (new FileInputStream(file)); jtulach@144: } jtulach@144: } jtulach@144: }catch(FileNotFoundException fnexce){ jtulach@144: fnexce.printStackTrace(); jtulach@144: error("cant read file"); jtulach@144: error("fatal exception"); jtulach@144: }catch(IOException ioexc){ jtulach@144: ioexc.printStackTrace(); jtulach@144: error("fatal exception"); jtulach@144: } jtulach@144: } jtulach@144: } jtulach@144: jtulach@144: return null; jtulach@144: } jtulach@144: jtulach@144: jtulach@144: /** jtulach@144: * Returns file input stream for classfile to disassemble. jtulach@144: */ jtulach@144: public InputStream resolveclasspathhelper(String path, String classname){ jtulach@144: File fileobj = new File(path); jtulach@144: try{ jtulach@144: if(fileobj.isDirectory()){ jtulach@144: //is a directory. jtulach@144: String filename = path+"/"+ classname; jtulach@144: File file = new File(filename); jtulach@144: if(file.isFile()){ jtulach@144: return (new FileInputStream(file)); jtulach@144: } jtulach@144: jtulach@144: }else if(fileobj.isFile()){ jtulach@144: if(fileobj.toString().endsWith(".jar")){ jtulach@144: //is a jar file. jtulach@144: JarFile jfile = new JarFile(fileobj); jtulach@144: if((jfile.getEntry(classname)) != null){ jtulach@144: InputStream filein = jfile.getInputStream(jfile.getEntry(classname)); jtulach@144: int bytearraysize = filein.available(); jtulach@144: byte []b = new byte[bytearraysize]; jtulach@144: int totalread = 0; jtulach@144: while(totalread < bytearraysize){ jtulach@144: totalread += filein.read(b, totalread, bytearraysize-totalread); jtulach@144: } jtulach@144: InputStream inbyte = new ByteArrayInputStream(b); jtulach@144: filein.close(); jtulach@144: return inbyte; jtulach@144: } jtulach@144: } jtulach@144: } jtulach@144: }catch(FileNotFoundException fnexce){ jtulach@144: fnexce.printStackTrace(); jtulach@144: error("cant read file"); jtulach@144: error("fatal exception"); jtulach@144: }catch(IOException ioexce){ jtulach@144: ioexce.printStackTrace(); jtulach@144: error("fatal exception"); jtulach@144: } jtulach@144: return null; jtulach@144: } jtulach@144: }