src/java.base/share/classes/java/security/Provider.java

Print this page
7191662: JCE providers should be located via ServiceLoader

*** 1,7 **** /* ! * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 119,128 **** --- 119,140 ---- private transient Set<Map.Entry<Object,Object>> entrySet = null; private transient int entrySetCallCount = 0; private transient boolean initialized; + private static Object newInstanceUtil(final Class<?> clazz, + final Class<?> ctrParamClz, final Object ctorParamObj) + throws Exception { + if (ctrParamClz == null) { + Constructor<?> con = clazz.getConstructor(); + return con.newInstance(); + } else { + Constructor<?> con = clazz.getConstructor(ctrParamClz); + return con.newInstance(ctorParamObj); + } + } + /** * Constructs a provider with the specified name, version number, * and information. * * @param name the provider name.
*** 138,147 **** --- 150,200 ---- putId(); initialized = true; } /** + * Apply the supplied configuration argument to this provider instance + * and return the configured provider. Note that if this provider cannot + * be configured in-place, a new provider will be created and returned. + * Therefore, callers should always use the returned provider. + * + * @implSpec + * The default implementation throws {@code UnsupportedOperationException}. + * Subclasses should override this method only if a configuration argument + * is supported. + * + * @param configArg the configuration information for configuring this + * provider. + * + * @throws UnsupportedOperationException if a configuration argument is + * not supported. + * @throws NullPointerException if the supplied configuration argument is + null. + * @throws InvalidParameterException if the supplied configuration argument + * is invalid. + * @return a provider configured with the supplied configuration argument. + * + * @since 1.9 + */ + public Provider configure(String configArg) { + throw new UnsupportedOperationException("configure is not supported"); + } + + /** + * Return the configuration parameter used for configuring this provider + * instance. If no parameter is supplied, null is returned. + * + * @return the string value passed into the {@link #configure} method if + * specified. + * + * @since 1.9 + */ + public String getArgument() { + return null; + } + + /** * Returns the name of this provider. * * @return the name of this provider. */ public String getName() {
*** 1577,1619 **** ("Service not registered with Provider " + provider.getName() + ": " + this); } registered = true; } try { EngineDescription cap = knownEngines.get(type); if (cap == null) { // unknown engine type, use generic code // this is the code path future for non-core // optional packages ! return newInstanceGeneric(constructorParameter); ! } ! if (cap.constructorParameterClassName == null) { if (constructorParameter != null) { throw new InvalidParameterException ("constructorParameter not used with " + type + " engines"); - } - Class<?> clazz = getImplClass(); - Class<?>[] empty = {}; - Constructor<?> con = clazz.getConstructor(empty); - return con.newInstance(); } else { - Class<?> paramClass = cap.getConstructorParameterClass(); - if (constructorParameter != null) { Class<?> argClass = constructorParameter.getClass(); ! if (paramClass.isAssignableFrom(argClass) == false) { throw new InvalidParameterException ("constructorParameter must be instanceof " + cap.constructorParameterClassName.replace('$', '.') + " for engine type " + type); } } - Class<?> clazz = getImplClass(); - Constructor<?> cons = clazz.getConstructor(paramClass); - return cons.newInstance(constructorParameter); } } catch (NoSuchAlgorithmException e) { throw e; } catch (InvocationTargetException e) { throw new NoSuchAlgorithmException ("Error constructing implementation (algorithm: " --- 1630,1668 ---- ("Service not registered with Provider " + provider.getName() + ": " + this); } registered = true; } + Class<?> ctrParamClz; try { EngineDescription cap = knownEngines.get(type); if (cap == null) { // unknown engine type, use generic code // this is the code path future for non-core // optional packages ! ctrParamClz = constructorParameter == null? ! null : constructorParameter.getClass(); ! } else { ! ctrParamClz = cap.constructorParameterClassName == null? ! null : Class.forName(cap.constructorParameterClassName); if (constructorParameter != null) { + if (ctrParamClz == null) { throw new InvalidParameterException ("constructorParameter not used with " + type + " engines"); } else { Class<?> argClass = constructorParameter.getClass(); ! if (ctrParamClz.isAssignableFrom(argClass) == false) { throw new InvalidParameterException ("constructorParameter must be instanceof " + cap.constructorParameterClassName.replace('$', '.') + " for engine type " + type); } } } + } + return newInstanceUtil(getImplClass(), ctrParamClz, constructorParameter); } catch (NoSuchAlgorithmException e) { throw e; } catch (InvocationTargetException e) { throw new NoSuchAlgorithmException ("Error constructing implementation (algorithm: "
*** 1652,1698 **** ("class configured for " + type + " (provider: " + provider.getName() + ") cannot be found.", e); } } - /** - * Generic code path for unknown engine types. Call the - * no-args constructor if constructorParameter is null, otherwise - * use the first matching constructor. - */ - private Object newInstanceGeneric(Object constructorParameter) - throws Exception { - Class<?> clazz = getImplClass(); - if (constructorParameter == null) { - // create instance with public no-arg constructor if it exists - try { - Class<?>[] empty = {}; - Constructor<?> con = clazz.getConstructor(empty); - return con.newInstance(); - } catch (NoSuchMethodException e) { - throw new NoSuchAlgorithmException("No public no-arg " - + "constructor found in class " + className); - } - } - Class<?> argClass = constructorParameter.getClass(); - Constructor<?>[] cons = clazz.getConstructors(); - // find first public constructor that can take the - // argument as parameter - for (Constructor<?> con : cons) { - Class<?>[] paramTypes = con.getParameterTypes(); - if (paramTypes.length != 1) { - continue; - } - if (paramTypes[0].isAssignableFrom(argClass) == false) { - continue; - } - return con.newInstance(constructorParameter); - } - throw new NoSuchAlgorithmException("No public constructor matching " - + argClass.getName() + " found in class " + className); - } - /** * Test whether this Service can use the specified parameter. * Returns false if this service cannot use the parameter. Returns * true if this service can use the parameter, if a fast test is * infeasible, or if the status is unknown. --- 1701,1710 ----