/* * ==================================================================== * Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms * are also available at http://svnkit.com/license.html. * If newer versions of this license are posted there, you may use a * newer version instead, at your option. * ==================================================================== */ package org.tmatesoft.svn.core.internal.wc.admin; import java.io.IOException; import java.io.OutputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import org.tmatesoft.svn.core.internal.wc.SVNFileUtil; /** * @version 1.3 * @author TMate Software Ltd. */ public class SVNChecksumOutputStream extends OutputStream { public static final String MD5_ALGORITHM = "MD5"; private OutputStream myTarget; private MessageDigest myDigest; private byte[] myDigestResult; private boolean myCloseTarget; public SVNChecksumOutputStream(OutputStream target, String algorithm, boolean closeTarget) { myTarget = target; myCloseTarget = closeTarget; algorithm = algorithm == null ? MD5_ALGORITHM : algorithm; try { myDigest = MessageDigest.getInstance(algorithm); } catch (NoSuchAlgorithmException e) { } } public void write(int b) throws IOException { myDigest.update((byte) (b & 0xFF)); myTarget.write(b); } public void write(byte[] b) throws IOException { if (b != null) { myDigest.update(b); } myTarget.write(b); } public void write(byte[] b, int off, int len) throws IOException { if (b != null) { myDigest.update(b, off, len); } myTarget.write(b, off, len); } public void close() throws IOException { if (myDigestResult == null) { myDigestResult = myDigest.digest(); } if (myCloseTarget) { myTarget.close(); } } public String getDigest() { if (myDigestResult == null) { myDigestResult = myDigest.digest(); } return SVNFileUtil.toHexDigest(myDigestResult); } }