View Javadoc
1   package org.wikimedia.search.extra.superdetectnoop;
2   
3   import static org.wikimedia.search.extra.superdetectnoop.ChangeHandler.TypeSafe.nullAndTypeSafe;
4   
5   import javax.annotation.Nonnull;
6   
7   /**
8    * Checks if a number is different by some absolute amount.
9    */
10  public class WithinAbsoluteHandler implements ChangeHandler.NonnullChangeHandler<Number> {
11      public static class Recognizer implements ChangeHandler.Recognizer {
12          private static final String PREFIX = "within ";
13  
14          @Override
15          public ChangeHandler<Object> build(String description) {
16              if (!description.startsWith(PREFIX)) {
17                  return null;
18              }
19              try {
20                  double absoluteDifference = Double.parseDouble(description.substring(PREFIX.length(), description.length()));
21                  return nullAndTypeSafe(Number.class, new WithinAbsoluteHandler(absoluteDifference));
22              } catch (NumberFormatException e) {
23                  return null;
24              }
25          }
26      }
27  
28      private final double absoluteDifference;
29  
30      public WithinAbsoluteHandler(double absoluteDifference) {
31          this.absoluteDifference = absoluteDifference;
32      }
33  
34      @Override
35      public ChangeHandler.Result handle(@Nonnull Number oldValue, @Nonnull Number newValue) {
36          return ChangeHandler.Changed.forBoolean(Math.abs(newValue.doubleValue() - oldValue.doubleValue()) < absoluteDifference,
37                  newValue);
38      }
39  }