/// <inheritdoc/> public override bool TryMatch(ODataPathSegment pathSegment, IDictionary <string, object> values) { OperationSegment other = pathSegment as OperationSegment; if (other == null) { return(false); } IEdmOperation operation = Segment.Operations.First(); IEdmOperation otherOperation = other.Operations.First(); if (operation.IsAction() && otherOperation.IsAction()) { return(operation == otherOperation); } else if (operation.IsFunction() && otherOperation.IsFunction()) { if (operation.FullName() != otherOperation.FullName()) { return(false); } IDictionary <string, object> parameterValues = new Dictionary <string, object>(); foreach (var parameter in other.Parameters) { object value = other.GetParameterValue(parameter.Name); parameterValues[parameter.Name] = value; } if (RoutingConventionHelpers.TryMatch(ParameterMappings, parameterValues, values)) { foreach (var operationSegmentParameter in other.Parameters) { string name = operationSegmentParameter.Name; object value = parameterValues[name]; RoutingConventionHelpers.AddFunctionParameters((IEdmFunction)otherOperation, name, value, values, values, ParameterMappings); } return(true); } } return(false); }
public static string TargetName(this IEdmOperation operation) { if (operation.IsFunction()) { IEdmFunction function = (IEdmFunction)operation; int skip = 0; if (function.IsBound) { skip = 1; } return(function.Name + "(" + string.Join(",", function.Parameters.Skip(skip).Select(p => p.Name)) + ")"); } else { return(operation.Name); }; }
private static ISet <string> GetRequiredFunctionParamters(IEdmOperation operation, ActionModel action) { Contract.Assert(operation != null); Contract.Assert(operation.IsFunction()); Contract.Assert(action != null); ISet <string> requiredParameters = new HashSet <string>(); // we can allow the action has other parameters except the functio parameters. foreach (var parameter in operation.Parameters.Skip(1)) { if (action.Parameters.Any(p => p.ParameterInfo.Name == parameter.Name)) { requiredParameters.Add(parameter.Name); } } return(requiredParameters); }
private void WriteMethod(OdcmClass odcmClass, IEdmOperation operation) { IEnumerable <IEdmOperationParameter> parameters = operation.IsBound ? (from parameter in operation.Parameters where parameter != operation.Parameters.First() select parameter) : (operation.Parameters); bool isBoundToCollection = operation.IsBound && operation.Parameters.First().Type.IsCollection(); var odcmMethod = new OdcmMethod(operation.Name) { IsComposable = operation.IsFunction() && ((IEdmFunction)operation).IsComposable, IsBoundToCollection = isBoundToCollection, Verbs = operation.IsAction() ? OdcmAllowedVerbs.Post : OdcmAllowedVerbs.Any, Class = odcmClass }; odcmClass.Methods.Add(odcmMethod); if (operation.ReturnType != null) { odcmMethod.ReturnType = ResolveType(operation.ReturnType); odcmMethod.IsCollection = operation.ReturnType.IsCollection(); } var callingConvention = operation.IsAction() ? OdcmCallingConvention.InHttpMessageBody : OdcmCallingConvention.InHttpRequestUri; foreach (var parameter in parameters) { odcmMethod.Parameters.Add(new OdcmParameter(parameter.Name) { CallingConvention = callingConvention, Type = ResolveType(parameter.Type), IsCollection = parameter.Type.IsCollection(), IsNullable = parameter.Type.IsNullable }); } }
/// <summary> /// Initializes a new instance of the <see cref="FunctionSegmentTemplate" /> class. /// </summary> /// <param name="operationSegment">The operation segment, it should be a function segment and the parameters are template.</param> public FunctionSegmentTemplate(OperationSegment operationSegment) { if (operationSegment == null) { throw Error.ArgumentNull(nameof(operationSegment)); } IEdmOperation operation = operationSegment.Operations.FirstOrDefault(); if (!operation.IsFunction()) { throw new ODataException(Error.Format(SRResources.SegmentShouldBeKind, "Function", "FunctionSegmentTemplate")); } Function = (IEdmFunction)operation; NavigationSource = operationSegment.EntitySet; ParameterMappings = OperationHelper.BuildParameterMappings(operationSegment.Parameters, operation.FullName()); }
void AppendParametersFromConvention(StringBuilder builder, IEdmOperation operation) { Contract.Requires(builder != null); Contract.Requires(operation != null); if (!operation.IsFunction()) { return; } using (var parameters = operation.Parameters.Where(p => p.Name != "bindingParameter").GetEnumerator()) { if (!parameters.MoveNext()) { return; } var actionParameters = Context.ParameterDescriptions.ToDictionary(p => p.Name, StringComparer.OrdinalIgnoreCase); var parameter = parameters.Current; var name = parameter.Name; var routeParameterName = actionParameters[name].ParameterDescriptor.ParameterName; builder.Append('('); builder.Append(name); builder.Append('='); ExpandParameterTemplate(builder, parameter, routeParameterName); while (parameters.MoveNext()) { parameter = parameters.Current; name = parameter.Name; routeParameterName = actionParameters[name].ParameterDescriptor.ParameterName; builder.Append(','); builder.Append(name); builder.Append('='); ExpandParameterTemplate(builder, parameter, routeParameterName); } builder.Append(')'); } }
private void WriteMethod(OdcmClass odcmClass, IEdmOperation operation, IEdmOperationImport operationImport = null) { var parameters = operation.IsBound ? (from parameter in operation.Parameters where parameter != operation.Parameters.First() select parameter) : (operation.Parameters); var isBoundToCollection = operation.IsBound && operation.Parameters.First().Type.IsCollection(); var odcmMethod = new OdcmMethod(operation.Name, odcmClass.Namespace) { IsComposable = operation.IsFunction() && ((IEdmFunction)operation).IsComposable, IsBoundToCollection = isBoundToCollection, Verbs = operation.IsAction() ? OdcmAllowedVerbs.Post : OdcmAllowedVerbs.Any, Class = odcmClass }; AddVocabularyAnnotations(odcmMethod, operation); if (operationImport != null) { AddVocabularyAnnotations(odcmMethod, operationImport); } odcmClass.Methods.Add(odcmMethod); if (operation.ReturnType != null) { odcmMethod.ReturnType = ResolveType(operation.ReturnType); odcmMethod.IsCollection = operation.ReturnType.IsCollection(); } var callingConvention = operation.IsAction() ? OdcmCallingConvention.InHttpMessageBody : OdcmCallingConvention.InHttpRequestUri; foreach (var parameter in parameters) { var odcmParameter = new OdcmParameter(parameter.Name) { CallingConvention = callingConvention, Type = ResolveType(parameter.Type), IsCollection = parameter.Type.IsCollection(), IsNullable = parameter.Type.IsNullable }; AddVocabularyAnnotations(odcmParameter, parameter); odcmMethod.Parameters.Add(odcmParameter); } }
static string GetPathForOperationOfEntitySet(IEdmOperation operation, IEdmEntitySet entitySet) { string swaggerOperationPath = "/" + entitySet.Name + "/" + operation.FullName() + "("; if (operation.IsFunction()) { foreach (var parameter in operation.Parameters.Skip(1)) { if (parameter.Type.Definition.TypeKind == EdmTypeKind.Primitive && (parameter.Type.Definition as IEdmPrimitiveType).PrimitiveKind == EdmPrimitiveTypeKind.String) { swaggerOperationPath += parameter.Name + "=" + "'{" + parameter.Name + "}',"; } else { swaggerOperationPath += parameter.Name + "=" + "{" + parameter.Name + "},"; } } } if (swaggerOperationPath.EndsWith(",")) { swaggerOperationPath = swaggerOperationPath.Substring(0, swaggerOperationPath.Length - 1); } swaggerOperationPath += ")"; return swaggerOperationPath; }
/// <summary> /// Get the Uri Swagger path for Edm operation bound to entity. /// </summary> /// <param name="operation">The Edm operation.</param> /// <param name="navigationSource">The Edm navigation source.</param> /// <returns>The <see cref="System.String"/> path represents the related Edm operation.</returns> public static string GetPathForOperationOfEntity(IEdmOperation operation, IEdmNavigationSource navigationSource) { IEdmEntitySet entitySet = navigationSource as IEdmEntitySet; if (operation == null || entitySet == null) { return String.Empty; } string swaggerOperationPath = GetPathForEntity(entitySet) + "/" + operation.FullName() + "("; if (operation.IsFunction()) { foreach (var parameter in operation.Parameters.Skip(1)) { if (parameter.Type.Definition.TypeKind == EdmTypeKind.Primitive && ((IEdmPrimitiveType)parameter.Type.Definition).PrimitiveKind == EdmPrimitiveTypeKind.String) { swaggerOperationPath += parameter.Name + "=" + "'{" + parameter.Name + "}',"; } else { swaggerOperationPath += parameter.Name + "=" + "{" + parameter.Name + "},"; } } } if (swaggerOperationPath.EndsWith(",", StringComparison.Ordinal)) { swaggerOperationPath = swaggerOperationPath.Substring(0, swaggerOperationPath.Length - 1); } swaggerOperationPath += ")"; return swaggerOperationPath; }