langtools/src/share/classes/com/sun/tools/javac/util/ServiceLoader.java
author jjg
Tue, 07 May 2013 14:27:30 -0700
changeset 17551 03f330c02d97
child 22159 682da512ec17
permissions -rw-r--r--
8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar Reviewed-by: vromero, mcimadamore
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
17551
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
     1
/*
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
     2
 * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
     4
 *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    10
 *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    15
 * accompanied this code).
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    16
 *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    20
 *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    23
 * questions.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    24
 */
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    25
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    26
package com.sun.tools.javac.util;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    27
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    28
import java.io.BufferedReader;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    29
import java.io.IOException;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    30
import java.io.InputStream;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    31
import java.io.InputStreamReader;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    32
import java.net.URL;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    33
import java.net.URLConnection;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    34
import java.util.ArrayList;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    35
import java.util.Enumeration;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    36
import java.util.Iterator;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    37
import java.util.LinkedHashMap;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    38
import java.util.List;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    39
import java.util.Map;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    40
import java.util.NoSuchElementException;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    41
import java.util.Objects;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    42
import java.util.ServiceConfigurationError;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    43
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    44
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    45
/**
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    46
 * This is a temporary, modified copy of java.util.ServiceLoader, for use by
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    47
 * javac, to work around bug JDK-8004082.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    48
 *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    49
 * The bug describes problems in the interaction between ServiceLoader and
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    50
 * URLClassLoader, such that references to a jar file passed to URLClassLoader
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    51
 * may be retained after calling URLClassLoader.close(), preventing the jar
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    52
 * file from being deleted on Windows.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    53
 *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    54
 *  <p><b>This is NOT part of any supported API.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    55
 *  If you write code that depends on this, you do so at your own risk.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    56
 *  This code and its internal interfaces are subject to change or
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    57
 *  deletion without notice.</b>
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    58
 */
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    59
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    60
public final class ServiceLoader<S>
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    61
    implements Iterable<S>
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    62
{
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    63
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    64
    private static final String PREFIX = "META-INF/services/";
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    65
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    66
    // The class or interface representing the service being loaded
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    67
    private Class<S> service;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    68
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    69
    // The class loader used to locate, load, and instantiate providers
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    70
    private ClassLoader loader;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    71
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    72
    // Cached providers, in instantiation order
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    73
    private LinkedHashMap<String,S> providers = new LinkedHashMap<>();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    74
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    75
    // The current lazy-lookup iterator
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    76
    private LazyIterator lookupIterator;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    77
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    78
    /**
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    79
     * Clear this loader's provider cache so that all providers will be
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    80
     * reloaded.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    81
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    82
     * <p> After invoking this method, subsequent invocations of the {@link
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    83
     * #iterator() iterator} method will lazily look up and instantiate
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    84
     * providers from scratch, just as is done by a newly-created loader.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    85
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    86
     * <p> This method is intended for use in situations in which new providers
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    87
     * can be installed into a running Java virtual machine.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    88
     */
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    89
    public void reload() {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    90
        providers.clear();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    91
        lookupIterator = new LazyIterator(service, loader);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    92
    }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    93
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    94
    private ServiceLoader(Class<S> svc, ClassLoader cl) {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    95
        service = Objects.requireNonNull(svc, "Service interface cannot be null");
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    96
        loader = (cl == null) ? ClassLoader.getSystemClassLoader() : cl;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    97
        reload();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    98
    }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
    99
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   100
    private static void fail(Class<?> service, String msg, Throwable cause)
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   101
        throws ServiceConfigurationError
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   102
    {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   103
        throw new ServiceConfigurationError(service.getName() + ": " + msg,
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   104
                                            cause);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   105
    }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   106
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   107
    private static void fail(Class<?> service, String msg)
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   108
        throws ServiceConfigurationError
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   109
    {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   110
        throw new ServiceConfigurationError(service.getName() + ": " + msg);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   111
    }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   112
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   113
    private static void fail(Class<?> service, URL u, int line, String msg)
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   114
        throws ServiceConfigurationError
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   115
    {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   116
        fail(service, u + ":" + line + ": " + msg);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   117
    }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   118
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   119
    // Parse a single line from the given configuration file, adding the name
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   120
    // on the line to the names list.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   121
    //
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   122
    private int parseLine(Class<?> service, URL u, BufferedReader r, int lc,
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   123
                          List<String> names)
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   124
        throws IOException, ServiceConfigurationError
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   125
    {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   126
        String ln = r.readLine();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   127
        if (ln == null) {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   128
            return -1;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   129
        }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   130
        int ci = ln.indexOf('#');
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   131
        if (ci >= 0) ln = ln.substring(0, ci);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   132
        ln = ln.trim();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   133
        int n = ln.length();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   134
        if (n != 0) {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   135
            if ((ln.indexOf(' ') >= 0) || (ln.indexOf('\t') >= 0))
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   136
                fail(service, u, lc, "Illegal configuration-file syntax");
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   137
            int cp = ln.codePointAt(0);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   138
            if (!Character.isJavaIdentifierStart(cp))
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   139
                fail(service, u, lc, "Illegal provider-class name: " + ln);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   140
            for (int i = Character.charCount(cp); i < n; i += Character.charCount(cp)) {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   141
                cp = ln.codePointAt(i);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   142
                if (!Character.isJavaIdentifierPart(cp) && (cp != '.'))
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   143
                    fail(service, u, lc, "Illegal provider-class name: " + ln);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   144
            }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   145
            if (!providers.containsKey(ln) && !names.contains(ln))
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   146
                names.add(ln);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   147
        }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   148
        return lc + 1;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   149
    }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   150
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   151
    // Parse the content of the given URL as a provider-configuration file.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   152
    //
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   153
    // @param  service
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   154
    //         The service type for which providers are being sought;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   155
    //         used to construct error detail strings
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   156
    //
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   157
    // @param  u
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   158
    //         The URL naming the configuration file to be parsed
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   159
    //
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   160
    // @return A (possibly empty) iterator that will yield the provider-class
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   161
    //         names in the given configuration file that are not yet members
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   162
    //         of the returned set
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   163
    //
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   164
    // @throws ServiceConfigurationError
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   165
    //         If an I/O error occurs while reading from the given URL, or
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   166
    //         if a configuration-file format error is detected
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   167
    //
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   168
    private Iterator<String> parse(Class<?> service, URL u)
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   169
        throws ServiceConfigurationError
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   170
    {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   171
        InputStream in = null;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   172
        BufferedReader r = null;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   173
        ArrayList<String> names = new ArrayList<>();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   174
        try {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   175
            // The problem is that by default, streams opened with
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   176
            // u.openInputStream use a cached reference to a JarFile, which
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   177
            // is separate from the reference used by URLClassLoader, and
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   178
            // which is not closed by URLClassLoader.close().
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   179
            // The workaround is to disable caching for this specific jar file,
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   180
            // so that the reference to the jar file can be closed when the
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   181
            // file has been read.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   182
            // Original code:
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   183
            // in = u.openStream();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   184
            // Workaround ...
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   185
            URLConnection uc = u.openConnection();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   186
            uc.setUseCaches(false);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   187
            in = uc.getInputStream();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   188
            // ... end of workaround.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   189
            r = new BufferedReader(new InputStreamReader(in, "utf-8"));
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   190
            int lc = 1;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   191
            while ((lc = parseLine(service, u, r, lc, names)) >= 0);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   192
        } catch (IOException x) {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   193
            fail(service, "Error reading configuration file", x);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   194
        } finally {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   195
            try {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   196
                if (r != null) r.close();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   197
                if (in != null) in.close();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   198
            } catch (IOException y) {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   199
                fail(service, "Error closing configuration file", y);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   200
            }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   201
        }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   202
        return names.iterator();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   203
    }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   204
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   205
    // Private inner class implementing fully-lazy provider lookup
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   206
    //
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   207
    private class LazyIterator
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   208
        implements Iterator<S>
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   209
    {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   210
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   211
        Class<S> service;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   212
        ClassLoader loader;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   213
        Enumeration<URL> configs = null;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   214
        Iterator<String> pending = null;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   215
        String nextName = null;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   216
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   217
        private LazyIterator(Class<S> service, ClassLoader loader) {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   218
            this.service = service;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   219
            this.loader = loader;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   220
        }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   221
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   222
        public boolean hasNext() {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   223
            if (nextName != null) {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   224
                return true;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   225
            }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   226
            if (configs == null) {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   227
                try {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   228
                    String fullName = PREFIX + service.getName();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   229
                    if (loader == null)
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   230
                        configs = ClassLoader.getSystemResources(fullName);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   231
                    else
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   232
                        configs = loader.getResources(fullName);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   233
                } catch (IOException x) {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   234
                    fail(service, "Error locating configuration files", x);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   235
                }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   236
            }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   237
            while ((pending == null) || !pending.hasNext()) {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   238
                if (!configs.hasMoreElements()) {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   239
                    return false;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   240
                }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   241
                pending = parse(service, configs.nextElement());
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   242
            }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   243
            nextName = pending.next();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   244
            return true;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   245
        }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   246
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   247
        public S next() {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   248
            if (!hasNext()) {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   249
                throw new NoSuchElementException();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   250
            }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   251
            String cn = nextName;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   252
            nextName = null;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   253
            Class<?> c = null;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   254
            try {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   255
                c = Class.forName(cn, false, loader);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   256
            } catch (ClassNotFoundException x) {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   257
                fail(service,
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   258
                     "Provider " + cn + " not found");
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   259
            }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   260
            if (!service.isAssignableFrom(c)) {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   261
                fail(service,
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   262
                     "Provider " + cn  + " not a subtype");
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   263
            }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   264
            try {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   265
                S p = service.cast(c.newInstance());
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   266
                providers.put(cn, p);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   267
                return p;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   268
            } catch (Throwable x) {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   269
                fail(service,
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   270
                     "Provider " + cn + " could not be instantiated: " + x,
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   271
                     x);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   272
            }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   273
            throw new Error();          // This cannot happen
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   274
        }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   275
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   276
        public void remove() {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   277
            throw new UnsupportedOperationException();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   278
        }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   279
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   280
    }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   281
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   282
    /**
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   283
     * Lazily loads the available providers of this loader's service.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   284
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   285
     * <p> The iterator returned by this method first yields all of the
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   286
     * elements of the provider cache, in instantiation order.  It then lazily
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   287
     * loads and instantiates any remaining providers, adding each one to the
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   288
     * cache in turn.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   289
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   290
     * <p> To achieve laziness the actual work of parsing the available
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   291
     * provider-configuration files and instantiating providers must be done by
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   292
     * the iterator itself.  Its {@link java.util.Iterator#hasNext hasNext} and
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   293
     * {@link java.util.Iterator#next next} methods can therefore throw a
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   294
     * {@link ServiceConfigurationError} if a provider-configuration file
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   295
     * violates the specified format, or if it names a provider class that
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   296
     * cannot be found and instantiated, or if the result of instantiating the
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   297
     * class is not assignable to the service type, or if any other kind of
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   298
     * exception or error is thrown as the next provider is located and
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   299
     * instantiated.  To write robust code it is only necessary to catch {@link
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   300
     * ServiceConfigurationError} when using a service iterator.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   301
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   302
     * <p> If such an error is thrown then subsequent invocations of the
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   303
     * iterator will make a best effort to locate and instantiate the next
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   304
     * available provider, but in general such recovery cannot be guaranteed.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   305
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   306
     * <blockquote style="font-size: smaller; line-height: 1.2"><span
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   307
     * style="padding-right: 1em; font-weight: bold">Design Note</span>
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   308
     * Throwing an error in these cases may seem extreme.  The rationale for
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   309
     * this behavior is that a malformed provider-configuration file, like a
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   310
     * malformed class file, indicates a serious problem with the way the Java
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   311
     * virtual machine is configured or is being used.  As such it is
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   312
     * preferable to throw an error rather than try to recover or, even worse,
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   313
     * fail silently.</blockquote>
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   314
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   315
     * <p> The iterator returned by this method does not support removal.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   316
     * Invoking its {@link java.util.Iterator#remove() remove} method will
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   317
     * cause an {@link UnsupportedOperationException} to be thrown.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   318
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   319
     * @return  An iterator that lazily loads providers for this loader's
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   320
     *          service
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   321
     */
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   322
    public Iterator<S> iterator() {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   323
        return new Iterator<S>() {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   324
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   325
            Iterator<Map.Entry<String,S>> knownProviders
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   326
                = providers.entrySet().iterator();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   327
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   328
            public boolean hasNext() {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   329
                if (knownProviders.hasNext())
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   330
                    return true;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   331
                return lookupIterator.hasNext();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   332
            }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   333
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   334
            public S next() {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   335
                if (knownProviders.hasNext())
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   336
                    return knownProviders.next().getValue();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   337
                return lookupIterator.next();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   338
            }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   339
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   340
            public void remove() {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   341
                throw new UnsupportedOperationException();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   342
            }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   343
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   344
        };
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   345
    }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   346
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   347
    /**
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   348
     * Creates a new service loader for the given service type and class
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   349
     * loader.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   350
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   351
     * @param  service
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   352
     *         The interface or abstract class representing the service
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   353
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   354
     * @param  loader
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   355
     *         The class loader to be used to load provider-configuration files
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   356
     *         and provider classes, or <tt>null</tt> if the system class
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   357
     *         loader (or, failing that, the bootstrap class loader) is to be
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   358
     *         used
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   359
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   360
     * @return A new service loader
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   361
     */
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   362
    public static <S> ServiceLoader<S> load(Class<S> service,
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   363
                                            ClassLoader loader)
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   364
    {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   365
        return new ServiceLoader<>(service, loader);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   366
    }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   367
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   368
    /**
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   369
     * Creates a new service loader for the given service type, using the
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   370
     * current thread's {@linkplain java.lang.Thread#getContextClassLoader
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   371
     * context class loader}.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   372
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   373
     * <p> An invocation of this convenience method of the form
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   374
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   375
     * <blockquote><pre>
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   376
     * ServiceLoader.load(<i>service</i>)</pre></blockquote>
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   377
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   378
     * is equivalent to
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   379
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   380
     * <blockquote><pre>
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   381
     * ServiceLoader.load(<i>service</i>,
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   382
     *                    Thread.currentThread().getContextClassLoader())</pre></blockquote>
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   383
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   384
     * @param  service
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   385
     *         The interface or abstract class representing the service
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   386
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   387
     * @return A new service loader
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   388
     */
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   389
    public static <S> ServiceLoader<S> load(Class<S> service) {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   390
        ClassLoader cl = Thread.currentThread().getContextClassLoader();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   391
        return ServiceLoader.load(service, cl);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   392
    }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   393
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   394
    /**
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   395
     * Creates a new service loader for the given service type, using the
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   396
     * extension class loader.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   397
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   398
     * <p> This convenience method simply locates the extension class loader,
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   399
     * call it <tt><i>extClassLoader</i></tt>, and then returns
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   400
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   401
     * <blockquote><pre>
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   402
     * ServiceLoader.load(<i>service</i>, <i>extClassLoader</i>)</pre></blockquote>
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   403
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   404
     * <p> If the extension class loader cannot be found then the system class
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   405
     * loader is used; if there is no system class loader then the bootstrap
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   406
     * class loader is used.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   407
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   408
     * <p> This method is intended for use when only installed providers are
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   409
     * desired.  The resulting service will only find and load providers that
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   410
     * have been installed into the current Java virtual machine; providers on
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   411
     * the application's class path will be ignored.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   412
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   413
     * @param  service
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   414
     *         The interface or abstract class representing the service
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   415
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   416
     * @return A new service loader
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   417
     */
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   418
    public static <S> ServiceLoader<S> loadInstalled(Class<S> service) {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   419
        ClassLoader cl = ClassLoader.getSystemClassLoader();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   420
        ClassLoader prev = null;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   421
        while (cl != null) {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   422
            prev = cl;
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   423
            cl = cl.getParent();
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   424
        }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   425
        return ServiceLoader.load(service, prev);
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   426
    }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   427
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   428
    /**
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   429
     * Returns a string describing this service.
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   430
     *
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   431
     * @return  A descriptive string
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   432
     */
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   433
    public String toString() {
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   434
        return "java.util.ServiceLoader[" + service.getName() + "]";
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   435
    }
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   436
03f330c02d97 8004082: test/tools/javac/plugin/showtype/Test.java fails on windows: jtreg can't delete plugin.jar
jjg
parents:
diff changeset
   437
}