[
https://issues.apache.org/jira/browse/BEAM-8669?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17548288#comment-17548288
]
Danny McCormick commented on BEAM-8669:
---------------------------------------
This issue has been migrated to https://github.com/apache/beam/issues/19930
> Default methods not allowed in PipelineOptions
> ----------------------------------------------
>
> Key: BEAM-8669
> URL: https://issues.apache.org/jira/browse/BEAM-8669
> Project: Beam
> Issue Type: Bug
> Components: beam-model
> Affects Versions: 2.16.0
> Reporter: chris stockton
> Priority: P3
>
> If I create a class that extends PipelineOptions and contains a default
> method, the PipelineOptionsFactory will throw an exception because all
> non-static, non-synthetic and non-known methods need to have a getter and a
> setter.
> For example, these PipelineOptions
> {code:java}
> public interface MyOptions extends PipelineOptions {
> void setValue(String s);
> String getValue();
> default List<String> getValues() {
> return Arrays.asList(getValue().split(","));
> }
> }{code}
> will throw an exception in
> org.apache.beam.sdk.options.PipelineOptionsFactory.java:
> {code:java}
> private static void validateMethodsAreEitherBeanMethodOrKnownMethod(
> Class<? extends PipelineOptions> iface,
> Class<? extends PipelineOptions> klass,
> List<PropertyDescriptor> descriptors) {
> ...
> // Verify that no additional methods are on an interface that aren't a bean
> property.
> // Because methods can have multiple declarations, we do a name-based
> comparison
> // here to prevent false positives.
> SortedSet<Method> unknownMethods = new TreeSet<>(MethodComparator.INSTANCE);
> unknownMethods.addAll(
> Sets.filter(
> Sets.difference(Sets.newHashSet(iface.getMethods()), knownMethods),
> Predicates.and(
> NOT_SYNTHETIC_PREDICATE,
> input -> !knownMethodsNames.contains(input.getName()),
> NOT_STATIC_PREDICATE)));
> checkArgument(
> unknownMethods.isEmpty(),
> "Methods %s on [%s] do not conform to being bean properties.",
>
> FluentIterable.from(unknownMethods).transform(ReflectHelpers.METHOD_FORMATTER),
> iface.getName());
> }{code}
> Having a NOT_DEFAULT_PREDICATE in addition to the other predicates would
> allow
> {code:java}
> private static final Predicate<Method> NOT_DEFAULT_PREDICATE = input ->
> !input.isDefault();
> {code}
> Seems like it would do the trick.
--
This message was sent by Atlassian Jira
(v8.20.7#820007)