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 46 c75861f07646
parent 44 716af5f2ebd1
child 48 c5742322dbc8
permissions -rw-r--r--
Using real pieces of code the talk about bridges
     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 class BridgeToOld extends Provider {
    24 
    25     public BridgeToOld() {
    26         super("spi.Digestor", 1.0, "");
    27         Security.addProvider(this);
    28     }
    29     
    30     @Override
    31     public synchronized Service getService(String type, String algorithm) {
    32         if ("MessageDigest".equals(type)) {
    33             Digest dig = Digest.getInstance(algorithm);
    34             if (dig != null) {
    35                 return new ServiceImpl(dig, this, type, algorithm, "", Collections.<String>emptyList(), Collections.<String,String>emptyMap());
    36             }
    37         }
    38         return null;
    39     }
    40 
    41     private static class ServiceImpl<Data> extends Service {
    42         Digest dig;
    43 
    44         public ServiceImpl(Digest dig, Provider provider, String type, String algorithm, String className, List<String> aliases, Map<String, String> attributes) {
    45             super(provider, type, algorithm, className, aliases, attributes);
    46             this.dig = dig;
    47         }
    48 
    49         @Override
    50         public Object newInstance(Object constructorParameter) throws NoSuchAlgorithmException {
    51             return new MessageDigest(getAlgorithm()) {
    52                 private byte[] res;
    53                 
    54                 @Override
    55                 protected void engineUpdate(byte input) {
    56                     ByteBuffer bb = ByteBuffer.wrap(new byte[] { input });
    57                     res = dig.digest(bb);
    58                 }
    59 
    60                 @Override
    61                 protected void engineUpdate(byte[] input, int offset, int len) {
    62                     ByteBuffer bb = ByteBuffer.wrap(input);
    63                     bb.position(offset);
    64                     bb.limit(offset + len);
    65                     res = dig.digest(bb);
    66                 }
    67 
    68                 @Override
    69                 protected byte[] engineDigest() {
    70                     return res;
    71                 }
    72 
    73                 @Override
    74                 protected void engineReset() {
    75                     dig = Digest.getInstance(getAlgorithm());
    76                 }
    77             };
    78         }
    79         
    80         
    81     }
    82 
    83 }
    84 // END: day.end.bridges.BridgeToOld