/** * Get an ordered list of {@link TransferPluginOption}s, given class a {@link TransferSettings} class. * * <p>This method uses the {@link Setup} and {@link Element} annotation, and their attributes * to sort the options. If no annotation is given or no order attribute is provided, the * option will be listed last. */ public static List<TransferPluginOption> getOrderedOptions(Class<? extends TransferSettings> transferSettingsClass) { return getOrderedOptions(transferSettingsClass, 0); }
private static List<TransferPluginOption> getOrderedOptions(Class<? extends TransferSettings> transferSettingsClass, int level) { List<Field> fields = getOrderedFields(transferSettingsClass); ImmutableList.Builder<TransferPluginOption> options = ImmutableList.builder(); for (Field field : fields) { TransferPluginOption option = getOptionFromField(field, transferSettingsClass, level); options.add(option); } return options.build(); }
private static TransferPluginOption getOptionFromField(Field field, Class<? extends TransferSettings> transferSettingsClass, int level) { Element elementAnnotation = field.getAnnotation(Element.class); Setup setupAnnotation = field.getAnnotation(Setup.class); boolean hasName = !elementAnnotation.name().equalsIgnoreCase(""); boolean hasDescription = setupAnnotation != null && !setupAnnotation.description().equals(""); boolean hasCallback = setupAnnotation != null && !setupAnnotation.callback().isInterface(); boolean hasConverter = setupAnnotation != null && !setupAnnotation.converter().isInterface(); boolean hasFileType = setupAnnotation != null && setupAnnotation.fileType() != null; String name = (hasName) ? elementAnnotation.name() : field.getName(); String description = (hasDescription) ? setupAnnotation.description() : field.getName(); FileType fileType = (hasFileType) ? setupAnnotation.fileType() : null; boolean required = elementAnnotation.required(); boolean sensitive = setupAnnotation != null && setupAnnotation.sensitive(); boolean singular = setupAnnotation != null && setupAnnotation.singular(); boolean visible = setupAnnotation != null && setupAnnotation.visible(); boolean encrypted = field.getAnnotation(Encrypted.class) != null; Class<? extends TransferPluginOptionCallback> callback = (hasCallback) ? setupAnnotation.callback() : null; Class<? extends TransferPluginOptionConverter> converter = (hasConverter) ? setupAnnotation.converter() : null; boolean isNestedOption = TransferSettings.class.isAssignableFrom(field.getType()); if (isNestedOption) { return createNestedOption(field, level, name, description, fileType, encrypted, sensitive, singular, visible, required, callback, converter); } else { return createNormalOption(field, transferSettingsClass, name, description, fileType, encrypted, sensitive, singular, visible, required, callback, converter); } }
@SuppressWarnings("unchecked") private static TransferPluginOption createNestedOption(Field field, int level, String name, String description, FileType fileType, boolean encrypted, boolean sensitive, boolean singular, boolean visible, boolean required, Class<? extends TransferPluginOptionCallback> callback, Class<? extends TransferPluginOptionConverter> converter) { if (++level > MAX_NESTED_LEVELS) { throw new RuntimeException("Plugin uses too many nested transfer settings (max allowed value: " + MAX_NESTED_LEVELS + ")"); } Class<? extends TransferSettings> fieldClass = (Class<? extends TransferSettings>) field.getType(); return new NestedTransferPluginOption(field, name, description, fieldClass, fileType, encrypted, sensitive, singular, visible, required, callback, converter, getOrderedOptions(fieldClass)); }
List<TransferPluginOption> pluginOptions = TransferPluginOptions.getOrderedOptions(settings.getClass());
@Test public void testGetOrderedOptionsWithAnotherDummyPlugin() { List<TransferPluginOption> orderedOptions = TransferPluginOptions.getOrderedOptions(AnotherDummyTransferSettings.class); assertEquals(4, orderedOptions.size()); assertEquals("noSetupAnnotation", orderedOptions.get(0).getName()); assertEquals("singularNonVisible", orderedOptions.get(1).getName()); assertEquals("someCallback", orderedOptions.get(2).getName()); assertEquals("someInvalidCallback", orderedOptions.get(3).getName()); }
@Test public void testGetOrderedOptionsWithDummyPlugin() { List<TransferPluginOption> orderedOptions = TransferPluginOptions.getOrderedOptions(DummyTransferSettings.class); assertEquals(6, orderedOptions.size()); assertEquals("foo", orderedOptions.get(0).getName()); assertEquals("number", orderedOptions.get(1).getName()); assertEquals("baz", orderedOptions.get(2).getName()); assertEquals("nest", orderedOptions.get(3).getName()); assertEquals("nest2", orderedOptions.get(4).getName()); assertEquals("enumField", orderedOptions.get(5).getName()); }
nestPrefix = nestPrefix + option.getName() + NESTED_OPTIONS_SEPARATOR; for (TransferPluginOption nestedOption : TransferPluginOptions.getOrderedOptions(childSettings.getClass())) { askPluginSettings(childSettings, nestedOption, knownPluginSettings, nestPrefix);