jdk/src/share/classes/com/sun/org/apache/xml/internal/security/keys/keyresolver/KeyResolver.java
changeset 10694 cf59e2badd14
parent 1337 e8d6cef36199
child 18240 cda839ac048f
equal deleted inserted replaced
10693:6e9ebed2e783 10694:cf59e2badd14
    50 
    50 
    51    /** Field _alreadyInitialized */
    51    /** Field _alreadyInitialized */
    52    static boolean _alreadyInitialized = false;
    52    static boolean _alreadyInitialized = false;
    53 
    53 
    54    /** Field _resolverVector */
    54    /** Field _resolverVector */
    55    static List _resolverVector = null;
    55    static List<KeyResolver> _resolverVector = null;
    56 
    56 
    57    /** Field _resolverSpi */
    57    /** Field _resolverSpi */
    58    protected KeyResolverSpi _resolverSpi = null;
    58    protected KeyResolverSpi _resolverSpi = null;
    59 
    59 
    60    /** Field _storage */
    60    /** Field _storage */
    83     */
    83     */
    84    public static int length() {
    84    public static int length() {
    85       return KeyResolver._resolverVector.size();
    85       return KeyResolver._resolverVector.size();
    86    }
    86    }
    87 
    87 
    88    public static void hit(Iterator hintI) {
    88    public static void hit(Iterator<KeyResolverSpi> hintI) {
    89            ResolverIterator hint = (ResolverIterator) hintI;
    89            ResolverIterator hint = (ResolverIterator) hintI;
    90            int i = hint.i;
    90            int i = hint.i;
    91            if (i!=1 && hint.res ==_resolverVector) {
    91            if (i!=1 && hint.res ==_resolverVector) {
    92                    List resolverVector=(List)((ArrayList)_resolverVector).clone();
    92                    List<KeyResolver> resolverVector=getResolverVectorClone();
    93                 Object ob=resolverVector.remove(i-1);
    93                 KeyResolver ob=resolverVector.remove(i-1);
    94                 resolverVector.add(0,ob);
    94                 resolverVector.add(0,ob);
    95                  _resolverVector=resolverVector;
    95                  _resolverVector=resolverVector;
    96          } else {
    96          } else {
    97                  //System.out.println("KeyResolver hitting");
    97                  //System.out.println("KeyResolver hitting");
    98          }
    98          }
   111    public static final X509Certificate getX509Certificate(
   111    public static final X509Certificate getX509Certificate(
   112            Element element, String BaseURI, StorageResolver storage)
   112            Element element, String BaseURI, StorageResolver storage)
   113               throws KeyResolverException {
   113               throws KeyResolverException {
   114 
   114 
   115           // use the old vector to not be hit by updates
   115           // use the old vector to not be hit by updates
   116           List resolverVector = KeyResolver._resolverVector;
   116           List<KeyResolver> resolverVector = KeyResolver._resolverVector;
   117       for (int i = 0; i < resolverVector.size(); i++) {
   117       for (KeyResolver resolver : resolverVector) {
   118                   KeyResolver resolver=
   118          if (resolver==null) {
   119             (KeyResolver) resolverVector.get(i);
   119             Object exArgs[] = {
       
   120                (((element != null)
       
   121                  && (element.getNodeType() == Node.ELEMENT_NODE))
       
   122                 ? element.getTagName()
       
   123                 : "null") };
       
   124 
       
   125             throw new KeyResolverException("utils.resolver.noClass", exArgs);
       
   126          }
       
   127          if (log.isLoggable(java.util.logging.Level.FINE))
       
   128                 log.log(java.util.logging.Level.FINE, "check resolvability by class " + resolver.getClass());
       
   129 
       
   130          X509Certificate cert=resolver.resolveX509Certificate(element, BaseURI, storage);
       
   131          if (cert!=null) {
       
   132             return cert;
       
   133          }
       
   134       }
       
   135 
       
   136       Object exArgs[] = {
       
   137          (((element != null) && (element.getNodeType() == Node.ELEMENT_NODE))
       
   138           ? element.getTagName()
       
   139           : "null") };
       
   140 
       
   141       throw new KeyResolverException("utils.resolver.noClass", exArgs);
       
   142    }
       
   143    /**
       
   144     * Method getInstance
       
   145     *
       
   146     * @param element
       
   147     * @param BaseURI
       
   148     * @param storage
       
   149     * @return the public key contained in the element
       
   150     *
       
   151     * @throws KeyResolverException
       
   152     */
       
   153    public static final PublicKey getPublicKey(
       
   154            Element element, String BaseURI, StorageResolver storage)
       
   155               throws KeyResolverException {
       
   156 
       
   157           List<KeyResolver> resolverVector = KeyResolver._resolverVector;
       
   158       for (KeyResolver resolver : resolverVector) {
   120 
   159 
   121                   if (resolver==null) {
   160                   if (resolver==null) {
   122             Object exArgs[] = {
   161             Object exArgs[] = {
   123                (((element != null)
   162                (((element != null)
   124                  && (element.getNodeType() == Node.ELEMENT_NODE))
   163                  && (element.getNodeType() == Node.ELEMENT_NODE))
   128             throw new KeyResolverException("utils.resolver.noClass", exArgs);
   167             throw new KeyResolverException("utils.resolver.noClass", exArgs);
   129          }
   168          }
   130          if (log.isLoggable(java.util.logging.Level.FINE))
   169          if (log.isLoggable(java.util.logging.Level.FINE))
   131                 log.log(java.util.logging.Level.FINE, "check resolvability by class " + resolver.getClass());
   170                 log.log(java.util.logging.Level.FINE, "check resolvability by class " + resolver.getClass());
   132 
   171 
   133          X509Certificate cert=resolver.resolveX509Certificate(element, BaseURI, storage);
   172          PublicKey cert=resolver.resolvePublicKey(element, BaseURI, storage);
   134          if (cert!=null) {
   173          if (cert!=null) {
   135             return cert;
   174                  if (resolverVector.indexOf(resolver)!=0 && resolverVector==_resolverVector) {
       
   175                          //update resolver.
       
   176                          resolverVector=getResolverVectorClone();
       
   177                                  resolverVector.remove(resolver);
       
   178                                  resolverVector.add(0,resolver);
       
   179                                  _resolverVector=resolverVector;
       
   180                  }
       
   181                  return cert;
   136          }
   182          }
   137       }
   183       }
   138 
   184 
   139       Object exArgs[] = {
   185       Object exArgs[] = {
   140          (((element != null) && (element.getNodeType() == Node.ELEMENT_NODE))
   186          (((element != null) && (element.getNodeType() == Node.ELEMENT_NODE))
   141           ? element.getTagName()
   187           ? element.getTagName()
   142           : "null") };
   188           : "null") };
   143 
   189 
   144       throw new KeyResolverException("utils.resolver.noClass", exArgs);
   190       throw new KeyResolverException("utils.resolver.noClass", exArgs);
   145    }
   191    }
   146    /**
   192 
   147     * Method getInstance
   193 
   148     *
   194    @SuppressWarnings("unchecked")
   149     * @param element
   195    private static List<KeyResolver> getResolverVectorClone() {
   150     * @param BaseURI
   196        return (List<KeyResolver>)((ArrayList<KeyResolver>)_resolverVector).clone();
   151     * @param storage
       
   152     * @return the public key contained in the element
       
   153     *
       
   154     * @throws KeyResolverException
       
   155     */
       
   156    public static final PublicKey getPublicKey(
       
   157            Element element, String BaseURI, StorageResolver storage)
       
   158               throws KeyResolverException {
       
   159 
       
   160           List resolverVector = KeyResolver._resolverVector;
       
   161       for (int i = 0; i < resolverVector.size(); i++) {
       
   162                   KeyResolver resolver=
       
   163             (KeyResolver) resolverVector.get(i);
       
   164 
       
   165                   if (resolver==null) {
       
   166             Object exArgs[] = {
       
   167                (((element != null)
       
   168                  && (element.getNodeType() == Node.ELEMENT_NODE))
       
   169                 ? element.getTagName()
       
   170                 : "null") };
       
   171 
       
   172             throw new KeyResolverException("utils.resolver.noClass", exArgs);
       
   173          }
       
   174          if (log.isLoggable(java.util.logging.Level.FINE))
       
   175                 log.log(java.util.logging.Level.FINE, "check resolvability by class " + resolver.getClass());
       
   176 
       
   177          PublicKey cert=resolver.resolvePublicKey(element, BaseURI, storage);
       
   178          if (cert!=null) {
       
   179                  if (i!=0 && resolverVector==_resolverVector) {
       
   180                          //update resolver.
       
   181                          resolverVector=(List)((ArrayList)_resolverVector).clone();
       
   182                                  Object ob=resolverVector.remove(i);
       
   183                                  resolverVector.add(0,ob);
       
   184                                  _resolverVector=resolverVector;
       
   185                  }
       
   186                  return cert;
       
   187          }
       
   188       }
       
   189 
       
   190       Object exArgs[] = {
       
   191          (((element != null) && (element.getNodeType() == Node.ELEMENT_NODE))
       
   192           ? element.getTagName()
       
   193           : "null") };
       
   194 
       
   195       throw new KeyResolverException("utils.resolver.noClass", exArgs);
       
   196    }
   197    }
   197 
   198 
   198    /**
   199    /**
   199     * The init() function is called by com.sun.org.apache.xml.internal.security.Init.init()
   200     * The init() function is called by com.sun.org.apache.xml.internal.security.Init.init()
   200     */
   201     */
   201    public static void init() {
   202    public static void init() {
   202 
   203 
   203       if (!KeyResolver._alreadyInitialized) {
   204       if (!KeyResolver._alreadyInitialized) {
   204          KeyResolver._resolverVector = new ArrayList(10);
   205          KeyResolver._resolverVector = new ArrayList<KeyResolver>(10);
   205          _alreadyInitialized = true;
   206          _alreadyInitialized = true;
   206       }
   207       }
   207    }
   208    }
   208 
   209 
   209    /**
   210    /**
   228     * personalized {@link KeyResolverSpi}s should only be registered directly
   229     * personalized {@link KeyResolverSpi}s should only be registered directly
   229     * to the {@link com.sun.org.apache.xml.internal.security.keys.KeyInfo} using {@link com.sun.org.apache.xml.internal.security.keys.KeyInfo#registerInternalKeyResolver}.
   230     * to the {@link com.sun.org.apache.xml.internal.security.keys.KeyInfo} using {@link com.sun.org.apache.xml.internal.security.keys.KeyInfo#registerInternalKeyResolver}.
   230     *
   231     *
   231     * @param className
   232     * @param className
   232     */
   233     */
   233    public static void registerAtStart(String className) {
   234    public static void registerAtStart(String className) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
   234       KeyResolver._resolverVector.add(0, className);
   235        register(className);
   235    }
   236    }
   236 
   237 
   237    /**
   238    /**
   238     * Method resolve
   239     * Method resolve
   239     *
   240     *
   320     */
   321     */
   321    public String resolverClassName() {
   322    public String resolverClassName() {
   322       return this._resolverSpi.getClass().getName();
   323       return this._resolverSpi.getClass().getName();
   323    }
   324    }
   324 
   325 
   325    static class ResolverIterator implements Iterator {
   326    static class ResolverIterator implements Iterator<KeyResolverSpi> {
   326            List res;
   327                 List<KeyResolver> res;
   327                 Iterator it;
   328                 Iterator<KeyResolver> it;
   328                 int i;
   329                 int i;
   329            public ResolverIterator(List list) {
   330            public ResolverIterator(List<KeyResolver> list) {
   330                 res = list;
   331                 res = list;
   331                 it = res.iterator();
   332                 it = res.iterator();
   332         }
   333         }
   333                 public boolean hasNext() {
   334                 public boolean hasNext() {
   334                         // TODO Auto-generated method stub
   335                         // TODO Auto-generated method stub
   335                         return it.hasNext();
   336                         return it.hasNext();
   336                 }
   337                 }
   337 
   338 
   338                 public Object next() {
   339                 public KeyResolverSpi next() {
   339                         i++;
   340                         i++;
   340                         KeyResolver resolver = (KeyResolver) it.next();
   341                         KeyResolver resolver =  it.next();
   341                       if (resolver==null) {
   342                       if (resolver==null) {
   342                          throw new RuntimeException("utils.resolver.noClass");
   343                          throw new RuntimeException("utils.resolver.noClass");
   343                       }
   344                       }
   344 
   345 
   345                       return resolver._resolverSpi;
   346                       return resolver._resolverSpi;
   349                         // TODO Auto-generated method stub
   350                         // TODO Auto-generated method stub
   350 
   351 
   351                 }
   352                 }
   352 
   353 
   353         };
   354         };
   354         public static Iterator iterator() {
   355         public static Iterator<KeyResolverSpi> iterator() {
   355                 return new ResolverIterator(_resolverVector);
   356                 return new ResolverIterator(_resolverVector);
   356    }
   357    }
   357 }
   358 }