/// <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 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); }