On Mon, 2006-07-10 at 10:08 -0600, Tom Tromey wrote:
> >>>>> "Matthew" == Matthew Wringe <[EMAIL PROTECTED]> writes:
>
> Matthew> If this patch is approved, I can commit it.
>
> Matthew> - // If there is no property "service.algorithm"
> Matthew> - if (provider.getProperty(service + "." + algorithm) == null)
>
> There's something here I don't understand.
>
> Looking at java.security.Provider, I see that it tries to
> canonicalize the keys -- see toCanonicalKey().
>
> Would just changing this to use get() fix the problem?
> Or perhaps it would be better to override getProperty in Provider?
Changing it to get() does fix the problem if the user only ever uses the
classpath provider. If they were to use any other provider, it will
fail.
The classpath provider overwrites the hashtable's get() method to ignore
the case (I have no idea why this is being done). Other providers do not
do this, nor is it expected behaviour.
The original patch I submitted does interact with other providers
without a problem.
>
> Matthew> + if (!algorithmFound) {
>
> The "{" goes on its own line here.
>
> Tom
Darn, I missed that one. The new patch attached has this fixed. I will
have to be more careful about this in the future.
If anyone has gotten the eclipse checkstyle plugin to work with the
checkstyle configuration files in the classpath cvs, please let me
know.
Thanks,
Matt Wringe
Index: Engine.java
===================================================================
RCS file: /sources/classpath/classpath/gnu/java/security/Engine.java,v
retrieving revision 1.3
diff -u -r1.3 Engine.java
--- Engine.java 1 Jan 2006 14:03:45 -0000 1.3
+++ Engine.java 10 Jul 2006 18:44:14 -0000
@@ -42,6 +42,7 @@
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
+import java.util.Enumeration;
/**
* Generic implementation of the getInstance methods in the various
@@ -141,26 +142,46 @@
|| provider == null || initArgs == null)
throw new IllegalArgumentException();
- // If there is no property "service.algorithm"
- if (provider.getProperty(service + "." + algorithm) == null)
+
+ Enumeration enumer = provider.propertyNames();
+ String key;
+ String alias;
+ int count = 0;
+ boolean algorithmFound = false;
+
+ while (enumer.hasMoreElements())
{
- // Iterate through aliases, until we find the class name or resolve
- // too many aliases.
- String alias = null;
- int count = 0;
- while ((alias = provider.getProperty(
- ALG_ALIAS + service + "." + algorithm)) != null)
+ key = (String) enumer.nextElement();
+
+ if (key.equalsIgnoreCase(service + "." + algorithm))
+ {
+ // remove the service portion from the key
+ algorithm = key.substring(service.length() + 1);
+
+ algorithmFound = true;
+ break;
+
+ }
+ else if (key.equalsIgnoreCase(ALG_ALIAS + service + "." + algorithm))
{
- if (algorithm.equals(alias)) // Refers to itself!
- break;
+
+ alias = (String) provider.getProperty(key);
algorithm = alias;
if (count++ > MAX_ALIASES)
throw new NoSuchAlgorithmException("too many aliases");
+
+ // need to reset enumeration to now look for the alias
+ enumer = provider.propertyNames();
+
}
- if (provider.getProperty(service + "." + algorithm) == null)
- throw new NoSuchAlgorithmException(algorithm);
}
-
+
+ if (! algorithmFound)
+ {
+ throw new NoSuchAlgorithmException(algorithm);
+ }
+
+
// Find and instantiate the implementation.
Class clazz = null;
ClassLoader loader = provider.getClass().getClassLoader();