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