/*
* ====================================================================
* 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.io.diff;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.MessageDigest;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.internal.wc.SVNFileUtil;
/**
* The <b>SVNDiffWindowApplyBaton</b> class is used to provide the source
* and target streams during applying diff windows. Also an instance of
* <b>SVNDiffWindowApplyBaton</b> may be supplied with an MD5 digest object
* for on-the-fly updating it with the bytes of the target view. So that when
* a diff window's instructions are applied, the digest will be the checksum
* for the full expanded text written to the target stream during delta application.
*
* @version 1.3
* @author TMate Software Ltd.
* @since 1.2
*/
public class SVNDiffWindowApplyBaton {
InputStream mySourceStream;
OutputStream myTargetStream;
long mySourceViewOffset;
int mySourceViewLength;
int myTargetViewSize;
byte[] mySourceBuffer;
byte[] myTargetBuffer;
MessageDigest myDigest;
/**
* Creates a diff window apply baton whith source and target streams
* represented by files.
*
* @param source a source file (from where the source views would
* be taken)
* @param target a target file where the full text is written
* @param digest an MD5 checksum for the full text that would be
* updated after each instruction applying
* @return a new <b>SVNDiffWindowApplyBaton</b> object
* @throws SVNException
*/
public static SVNDiffWindowApplyBaton create(File source, File target, MessageDigest digest) throws SVNException {
SVNDiffWindowApplyBaton baton = new SVNDiffWindowApplyBaton();
baton.mySourceStream = source.exists() ? SVNFileUtil.openFileForReading(source) : SVNFileUtil.DUMMY_IN;
baton.myTargetStream = SVNFileUtil.openFileForWriting(target, true);
baton.mySourceBuffer = new byte[0];
baton.mySourceViewLength = 0;
baton.mySourceViewOffset = 0;
baton.myDigest = digest;
return baton;
}
/**
* Creates a diff window apply baton whith initial source and target streams.
*
* @param source a source input stream (from where the source
* views would be taken)
* @param target a target output stream where the full text is written
* @param digest an MD5 checksum for the full text that would be
* updated after each instruction applying
* @return a new <b>SVNDiffWindowApplyBaton</b> object
*/
public static SVNDiffWindowApplyBaton create(InputStream source, OutputStream target, MessageDigest digest) {
SVNDiffWindowApplyBaton baton = new SVNDiffWindowApplyBaton();
baton.mySourceStream = source;
baton.myTargetStream = target;
baton.mySourceBuffer = new byte[0];
baton.mySourceViewLength = 0;
baton.mySourceViewOffset = 0;
baton.myDigest = digest;
return baton;
}
private SVNDiffWindowApplyBaton() {
}
/**
* Closes the source and target streams, finalizes
* the checksum computation and returns it in a hex representation.
*
* @return an MD5 checksum in a hex representation.
*/
public String close() {
SVNFileUtil.closeFile(mySourceStream);
mySourceStream = null;
SVNFileUtil.closeFile(myTargetStream);
myTargetStream = null;
if (myDigest != null) {
MessageDigest d = myDigest;
myDigest = null;
return SVNFileUtil.toHexDigest(d);
}
return null;
}
}