114 lines · 4.1 KB · Java
RawDownload
 package com.sun.tracing; import java.util.HashSet;import java.io.PrintStream;import java.lang.reflect.Field;import java.security.AccessController;import java.security.PrivilegedActionException;import java.security.PrivilegedExceptionAction;import sun.security.action.GetPropertyAction; import sun.tracing.NullProviderFactory;import sun.tracing.PrintStreamProviderFactory;import sun.tracing.MultiplexProviderFactory;import sun.tracing.dtrace.DTraceProviderFactory; /** * {@code ProviderFactory} is a factory class used to create instances of * providers. * * To enable tracing in an application, this class must be used to create * instances of the provider interfaces defined by users. * The system-defined factory is obtained by using the * {@code getDefaultFactory()} static method.  The resulting instance can be * used to create any number of providers. * * @since 1.7 */public abstract class ProviderFactory {     protected ProviderFactory() {}     /**     * Creates an implementation of a Provider interface.     *     * @param cls the provider interface to be defined.     * @return an implementation of {@code cls}, whose methods, when called,     * will trigger tracepoints in the application.     * @throws NullPointerException if cls is null     * @throws IllegalArgumentException if the class definition contains     * non-void methods     */    public abstract <T extends Provider> T createProvider(Class<T> cls);     /**     * Returns an implementation of a {@code ProviderFactory} which     * creates instances of Providers.     *     * The created Provider instances will be linked to all appropriate     * and enabled system-defined tracing mechanisms in the JDK.     *     * @return a {@code ProviderFactory} that is used to create Providers.     */    public static ProviderFactory getDefaultFactory() {        HashSet<ProviderFactory> factories = new HashSet<ProviderFactory>();         // Try to instantiate a DTraceProviderFactory        String prop = AccessController.doPrivileged(            new GetPropertyAction("com.sun.tracing.dtrace"));         if ( (prop == null || !prop.equals("disable")) &&             DTraceProviderFactory.isSupported() ) {            factories.add(new DTraceProviderFactory());        }         // Try to instantiate an output stream factory        prop = AccessController.doPrivileged(            new GetPropertyAction("sun.tracing.stream"));        if (prop != null) {            for (String spec : prop.split(",")) {                PrintStream ps = getPrintStreamFromSpec(spec);                if (ps != null) {                    factories.add(new PrintStreamProviderFactory(ps));                }            }        }         // See how many factories we instantiated, and return an appropriate        // factory that encapsulates that.        if (factories.size() == 0) {            return new NullProviderFactory();        } else if (factories.size() == 1) {            return factories.toArray(new ProviderFactory[1])[0];        } else {            return new MultiplexProviderFactory(factories);        }    }     private static PrintStream getPrintStreamFromSpec(final String spec) {        try {            // spec is in the form of <class>.<field>, where <class> is            // a fully specified class name, and <field> is a static member            // in that class.  The <field> must be a 'PrintStream' or subtype            // in order to be used.            final int fieldpos = spec.lastIndexOf('.');            final Class<?> cls = Class.forName(spec.substring(0, fieldpos));             Field f = AccessController.doPrivileged(new PrivilegedExceptionAction<Field>() {                public Field run() throws NoSuchFieldException {                    return cls.getField(spec.substring(fieldpos + 1));                }            });             return (PrintStream)f.get(null);        } catch (ClassNotFoundException e) {            throw new AssertionError(e);        } catch (IllegalAccessException e) {            throw new AssertionError(e);        } catch (PrivilegedActionException e) {            throw new AssertionError(e);        }    }}