test_class.declarator: resolver = new DefaultNamePathResolver(JsonCnd.BUILTIN_MAPPINGS)
test_class.modifier: private final
test_class.original_string: private final NamePathResolver resolver = new DefaultNamePathResolver(JsonCnd.BUILTIN_MAPPINGS);
test_class.type: NamePathResolver
test_class.var_name: resolver
test_class.declarator: emptyPrivileges = new Privilege[0]
test_class.modifier: static final
test_class.original_string: static final Privilege[] emptyPrivileges = new Privilege[0];
test_class.type: Privilege[]
test_class.var_name: emptyPrivileges
test_class.file: core/src/test/java/net/adamcin/oakpal/core/checks/ExpectAcesTest.java
test_class.identifier: ExpectAcesTest
test_case.body: @Test
      public void testSuppressAfterExtractViolationIfExpectationSatisfiedAfterScanPackage_multipleViolators() throws Exception {
          final String foo1 = "/foo1";
          final String foo2 = "/foo2";
  
          final PackageId container = PackageId.fromString("container");
          final PackageId embed1 = PackageId.fromString("embed1");
          SlingInstallable installable1 = mock(SlingInstallable.class);
          when(installable1.getParentId()).thenReturn(embed1);
          EmbeddedPackageInstallable epInstallable1 = new EmbeddedPackageInstallable(container, "", embed1);
          final PackageId embed2 = PackageId.fromString("embed2");
          SlingInstallable installable2 = mock(SlingInstallable.class);
          when(installable2.getParentId()).thenReturn(embed2);
          EmbeddedPackageInstallable epInstallable2 = new EmbeddedPackageInstallable(container, "", embed2);
          final PackageId embed3 = PackageId.fromString("embed3");
          SlingInstallable installable3 = mock(SlingInstallable.class);
          when(installable3.getParentId()).thenReturn(embed3);
          EmbeddedPackageInstallable epInstallable3 = new EmbeddedPackageInstallable(container, "", embed3);
  
          final Principal principal = new PrincipalImpl("nouser");
          final List<String> repoInits = Arrays.asList(
                  "create service user nouser",
                  "create path (nt:folder) /foo1",
                  "set ACL on /foo1",
                  "  allow jcr:read for nouser",
                  "end",
                  "create path (nt:folder) /foo2",
                  "set ACL on /foo2",
                  "  allow jcr:read for nouser",
                  "end"
          );
  
          final ExpectAces.Check check1 = checkFor(obj()
                  .key(ExpectAces.keys().principal(), "nouser")
                  .key(ExpectAces.keys().expectedAces(), arr()
                          .val("type=allow;path=/foo1;privileges=jcr:read")
                          .val("type=allow;path=/foo1;privileges=rep:write")
                  )
                  .get());
          new OakpalPlan.Builder(null, null)
                  .withRepoInits(repoInits)
                  .build().toOakMachineBuilder(null, getClass().getClassLoader()).build()
                  .adminInitAndInspect(session -> {
  
                      check1.startedScan();
                      check1.identifyPackage(container, null);
                      check1.afterExtract(container, session);
                      check1.beforeSlingInstall(container, epInstallable1, session);
                      check1.identifyEmbeddedPackage(embed1, container, epInstallable1);
                      check1.afterExtract(embed1, session);
                      check1.beforeSlingInstall(container, epInstallable2, session);
                      check1.identifyEmbeddedPackage(embed2, container, epInstallable2);
                      check1.afterExtract(embed2, session);
                      check1.beforeSlingInstall(container, epInstallable3, session);
                      check1.identifyEmbeddedPackage(embed3, container, epInstallable3);
                      check1.afterExtract(embed3, session);
                      check1.beforeSlingInstall(container, installable1, session);
                      check1.beforeSlingInstall(container, installable2, session);
                      check1.beforeSlingInstall(container, installable3, session);
                      check1.afterScanPackage(container, session);
                      check1.finishedScan();
                  });
  
          Assert.assertEquals("expected violation count", 1,
                  check1.getReportedViolations().stream()
                          .filter(viol -> viol.getDescription().startsWith("expected: ")).count());
          Assert.assertEquals("expected violated spec ends with rep:write", 1,
                  check1.getReportedViolations().stream()
                          .filter(viol -> viol.getDescription().startsWith("expected: ")
                                  && viol.getDescription().contains("/foo1")
                                  && viol.getDescription().endsWith("rep:write")).count());
          Assert.assertEquals("no unexpected violations", 0,
                  check1.getReportedViolations().stream()
                          .filter(viol -> viol.getDescription().startsWith("unexpected: ")).count());
          final Violation exViolation1 = check1.getReportedViolations().stream().findFirst().get();
          assertEquals("expected violators",
                  Stream.of(container).collect(Collectors.toSet()),
                  new HashSet<>(exViolation1.getPackages()));
  
          new OakpalPlan.Builder(null, null)
                  .withRepoInits(repoInits)
                  .build().toOakMachineBuilder(null, getClass().getClassLoader()).build()
                  .adminInitAndInspect(session -> {
                      check1.startedScan();
                      check1.identifyPackage(container, null);
                      check1.afterExtract(container, session);
                      check1.beforeSlingInstall(container, epInstallable1, session);
                      check1.identifyEmbeddedPackage(embed1, container, epInstallable1);
                      resetAcl(session.getNode(foo1), (acl, privMan) -> {
                          Stream.of(acl.getAccessControlEntries())
                                  .filter(composeTest1(AccessControlEntry::getPrincipal, principal::equals))
                                  .forEachOrdered(uncheckVoid1(acl::removeAccessControlEntry));
                          acl.addEntry(principal, new Privilege[]{privMan.getPrivilege("rep:write")}, true);
                      });
                      check1.afterExtract(embed1, session);
                      check1.beforeSlingInstall(container, epInstallable2, session);
                      check1.identifyEmbeddedPackage(embed2, container, epInstallable2);
                      check1.afterExtract(embed2, session);
                      check1.beforeSlingInstall(container, epInstallable3, session);
                      check1.identifyEmbeddedPackage(embed3, container, epInstallable3);
                      check1.afterExtract(embed3, session);
                      check1.beforeSlingInstall(container, installable1, session);
                      check1.beforeSlingInstall(container, installable2, session);
                      check1.beforeSlingInstall(container, installable3, session);
                      check1.afterScanPackage(container, session);
                      check1.finishedScan();
                  });
  
          Assert.assertEquals("expected violation count", 1,
                  check1.getReportedViolations().stream()
                          .filter(viol -> viol.getDescription().startsWith("expected: ")).count());
          Assert.assertEquals("expected violated spec ends with jcr:read", 1,
                  check1.getReportedViolations().stream()
                          .filter(viol -> viol.getDescription().startsWith("expected: ")
                                  && viol.getDescription().contains("/foo1")
                                  && viol.getDescription().endsWith("jcr:read")).count());
          Assert.assertEquals("no unexpected violations", 0,
                  check1.getReportedViolations().stream()
                          .filter(viol -> viol.getDescription().startsWith("unexpected: ")).count());
          final Violation exViolation2 = check1.getReportedViolations().stream().findFirst().get();
          assertEquals("expected violators",
                  Stream.of(embed1, container).collect(Collectors.toSet()),
                  new HashSet<>(exViolation2.getPackages()));
  
          final ExpectAces.Check check2 = checkFor(obj()
                  .key(ExpectAces.keys().principal(), "nouser")
                  .key(ExpectAces.keys().notExpectedAces(), arr()
                          .val("type=allow;path=/foo2;privileges=jcr:read")
                          .val("type=allow;path=/foo2;privileges=rep:write")
                          // foo3 is not created. a non-existent path should satisfy not-expected aces
                          .val("type=allow;path=/foo3;privileges=rep:write")
                  )
                  .get());
          new OakpalPlan.Builder(null, null)
                  .withRepoInits(repoInits)
                  .build().toOakMachineBuilder(null, getClass().getClassLoader()).build()
                  .adminInitAndInspect(session -> {
                      check2.startedScan();
                      check2.identifyPackage(container, null);
                      check2.afterExtract(container, session);
                      check2.beforeSlingInstall(embed1, epInstallable1, session);
                      check2.identifyEmbeddedPackage(embed1, container, epInstallable1);
                      check2.afterExtract(embed1, session);
                      check2.beforeSlingInstall(embed2, epInstallable2, session);
                      check2.identifyEmbeddedPackage(embed2, container, epInstallable2);
                      check2.afterExtract(embed2, session);
                      check2.beforeSlingInstall(embed3, epInstallable3, session);
                      check2.identifyEmbeddedPackage(embed3, container, epInstallable3);
                      check2.afterExtract(embed3, session);
                      check2.beforeSlingInstall(container, installable1, session);
                      check2.beforeSlingInstall(container, installable2, session);
                      check2.beforeSlingInstall(container, installable3, session);
                      check2.afterScanPackage(container, session);
                      check2.finishedScan();
                  });
  
          Assert.assertEquals("unexpected violation count", 1,
                  check2.getReportedViolations().stream()
                          .filter(viol -> viol.getDescription().startsWith("unexpected: ")).count());
          Assert.assertEquals("unexpected violated spec ends with jcr:read", 1,
                  check2.getReportedViolations().stream()
                          .filter(viol -> viol.getDescription().startsWith("unexpected: ")
                                  && viol.getDescription().contains("/foo2")
                                  && viol.getDescription().endsWith("jcr:read")).count());
          Assert.assertEquals("no expected violations", 0,
                  check2.getReportedViolations().stream()
                          .filter(viol -> viol.getDescription().startsWith("expected: ")).count());
          final Violation unViolation1 = check2.getReportedViolations().stream().findFirst().get();
          assertEquals("expected violators",
                  Stream.of(container).collect(Collectors.toSet()),
                  new HashSet<>(unViolation1.getPackages()));
  
          new OakpalPlan.Builder(null, null)
                  .withRepoInits(repoInits)
                  .build().toOakMachineBuilder(null, getClass().getClassLoader()).build()
                  .adminInitAndInspect(session -> {
                      check2.startedScan();
                      check2.identifyPackage(container, null);
                      resetAcl(session.getNode(foo2), (acl, priv) -> {
                          Stream.of(acl.getAccessControlEntries())
                                  .forEachOrdered(uncheckVoid1(acl::removeAccessControlEntry));
                      });
                      check2.afterExtract(container, session);
                      check2.beforeSlingInstall(embed1, epInstallable1, session);
                      check2.identifyEmbeddedPackage(embed1, container, epInstallable1);
                      resetAcl(session.getNode(foo2), (acl, priv) -> {
                          acl.addEntry(principal, Stream.of("rep:write")
                                  .map(uncheck1(priv::getPrivilege)).toArray(Privilege[]::new), true);
                      });
                      check2.afterExtract(embed1, session);
                      check2.beforeSlingInstall(embed2, epInstallable2, session);
                      check2.identifyEmbeddedPackage(embed2, container, epInstallable2);
                      check2.afterExtract(embed2, session);
                      check2.beforeSlingInstall(embed3, epInstallable3, session);
                      check2.identifyEmbeddedPackage(embed3, container, epInstallable3);
                      session.getNode(foo2).remove();
                      check2.afterExtract(embed3, session);
                      check2.beforeSlingInstall(container, installable1, session);
                      check2.beforeSlingInstall(container, installable2, session);
                      Node node3 = JcrUtils.getOrCreateByPath("/foo3", "nt:folder", session);
                      resetAcl(node3, (acl, priv) -> {
                          acl.addEntry(principal, new Privilege[]{priv.getPrivilege("rep:write")}, true);
                      });
                      check2.appliedRepoInitScripts(container, Collections.emptyList(), installable2, session);
                      check2.beforeSlingInstall(container, installable3, session);
                      check2.afterScanPackage(container, session);
                      check2.finishedScan();
                  });
  
  
          assertEquals("expect 2 unexpected violations", 2, check2.getReportedViolations().size());
          final Collection<Violation> unViolations = check2.getReportedViolations();
          assertTrue("all start with unexpected " + unViolations, unViolations.stream()
                  .allMatch(vio -> vio.getDescription().startsWith("unexpected: ")));
          assertEquals("one contains /foo2: " + unViolations, 1, unViolations.stream()
                  .filter(vio -> vio.getDescription().contains("/foo2")).count());
          assertEquals("one contains /foo3: " + unViolations, 1, unViolations.stream()
                  .filter(vio -> vio.getDescription().contains("/foo3")).count());
          assertEquals("expected violators of /foo2",
                  Stream.of(embed1).collect(Collectors.toSet()), unViolations.stream()
                          .filter(vio -> vio.getDescription().contains("/foo2"))
                          .flatMap(Fun.compose1(Violation::getPackages, Collection::stream))
                          .collect(Collectors.toSet()));
          assertEquals("expected violators of /foo3",
                  Stream.of(embed2, container).collect(Collectors.toSet()), unViolations.stream()
                          .filter(vio -> vio.getDescription().contains("/foo3"))
                          .flatMap(Fun.compose1(Violation::getPackages, Collection::stream))
                          .collect(Collectors.toSet()));
  
      }
test_case.class_method_signature: ExpectAcesTest.testSuppressAfterExtractViolationIfExpectationSatisfiedAfterScanPackage_multipleViolators()
test_case.full_signature: @Test public void testSuppressAfterExtractViolationIfExpectationSatisfiedAfterScanPackage_multipleViolators()
test_case.identifier: testSuppressAfterExtractViolationIfExpectationSatisfiedAfterScanPackage_multipleViolators
test_case.invocations: fromString fromString mock thenReturn when getParentId fromString mock thenReturn when getParentId fromString mock thenReturn when getParentId asList checkFor get key key obj principal keys expectedAces keys val val arr adminInitAndInspect build toOakMachineBuilder build withRepoInits getClassLoader getClass startedScan identifyPackage afterExtract beforeSlingInstall identifyEmbeddedPackage afterExtract beforeSlingInstall identifyEmbeddedPackage afterExtract beforeSlingInstall identifyEmbeddedPackage afterExtract beforeSlingInstall beforeSlingInstall beforeSlingInstall afterScanPackage finishedScan assertEquals count filter stream getReportedViolations startsWith getDescription assertEquals count filter stream getReportedViolations startsWith getDescription contains getDescription endsWith getDescription assertEquals count filter stream getReportedViolations startsWith getDescription get findFirst stream getReportedViolations assertEquals collect of toSet getPackages adminInitAndInspect build toOakMachineBuilder build withRepoInits getClassLoader getClass startedScan identifyPackage afterExtract beforeSlingInstall identifyEmbeddedPackage resetAcl getNode forEachOrdered filter of getAccessControlEntries composeTest1 uncheckVoid1 addEntry getPrivilege afterExtract beforeSlingInstall identifyEmbeddedPackage afterExtract beforeSlingInstall identifyEmbeddedPackage afterExtract beforeSlingInstall beforeSlingInstall beforeSlingInstall afterScanPackage finishedScan assertEquals count filter stream getReportedViolations startsWith getDescription assertEquals count filter stream getReportedViolations startsWith getDescription contains getDescription endsWith getDescription assertEquals count filter stream getReportedViolations startsWith getDescription get findFirst stream getReportedViolations assertEquals collect of toSet getPackages checkFor get key key obj principal keys notExpectedAces keys val val val arr adminInitAndInspect build toOakMachineBuilder build withRepoInits getClassLoader getClass startedScan identifyPackage afterExtract beforeSlingInstall identifyEmbeddedPackage afterExtract beforeSlingInstall identifyEmbeddedPackage afterExtract beforeSlingInstall identifyEmbeddedPackage afterExtract beforeSlingInstall beforeSlingInstall beforeSlingInstall afterScanPackage finishedScan assertEquals count filter stream getReportedViolations startsWith getDescription assertEquals count filter stream getReportedViolations startsWith getDescription contains getDescription endsWith getDescription assertEquals count filter stream getReportedViolations startsWith getDescription get findFirst stream getReportedViolations assertEquals collect of toSet getPackages adminInitAndInspect build toOakMachineBuilder build withRepoInits getClassLoader getClass startedScan identifyPackage resetAcl getNode forEachOrdered of getAccessControlEntries uncheckVoid1 afterExtract beforeSlingInstall identifyEmbeddedPackage resetAcl getNode addEntry toArray map of uncheck1 afterExtract beforeSlingInstall identifyEmbeddedPackage afterExtract beforeSlingInstall identifyEmbeddedPackage remove getNode afterExtract beforeSlingInstall beforeSlingInstall getOrCreateByPath resetAcl addEntry getPrivilege appliedRepoInitScripts emptyList beforeSlingInstall afterScanPackage finishedScan assertEquals size getReportedViolations getReportedViolations assertTrue allMatch stream startsWith getDescription assertEquals count filter stream contains getDescription assertEquals count filter stream contains getDescription assertEquals collect of toSet collect flatMap filter stream contains getDescription compose1 toSet assertEquals collect of toSet collect flatMap filter stream contains getDescription compose1 toSet
test_case.modifiers: @Test public
test_case.parameters: ()
test_case.return: void
test_case.signature: void testSuppressAfterExtractViolationIfExpectationSatisfiedAfterScanPackage_multipleViolators()
focal_class.declarator: KEYS = new JsonKeys() {
          @Override
          public String principal() {
              return "principal";
          }
  
          @Override
          public String principals() {
              return "principals";
          }
  
          @Override
          public String expectedAces() {
              return "expectedAces";
          }
  
          @Override
          public String notExpectedAces() {
              return "notExpectedAces";
          }
  
          @Override
          public String afterPackageIdRules() {
              return "afterPackageIdRules";
          }
  
          @Override
          public String severity() {
              return "severity";
          }
  
          @Override
          public String type() {
              return "type";
          }
  
          @Override
          public String privileges() {
              return "privileges";
          }
  
          @Override
          public String path() {
              return "path";
          }
      }
focal_class.modifier: private static final
focal_class.original_string: private static final JsonKeys KEYS = new JsonKeys() {
          @Override
          public String principal() {
              return "principal";
          }
  
          @Override
          public String principals() {
              return "principals";
          }
  
          @Override
          public String expectedAces() {
              return "expectedAces";
          }
  
          @Override
          public String notExpectedAces() {
              return "notExpectedAces";
          }
  
          @Override
          public String afterPackageIdRules() {
              return "afterPackageIdRules";
          }
  
          @Override
          public String severity() {
              return "severity";
          }
  
          @Override
          public String type() {
              return "type";
          }
  
          @Override
          public String privileges() {
              return "privileges";
          }
  
          @Override
          public String path() {
              return "path";
          }
      };
focal_class.type: JsonKeys
focal_class.var_name: KEYS
focal_class.declarator: CONFIG_PRINCIPAL = keys().principal()
focal_class.modifier: @Deprecated
      public static final
focal_class.original_string: @Deprecated
      public static final String CONFIG_PRINCIPAL = keys().principal();
focal_class.type: String
focal_class.var_name: CONFIG_PRINCIPAL
focal_class.declarator: CONFIG_PRINCIPALS = keys().principals()
focal_class.modifier: @Deprecated
      public static final
focal_class.original_string: @Deprecated
      public static final String CONFIG_PRINCIPALS = keys().principals();
focal_class.type: String
focal_class.var_name: CONFIG_PRINCIPALS
focal_class.declarator: CONFIG_EXPECTED_ACES = keys().expectedAces()
focal_class.modifier: @Deprecated
      public static final
focal_class.original_string: @Deprecated
      public static final String CONFIG_EXPECTED_ACES = keys().expectedAces();
focal_class.type: String
focal_class.var_name: CONFIG_EXPECTED_ACES
focal_class.declarator: CONFIG_NOT_EXPECTED_ACES = keys().notExpectedAces()
focal_class.modifier: @Deprecated
      public static final
focal_class.original_string: @Deprecated
      public static final String CONFIG_NOT_EXPECTED_ACES = keys().notExpectedAces();
focal_class.type: String
focal_class.var_name: CONFIG_NOT_EXPECTED_ACES
focal_class.declarator: CONFIG_AFTER_PACKAGE_ID_RULES = keys().afterPackageIdRules()
focal_class.modifier: @Deprecated
      public static final
focal_class.original_string: @Deprecated
      public static final String CONFIG_AFTER_PACKAGE_ID_RULES = keys().afterPackageIdRules();
focal_class.type: String
focal_class.var_name: CONFIG_AFTER_PACKAGE_ID_RULES
focal_class.declarator: ACE_PARAM_TYPE = keys().type()
focal_class.modifier: @Deprecated
      public static final
focal_class.original_string: @Deprecated
      public static final String ACE_PARAM_TYPE = keys().type();
focal_class.type: String
focal_class.var_name: ACE_PARAM_TYPE
focal_class.declarator: ACE_PARAM_PRIVILEGES = keys().privileges()
focal_class.modifier: @Deprecated
      public static final
focal_class.original_string: @Deprecated
      public static final String ACE_PARAM_PRIVILEGES = keys().privileges();
focal_class.type: String
focal_class.var_name: ACE_PARAM_PRIVILEGES
focal_class.declarator: ACE_PARAM_PATH = keys().path()
focal_class.modifier: @Deprecated
      public static final
focal_class.original_string: @Deprecated
      public static final String ACE_PARAM_PATH = keys().path();
focal_class.type: String
focal_class.var_name: ACE_PARAM_PATH
focal_class.declarator: LOGGER = LoggerFactory.getLogger(ExpectAces.class)
focal_class.modifier: private static final
focal_class.original_string: private static final Logger LOGGER = LoggerFactory.getLogger(ExpectAces.class);
focal_class.type: Logger
focal_class.var_name: LOGGER
focal_class.declarator: DEFAULT_SEVERITY = Severity.MAJOR
focal_class.modifier: static final
focal_class.original_string: static final Severity DEFAULT_SEVERITY = Severity.MAJOR;
focal_class.type: Severity
focal_class.var_name: DEFAULT_SEVERITY
focal_class.declarator: DELIM_PARAM = ";"
focal_class.modifier: public static final
focal_class.original_string: public static final String DELIM_PARAM = ";";
focal_class.type: String
focal_class.var_name: DELIM_PARAM
focal_class.declarator: DELIM_VALUE = "="
focal_class.modifier: public static final
focal_class.original_string: public static final String DELIM_VALUE = "=";
focal_class.type: String
focal_class.var_name: DELIM_VALUE
focal_class.declarator: DELIM_LIST = ","
focal_class.modifier: public static final
focal_class.original_string: public static final String DELIM_LIST = ",";
focal_class.type: String
focal_class.var_name: DELIM_LIST
focal_class.file: core/src/main/java/net/adamcin/oakpal/core/checks/ExpectAces.java
focal_class.identifier: ExpectAces
focal_class.interfaces: implements ProgressCheckFactory
focal_class.class_method_signature: ExpectAces.keys()
focal_class.full_signature: @NotNull public static JsonKeys keys()
focal_class.identifier: keys
focal_class.modifiers: @NotNull public static
focal_class.parameters: ()
focal_class.return: JsonKeys
focal_class.signature: JsonKeys keys()
focal_class.class_method_signature: ExpectAces.newInstance(final JsonObject config)
focal_class.full_signature: @Override public ProgressCheck newInstance(final JsonObject config)
focal_class.identifier: newInstance
focal_class.modifiers: @Override public
focal_class.parameters: (final JsonObject config)
focal_class.return: ProgressCheck
focal_class.signature: ProgressCheck newInstance(final JsonObject config)
focal_class.class_method_signature: ExpectAces.isPrincipalSpec(final @NotNull String spec)
focal_class.full_signature: static boolean isPrincipalSpec(final @NotNull String spec)
focal_class.identifier: isPrincipalSpec
focal_class.modifiers: static
focal_class.parameters: (final @NotNull String spec)
focal_class.return: boolean
focal_class.signature: boolean isPrincipalSpec(final @NotNull String spec)
focal_class.class_method_signature: ExpectAces.isGeneralSpec(final @NotNull String spec)
focal_class.full_signature: static boolean isGeneralSpec(final @NotNull String spec)
focal_class.identifier: isGeneralSpec
focal_class.modifiers: static
focal_class.parameters: (final @NotNull String spec)
focal_class.return: boolean
focal_class.signature: boolean isGeneralSpec(final @NotNull String spec)
focal_class.class_method_signature: ExpectAces.parseAceCriteria(final @NotNull JsonObject config,
                                                final @NotNull String[] principals,
                                                final @NotNull String key)
focal_class.full_signature: static List<AceCriteria> parseAceCriteria(final @NotNull JsonObject config,
                                                final @NotNull String[] principals,
                                                final @NotNull String key)
focal_class.identifier: parseAceCriteria
focal_class.modifiers: static
focal_class.parameters: (final @NotNull JsonObject config,
                                                final @NotNull String[] principals,
                                                final @NotNull String key)
focal_class.return: List<AceCriteria>
focal_class.signature: List<AceCriteria> parseAceCriteria(final @NotNull JsonObject config,
                                                final @NotNull String[] principals,
                                                final @NotNull String key)
focal_class.class_method_signature: ExpectAces.restrictionMatcher(final @NotNull JackrabbitAccessControlList acl,
                         final @NotNull RestrictionCriteria[] restrictionCriterias)
focal_class.full_signature: static Predicate<JackrabbitAccessControlEntry> restrictionMatcher(final @NotNull JackrabbitAccessControlList acl,
                         final @NotNull RestrictionCriteria[] restrictionCriterias)
focal_class.identifier: restrictionMatcher
focal_class.modifiers: static
focal_class.parameters: (final @NotNull JackrabbitAccessControlList acl,
                         final @NotNull RestrictionCriteria[] restrictionCriterias)
focal_class.return: Predicate<JackrabbitAccessControlEntry>
focal_class.signature: Predicate<JackrabbitAccessControlEntry> restrictionMatcher(final @NotNull JackrabbitAccessControlList acl,
                         final @NotNull RestrictionCriteria[] restrictionCriterias)
focal_method.body: @NotNull
      public static JsonKeys keys() {
          return KEYS;
      }
focal_method.class_method_signature: ExpectAces.keys()
focal_method.full_signature: @NotNull public static JsonKeys keys()
focal_method.identifier: keys
focal_method.modifiers: @NotNull public static
focal_method.parameters: ()
focal_method.return: JsonKeys
focal_method.signature: JsonKeys keys()