public virtual ODataAction CreateODataAction(IEdmFunctionImport action, EntityInstanceContext entityInstanceContext) { if (action == null) { throw Error.ArgumentNull("action"); } if (entityInstanceContext == null) { throw Error.ArgumentNull("entityInstanceContext"); } ODataMetadataLevel metadataLevel = entityInstanceContext.SerializerContext.MetadataLevel; IEdmModel model = entityInstanceContext.EdmModel; ActionLinkBuilder builder = model.GetActionLinkBuilder(action); if (builder == null) { return(null); } if (ShouldOmitAction(action, model, builder, metadataLevel)) { return(null); } Uri target = builder.BuildActionLink(entityInstanceContext); if (target == null) { return(null); } Uri baseUri = new Uri(entityInstanceContext.Url.ODataLink(new MetadataPathSegment())); Uri metadata = new Uri(baseUri, "#" + CreateMetadataFragment(action, model, metadataLevel)); ODataAction odataAction = new ODataAction { Metadata = metadata, }; bool alwaysIncludeDetails = metadataLevel == ODataMetadataLevel.Default || metadataLevel == ODataMetadataLevel.FullMetadata; // Always omit the title in minimal/no metadata modes (it isn't customizable and thus always follows // conventions). if (alwaysIncludeDetails) { odataAction.Title = action.Name; } // Omit the target in minimal/no metadata modes unless it doesn't follow conventions. if (alwaysIncludeDetails || !builder.FollowsConventions) { odataAction.Target = target; } return(odataAction); }
public void Apply_Doesnot_Override_UserConfiguration() { ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); var vehicles = builder.EntitySet <Vehicle>("vehicles"); var car = builder.AddEntity(typeof(Car)); var paintAction = vehicles.EntityType.Action("Paint"); paintAction.HasActionLink(ctxt => new Uri("http://localhost/ActionTestWorks")); _convention.Apply(paintAction, builder); IEdmModel model = builder.GetEdmModel(); var vehiclesEdmSet = model.EntityContainers().Single().FindEntitySet("vehicles"); var carEdmType = model.FindDeclaredType("System.Web.Http.OData.Builder.TestModels.Car") as IEdmEntityType; var paintEdmAction = model.GetAvailableProcedures(model.FindDeclaredType("System.Web.Http.OData.Builder.TestModels.Car") as IEdmEntityType).Single(); HttpConfiguration configuration = new HttpConfiguration(); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost"); request.Properties[HttpPropertyKeys.HttpConfigurationKey] = configuration; request.Properties[HttpPropertyKeys.HttpRouteDataKey] = new HttpRouteData(new HttpRoute()); ActionLinkBuilder actionLinkBuilder = model.GetActionLinkBuilder(paintEdmAction); Uri link = actionLinkBuilder.BuildActionLink(new EntityInstanceContext(model, vehiclesEdmSet, carEdmType, request.GetUrlHelper(), new Car { Model = 2009, Name = "Accord" })); Assert.Equal( "http://localhost/ActionTestWorks", link.AbsoluteUri); }
public virtual Task <ODataAction> CreateODataActionAsync(IEdmAction action, EntityInstanceContext entityInstanceContext) { if (action == null) { throw Error.ArgumentNull("action"); } if (entityInstanceContext == null) { throw Error.ArgumentNull("entityInstanceContext"); } ODataMetadataLevel metadataLevel = entityInstanceContext.SerializerContext.MetadataLevel; IEdmModel model = entityInstanceContext.EdmModel; ActionLinkBuilder builder = model.GetActionLinkBuilder(action); if (builder == null) { return(Task.FromResult((ODataAction)null)); } if (ShouldOmitAction(action, builder, metadataLevel)) { return(Task.FromResult((ODataAction)null)); } Uri target = builder.BuildActionLink(entityInstanceContext); if (target == null) { return(Task.FromResult((ODataAction)null)); } Uri baseUri = new Uri(entityInstanceContext.Url.CreateODataLink(new MetadataPathSegment())); Uri metadata = new Uri(baseUri, "#" + CreateMetadataFragment(action)); ODataAction odataAction = new ODataAction { Metadata = metadata, }; bool alwaysIncludeDetails = metadataLevel == ODataMetadataLevel.FullMetadata; // Always omit the title in minimal/no metadata modes. if (alwaysIncludeDetails) { EmitTitle(model, action, odataAction); } // Omit the target in minimal/no metadata modes unless it doesn't follow conventions. if (alwaysIncludeDetails || !builder.FollowsConventions) { odataAction.Target = target; } return(Task.FromResult(odataAction)); }
public void GetActionLinkBuilder_After_SetActionLinkBuilder() { // Arrange IEdmModel model = new EdmModel(); IEdmAction action = new Mock <IEdmAction>().Object; ActionLinkBuilder builder = new ActionLinkBuilder((EntityInstanceContext _) => null, followsConventions: false); // Act model.SetActionLinkBuilder(action, builder); var result = model.GetActionLinkBuilder(action); // Assert Assert.Same(builder, result); }
public void Apply_SetsActionLinkBuilder_OnlyIfActionIsBindable() { ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); var vehicles = builder.EntitySet <Vehicle>("vehicles"); var paintAction = new ActionConfiguration(builder, "Paint"); _convention.Apply(paintAction, builder); IEdmModel model = builder.GetEdmModel(); var paintEdmAction = model.EntityContainers().Single().Elements.OfType <IEdmFunctionImport>().Single(); ActionLinkBuilder actionLinkBuilder = model.GetActionLinkBuilder(paintEdmAction); Assert.Null(actionLinkBuilder); }
public void GetActionLinkBuilder_After_SetActionLinkBuilder() { // Arrange IEdmModel model = new EdmModel(); IEdmEntityContainer container = new EdmEntityContainer("NS", "Container"); IEdmFunctionImport action = new Mock <IEdmFunctionImport>().Object; ActionLinkBuilder builder = new ActionLinkBuilder(_ => null, followsConventions: false); // Act model.SetActionLinkBuilder(action, builder); var result = model.GetActionLinkBuilder(action); // Assert Assert.Same(builder, result); }
internal static bool ShouldOmitAction(IEdmAction action, ActionLinkBuilder builder, ODataMetadataLevel metadataLevel) { Contract.Assert(builder != null); switch (metadataLevel) { case ODataMetadataLevel.MinimalMetadata: case ODataMetadataLevel.NoMetadata: return(action.IsBound && builder.FollowsConventions); case ODataMetadataLevel.FullMetadata: default: // All values already specified; just keeping the compiler happy. return(false); } }
public void GetActionLinkBuilder_ReturnsDefaultActionLinkBuilder_IfNotSet() { // Arrange IEdmModel model = new EdmModel(); EdmAction action = new EdmAction("NS", "Action", returnType: null); action.AddParameter("entity", new EdmEntityTypeReference(new EdmEntityType("NS", "Customer"), false)); // Act ActionLinkBuilder builder = model.GetActionLinkBuilder(action); // Assert Assert.NotNull(builder); Assert.NotNull(builder.LinkFactory); Assert.IsType <Func <EntityInstanceContext, Uri> >(builder.LinkFactory); Assert.Null(builder.FeedLinkFactory); }
public void Apply_Doesnot_Override_UserConfiguration() { ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); var vehicles = builder.EntitySet <Vehicle>("vehicles"); var car = builder.AddEntityType(typeof(Car)); var paintAction = vehicles.EntityType.Action("Paint"); paintAction.HasActionLink(ctxt => new Uri("http://localhost/ActionTestWorks"), followsConventions: false); ActionLinkGenerationConvention convention = new ActionLinkGenerationConvention(); convention.Apply(paintAction, builder); IEdmModel model = builder.GetEdmModel(); var vehiclesEdmSet = model.EntityContainer.FindEntitySet("vehicles"); var carEdmType = model.FindDeclaredType("System.Web.OData.Builder.TestModels.Car") as IEdmEntityType; var paintEdmAction = model.GetAvailableProcedures( model.FindDeclaredType("System.Web.OData.Builder.TestModels.Car") as IEdmEntityType).Single() as IEdmAction; Assert.NotNull(paintEdmAction); HttpConfiguration configuration = new HttpConfiguration(); configuration.MapODataServiceRoute(model); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost"); request.SetConfiguration(configuration); ActionLinkBuilder actionLinkBuilder = model.GetActionLinkBuilder(paintEdmAction); var serializerContext = new ODataSerializerContext { Model = model, NavigationSource = vehiclesEdmSet, Url = request.GetUrlHelper() }; var entityContext = new EntityInstanceContext(serializerContext, carEdmType.AsReference(), new Car { Model = 2009, Name = "Contoso" }); Uri link = actionLinkBuilder.BuildActionLink(entityContext); Assert.Equal("http://localhost/ActionTestWorks", link.AbsoluteUri); }
public void Apply_SetsActionLinkBuilder_OnlyIfActionIsBindable() { // Arrange ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); var vehicles = builder.EntitySet <Vehicle>("vehicles"); var paintAction = builder.Action("Paint"); ActionLinkGenerationConvention convention = new ActionLinkGenerationConvention(); // Act convention.Apply(paintAction, builder); // Assert IEdmModel model = builder.GetEdmModel(); var paintEdmAction = model.EntityContainer.Elements.OfType <IEdmActionImport>().Single(); ActionLinkBuilder actionLinkBuilder = model.GetAnnotationValue <ActionLinkBuilder>(paintEdmAction); Assert.Null(actionLinkBuilder); }
public void Apply_Doesnot_Override_UserConfiguration() { // Arrange ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); var customers = builder.EntitySet <Customer>("Customers"); var paintAction = customers.EntityType.Action("Paint"); paintAction.HasActionLink(ctxt => new Uri("http://localhost/ActionTestWorks"), followsConventions: false); ActionLinkGenerationConvention convention = new ActionLinkGenerationConvention(); // Act convention.Apply(paintAction, builder); IEdmModel model = builder.GetEdmModel(); var edmCustomers = model.EntityContainer.FindEntitySet("Customers"); var edmCustomer = model.SchemaElements.OfType <IEdmEntityType>().First(c => c.Name == "Customer"); var edmAction = model.SchemaElements.OfType <IEdmAction>().First(a => a.Name == "Paint"); Assert.NotNull(edmAction); HttpConfiguration configuration = new HttpConfiguration(); configuration.MapODataServiceRoute(model); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost"); request.SetConfiguration(configuration); ActionLinkBuilder actionLinkBuilder = model.GetActionLinkBuilder(edmAction); var serializerContext = new ODataSerializerContext { Model = model, NavigationSource = edmCustomers, Url = request.GetUrlHelper() }; var entityContext = new EntityInstanceContext(serializerContext, edmCustomer.AsReference(), new Customer { Id = 2009 }); // Assert Uri link = actionLinkBuilder.BuildActionLink(entityContext); Assert.Equal("http://localhost/ActionTestWorks", link.AbsoluteUri); }
public static ActionLinkBuilder GetActionLinkBuilder(this IEdmModel model, IEdmFunctionImport action) { if (model == null) { throw Error.ArgumentNull("model"); } if (action == null) { throw Error.ArgumentNull("action"); } ActionLinkBuilder actionLinkBuilder = model.GetAnnotationValue <ActionLinkBuilder>(action); if (actionLinkBuilder == null) { actionLinkBuilder = new ActionLinkBuilder(entityInstanceContext => entityInstanceContext.GenerateActionLink(action), followsConventions: true); model.SetActionLinkBuilder(action, actionLinkBuilder); } return(actionLinkBuilder); }
public void Convention_GeneratesUri_ForActionBoundToEntity() { // Arrange ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); builder.EntitySet <Customer>("Customers"); var action = builder.EntityType <Customer>().Action("MyAction"); action.Parameter <string>("param"); IEdmModel model = builder.GetEdmModel(); // Act HttpConfiguration configuration = new HttpConfiguration(); configuration.MapODataServiceRoute("odata", "odata", model); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:123"); request.SetConfiguration(configuration); request.ODataProperties().RouteName = "odata"; IEdmEntitySet customers = model.EntityContainer.FindEntitySet("Customers"); var edmType = model.SchemaElements.OfType <IEdmEntityType>().First(e => e.Name == "Customer"); var serializerContext = new ODataSerializerContext { Model = model, NavigationSource = customers, Url = request.GetUrlHelper() }; var entityContext = new EntityInstanceContext(serializerContext, edmType.AsReference(), new Customer { Id = 109 }); // Assert var edmAction = model.SchemaElements.OfType <IEdmAction>().First(f => f.Name == "MyAction"); Assert.NotNull(edmAction); ActionLinkBuilder actionLinkBuilder = model.GetActionLinkBuilder(edmAction); Uri link = actionLinkBuilder.BuildActionLink(entityContext); Assert.Equal("http://localhost:123/odata/Customers(109)/Default.MyAction", link.AbsoluteUri); }
public virtual ODataAction CreateODataAction(IEdmAction action, EntityInstanceContext entityInstanceContext) { if (action == null) { throw Error.ArgumentNull("action"); } if (entityInstanceContext == null) { throw Error.ArgumentNull("entityInstanceContext"); } IEdmModel model = entityInstanceContext.EdmModel; ActionLinkBuilder builder = model.GetActionLinkBuilder(action); if (builder == null) { return(null); } return(CreateODataOperation(action, builder, entityInstanceContext) as ODataAction); }
private static ODataAction CreateODataAction(IEdmFunctionImport action, EntityInstanceContext context) { ActionLinkBuilder builder = context.EdmModel.GetActionLinkBuilder(action); if (builder != null) { Uri target = builder.BuildActionLink(context); if (target != null) { Uri baseUri = new Uri(context.UrlHelper.ODataLink(context.PathHandler, new MetadataPathSegment())); Uri metadata = new Uri(baseUri, "#" + action.Container.Name + "." + action.Name); return(new ODataAction { Metadata = metadata, Target = target, Title = action.Name }); } } return(null); }
public static ActionLinkBuilder GetActionLinkBuilder(this IEdmModel model, IEdmAction action) { if (model == null) { throw Error.ArgumentNull("model"); } if (action == null) { throw Error.ArgumentNull("action"); } ActionLinkBuilder actionLinkBuilder = model.GetAnnotationValue <ActionLinkBuilder>(action); if (actionLinkBuilder == null) { // Let ODL to process the action link for entity if (action.Parameters != null) { if (action.Parameters.First().Type.IsEntity()) { actionLinkBuilder = new ActionLinkBuilder( (EntityInstanceContext entityInstanceContext) => entityInstanceContext.GenerateActionLink(action), followsConventions: true); } else if (action.Parameters.First().Type.IsCollection()) { actionLinkBuilder = new ActionLinkBuilder((FeedContext feedContext) => feedContext.GenerateActionLink(action), followsConventions: true); } } model.SetActionLinkBuilder(action, actionLinkBuilder); } return(actionLinkBuilder); }
public void Convention_GeneratesUri_ForActionBoundToCollectionOfEntity() { // Arrange ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); builder.EntitySet <Customer>("Customers"); var action = builder.EntityType <Customer>().Collection.Action("MyAction").Returns <int>(); action.Parameter <string>("param"); IEdmModel model = builder.GetEdmModel(); // Act HttpConfiguration configuration = new HttpConfiguration(); configuration.MapODataServiceRoute("odata", "odata", model); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:123"); request.SetConfiguration(configuration); request.ODataProperties().RouteName = "odata"; IEdmEntitySet customers = model.EntityContainer.FindEntitySet("Customers"); var entityContext = new FeedContext { EntitySetBase = customers, Request = request, Url = request.GetUrlHelper() }; // Assert var edmAction = model.SchemaElements.OfType <IEdmAction>().First(f => f.Name == "MyAction"); Assert.NotNull(edmAction); ActionLinkBuilder actionLinkBuilder = model.GetActionLinkBuilder(edmAction); Uri link = actionLinkBuilder.BuildActionLink(entityContext); Assert.Equal("http://localhost:123/odata/Customers/Default.MyAction", link.AbsoluteUri); }
public static void SetActionLinkBuilder(this IEdmModel model, IEdmAction action, ActionLinkBuilder actionLinkBuilder) { if (model == null) { throw Error.ArgumentNull("model"); } model.SetAnnotationValue(action, actionLinkBuilder); }
internal static bool ShouldOmitAction(IEdmFunctionImport action, IEdmModel model, ActionLinkBuilder builder, ODataMetadataLevel metadataLevel) { Contract.Assert(model != null); Contract.Assert(builder != null); switch (metadataLevel) { case ODataMetadataLevel.MinimalMetadata: case ODataMetadataLevel.NoMetadata: return(model.IsAlwaysBindable(action) && builder.FollowsConventions); case ODataMetadataLevel.Default: case ODataMetadataLevel.FullMetadata: default: // All values already specified; just keeping the compiler happy. return(false); } }
public static void SetActionLinkBuilder(this IEdmDirectValueAnnotationsManager manager, IEdmElement element, ActionLinkBuilder value) { SetCoreAnnotation <ActionLinkBuilder>(manager, element, value); }