package hextostring.debug; import java.lang.reflect.Field; import java.util.List; import main.options.ValueClass; import main.options.annotations.CommandLineValue; import main.utils.ReflectionUtils; /** * Contains all the debugging flags. * * @author Maxime PIA */ public class DebuggingFlags implements ValueClass { // _global private static final String LINE_LIST_HEX_INPUT_CHAR = "g"; // input after _hexadecimal replacements private static final String LINE_LIST_HEX_AFTER_HEX_REPL_CHAR = "h"; // _transitory phase between hex & string private static final String LINE_LIST_HEX_AFTER_STR_REPL_CHAR = "t"; // _input private static final String LINE_HEX_INPUT_CHAR = "i"; // _validity private static final String LINE_VALIDITY_CHAR = "v"; // _details private static final String LINE_VALIDITY_DETAILS_CHAR = "d"; // _non formatted private static final String LINE_NON_FORMATTED_CHAR = "n"; // _ultimate phase before formatting private static final String LINE_NON_FORMATTED_AFTER_STR_REPL_CHAR = "u"; // _filtered out private static final String LINE_REJECTED_CHAR = "f"; // _encoding private static final String LINE_LIST_ENCODING_CHAR = "e"; // encoding _score private static final String LINE_LIST_ENCODING_VALIDITY_CHAR = "s"; // _reason for the score private static final String LINE_LIST_ENCODING_VALIDITY_DETAILS_CHAR = "r"; // e_xcluded encodings private static final String LINE_LIST_ENCODING_REJECTED_CHAR = "x"; @CommandLineValue( value = LINE_LIST_HEX_INPUT_CHAR, description = "Global hexadecimal inputs" ) public static final long LINE_LIST_HEX_INPUT = 1 << 0; @CommandLineValue( value = LINE_LIST_HEX_AFTER_HEX_REPL_CHAR, description = "Hexadecimal versions of the global input after " + "hexadecimal replacements" ) public static final long LINE_LIST_HEX_AFTER_HEX_REPL_INPUT = 1 << 1; @CommandLineValue( value = LINE_LIST_HEX_AFTER_STR_REPL_CHAR, description = "Transitory versions of the global input after " + "hexadecimal to string replacements" ) public static final long LINE_LIST_HEX_AFTER_STR_REPL_INPUT = 1 << 2; @CommandLineValue( value = LINE_HEX_INPUT_CHAR, description = "Hexadecimal versions of the converted lines" ) public static final long LINE_HEX_INPUT = 1 << 3; @CommandLineValue( value = LINE_VALIDITY_CHAR, description = "Validity mark of the lines" ) public static final long LINE_VALIDITY = 1 << 4; @CommandLineValue( value = LINE_VALIDITY_DETAILS_CHAR, description = "Details on the validity mark of the lines" ) public static final long LINE_VALIDITY_DETAILS = (1 << 5) | LINE_VALIDITY; @CommandLineValue( value = LINE_NON_FORMATTED_CHAR, description = "Non formatted version of the lines" ) public static final long LINE_NON_FORMATTED = 1 << 6; @CommandLineValue( value = LINE_NON_FORMATTED_AFTER_STR_REPL_CHAR, description = "Non formatted version of the lines after string " + "replacements" ) public static final long LINE_NON_FORMATTED_AFTER_STR_REPL = 1 << 7; @CommandLineValue( value = LINE_REJECTED_CHAR, description="Lines rejected due to their validity" ) public static final long LINE_REJECTED = 1 << 8; private static final String AUTODETECT_CONDITION = "Encoding detection is activated"; @CommandLineValue( value = LINE_LIST_ENCODING_CHAR, description = "Encoding detected for the converted lines", condition = AUTODETECT_CONDITION ) public static final long LINE_LIST_ENCODING = 1 << 9; @CommandLineValue( value = LINE_LIST_ENCODING_VALIDITY_CHAR, description = "Validity mark of the encoding detected for the converted lines", condition = AUTODETECT_CONDITION ) public static final long LINE_LIST_ENCODING_VALIDITY = 1 << 10; @CommandLineValue( value = LINE_LIST_ENCODING_VALIDITY_DETAILS_CHAR, description = "Details on the validity mark of the encoding detected " + "for the converted lines", condition = AUTODETECT_CONDITION ) public static final long LINE_LIST_ENCODING_VALIDITY_DETAILS = (1 << 11) | LINE_LIST_ENCODING_VALIDITY; @CommandLineValue( value = LINE_LIST_ENCODING_REJECTED_CHAR, description = "Lines converted with a rejected encoding", condition = AUTODETECT_CONDITION ) public static final long LINE_LIST_ENCODING_REJECTED = 1 << 12; /** * Gives the command line string values corresponding to an actual long * value. * * @param flags * The actual numeric value. * @return The command line string values equivalent of the argument. * @throws IllegalArgumentException * @throws IllegalAccessException */ public static String longToCmdFlags(long flags) throws IllegalArgumentException, IllegalAccessException { List<Field> flagFields = ReflectionUtils.getAnnotatedFields( DebuggingFlags.class, CommandLineValue.class ); StringBuilder sb = new StringBuilder(); for (Field flagField : flagFields) { long fieldValue = (Long) flagField.get(null); if ((flags & fieldValue) == fieldValue) { sb.append( flagField.getAnnotation(CommandLineValue.class).value() ); } } return sb.toString(); } }