jdk/src/share/classes/sun/net/ftp/FtpClientProvider.java
author chegar
Fri, 16 Sep 2011 12:09:04 -0700
changeset 10596 39b3a979e600
parent 5506 202f599c92aa
child 11124 5fdabdc21259
permissions -rw-r--r--
7090158: Networking Libraries don't build with javac -Werror Summary: Minor changes to networking java files to remove warnings Reviewed-by: chegar, weijun, hawtin Contributed-by: kurchi.subhra.hazra@oracle.com, sasha_bu@hotmail.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4155
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
     1
/*
10596
39b3a979e600 7090158: Networking Libraries don't build with javac -Werror
chegar
parents: 5506
diff changeset
     2
 * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved.
4155
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
     4
 *
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4155
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
4155
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4155
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
4155
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    10
 *
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    15
 * accompanied this code).
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    16
 *
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4155
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4155
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 4155
diff changeset
    23
 * questions.
4155
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    24
 */
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    25
package sun.net.ftp;
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    26
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    27
import java.security.AccessController;
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    28
import java.security.PrivilegedAction;
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    29
import java.util.ServiceConfigurationError;
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    30
//import sun.misc.Service;
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    31
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    32
/**
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    33
 * Service provider class for FtpClient.
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    34
 * Sub-classes of FtpClientProvider provide an implementation of {@link FtpClient}
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    35
 * and associated classes. Applications do not normally use this class directly.
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    36
 * See {@link #provider() } for how providers are found and loaded.
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    37
 *
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    38
 * @since 1.7
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    39
 */
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    40
public abstract class FtpClientProvider {
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    41
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    42
    /**
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    43
     * Creates a FtpClient from this provider.
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    44
     *
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    45
     * @return The created {@link FtpClient}.
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    46
     */
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    47
    public abstract FtpClient createFtpClient();
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    48
    private static final Object lock = new Object();
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    49
    private static FtpClientProvider provider = null;
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    50
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    51
    /**
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    52
     * Initializes a new instance of this class.
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    53
     *
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    54
     * @throws SecurityException if a security manager is installed and it denies
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    55
     *         {@link RuntimePermission}<tt>("ftpClientProvider")</tt>
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    56
     */
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    57
    protected FtpClientProvider() {
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    58
        SecurityManager sm = System.getSecurityManager();
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    59
        if (sm != null) {
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    60
            sm.checkPermission(new RuntimePermission("ftpClientProvider"));
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    61
        }
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    62
    }
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    63
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    64
    private static boolean loadProviderFromProperty() {
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    65
        String cm = System.getProperty("sun.net.ftpClientProvider");
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    66
        if (cm == null) {
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    67
            return false;
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    68
        }
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    69
        try {
10596
39b3a979e600 7090158: Networking Libraries don't build with javac -Werror
chegar
parents: 5506
diff changeset
    70
            Class<?> c = Class.forName(cm, true, null);
4155
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    71
            provider = (FtpClientProvider) c.newInstance();
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    72
            return true;
10596
39b3a979e600 7090158: Networking Libraries don't build with javac -Werror
chegar
parents: 5506
diff changeset
    73
        } catch (ClassNotFoundException |
39b3a979e600 7090158: Networking Libraries don't build with javac -Werror
chegar
parents: 5506
diff changeset
    74
                 IllegalAccessException |
39b3a979e600 7090158: Networking Libraries don't build with javac -Werror
chegar
parents: 5506
diff changeset
    75
                 InstantiationException |
39b3a979e600 7090158: Networking Libraries don't build with javac -Werror
chegar
parents: 5506
diff changeset
    76
                 SecurityException x) {
4155
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    77
            throw new ServiceConfigurationError(x.toString());
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    78
        }
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    79
    }
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    80
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    81
    private static boolean loadProviderAsService() {
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    82
        //        Iterator i = Service.providers(FtpClientProvider.class,
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    83
        //                ClassLoader.getSystemClassLoader());
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    84
        //        while (i.hasNext()) {
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    85
        //            try {
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    86
        //                provider = (FtpClientProvider) i.next();
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    87
        //                return true;
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    88
        //            } catch (ServiceConfigurationError sce) {
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    89
        //                if (sce.getCause() instanceof SecurityException) {
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    90
        //                    // Ignore, try next provider, if any
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    91
        //                    continue;
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    92
        //                }
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    93
        //                throw sce;
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    94
        //            }
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    95
        //        }
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    96
        return false;
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    97
    }
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    98
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
    99
    /**
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   100
     * Returns the system wide default FtpClientProvider for this invocation of
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   101
     * the Java virtual machine.
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   102
     *
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   103
     * <p> The first invocation of this method locates the default provider
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   104
     * object as follows: </p>
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   105
     *
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   106
     * <ol>
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   107
     *
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   108
     *   <li><p> If the system property
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   109
     *   <tt>java.net.FtpClientProvider</tt> is defined then it is
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   110
     *   taken to be the fully-qualified name of a concrete provider class.
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   111
     *   The class is loaded and instantiated; if this process fails then an
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   112
     *   unspecified unchecked error or exception is thrown.  </p></li>
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   113
     *
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   114
     *   <li><p> If a provider class has been installed in a jar file that is
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   115
     *   visible to the system class loader, and that jar file contains a
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   116
     *   provider-configuration file named
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   117
     *   <tt>java.net.FtpClientProvider</tt> in the resource
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   118
     *   directory <tt>META-INF/services</tt>, then the first class name
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   119
     *   specified in that file is taken.  The class is loaded and
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   120
     *   instantiated; if this process fails then an unspecified unchecked error or exception is
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   121
     *   thrown.  </p></li>
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   122
     *
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   123
     *   <li><p> Finally, if no provider has been specified by any of the above
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   124
     *   means then the system-default provider class is instantiated and the
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   125
     *   result is returned.  </p></li>
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   126
     *
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   127
     * </ol>
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   128
     *
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   129
     * <p> Subsequent invocations of this method return the provider that was
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   130
     * returned by the first invocation.  </p>
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   131
     *
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   132
     * @return  The system-wide default FtpClientProvider
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   133
     */
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   134
    public static FtpClientProvider provider() {
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   135
        synchronized (lock) {
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   136
            if (provider != null) {
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   137
                return provider;
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   138
            }
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   139
            return (FtpClientProvider) AccessController.doPrivileged(
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   140
                    new PrivilegedAction<Object>() {
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   141
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   142
                        public Object run() {
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   143
                            if (loadProviderFromProperty()) {
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   144
                                return provider;
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   145
                            }
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   146
                            if (loadProviderAsService()) {
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   147
                                return provider;
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   148
                            }
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   149
                            provider = new sun.net.ftp.impl.DefaultFtpClientProvider();
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   150
                            return provider;
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   151
                        }
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   152
                    });
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   153
        }
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   154
    }
460e37d40f12 6893702: Overhaul of Ftp Client internal code
jccollet
parents:
diff changeset
   155
}