private async Task<DataPortalResult> InvokeMethod(string factoryTypeName, DataPortalOperations operation, string methodName, Type objectType, DataPortalContext context, bool isSync) { object factory = FactoryLoader.GetFactory(factoryTypeName); var eventArgs = new DataPortalEventArgs(context, objectType, null, operation); Csla.Reflection.MethodCaller.CallMethodIfImplemented(factory, "Invoke", eventArgs); object result = null; try { Utilities.ThrowIfAsyncMethodOnSyncClient(isSync, factory, methodName); result = await Csla.Reflection.MethodCaller.CallMethodTryAsync(factory, methodName).ConfigureAwait(false); var error = result as Exception; if (error != null) throw error; var busy = result as Csla.Core.ITrackStatus; if (busy != null && busy.IsBusy) throw new InvalidOperationException(string.Format("{0}.IsBusy == true", objectType.Name)); Csla.Reflection.MethodCaller.CallMethodIfImplemented(factory, "InvokeComplete", eventArgs); } catch (Exception ex) { Csla.Reflection.MethodCaller.CallMethodIfImplemented( factory, "InvokeError", new DataPortalEventArgs(context, objectType, null, operation, ex)); throw; } return new DataPortalResult(result); }
private async Task <DataPortalResult> InvokeMethod(string factoryTypeName, DataPortalOperations operation, string methodName, Type objectType, object e, DataPortalContext context, bool isSync) { object factory = FactoryLoader.GetFactory(factoryTypeName); var eventArgs = new DataPortalEventArgs(context, objectType, e, operation); Csla.Reflection.MethodCaller.CallMethodIfImplemented(factory, "Invoke", eventArgs); object result; try { Utilities.ThrowIfAsyncMethodOnSyncClient(ApplicationContext, isSync, factory, methodName, e); result = await Csla.Reflection.MethodCaller.CallMethodTryAsync(factory, methodName, e).ConfigureAwait(false); if (result is Exception error) { throw error; } if (result is Csla.Core.ITrackStatus busy && busy.IsBusy) { throw new InvalidOperationException(string.Format("{0}.IsBusy == true", objectType.Name)); } Csla.Reflection.MethodCaller.CallMethodIfImplemented(factory, "InvokeComplete", eventArgs); } catch (Exception ex) { Csla.Reflection.MethodCaller.CallMethodIfImplemented(factory, "InvokeError", new DataPortalEventArgs(context, objectType, e, operation, ex)); throw; } return(new DataPortalResult(ApplicationContext, result)); }
/// <summary> /// Creates an instance of the object. /// </summary> /// <param name="dataPortalContext"> /// Data portal context object. /// </param> /// <param name="objectType"> /// Business object type. /// </param> /// <param name="obj"> /// Criteria or business object for request. /// </param> /// <param name="operation"> /// Data portal operation being performed. /// </param> public DataPortalEventArgs(Server.DataPortalContext dataPortalContext, Type objectType, object obj, DataPortalOperations operation) { _dataPortalContext = dataPortalContext; _operation = operation; _objectType = objectType; _object = obj; }
internal AuthorizeRequest(ApplicationContext applicationContext, Type objectType, object requestObject, DataPortalOperations operation) { ApplicationContext = applicationContext; this.ObjectType = objectType; this.RequestObject = requestObject; this.Operation = operation; }
internal static AuthorizationActions ToAuthAction(this DataPortalOperations operation) { switch (operation) { case DataPortalOperations.Create: return(AuthorizationActions.CreateObject); case DataPortalOperations.Fetch: return(AuthorizationActions.GetObject); case DataPortalOperations.Update: return(AuthorizationActions.EditObject); case DataPortalOperations.Delete: return(AuthorizationActions.DeleteObject); case DataPortalOperations.Execute: // CSLA handles Execute/CommandObject as Update operations // - this is the permission that the client DataPortal checks. return(AuthorizationActions.EditObject); default: throw new ArgumentOutOfRangeException("operation"); } }
/// <summary> /// Creates an instance of the type. /// </summary> /// <param name="dataPortalContext"> /// Data portal context object. /// </param> /// <param name="objectType"> /// Business object type. /// </param> /// <param name="obj"> /// Criteria or business object for request. /// </param> /// <param name="operation"> /// Data portal operation being performed. /// </param> public DataPortalEventArgs(Server.DataPortalContext dataPortalContext, Type objectType, object obj, DataPortalOperations operation) { _dataPortalContext = dataPortalContext; _operation = operation; _objectType = objectType; _object = obj; }
private async Task <DataPortalResult> InvokeMethod(string factoryTypeName, DataPortalOperations operation, string methodName, Type objectType, object e, DataPortalContext context) { object factory = FactoryLoader.GetFactory(factoryTypeName); var eventArgs = new DataPortalEventArgs(context, objectType, e, operation); Csla.Reflection.MethodCaller.CallMethodIfImplemented(factory, "Invoke", eventArgs); object result = null; try { result = await Csla.Reflection.MethodCaller.CallMethodTryAsync(factory, methodName, e).ConfigureAwait(false); var error = result as Exception; if (error != null) { throw error; } var busy = result as Csla.Core.ITrackStatus; if (busy != null && busy.IsBusy) { throw new InvalidOperationException(string.Format("{0}.IsBusy == true", objectType.Name)); } Csla.Reflection.MethodCaller.CallMethodIfImplemented(factory, "InvokeComplete", eventArgs); } catch (Exception ex) { Csla.Reflection.MethodCaller.CallMethodIfImplemented(factory, "InvokeError", new DataPortalEventArgs(context, objectType, e, operation, ex)); throw; } return(new DataPortalResult(result)); }
private async Task <DataPortalResult> InvokeMethod(string factoryTypeName, DataPortalOperations operation, string methodName, Type objectType, object e, DataPortalContext context) { object factory = FactoryLoader.GetFactory(factoryTypeName); var eventArgs = new DataPortalEventArgs(context, objectType, e, operation); Csla.Reflection.MethodCaller.CallMethodIfImplemented(factory, "Invoke", eventArgs); object result = null; try { result = await Csla.Reflection.MethodCaller.CallMethodTryAsync(factory, methodName, e); var error = result as Exception; if (error != null) { throw error; } Csla.Reflection.MethodCaller.CallMethodIfImplemented(factory, "InvokeComplete", eventArgs); } catch (Exception ex) { Csla.Reflection.MethodCaller.CallMethodIfImplemented(factory, "InvokeError", new DataPortalEventArgs(context, objectType, e, operation, ex)); throw; } return(new DataPortalResult(result)); }
public async Task <DataPortalResult> Update(object obj, DataPortalContext context, bool isSync) { DataPortalOperations operation = DataPortalOperations.Update; Type objectType = obj.GetType(); var lb = ApplicationContext.CreateInstance <DataPortalTarget>(obj); if (lb.Instance is Core.ICommandObject) { return(await Execute(lb, context, isSync)); } var eventArgs = new DataPortalEventArgs(context, objectType, obj, operation); try { //ApplicationContext.DataPortalActivator.InitializeInstance(lb.Instance); lb.OnDataPortalInvoke(eventArgs); await lb.UpdateAsync(isSync); lb.ThrowIfBusy(); lb.OnDataPortalInvokeComplete(eventArgs); return(new DataPortalResult(lb.Instance)); } catch (Exception ex) { try { lb.OnDataPortalException(eventArgs, ex); } catch { // ignore exceptions from the exception handler } throw DataPortal.NewDataPortalException( "DataPortal.Update " + Resources.FailedOnServer, new DataPortalExceptionHandler().InspectException(obj.GetType(), obj, null, "DataPortal.Update", ex), obj); } finally { object reference = null; if (lb != null) { reference = lb.Instance; } //ApplicationContext.DataPortalActivator.FinalizeInstance(reference); } }
private async Task <DataPortalResult> Execute(DataPortalTarget obj, DataPortalContext context, bool isSync) { DataPortalOperations operation = DataPortalOperations.Execute; Type objectType = obj.Instance.GetType(); var eventArgs = new DataPortalEventArgs(context, objectType, obj, operation); try { //ApplicationContext.DataPortalActivator.InitializeInstance(obj.Instance); obj.OnDataPortalInvoke(eventArgs); await obj.ExecuteAsync(isSync); obj.ThrowIfBusy(); obj.OnDataPortalInvokeComplete(eventArgs); return(new DataPortalResult(obj.Instance)); } catch (Exception ex) { try { obj.OnDataPortalException(eventArgs, ex); } catch { // ignore exceptions from the exception handler } object reference = null; reference = obj.Instance ?? obj; throw DataPortal.NewDataPortalException( "DataPortal.Execute " + Resources.FailedOnServer, new DataPortalExceptionHandler().InspectException(reference.GetType(), reference, null, "DataPortal.Execute", ex), reference); } finally { object reference = null; if (obj != null) { reference = obj.Instance; } //ApplicationContext.DataPortalActivator.FinalizeInstance(reference); } }
private async Task<DataPortalResult> InvokeMethod(string factoryTypeName, DataPortalOperations operation, string methodName, Type objectType, object e, DataPortalContext context) { object factory = FactoryLoader.GetFactory(factoryTypeName); var eventArgs = new DataPortalEventArgs(context, objectType, e, operation); Csla.Reflection.MethodCaller.CallMethodIfImplemented(factory, "Invoke", eventArgs); object result = null; try { result = await Csla.Reflection.MethodCaller.CallMethodTryAsync(factory, methodName, e); var error = result as Exception; if (error != null) throw error; Csla.Reflection.MethodCaller.CallMethodIfImplemented(factory, "InvokeComplete", eventArgs); } catch (Exception ex) { Csla.Reflection.MethodCaller.CallMethodIfImplemented(factory, "InvokeError", new DataPortalEventArgs(context, objectType, e, operation, ex)); throw; } return new DataPortalResult(result); }
internal static string ToSecurityActionDescription(this DataPortalOperations operation) { switch (operation) { case DataPortalOperations.Create: return("create"); case DataPortalOperations.Fetch: return("get"); case DataPortalOperations.Update: return("save"); case DataPortalOperations.Delete: return("delete"); case DataPortalOperations.Execute: return("execute"); default: throw new ArgumentOutOfRangeException("operation"); } }
internal async Task <T> DoUpdateAsync(T obj, bool isSync) { Server.DataPortalResult result = null; Server.DataPortalContext dpContext = null; DataPortalOperations operation = DataPortalOperations.Update; Type objectType = obj.GetType(); try { DataPortal.OnDataPortalInitInvoke(null); Csla.Server.DataPortalMethodInfo method = null; var factoryInfo = Csla.Server.ObjectFactoryAttribute.GetObjectFactoryAttribute(objectType); if (factoryInfo != null) { var factoryType = Csla.Server.FactoryDataPortal.FactoryLoader.GetFactoryType(factoryInfo.FactoryTypeName); if (obj is Core.ICommandObject) { if (!Csla.Rules.BusinessRules.HasPermission(Rules.AuthorizationActions.EditObject, obj)) { throw new Csla.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException, "execute", objectType.Name)); } if (factoryType != null) { method = Server.DataPortalMethodCache.GetMethodInfo(factoryType, factoryInfo.ExecuteMethodName, new object[] { obj }); } } else { var bbase = obj as Core.BusinessBase; if (bbase != null) { if (bbase.IsDeleted) { if (!Csla.Rules.BusinessRules.HasPermission(Rules.AuthorizationActions.DeleteObject, obj)) { throw new Csla.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException, "delete", objectType.Name)); } if (factoryType != null) { method = Server.DataPortalMethodCache.GetMethodInfo(factoryType, factoryInfo.DeleteMethodName, new object[] { obj }); } } // must check the same authorization rules as for DataPortal_XYZ methods else if (bbase.IsNew) { if (!Csla.Rules.BusinessRules.HasPermission(Rules.AuthorizationActions.CreateObject, obj)) { throw new Csla.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException, "create", objectType.Name)); } if (factoryType != null) { method = Server.DataPortalMethodCache.GetMethodInfo(factoryType, factoryInfo.UpdateMethodName, new object[] { obj }); } } else { if (!Csla.Rules.BusinessRules.HasPermission(Rules.AuthorizationActions.EditObject, obj)) { throw new Csla.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException, "save", objectType.Name)); } if (factoryType != null) { method = Server.DataPortalMethodCache.GetMethodInfo(factoryType, factoryInfo.UpdateMethodName, new object[] { obj }); } } } else { if (!Csla.Rules.BusinessRules.HasPermission(Rules.AuthorizationActions.EditObject, obj)) { throw new Csla.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException, "save", objectType.Name)); } if (factoryType != null) { method = Server.DataPortalMethodCache.GetMethodInfo(factoryType, factoryInfo.UpdateMethodName, new object[] { obj }); } } } if (method == null) { method = new Csla.Server.DataPortalMethodInfo(); } } else { string methodName; if (obj is Core.ICommandObject) { methodName = "DataPortal_Execute"; operation = DataPortalOperations.Execute; if (!Csla.Rules.BusinessRules.HasPermission(Rules.AuthorizationActions.EditObject, obj)) { throw new Csla.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException, "execute", objectType.Name)); } } else { var bbase = obj as Core.BusinessBase; if (bbase != null) { if (bbase.IsDeleted) { methodName = "DataPortal_DeleteSelf"; if (!Csla.Rules.BusinessRules.HasPermission(Rules.AuthorizationActions.DeleteObject, obj)) { throw new Csla.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException, "delete", objectType.Name)); } } else if (bbase.IsNew) { methodName = "DataPortal_Insert"; if (!Csla.Rules.BusinessRules.HasPermission(Rules.AuthorizationActions.CreateObject, obj)) { throw new Csla.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException, "create", objectType.Name)); } } else { methodName = "DataPortal_Update"; if (!Csla.Rules.BusinessRules.HasPermission(Rules.AuthorizationActions.EditObject, obj)) { throw new Csla.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException, "save", objectType.Name)); } } } else { methodName = "DataPortal_Update"; if (!Csla.Rules.BusinessRules.HasPermission(Rules.AuthorizationActions.EditObject, obj)) { throw new Csla.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException, "save", objectType.Name)); } } } method = Server.DataPortalMethodCache.GetMethodInfo(obj.GetType(), methodName); } DataPortalClient.IDataPortalProxy proxy; proxy = GetDataPortalProxy(objectType, method.RunLocal); dpContext = new Server.DataPortalContext(GetPrincipal(), proxy.IsServerRemote); DataPortal.OnDataPortalInvoke(new DataPortalEventArgs(dpContext, objectType, obj, operation)); try { if (!proxy.IsServerRemote && ApplicationContext.AutoCloneOnUpdate) { // when using local data portal, automatically // clone original object before saving ICloneable cloneable = obj as ICloneable; if (cloneable != null) { obj = (T)cloneable.Clone(); } } result = await proxy.Update(obj, dpContext, isSync); } catch (AggregateException ex) { if (ex.InnerExceptions.Count > 0) { var dpe = ex.InnerExceptions[0] as Server.DataPortalException; if (dpe != null) { HandleUpdateDataPortalException(dpe, isSync, proxy); } } throw new DataPortalException( string.Format("DataPortal.Update {0}", Resources.Failed), ex, null); } catch (Server.DataPortalException ex) { HandleUpdateDataPortalException(ex, isSync, proxy); } GlobalContext = result.GlobalContext; if (proxy.IsServerRemote && isSync) { ApplicationContext.ContextManager.SetGlobalContext(GlobalContext); } DataPortal.OnDataPortalInvokeComplete(new DataPortalEventArgs(dpContext, objectType, obj, operation)); } catch (Exception ex) { DataPortal.OnDataPortalInvokeComplete(new DataPortalEventArgs(dpContext, objectType, obj, operation, ex)); throw; } return((T)result.ReturnObject); }
public async Task <DataPortalResult> Update(object obj, DataPortalContext context, bool isSync) { DataPortalOperations operation = DataPortalOperations.Update; Type objectType = obj.GetType(); var target = obj as IDataPortalTarget; LateBoundObject lb = new LateBoundObject(obj); ApplicationContext.DataPortalActivator.InitializeInstance(lb.Instance); try { if (target != null) { target.DataPortal_OnDataPortalInvoke( new DataPortalEventArgs(context, objectType, obj, operation)); } else { lb.CallMethodIfImplemented( "DataPortal_OnDataPortalInvoke", new DataPortalEventArgs(context, objectType, obj, operation)); } // tell the business object to update itself var busObj = obj as Core.BusinessBase; if (busObj != null) { if (busObj.IsDeleted) { if (!busObj.IsNew) { // tell the object to delete itself await lb.CallMethodTryAsync("DataPortal_DeleteSelf").ConfigureAwait(false); } if (target != null) { target.MarkNew(); } else { lb.CallMethodIfImplemented("MarkNew"); } } else { if (busObj.IsNew) { // tell the object to insert itself await lb.CallMethodTryAsync("DataPortal_Insert").ConfigureAwait(false); } else { // tell the object to update itself await lb.CallMethodTryAsync("DataPortal_Update").ConfigureAwait(false); } if (target != null) { target.MarkOld(); } else { lb.CallMethodIfImplemented("MarkOld"); } } } else if (obj is Core.ICommandObject) { operation = DataPortalOperations.Execute; // tell the object to update itself await lb.CallMethodTryAsync("DataPortal_Execute").ConfigureAwait(false); } else { // this is an updatable collection or some other // non-BusinessBase type of object // tell the object to update itself await lb.CallMethodTryAsync("DataPortal_Update").ConfigureAwait(false); if (target != null) { target.MarkOld(); } else { lb.CallMethodIfImplemented("MarkOld"); } } var busy = busObj as Csla.Core.ITrackStatus; if (busy != null && busy.IsBusy) { throw new InvalidOperationException(string.Format("{0}.IsBusy == true", objectType.Name)); } if (target != null) { target.DataPortal_OnDataPortalInvokeComplete( new DataPortalEventArgs(context, objectType, obj, operation)); } else { lb.CallMethodIfImplemented("DataPortal_OnDataPortalInvokeComplete", new DataPortalEventArgs(context, objectType, obj, operation)); } return(new DataPortalResult(obj)); } catch (Exception ex) { try { if (target != null) { target.DataPortal_OnDataPortalException( new DataPortalEventArgs(context, objectType, obj, operation), ex); } else { lb.CallMethodIfImplemented("DataPortal_OnDataPortalException", new DataPortalEventArgs(context, objectType, obj, operation), ex); } } catch { // ignore exceptions from the exception handler } throw DataPortal.NewDataPortalException( "DataPortal.Update " + Resources.FailedOnServer, new DataPortalExceptionHandler().InspectException(obj.GetType(), obj, null, "DataPortal.Update", ex), obj); } }
internal AuthorizeRequest(Type objectType, object requestObject, DataPortalOperations operation) { this.ObjectType = objectType; this.RequestObject = requestObject; this.Operation = operation; }
public DataPortalResult Update(object obj, DataPortalContext context) { DataPortalOperations operation = DataPortalOperations.Update; Type objectType = obj.GetType(); var target = obj as IDataPortalTarget; LateBoundObject lb = new LateBoundObject(obj); try { if (target != null) { target.DataPortal_OnDataPortalInvoke( new DataPortalEventArgs(context, objectType, operation)); } else { lb.CallMethodIfImplemented( "DataPortal_OnDataPortalInvoke", new DataPortalEventArgs(context, objectType, operation)); } // tell the business object to update itself var busObj = obj as Core.BusinessBase; if (busObj != null) { if (busObj.IsDeleted) { if (!busObj.IsNew) { // tell the object to delete itself lb.CallMethod("DataPortal_DeleteSelf"); } if (target != null) { target.MarkNew(); } else { lb.CallMethodIfImplemented("MarkNew"); } } else { if (busObj.IsNew) { // tell the object to insert itself lb.CallMethod("DataPortal_Insert"); } else { // tell the object to update itself lb.CallMethod("DataPortal_Update"); } if (target != null) { target.MarkOld(); } else { lb.CallMethodIfImplemented("MarkOld"); } } } else if (obj is Core.ICommandObject) { operation = DataPortalOperations.Execute; // tell the object to update itself lb.CallMethod("DataPortal_Execute"); } else { // this is an updatable collection or some other // non-BusinessBase type of object // tell the object to update itself lb.CallMethod("DataPortal_Update"); if (target != null) { target.MarkOld(); } else { lb.CallMethodIfImplemented("MarkOld"); } } if (target != null) { target.DataPortal_OnDataPortalInvokeComplete( new DataPortalEventArgs(context, objectType, operation)); } else { lb.CallMethodIfImplemented("DataPortal_OnDataPortalInvokeComplete", new DataPortalEventArgs(context, objectType, operation)); } return(new DataPortalResult(obj)); } catch (Exception ex) { try { if (target != null) { target.DataPortal_OnDataPortalException( new DataPortalEventArgs(context, objectType, operation), ex); } else { lb.CallMethodIfImplemented("DataPortal_OnDataPortalException", new DataPortalEventArgs(context, objectType, operation), ex); } } catch { // ignore exceptions from the exception handler } throw new DataPortalException( "DataPortal.Update " + Resources.FailedOnServer, new DataPortalExceptionHandler().InspectException(obj.GetType(), obj, null, "DataPortal.Update", ex), new DataPortalResult(obj)); } }
/// <summary> /// Creates an instance of the type. /// </summary> /// <param name="dataPortalContext"> /// Data portal context object. /// </param> /// <param name="objectType"> /// Business object type. /// </param> /// <param name="obj"> /// Criteria or business object for request. /// </param> /// <param name="operation"> /// Data portal operation being performed. /// </param> /// <param name="exception"> /// Exception encountered during processing. /// </param> public DataPortalEventArgs(Server.DataPortalContext dataPortalContext, Type objectType, object obj, DataPortalOperations operation, Exception exception) : this(dataPortalContext, objectType, obj, operation) { _exception = exception; }
/// <summary> /// Creates an instance of the object. /// </summary> /// <param name="dataPortalContext"> /// Data portal context object. /// </param> /// <param name="objectType"> /// Business object type. /// </param> /// <param name="obj"> /// Criteria or business object for request. /// </param> /// <param name="operation"> /// Data portal operation being performed. /// </param> /// <param name="exception"> /// Exception encountered during processing. /// </param> public DataPortalEventArgs(Server.DataPortalContext dataPortalContext, Type objectType, object obj, DataPortalOperations operation, Exception exception) : this(dataPortalContext, objectType, obj, operation) { _exception = exception; }
public async Task <DataPortalResult> Update(object obj, DataPortalContext context, bool isSync) { Type objectType = null; DataPortalOperations operation = DataPortalOperations.Update; try { SetContext(context); objectType = obj.GetType(); if (obj is Core.ICommandObject) { operation = DataPortalOperations.Execute; } AuthorizeRequest(new AuthorizeRequest(objectType, obj, operation)); Initialize(new InterceptArgs { ObjectType = objectType, Parameter = obj, Operation = operation, IsSync = isSync }); DataPortalResult result; DataPortalMethodInfo method; var factoryInfo = ObjectFactoryAttribute.GetObjectFactoryAttribute(objectType); if (factoryInfo != null) { string methodName; var factoryLoader = ApplicationContext.CurrentServiceProvider.GetService(typeof(Server.IObjectFactoryLoader)) as Server.IObjectFactoryLoader; var factoryType = factoryLoader?.GetFactoryType(factoryInfo.FactoryTypeName); if (obj is Core.BusinessBase bbase) { if (bbase.IsDeleted) { methodName = factoryInfo.DeleteMethodName; } else { methodName = factoryInfo.UpdateMethodName; } } else if (obj is Core.ICommandObject) { methodName = factoryInfo.ExecuteMethodName; } else { methodName = factoryInfo.UpdateMethodName; } method = Server.DataPortalMethodCache.GetMethodInfo(factoryType, methodName, new object[] { obj }); } else { Reflection.ServiceProviderMethodInfo serviceProviderMethodInfo; if (obj is Core.BusinessBase bbase) { if (bbase.IsDeleted) { serviceProviderMethodInfo = ServiceProviderMethodCaller.FindDataPortalMethod <DeleteSelfAttribute>(objectType, null); } else if (bbase.IsNew) { serviceProviderMethodInfo = ServiceProviderMethodCaller.FindDataPortalMethod <InsertAttribute>(objectType, null); } else { serviceProviderMethodInfo = ServiceProviderMethodCaller.FindDataPortalMethod <UpdateAttribute>(objectType, null); } } else if (obj is Core.ICommandObject) { serviceProviderMethodInfo = ServiceProviderMethodCaller.FindDataPortalMethod <ExecuteAttribute>(objectType, null); } else { serviceProviderMethodInfo = ServiceProviderMethodCaller.FindDataPortalMethod <UpdateAttribute>(objectType, null); } serviceProviderMethodInfo.PrepForInvocation(); method = serviceProviderMethodInfo.DataPortalMethodInfo; } context.TransactionalType = method.TransactionalAttribute.TransactionType; IDataPortalServer portal; switch (method.TransactionalAttribute.TransactionType) { #if !NETSTANDARD2_0 && !NET5_0 && !NET6_0 case TransactionalTypes.EnterpriseServices: portal = GetServicedComponentPortal(method.TransactionalAttribute); try { result = await portal.Update(obj, context, isSync).ConfigureAwait(false); } finally { ((System.EnterpriseServices.ServicedComponent)portal).Dispose(); } break; #endif case TransactionalTypes.TransactionScope: var broker = ApplicationContext.CreateInstanceDI <DataPortalBroker>(); portal = new TransactionalDataPortal(broker, method.TransactionalAttribute); result = await portal.Update(obj, context, isSync).ConfigureAwait(false); break; default: portal = ApplicationContext.CreateInstanceDI <DataPortalBroker>(); result = await portal.Update(obj, context, isSync).ConfigureAwait(false); break; } Complete(new InterceptArgs { ObjectType = objectType, Parameter = obj, Result = result, Operation = operation, IsSync = isSync }); return(result); } catch (Csla.Server.DataPortalException ex) { Complete(new InterceptArgs { ObjectType = objectType, Parameter = obj, Exception = ex, Operation = operation, IsSync = isSync }); throw; } catch (AggregateException ex) { Exception error = null; if (ex.InnerExceptions.Count > 0) { error = ex.InnerExceptions[0].InnerException; } else { error = ex; } var fex = DataPortal.NewDataPortalException( ApplicationContext, "DataPortal.Update " + Resources.FailedOnServer, DataPortalExceptionHandler.InspectException(obj.GetType(), obj, null, "DataPortal.Update", error), obj); Complete(new InterceptArgs { ObjectType = objectType, Parameter = obj, Exception = fex, Operation = operation, IsSync = isSync }); throw fex; } catch (Exception ex) { var fex = DataPortal.NewDataPortalException( ApplicationContext, "DataPortal.Update " + Resources.FailedOnServer, DataPortalExceptionHandler.InspectException(obj.GetType(), obj, null, "DataPortal.Update", ex), obj); Complete(new InterceptArgs { ObjectType = objectType, Parameter = obj, Exception = fex, Operation = operation, IsSync = isSync }); throw fex; } finally { ClearContext(context); } }
public async Task <DataPortalResult> Update(object obj, DataPortalContext context, bool isSync) { Type objectType = null; DataPortalOperations operation = DataPortalOperations.Update; try { SetContext(context); objectType = obj.GetType(); if (obj is Core.ICommandObject) { operation = DataPortalOperations.Execute; } Initialize(new InterceptArgs { ObjectType = objectType, Parameter = obj, Operation = operation, IsSync = isSync }); AuthorizeRequest(new AuthorizeRequest(objectType, obj, operation)); DataPortalResult result; DataPortalMethodInfo method; var factoryInfo = ObjectFactoryAttribute.GetObjectFactoryAttribute(objectType); if (factoryInfo != null) { string methodName; var factoryType = FactoryDataPortal.FactoryLoader.GetFactoryType(factoryInfo.FactoryTypeName); var bbase = obj as Core.BusinessBase; if (bbase != null) { if (bbase.IsDeleted) { methodName = factoryInfo.DeleteMethodName; } else { methodName = factoryInfo.UpdateMethodName; } } else if (obj is Core.ICommandObject) { methodName = factoryInfo.ExecuteMethodName; } else { methodName = factoryInfo.UpdateMethodName; } method = Server.DataPortalMethodCache.GetMethodInfo(factoryType, methodName, new object[] { obj }); } else { string methodName; var bbase = obj as Core.BusinessBase; if (bbase != null) { if (bbase.IsDeleted) { methodName = "DataPortal_DeleteSelf"; } else if (bbase.IsNew) { methodName = "DataPortal_Insert"; } else { methodName = "DataPortal_Update"; } } else if (obj is Core.ICommandObject) { methodName = "DataPortal_Execute"; } else { methodName = "DataPortal_Update"; } method = DataPortalMethodCache.GetMethodInfo(obj.GetType(), methodName); } #if !(ANDROID || IOS) && !NETFX_CORE context.TransactionalType = method.TransactionalAttribute.TransactionType; #else context.TransactionalType = method.TransactionalType; #endif IDataPortalServer portal; #if !(ANDROID || IOS) && !NETFX_CORE switch (method.TransactionalAttribute.TransactionType) { #if !MONO case TransactionalTypes.EnterpriseServices: portal = GetServicedComponentPortal(method.TransactionalAttribute); try { result = await portal.Update(obj, context, isSync).ConfigureAwait(false); } finally { ((System.EnterpriseServices.ServicedComponent)portal).Dispose(); } break; #endif case TransactionalTypes.TransactionScope: portal = new TransactionalDataPortal(method.TransactionalAttribute); result = await portal.Update(obj, context, isSync).ConfigureAwait(false); break; default: portal = new DataPortalBroker(); result = await portal.Update(obj, context, isSync).ConfigureAwait(false); break; } #else portal = new DataPortalBroker(); result = await portal.Update(obj, context, isSync).ConfigureAwait(false); #endif Complete(new InterceptArgs { ObjectType = objectType, Parameter = obj, Result = result, Operation = operation, IsSync = isSync }); return(result); } catch (Csla.Server.DataPortalException ex) { Complete(new InterceptArgs { ObjectType = objectType, Parameter = obj, Exception = ex, Operation = operation, IsSync = isSync }); throw; } catch (AggregateException ex) { Exception error = null; if (ex.InnerExceptions.Count > 0) { error = ex.InnerExceptions[0].InnerException; } else { error = ex; } var fex = DataPortal.NewDataPortalException( "DataPortal.Update " + Resources.FailedOnServer, new DataPortalExceptionHandler().InspectException(obj.GetType(), obj, null, "DataPortal.Update", error), obj); Complete(new InterceptArgs { ObjectType = objectType, Parameter = obj, Exception = fex, Operation = operation, IsSync = isSync }); throw fex; } catch (Exception ex) { var fex = DataPortal.NewDataPortalException( "DataPortal.Update " + Resources.FailedOnServer, new DataPortalExceptionHandler().InspectException(obj.GetType(), obj, null, "DataPortal.Update", ex), obj); Complete(new InterceptArgs { ObjectType = objectType, Parameter = obj, Exception = fex, Operation = operation, IsSync = isSync }); throw fex; } finally { ClearContext(context); } }
/// <summary> /// Called by the business object's Save() method to /// insert, update or delete an object in the database. /// </summary> /// <remarks> /// Note that this method returns a reference to the updated business object. /// If the server-side DataPortal is running remotely, this will be a new and /// different object from the original, and all object references MUST be updated /// to use this new object. /// </remarks> /// <param name="obj">A reference to the business object to be updated.</param> /// <returns>A reference to the updated business object.</returns> public static object Update(object obj) { Server.DataPortalResult result = null; Server.DataPortalContext dpContext = null; DataPortalOperations operation = DataPortalOperations.Update; Type objectType = obj.GetType(); try { OnDataPortalInitInvoke(null); DataPortalMethodInfo method; var factoryInfo = ObjectFactoryAttribute.GetObjectFactoryAttribute(objectType); if (factoryInfo != null) { var factoryType = FactoryDataPortal.FactoryLoader.GetFactoryType(factoryInfo.FactoryTypeName); var bbase = obj as Core.BusinessBase; if (bbase != null && bbase.IsDeleted) { if (!YYT.Security.AuthorizationRules.CanDeleteObject(objectType)) { throw new System.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException, "delete", objectType.Name)); } method = Server.DataPortalMethodCache.GetMethodInfo(factoryType, factoryInfo.DeleteMethodName, new object[] { obj }); } else { if (!YYT.Security.AuthorizationRules.CanEditObject(objectType)) { throw new System.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException, "save", objectType.Name)); } method = Server.DataPortalMethodCache.GetMethodInfo(factoryType, factoryInfo.UpdateMethodName, new object[] { obj }); } } else { string methodName; if (obj is CommandBase) { methodName = "DataPortal_Execute"; operation = DataPortalOperations.Execute; if (!YYT.Security.AuthorizationRules.CanEditObject(objectType)) { throw new System.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException, "execute", objectType.Name)); } } else { var bbase = obj as Core.BusinessBase; if (bbase != null) { if (bbase.IsDeleted) { methodName = "DataPortal_DeleteSelf"; if (!YYT.Security.AuthorizationRules.CanDeleteObject(objectType)) { throw new System.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException, "delete", objectType.Name)); } } else if (bbase.IsNew) { methodName = "DataPortal_Insert"; if (!YYT.Security.AuthorizationRules.CanCreateObject(objectType)) { throw new System.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException, "create", objectType.Name)); } } else { methodName = "DataPortal_Update"; if (!YYT.Security.AuthorizationRules.CanEditObject(objectType)) { throw new System.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException, "save", objectType.Name)); } } } else { methodName = "DataPortal_Update"; if (!YYT.Security.AuthorizationRules.CanEditObject(objectType)) { throw new System.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException, "save", objectType.Name)); } } } method = Server.DataPortalMethodCache.GetMethodInfo(obj.GetType(), methodName); } DataPortalClient.IDataPortalProxy proxy; proxy = GetDataPortalProxy(method.RunLocal); dpContext = new Server.DataPortalContext(GetPrincipal(), proxy.IsServerRemote); OnDataPortalInvoke(new DataPortalEventArgs(dpContext, objectType, operation)); try { if (!proxy.IsServerRemote && ApplicationContext.AutoCloneOnUpdate) { // when using local data portal, automatically // clone original object before saving ICloneable cloneable = obj as ICloneable; if (cloneable != null) { obj = cloneable.Clone(); } } result = proxy.Update(obj, dpContext); } catch (Server.DataPortalException ex) { result = ex.Result; if (proxy.IsServerRemote) { ApplicationContext.SetGlobalContext(result.GlobalContext); } throw new DataPortalException( String.Format("DataPortal.Update {0} ({1})", Resources.Failed, ex.InnerException.InnerException), ex.InnerException, result.ReturnObject); } if (proxy.IsServerRemote) { ApplicationContext.SetGlobalContext(result.GlobalContext); } OnDataPortalInvokeComplete(new DataPortalEventArgs(dpContext, objectType, operation)); } catch (Exception ex) { OnDataPortalInvokeComplete(new DataPortalEventArgs(dpContext, objectType, operation, ex)); throw; } return(result.ReturnObject); }
public async Task <DataPortalResult> Update(object obj, DataPortalContext context, bool isSync) { Type objectType = null; DataPortalOperations operation = DataPortalOperations.Update; try { SetContext(context); objectType = obj.GetType(); if (obj is Core.ICommandObject) { operation = DataPortalOperations.Execute; } Initialize(new InterceptArgs { ObjectType = objectType, Parameter = obj, Operation = operation, IsSync = isSync }); AuthorizeRequest(new AuthorizeRequest(objectType, obj, operation)); DataPortalResult result; DataPortalMethodInfo method; var factoryInfo = ObjectFactoryAttribute.GetObjectFactoryAttribute(objectType); if (factoryInfo != null) { string methodName; var factoryType = FactoryDataPortal.FactoryLoader.GetFactoryType(factoryInfo.FactoryTypeName); var bbase = obj as Core.BusinessBase; if (bbase != null) { if (bbase.IsDeleted) { methodName = factoryInfo.DeleteMethodName; } else { methodName = factoryInfo.UpdateMethodName; } } else if (obj is Core.ICommandObject) { methodName = factoryInfo.ExecuteMethodName; } else { methodName = factoryInfo.UpdateMethodName; } method = Server.DataPortalMethodCache.GetMethodInfo(factoryType, methodName, new object[] { obj }); } #if NET40 else { string methodName; var bbase = obj as Core.BusinessBase; if (bbase != null) { if (bbase.IsDeleted) { methodName = "DataPortal_DeleteSelf"; } else if (bbase.IsNew) { methodName = "DataPortal_Insert"; } else { methodName = "DataPortal_Update"; } } else if (obj is Core.ICommandObject) { methodName = "DataPortal_Execute"; } else { methodName = "DataPortal_Update"; } method = DataPortalMethodCache.GetMethodInfo(obj.GetType(), methodName); } #else else { Reflection.ServiceProviderMethodInfo serviceProviderMethodInfo; var bbase = obj as Core.BusinessBase; if (bbase != null) { if (bbase.IsDeleted) { serviceProviderMethodInfo = Reflection.ServiceProviderMethodCaller.FindDataPortalMethod <DeleteSelfAttribute>(objectType, null); } else if (bbase.IsNew) { serviceProviderMethodInfo = Reflection.ServiceProviderMethodCaller.FindDataPortalMethod <InsertAttribute>(objectType, null); } else { serviceProviderMethodInfo = Reflection.ServiceProviderMethodCaller.FindDataPortalMethod <UpdateAttribute>(objectType, null); } } else if (obj is Core.ICommandObject) { serviceProviderMethodInfo = Reflection.ServiceProviderMethodCaller.FindDataPortalMethod <ExecuteAttribute>(objectType, null); } else { serviceProviderMethodInfo = Reflection.ServiceProviderMethodCaller.FindDataPortalMethod <UpdateAttribute>(objectType, null); } serviceProviderMethodInfo.PrepForInvocation(); method = serviceProviderMethodInfo.DataPortalMethodInfo; } #endif #if !(ANDROID || IOS) && !NETFX_CORE context.TransactionalType = method.TransactionalAttribute.TransactionType; #else context.TransactionalType = method.TransactionalType; #endif IDataPortalServer portal; #if !(ANDROID || IOS) && !NETFX_CORE switch (method.TransactionalAttribute.TransactionType) { #if !MONO && !NETSTANDARD2_0 && !NET5_0 case TransactionalTypes.EnterpriseServices: portal = GetServicedComponentPortal(method.TransactionalAttribute); try { result = await portal.Update(obj, context, isSync).ConfigureAwait(false); } finally { ((System.EnterpriseServices.ServicedComponent)portal).Dispose(); } break; #endif case TransactionalTypes.TransactionScope: portal = new TransactionalDataPortal(method.TransactionalAttribute); result = await portal.Update(obj, context, isSync).ConfigureAwait(false); break; default: portal = new DataPortalBroker(); result = await portal.Update(obj, context, isSync).ConfigureAwait(false); break; } #else portal = new DataPortalBroker(); result = await portal.Update(obj, context, isSync).ConfigureAwait(false); #endif Complete(new InterceptArgs { ObjectType = objectType, Parameter = obj, Result = result, Operation = operation, IsSync = isSync }); return(result); }