You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@beam.apache.org by "chris stockton (Jira)" <ji...@apache.org> on 2019/11/15 04:35:00 UTC

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

chris stockton created BEAM-8669:
------------------------------------

             Summary: 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


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)