169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/*
269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Javassist, a Java-bytecode translator toolkit.
369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Copyright (C) 1999-2007 Shigeru Chiba. All Rights Reserved.
469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal *
569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * The contents of this file are subject to the Mozilla Public License Version
669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * 1.1 (the "License"); you may not use this file except in compliance with
769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * the License.  Alternatively, the contents of this file may be used under
869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * the terms of the GNU Lesser General Public License Version 2.1 or later.
969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal *
1069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * Software distributed under the License is distributed on an "AS IS" basis,
1169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
1269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * for the specific language governing rights and limitations under the
1369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * License.
1469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */
1569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
1669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpackage javassist;
1769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
1869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.io.*;
1969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.net.URL;
2069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalimport java.net.MalformedURLException;
2169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
2269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal/**
2369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * A <code>ByteArrayClassPath</code> contains bytes that is served as
2469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * a class file to a <code>ClassPool</code>.  It is useful to convert
2569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * a byte array to a <code>CtClass</code> object.
2669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal *
2769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * <p>For example, if you want to convert a byte array <code>b</code>
2869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * into a <code>CtClass</code> object representing the class with a name
2969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * <code>classname</code>, then do as following:
3069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal *
3169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * <ul><pre>
3269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * ClassPool cp = ClassPool.getDefault();
3369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * cp.insertClassPath(new ByteArrayClassPath(classname, b));
3469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * CtClass cc = cp.get(classname);
3569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * </pre></ul>
3669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal *
3769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * <p>The <code>ClassPool</code> object <code>cp</code> uses the created
3869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * <code>ByteArrayClassPath</code> object as the source of the class file.
3969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal *
4069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * <p>A <code>ByteArrayClassPath</code> must be instantiated for every
4169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * class.  It contains only a single class file.
4269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal *
4369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * @see javassist.ClassPath
4469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * @see ClassPool#insertClassPath(ClassPath)
4569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * @see ClassPool#appendClassPath(ClassPath)
4669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal * @see ClassPool#makeClass(InputStream)
4769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal */
4869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigalpublic class ByteArrayClassPath implements ClassPath {
4969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    protected String classname;
5069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    protected byte[] classfile;
5169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
5269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /*
5369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Creates a <code>ByteArrayClassPath</code> containing the given
5469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * bytes.
5569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     *
5669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param name              a fully qualified class name
5769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * @param classfile         the contents of a class file.
5869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
5969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public ByteArrayClassPath(String name, byte[] classfile) {
6069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        this.classname = name;
6169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        this.classfile = classfile;
6269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
6369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
6469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
6569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Closes this class path.
6669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
6769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public void close() {}
6869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
6969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public String toString() {
7069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return "byte[]:" + classname;
7169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
7269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
7369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
7469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Opens the class file.
7569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
7669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public InputStream openClassfile(String classname) {
7769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if(this.classname.equals(classname))
7869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return new ByteArrayInputStream(classfile);
7969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        else
8069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            return null;
8169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
8269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
8369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    /**
8469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     * Obtains the URL.
8569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal     */
8669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    public URL find(String classname) {
8769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        if(this.classname.equals(classname)) {
8869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            String cname = classname.replace('.', '/') + ".class";
8969e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            try {
9069e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                // return new File(cname).toURL();
9169e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal                return new URL("file:/ByteArrayClassPath/" + cname);
9269e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            }
9369e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal            catch (MalformedURLException e) {}
9469e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        }
9569e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal
9669e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal        return null;
9769e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal    }
9869e17611504376e4d4603925f8528dfc890fd2c6Luis Sigal}
99