alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Java example source code file (ProviderFactory.java)

This example Java source code file (ProviderFactory.java) is included in the alvinalexander.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Learn more about this Java project at its project page.

Java - Java tags/keywords

assertionerror, class, classnotfoundexception, dtraceproviderfactory, field, getpropertyaction, hashset, nosuchfieldexception, nullproviderfactory, printstream, printstreamproviderfactory, providerfactory, reflection, security, string, util

The ProviderFactory.java Java example source code


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 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();

        // 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>., where  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);
        }
    }
}

Other Java examples (source code examples)

Here is a short list of links related to this Java ProviderFactory.java source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.