Provides a description context.
示例#1
0
        private IIriTemplate BuildTemplate(DescriptionContext context, OperationInfo <Verb> operation, IOperation operationDocumentation)
        {
            IEnumerable <ArgumentInfo> parameterMapping;
            var uriTemplate = _descriptionBuilder.GetOperationUrlTemplate(operation.UnderlyingMethod, out parameterMapping);

            if (String.IsNullOrEmpty(uriTemplate))
            {
                return(null);
            }

            IIriTemplate template         = null;
            var          templateUri      = operationDocumentation.Id.Uri.AddFragment("template");
            var          templateMappings = from mapping in parameterMapping where !(mapping.Source is FromBodyAttribute) select BuildTemplateMapping(context, templateUri, operation, mapping);

            foreach (var templateMapping in templateMappings)
            {
                if (template == null)
                {
                    template          = context.ApiDocumentation.Context.Create <IIriTemplate>(templateUri);
                    template.Template = uriTemplate;
                }

                template.Mappings.Add(templateMapping);
            }

            return(template);
        }
示例#2
0
        private static IClass BuildDatatypeDescription(DescriptionContext context, Uri uri)
        {
            var definition = context.ApiDocumentation.Context.Create <IClass>(new EntityId(uri));

            definition.Label = (uri.Fragment.Length > 1 ? uri.Fragment.Substring(1) : uri.Segments.Last());
            return(definition);
        }
示例#3
0
        private void BuildDescription(DescriptionContext context, IClass specializationType)
        {
            Uri graphUri = _namedGraphSelectorFactory.NamedGraphSelector.SelectGraph(specializationType.Id, null, null);

            context.ApiDocumentation.SupportedClasses.Add(specializationType);
            var description = _descriptionBuilder.BuildDescriptor();

            foreach (OperationInfo <Verb> operation in description.Operations)
            {
                IIriTemplate template;
                var          operationDefinition = BuildOperation(context, operation, out template);
                IResource    operationOwner      = DetermineOperationOwner(operation, context, specializationType);
                if (template != null)
                {
                    ITemplatedLink templatedLink = context.ApiDocumentation.Context.Create <ITemplatedLink>(template.Id.Uri.AbsoluteUri.Replace("#template", "#withTemplate"));
                    templatedLink.SupportedOperations.Add(operationDefinition);
                    context.ApiDocumentation.Context.Store.ReplacePredicateValues(
                        operationOwner.Id,
                        Node.ForUri(templatedLink.Id.Uri),
                        () => new[] { Node.ForUri(template.Id.Uri) },
                        graphUri,
                        CultureInfo.InvariantCulture);
                }
                else
                {
                    (operationOwner is ISupportedOperationsOwner ? ((ISupportedOperationsOwner)operationOwner).SupportedOperations : operationOwner.Operations).Add(operationDefinition);
                }
            }
        }
示例#4
0
        private static Rdfs.IProperty GetMappingProperty(DescriptionContext context, ParameterInfo parameter)
        {
            IClass description = context[context.Type];

            Rdfs.IProperty resultCandidate = null;
            IResource      parameterType   = null;

            foreach (var supportedProperty in description.SupportedProperties)
            {
                if (StringComparer.OrdinalIgnoreCase.Equals(supportedProperty.Property.Label, parameter.Name))
                {
                    return(supportedProperty.Property);
                }

                if (parameterType == null)
                {
                    parameterType = (context.ContainsType(parameter.ParameterType) ? context[parameter.ParameterType] : context.BuildTypeDescription());
                }

                if (supportedProperty.Property.Range.Any(range => (range.Id == parameterType.Id) ||
                                                         ((range is IClass) && (((IClass)range).SubClassOf.Any(subClass => subClass.Id == parameterType.Id)))))
                {
                    resultCandidate = supportedProperty.Property;
                }
            }

            return(resultCandidate);
        }
        /// <inheritdoc />
        public IClass BuildTypeDescription(DescriptionContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            bool requiresRdf;
            return BuildTypeDescription(context, out requiresRdf);
        }
示例#6
0
        /// <inheritdoc />
        public IClass BuildTypeDescription(DescriptionContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            bool requiresRdf;

            return(BuildTypeDescription(context, out requiresRdf));
        }
示例#7
0
        /// <inheritdoc />
        public IClass BuildTypeDescription(DescriptionContext context, out bool requiresRdf)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            if (context.ContainsType(context.Type))
            {
                return(context.BuildTypeDescription(out requiresRdf));
            }

            if (System.Reflection.TypeExtensions.IsEnumerable(context.Type))
            {
                if (context.Type.IsList())
                {
                    return(CreateListDefinition(context, out requiresRdf, context.Type.IsGenericList()));
                }

                return(CreateCollectionDefinition(context, out requiresRdf, context.Type.IsGenericEnumerable()));
            }

            requiresRdf = false;
            Type itemType = context.Type.GetItemType();

            if (TypeDescriptions.ContainsKey(itemType))
            {
                return(BuildDatatypeDescription(context, TypeDescriptions[itemType]));
            }

            var classUri = itemType.MakeUri();

            if (typeof(IEntity).IsAssignableFrom(itemType))
            {
                classUri    = context.ApiDocumentation.Context.Mappings.MappingFor(itemType).Classes.Select(item => item.Uri).FirstOrDefault() ?? classUri;
                requiresRdf = true;
            }

            IClass result = context.ApiDocumentation.Context.Create <IClass>(classUri);

            result.Label       = itemType.MakeTypeName(false, true);
            result.Description = _xmlDocProvider.GetDescription(itemType);
            if (typeof(EntityId).IsAssignableFrom(itemType))
            {
                context.Describe(result, requiresRdf);
                return(result);
            }

            context.Prescribe(result, requiresRdf);
            SetupProperties(context.ForType(itemType), result);
            context.Describe(result, requiresRdf);
            return(result);
        }
        /// <inheritdoc />
        public IClass BuildTypeDescription(DescriptionContext context, out bool requiresRdf)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            if (context.ContainsType(context.Type))
            {
                return context.BuildTypeDescription(out requiresRdf);
            }

            if (System.Reflection.TypeExtensions.IsEnumerable(context.Type))
            {
                if (context.Type.IsList())
                {
                    return CreateListDefinition(context, out requiresRdf, context.Type.IsGenericList());
                }

                return CreateCollectionDefinition(context, out requiresRdf, context.Type.IsGenericEnumerable());
            }

            requiresRdf = false;
            Type itemType = context.Type.GetItemType();
            if (TypeDescriptions.ContainsKey(itemType))
            {
                return BuildDatatypeDescription(context, TypeDescriptions[itemType]);
            }

            var classUri = itemType.MakeUri();
            if (typeof(IEntity).IsAssignableFrom(itemType))
            {
                classUri = context.ApiDocumentation.Context.Mappings.MappingFor(itemType).Classes.Select(item => item.Uri).FirstOrDefault() ?? classUri;
                requiresRdf = true;
            }

            IClass result = context.ApiDocumentation.Context.Create<IClass>(classUri);
            result.Label = itemType.MakeTypeName(false, true);
            result.Description = _xmlDocProvider.GetDescription(itemType);
            if (typeof(EntityId).IsAssignableFrom(itemType))
            {
                context.Describe(result, requiresRdf);
                return result;
            }

            context.Prescribe(result, requiresRdf);
            SetupProperties(context.ForType(itemType), result);
            context.Describe(result, requiresRdf);
            return result;
        }
示例#9
0
        private IClass CreateCollectionDefinition(DescriptionContext context, out bool requiresRdf, out Type itemType, bool isGeneric = true)
        {
            var result = CreateEnumerableDefinition(context, context.ApiDocumentation.Context.Mappings.MappingFor <ICollection>().Classes.First().Uri, out requiresRdf, out itemType, isGeneric);

            if (!isGeneric)
            {
                return(result);
            }

            var memberType = (context.ContainsType(itemType) ? context[itemType] : BuildTypeDescription(context.ForType(itemType), out requiresRdf));

            result.SubClassOf.Add(result.CreateRestriction(context.ApiDocumentation.Context.Mappings.MappingFor <ICollection>().PropertyFor("Members").Uri, memberType));
            return(result);
        }
示例#10
0
        internal IResource DetermineOperationOwner(OperationInfo <Verb> operation, DescriptionContext context, IClass specializationType)
        {
            IResource    result = specializationType;
            PropertyInfo matchingProperty;

            if ((!typeof(IReadController <,>).IsAssignableFromSpecificGeneric(_descriptionBuilder.BuildDescriptor().ControllerType)) ||
                ((matchingProperty = operation.UnderlyingMethod.MatchesPropertyOf(context.Type, typeof(IControlledEntity <>).GetProperties().First().Name)) == null))
            {
                return(result);
            }

            var propertyId = context.TypeDescriptionBuilder.GetSupportedPropertyId(matchingProperty, context.Type);

            return(context.ApiDocumentation.Context.Load <ISupportedProperty>(propertyId));
        }
示例#11
0
        /// <inheritdoc />
        public IClass SubClass(DescriptionContext context, IClass @class, Type contextTypeOverride = null)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            if (@class == null)
            {
                throw new ArgumentNullException("class");
            }

            IClass result = context.ApiDocumentation.Context.Create <IClass>(@class.CreateBlankId());

            result.SubClassOf.Add(@class);
            return(result);
        }
示例#12
0
        private IClass CreateListDefinition(DescriptionContext context, out bool requiresRdf, bool isGeneric = true)
        {
            Type itemType;
            var  result = CreateCollectionDefinition(context, out requiresRdf, out itemType, isGeneric);

            if (!isGeneric)
            {
                return(result);
            }

            var memberType = (context.ContainsType(itemType) ? context[itemType] : BuildTypeDescription(context.ForType(itemType), out requiresRdf));

            result.SubClassOf.Add(context.ApiDocumentation.Context.Create <IClass>(Rdf.List));
            result.SubClassOf.Add(result.CreateRestriction(Rdf.first, memberType));
            result.SubClassOf.Add(result.CreateRestriction(Rdf.rest, result));
            return(result);
        }
示例#13
0
        /// <summary>Builds an API description.</summary>
        /// <param name="apiDocumentation">API documentation.</param>
        /// <param name="profiles">Requested media type profiles.</param>
        public void BuildDescription(IApiDocumentation apiDocumentation, IEnumerable <Uri> profiles)
        {
            if (apiDocumentation == null)
            {
                throw new ArgumentNullException("apiDocumentation");
            }

            if (SpecializationType == typeof(object))
            {
                return;
            }

            var    typeDescriptionBuilder = GetTypeDescriptionBuilder(profiles);
            var    context            = DescriptionContext.ForType(apiDocumentation, SpecializationType, typeDescriptionBuilder);
            IClass specializationType = context.BuildTypeDescription();

            BuildDescription(context, specializationType);
        }
示例#14
0
        private IClass CreateEnumerableDefinition(DescriptionContext context, Uri baseType, out bool requiresRdf, out Type itemType, bool isGeneric = true)
        {
            itemType    = null;
            requiresRdf = false;
            if (!isGeneric)
            {
                return(context.ApiDocumentation.Context.Create <IClass>(baseType));
            }

            itemType = context.Type.GetItemType();
            IClass result = context.ApiDocumentation.Context.Create <IClass>(context.Type.MakeUri());

            result.Label       = context.Type.MakeTypeName(false, true);
            result.Description = _xmlDocProvider.GetDescription(context.Type);
            result.SubClassOf.Add(context.ApiDocumentation.Context.Create <IClass>(baseType));
            requiresRdf |= context.RequiresRdf(itemType);
            context.Describe(result, requiresRdf);
            return(result);
        }
示例#15
0
        private ISupportedProperty BuildSupportedProperty(DescriptionContext context, IClass @class, Type declaringType, PropertyInfo property)
        {
            var propertyId  = GetSupportedPropertyId(property, declaringType);
            var propertyUri = (!typeof(IEntity).IsAssignableFrom(context.Type) ? @class.Id.Uri.AddName(property.Name) :
                               context.ApiDocumentation.Context.Mappings.MappingFor(context.Type).PropertyFor(property.Name).Uri);
            var result = context.ApiDocumentation.Context.Create <ISupportedProperty>(propertyId);

            result.Readable  = property.CanRead;
            result.Writeable = property.CanWrite;
            result.Required  = (property.PropertyType.IsValueType) || (property.GetCustomAttribute <RequiredAttribute>() != null);
            var isKeyProperty = (property.GetCustomAttribute <KeyAttribute>() != null) ||
                                (property.ImplementsGeneric(typeof(IControlledEntity <>), "Key"));

            result.Property = (isKeyProperty ?
                               context.ApiDocumentation.Context.Create <IInverseFunctionalProperty>(propertyUri) :
                               context.ApiDocumentation.Context.Create <IProperty>(propertyUri));
            result.Property.Label       = property.Name;
            result.Property.Description = _xmlDocProvider.GetDescription(property);
            result.Property.Domain.Add(@class);
            IClass propertyType;
            var    itemPropertyType = (System.Reflection.TypeExtensions.IsEnumerable(property.PropertyType) ? property.PropertyType : property.PropertyType.GetItemType());

            if (!context.ContainsType(itemPropertyType))
            {
                bool requiresRdf;
                var  childContext = context.ForType(itemPropertyType);
                propertyType = BuildTypeDescription(childContext, out requiresRdf);
                childContext.Describe(propertyType, requiresRdf);
            }
            else
            {
                propertyType = context[itemPropertyType];
            }

            result.Property.Range.Add(propertyType);
            if ((System.Reflection.TypeExtensions.IsEnumerable(property.PropertyType)) && (property.PropertyType != typeof(byte[])))
            {
                return(result);
            }

            @class.SubClassOf.Add(@class.CreateRestriction(result.Property, 1u));
            return(result);
        }
示例#16
0
        private IOperation BuildOperation(DescriptionContext context, OperationInfo <Verb> operation, out IIriTemplate template)
        {
            IOperation result = operation.AsOperation(context.ApiDocumentation);

            result.Label       = operation.UnderlyingMethod.Name;
            result.Description = _xmlDocProvider.GetDescription(operation.UnderlyingMethod);
            result.Method.Add(operation.ProtocolSpecificCommand.ToString());
            template = BuildTemplate(context, operation, result);
            bool requiresRdf   = context.RequiresRdf(SpecializationType);
            bool isRdfRequired = requiresRdf;
            var  arguments     = operation.Arguments.Where(parameter => parameter.Source is FromBodyAttribute).Select(parameter => parameter.Parameter);
            var  results       = operation.Results.Where(output => output.Target is ToBodyAttribute).Select(parameter => parameter.Parameter);

            foreach (var value in arguments)
            {
                var expected = (context.ContainsType(value.ParameterType) ? context[value.ParameterType] : context.ForType(value.ParameterType).BuildTypeDescription(out isRdfRequired));
                expected             = context.SubClass(expected, value.ParameterType);
                expected.Label       = value.Name ?? "instance";
                expected.Description = _xmlDocProvider.GetDescription(operation.UnderlyingMethod, value);
                result.Expects.Add(expected);
                requiresRdf |= isRdfRequired;
            }

            foreach (var value in results)
            {
                var returned = (context.ContainsType(value.ParameterType) ? context[value.ParameterType] : context.ForType(value.ParameterType).BuildTypeDescription(out isRdfRequired));
                returned             = context.SubClass(returned, value.ParameterType);
                returned.Description = _xmlDocProvider.GetDescription(operation.UnderlyingMethod, value);
                result.Returns.Add(returned);
                requiresRdf |= isRdfRequired;
            }

            BuildStatusCodes(result, operation);
            BuildOperationMediaType(result, result.Returns, operation, requiresRdf);
            BuildOperationMediaType(result, result.Expects, operation, requiresRdf);
            if (!result.MediaTypes.Any())
            {
                BuildOperationMediaType(result, requiresRdf);
            }

            return(result);
        }
示例#17
0
        private IIriTemplateMapping BuildTemplateMapping(DescriptionContext context, Uri templateUri, OperationInfo <Verb> operation, ArgumentInfo mapping)
        {
            IIriTemplateMapping templateMapping = context.ApiDocumentation.Context.Create <IIriTemplateMapping>(templateUri.AddFragment(mapping.VariableName));

            templateMapping.Variable    = mapping.VariableName;
            templateMapping.Required    = (mapping.Parameter.ParameterType.IsValueType) && (!mapping.Parameter.HasDefaultValue);
            templateMapping.Description = _xmlDocProvider.GetDescription(operation.UnderlyingMethod, mapping.Parameter);
            var linqBehaviors = mapping.Parameter.GetCustomAttributes <LinqServerBehaviorAttribute>(true);

            if (linqBehaviors.Any())
            {
                foreach (var visitor in _serverBehaviorAttributeVisitors)
                {
                    linqBehaviors.Accept(mapping.Parameter.ParameterType, visitor, templateMapping, context);
                }
            }
            else if (context.Type != typeof(object))
            {
                templateMapping.Property = GetMappingProperty(context, mapping.Parameter);
            }

            return(templateMapping);
        }
示例#18
0
        private void SetupProperties(DescriptionContext context, IClass @class)
        {
            if (context.IsTypeComplete(context.Type))
            {
                if (@class == context[context.Type])
                {
                    return;
                }

                foreach (var property in context[context.Type].SupportedProperties)
                {
                    @class.SupportedProperties.Add(property);
                }
            }
            else
            {
                var properties = context.Type.GetProperties(typeof(IEntity));
                foreach (var property in properties)
                {
                    @class.SupportedProperties.Add(BuildSupportedProperty(context, @class, context.Type, property));
                }
            }
        }
        private IClass CreateEnumerableDefinition(DescriptionContext context, Uri baseType, out bool requiresRdf, out Type itemType, bool isGeneric = true)
        {
            itemType = null;
            requiresRdf = false;
            if (!isGeneric)
            {
                return context.ApiDocumentation.Context.Create<IClass>(baseType);
            }

            itemType = context.Type.GetItemType();
            IClass result = context.ApiDocumentation.Context.Create<IClass>(context.Type.MakeUri());
            result.Label = context.Type.MakeTypeName(false, true);
            result.Description = _xmlDocProvider.GetDescription(context.Type);
            result.SubClassOf.Add(context.ApiDocumentation.Context.Create<IClass>(baseType));
            requiresRdf |= context.RequiresRdf(itemType);
            context.Describe(result, requiresRdf);
            return result;
        }
示例#20
0
        private IClass CreateCollectionDefinition(DescriptionContext context, out bool requiresRdf, bool isGeneric = true)
        {
            Type itemType;

            return(CreateCollectionDefinition(context, out requiresRdf, out itemType, isGeneric));
        }
示例#21
0
        private IIriTemplateMapping BuildTemplateMapping(DescriptionContext context, Uri templateUri, OperationInfo<Verb> operation, ArgumentInfo mapping)
        {
            IIriTemplateMapping templateMapping = context.ApiDocumentation.Context.Create<IIriTemplateMapping>(templateUri.AddFragment(mapping.VariableName));
            templateMapping.Variable = mapping.VariableName;
            templateMapping.Required = (mapping.Parameter.ParameterType.IsValueType) && (!mapping.Parameter.HasDefaultValue);
            templateMapping.Description = _xmlDocProvider.GetDescription(operation.UnderlyingMethod, mapping.Parameter);
            var linqBehaviors = mapping.Parameter.GetCustomAttributes<LinqServerBehaviorAttribute>(true);
            if (linqBehaviors.Any())
            {
                foreach (var visitor in _serverBehaviorAttributeVisitors)
                {
                    linqBehaviors.Accept(mapping.Parameter.ParameterType, visitor, templateMapping, context);
                }
            }
            else if (context.Type != typeof(object))
            {
                templateMapping.Property = GetMappingProperty(context, mapping.Parameter);
            }

            return templateMapping;
        }
        /// <inheritdoc />
        public IClass SubClass(DescriptionContext context, IClass @class, Type contextTypeOverride = null)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            if (@class == null)
            {
                throw new ArgumentNullException("class");
            }

            IClass result = context.ApiDocumentation.Context.Create<IClass>(@class.CreateBlankId());
            result.SubClassOf.Add(@class);
            return result;
        }
示例#23
0
        internal IResource DetermineOperationOwner(OperationInfo<Verb> operation, DescriptionContext context, IClass specializationType)
        {
            IResource result = specializationType;
            PropertyInfo matchingProperty;
            if ((!typeof(IReadController<,>).IsAssignableFromSpecificGeneric(_descriptionBuilder.BuildDescriptor().ControllerType)) ||
                ((matchingProperty = operation.UnderlyingMethod.MatchesPropertyOf(context.Type, typeof(IControlledEntity<>).GetProperties().First().Name)) == null))
            {
                return result;
            }

            var propertyId = context.TypeDescriptionBuilder.GetSupportedPropertyId(matchingProperty, context.Type);
            return context.ApiDocumentation.Context.Load<ISupportedProperty>(propertyId);
        }
 private static IClass BuildDatatypeDescription(DescriptionContext context, Uri uri)
 {
     var definition = context.ApiDocumentation.Context.Create<IClass>(new EntityId(uri));
     definition.Label = (uri.Fragment.Length > 1 ? uri.Fragment.Substring(1) : uri.Segments.Last());
     return definition;
 }
示例#25
0
        private IIriTemplate BuildTemplate(DescriptionContext context, OperationInfo<Verb> operation, IOperation operationDocumentation)
        {
            IEnumerable<ArgumentInfo> parameterMapping;
            var uriTemplate = _descriptionBuilder.GetOperationUrlTemplate(operation.UnderlyingMethod, out parameterMapping);
            if (String.IsNullOrEmpty(uriTemplate))
            {
                return null;
            }

            IIriTemplate template = null;
            var templateUri = operationDocumentation.Id.Uri.AddFragment("template");
            var templateMappings = from mapping in parameterMapping where !(mapping.Source is FromBodyAttribute) select BuildTemplateMapping(context, templateUri, operation, mapping);
            foreach (var templateMapping in templateMappings)
            {
                if (template == null)
                {
                    template = context.ApiDocumentation.Context.Create<IIriTemplate>(templateUri);
                    template.Template = uriTemplate;
                }

                template.Mappings.Add(templateMapping);
            }

            return template;
        }
        private void SetupProperties(DescriptionContext context, IClass @class)
        {
            if (context.IsTypeComplete(context.Type))
            {
                if (@class == context[context.Type])
                {
                    return;
                }

                foreach (var property in context[context.Type].SupportedProperties)
                {
                    @class.SupportedProperties.Add(property);
                }
            }
            else
            {
                var properties = context.Type.GetProperties(typeof(IEntity));
                foreach (var property in properties)
                {
                    @class.SupportedProperties.Add(BuildSupportedProperty(context, @class, context.Type, property));
                }
            }
        }
示例#27
0
 private void BuildDescription(DescriptionContext context, IClass specializationType)
 {
     Uri graphUri = _namedGraphSelectorFactory.NamedGraphSelector.SelectGraph(specializationType.Id, null, null);
     context.ApiDocumentation.SupportedClasses.Add(specializationType);
     var description = _descriptionBuilder.BuildDescriptor();
     foreach (OperationInfo<Verb> operation in description.Operations)
     {
         IIriTemplate template;
         var operationDefinition = BuildOperation(context, operation, out template);
         IResource operationOwner = DetermineOperationOwner(operation, context, specializationType);
         if (template != null)
         {
             ITemplatedLink templatedLink = context.ApiDocumentation.Context.Create<ITemplatedLink>(template.Id.Uri.AbsoluteUri.Replace("#template", "#withTemplate"));
             templatedLink.SupportedOperations.Add(operationDefinition);
             context.ApiDocumentation.Context.Store.ReplacePredicateValues(
                 operationOwner.Id,
                 Node.ForUri(templatedLink.Id.Uri),
                 () => new[] { Node.ForUri(template.Id.Uri) },
                 graphUri,
                 CultureInfo.InvariantCulture);
         }
         else
         {
             (operationOwner is ISupportedOperationsOwner ? ((ISupportedOperationsOwner)operationOwner).SupportedOperations : operationOwner.Operations).Add(operationDefinition);
         }
     }
 }
        private IClass CreateCollectionDefinition(DescriptionContext context, out bool requiresRdf, out Type itemType, bool isGeneric = true)
        {
            var result = CreateEnumerableDefinition(context, context.ApiDocumentation.Context.Mappings.MappingFor<ICollection>().Classes.First().Uri, out requiresRdf, out itemType, isGeneric);
            if (!isGeneric)
            {
                return result;
            }

            var memberType = (context.ContainsType(itemType) ? context[itemType] : BuildTypeDescription(context.ForType(itemType), out requiresRdf));
            result.SubClassOf.Add(result.CreateRestriction(context.ApiDocumentation.Context.Mappings.MappingFor<ICollection>().PropertyFor("Members").Uri, memberType));
            return result;
        }
 private IClass CreateCollectionDefinition(DescriptionContext context, out bool requiresRdf, bool isGeneric = true)
 {
     Type itemType;
     return CreateCollectionDefinition(context, out requiresRdf, out itemType, isGeneric);
 }
        private ISupportedProperty BuildSupportedProperty(DescriptionContext context, IClass @class, Type declaringType, PropertyInfo property)
        {
            var propertyId = GetSupportedPropertyId(property, declaringType);
            var propertyUri = (!typeof(IEntity).IsAssignableFrom(context.Type) ? @class.Id.Uri.AddName(property.Name) :
                context.ApiDocumentation.Context.Mappings.MappingFor(context.Type).PropertyFor(property.Name).Uri);
            var result = context.ApiDocumentation.Context.Create<ISupportedProperty>(propertyId);
            result.Readable = property.CanRead;
            result.Writeable = property.CanWrite;
            result.Required = (property.PropertyType.IsValueType) || (property.GetCustomAttribute<RequiredAttribute>() != null);
            var isKeyProperty = (property.GetCustomAttribute<KeyAttribute>() != null) ||
                (property.ImplementsGeneric(typeof(IControlledEntity<>), "Key"));
            result.Property = (isKeyProperty ?
                context.ApiDocumentation.Context.Create<IInverseFunctionalProperty>(propertyUri) :
                context.ApiDocumentation.Context.Create<IProperty>(propertyUri));
            result.Property.Label = property.Name;
            result.Property.Description = _xmlDocProvider.GetDescription(property);
            result.Property.Domain.Add(@class);
            IClass propertyType;
            var itemPropertyType = (System.Reflection.TypeExtensions.IsEnumerable(property.PropertyType) ? property.PropertyType : property.PropertyType.GetItemType());
            if (!context.ContainsType(itemPropertyType))
            {
                bool requiresRdf;
                var childContext = context.ForType(itemPropertyType);
                propertyType = BuildTypeDescription(childContext, out requiresRdf);
                childContext.Describe(propertyType, requiresRdf);
            }
            else
            {
                propertyType = context[itemPropertyType];
            }

            result.Property.Range.Add(propertyType);
            if ((System.Reflection.TypeExtensions.IsEnumerable(property.PropertyType)) && (property.PropertyType != typeof(byte[])))
            {
                return result;
            }

            @class.SubClassOf.Add(@class.CreateRestriction(result.Property, 1u));
            return result;
        }
示例#31
0
        private static Rdfs.IProperty GetMappingProperty(DescriptionContext context, ParameterInfo parameter)
        {
            IClass description = context[context.Type];
            Rdfs.IProperty resultCandidate = null;
            IResource parameterType = null;
            foreach (var supportedProperty in description.SupportedProperties)
            {
                if (StringComparer.OrdinalIgnoreCase.Equals(supportedProperty.Property.Label, parameter.Name))
                {
                    return supportedProperty.Property;
                }

                if (parameterType == null)
                {
                    parameterType = (context.ContainsType(parameter.ParameterType) ? context[parameter.ParameterType] : context.BuildTypeDescription());
                }

                if (supportedProperty.Property.Range.Any(range => (range.Id == parameterType.Id) ||
                    ((range is IClass) && (((IClass)range).SubClassOf.Any(subClass => subClass.Id == parameterType.Id)))))
                {
                    resultCandidate = supportedProperty.Property;
                }
            }

            return resultCandidate;
        }
        private IClass CreateListDefinition(DescriptionContext context, out bool requiresRdf, bool isGeneric = true)
        {
            Type itemType;
            var result = CreateCollectionDefinition(context, out requiresRdf, out itemType, isGeneric);
            if (!isGeneric)
            {
                return result;
            }

            var memberType = (context.ContainsType(itemType) ? context[itemType] : BuildTypeDescription(context.ForType(itemType), out requiresRdf));
            result.SubClassOf.Add(context.ApiDocumentation.Context.Create<IClass>(Rdf.List));
            result.SubClassOf.Add(result.CreateRestriction(Rdf.first, memberType));
            result.SubClassOf.Add(result.CreateRestriction(Rdf.rest, result));
            return result;
        }
示例#33
0
        private IOperation BuildOperation(DescriptionContext context, OperationInfo<Verb> operation, out IIriTemplate template)
        {
            IOperation result = operation.AsOperation(context.ApiDocumentation);
            result.Label = operation.UnderlyingMethod.Name;
            result.Description = _xmlDocProvider.GetDescription(operation.UnderlyingMethod);
            result.Method.Add(operation.ProtocolSpecificCommand.ToString());
            template = BuildTemplate(context, operation, result);
            bool requiresRdf = context.RequiresRdf(SpecializationType);
            bool isRdfRequired = requiresRdf;
            var arguments = operation.Arguments.Where(parameter => parameter.Source is FromBodyAttribute).Select(parameter => parameter.Parameter);
            var results = operation.Results.Where(output => output.Target is ToBodyAttribute).Select(parameter => parameter.Parameter);

            foreach (var value in arguments)
            {
                var expected = (context.ContainsType(value.ParameterType) ? context[value.ParameterType] : context.ForType(value.ParameterType).BuildTypeDescription(out isRdfRequired));
                expected = context.SubClass(expected, value.ParameterType);
                expected.Label = value.Name ?? "instance";
                expected.Description = _xmlDocProvider.GetDescription(operation.UnderlyingMethod, value);
                result.Expects.Add(expected);
                requiresRdf |= isRdfRequired;
            }

            foreach (var value in results)
            {
                var returned = (context.ContainsType(value.ParameterType) ? context[value.ParameterType] : context.ForType(value.ParameterType).BuildTypeDescription(out isRdfRequired));
                returned = context.SubClass(returned, value.ParameterType);
                returned.Description = _xmlDocProvider.GetDescription(operation.UnderlyingMethod, value);
                result.Returns.Add(returned);
                requiresRdf |= isRdfRequired;
            }

            BuildStatusCodes(result, operation);
            BuildOperationMediaType(result, result.Returns, operation, requiresRdf);
            BuildOperationMediaType(result, result.Expects, operation, requiresRdf);
            if (!result.MediaTypes.Any())
            {
                BuildOperationMediaType(result, requiresRdf);
            }

            return result;
        }