samples/messagedigest/src-bridge/org/apidesign/impl/security/extension/BridgeToOld.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sat, 14 Jun 2008 09:56:12 +0200
changeset 132 3bc4c54f4bcc
parent 51 130e099942d8
child 133 50bf1b976c0d
permissions -rw-r--r--
Truncating all examples to 80 characters per line
     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(provider, type, algorithm, className, aliases, attributes);
    60             this.dig = dig;
    61         }
    62 
    63         @Override
    64         public Object newInstance(Object constructorParameter) 
    65         throws NoSuchAlgorithmException {
    66             return new MessageDigest(getAlgorithm()) {
    67                 private byte[] res;
    68                 
    69                 @Override
    70                 protected void engineUpdate(byte input) {
    71                     ByteBuffer bb = ByteBuffer.wrap(new byte[] { input });
    72                     res = dig.digest(bb);
    73                 }
    74 
    75                 @Override
    76                 protected void engineUpdate(
    77                     byte[] input, int offset, int len
    78                 ) {
    79                     ByteBuffer bb = ByteBuffer.wrap(input);
    80                     bb.position(offset);
    81                     bb.limit(offset + len);
    82                     res = dig.digest(bb);
    83                 }
    84 
    85                 @Override
    86                 protected byte[] engineDigest() {
    87                     return res;
    88                 }
    89 
    90                 @Override
    91                 protected void engineReset() {
    92                     dig = Digest.getInstance(getAlgorithm());
    93                 }
    94             };
    95         }
    96         
    97         
    98     }
    99 
   100 }
   101 // END: day.end.bridges.BridgeToOld