Files
linux-packaging-mono/external/aspnetwebstack/src/Microsoft.Web.Http.Data/SubmitProxyActionDescriptor.cs
Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

86 lines
3.3 KiB
C#

// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Formatting;
using System.Reflection;
using System.Threading.Tasks;
using System.Web.Http.Controllers;
namespace Microsoft.Web.Http.Data
{
/// <summary>
/// This descriptor translates a direct CUD action invocation into a call to
/// Submit. This descriptor wraps the actual action, intercepting the execution
/// to do the transformation.
/// </summary>
internal sealed class SubmitProxyActionDescriptor : ReflectedHttpActionDescriptor
{
private UpdateActionDescriptor _updateAction;
public SubmitProxyActionDescriptor(UpdateActionDescriptor updateAction)
: base(updateAction.ControllerDescriptor, updateAction.ControllerDescriptor.ControllerType.GetMethod("Submit", BindingFlags.Instance | BindingFlags.Public))
{
_updateAction = updateAction;
}
public override string ActionName
{
get { return _updateAction.ActionName; }
}
public override Type ReturnType
{
get { return typeof(HttpResponseMessage); }
}
public override Collection<HttpParameterDescriptor> GetParameters()
{
return _updateAction.GetParameters();
}
[SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Justification = "Caller is responsible for the lifetime of the object")]
public override Task<object> ExecuteAsync(HttpControllerContext controllerContext, IDictionary<string, object> arguments)
{
return TaskHelpers.RunSynchronously<object>(() =>
{
// create the changeset
object entity = arguments.Single().Value; // there is only a single parameter - the entity being submitted
ChangeSetEntry[] changeSetEntries = new ChangeSetEntry[]
{
new ChangeSetEntry
{
Id = 1,
ActionDescriptor = _updateAction,
Entity = entity,
Operation = _updateAction.ChangeOperation
}
};
ChangeSet changeSet = new ChangeSet(changeSetEntries);
changeSet.SetEntityAssociations();
DataController controller = (DataController)controllerContext.Controller;
if (!controller.Submit(changeSet) &&
controller.ActionContext.Response != null)
{
// If the submit failed due to an authorization failure,
// return the authorization response directly
return controller.ActionContext.Response;
}
// return the entity
entity = changeSet.ChangeSetEntries[0].Entity;
// REVIEW does JSON make sense here?
return new HttpResponseMessage()
{
Content = new ObjectContent(_updateAction.EntityType, entity, new JsonMediaTypeFormatter())
};
});
}
}
}