// Copyright 2015 Michel Kraemer
//
// 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 de.undercouch.gradle.tasks.download;

import java.io.File;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;

import org.gradle.api.DefaultTask;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.InputFile;
import org.gradle.api.tasks.Optional;
import org.gradle.api.tasks.TaskAction;

/**
 * Verifies a file's integrity by calculating its checksum.
 * <pre>
 * task verifyFile(type: Verify) {
 *     file new File(buildDir, "myfile.txt")
 *     algorithm 'MD5'
 *     checksum '694B2863621FCDBBBA2777BF329C056C' // expected checksum (hex)
 * }
 * </pre>
 * @author Michel Kraemer
 */
public class Verify extends DefaultTask implements VerifySpec {
    private final VerifyAction action;

    /**
     * Default constructor
     */
    public Verify() {
        action = new VerifyAction(getProject());
    }
    
    /**
     * Starts verifying
     * @throws IOException if the file could not be verified
     * @throws NoSuchAlgorithmException if the given algorithm is not available
     */
    @TaskAction
    public void verify() throws IOException, NoSuchAlgorithmException {
        action.execute();
    }

    @Override
    public void src(Object src) {
        action.src(src);
    }

    @Override
    public void algorithm(String algorithm) {
        action.algorithm(algorithm);
    }

    @Override
    public void checksum(String checksum) {
        action.checksum(checksum);
    }

    @InputFile
    @Override
    public File getSrc() {
        return action.getSrc();
    }

    @Input
    @Optional
    @Override
    public String getAlgorithm() {
        return action.getAlgorithm();
    }

    @Input
    @Override
    public String getChecksum() {
        return action.getChecksum();
    }
}