public PropertyExtractorAnnotation Build(ISchemaAnnotationReader schemaAnnotationReader)
 {
     if (schemaAnnotationReader == null)
     {
         throw new ArgumentNullException(nameof(schemaAnnotationReader));
     }
     Extractors = schemaAnnotationReader.GetAnnotationElement("Properties").IfNotNull(
         p => {
         var extractorCollection = new PropertyExtractorCollection();
         extractorCollection.ReadXml(p.CreateReader());
         return(extractorCollection);
     })
                  ?? PropertyExtractorCollection.Empty;
     return(this);
 }
        public static ISchemaAnnotations Create(ISchemaMetadata metadata)
        {
            if (metadata == null)
            {
                throw new ArgumentNullException("metadata");
            }

            if (metadata.Type.Assembly.FullName.StartsWith("Microsoft.", StringComparison.Ordinal))
            {
                return(Empty);
            }

            var annotations = SelectAnnotations(metadata);

            if (!annotations.Any())
            {
                return(Empty);
            }

            var envelopeMap = metadata.IsEnvelopeSchema
                                ? annotations
                              .SingleOrDefault(e => e.Name.LocalName == "EnvelopeMapSpecName")
                              .IfNotNull(e => e.Value)
                              .IfNotNull(n => Type.GetType(n, true))
                                : null;

            var extractors = annotations
                             .SingleOrDefault(e => e.Name.LocalName == "Properties")
                             .IfNotNull(
                p => {
                var extractorCollection = new PropertyExtractorCollection();
                extractorCollection.ReadXml(p.CreateReader());
                return(extractorCollection);
            })
                             ?? PropertyExtractorCollection.Empty;

            return(new SchemaAnnotations {
                EnvelopingMap = envelopeMap,
                Extractors = extractors
            });
        }