javap/src/main/java/sun/tools/javap/JavapEnvironment.java
author Jaroslav Tulach <jtulach@netbeans.org>
Fri, 09 Nov 2012 21:33:22 +0100
branchjavap
changeset 144 b06660b614db
permissions -rw-r--r--
javap as of revision jdk6-4ab5d66aaf2b
jtulach@144
     1
/*
jtulach@144
     2
 * Copyright (c) 2002, 2006, Oracle and/or its affiliates. All rights reserved.
jtulach@144
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
jtulach@144
     4
 *
jtulach@144
     5
 * This code is free software; you can redistribute it and/or modify it
jtulach@144
     6
 * under the terms of the GNU General Public License version 2 only, as
jtulach@144
     7
 * published by the Free Software Foundation.  Oracle designates this
jtulach@144
     8
 * particular file as subject to the "Classpath" exception as provided
jtulach@144
     9
 * by Oracle in the LICENSE file that accompanied this code.
jtulach@144
    10
 *
jtulach@144
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
jtulach@144
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
jtulach@144
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
jtulach@144
    14
 * version 2 for more details (a copy is included in the LICENSE file that
jtulach@144
    15
 * accompanied this code).
jtulach@144
    16
 *
jtulach@144
    17
 * You should have received a copy of the GNU General Public License version
jtulach@144
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
jtulach@144
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
jtulach@144
    20
 *
jtulach@144
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
jtulach@144
    22
 * or visit www.oracle.com if you need additional information or have any
jtulach@144
    23
 * questions.
jtulach@144
    24
 */
jtulach@144
    25
jtulach@144
    26
jtulach@144
    27
package sun.tools.javap;
jtulach@144
    28
jtulach@144
    29
import java.util.*;
jtulach@144
    30
import java.io.*;
jtulach@144
    31
import java.util.jar.*;
jtulach@144
    32
jtulach@144
    33
jtulach@144
    34
/**
jtulach@144
    35
 * Strores flag values according to command line options
jtulach@144
    36
 * and sets path where to find classes.
jtulach@144
    37
 *
jtulach@144
    38
 * @author  Sucheta Dambalkar
jtulach@144
    39
 */
jtulach@144
    40
public class JavapEnvironment {
jtulach@144
    41
jtulach@144
    42
    //Access flags
jtulach@144
    43
    public static final int PRIVATE = 0;
jtulach@144
    44
    public static final int PROTECTED  = 1;
jtulach@144
    45
    public static final int PACKAGE = 2;
jtulach@144
    46
    public static final int PUBLIC  = 3;
jtulach@144
    47
jtulach@144
    48
    //search path flags.
jtulach@144
    49
    private static final int start = 0;
jtulach@144
    50
    private static final int  cmdboot= 1;
jtulach@144
    51
    private static final int sunboot = 2;
jtulach@144
    52
    private static final int  javaclass= 3;
jtulach@144
    53
    private static final int  cmdextdir= 4;
jtulach@144
    54
    private static final int  javaext= 5;
jtulach@144
    55
    private static final int  cmdclasspath= 6;
jtulach@144
    56
    private static final int  envclasspath= 7;
jtulach@144
    57
    private static final int  javaclasspath= 8;
jtulach@144
    58
    private static final int  currentdir = 9;
jtulach@144
    59
jtulach@144
    60
jtulach@144
    61
    // JavapEnvironment flag settings
jtulach@144
    62
    boolean showLineAndLocal = false;
jtulach@144
    63
    int showAccess = PACKAGE;
jtulach@144
    64
    boolean showDisassembled = false;
jtulach@144
    65
    boolean showVerbose = false;
jtulach@144
    66
    boolean showInternalSigs = false;
jtulach@144
    67
    String classPathString = null;
jtulach@144
    68
    String bootClassPathString = null;
jtulach@144
    69
    String extDirsString = null;
jtulach@144
    70
    boolean extDirflag = false;
jtulach@144
    71
    boolean nothingToDo = true;
jtulach@144
    72
    boolean showallAttr = false;
jtulach@144
    73
    String classpath = null;
jtulach@144
    74
    int searchpath = start;
jtulach@144
    75
jtulach@144
    76
    /**
jtulach@144
    77
     *  According to which flags are set,
jtulach@144
    78
     *  returns file input stream for classfile to disassemble.
jtulach@144
    79
     */
jtulach@144
    80
jtulach@144
    81
    public InputStream getFileInputStream(String Name){
jtulach@144
    82
        InputStream fileInStream = null;
jtulach@144
    83
        searchpath = cmdboot;
jtulach@144
    84
        try{
jtulach@144
    85
            if(searchpath == cmdboot){
jtulach@144
    86
                if(bootClassPathString != null){
jtulach@144
    87
                    //search in specified bootclasspath.
jtulach@144
    88
                    classpath = bootClassPathString;
jtulach@144
    89
                    if((fileInStream = resolvefilename(Name)) != null) return fileInStream;
jtulach@144
    90
                    //no classes found in search path.
jtulach@144
    91
                    else searchpath = cmdextdir;
jtulach@144
    92
                }
jtulach@144
    93
                else searchpath = sunboot;
jtulach@144
    94
            }
jtulach@144
    95
jtulach@144
    96
            if(searchpath == sunboot){
jtulach@144
    97
                if(System.getProperty("sun.boot.class.path") != null){
jtulach@144
    98
                    //search in sun.boot.class.path
jtulach@144
    99
                    classpath = System.getProperty("sun.boot.class.path");
jtulach@144
   100
                    if((fileInStream = resolvefilename(Name)) != null) return fileInStream;
jtulach@144
   101
                    //no classes found in search path
jtulach@144
   102
                    else searchpath = cmdextdir;
jtulach@144
   103
                }
jtulach@144
   104
                else searchpath = javaclass;
jtulach@144
   105
            }
jtulach@144
   106
jtulach@144
   107
            if(searchpath == javaclass){
jtulach@144
   108
                if(System.getProperty("java.class.path") != null){
jtulach@144
   109
                    //search in java.class.path
jtulach@144
   110
                    classpath =System.getProperty("java.class.path");
jtulach@144
   111
                    if((fileInStream = resolvefilename(Name)) != null) return fileInStream;
jtulach@144
   112
                    //no classes found in search path
jtulach@144
   113
                    else searchpath = cmdextdir;
jtulach@144
   114
                }
jtulach@144
   115
                else searchpath = cmdextdir;
jtulach@144
   116
            }
jtulach@144
   117
jtulach@144
   118
            if(searchpath == cmdextdir){
jtulach@144
   119
                if(extDirsString != null){
jtulach@144
   120
                    //search in specified extdir.
jtulach@144
   121
                    classpath = extDirsString;
jtulach@144
   122
                    extDirflag = true;
jtulach@144
   123
                    if((fileInStream = resolvefilename(Name)) != null) return fileInStream;
jtulach@144
   124
                    //no classes found in search path
jtulach@144
   125
                    else {
jtulach@144
   126
                        searchpath = cmdclasspath;
jtulach@144
   127
                        extDirflag = false;
jtulach@144
   128
                    }
jtulach@144
   129
                }
jtulach@144
   130
                else searchpath = javaext;
jtulach@144
   131
            }
jtulach@144
   132
jtulach@144
   133
            if(searchpath == javaext){
jtulach@144
   134
                if(System.getProperty("java.ext.dirs") != null){
jtulach@144
   135
                    //search in java.ext.dirs
jtulach@144
   136
                    classpath = System.getProperty("java.ext.dirs");
jtulach@144
   137
                    extDirflag = true;
jtulach@144
   138
                    if((fileInStream = resolvefilename(Name)) != null) return fileInStream;
jtulach@144
   139
                    //no classes found in search path
jtulach@144
   140
                    else {
jtulach@144
   141
                        searchpath = cmdclasspath;
jtulach@144
   142
                        extDirflag = false;
jtulach@144
   143
                    }
jtulach@144
   144
                }
jtulach@144
   145
                else searchpath = cmdclasspath;
jtulach@144
   146
            }
jtulach@144
   147
            if(searchpath == cmdclasspath){
jtulach@144
   148
                if(classPathString != null){
jtulach@144
   149
                    //search in specified classpath.
jtulach@144
   150
                    classpath = classPathString;
jtulach@144
   151
                    if((fileInStream = resolvefilename(Name)) != null) return fileInStream;
jtulach@144
   152
                    //no classes found in search path
jtulach@144
   153
                    else searchpath = 8;
jtulach@144
   154
                }
jtulach@144
   155
                else searchpath = envclasspath;
jtulach@144
   156
            }
jtulach@144
   157
jtulach@144
   158
            if(searchpath == envclasspath){
jtulach@144
   159
                if(System.getProperty("env.class.path")!= null){
jtulach@144
   160
                    //search in env.class.path
jtulach@144
   161
                    classpath = System.getProperty("env.class.path");
jtulach@144
   162
                    if((fileInStream = resolvefilename(Name)) != null) return fileInStream;
jtulach@144
   163
                    //no classes found in search path.
jtulach@144
   164
                    else searchpath = javaclasspath;
jtulach@144
   165
                }
jtulach@144
   166
                else searchpath = javaclasspath;
jtulach@144
   167
            }
jtulach@144
   168
jtulach@144
   169
            if(searchpath == javaclasspath){
jtulach@144
   170
                if(("application.home") == null){
jtulach@144
   171
                    //search in java.class.path
jtulach@144
   172
                    classpath = System.getProperty("java.class.path");
jtulach@144
   173
                    if((fileInStream = resolvefilename(Name)) != null) return fileInStream;
jtulach@144
   174
                    //no classes found in search path.
jtulach@144
   175
                    else searchpath = currentdir;
jtulach@144
   176
                }
jtulach@144
   177
                else searchpath = currentdir;
jtulach@144
   178
            }
jtulach@144
   179
jtulach@144
   180
            if(searchpath == currentdir){
jtulach@144
   181
                classpath = ".";
jtulach@144
   182
                //search in current dir.
jtulach@144
   183
                if((fileInStream = resolvefilename(Name)) != null) return fileInStream;
jtulach@144
   184
                else {
jtulach@144
   185
                    //no classes found in search path.
jtulach@144
   186
                    error("Could not find "+ Name);
jtulach@144
   187
                    System.exit(1);
jtulach@144
   188
                }
jtulach@144
   189
            }
jtulach@144
   190
        }catch(SecurityException excsec){
jtulach@144
   191
            excsec.printStackTrace();
jtulach@144
   192
            error("fatal exception");
jtulach@144
   193
        }catch(NullPointerException excnull){
jtulach@144
   194
            excnull.printStackTrace();
jtulach@144
   195
            error("fatal exception");
jtulach@144
   196
        }catch(IllegalArgumentException excill){
jtulach@144
   197
            excill.printStackTrace();
jtulach@144
   198
            error("fatal exception");
jtulach@144
   199
        }
jtulach@144
   200
jtulach@144
   201
        return null;
jtulach@144
   202
    }
jtulach@144
   203
jtulach@144
   204
jtulach@144
   205
    public void error(String msg) {
jtulach@144
   206
        System.err.println("ERROR:" +msg);
jtulach@144
   207
    }
jtulach@144
   208
jtulach@144
   209
    /**
jtulach@144
   210
     * Resolves file name for classfile to disassemble.
jtulach@144
   211
     */
jtulach@144
   212
    public InputStream resolvefilename(String name){
jtulach@144
   213
        String classname = name.replace('.', '/') + ".class";
jtulach@144
   214
        while (true) {
jtulach@144
   215
            InputStream instream = extDirflag
jtulach@144
   216
                ? resolveExdirFilename(classname)
jtulach@144
   217
                : resolveclasspath(classname);
jtulach@144
   218
            if (instream != null)
jtulach@144
   219
                return instream;
jtulach@144
   220
            int lastindex = classname.lastIndexOf('/');
jtulach@144
   221
            if (lastindex == -1) return null;
jtulach@144
   222
            classname = classname.substring(0, lastindex) + "$" +
jtulach@144
   223
                classname.substring(lastindex + 1);
jtulach@144
   224
        }
jtulach@144
   225
    }
jtulach@144
   226
jtulach@144
   227
    /**
jtulach@144
   228
     * Resolves file name for classfile to disassemble if flag exdir is set.
jtulach@144
   229
     */
jtulach@144
   230
    public InputStream resolveExdirFilename(String classname){
jtulach@144
   231
        if(classpath.indexOf(File.pathSeparator) != -1){
jtulach@144
   232
            //separates path
jtulach@144
   233
            StringTokenizer st = new StringTokenizer(classpath, File.pathSeparator);
jtulach@144
   234
            while(st.hasMoreTokens()){
jtulach@144
   235
                String path = st.nextToken();
jtulach@144
   236
                InputStream in = resolveExdirFilenamehelper(path, classname);
jtulach@144
   237
                if (in != null)
jtulach@144
   238
                    return in;
jtulach@144
   239
            }
jtulach@144
   240
        }else return (resolveExdirFilenamehelper(classpath, classname));
jtulach@144
   241
jtulach@144
   242
        return null;
jtulach@144
   243
    }
jtulach@144
   244
jtulach@144
   245
    /**
jtulach@144
   246
     * Resolves file name for classfile to disassemble.
jtulach@144
   247
     */
jtulach@144
   248
    public InputStream resolveclasspath(String classname){
jtulach@144
   249
        if(classpath.indexOf(File.pathSeparator) != -1){
jtulach@144
   250
            StringTokenizer st = new StringTokenizer(classpath, File.pathSeparator);
jtulach@144
   251
            //separates path.
jtulach@144
   252
            while(st.hasMoreTokens()){
jtulach@144
   253
                String path = (st.nextToken()).trim();
jtulach@144
   254
                InputStream in = resolveclasspathhelper(path, classname);
jtulach@144
   255
                if(in != null) return in;
jtulach@144
   256
jtulach@144
   257
            }
jtulach@144
   258
            return null;
jtulach@144
   259
        }
jtulach@144
   260
        else return (resolveclasspathhelper(classpath, classname));
jtulach@144
   261
    }
jtulach@144
   262
jtulach@144
   263
jtulach@144
   264
    /**
jtulach@144
   265
     * Returns file input stream for classfile to disassemble if exdir is set.
jtulach@144
   266
     */
jtulach@144
   267
    public InputStream resolveExdirFilenamehelper(String path, String classname){
jtulach@144
   268
        File fileobj = new File(path);
jtulach@144
   269
        if(fileobj.isDirectory()){
jtulach@144
   270
            // gets list of files in that directory.
jtulach@144
   271
            File[] filelist = fileobj.listFiles();
jtulach@144
   272
            for(int i = 0; i < filelist.length; i++){
jtulach@144
   273
                try{
jtulach@144
   274
                    //file is a jar file.
jtulach@144
   275
                    if(filelist[i].toString().endsWith(".jar")){
jtulach@144
   276
                        JarFile jfile = new JarFile(filelist[i]);
jtulach@144
   277
                        if((jfile.getEntry(classname)) != null){
jtulach@144
   278
jtulach@144
   279
                            InputStream filein = jfile.getInputStream(jfile.getEntry(classname));
jtulach@144
   280
                            int bytearraysize = filein.available();
jtulach@144
   281
                            byte []b =  new byte[bytearraysize];
jtulach@144
   282
                            int totalread = 0;
jtulach@144
   283
                            while(totalread < bytearraysize){
jtulach@144
   284
                                totalread += filein.read(b, totalread, bytearraysize-totalread);
jtulach@144
   285
                            }
jtulach@144
   286
                            InputStream inbyte = new ByteArrayInputStream(b);
jtulach@144
   287
                            filein.close();
jtulach@144
   288
                            return inbyte;
jtulach@144
   289
                        }
jtulach@144
   290
                    } else {
jtulach@144
   291
                        //not a jar file.
jtulach@144
   292
                        String filename = path+"/"+ classname;
jtulach@144
   293
                        File file = new File(filename);
jtulach@144
   294
                        if(file.isFile()){
jtulach@144
   295
                            return (new FileInputStream(file));
jtulach@144
   296
                        }
jtulach@144
   297
                    }
jtulach@144
   298
                }catch(FileNotFoundException fnexce){
jtulach@144
   299
                    fnexce.printStackTrace();
jtulach@144
   300
                    error("cant read file");
jtulach@144
   301
                    error("fatal exception");
jtulach@144
   302
                }catch(IOException ioexc){
jtulach@144
   303
                    ioexc.printStackTrace();
jtulach@144
   304
                    error("fatal exception");
jtulach@144
   305
                }
jtulach@144
   306
            }
jtulach@144
   307
        }
jtulach@144
   308
jtulach@144
   309
        return null;
jtulach@144
   310
    }
jtulach@144
   311
jtulach@144
   312
jtulach@144
   313
    /**
jtulach@144
   314
     * Returns file input stream for classfile to disassemble.
jtulach@144
   315
     */
jtulach@144
   316
    public InputStream resolveclasspathhelper(String path, String classname){
jtulach@144
   317
        File fileobj = new File(path);
jtulach@144
   318
        try{
jtulach@144
   319
            if(fileobj.isDirectory()){
jtulach@144
   320
                //is a directory.
jtulach@144
   321
                String filename = path+"/"+ classname;
jtulach@144
   322
                File file = new File(filename);
jtulach@144
   323
                if(file.isFile()){
jtulach@144
   324
                    return (new FileInputStream(file));
jtulach@144
   325
                }
jtulach@144
   326
jtulach@144
   327
            }else if(fileobj.isFile()){
jtulach@144
   328
                if(fileobj.toString().endsWith(".jar")){
jtulach@144
   329
                    //is a jar file.
jtulach@144
   330
                    JarFile jfile = new JarFile(fileobj);
jtulach@144
   331
                    if((jfile.getEntry(classname)) != null){
jtulach@144
   332
                        InputStream filein = jfile.getInputStream(jfile.getEntry(classname));
jtulach@144
   333
                        int bytearraysize = filein.available();
jtulach@144
   334
                        byte []b =  new byte[bytearraysize];
jtulach@144
   335
                        int totalread = 0;
jtulach@144
   336
                        while(totalread < bytearraysize){
jtulach@144
   337
                                totalread += filein.read(b, totalread, bytearraysize-totalread);
jtulach@144
   338
                        }
jtulach@144
   339
                        InputStream inbyte = new ByteArrayInputStream(b);
jtulach@144
   340
                        filein.close();
jtulach@144
   341
                         return inbyte;
jtulach@144
   342
                    }
jtulach@144
   343
                }
jtulach@144
   344
            }
jtulach@144
   345
        }catch(FileNotFoundException fnexce){
jtulach@144
   346
            fnexce.printStackTrace();
jtulach@144
   347
            error("cant read file");
jtulach@144
   348
            error("fatal exception");
jtulach@144
   349
        }catch(IOException ioexce){
jtulach@144
   350
            ioexce.printStackTrace();
jtulach@144
   351
            error("fatal exception");
jtulach@144
   352
        }
jtulach@144
   353
        return null;
jtulach@144
   354
    }
jtulach@144
   355
}