You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@beam.apache.org by "Jeff Webb (Jira)" <ji...@apache.org> on 2021/09/14 20:22:00 UTC

[jira] [Updated] (BEAM-8669) Default methods not allowed in PipelineOptions

     [ https://issues.apache.org/jira/browse/BEAM-8669?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Jeff Webb updated BEAM-8669:
----------------------------
    Status: Open  (was: Triage Needed)

> 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.3.4#803005)