/** * 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); } }