test_class.file: core/src/test/java/net/adamcin/oakpal/core/checks/JcrPropertiesTest.java
test_class.identifier: JcrPropertiesTest
test_class.superclass: extends ProgressCheckTestBase
test_case.body: @Test
      public void testDenyIfMultivalued() throws Exception {
          File playground = TestPackageUtil.prepareTestPackageFromFolder("playground.zip",
                  new File("src/test/resources/jcr_prop_constraints_playground"));
          TestUtil.testBlock(() -> {
              ProgressCheck check = new JcrProperties().newInstance(obj()
                      .key("properties", arr()
                              .val(obj()
                                      .key("name", "singleString")
                                      .key("denyIfMultivalued", true)
                              )
                      )
                      .get());
              CheckReport report = scanWithCheck(check, playground);
              // only /apps/acme has the incorrect singleString property
              Assert.assertEquals("one violation: " + report.getViolations(), 1, report.getViolations().size());
          });
      }
test_case.class_method_signature: JcrPropertiesTest.testDenyIfMultivalued()
test_case.full_signature: @Test public void testDenyIfMultivalued()
test_case.identifier: testDenyIfMultivalued
test_case.invocations: prepareTestPackageFromFolder testBlock newInstance get key obj val arr key key obj scanWithCheck assertEquals getViolations size getViolations
test_case.modifiers: @Test public
test_case.parameters: ()
test_case.return: void
test_case.signature: void testDenyIfMultivalued()
focal_class.declarator: KEYS = new JsonKeys() {
          @Override
          public String scopePaths() {
              return "scopePaths";
          }
  
          @Override
          public String denyNodeTypes() {
              return "denyNodeTypes";
          }
  
          @Override
          public String scopeNodeTypes() {
              return "scopeNodeTypes";
          }
  
          @Override
          public String properties() {
              return "properties";
          }
      }
focal_class.modifier: private static final
focal_class.original_string: private static final JsonKeys KEYS = new JsonKeys() {
          @Override
          public String scopePaths() {
              return "scopePaths";
          }
  
          @Override
          public String denyNodeTypes() {
              return "denyNodeTypes";
          }
  
          @Override
          public String scopeNodeTypes() {
              return "scopeNodeTypes";
          }
  
          @Override
          public String properties() {
              return "properties";
          }
      };
focal_class.type: JsonKeys
focal_class.var_name: KEYS
focal_class.declarator: CONFIG_SCOPE_PATHS = keys().scopePaths()
focal_class.modifier: @Deprecated
      public static final
focal_class.original_string: @Deprecated
      public static final String CONFIG_SCOPE_PATHS = keys().scopePaths();
focal_class.type: String
focal_class.var_name: CONFIG_SCOPE_PATHS
focal_class.declarator: CONFIG_DENY_NODE_TYPES = keys().denyNodeTypes()
focal_class.modifier: @Deprecated
      public static final
focal_class.original_string: @Deprecated
      public static final String CONFIG_DENY_NODE_TYPES = keys().denyNodeTypes();
focal_class.type: String
focal_class.var_name: CONFIG_DENY_NODE_TYPES
focal_class.declarator: CONFIG_SCOPE_NODE_TYPES = keys().scopeNodeTypes()
focal_class.modifier: @Deprecated
      public static final
focal_class.original_string: @Deprecated
      public static final String CONFIG_SCOPE_NODE_TYPES = keys().scopeNodeTypes();
focal_class.type: String
focal_class.var_name: CONFIG_SCOPE_NODE_TYPES
focal_class.declarator: CONFIG_PROPERTIES = keys().properties()
focal_class.modifier: @Deprecated
      public static final
focal_class.original_string: @Deprecated
      public static final String CONFIG_PROPERTIES = keys().properties();
focal_class.type: String
focal_class.var_name: CONFIG_PROPERTIES
focal_class.file: core/src/main/java/net/adamcin/oakpal/core/checks/JcrProperties.java
focal_class.identifier: JcrProperties
focal_class.interfaces: implements ProgressCheckFactory
focal_class.class_method_signature: JcrProperties.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: JcrProperties.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_method.body: @Override
      public ProgressCheck newInstance(final JsonObject config) {
          List<Rule> pathScope = Rules.fromJsonArray(arrayOrEmpty(config, keys().scopePaths()));
  
          List<String> denyNodeTypes = mapArrayOfStrings(arrayOrEmpty(config, keys().denyNodeTypes()));
          List<String> nodeTypeScope = mapArrayOfStrings(arrayOrEmpty(config, keys().scopeNodeTypes()));
          final ResourceBundleHolder resourceBundleHolder = new ResourceBundleHolder();
          List<JcrPropertyConstraints> propertyChecks = JcrPropertyConstraints
                  .fromJsonArray(resourceBundleHolder::getResourceBundle, arrayOrEmpty(config, keys().properties()));
          return new Check(pathScope, denyNodeTypes, nodeTypeScope, propertyChecks, resourceBundleHolder);
      }
focal_method.class_method_signature: JcrProperties.newInstance(final JsonObject config)
focal_method.full_signature: @Override public ProgressCheck newInstance(final JsonObject config)
focal_method.identifier: newInstance
focal_method.invocations: fromJsonArray arrayOrEmpty scopePaths keys mapArrayOfStrings arrayOrEmpty denyNodeTypes keys mapArrayOfStrings arrayOrEmpty scopeNodeTypes keys fromJsonArray arrayOrEmpty properties keys
focal_method.modifiers: @Override public
focal_method.parameters: (final JsonObject config)
focal_method.return: ProgressCheck
focal_method.signature: ProgressCheck newInstance(final JsonObject config)