package org.hotswap.agent.util.signature;
import org.hotswap.agent.javassist.ClassPool;
import org.hotswap.agent.javassist.CtClass;
import org.hotswap.agent.javassist.NotFoundException;
import org.hotswap.agent.logging.AgentLogger;
/**
* Checks if a Signature of a Class has changed
*
* @author Erki Ehtla, Vladimir Dvorak
*
*/
public class ClassSignatureComparerHelper {
private static AgentLogger LOGGER = AgentLogger.getLogger(ClassSignatureComparerHelper.class);
public static String getCtClassSignature(CtClass ctClass, ClassSignatureElement[] signatureElements) throws Exception {
CtClassSignature signature = new CtClassSignature(ctClass);
signature.addSignatureElements(signatureElements);
return signature.getValue();
}
public static String getJavaClassSignature(Class<?> clazz, ClassSignatureElement[] signatureElements) throws Exception {
JavaClassSignature signature = new JavaClassSignature(clazz);
signature.addSignatureElements(signatureElements);
return signature.getValue();
}
/**
* @param ctClass new CtClass definition
* @param clazz old Class definition
* @return is signature different
*/
public static boolean isDifferent(CtClass ctClass, Class<?> clazz, ClassSignatureElement[] signatureElements) {
try {
String sig1 = getCtClassSignature(ctClass, signatureElements);
String sig2 = getJavaClassSignature(clazz, signatureElements);
return !sig1.equals(sig2);
} catch (Exception e) {
LOGGER.error("Error reading siganture", e);
return false;
}
}
public static boolean isDifferent(Class<?> clazz1, Class<?> clazz2, ClassSignatureElement[] signatureElements) {
try {
String sig1 = getJavaClassSignature(clazz1, signatureElements);
String sig2 = getJavaClassSignature(clazz2, signatureElements);
return !sig1.equals(sig2);
} catch (Exception e) {
LOGGER.error("Error reading siganture", e);
return false;
}
}
/**
* @param clazz old Class definition
* @param cp ClassPool which should contain the new/compared definition
* @return is signature different
*/
public static boolean isPoolClassDifferent(Class<?> clazz, ClassPool cp, ClassSignatureElement[] signatureElements) {
try {
return isDifferent(cp.get(clazz.getName()), clazz, signatureElements);
} catch (NotFoundException e) {
LOGGER.error("Class not found ", e);
return false;
}
}
}