Esempio n. 1
0
        private void UpdateChildDepartments(XStorageConnection con, DomainObjectDataSet dataSet, Guid objectID, bool IsArchive)
        {
            // Обновляем вложенные департаменты, если мы меняем признак на "Архивный".
            // Если признак "Архивный" снимается, каскадной разархивации не происходит.
            // зачитаем идентификаторы всех подчиненных департаментов, состояние которых отличается от требуемого
            if (IsArchive)
            {
                XDbCommand cmd = con.CreateCommand(@"
				    SELECT d.ObjectID
				    FROM dbo.Department as d_s WITH(NOLOCK)
					    JOIN dbo.Department as d  WITH(NOLOCK) ON d.LIndex > d_s.LIndex AND d.RIndex < d_s.RIndex AND d.Organization = d_s.Organization
				    WHERE d_s.ObjectID = @ObjectID AND d.IsArchive <> @IsArchive
				    "                );
                cmd.Parameters.Add("ObjectID", DbType.Guid, ParameterDirection.Input, false, objectID);
                cmd.Parameters.Add("IsArchive", DbType.Boolean, ParameterDirection.Input, false, IsArchive);
                using (IDataReader reader = cmd.ExecuteReader())
                {
                    DomainObjectData xobjSubDepartment;
                    while (reader.Read())
                    {
                        xobjSubDepartment = dataSet.GetLoadedStub("Department", reader.GetGuid(0));
                        xobjSubDepartment.SetUpdatedPropValue("IsArchive", IsArchive);
                    }
                }
            }
        }
Esempio n. 2
0
        public void ExecuteTrigger(DomainObjectDataSet dataSet, DomainObjectData xobj, IXExecutionContext context)
        {
            XTrigger     trigger = (XTrigger)m_factory.GetInstance();
            XTriggerArgs args    = new XTriggerArgs(m_action, m_fireTime, m_fireType, dataSet, xobj);

            trigger.Execute(args, context);
        }
Esempio n. 3
0
        public override XTreeMenuInfo GetMenu(XGetTreeMenuRequest request, IXExecutionContext context, XTreePageInfoStd treePage)
        {
            XTreeStructInfo  treeStructInfo = treePage.TreeStruct;
            XTreeLevelInfoIT levelinfo      = treeStructInfo.Executor.GetTreeLevel(treeStructInfo, request.Params, request.Path);

            XTreeMenuInfo       treemenu = null;
            DomainObjectDataSet dataSet  = new DomainObjectDataSet(context.Connection.MetadataManager.XModel);
            Guid ObjectID = request.Path[0].ObjectID;

            switch (levelinfo.ObjectType)
            {
            case "IncidentCategory":
                treemenu = getMenuForIncidentCategory(ObjectID, dataSet, context);
                break;

            default:
                treemenu = levelinfo.GetMenu(request, context);
                break;
            }
            if (treemenu == null)
            {
                treemenu = treePage.DefaultLevelMenu.GetMenu(levelinfo, request, context);
            }

            if (treemenu != null)
            {
                if (context.Config.IsDebugMode)
                {
                    treemenu.Items.AddActionItem("ќбновить", StdActions.DoNodeRefresh).SeparatorBefore = true;
                }
            }

            return(treemenu);
        }
Esempio n. 4
0
        /// <summary>
        /// Выполнение команды - типизированный вариант
        /// </summary>
        /// <param name="request">Запрос команды, должен иметь тип XGetPropertyRequest</param>
        /// <param name="context">Контекст выполнения команды</param>
        /// <returns>XGetPropertyResponse</returns>
        public new XGetPropertyResponse Execute(XGetPropertyRequest request, IXExecutionContext context)
        {
            DomainObjectDataSet dataSet = new DomainObjectDataSet(context.Connection.MetadataManager.XModel);
            // создадим болванку объекта
            DomainObjectData xobj = dataSet.GetLoadedStub(request.TypeName, request.ObjectID);

            // загрузим свойства
            dataSet.LoadProperty(context.Connection, xobj, request.PropName);
            // создадим форматировщик
            DomainObjectDataXmlFormatter formatter = new DomainObjectDataXmlFormatter(context.Connection.MetadataManager);
            // и сериализуем свойство в XML
            XmlElement xmlProperty = formatter.SerializeProperty(xobj, request.PropName);

            // по всем объектам в свойстве (LoadProperty вызывается не только для объектных свойств - еще для bin и text)
            // обработаем объект и все вложенные объекты в прогруженных свойства, расставим атрибуты ограничения доступа
            foreach (XmlElement xmlObject in xmlProperty.SelectNodes("*[*]"))
            {
                DomainObjectData xobjValue = xobj.Context.Find(xmlObject.LocalName, new Guid(xmlObject.GetAttribute("oid")));
                if (xobjValue == null)
                {
                    throw new ApplicationException("Не удалось найти в контексте типизированного объекта DomainObjectData для xml-объекта-значения свойства " + xmlProperty.LocalName + " объекта " + xmlObject.LocalName);
                }
                XmlObjectRightsProcessor.ProcessObject(xobjValue, xmlObject);
            }
            XGetPropertyResponse response = new XGetPropertyResponse(xmlProperty);

            return(response);
        }
Esempio n. 5
0
        private DomainObjectData loadFolderAndIncident(DomainObjectDataSet dataSet, GetMailMsgInfoRequest request, IXExecutionContext context)
        {
            DomainObjectData xobjFolder;

            if (request.ObjectType == "Folder")
            {
                xobjFolder = dataSet.GetLoadedStub("Folder", request.ObjectID);
                dataSet.LoadProperty(context.Connection, xobjFolder, "Name");
            }
            else
            {
                XDbCommand cmd = context.Connection.CreateCommand(
                    @"SELECT f.ObjectID as FolderID, f.Name as FolderName, i.Name as IncidentName, i.Number as IncidentNumber
					FROM Incident i JOIN Folder f ON i.Folder=f.ObjectID 
					WHERE i.ObjectID = @IncidentID"                    );
                cmd.Parameters.Add("IncidentID", DbType.Guid, ParameterDirection.Input, false, request.ObjectID);
                DomainObjectData xobjIncident = dataSet.GetLoadedStub("Incident", request.ObjectID);
                using (IDataReader reader = cmd.ExecuteReader())
                {
                    if (!reader.Read())
                    {
                        throw new XObjectNotFoundException("Incident", request.ObjectID);
                    }
                    xobjFolder = dataSet.GetLoadedStub("Folder", reader.GetGuid(reader.GetOrdinal("FolderID")));
                    xobjFolder.SetLoadedPropValue("Name", reader.GetString(reader.GetOrdinal("FolderName")));
                    xobjIncident.SetLoadedPropValue("Name", reader.GetString(reader.GetOrdinal("IncidentName")));
                    xobjIncident.SetLoadedPropValue("Number", reader.GetInt32(reader.GetOrdinal("IncidentNumber")));
                    xobjIncident.SetLoadedPropValue("Folder", xobjFolder.ObjectID);
                }
            }
            return(xobjFolder);
        }
Esempio n. 6
0
        public GetObjectsRightsExResponse Execute(CheckDatagramRequest request, IXExecutionContext context)
        {
            XObjectRightsDescr[] objectPermissionCheckList = new XObjectRightsDescr[request.ObjectsToCheck.Length];

            DomainObjectDataXmlFormatter formatter = new DomainObjectDataXmlFormatter(context.Connection.MetadataManager);
            DomainObjectDataSet          dataSet   = formatter.DeserializeForSave(request.XmlDatagram);

            int nIndex = -1;

            foreach (XObjectIdentity obj_id in request.ObjectsToCheck)
            {
                DomainObjectData xobj = dataSet.Find(obj_id.ObjectType, obj_id.ObjectID);
                //if (xobj.IsNew && xobj == null)
                //	throw new ArgumentException("Датаграмма не содержит нового объекта, для которого требуется вычислить права: " +obj_id.ObjectType + "[" + obj_id.ObjectType + "]");
                if (xobj == null)
                {
                    xobj = dataSet.Load(context.Connection, obj_id.ObjectType, obj_id.ObjectID);
                }
                if (xobj.IsNew)
                {
                    objectPermissionCheckList[++nIndex] = createObjectRightsDescr(XSecurityManager.Instance.GetRightsOnNewObject(xobj));
                }
                else
                {
                    objectPermissionCheckList[++nIndex] = createObjectRightsDescr(XSecurityManager.Instance.GetObjectRights(xobj));
                }
            }

            // Формируем результат операции
            return(new GetObjectsRightsExResponse(objectPermissionCheckList));
        }
Esempio n. 7
0
        /// <summary>
        /// Сохранение данных множества объектов.
        /// </summary>
        /// <remarks>
        /// Управление транзакцией внешнее.
        /// </remarks>
        /// <param name="context"></param>
        /// <param name="dataSet"></param>
        /// <param name="transactionID"></param>
        public static void Save(IXExecutionContext context, DomainObjectDataSet dataSet, Guid transactionID)
        {
            // #1: Вызов триггеров Before
            XTriggersController.Instance.FireTriggers(dataSet, XTriggerFireTimes.Before, context);

            // #2: Сбросим закэшированные данные объектов
            IEnumerator enumerator = dataSet.GetModifiedObjectsEnumerator(false);

            while (enumerator.MoveNext())
            {
                DomainObjectData xobj = (DomainObjectData)enumerator.Current;
                // Примечание: для новых объектов сбрасывать кэш бессмысленно - их там нет
                if (!xobj.IsNew)
                {
                    DomainObjectRegistry.ResetObject(xobj);
                }
            }

            // #3: Запись данных
            XDatagramProcessorEx dg_proc   = XDatagramProcessorMsSqlEx.Instance;
            XDatagramBuilder     dgBuilder = dg_proc.GetDatagramBuilder();
            XDatagram            dg        = dgBuilder.GetDatagram(dataSet);

            dg_proc.Save(context.Connection, dg);

            // #4: Сохранение chunked-данных
            saveChunkedData(transactionID, dg, context.Connection);

            // #5: Сигнализируем Securitymanager, что обновились данные (для очистки кэшей)
            XSecurityManager.Instance.TrackModifiedObjects(dataSet);

            // #6: Вызов триггеров After
            XTriggersController.Instance.FireTriggers(dataSet, XTriggerFireTimes.After, context);
        }
Esempio n. 8
0
 public XTriggerArgs(XTriggerActions action, XTriggerFireTimes fireTimes, XTriggerFireTypes eventType, DomainObjectDataSet dataSet, DomainObjectData xobj)
 {
     m_action   = action;
     m_fireTime = fireTimes;
     m_fireType = eventType;
     m_dataSet  = dataSet;
     m_xobj     = xobj;
 }
        public DomainObjectDataSet DeserializeForSave(XmlElement xmlDatagram)
        {
            DomainObjectDataSet dataSet = new DomainObjectDataSet(m_mdManager.XModel);

            parseXmlForest(xmlDatagram, dataSet);
            checkAndSyncReverseProps(dataSet);
            return(dataSet);
        }
Esempio n. 10
0
        /// <summary>
        /// Операция получения XML-документа с данными набора заданных ds-объектов
        /// ТИПИЗИРОВАННАЯ ВЕРСИЯ МЕТОДА
        /// АВТОМАТИЧЕСКИ ВЫЗЫВАЕТСЯ ЯДРОМ
        /// </summary>
        /// <param name="request">Запрос на вполнение операции</param>
        /// <param name="context">Контекст выоленения операции</param>
        /// <returns>Результат выполенения операции</returns>
        public XGetObjectsResponse Execute(XGetObjectsRequest request, IXExecutionContext context)
        {
            // Проверка праметров - массив с перечнем идентификационных данных
            // объектов должен быть задан, и не должен быть пустым:
            if (null == request.List)
            {
                throw new ArgumentNullException("request.List");
            }
            if (0 == request.List.Length)
            {
                throw new ArgumentException("request.List");
            }

            XmlDocument                  xmlDoc         = new XmlDocument();
            XmlElement                   xmlRootElement = xmlDoc.CreateElement("root");
            DomainObjectDataSet          dataSet        = new DomainObjectDataSet(context.Connection.MetadataManager.XModel);
            DomainObjectDataXmlFormatter formatter      = new DomainObjectDataXmlFormatter(context.Connection.MetadataManager);
            DomainObjectData             xobj;

            foreach (XObjectIdentity i in request.List)
            {
                if (i.ObjectID == Guid.Empty)
                {
                    xmlRootElement.AppendChild(context.Connection.Create(i.ObjectType, xmlDoc));
                }
                else
                {
                    try
                    {
                        xobj = dataSet.Load(context.Connection, i.ObjectType, i.ObjectID);
                        xmlRootElement.AppendChild(formatter.SerializeObject(xobj, xmlDoc));
                    }
                    catch (XObjectNotFoundException)
                    {
                        XmlElement xmlStub = (XmlElement)xmlRootElement.AppendChild(
                            context.Connection.CreateStub(i.ObjectType, i.ObjectID, xmlDoc));
                        xmlStub.SetAttribute("not-found", "1");
                    }
                }
            }
            // по всем запрошенным объектам
            foreach (XmlElement xmlObject in xmlRootElement.SelectNodes("*[*]"))
            {
                // обработаем объект и все вложенные объекты в прогруженных свойства, расставим атрибуты ограничения доступа
                if (!xmlObject.HasAttribute("new"))
                {
                    DomainObjectData xobjValue = dataSet.Find(xmlObject.LocalName, new Guid(xmlObject.GetAttribute("oid")));
                    if (xobjValue == null)
                    {
                        throw new ApplicationException("Не удалось найти в контексте типизированного объекта DomainObjectData для xml объекта: " + xmlObject.OuterXml);
                    }

                    XmlObjectRightsProcessor.ProcessObject(xobjValue, xmlObject);
                }
            }

            return(new XGetObjectsResponse(xmlRootElement));
        }
Esempio n. 11
0
        /// <summary>
        /// Возвращает массив наименований пользователей приложения,
        /// кэш описаний которых следует сбросить из-за изменений объектов в переданном (полученном от клиента) множестве
        /// </summary>
        /// <param name="dataSet">Множество модифицированных объектов</param>
        /// <param name="users">Коллекция (кэш) описаний пользователей приложения (ITUser)</param>
        /// <returns>массив наименований пользователей, описание которых надо сбросить</returns>
        public string[] GetAffectedUserNames(DomainObjectDataSet dataSet, ICollection users)
        {
            string[]  affectedUserNames     = null;
            ArrayList affectedUserNamesList = null;
            bool      bFlushAllUsers        = false;    // признак "сбросить описания всех пользователей"

            foreach (DomainObjectData xobj in dataSet.GetModifiedObjectsByType(new string[] { "SystemUser", "Employee", "ActivityType", "Organization" }, true))
            {
                // при изменении типов проектных затрат сбросим описание всех пользователей
                if (xobj.ObjectType == "ActivityType")
                {
                    bFlushAllUsers = true;
                }
                else if (xobj.ObjectType == "Organization")
                {
                    bFlushAllUsers = true;
                }
                else if (xobj.ObjectType == "SystemUser" || xobj.ObjectType == "Employee")
                {
                    foreach (ITUser user in users)
                    {
                        if (user.SystemUserID == xobj.ObjectID && xobj.ObjectType == "SystemUser" ||
                            user.EmployeeID == xobj.ObjectID && xobj.ObjectType == "Employee"
                            )
                        {
                            if (affectedUserNamesList == null)
                            {
                                affectedUserNamesList = new ArrayList();
                            }
                            affectedUserNamesList.Add(user.Name);
                            break;
                        }
                    }
                }
                if (bFlushAllUsers)
                {
                    if (affectedUserNamesList == null)
                    {
                        affectedUserNamesList = new ArrayList();
                    }
                    else
                    {
                        affectedUserNamesList.Clear();
                    }
                    affectedUserNamesList.Add(XSecurityManager.USERNAME_ALLUSERS);
                    break;
                }
            }
            if (affectedUserNamesList != null)
            {
                affectedUserNames = new string[affectedUserNamesList.Count];
                affectedUserNamesList.CopyTo(affectedUserNames);
            }
            return(affectedUserNames);
        }
Esempio n. 12
0
        protected DomainObjectData getFolderHistoryObject(DomainObjectDataSet dataSet, DomainObjectData xobjFolder)
        {
            DomainObjectData xobjHistory = dataSet.CreateNew("FolderHistory", true);

            xobjHistory.SetUpdatedPropValue("Folder", xobjFolder.ObjectID);
            ITUser user = (ITUser)XSecurityManager.Instance.GetCurrentUser();

            xobjHistory.SetUpdatedPropValue("SystemUser", user.SystemUserID);
            xobjHistory.SetUpdatedPropValue("EventDate", DateTime.Now);
            return(xobjHistory);
        }
Esempio n. 13
0
        /// <summary>
        /// ћетод запуска операции на выполнение, Ђвходна¤ї точка операции
        /// </summary>
        /// <param name="request">«апрос на выполнение операции</param>
        /// <param name="context"> онтекст выполнени¤ операции</param>
        /// <returns>–езультат выполнени¤</returns>
        /// <remarks>
        /// -- ѕ≈–≈√–”∆≈ЌЌџ…, —“–ќ√ќ “»ѕ»«»–ќ¬јЌЌџ… ћ≈“ќƒ, ¬џ«џ¬ј≈“—я яƒ–ќћ
        /// -- ѕроверка параметров запроса реализована в методе Validate запроса,
        /// который автоматически вызываетс¤ ядром при получении запроса
        /// </remarks>
        public XGetObjectsRightsResponse Execute(XGetObjectsRightsRequest request, IXExecutionContext context)
        {
            Boolean[]     objectPermissionCheckList = new Boolean[request.Permissions.Length];
            IDictionary   checkedObjects            = new HybridDictionary();
            IDictionary   checkedTypes = new Hashtable();
            XObjectRights rights;

            int nIndex = -1;
            DomainObjectDataSet dataSet = new DomainObjectDataSet(context.Connection.MetadataManager.XModel);

            foreach (XObjectPermission permission in request.Permissions)
            {
                bool bHasRight = true;

                if ((permission.Action & XObjectActionEnum.Create) == XObjectActionEnum.Create)
                {
                    if (checkedTypes.Contains(permission.TypeName))
                    {
                        bHasRight = (bool)checkedTypes[permission.TypeName];
                    }
                    else
                    {
                        bHasRight = XSecurityManager.Instance.GetRightsOnNewObject(
                            dataSet.CreateStubNew(permission.TypeName)
                            ).AllowCreate;
                        checkedTypes[permission.TypeName] = bHasRight;
                    }
                }

                if (bHasRight && (
                        ((permission.Action & XObjectActionEnum.Change) > 0) ||
                        ((permission.Action & XObjectActionEnum.Delete) > 0) ||
                        ((permission.Action & XObjectActionEnum.Read) > 0)
                        ))
                {
                    rights = (XObjectRights)checkedObjects[permission.TypeName + ":" + permission.ObjectID];
                    if (rights == null)
                    {
                        rights = XSecurityManager.Instance.GetObjectRights(
                            dataSet.GetLoadedStub(permission.TypeName, permission.ObjectID)
                            );
                        checkedObjects[permission.TypeName + ":" + permission.ObjectID] = rights;
                    }
                    bHasRight = ((permission.Action & XObjectActionEnum.Change) > 0) && rights.AllowParticalOrFullChange ||
                                ((permission.Action & XObjectActionEnum.Delete) > 0) && rights.AllowDelete ||
                                ((permission.Action & XObjectActionEnum.Read) > 0) && rights.AllowParticalOrFullRead;
                }
                // «аписываем полученный флаг в результирующий массив
                objectPermissionCheckList[++nIndex] = bHasRight;
            }

            // ‘ормируем результат операции
            return(new XGetObjectsRightsResponse(objectPermissionCheckList));
        }
Esempio n. 14
0
        public XDatagram GetDatagram(DomainObjectDataSet dataSet)
        {
            XDatagram   dg         = new XDatagram();
            IEnumerator enumerator = dataSet.GetModifiedObjectsEnumerator(false);

            while (enumerator.MoveNext())
            {
                XStorageObjectBase xobj = createXStorageObject((DomainObjectData)enumerator.Current);
                add(xobj);
                createObjectsFromLinks(xobj);
            }
            fillDatagram(dg);
            return(dg);
        }
Esempio n. 15
0
        public override XTreeMenuInfo GetMenuForEmptyTree(XGetTreeMenuRequest request, IXExecutionContext context, XTreePageInfoStd treePage)
        {
            XTreeMenuInfo       menu         = new XTreeMenuInfo("", true);
            DomainObjectDataSet dataSet      = new DomainObjectDataSet(context.Connection.MetadataManager.XModel);
            DomainObjectData    xobj         = dataSet.CreateNew("IncidentType", true);
            XNewObjectRights    create_right = XSecurityManager.Instance.GetRightsOnNewObject(xobj);

            if (create_right.AllowCreate)
            {
                XMenuActionItem item = menu.Items.AddActionItem("—оздать тип инцидента", StdActions.DoCreate);
                item.Parameters.Add("ObjectType", "IncidentType");
            }
            return(menu);
        }
Esempio n. 16
0
        private XTreeMenuInfo getMenuForEmployee(Guid ObjectID, DomainObjectDataSet dataSet, IXExecutionContext context)
        {
            XTreeMenuInfo menu = new XTreeMenuInfo("@@Title", true);

            menu.CacheMode = XTreeMenuCacheMode.NoCache;
            menu.ExecutionHandlers.Add(new XUserCodeWeb("CompanyTree_Menu_ExecutionHandler"));

            // просмотр
            // Раскоментировать после удаления ссылок на НСИ
            //menu.Items.AddActionItem("Просмотр", StdActions.DoView).Parameters.Add("ReportURL", StdMenuUtils.GetEmployeeReportURL(context.Config,  ObjectID));

            DomainObjectData xobj   = dataSet.GetLoadedStub("Employee", ObjectID);
            XObjectRights    rights = XSecurityManager.Instance.GetObjectRights(xobj);

            // Редактировать
            if (rights.AllowParticalOrFullChange)
            {
                menu.Items.AddActionItem("Редактировать", StdActions.DoEdit).Default = true;
            }
            // Удалить
            if (rights.AllowDelete)
            {
                menu.Items.AddActionItem("Удалить", StdActions.DoDelete);
            }

            // Секция "Отчеты"
            //XMenuActionItem item;
            //XMenuSection sec = menu.Items.AddSection("Отчеты");
            //item = sec.Items.AddActionItem("Сальдо ДС", "DoView");
            //item.Parameters.Add("ReportURL", "x-get-report.aspx?name=r-EmployeeSaldoDS.xml&amp;EmployeeID=@@ObjectID");

            /*
             * item = sec.Items.AddActionItem("Инциденты и списания времени сотрудника", "DoRunReport");
             *          item.Parameters.Add("ReportName", "ReportEmployeeExpensesList");
             *          item.Parameters.Add("UrlParams", ".Employee=" + ObjectID);
             *          item = sec.Items.AddActionItem("Баланс списаний сотрудника", "DoRunReport");
             *          item.Parameters.Add("ReportName", "EmployeeExpensesBalance");
             *          item.Parameters.Add("UrlParams", ".Employee=" + ObjectID);
             * item = sec.Items.AddActionItem("Плановая занятость сотрудников", "DoRunReport");
             * item.Parameters.Add("ReportName", "Employment");
             * item.Parameters.Add("UrlParams", ".Employees=" + ObjectID + "&.Organizations=&.Departments=");
             */

            // Секция "Информация"
            XMenuSection sec = menu.Items.AddSection("Информация");

            fillEmployeeInfoSection(sec, ObjectID, context.Connection);
            return(menu);
        }
Esempio n. 17
0
        public XResponse Execute(MoveObjectsRequest request, IXExecutionContext context)
        {
            DomainObjectDataSet dataSet = new DomainObjectDataSet(context.Connection.MetadataManager.XModel);

            foreach (Guid oid in request.SelectedObjectsID)
            {
                DomainObjectData xobj = dataSet.CreateStubLoaded(request.SelectedObjectType, oid, -1);
                xobj.SetUpdatedPropValue(request.ParentPropName, request.NewParent);
                // для объекта проверим права
                XSecurityManager.Instance.DemandSaveObjectPrivilege(xobj);
            }
            XStorageGateway.Save(context, dataSet, Guid.NewGuid());

            return(new XResponse());
        }
Esempio n. 18
0
        /// <summary>
        /// Уведомление со стороны XSecurityManager'a об изменившихся объектах
        /// </summary>
        /// <param name="dataSet">Сохраняемое множество объектов</param>
        public void TrackModifiedObjects(DomainObjectDataSet dataSet)
        {
            IEnumerator enumerator = dataSet.GetModifiedObjectsEnumerator(false);

            while (enumerator.MoveNext())
            {
                DomainObjectData xobj = (DomainObjectData)enumerator.Current;
                if (xobj.ObjectType == "ProjectParticipant" || xobj.ObjectType == "UserRoleInProject")
                {
                    FolderPrivilegesDefinitionContainer container = (FolderPrivilegesDefinitionContainer)ObjectPrivilegeContainers["Folder"];
                    container.FlushCache();
                    break;
                }
            }
        }
Esempio n. 19
0
        /// <summary>
        /// Параметр делегата CreateCacheValue - вызывает при отсутствии запрощенного объекта в кэше
        /// </summary>
        /// <param name="key">ключ в кэше - реализация IXObjectIdentity (XObjectIdentity или наследники XObjectBase)</param>
        /// <param name="param">экземпляр XStorageConnection</param>
        /// <returns>Данные запрошенного объекта - экземпляр DomainObjectData</returns>
        private static object loadObject(object key, object param)
        {
            Debug.Assert(key != null);
            Debug.Assert(param != null);
            if (param == null)
            {
                throw new ArgumentNullException("param");
            }

            IXObjectIdentity    obj_id  = (IXObjectIdentity)key;
            XStorageConnection  con     = (XStorageConnection)param;
            DomainObjectDataSet dataSet = new DomainObjectDataSet(con.MetadataManager.XModel);

            return(dataSet.Load(con, obj_id.ObjectType, obj_id.ObjectID));
        }
 /// <summary>
 /// Рекурсивно обходит xml-дерево и разбирает на отдельные объекты.
 /// Каждый объект добавляется во множество методом Add.
 /// </summary>
 /// <param name="xmlRoot">лес xml-объектов, скрепленный тегом x-datagram, либо одиночный объект</param>
 private void parseXmlForest(XmlElement xmlRoot, DomainObjectDataSet dataSet)
 {
     // сформируем множество объектов подлежащих вставке, обновлению и удалению
     if (xmlRoot.LocalName == "x-datagram")
     {
         foreach (XmlElement xmlObject in xmlRoot.SelectNodes("*"))
         {
             walkThroughXmlObjects(xmlObject, dataSet, true);
         }
     }
     else
     {
         // на корневом уровне не x-datagram, считаем, что это одиночный объект
         walkThroughXmlObjects(xmlRoot, dataSet, true);
     }
 }
Esempio n. 21
0
        public override XTreeMenuInfo GetMenuForEmptyTree(XGetTreeMenuRequest request, IXExecutionContext context, XTreePageInfoStd treePage)
        {
            XTreeMenuInfo       menu    = new XTreeMenuInfo("", true);
            DomainObjectDataSet dataSet = new DomainObjectDataSet(context.Connection.MetadataManager.XModel);
            DomainObjectData    xobj    = dataSet.CreateNew("Organization", true);

            xobj.SetUpdatedPropValue("Home", true);
            XNewObjectRights create_right = XSecurityManager.Instance.GetRightsOnNewObject(xobj);

            if (create_right.AllowCreate)
            {
                XMenuActionItem item = menu.Items.AddActionItem("Создать организацию-владельца системы", StdActions.DoCreate);
                item.Parameters.Add("ObjectType", "Organization");
                item.Parameters.Add("URLPARAMS", ".Home=1");
            }
            return(menu);
        }
Esempio n. 22
0
        public override XTreeMenuInfo GetMenu(XGetTreeMenuRequest request, IXExecutionContext context, XTreePageInfoStd treePage)
        {
            XTreeStructInfo  treeStructInfo = treePage.TreeStruct;
            XTreeLevelInfoIT levelinfo      = treeStructInfo.Executor.GetTreeLevel(treeStructInfo, request.Params, request.Path);

            XTreeMenuInfo       treemenu = null;
            DomainObjectDataSet dataSet  = new DomainObjectDataSet(context.Connection.MetadataManager.XModel);
            // получим идентификатор объекта, для которого строится меню
            Guid ObjectID = request.Path.PathNodes[0].ObjectID;

            switch (levelinfo.ObjectType)
            {
            case "Organization":
                treemenu = getMenuForOrganization(ObjectID, dataSet, context);
                break;

            case "Department":
                treemenu = getMenuForDepartment(ObjectID, dataSet, context);
                break;

            case "Employee":
                treemenu = getMenuForEmployee(ObjectID, dataSet, context);
                break;

            default:
                treemenu = levelinfo.GetMenu(request, context);
                break;
            }
            if (treemenu == null)
            {
                treemenu = treePage.DefaultLevelMenu.GetMenu(levelinfo, request, context);
            }

            if (treemenu != null)
            {
                if (context.Config.IsDebugMode)
                {
                    treemenu.Items.AddActionItem("Обновить", StdActions.DoNodeRefresh).SeparatorBefore = true;
                }
            }

            return(treemenu);
        }
Esempio n. 23
0
        /// <summary>
        /// Выполнение команды - типизированный вариант
        /// </summary>
        /// <param name="request">Запрос команды, должен иметь тип XGetPropertyRequest</param>
        /// <param name="context">Контекст выполнения команды</param>
        public XGetObjectResponse Execute(XGetObjectRequest request, IXExecutionContext context)
        {
            DomainObjectDataSet dataSet = new DomainObjectDataSet(context.Connection.MetadataManager.XModel);
            DomainObjectData    xobj;

            if (request.ObjectID != Guid.Empty)
            {
                xobj = dataSet.Load(context.Connection, request.TypeName, request.ObjectID);
                // Если заданы цепочки прогружаемых свойств, загрузим и эти данные:
                if (request.PreloadProperties != null)
                {
                    // ...По каждому списку прогружаемых свойств
                    foreach (string sPropList in request.PreloadProperties)
                    {
                        // Проверяем, что в массиве не передали null и пустые строки
                        if (null == sPropList)
                        {
                            throw new ArgumentNullException("PreloadProperties");
                        }
                        if (String.Empty == sPropList)
                        {
                            throw new ArgumentException(ERR_EMPTY_PRELOAD_PATH, "PreloadProperties");
                        }

                        dataSet.PreloadProperty(context.Connection, xobj, sPropList);
                    }
                }
            }
            else
            {
                xobj = dataSet.CreateNew(request.TypeName, false);
            }
            // сериализуем датасет с загруженными объектами в формат для Web-клиента
            DomainObjectDataXmlFormatter formatter = new DomainObjectDataXmlFormatter(context.Connection.MetadataManager);
            XmlElement xmlObject = formatter.SerializeObject(xobj, request.PreloadProperties);

            if (request.ObjectID != Guid.Empty)
            {
                // ..обработаем объект и все вложенные объекты в прогруженных свойства, расставим атрибуты ограничения доступа
                XmlObjectRightsProcessor.ProcessObject(xobj, xmlObject);
            }
            return(new XGetObjectResponse(xmlObject));
        }
Esempio n. 24
0
        public SaveObjectInternalRequest(XSaveObjectRequest originalRequest, IXExecutionContextService context)
            : base(DEF_COMMAND_NAME)
        {
            m_originalRequest = originalRequest;

            // установим идентификатор транзакции
            if (originalRequest.XmlSaveData.HasAttribute("transaction-id"))
            {
                m_TransactionID = new Guid(originalRequest.XmlSaveData.GetAttribute("transaction-id"));
            }
            else
            {
                m_TransactionID = Guid.NewGuid();
            }

            DomainObjectDataXmlFormatter formatter = new DomainObjectDataXmlFormatter(context.Connection.MetadataManager);

            m_dataSet = formatter.DeserializeForSave(originalRequest.XmlSaveData);
        }
Esempio n. 25
0
        /// <summary>
        /// Создает объект "Списание времение" на основании шаблона
        /// </summary>
        private DomainObjectData createTimeLossObject(DomainObjectDataSet dataSet, DomainObjectData template, ITUser user)
        {
            DomainObjectData xobj = dataSet.CreateStubNew("TimeLoss");

            xobj.SetUpdatedPropValue("Cause", template.GetUpdatedPropValue("Cause"));
            if (template.HasUpdatedProp("Worker"))
            {
                xobj.SetUpdatedPropValue("Worker", template.GetUpdatedPropValue("Worker"));
            }
            else
            {
                xobj.SetUpdatedPropValue("Worker", user.EmployeeID);
            }
            if (template.HasUpdatedProp("Folder"))
            {
                xobj.SetUpdatedPropValue("Folder", template.GetUpdatedPropValue("Folder"));
            }
            return(xobj);
        }
Esempio n. 26
0
 public virtual void TrackModifiedObjects(DomainObjectDataSet dataSet)
 {
     string[] userNames = m_SecurityProvider.GetAffectedUserNames(dataSet, m_AuthenticatedUsers.Values);
     if (userNames != null && userNames.Length > 0)
     {
         foreach (string sUserName in userNames)
         {
             if (sUserName == USERNAME_ALLUSERS)
             {
                 FlushAllUsers();
                 break;
             }
             else
             {
                 FlushUser(sUserName);
             }
         }
     }
     m_SecurityProvider.TrackModifiedObjects(dataSet);
 }
Esempio n. 27
0
        /// <summary>
        /// Получение меню в runtime для уровня (treeLevelInfo задан) или пустой иерархии (treeLevelInfo равен null)
        /// </summary>
        /// <param name="treeLevelInfo">описание уровня, для которого запрашивается меню, или null</param>
        /// <param name="request">параметры с клиента</param>
        /// <returns></returns>
        public XTreeMenuInfo GetMenu(XTreeLevelInfoIT treeLevelInfo, XGetTreeMenuRequest request, IXExecutionContext context)
        {
            DomainObjectDataSet dataSet = new DomainObjectDataSet(context.Connection.MetadataManager.XModel);
            DomainObjectData    xobj    = dataSet.GetLoadedStub(request.Path.PathNodes[0].ObjectType, request.Path.PathNodes[0].ObjectID);

            XTreeMenuInfo menu = new XTreeMenuInfo("@@Title", true);

            menu.CacheMode = XTreeMenuCacheMode.NoCache;
            XMenuActionItem item;

            XObjectRights rights = XSecurityManager.Instance.GetObjectRights(xobj);

            if (rights.AllowParticalOrFullChange)
            {
                item        = menu.Items.AddActionItem("Редактировать", StdActions.DoEdit);
                item.Hotkey = "VK_ENTER";
                item.Parameters.Add("RefreshFlags", "TRM_NODE+TRM_PARENTNODE");
            }

            XNewObjectRights create_rights = XSecurityManager.Instance.GetRightsOnNewObject(dataSet.CreateNew(xobj.ObjectType, true));

            if (create_rights.AllowCreate)
            {
                item        = menu.Items.AddActionItem("Создать", StdActions.DoCreate);
                item.Hotkey = "VK_INS";
                item.Parameters.Add("RefreshFlags", "TRM_TREE");
                if (rights.AllowDelete)
                {
                    menu.Items.AddSeparatorItem();
                }
            }

            if (rights.AllowDelete)
            {
                item        = menu.Items.AddActionItem("Удалить", StdActions.DoDelete);
                item.Hotkey = "VK_DEL";
                item.Parameters.Add("RefreshFlags", "TRM_TREE");
            }

            return(menu);
        }
Esempio n. 28
0
 public void FireTriggers(DomainObjectDataSet dataSet, XTriggerFireTimes fireTime, IXExecutionContext context)
 {
     if (m_triggersForObjects.Length == 0 && m_triggersForGroups.Length == 0 && m_triggersForWholeDataSet.Length == 0)
     {
         return;
     }
     if (m_triggersForObjects.Length + m_triggersForGroups.Length > 0)
     {
         IEnumerator enumerator = dataSet.GetModifiedObjectsEnumerator(false);
         while (enumerator.MoveNext())
         {
             DomainObjectData xobj = (DomainObjectData)enumerator.Current;
             fireTriggersForObject(xobj, fireTime, context);
         }
     }
     if (m_triggersForWholeDataSet.Length > 0)
     {
         foreach (XTriggerDescription trigger in m_triggersForWholeDataSet)
         {
             trigger.ExecuteTrigger(dataSet, null, context);
         }
     }
 }
        /// <summary>
        /// Добавляет значение в объектное свойство.
        /// Если объект-значение присутствует в контексте, то запускаем его сериализацию (serializeObject), иначе создаем болванку (тип+идентификатор)
        /// </summary>
        /// <param name="dataSet"></param>
        /// <param name="xmlProp">Текущее объектное свойство (скалярное или массивное)</param>
        /// <param name="propInfo">Метаданные свойства</param>
        /// <param name="valueOID">Идентификатор объекта-значения</param>
        private void addValueIntoObjectProp(DomainObjectDataSet dataSet, XmlElement xmlProp, XPropInfoObject propInfo, Guid valueOID, PreloadsNavigator nav)
        {
            XmlElement       xmlObjectValue;                    // xml-представление объект-значение
            DomainObjectData xobjValue = null;                  // объект-значение свойства в контексте

            // теоретически контекста может не быть
            if (dataSet != null && nav != null)
            {
                xobjValue = dataSet.Find(propInfo.ReferedType.Name, valueOID);
            }
            if (xobjValue != null && nav != null)
            {
                // Объект-значение свойства загружен в контекст и задан навигатор - запустим рекурсивно его сериализацию
                xmlObjectValue = serializeObject(xobjValue, xmlProp.OwnerDocument, nav);
            }
            else
            {
                xmlObjectValue = xmlProp.OwnerDocument.CreateElement(propInfo.ReferedType.Name);
                xmlObjectValue.SetAttribute("oid", valueOID.ToString());
            }
            // добавим объект-значение (буть-то ссылка или полный объект)
            xmlProp.AppendChild(xmlObjectValue);
        }
Esempio n. 30
0
        /// <summary>
        /// ¬нутренний метод получени¤ данных объекта UserProfile дл¤ пользовател¤
        /// системы, заданного идентификатором (SystemUser.ObjectID).
        /// </summary>
        /// <param name="uidSystemUserID">»дентификатор пользовател¤</param>
        /// <returns>
        /// -- »нифиализированный объект DomainObjectData, описывающий данные UserProfile
        /// -- null, если профил¤ пользовател¤ нет (что, в принципе возможно)
        /// </returns>
        protected DomainObjectData getUserProfile(Guid uidSystemUserID, XStorageConnection connection)
        {
            // ѕолучим идентификатор объекта UserProfile, соответствующего
            // указанному пользователю; дл¤ этого воспользуемс¤ запросом,
            // "зашитым" в data-source:

            // ...параметр запроса - идентификатор пользовател¤:
            XParamsCollection datasourceParams = new XParamsCollection();

            datasourceParams.Add("UserID", uidSystemUserID);
            // ...получение и выполнение источника данных:
            XDataSource dataSource = connection.GetDataSource(DEF_DATASOURCE_NAME);

            dataSource.SubstituteNamedParams(datasourceParams, true);
            dataSource.SubstituteOrderBy();
            object oResult = dataSource.ExecuteScalar();

            // ќжидаетс¤, что в результате мы получаем GUID: если в результате
            // получили null - что говорит об отсутствии профил¤ - возвращаем null:
            Guid uidResult = Guid.Empty;

            if (null != oResult && DBNull.Value != oResult)
            {
                uidResult = connection.Behavior.CastGuidValueFromDB(oResult);
            }
            if (Guid.Empty == uidResult)
            {
                return(null);
            }

            // «агрузка данных профил¤ пользовател¤:
            DomainObjectDataSet dataSet = new DomainObjectDataSet(connection.MetadataManager.XModel);
            DomainObjectData    xobj    = dataSet.Load(connection, "UserProfile", uidResult);

            return(xobj);
        }