jdk/src/jdk.runtime/share/classes/sun/tracing/ProviderSkeleton.java
changeset 29262 1698800c8606
parent 29261 ea6e20f98dfa
parent 29099 766801b4d95d
child 29263 66e30e926405
child 29505 682be03b8f41
--- a/jdk/src/jdk.runtime/share/classes/sun/tracing/ProviderSkeleton.java	Thu Feb 19 18:47:55 2015 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,273 +0,0 @@
-/*
- * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package sun.tracing;
-
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.AnnotatedElement;
-import java.lang.annotation.Annotation;
-import java.util.HashMap;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-
-import com.sun.tracing.Provider;
-import com.sun.tracing.Probe;
-import com.sun.tracing.ProviderName;
-
-/**
- * Provides a common code for implementation of {@code Provider} classes.
- *
- * Each tracing subsystem needs to provide three classes, a factory
- * (derived from {@code ProviderFactory}, a provider (a subclass of
- * {@code Provider}, and a probe type (subclass of {@code ProbeSkeleton}).
- *
- * The factory object takes a user-defined interface and provides an
- * implementation of it whose method calls will trigger probes in the
- * tracing framework.
- *
- * The framework's provider class, and its instances, are not seen by the
- * user at all -- they usually sit in the background and receive and dispatch
- * the calls to the user's provider interface.  The {@code ProviderSkeleton}
- * class provides almost all of the implementation needed by a framework
- * provider.  Framework providers must only provide a constructor and
- * disposal method, and implement the {@code createProbe} method to create
- * an appropriate {@code ProbeSkeleton} subclass.
- *
- * The framework's probe class provides the implementation of the two
- * probe methods, {@code isEnabled()} and {@code uncheckedTrigger()}.  Both are
- * framework-dependent implementations.
- *
- * @since 1.7
- */
-
-public abstract class ProviderSkeleton implements InvocationHandler, Provider {
-
-    protected boolean active; // set to false after dispose() is called
-    protected Class<? extends Provider> providerType; // user's interface
-    protected HashMap<Method, ProbeSkeleton> probes; // methods to probes
-
-
-    /**
-     * Creates a framework-specific probe subtype.
-     *
-     * This method is implemented by the framework's provider and returns
-     * framework-specific probes for a method.
-     *
-     * @param method A method in the user's interface
-     * @return a subclass of ProbeSkeleton for the particular framework.
-     */
-    protected abstract ProbeSkeleton createProbe(Method method);
-
-    /**
-     * Initializes the provider.
-     *
-     * @param type the user's interface
-     */
-    protected ProviderSkeleton(Class<? extends Provider> type) {
-        this.active = false; // in case of some error during initialization
-        this.providerType = type;
-        this.probes = new HashMap<Method,ProbeSkeleton>();
-    }
-
-    /**
-     * Post-constructor initialization routine.
-     *
-     * Subclass instances must be initialized before they can create probes.
-     * It is up to the factory implementations to call this after construction.
-     */
-    public void init() {
-        Method[] methods = AccessController.doPrivileged(new PrivilegedAction<Method[]>() {
-            public Method[] run() {
-                return providerType.getDeclaredMethods();
-            }
-        });
-
-        for (Method m : methods) {
-            if ( m.getReturnType() != Void.TYPE ) {
-                throw new IllegalArgumentException(
-                   "Return value of method is not void");
-            } else {
-                probes.put(m, createProbe(m));
-            }
-        }
-        this.active = true;
-    }
-
-    /**
-     * Magic routine which creates an implementation of the user's interface.
-     *
-     * This method creates the instance of the user's interface which is
-     * passed back to the user.  Every call upon that interface will be
-     * redirected to the {@code invoke()} method of this class (until
-     * overridden by the VM).
-     *
-     * @return an implementation of the user's interface
-     */
-    @SuppressWarnings("unchecked")
-    public <T extends Provider> T newProxyInstance() {
-        final InvocationHandler ih = this;
-        return AccessController.doPrivileged(new PrivilegedAction<T>() {
-            public T run() {
-               return (T)Proxy.newProxyInstance(providerType.getClassLoader(),
-                   new Class<?>[] { providerType }, ih);
-            }});
-    }
-
-    /**
-     * Triggers a framework probe when a user interface method is called.
-     *
-     * This method dispatches a user interface method call to the appropriate
-     * probe associated with this framework.
-     *
-     * If the invoked method is not a user-defined member of the interface,
-     * then it is a member of {@code Provider} or {@code Object} and we
-     * invoke the method directly.
-     *
-     * @param proxy the instance whose method was invoked
-     * @param method the method that was called
-     * @param args the arguments passed in the call.
-     * @return always null, if the method is a user-defined probe
-     */
-    public Object invoke(Object proxy, Method method, Object[] args) {
-        Class<?> declaringClass = method.getDeclaringClass();
-        // not a provider subtype's own method
-        if (declaringClass != providerType) {
-            try {
-                // delegate only to methods declared by
-                // com.sun.tracing.Provider or java.lang.Object
-                if (declaringClass == Provider.class ||
-                    declaringClass == Object.class) {
-                    return method.invoke(this, args);
-                } else {
-                    // assert false : "this should never happen"
-                    //    reaching here would indicate a breach
-                    //    in security in the higher layers
-                    throw new SecurityException();
-                }
-            } catch (IllegalAccessException e) {
-                assert false;
-            } catch (InvocationTargetException e) {
-                assert false;
-            }
-        } else {
-            triggerProbe(method, args);
-        }
-        return null;
-    }
-
-    /**
-     * Direct accessor for {@code Probe} objects.
-     *
-     * @param m the method corresponding to a probe
-     * @return the method associated probe object, or null
-     */
-    public Probe getProbe(Method m) {
-        return active ? probes.get(m) : null;
-    }
-
-    /**
-     * Default provider disposal method.
-     *
-     * This is overridden in subclasses as needed.
-     */
-    public void dispose() {
-        active = false;
-        probes.clear();
-    }
-
-    /**
-     * Gets the user-specified provider name for the user's interface.
-     *
-     * If the user's interface has a {@ProviderName} annotation, that value
-     * is used.  Otherwise we use the simple name of the user interface's class.
-     * @return the provider name
-     */
-    protected String getProviderName() {
-        return getAnnotationString(
-                providerType, ProviderName.class, providerType.getSimpleName());
-    }
-
-    /**
-     * Utility method for getting a string value from an annotation.
-     *
-     * Used for getting a string value from an annotation with a 'value' method.
-     *
-     * @param element the element that was annotated, either a class or method
-     * @param annotation the class of the annotation we're interested in
-     * @param defaultValue the value to return if the annotation doesn't
-     * exist, doesn't have a "value", or the value is empty.
-     */
-    protected static String getAnnotationString(
-            AnnotatedElement element, Class<? extends Annotation> annotation,
-            String defaultValue) {
-        String ret = (String)getAnnotationValue(
-                element, annotation, "value", defaultValue);
-        return ret.isEmpty() ? defaultValue : ret;
-    }
-
-    /**
-     * Utility method for calling an arbitrary method in an annotation.
-     *
-     * @param element the element that was annotated, either a class or method
-     * @param annotation the class of the annotation we're interested in
-     * @param methodName the name of the method in the annotation we wish
-     * to call.
-     * @param defaultValue the value to return if the annotation doesn't
-     * exist, or we couldn't invoke the method for some reason.
-     * @return the result of calling the annotation method, or the default.
-     */
-    protected static Object getAnnotationValue(
-            AnnotatedElement element, Class<? extends Annotation> annotation,
-            String methodName, Object defaultValue) {
-        Object ret = defaultValue;
-        try {
-            Method m = annotation.getMethod(methodName);
-            Annotation a = element.getAnnotation(annotation);
-            ret = m.invoke(a);
-        } catch (NoSuchMethodException e) {
-            assert false;
-        } catch (IllegalAccessException e) {
-            assert false;
-        } catch (InvocationTargetException e) {
-            assert false;
-        } catch (NullPointerException e) {
-            assert false;
-        }
-        return ret;
-    }
-
-    protected void triggerProbe(Method method, Object[] args) {
-        if (active) {
-            ProbeSkeleton p = probes.get(method);
-            if (p != null) {
-                // Skips argument check -- already done by javac
-                p.uncheckedTrigger(args);
-            }
-        }
-    }
-}