author | kamg |
Thu, 08 May 2008 09:16:03 -0400 | |
changeset 491 | a394684ccfe6 |
parent 406 | bde3a21bcab0 |
child 4323 | da93d0c0f2f2 |
permissions | -rw-r--r-- |
406
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
1 |
/* |
491
a394684ccfe6
6697875: Copyright headers need to be upgraded with GPL derivative
kamg
parents:
406
diff
changeset
|
2 |
* Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. |
a394684ccfe6
6697875: Copyright headers need to be upgraded with GPL derivative
kamg
parents:
406
diff
changeset
|
3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
a394684ccfe6
6697875: Copyright headers need to be upgraded with GPL derivative
kamg
parents:
406
diff
changeset
|
4 |
* |
a394684ccfe6
6697875: Copyright headers need to be upgraded with GPL derivative
kamg
parents:
406
diff
changeset
|
5 |
* This code is free software; you can redistribute it and/or modify it |
a394684ccfe6
6697875: Copyright headers need to be upgraded with GPL derivative
kamg
parents:
406
diff
changeset
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
a394684ccfe6
6697875: Copyright headers need to be upgraded with GPL derivative
kamg
parents:
406
diff
changeset
|
7 |
* published by the Free Software Foundation. Sun designates this |
a394684ccfe6
6697875: Copyright headers need to be upgraded with GPL derivative
kamg
parents:
406
diff
changeset
|
8 |
* particular file as subject to the "Classpath" exception as provided |
a394684ccfe6
6697875: Copyright headers need to be upgraded with GPL derivative
kamg
parents:
406
diff
changeset
|
9 |
* by Sun in the LICENSE file that accompanied this code. |
a394684ccfe6
6697875: Copyright headers need to be upgraded with GPL derivative
kamg
parents:
406
diff
changeset
|
10 |
* |
a394684ccfe6
6697875: Copyright headers need to be upgraded with GPL derivative
kamg
parents:
406
diff
changeset
|
11 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
a394684ccfe6
6697875: Copyright headers need to be upgraded with GPL derivative
kamg
parents:
406
diff
changeset
|
12 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
a394684ccfe6
6697875: Copyright headers need to be upgraded with GPL derivative
kamg
parents:
406
diff
changeset
|
13 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
a394684ccfe6
6697875: Copyright headers need to be upgraded with GPL derivative
kamg
parents:
406
diff
changeset
|
14 |
* version 2 for more details (a copy is included in the LICENSE file that |
a394684ccfe6
6697875: Copyright headers need to be upgraded with GPL derivative
kamg
parents:
406
diff
changeset
|
15 |
* accompanied this code). |
a394684ccfe6
6697875: Copyright headers need to be upgraded with GPL derivative
kamg
parents:
406
diff
changeset
|
16 |
* |
a394684ccfe6
6697875: Copyright headers need to be upgraded with GPL derivative
kamg
parents:
406
diff
changeset
|
17 |
* You should have received a copy of the GNU General Public License version |
a394684ccfe6
6697875: Copyright headers need to be upgraded with GPL derivative
kamg
parents:
406
diff
changeset
|
18 |
* 2 along with this work; if not, write to the Free Software Foundation, |
a394684ccfe6
6697875: Copyright headers need to be upgraded with GPL derivative
kamg
parents:
406
diff
changeset
|
19 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
a394684ccfe6
6697875: Copyright headers need to be upgraded with GPL derivative
kamg
parents:
406
diff
changeset
|
20 |
* |
a394684ccfe6
6697875: Copyright headers need to be upgraded with GPL derivative
kamg
parents:
406
diff
changeset
|
21 |
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, |
a394684ccfe6
6697875: Copyright headers need to be upgraded with GPL derivative
kamg
parents:
406
diff
changeset
|
22 |
* CA 95054 USA or visit www.sun.com if you need additional information or |
a394684ccfe6
6697875: Copyright headers need to be upgraded with GPL derivative
kamg
parents:
406
diff
changeset
|
23 |
* have any questions. |
406
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
24 |
*/ |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
25 |
|
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
26 |
package sun.tracing; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
27 |
|
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
28 |
import java.lang.reflect.InvocationHandler; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
29 |
import java.lang.reflect.Method; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
30 |
import java.lang.reflect.Proxy; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
31 |
import java.lang.reflect.InvocationTargetException; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
32 |
import java.lang.reflect.AnnotatedElement; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
33 |
import java.lang.annotation.Annotation; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
34 |
import java.util.HashMap; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
35 |
|
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
36 |
import com.sun.tracing.Provider; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
37 |
import com.sun.tracing.Probe; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
38 |
import com.sun.tracing.ProviderName; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
39 |
|
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
40 |
/** |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
41 |
* Provides a common code for implementation of {@code Provider} classes. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
42 |
* |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
43 |
* Each tracing subsystem needs to provide three classes, a factory |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
44 |
* (derived from {@code ProviderFactory}, a provider (a subclass of |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
45 |
* {@code Provider}, and a probe type (subclass of {@code ProbeSkeleton}). |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
46 |
* |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
47 |
* The factory object takes a user-defined interface and provides an |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
48 |
* implementation of it whose method calls will trigger probes in the |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
49 |
* tracing framework. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
50 |
* |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
51 |
* The framework's provider class, and its instances, are not seen by the |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
52 |
* user at all -- they usually sit in the background and receive and dispatch |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
53 |
* the calls to the user's provider interface. The {@code ProviderSkeleton} |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
54 |
* class provides almost all of the implementation needed by a framework |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
55 |
* provider. Framework providers must only provide a constructor and |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
56 |
* disposal method, and implement the {@code createProbe} method to create |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
57 |
* an appropriate {@code ProbeSkeleton} subclass. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
58 |
* |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
59 |
* The framework's probe class provides the implementation of the two |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
60 |
* probe methods, {@code isEnabled()} and {@code uncheckedTrigger()}. Both are |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
61 |
* framework-dependent implementations. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
62 |
* |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
63 |
* @since 1.7 |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
64 |
*/ |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
65 |
|
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
66 |
public abstract class ProviderSkeleton implements InvocationHandler, Provider { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
67 |
|
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
68 |
protected boolean active; // set to false after dispose() is called |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
69 |
protected Class<? extends Provider> providerType; // user's interface |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
70 |
protected HashMap<Method, ProbeSkeleton> probes; // methods to probes |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
71 |
|
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
72 |
|
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
73 |
/** |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
74 |
* Creates a framework-specific probe subtype. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
75 |
* |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
76 |
* This method is implemented by the framework's provider and returns |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
77 |
* framework-specific probes for a method. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
78 |
* |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
79 |
* @param method A method in the user's interface |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
80 |
* @return a subclass of ProbeSkeleton for the particular framework. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
81 |
*/ |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
82 |
protected abstract ProbeSkeleton createProbe(Method method); |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
83 |
|
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
84 |
/** |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
85 |
* Initializes the provider. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
86 |
* |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
87 |
* @param type the user's interface |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
88 |
*/ |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
89 |
protected ProviderSkeleton(Class<? extends Provider> type) { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
90 |
this.active = false; // in case of some error during initialization |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
91 |
this.providerType = type; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
92 |
this.probes = new HashMap<Method,ProbeSkeleton>(); |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
93 |
} |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
94 |
|
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
95 |
/** |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
96 |
* Post-constructor initialization routine. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
97 |
* |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
98 |
* Subclass instances must be initialized before they can create probes. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
99 |
* It is up to the factory implementations to call this after construction. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
100 |
*/ |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
101 |
public void init() { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
102 |
for (Method m : providerType.getDeclaredMethods()) { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
103 |
if ( m.getReturnType() != Void.TYPE ) { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
104 |
throw new IllegalArgumentException( |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
105 |
"Return value of method is not void"); |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
106 |
} else { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
107 |
probes.put(m, createProbe(m)); |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
108 |
} |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
109 |
} |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
110 |
this.active = true; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
111 |
} |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
112 |
|
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
113 |
/** |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
114 |
* Magic routine which creates an implementation of the user's interface. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
115 |
* |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
116 |
* This method creates the instance of the user's interface which is |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
117 |
* passed back to the user. Every call upon that interface will be |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
118 |
* redirected to the {@code invoke()} method of this class (until |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
119 |
* overridden by the VM). |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
120 |
* |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
121 |
* @return an implementation of the user's interface |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
122 |
*/ |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
123 |
@SuppressWarnings("unchecked") |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
124 |
public <T extends Provider> T newProxyInstance() { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
125 |
return (T)Proxy.newProxyInstance(providerType.getClassLoader(), |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
126 |
new Class<?>[] { providerType }, this); |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
127 |
} |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
128 |
|
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
129 |
/** |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
130 |
* Triggers a framework probe when a user interface method is called. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
131 |
* |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
132 |
* This method dispatches a user interface method call to the appropriate |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
133 |
* probe associated with this framework. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
134 |
* |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
135 |
* If the invoked method is not a user-defined member of the interface, |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
136 |
* then it is a member of {@code Provider} or {@code Object} and we |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
137 |
* invoke the method directly. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
138 |
* |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
139 |
* @param proxy the instance whose method was invoked |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
140 |
* @param method the method that was called |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
141 |
* @param args the arguments passed in the call. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
142 |
* @return always null, if the method is a user-defined probe |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
143 |
*/ |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
144 |
public Object invoke(Object proxy, Method method, Object[] args) { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
145 |
if (method.getDeclaringClass() != providerType) { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
146 |
try { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
147 |
return method.invoke(this, args); |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
148 |
} catch (IllegalAccessException e) { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
149 |
assert false; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
150 |
} catch (InvocationTargetException e) { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
151 |
assert false; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
152 |
} |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
153 |
} else if (active) { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
154 |
ProbeSkeleton p = probes.get(method); |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
155 |
if (p != null) { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
156 |
// Skips argument check -- already done by javac |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
157 |
p.uncheckedTrigger(args); |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
158 |
} |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
159 |
} |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
160 |
return null; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
161 |
} |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
162 |
|
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
163 |
/** |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
164 |
* Direct accessor for {@code Probe} objects. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
165 |
* |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
166 |
* @param m the method corresponding to a probe |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
167 |
* @return the method associated probe object, or null |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
168 |
*/ |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
169 |
public Probe getProbe(Method m) { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
170 |
return active ? probes.get(m) : null; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
171 |
} |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
172 |
|
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
173 |
/** |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
174 |
* Default provider disposal method. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
175 |
* |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
176 |
* This is overridden in subclasses as needed. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
177 |
*/ |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
178 |
public void dispose() { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
179 |
active = false; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
180 |
probes.clear(); |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
181 |
} |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
182 |
|
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
183 |
/** |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
184 |
* Gets the user-specified provider name for the user's interface. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
185 |
* |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
186 |
* If the user's interface has a {@ProviderName} annotation, that value |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
187 |
* is used. Otherwise we use the simple name of the user interface's class. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
188 |
* @return the provider name |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
189 |
*/ |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
190 |
protected String getProviderName() { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
191 |
return getAnnotationString( |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
192 |
providerType, ProviderName.class, providerType.getSimpleName()); |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
193 |
} |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
194 |
|
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
195 |
/** |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
196 |
* Utility method for getting a string value from an annotation. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
197 |
* |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
198 |
* Used for getting a string value from an annotation with a 'value' method. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
199 |
* |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
200 |
* @param element the element that was annotated, either a class or method |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
201 |
* @param annotation the class of the annotation we're interested in |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
202 |
* @param defaultValue the value to return if the annotation doesn't |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
203 |
* exist, doesn't have a "value", or the value is empty. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
204 |
*/ |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
205 |
protected static String getAnnotationString( |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
206 |
AnnotatedElement element, Class<? extends Annotation> annotation, |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
207 |
String defaultValue) { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
208 |
String ret = (String)getAnnotationValue( |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
209 |
element, annotation, "value", defaultValue); |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
210 |
return ret.isEmpty() ? defaultValue : ret; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
211 |
} |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
212 |
|
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
213 |
/** |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
214 |
* Utility method for calling an arbitrary method in an annotation. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
215 |
* |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
216 |
* @param element the element that was annotated, either a class or method |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
217 |
* @param annotation the class of the annotation we're interested in |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
218 |
* @param methodName the name of the method in the annotation we wish |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
219 |
* to call. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
220 |
* @param defaultValue the value to return if the annotation doesn't |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
221 |
* exist, or we couldn't invoke the method for some reason. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
222 |
* @return the result of calling the annotation method, or the default. |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
223 |
*/ |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
224 |
protected static Object getAnnotationValue( |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
225 |
AnnotatedElement element, Class<? extends Annotation> annotation, |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
226 |
String methodName, Object defaultValue) { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
227 |
Object ret = defaultValue; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
228 |
try { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
229 |
Method m = annotation.getMethod(methodName); |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
230 |
Annotation a = element.getAnnotation(annotation); |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
231 |
ret = m.invoke(a); |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
232 |
} catch (NoSuchMethodException e) { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
233 |
assert false; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
234 |
} catch (IllegalAccessException e) { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
235 |
assert false; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
236 |
} catch (InvocationTargetException e) { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
237 |
assert false; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
238 |
} catch (NullPointerException e) { |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
239 |
assert false; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
240 |
} |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
241 |
return ret; |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
242 |
} |
bde3a21bcab0
6690122: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents:
diff
changeset
|
243 |
} |