Exemple #1
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);
        }
Exemple #2
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));
        }
Exemple #3
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));
        }
Exemple #4
0
        /// <summary>
        /// Метод запуска операции на выполнение, <входная> точка операции
        /// ПЕРЕГРУЖЕННЫЙ, СТРОГО ТИПИЗИРОВАННЫЙ МЕТОД
        /// ВЫЗЫВАЕТСЯ ЯДРОМ АВТОМАТИЧЕСКИ
        /// </summary>
        /// <param name="request">Запрос на выполнение операции</param>
        /// <param name="context">Контекст выполнения операции</param>
        /// <returns>Результат выполнения</returns>
        public XGetObjectResponse Execute(XRequest request, IXExecutionContext context)
        {
            // #1: Определяем идентификатор текущего пользователя
            // Используем внутренние механизмы аутентификации
            ITUser            user             = (ITUser)XSecurityManager.Instance.GetCurrentUser();
            XParamsCollection datasourceParams = new XParamsCollection();

            datasourceParams.Add("UserID", user.SystemUserID);


            // #2: Найдем идентификатор объекта - профиля, связанного с текущим
            // пользователем: испоьзуем для этого тривиальный запрос, заданный
            // в "источнике данных"
            XDataSource dataSource = context.Connection.GetDataSource(DEF_DATASOURCE_NAME);

            dataSource.SubstituteNamedParams(datasourceParams, true);
            dataSource.SubstituteOrderBy();
            object oResult = dataSource.ExecuteScalar();
            // Ожидается, что в результате мы получаем GUID:
            Guid uidResult = Guid.Empty;

            if (null != oResult && DBNull.Value != oResult)
            {
                uidResult = context.Connection.Behavior.CastGuidValueFromDB(oResult);
            }


            // #3: Загрузка данных профиля и всех сопутствующих объектов:
            DomainObjectDataSet dataSet = new DomainObjectDataSet(context.Connection.MetadataManager.XModel);
            DomainObjectData    xobj;

            if (Guid.Empty != uidResult)
            {
                // Объект профиля уже есть; загружаем существующий
                xobj = dataSet.Load(context.Connection, "UserProfile", uidResult);
            }
            else
            {
                xobj = dataSet.CreateNew("UserProfile", false);
                // В новом объекте описания профиля сразу проставляем заглушку на текущего пользователя
                xobj.SetUpdatedPropValue("SystemUser", user.SystemUserID);
                // Задаем "собственную" стартовую страницу по умолчанию - список текущих инцидентов
                xobj.SetUpdatedPropValue("StartPage", StartPages.CurrentTaskList);
            }
            // Догружаем данные пользователя (SystemUser) и сотрудника (Employee)
            dataSet.PreloadProperty(context.Connection, xobj, "SystemUser.Employee");

            // Сериализуем датасет с загруженными объектами в формат для Web-клиента
            DomainObjectDataXmlFormatter formatter = new DomainObjectDataXmlFormatter(context.Connection.MetadataManager);
            // ... при этом учитываем, что в сериализованные данные должны так же попасть
            // данные с описанием пользователя и сотрудника:
            XmlElement xmlObject = formatter.SerializeObject(xobj, new string[] { "SystemUser.Employee" });

            if (Guid.Empty != uidResult)
            {
                // ..обработаем объект и все вложенные объекты в прогруженных свойства, расставим атрибуты ограничения доступа
                XmlObjectRightsProcessor.ProcessObject(xobj, xmlObject);
            }

            return(new XGetObjectResponse(xmlObject));
        }