@Override
  protected final void checkValue(
      final Collection<JsonPointer> pointers,
      final ProcessingReport report,
      final JsonSchemaTree tree)
      throws ProcessingException {
    final JsonNode node = getNode(tree);
    final Map<String, JsonNode> map = Maps.newTreeMap();
    map.putAll(JacksonUtils.asMap(node));

    String key;
    JsonNode value;

    for (final Map.Entry<String, JsonNode> entry : map.entrySet()) {
      key = entry.getKey();
      value = entry.getValue();
      if (value.isObject()) pointers.add(BASE_POINTER.append(key));
      else checkDependency(report, entry.getKey(), tree);
    }
  }
public abstract class DependenciesSyntaxChecker extends AbstractSyntaxChecker {
  private static final JsonPointer BASE_POINTER = JsonPointer.empty().append("dependencies");

  protected static final Equivalence<JsonNode> EQUIVALENCE = JsonSchemaEquivalence.getInstance();

  protected final EnumSet<NodeType> dependencyTypes;

  protected DependenciesSyntaxChecker(final NodeType... depTypes) {
    super("dependencies", NodeType.OBJECT);
    dependencyTypes = EnumSet.of(NodeType.OBJECT, depTypes);
  }

  @Override
  protected final void checkValue(
      final Collection<JsonPointer> pointers,
      final ProcessingReport report,
      final JsonSchemaTree tree)
      throws ProcessingException {
    final JsonNode node = getNode(tree);
    final Map<String, JsonNode> map = Maps.newTreeMap();
    map.putAll(JacksonUtils.asMap(node));

    String key;
    JsonNode value;

    for (final Map.Entry<String, JsonNode> entry : map.entrySet()) {
      key = entry.getKey();
      value = entry.getValue();
      if (value.isObject()) pointers.add(BASE_POINTER.append(key));
      else checkDependency(report, entry.getKey(), tree);
    }
  }

  protected abstract void checkDependency(
      final ProcessingReport report, final String name, final JsonSchemaTree tree)
      throws ProcessingException;
}