/// <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); }
/// <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)); }
/// <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)); }
/// <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)); }