samples/messagedigest/src-bridge/org/apidesign/impl/security/extension/BridgeToOld.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sat, 14 Jun 2008 09:52:26 +0200
changeset 51 130e099942d8
parent 50 019f1e9f7741
child 132 3bc4c54f4bcc
permissions -rw-r--r--
Merge: Geertjan's changes up to 4500
     1 /*
     2  * To change this template, choose Tools | Templates
     3  * and open the template in the editor.
     4  */
     5 
     6 package org.apidesign.impl.security.extension;
     7 
     8 import org.apidesign.api.security.Digest;
     9 import java.nio.ByteBuffer;
    10 import java.security.MessageDigest;
    11 import java.security.NoSuchAlgorithmException;
    12 import java.security.Provider;
    13 import java.security.Security;
    14 import java.util.Collections;
    15 import java.util.List;
    16 import java.util.Map;
    17 
    18 /**
    19  *
    20  * @author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
    21  */
    22 // BEGIN: day.end.bridges.BridgeToOld
    23 public final class BridgeToOld extends Provider {
    24 
    25     public BridgeToOld() {
    26         super("spi.Digestor", 1.0, "");
    27         Security.addProvider(this);
    28     }
    29 
    30     // BEGIN: day.end.bridges.cycle
    31     private ThreadLocal<Boolean> searching = new ThreadLocal<Boolean>();
    32     final boolean isSearching() {
    33         return Boolean.TRUE.equals(searching.get());
    34     }
    35     
    36     @Override
    37     public synchronized Service getService(String type, String algorithm) {
    38         Boolean prev = searching.get();
    39         try {
    40             searching.set(Boolean.TRUE);
    41             if ("MessageDigest".equals(type)) {
    42                 Digest dig = Digest.getInstance(algorithm);
    43                 if (dig != null) {
    44                     return new ServiceImpl(dig, this, type, algorithm, "", Collections.<String>emptyList(), Collections.<String,String>emptyMap());
    45                 }
    46             }
    47             return null;
    48         } finally {
    49             searching.set(prev);
    50         }
    51     }
    52     // END: day.end.bridges.cycle
    53 
    54     private static class ServiceImpl<Data> extends Service {
    55         Digest dig;
    56 
    57         public ServiceImpl(Digest dig, Provider provider, String type, String algorithm, String className, List<String> aliases, Map<String, String> attributes) {
    58             super(provider, type, algorithm, className, aliases, attributes);
    59             this.dig = dig;
    60         }
    61 
    62         @Override
    63         public Object newInstance(Object constructorParameter) throws NoSuchAlgorithmException {
    64             return new MessageDigest(getAlgorithm()) {
    65                 private byte[] res;
    66                 
    67                 @Override
    68                 protected void engineUpdate(byte input) {
    69                     ByteBuffer bb = ByteBuffer.wrap(new byte[] { input });
    70                     res = dig.digest(bb);
    71                 }
    72 
    73                 @Override
    74                 protected void engineUpdate(byte[] input, int offset, int len) {
    75                     ByteBuffer bb = ByteBuffer.wrap(input);
    76                     bb.position(offset);
    77                     bb.limit(offset + len);
    78                     res = dig.digest(bb);
    79                 }
    80 
    81                 @Override
    82                 protected byte[] engineDigest() {
    83                     return res;
    84                 }
    85 
    86                 @Override
    87                 protected void engineReset() {
    88                     dig = Digest.getInstance(getAlgorithm());
    89                 }
    90             };
    91         }
    92         
    93         
    94     }
    95 
    96 }
    97 // END: day.end.bridges.BridgeToOld