# HG changeset patch # User Jaroslav Tulach # Date 1213429945 -7200 # Node ID f464a16d553a752e62300ddae76a5c97006c8c11 # Parent c75861f07646661e45f2d195b6f75d4c7e5d0970 Simplified to does not contain the friend API, instead the SPI is directly define by the API diff -r c75861f07646 -r f464a16d553a samples/messagedigest/build.xml --- a/samples/messagedigest/build.xml Sat Jun 14 09:52:23 2008 +0200 +++ b/samples/messagedigest/build.xml Sat Jun 14 09:52:25 2008 +0200 @@ -9,28 +9,24 @@ - + - - - - - + - + - + diff -r c75861f07646 -r f464a16d553a samples/messagedigest/nbproject/project.xml --- a/samples/messagedigest/nbproject/project.xml Sat Jun 14 09:52:23 2008 +0200 +++ b/samples/messagedigest/nbproject/project.xml Sat Jun 14 09:52:25 2008 +0200 @@ -3,7 +3,7 @@ org.netbeans.modules.ant.freeform - bridges + MessageDigest and Bridges @@ -17,12 +17,6 @@ UTF-8 - - java - src-new-spi - UTF-8 - - java src-bridge @@ -34,6 +28,11 @@ src-test UTF-8 + + + . + UTF-8 + @@ -50,22 +49,33 @@ build + + folder + build/bridge/classes + build + + + folder + build/new-api/classes + build + + + folder + build/test/classes + build + - + src-new-api - - src-new-spi - - - + src-bridge - + src-test @@ -79,25 +89,24 @@ + src-new-api + build/bridge/classes + build/new-api/classes + build/test/classes 1.5 - src-new-spi + src-bridge src-new-api 1.5 - src-bridge - src-new-api:src-new-spi - 1.5 - - src-test - src-new-api:src-new-spi:../libs/dist/junit-4.4.jar + src-new-api:../libs/dist/junit-4.4.jar 1.5 diff -r c75861f07646 -r f464a16d553a samples/messagedigest/src-bridge/org/apidesign/impl/security/extension/BridgeToNew.java --- a/samples/messagedigest/src-bridge/org/apidesign/impl/security/extension/BridgeToNew.java Sat Jun 14 09:52:23 2008 +0200 +++ b/samples/messagedigest/src-bridge/org/apidesign/impl/security/extension/BridgeToNew.java Sat Jun 14 09:52:25 2008 +0200 @@ -5,40 +5,37 @@ package org.apidesign.impl.security.extension; -import org.apidesign.impl.security.friendapi.DigestImplementation; -import org.apidesign.impl.security.friendapi.DigestProvider; import java.nio.ByteBuffer; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.logging.Level; import java.util.logging.Logger; +import org.apidesign.spi.security.Digestor; /** * * @author Jaroslav Tulach */ // BEGIN: day.end.bridges.BridgeToNew -public class BridgeToNew implements DigestProvider { - - public DigestImplementation create(String algorithm) { +public class BridgeToNew extends Digestor { + @Override + protected MessageDigest create(String algorithm) { try { - final MessageDigest md = MessageDigest.getInstance(algorithm); - return new DigestImplementation(algorithm) { - - @Override - public void update(ByteBuffer bb) { - md.update(bb); - } - - @Override - public byte[] digest() { - return md.digest(); - } - }; + return MessageDigest.getInstance(algorithm); } catch (NoSuchAlgorithmException ex) { - Logger.getLogger(BridgeToNew.class.getName()).log(Level.INFO, null, ex); + Logger.getLogger(BridgeToNew.class.getName()).log(Level.FINE, "Cannot find " + algorithm, ex); return null; } } + + @Override + protected byte[] digest(MessageDigest data) { + return data.digest(); + } + + @Override + protected void update(MessageDigest data, ByteBuffer input) { + data.update(input); + } } // END: day.end.bridges.BridgeToNew diff -r c75861f07646 -r f464a16d553a samples/messagedigest/src-new-api/org/apidesign/api/security/Digest.java --- a/samples/messagedigest/src-new-api/org/apidesign/api/security/Digest.java Sat Jun 14 09:52:23 2008 +0200 +++ b/samples/messagedigest/src-new-api/org/apidesign/api/security/Digest.java Sat Jun 14 09:52:25 2008 +0200 @@ -2,28 +2,28 @@ package org.apidesign.api.security; import java.nio.ByteBuffer; -import org.apidesign.impl.security.friendapi.DigestImplementation; -import org.apidesign.impl.security.friendapi.DigestProvider; import java.util.ServiceLoader; +import org.apidesign.spi.security.Digestor; -/** MessageDigest extends MessageDigestSpi, that means the javadoc +/** Simplified version of a Digest class that allows to compute a fingerprint + * for buffer of data. * - * @author Jaroslav Tulach + * @author Jaroslav Tulach */ // BEGIN: day.end.bridges.Digest public final class Digest { - private final DigestImplementation impl; + private final DigestImplementation impl; /** Factory method is better than constructor */ - private Digest(DigestImplementation impl) { + private Digest(DigestImplementation impl) { this.impl = impl; } /** Factory method to create digest for an algorithm. */ public static Digest getInstance(String algorithm) { - for (DigestProvider dp : ServiceLoader.load(DigestProvider.class)) { - DigestImplementation impl = dp.create(algorithm); + for (Digestor digestor : ServiceLoader.load(Digestor.class)) { + DigestImplementation impl = DigestImplementation.create(digestor, algorithm); if (impl != null) { return new Digest(impl); } @@ -37,8 +37,7 @@ // public byte[] digest(ByteBuffer bb) { - impl.update(bb); - return impl.digest(); + return impl.digest(bb); } } // END: day.end.bridges.Digest diff -r c75861f07646 -r f464a16d553a samples/messagedigest/src-new-api/org/apidesign/api/security/DigestImplementation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/messagedigest/src-new-api/org/apidesign/api/security/DigestImplementation.java Sat Jun 14 09:52:25 2008 +0200 @@ -0,0 +1,41 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package org.apidesign.api.security; + +import java.nio.ByteBuffer; +import org.apidesign.spi.security.Digestor; + +/** + * + * @author Jaroslav Tulach + */ +final class DigestImplementation { + private static final DigestorAccessorImpl ACCESSOR = new DigestorAccessorImpl(); + + private final Digestor digestor; + private final String algorithm; + private Data data; + + private DigestImplementation(Digestor digestor, String algorithm, Data d) { + this.digestor = digestor; + this.algorithm = algorithm; + this.data = d; + } + + static DigestImplementation create(Digestor digestor, String algorithm) { + Data d = ACCESSOR.create(digestor, algorithm); + if (d == null) { + return null; + } else { + return new DigestImplementation(digestor, algorithm, d); + } + } + + byte[] digest(ByteBuffer bb) { + ACCESSOR.update(digestor, data, bb); + return ACCESSOR.digest(digestor, data); + } +} diff -r c75861f07646 -r f464a16d553a samples/messagedigest/src-new-api/org/apidesign/api/security/DigestorAccessorImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/messagedigest/src-new-api/org/apidesign/api/security/DigestorAccessorImpl.java Sat Jun 14 09:52:25 2008 +0200 @@ -0,0 +1,26 @@ +package org.apidesign.api.security; + +import org.apidesign.spi.security.*; +import java.nio.ByteBuffer; +import org.apidesign.impl.DigestorAccessor; + +/** + * + * @author Jaroslav Tulach + */ +final class DigestorAccessorImpl extends DigestorAccessor { + @Override + public byte[] digest(Digestor dig, Data data) { + return defaultDigest(dig, data); + } + + @Override + public Data create(Digestor dig, String algorithm) { + return defaultCreate(dig, algorithm); + } + + @Override + public void update(Digestor dig, Data data, ByteBuffer input) { + defaultUpdate(dig, data, input); + } +} diff -r c75861f07646 -r f464a16d553a samples/messagedigest/src-new-api/org/apidesign/impl/DigestorAccessor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/messagedigest/src-new-api/org/apidesign/impl/DigestorAccessor.java Sat Jun 14 09:52:25 2008 +0200 @@ -0,0 +1,53 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package org.apidesign.impl; + +import java.nio.ByteBuffer; +import org.apidesign.spi.security.Digestor; + +/** + * + * @author Jaroslav Tulach + */ +public abstract class DigestorAccessor { + private static DigestorAccessor INSTANCE; + + protected DigestorAccessor() { + if (this.getClass().getName().equals("org.apidesign.spi.security.DigestorAccessorImpl")) { + assert INSTANCE == null; + INSTANCE = this; + return; + } + if (this.getClass().getName().equals("org.apidesign.api.security.DigestorAccessorImpl")) { + return; + } + throw new IllegalStateException(); + } + + final DigestorAccessor getDefault() { + try { + Class.forName(Digestor.class.getName(), true, DigestorAccessor.class.getClassLoader()); + return INSTANCE; + } catch (ClassNotFoundException ex) { + throw new IllegalStateException(ex); + } + } + + protected abstract byte[] digest(Digestor dig, Data data); + protected abstract Data create(Digestor dig, String algorithm); + protected abstract void update(Digestor dig, Data data, ByteBuffer input); + + + protected final byte[] defaultDigest(Digestor dig, Data data) { + return getDefault().digest(dig, data); + } + protected final Data defaultCreate(Digestor dig, String algorithm) { + return getDefault().create(dig, algorithm); + } + protected final void defaultUpdate(Digestor dig, Data data, ByteBuffer input) { + getDefault().update(dig, data, input); + } +} diff -r c75861f07646 -r f464a16d553a samples/messagedigest/src-new-api/org/apidesign/spi/security/Digestor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/messagedigest/src-new-api/org/apidesign/spi/security/Digestor.java Sat Jun 14 09:52:25 2008 +0200 @@ -0,0 +1,29 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package org.apidesign.spi.security; + +import java.nio.ByteBuffer; + +/** + * + * @author Jaroslav Tulach + */ +// BEGIN: day.end.bridges.Digestor +public abstract class Digestor { + protected abstract byte[] digest(Data data); + protected abstract Data create(String algorithm); + protected abstract void update(Data data, ByteBuffer input); + +// END: day.end.bridges.Digestor + + + static { + // initializes the accessor, so the api package can call protected + // methods from this class + new DigestorAccessorImpl(); + } +} + diff -r c75861f07646 -r f464a16d553a samples/messagedigest/src-new-api/org/apidesign/spi/security/DigestorAccessorImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/samples/messagedigest/src-new-api/org/apidesign/spi/security/DigestorAccessorImpl.java Sat Jun 14 09:52:25 2008 +0200 @@ -0,0 +1,25 @@ +package org.apidesign.spi.security; + +import java.nio.ByteBuffer; +import org.apidesign.impl.DigestorAccessor; + +/** + * + * @author Jaroslav Tulach + */ +final class DigestorAccessorImpl extends DigestorAccessor { + @Override + public byte[] digest(Digestor dig, Data data) { + return dig.digest(data); + } + + @Override + public Data create(Digestor dig, String algorithm) { + return dig.create(algorithm); + } + + @Override + public void update(Digestor dig, Data data, ByteBuffer input) { + dig.update(data, input); + } +}