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 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); }
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 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); }
/// <inheritdoc /> public IClass BuildTypeDescription(DescriptionContext context) { if (context == null) { throw new ArgumentNullException("context"); } bool requiresRdf; return(BuildTypeDescription(context, out requiresRdf)); }
/// <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; }
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); }
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)); }
/// <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); }
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); }
/// <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); }
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); }
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); }
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); }
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); }
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; }
private IClass CreateCollectionDefinition(DescriptionContext context, out bool requiresRdf, bool isGeneric = true) { Type itemType; return(CreateCollectionDefinition(context, out requiresRdf, out itemType, isGeneric)); }
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; }
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; }
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 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; }
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; }
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; }