/*
 * Copyright  1999-2004 The Apache Software Foundation.
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 */
package org.apache.xml.security.utils;

import java.io.ByteArrayOutputStream;

import org.apache.xml.security.algorithms.MessageDigestAlgorithm;

/**
 * @author raul
 *
 */
public class DigesterOutputStream extends ByteArrayOutputStream {
    final static byte none[]="error".getBytes();
    final MessageDigestAlgorithm mda;
	/**
	 * @param mda
	 */
	public DigesterOutputStream(MessageDigestAlgorithm mda) {
        this.mda=mda;		
	}

    /** @inheritDoc */ 
	public byte[] toByteArray() {
		// TODO Auto-generated method stub
		return none;
	}
    
	/** @inheritDoc */
	public void write(byte[] arg0) {
		// TODO Auto-generated method stub
		mda.update(arg0);
	}
    
    /** @inheritDoc */
	public void write(int arg0) {
		mda.update((byte)arg0);
	}
    
    /** @inheritDoc */
	public void write(byte[] arg0, int arg1, int arg2) {
		// TODO Auto-generated method stub
		mda.update(arg0, arg1, arg2);
	}
    
    /**
     * @return the digest value 
     */
    public byte[] getDigestValue() {
         return mda.digest();   
    }
}
