/**
* 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.tls.protocol;
import de.rub.nds.tlsattacker.modifiablevariable.ModifiableVariable;
import de.rub.nds.tlsattacker.util.RandomHelper;
import de.rub.nds.tlsattacker.util.ReflectionHelper;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.LinkedList;
import java.util.List;
/**
* @author Juraj Somorovsky <juraj.somorovsky@rub.de>
*/
public abstract class ModifiableVariableHolder implements Serializable {
/**
* Lists all the modifiable variables declared in the class
*
* @return
*/
public List<Field> getAllModifiableVariableFields() {
return ReflectionHelper.getFieldsUpTo(this.getClass(), null, ModifiableVariable.class);
}
/**
* Returns a random field representing a modifiable variable from this class
*
* @return
*/
public Field getRandomModifiableVariableField() {
List<Field> fields = getAllModifiableVariableFields();
int randomField = RandomHelper.getRandom().nextInt(fields.size());
return fields.get(randomField);
}
/**
* Returns a list of all the modifiable variable holders in the object,
* including this instance
*
* @return
*/
public List<ModifiableVariableHolder> getAllModifiableVariableHolders() {
List<ModifiableVariableHolder> holders = new LinkedList<>();
holders.add(this);
return holders;
}
/**
* Returns a random modifiable variable holder
*
* @return
*/
public ModifiableVariableHolder getRandomModifiableVariableHolder() {
List<ModifiableVariableHolder> holders = getAllModifiableVariableHolders();
int randomHolder = RandomHelper.getRandom().nextInt(holders.size());
return holders.get(randomHolder);
}
}