/**
* TLS-Attacker - A Modular Penetration Testing Framework for TLS
*
* Copyright 2014-2016 Ruhr University Bochum / Hackmanit GmbH
*
* Licensed under Apache License 2.0
* http://www.apache.org/licenses/LICENSE-2.0
*/
package de.rub.nds.tlsattacker.modifiablevariable;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
/**
* The base abstract class for modifiable variables, including the getValue
* function.
*
* The class needs to be defined transient to allow propOrder definition in
* subclasses, see:
* http://blog.bdoughan.com/2011/06/ignoring-inheritance-with-xmltransient.html
*
* @author Juraj Somorovsky <juraj.somorovsky@rub.de>
* @param <E>
*/
@XmlRootElement
@XmlTransient
public abstract class ModifiableVariable<E> {
protected E originalValue;
private VariableModification<E> modification = null;
private boolean createRandomModification;
protected E assertEquals;
public ModifiableVariable() {
}
public void setModification(VariableModification<E> modification) {
this.modification = modification;
}
@XmlAnyElement(lax = true)
public VariableModification<E> getModification() {
return modification;
}
public E getValue() {
if (createRandomModification) {
createRandomModification();
createRandomModification = false;
}
if (modification != null) {
return modification.modify(originalValue);
}
return originalValue;
}
protected abstract void createRandomModification();
public void createRandomModificationAtRuntime() {
createRandomModification = true;
}
public abstract boolean isOriginalValueModified();
public abstract boolean validateAssertions();
public boolean containsAssertion() {
return (assertEquals != null);
}
}