/*
* Jopr Management Platform
* Copyright (C) 2005-2008 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package com.jboss.jbossnetwork.product.jbpm.handlers;
import java.io.FileInputStream;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import org.jbpm.graph.exe.ExecutionContext;
import org.rhq.core.util.stream.StreamUtil;
/**
* @author Jason Dobies
*/
public class CompareDigestActionHandler extends BaseHandler {
/**
* The algorithm to use when calculating the digest (i.e. MD5). See Appendix A in the Java Cryptography Architecture
* API Specification & Reference for information about standard algorithm names.
*/
private String algorithm;
/**
* Location of the file being tested.
*/
private String fileToBeCheckedLocation;
/**
* This value is compared, ignoring case, with the calculated digest of the indicated file.
*/
private String expectedDigest;
public void run(ExecutionContext executionContext) {
try {
HandlerUtils.checkFilenameExists(fileToBeCheckedLocation);
HandlerUtils.checkFilenameIsAFile(fileToBeCheckedLocation);
HandlerUtils.checkFilenameIsReadable(fileToBeCheckedLocation);
verifyDigest();
complete(executionContext, "Successfully checked digest of ["
+ HandlerUtils.formatPath(fileToBeCheckedLocation) + "]. Confirmed to be [" + expectedDigest + "].");
} catch (Throwable e) {
error(executionContext, e, MESSAGE_NO_CHANGES, TRANSITION_ERROR);
}
}
public String getDescription() {
return "Calculate the digest of [" + HandlerUtils.formatPath(getFileToBeCheckedLocation()) + "] using the ["
+ getAlgorithm() + "] algorithm and check it matches [" + getExpectedDigest() + "].";
}
public void substituteVariables(ExecutionContext executionContext) throws ActionHandlerException {
setFileToBeCheckedLocation(substituteVariable(fileToBeCheckedLocation, executionContext));
setAlgorithm(substituteVariable(algorithm, executionContext));
setExpectedDigest(substituteVariable(expectedDigest, executionContext));
}
public void setPropertyDefaults() {
if (algorithm == null) {
setAlgorithm("MD5");
}
if (expectedDigest == null) {
setExpectedDigest("#{software.MD5}");
}
}
protected void checkProperties() throws ActionHandlerException {
HandlerUtils.checkIsSet("algorithm", algorithm);
HandlerUtils.checkIsSet("fileToBeCheckedLocation", fileToBeCheckedLocation);
HandlerUtils.checkIsSet("expectedDigest", expectedDigest);
}
private void verifyDigest() throws ActionHandlerException {
String actualDigest;
try {
actualDigest = calculateDigest();
} catch (Exception e) {
throw new ActionHandlerException("Failed trying to calculate digest of ["
+ HandlerUtils.formatPath(fileToBeCheckedLocation) + "]", e);
}
if (!expectedDigest.equalsIgnoreCase(actualDigest)) {
throw new ActionHandlerException("Digest of [" + HandlerUtils.formatPath(fileToBeCheckedLocation)
+ "] is [" + actualDigest + "] and does not match expected value [" + expectedDigest + "]");
}
}
private String calculateDigest() throws Exception {
MessageDigest messageDigest = MessageDigest.getInstance(algorithm);
DigestInputStream in = null;
try {
in = new DigestInputStream(new FileInputStream(fileToBeCheckedLocation), messageDigest);
byte[] buffer = new byte[4096];
while (in.read(buffer) != -1) {
}
} finally {
StreamUtil.safeClose(in);
}
String digest = HandlerUtils.encode(messageDigest.digest());
return digest;
}
public String getAlgorithm() {
return algorithm;
}
public void setAlgorithm(String algorithm) {
this.algorithm = algorithm;
}
public String getFileToBeCheckedLocation() {
return fileToBeCheckedLocation;
}
public void setFileToBeCheckedLocation(String fileToBeCheckedLocation) {
this.fileToBeCheckedLocation = fileToBeCheckedLocation;
}
public String getExpectedDigest() {
return expectedDigest;
}
public void setExpectedDigest(String expectedDigest) {
this.expectedDigest = expectedDigest;
}
}