01: /*******************************************************************************************
02: * Copyright (c) Jonas Bonér, Alexandre Vasseur. All rights reserved. *
03: * http://backport175.codehaus.org *
04: * --------------------------------------------------------------------------------------- *
05: * The software in this package is published under the terms of Apache License Version 2.0 *
06: * a copy of which has been included with this distribution in the license.txt file. *
07: *******************************************************************************************/package com.tc.backport175.bytecode;
08:
09: import com.tc.backport175.bytecode.spi.BytecodeProvider;
10:
11: import java.io.InputStream;
12: import java.io.IOException;
13:
14: /**
15: * Default implementation of the {@link org.codehaus.backport175.reader.bytecode.spi.BytecodeProvider} interface which
16: * reads the bytecode from disk.
17: *
18: * @author <a href="mailto:jboner@codehaus.org">Jonas Bonér</a>
19: */
20: public class DefaultBytecodeProvider implements BytecodeProvider {
21:
22: /**
23: * Returns the bytecode for a specific class.
24: *
25: * @param className the fully qualified name of the class
26: * @param loader the class loader that has loaded the class
27: * @return the bytecode
28: */
29: public byte[] getBytecode(final String className,
30: final ClassLoader loader) throws Exception {
31: byte[] bytes;
32: InputStream in = null;
33: try {
34: if (loader != null) {
35: in = loader.getResourceAsStream(className.replace('.',
36: '/')
37: + ".class");
38: } else {
39: in = ClassLoader.getSystemClassLoader()
40: .getResourceAsStream(
41: className.replace('.', '/') + ".class");
42: }
43: if (in != null) {
44: bytes = toByteArray(in);
45: } else {
46: throw new Exception("could not read class ["
47: + className + "] as byte array");
48: }
49: } catch (IOException e) {
50: throw new Exception("could not read class [" + className
51: + "]as byte array due to: " + e.toString());
52: } finally {
53: try {
54: in.close();
55: } catch (Exception e) {
56: ;// we don't care
57: }
58: }
59: return bytes;
60: }
61:
62: /**
63: * Reads in the bytecode stream and returns a byte[] array.
64: *
65: * @param in
66: * @return
67: * @throws IOException
68: */
69: private byte[] toByteArray(final InputStream in) throws IOException {
70: byte[] bytes = new byte[in.available()];
71: int len = 0;
72: while (true) {
73: int n = in.read(bytes, len, bytes.length - len);
74: if (n == -1) {
75: if (len < bytes.length) {
76: byte[] c = new byte[len];
77: System.arraycopy(bytes, 0, c, 0, len);
78: bytes = c;
79: }
80: return bytes;
81: }
82: len += n;
83: if (len == bytes.length) {
84: byte[] c = new byte[bytes.length + 1000];
85: System.arraycopy(bytes, 0, c, 0, len);
86: bytes = c;
87: }
88: }
89: }
90: }
|