private Mapper parse(DocumentMapper mapper, DocumentMapperParser parser, XContentBuilder builder)
     throws Exception {
   Settings settings =
       Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT).build();
   ParseContext.InternalParseContext ctx =
       new ParseContext.InternalParseContext(settings, parser, mapper, new ContentPath(0));
   SourceToParse source = SourceToParse.source(builder.bytes());
   ctx.reset(XContentHelper.createParser(source.source()), new ParseContext.Document(), source);
   assertEquals(XContentParser.Token.START_OBJECT, ctx.parser().nextToken());
   ctx.parser().nextToken();
   DocumentParser.parseObjectOrNested(ctx, mapper.root(), true);
   Mapping mapping =
       DocumentParser.createDynamicUpdate(mapper.mapping(), mapper, ctx.getDynamicMappers());
   return mapping == null ? null : mapping.root();
 }
 public void close() {
   documentParser.close();
 }
 /**
  * Transform the source when it is expressed as a map. This is public so it can be transformed the
  * source is loaded.
  *
  * @param sourceAsMap source to transform. This may be mutated by the script.
  * @return transformed version of transformMe. This may actually be the same object as sourceAsMap
  */
 public Map<String, Object> transformSourceAsMap(Map<String, Object> sourceAsMap) {
   return DocumentParser.transformSourceAsMap(mapping, sourceAsMap);
 }
 public ParsedDocument parse(SourceToParse source) throws MapperParsingException {
   return documentParser.parseDocument(source);
 }