1f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved.
2f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
3f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * This program and the accompanying materials are made available under
4f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * the terms of the Common Public License v1.0 which accompanies this distribution,
5f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * and is available at http://www.eclipse.org/legal/cpl-v10.html
6f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
7f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * $Id: IClassLoadHook.java,v 1.1.1.1 2004/05/09 16:57:44 vlad_r Exp $
8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpackage com.vladium.emma.rt;
10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.IOException;
12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.ByteArrayOStream;
14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------
16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/**
17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author Vlad Roubtsov, 2003
18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpublic
20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectinterface IClassLoadHook
21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{
22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // public: ................................................................
23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//    /**
25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//     * The hook returns 'true' or 'false' based on 'className' only. If it
26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//     * returns false, the current loader will load the class bytes itself and
27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//     * pass them to ClassLoader.defineClass() unchanged. This is an optimization
28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//     * to let the JVM native code do the parsing of class definitions for classes
29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//     * that do not match coverage filters instead of doing this in bytecode.
30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//     */
31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//    boolean interested (String className);
32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // TODO: figure out a way to avoid all this excessive copying of byte arrays
34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /* TODO: finish
36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * The hook reads in the original class definition from 'in' and [possibly]
38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * instruments it, returning the modified class definion [which should
39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * correspond to the original class name]. Only class definitions with names
40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * that were successfully filtered via a previous (although not necessarily
41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * <em>immediately</em> so) call to {@link #interested} will be passed to
42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * this method.<P>
43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * It is possible that the hook will determine that it is not interested in
45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * intrumenting the pending class definition [or is unable to do so] only
46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * after reading some content from 'in'. An example would be when the class
47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * definition turns out to be for an interface and the hook does not process
48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * interfaces. Because 'in' can then be left in an uncertain state, the hook
49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * must follow these rules for the two possible outcomes:
50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * <ol>
51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *  <li> if the hook can successfully recover the unmodified class definion
52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * [perhaps because it cloned the original definition or never modified it]:
53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * it should write it into 'out' and return 'true';
54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *  <li> if the hook has lost the original class definion: it should return 'false'.
55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * Following that, the current loader will close() and discard 'in' and load
56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * the class from another, equivalent in content, data stream instance.
57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * </ol>
58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * In any case 'in' and 'out' remain owned [and will be close()d] by the caller.
60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * NOTE: the hook should only write to 'out' after reading the entire
62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * class definition in 'bytes' ('out' could be backed by the same array as
63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * 'bytes')
64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     *
65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * @param out [buffered by the caller]
66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    boolean processClassDef (String className,
68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                             byte [] bytes, int length,
69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                             ByteArrayOStream out)
70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        throws IOException;
71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of interface
73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------