コード例 #1
0
        private static object Create(Type objectType, object criteria)
        {
            Server.DataPortalResult  result    = null;
            Server.DataPortalContext dpContext = null;
            try
            {
                OnDataPortalInitInvoke(null);

                if (!YYT.Security.AuthorizationRules.CanCreateObject(objectType))
                {
                    throw new System.Security.SecurityException(string.Format(
                                                                    Resources.UserNotAuthorizedException,
                                                                    "create",
                                                                    objectType.Name));
                }

                var method = Server.DataPortalMethodCache.GetCreateMethod(objectType, criteria);

                DataPortalClient.IDataPortalProxy proxy;
                proxy = GetDataPortalProxy(method.RunLocal);

                dpContext =
                    new YYT.Server.DataPortalContext(GetPrincipal(), proxy.IsServerRemote);

                OnDataPortalInvoke(new DataPortalEventArgs(dpContext, objectType, DataPortalOperations.Create));

                try
                {
                    result = proxy.Create(objectType, criteria, dpContext);
                }
                catch (Server.DataPortalException ex)
                {
                    result = ex.Result;
                    if (proxy.IsServerRemote)
                    {
                        ApplicationContext.SetGlobalContext(result.GlobalContext);
                    }
                    throw new DataPortalException(
                              string.Format("DataPortal.Create {0} ({1})", Resources.Failed, ex.InnerException.InnerException),
                              ex.InnerException, result.ReturnObject);
                }

                if (proxy.IsServerRemote)
                {
                    ApplicationContext.SetGlobalContext(result.GlobalContext);
                }

                OnDataPortalInvokeComplete(new DataPortalEventArgs(dpContext, objectType, DataPortalOperations.Create));
            }
            catch (Exception ex)
            {
                OnDataPortalInvokeComplete(new DataPortalEventArgs(dpContext, objectType, DataPortalOperations.Create, ex));
                throw;
            }
            return(result.ReturnObject);
        }
コード例 #2
0
 /// <summary>
 /// Delete a business object.
 /// </summary>
 /// <param name="objectType">Type of business object to create.</param>
 /// <param name="criteria">Criteria object describing business object.</param>
 /// <param name="context">
 /// <see cref="Server.DataPortalContext" /> object passed to the server.
 /// </param>
 public DataPortalResult Delete(Type objectType, object criteria, DataPortalContext context)
 {
     try
     {
         DataPortalResult result = null;
         if (criteria is int)
         {
             result = InvokeMethod(context.FactoryInfo.FactoryTypeName, context.FactoryInfo.DeleteMethodName, context);
         }
         else
         {
             result = InvokeMethod(context.FactoryInfo.FactoryTypeName, context.FactoryInfo.DeleteMethodName, criteria, context);
         }
         return(result);
     }
     catch (Exception ex)
     {
         throw new DataPortalException(
                   context.FactoryInfo.DeleteMethodName + " " + Resources.FailedOnServer,
                   ex, new DataPortalResult());
     }
 }
コード例 #3
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);
        }
コード例 #4
0
        internal static object Fetch(Type objectType, object criteria)
        {
            Server.DataPortalResult  result    = null;
            Server.DataPortalContext dpContext = null;
            try
            {
                OnDataPortalInitInvoke(null);

                if (!YYT.Security.AuthorizationRules.CanGetObject(objectType))
                {
                    throw new System.Security.SecurityException(string.Format(Resources.UserNotAuthorizedException,
                                                                              "get",
                                                                              objectType.Name));
                }

                var method = Server.DataPortalMethodCache.GetFetchMethod(objectType, criteria);

                DataPortalClient.IDataPortalProxy proxy;
                proxy = GetDataPortalProxy(method.RunLocal);

                dpContext =
                    new Server.DataPortalContext(GetPrincipal(),
                                                 proxy.IsServerRemote);

                OnDataPortalInvoke(new DataPortalEventArgs(dpContext, objectType, DataPortalOperations.Fetch));

                try
                {
                    result = proxy.Fetch(objectType, criteria, dpContext);
                }
                catch (Server.DataPortalException ex)
                {
                    result = ex.Result;
                    if (proxy.IsServerRemote)
                    {
                        ApplicationContext.SetGlobalContext(result.GlobalContext);
                    }
                    string innerMessage = string.Empty;
                    if (ex.InnerException is YYT.Reflection.CallMethodException)
                    {
                        if (ex.InnerException.InnerException != null)
                        {
                            innerMessage = ex.InnerException.InnerException.Message;
                        }
                    }
                    else
                    {
                        innerMessage = ex.InnerException.Message;
                    }
                    throw new DataPortalException(
                              String.Format("DataPortal.Fetch {0} ({1})", Resources.Failed, innerMessage),
                              ex.InnerException, result.ReturnObject);
                }

                if (proxy.IsServerRemote)
                {
                    ApplicationContext.SetGlobalContext(result.GlobalContext);
                }

                OnDataPortalInvokeComplete(new DataPortalEventArgs(dpContext, objectType, DataPortalOperations.Fetch));
            }
            catch (Exception ex)
            {
                OnDataPortalInvokeComplete(new DataPortalEventArgs(dpContext, objectType, DataPortalOperations.Fetch, ex));
                throw;
            }
            return(result.ReturnObject);
        }
コード例 #5
0
        public DataPortalResult Update(object obj, DataPortalContext context)
        {
            try
            {
                SetContext(context);

                Authorize(new AuthorizeRequest(obj.GetType(), obj, DataPortalOperations.Update));

                DataPortalResult     result;
                DataPortalMethodInfo method;
                var factoryInfo = ObjectFactoryAttribute.GetObjectFactoryAttribute(obj.GetType());
                if (factoryInfo != null)
                {
                    var factoryType = FactoryDataPortal.FactoryLoader.GetFactoryType(factoryInfo.FactoryTypeName);
                    var bbase       = obj as Core.BusinessBase;
                    if (bbase != null && bbase.IsDeleted)
                    {
                        method = Server.DataPortalMethodCache.GetMethodInfo(factoryType, factoryInfo.DeleteMethodName, new object[] { obj });
                    }
                    else
                    {
                        method = Server.DataPortalMethodCache.GetMethodInfo(factoryType, factoryInfo.UpdateMethodName, 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 CommandBase)
                    {
                        methodName = "DataPortal_Execute";
                    }
                    else
                    {
                        methodName = "DataPortal_Update";
                    }
                    method = DataPortalMethodCache.GetMethodInfo(obj.GetType(), methodName);
                }

                context.TransactionalType = method.TransactionalType;
                IDataPortalServer portal;
                switch (method.TransactionalType)
                {
                case TransactionalTypes.EnterpriseServices:
                    portal = new ServicedDataPortal();
                    try
                    {
                        result = portal.Update(obj, context);
                    }
                    finally
                    {
                        ((ServicedDataPortal)portal).Dispose();
                    }
                    break;

                case TransactionalTypes.TransactionScope:
                    portal = new TransactionalDataPortal();
                    result = portal.Update(obj, context);
                    break;

                default:
                    portal = new DataPortalSelector();
                    result = portal.Update(obj, context);
                    break;
                }
                return(result);
            }
            catch (YYT.Server.DataPortalException ex)
            {
                Exception tmp = ex;
                throw;
            }
            catch (Exception ex)
            {
                throw new DataPortalException(
                          "DataPortal.Update " + Resources.FailedOnServer,
                          ex, new DataPortalResult());
            }
            finally
            {
                ClearContext(context);
            }
        }
コード例 #6
0
        public DataPortalResult Delete(Type objectType, object criteria, DataPortalContext context)
        {
            var portal = new DataPortalSelector();

            return(portal.Delete(objectType, criteria, context));
        }
コード例 #7
0
        public DataPortalResult Update(object obj, DataPortalContext context)
        {
            var portal = new DataPortalSelector();

            return(portal.Update(obj, context));
        }
コード例 #8
0
        public DataPortalResult Create(
            Type objectType, object criteria, DataPortalContext context)
        {
            LateBoundObject   obj    = null;
            IDataPortalTarget target = null;
            var eventArgs            = new DataPortalEventArgs(context, objectType, DataPortalOperations.Create);

            try
            {
                // create an instance of the business object.
                obj = new LateBoundObject(objectType);

                target = obj.Instance as IDataPortalTarget;

                if (target != null)
                {
                    target.DataPortal_OnDataPortalInvoke(eventArgs);
                    target.MarkNew();
                }
                else
                {
                    obj.CallMethodIfImplemented("DataPortal_OnDataPortalInvoke", eventArgs);
                    obj.CallMethodIfImplemented("MarkNew");
                }

                // tell the business object to create its data
                if (criteria is int)
                {
                    obj.CallMethod("DataPortal_Create");
                }
                else
                {
                    obj.CallMethod("DataPortal_Create", criteria);
                }

                if (target != null)
                {
                    target.DataPortal_OnDataPortalInvokeComplete(eventArgs);
                }
                else
                {
                    obj.CallMethodIfImplemented(
                        "DataPortal_OnDataPortalInvokeComplete", eventArgs);
                }

                // return the populated business object as a result
                return(new DataPortalResult(obj.Instance));
            }
            catch (Exception ex)
            {
                try
                {
                    if (target != null)
                    {
                        target.DataPortal_OnDataPortalException(eventArgs, ex);
                    }
                    else
                    {
                        obj.CallMethodIfImplemented(
                            "DataPortal_OnDataPortalException",
                            eventArgs, ex);
                    }
                }
                catch
                {
                    // ignore exceptions from the exception handler
                }
                object outval = null;
                if (obj != null)
                {
                    outval = obj.Instance;
                }
                throw new DataPortalException(
                          "DataPortal.Create " + Resources.FailedOnServer,
                          ex, new DataPortalResult(outval));
            }
        }
コード例 #9
0
        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 CommandBase)
                {
                    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,
                          ex, new DataPortalResult(obj));
            }
        }
コード例 #10
0
        private DataPortalResult InvokeMethod(string factoryTypeName, string methodName, object e, DataPortalContext context)
        {
            object factory = FactoryLoader.GetFactory(factoryTypeName);

            YYT.Reflection.MethodCaller.CallMethodIfImplemented(factory, "Invoke", context);
            object result = null;

            try
            {
                result = YYT.Reflection.MethodCaller.CallMethod(factory, methodName, e);
                YYT.Reflection.MethodCaller.CallMethodIfImplemented(factory, "InvokeComplete", context);
            }
            catch (Exception ex)
            {
                YYT.Reflection.MethodCaller.CallMethodIfImplemented(factory, "InvokeError", ex);
                throw;
            }
            return(new DataPortalResult(result));
        }
コード例 #11
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="operation">
 /// Data portal operation being performed.
 /// </param>
 /// <param name="exception">
 /// Exception encountered during processing.
 /// </param>
 public DataPortalEventArgs(Server.DataPortalContext dataPortalContext, Type objectType, DataPortalOperations operation, Exception exception)
     : this(dataPortalContext, objectType, operation)
 {
     _exception = exception;
 }
コード例 #12
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="operation">
 /// Data portal operation being performed.
 /// </param>
 public DataPortalEventArgs(Server.DataPortalContext dataPortalContext, Type objectType, DataPortalOperations operation)
 {
     _dataPortalContext = dataPortalContext;
     _operation         = operation;
     _objectType        = objectType;
 }