1 /*
   2  * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 package utils;
  24 
  25 import java.io.File;
  26 import java.io.IOException;
  27 import java.io.InputStream;
  28 import java.io.FileInputStream;
  29 
  30 public class ClassLoadUtils {
  31 
  32     private ClassLoadUtils() {
  33     }
  34 
  35     /**
  36      * Get filename of class file from classpath for given class name.
  37      *
  38      * @param className class name
  39      * @return filename or null if not found
  40      */
  41     public static String getClassPath(String className) {
  42         String fileName = className.replace(".", File.separator) + ".class";
  43         String[] classPath = System.getProperty("java.class.path").split(File.pathSeparator);
  44         File target = null;
  45         int i;
  46         for (i = 0; i < classPath.length; ++i) {
  47             target = new File(classPath[i] + File.separator + fileName);
  48             System.out.println("Try: " + target);
  49             if (target.exists()) {
  50                 break;
  51             }
  52         }
  53         if (i != classPath.length) {
  54             return classPath[i];
  55         }
  56         return null;
  57     }
  58 
  59     /**
  60      * Get filename of class file from classpath for given class name.
  61      *
  62      * @param className class name
  63      * @return filename or null if not found
  64      */
  65     public static String getClassPathFileName(String className) {
  66         String fileName = className.replace(".", File.separator) + ".class";
  67         String[] classPath = System.getProperty("java.class.path").split(File.pathSeparator);
  68         File target = null;
  69         int i;
  70         for (i = 0; i < classPath.length; ++i) {
  71             target = new File(classPath[i] + File.separator + fileName);
  72             System.out.println("Try: " + target);
  73             if (target.exists()) {
  74                 break;
  75             }
  76         }
  77         if (i != classPath.length) {
  78             try {
  79                 return target.getCanonicalPath();
  80             } catch (IOException e) {
  81                 return null;
  82             }
  83         }
  84         return null;
  85     }
  86 
  87     public static String getRedefineClassFileName(String dir, String className) {
  88         String fileName = getClassPathFileName(className);
  89         if (fileName == null) {
  90             return null;
  91         }
  92         if (fileName.contains("classes")) {
  93             return fileName.replace("classes", dir);
  94         } else {
  95             String classPath = getClassPath(className);
  96             if (classPath != null) {
  97                 return classPath + File.separator + "newclass" + File.separator + className.replace(".", File.separator) + ".class";
  98             } else {
  99                 return null;
 100             }
 101         }
 102     }
 103 
 104     /**
 105      * Get filename of class file which is to be redefined.
 106      */
 107     public static String getRedefineClassFileName(String className) {
 108         return getRedefineClassFileName("newclass", className);
 109     }
 110 
 111     /**
 112      * Read whole file.
 113      *
 114      * @param file file
 115      * @return contents of file as byte array
 116      */
 117     public static byte[] readFile(File file) throws IOException {
 118         InputStream in = new FileInputStream(file);
 119         long countl = file.length();
 120         if (countl > Integer.MAX_VALUE) {
 121             throw new IOException("File is too huge");
 122         }
 123         int count = (int) countl;
 124         byte[] buffer = new byte[count];
 125         int n = 0;
 126         try {
 127             while (n < count) {
 128                 int k = in.read(buffer, n, count - n);
 129                 if (k < 0) {
 130                     throw new IOException("Unexpected EOF");
 131                 }
 132                 n += k;
 133             }
 134         } finally {
 135             in.close();
 136         }
 137         return buffer;
 138     }
 139 
 140     /**
 141      * Read whole file.
 142      *
 143      * @param name file name
 144      * @return contents of file as byte array
 145      */
 146     public static byte[] readFile(String name) throws IOException {
 147         return readFile(new File(name));
 148     }
 149 }