Ejemplo n.º 1
0
        /// <summary>
        /// Иниализация операции переноса на основании метаописания уровня иерархии
        /// </summary>
        /// <param name="treeLevel">Описатель уровня иерархии</param>
        internal XXTreeNodeDrag(XTreeLevelInfo treeLevel, XMetadataManager manager)
        {
            m_xmlNSManager = treeLevel.NamespaceManager;

            string metaname = treeLevel.Xml.GetAttribute("node-drag", m_sExtensionNamespace);

            if (string.IsNullOrEmpty(metaname))
            {
                metaname = treeLevel.TreeInfo.Xml.GetAttribute("node-drag", m_sExtensionNamespace);
            }

            if (!string.IsNullOrEmpty(metaname))
            {
                string prefix = m_xmlNSManager.LookupPrefix(m_sExtensionNamespace);
                m_xmlNodeDrag = manager.SelectSingleNode(prefix + ":node-drag[@n=\"" + metaname + "\"]") as XmlElement;
            }
            if (m_xmlNodeDrag == null)
            {
                m_bIsEmpty = true;
            }
            else
            {
                m_bIsEmpty = false;
                string sValue = m_xmlNodeDrag.GetAttribute("cache-for");
                if (sValue.Length > 0)
                {
                    m_cacheMode = XTreeMenuCacheModeParser.Parse(sValue);
                }
                else
                {
                    m_cacheMode = XTreeMenuCacheMode.Unknow;
                }
            }
        }
Ejemplo n.º 2
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);
        }