samples/messagedigest/src-bridge/org/apidesign/impl/security/extension/BridgeToOld.java
changeset 44 716af5f2ebd1
child 46 c75861f07646
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/samples/messagedigest/src-bridge/org/apidesign/impl/security/extension/BridgeToOld.java	Sat Jun 14 09:52:23 2008 +0200
     1.3 @@ -0,0 +1,82 @@
     1.4 +/*
     1.5 + * To change this template, choose Tools | Templates
     1.6 + * and open the template in the editor.
     1.7 + */
     1.8 +
     1.9 +package org.apidesign.impl.security.extension;
    1.10 +
    1.11 +import org.apidesign.api.security.Digest;
    1.12 +import java.nio.ByteBuffer;
    1.13 +import java.security.MessageDigest;
    1.14 +import java.security.NoSuchAlgorithmException;
    1.15 +import java.security.Provider;
    1.16 +import java.security.Security;
    1.17 +import java.util.Collections;
    1.18 +import java.util.List;
    1.19 +import java.util.Map;
    1.20 +
    1.21 +/**
    1.22 + *
    1.23 + * @author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
    1.24 + */
    1.25 +public class BridgeToOld extends Provider {
    1.26 +
    1.27 +    public BridgeToOld() {
    1.28 +        super("spi.Digestor", 1.0, "");
    1.29 +        Security.addProvider(this);
    1.30 +    }
    1.31 +    
    1.32 +    @Override
    1.33 +    public synchronized Service getService(String type, String algorithm) {
    1.34 +        if ("MessageDigest".equals(type)) {
    1.35 +            Digest dig = Digest.getInstance(algorithm);
    1.36 +            if (dig != null) {
    1.37 +                return new ServiceImpl(dig, this, type, algorithm, "", Collections.<String>emptyList(), Collections.<String,String>emptyMap());
    1.38 +            }
    1.39 +        }
    1.40 +        return null;
    1.41 +    }
    1.42 +
    1.43 +    private static class ServiceImpl<Data> extends Service {
    1.44 +        Digest dig;
    1.45 +
    1.46 +        public ServiceImpl(Digest dig, Provider provider, String type, String algorithm, String className, List<String> aliases, Map<String, String> attributes) {
    1.47 +            super(provider, type, algorithm, className, aliases, attributes);
    1.48 +            this.dig = dig;
    1.49 +        }
    1.50 +
    1.51 +        @Override
    1.52 +        public Object newInstance(Object constructorParameter) throws NoSuchAlgorithmException {
    1.53 +            return new MessageDigest(getAlgorithm()) {
    1.54 +                private byte[] res;
    1.55 +                
    1.56 +                @Override
    1.57 +                protected void engineUpdate(byte input) {
    1.58 +                    ByteBuffer bb = ByteBuffer.wrap(new byte[] { input });
    1.59 +                    res = dig.digest(bb);
    1.60 +                }
    1.61 +
    1.62 +                @Override
    1.63 +                protected void engineUpdate(byte[] input, int offset, int len) {
    1.64 +                    ByteBuffer bb = ByteBuffer.wrap(input);
    1.65 +                    bb.position(offset);
    1.66 +                    bb.limit(offset + len);
    1.67 +                    res = dig.digest(bb);
    1.68 +                }
    1.69 +
    1.70 +                @Override
    1.71 +                protected byte[] engineDigest() {
    1.72 +                    return res;
    1.73 +                }
    1.74 +
    1.75 +                @Override
    1.76 +                protected void engineReset() {
    1.77 +                    dig = Digest.getInstance(getAlgorithm());
    1.78 +                }
    1.79 +            };
    1.80 +        }
    1.81 +        
    1.82 +        
    1.83 +    }
    1.84 +
    1.85 +}