samples/messagedigest/src-bridge/org/apidesign/impl/security/extension/BridgeToOld.java
author Jaroslav Tulach <jtulach@netbeans.org>
Sat, 14 Jun 2008 09:52:23 +0200
changeset 44 716af5f2ebd1
child 46 c75861f07646
permissions -rw-r--r--
Switching to freeform project
     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 public class BridgeToOld extends Provider {
    23 
    24     public BridgeToOld() {
    25         super("spi.Digestor", 1.0, "");
    26         Security.addProvider(this);
    27     }
    28     
    29     @Override
    30     public synchronized Service getService(String type, String algorithm) {
    31         if ("MessageDigest".equals(type)) {
    32             Digest dig = Digest.getInstance(algorithm);
    33             if (dig != null) {
    34                 return new ServiceImpl(dig, this, type, algorithm, "", Collections.<String>emptyList(), Collections.<String,String>emptyMap());
    35             }
    36         }
    37         return null;
    38     }
    39 
    40     private static class ServiceImpl<Data> extends Service {
    41         Digest dig;
    42 
    43         public ServiceImpl(Digest dig, Provider provider, String type, String algorithm, String className, List<String> aliases, Map<String, String> attributes) {
    44             super(provider, type, algorithm, className, aliases, attributes);
    45             this.dig = dig;
    46         }
    47 
    48         @Override
    49         public Object newInstance(Object constructorParameter) throws NoSuchAlgorithmException {
    50             return new MessageDigest(getAlgorithm()) {
    51                 private byte[] res;
    52                 
    53                 @Override
    54                 protected void engineUpdate(byte input) {
    55                     ByteBuffer bb = ByteBuffer.wrap(new byte[] { input });
    56                     res = dig.digest(bb);
    57                 }
    58 
    59                 @Override
    60                 protected void engineUpdate(byte[] input, int offset, int len) {
    61                     ByteBuffer bb = ByteBuffer.wrap(input);
    62                     bb.position(offset);
    63                     bb.limit(offset + len);
    64                     res = dig.digest(bb);
    65                 }
    66 
    67                 @Override
    68                 protected byte[] engineDigest() {
    69                     return res;
    70                 }
    71 
    72                 @Override
    73                 protected void engineReset() {
    74                     dig = Digest.getInstance(getAlgorithm());
    75                 }
    76             };
    77         }
    78         
    79         
    80     }
    81 
    82 }