@Override
  public void validate(
      final Processor<FullData, FullData> processor,
      final ProcessingReport report,
      final MessageBundle bundle,
      final FullData data)
      throws ProcessingException {
    final SchemaTree tree = data.getSchema();
    final JsonPointer schemaPointer = tree.getPointer();
    final JsonNode schemas = tree.getNode().get(keyword);
    final int size = schemas.size();
    final ObjectNode fullReport = FACTORY.objectNode();

    int nrSuccess = 0;
    ListProcessingReport subReport;
    JsonPointer ptr;
    FullData newData;

    for (int index = 0; index < size; index++) {
      subReport = new ListProcessingReport(report.getLogLevel(), LogLevel.FATAL);
      ptr = schemaPointer.append(JsonPointer.of(keyword, index));
      newData = data.withSchema(tree.setPointer(ptr));
      processor.process(subReport, newData);
      fullReport.put(ptr.toString(), subReport.asJson());
      if (subReport.isSuccess()) nrSuccess++;
    }

    if (nrSuccess != 1)
      report.error(
          newMsg(data, bundle, "err.draftv4.oneOf.fail")
              .putArgument("matched", nrSuccess)
              .putArgument("nrSchemas", size)
              .put("reports", fullReport));
  }
  private <T> void walkTree(
      final JsonPointer pwd,
      final SchemaTree tree,
      final SchemaListener<T> listener,
      final ProcessingReport report)
      throws ProcessingException {
    listener.enteringPath(pwd, report);
    final SchemaTree resolvedTree = resolveTree(tree, report);
    listener.visiting(resolvedTree, report);

    /*
     * Grab pointer collectors
     */
    final Map<String, PointerCollector> map = Maps.newTreeMap();

    map.putAll(collectors);
    map.keySet().retainAll(Sets.newHashSet(resolvedTree.getNode().fieldNames()));

    /*
     * Collect pointers to visit next
     */
    final List<JsonPointer> pointers = Lists.newArrayList();
    for (final PointerCollector collector : map.values()) collector.collect(pointers, resolvedTree);

    /*
     * Now, visit the collected set of pointers
     */
    for (final JsonPointer ptr : pointers) {
      walkTree(pwd.append(ptr), resolvedTree.append(ptr), listener, report);
    }
    listener.exitingPath(pwd, report);
  }