Beispiel #1
0
    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);
    }
Beispiel #2
0
        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));
        }
Beispiel #3
0
 /// <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;
 }
Beispiel #4
0
 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");
            }
        }
Beispiel #6
0
 /// <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;
 }
Beispiel #7
0
        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));
        }
Beispiel #8
0
        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));
        }
Beispiel #9
0
        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);
            }
        }
Beispiel #10
0
        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);
            }
        }
Beispiel #11
0
    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");
            }
        }
Beispiel #13
0
        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);
        }
Beispiel #14
0
        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));
            }
        }
Beispiel #17
0
 /// <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;
 }
Beispiel #18
0
 /// <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;
 }
Beispiel #19
0
        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);
            }
        }
Beispiel #20
0
        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);
            }
        }
Beispiel #21
0
 internal AuthorizeRequest(Type objectType, object requestObject, DataPortalOperations operation)
 {
     this.ObjectType = objectType;
       this.RequestObject = requestObject;
       this.Operation = operation;
 }
Beispiel #22
0
        /// <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);
        }
Beispiel #23
0
        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);
            }