Example #1
0
        /// <summary>
        /// Создает описание списка при первом обращении.
        /// Параметр делегата CreateCacheValue.
        /// </summary>
        /// <param name="sKey">Ключ в формате {Наименование типа}:{Наименование списка}</param>
        /// <param name="value">XStorageConnection</param>
        /// <returns>экземпляр ListInfoWithAccessCheck</returns>
        private static ListInfoWithAccessCheck createListInfo(string sKey, object value)
        {
            #region Copy-paste кода из XInterfaceObjectsHolder::createListInfo

            XStorageConnection connection      = (XStorageConnection)value;
            XMetadataManager   metadataManager = connection.MetadataManager;

            // Ключ для сохранения в реестре (кеше) XModel в данном случае
            // ДОЛЖЕН БЫТЬ в виде {Наименование типа}:{Наименование списка}
            // Разберем этот ключ - выделим наименование типа и наименование списка
            Debug.Assert(sKey.IndexOf(":") > -1, "Отсутствует символ ':' в ключе");
            int    nIndex    = sKey.IndexOf(":");
            string sTypeName = sKey.Substring(0, nIndex);
            Debug.Assert(sTypeName.Length > 0, "Не задан тип");
            string sName = sKey.Substring(nIndex + 1, sKey.Length - nIndex - 1);

            // Сформируем XPath-запрос и загрузим метаописание списка; при формировании
            // запроса учитваем что метанаименование списка - параметр необязательный
            string sXPath = "ds:type[@n='" + sTypeName + "']/i:objects-list";
            if (sName.Length > 0)
            {
                sXPath = sXPath + "[@n='" + sName + "']";
            }

            XmlElement xmlList = (XmlElement)metadataManager.SelectSingleNode(sXPath);
            if (xmlList == null)
            {
                throw new ArgumentException(
                          "Неизвестное определение списка i:objects-list с метанаименованием " +
                          "'" + sName + "', для типа '" + sTypeName + "' " +
                          "(не найдено в метаданных, XPath='" + sXPath + "')");
            }

            #endregion
            //Создаем описание списка ListInfoWithAccessCheck.
            ListInfoWithAccessCheck listInfo = new ListInfoWithAccessCheck(xmlList, connection.MetadataManager.NamespaceManager, connection.MetadataManager.XModel);
            XPrivilegeSet           privSet  = new XPrivilegeSet();

            //Зачитываем из метаданных необходимые привилегии для доступа к заданному списку и записываем их в контейнер привилегий.
            foreach (XmlElement xmlNode in xmlList.SelectNodes("it-sec:access-requirements/*", connection.MetadataManager.NamespaceManager))
            {
                string            sPrivName = xmlNode.GetAttribute("n");
                ITSystemPrivilege priv      = new ITSystemPrivilege(SystemPrivilegesItem.GetItem(sPrivName));
                privSet.Add(priv);
            }
            listInfo.AccessSecurity.SetRequiredPrivileges(privSet);
            return(listInfo);
        }
        public override XTreePageInfo CreateTreePageInfo(XmlElement xmlTreePage)
        {
            TreePageWithAccessCheckInfo treePage = new TreePageWithAccessCheckInfo();

            base.initTreePageInfo(treePage, xmlTreePage);
            XPrivilegeSet privSet = new XPrivilegeSet();

            foreach (XmlElement xmlNode in xmlTreePage.SelectNodes("it-sec:access-requirements/*", m_mdManager.NamespaceManager))
            {
                string            sPrivName = xmlNode.GetAttribute("n");
                ITSystemPrivilege priv      = new ITSystemPrivilege(SystemPrivilegesItem.GetItem(sPrivName));
                privSet.Add(priv);
            }
            treePage.AccessSecurity.SetRequiredPrivileges(privSet);
            return(treePage);
        }