blob: d47a8eb68343cae74fd804b101793a0b80bb4cad [file] [log] [blame]
/*
* Copyright (c) 2010-2012, 2015 Eike Stepper (Berlin, Germany) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.net4j.util.io;
import java.io.FilterWriter;
import java.io.IOException;
import java.io.Writer;
import java.security.MessageDigest;
/**
* @author Eike Stepper
* @since 3.1
*/
public class DigestWriter extends FilterWriter
{
private boolean on = true;
/**
* The message digest associated with this stream.
*/
protected MessageDigest digest;
/**
* Creates a digest writer, using the specified writer and message digest.
*
* @param writer
* the writer.
* @param digest
* the message digest to associate with this writer.
*/
public DigestWriter(Writer writer, MessageDigest digest)
{
super(writer);
setMessageDigest(digest);
}
/**
* Returns the message digest associated with this writer.
*
* @return the message digest associated with this writer.
* @see #setMessageDigest(java.security.MessageDigest)
*/
public MessageDigest getMessageDigest()
{
return digest;
}
/**
* Associates the specified message digest with this writer.
*
* @param digest
* the message digest to be associated with this writer.
* @see #getMessageDigest()
*/
public void setMessageDigest(MessageDigest digest)
{
this.digest = digest;
}
@Override
public void write(int c) throws IOException
{
if (on)
{
updateDigest(c);
}
out.write(c);
}
@Override
public void write(char cbuf[], int off, int len) throws IOException
{
if (on)
{
int end = off + len;
for (int i = off; i < end; i++)
{
updateDigest(cbuf[i]);
}
}
out.write(cbuf, off, len);
}
@Override
public void write(String str, int off, int len) throws IOException
{
if (on)
{
int end = off + len;
for (int i = off; i < end; i++)
{
updateDigest(str.charAt(i));
}
}
out.write(str, off, len);
}
private void updateDigest(int c)
{
digest.update((byte)(c >>> 8 & 0xFF));
digest.update((byte)(c >>> 0 & 0xFF));
}
/**
* Turns the digest function on or off. The default is on. When it is on, a call to one of the <code>write</code>
* methods results in an update on the message digest. But when it is off, the message digest is not updated.
*
* @param on
* true to turn the digest function on, false to turn it off.
*/
public void on(boolean on)
{
this.on = on;
}
/**
* Prints a string representation of this digest output stream and its associated message digest object.
*/
@Override
public String toString()
{
return "[Digest Writer] " + digest.toString();
}
}