/// <summary> /// Метод отложенной загрузки/проверки данных /// </summary> internal void DelayLoad() { if (m_bIsLoaded) { return; } // Данные для типа инцидента и роли загружаем полностью, // что бы сделать потом внутреннюю проверку: IncidentType.LoadObject(new string[] { "Props", "States" }); Role_Observer.LoadObject(new string[] { "IncidentType" }); // Проверка внутреннего соответствия: // ... тип инцидента для ролей должен совпадать с заданным в конфигурации: ObjectOperationHelper helperType; helperType = Role_Observer.GetInstanceFromPropScalarRef("IncidentType"); if (helperType.ObjectID != IncidentType.ObjectID) { throw new InvalidOperationException(String.Format( "Тип инцидента \"{0}\" для заданной роли itws:role-for-observer( id=\"{1}\" ) не соответствует типу инцидента itws:incident-type( id=\"{2}\" )", helperType.ObjectID.ToString(), Role_Observer.ObjectID.ToString(), IncidentType.ObjectID.ToString() )); } // Фиксируем нужные нам для создания инцидента данные: // ... приоритет инцидента по умолчанию: ChangeIncident_DefaultPriority = (IncidentPriority)IncidentType.GetPropValue("DefaultPriority", XPropType.vt_i2); // ... начальное состояние инцидента; идентификатор объекта получаем // банальным XPath-запросом, опираясь на то, что свойство прогружено: XmlElement xmlDefaultState = (XmlElement)IncidentType.PropertyXml("States").SelectSingleNode("IncidentState[IsStartState='1']"); if (null == xmlDefaultState) { throw new InvalidOperationException(String.Format( "Для указанного типа инцидента (id={0}) стартовое состояние не определено", IncidentType.ObjectID.ToString() )); } ChangeIncident_StartState.ObjectID = new Guid(xmlDefaultState.GetAttribute("oid")); // ...запланированное время для наблюдателя, по умолчанию: DefaultDuration_for_ObserverRole = (int)Role_Observer.GetPropValue("DefDuration", XPropType.vt_i4); // Отдельно прямым запросом в БД определям тип внешней ссылки // для определения URL, по ее классу: XParamsCollection keys = new XParamsCollection(); keys.Add("ServiceType", (int)ServiceSystemType.URL); LinkType_URL.LoadObject(keys); m_bIsLoaded = true; }
/// <summary> /// Метод отложенной загрузки/проверки данных /// </summary> internal void DelayLoad() { if (m_bIsLoaded) { return; } // Проверка указанных данных: TargetFolder.CheckExistence(true); Prop_CourseNumber.CheckExistence(true); Prop_CourseBeginningDate.CheckExistence(true); Prop_GoalStatus.CheckExistence(true); Prop_TrainingDirection.CheckExistence(true); Prop_TrainingCenter.CheckExistence(true); // ... данные для типа инцидента и ролей загружаем полностью, // что бы сделать потом внутреннюю проверку: IncidentType.LoadObject(new string[] { "Props", "States" }); Role_Trained.LoadObject(new string[] { "IncidentType" }); Role_Manager.LoadObject(new string[] { "IncidentType" }); // Проверка внутреннего соответствия: // ... тип инцидента для ролей должен совпадать с заданным в конфигурации: ObjectOperationHelper helperType; helperType = Role_Trained.GetInstanceFromPropScalarRef("IncidentType"); if (helperType.ObjectID != IncidentType.ObjectID) { throw new InvalidOperationException(String.Format( "Тип инцидента \"{0}\" для заданной роли itws:role-for-trained( id=\"{1}\" ) не соответствует типу инцидента itws:incident-type( id=\"{2}\" )", helperType.ObjectID.ToString(), Role_Trained.ObjectID.ToString(), IncidentType.ObjectID.ToString() )); } helperType = Role_Manager.GetInstanceFromPropScalarRef("IncidentType"); if (helperType.ObjectID != IncidentType.ObjectID) { throw new InvalidOperationException(String.Format( "Тип инцидента \"{0}\" для заданной роли itws:role-for-manager( id=\"{1}\" ) не соответствует типу инцидента itws:incident-type( id=\"{2}\" )", helperType.ObjectID.ToString(), Role_Manager.ObjectID.ToString(), IncidentType.ObjectID.ToString() )); } // ... все доп. свойства должны быть указаны в типе инцидента: XmlElement xmlProps = IncidentType.PropertyXml("Props"); checkAuxPropExistence(xmlProps, "prop-for-course-number", Prop_CourseNumber); checkAuxPropExistence(xmlProps, "prop-for-course-beginning-date", Prop_CourseBeginningDate); checkAuxPropExistence(xmlProps, "prop-for-goal-status", Prop_GoalStatus); checkAuxPropExistence(xmlProps, "prop-for-training-direction", Prop_TrainingDirection); checkAuxPropExistence(xmlProps, "prop-for-training-center", Prop_TrainingCenter); checkAuxPropExistence(xmlProps, "prop-for-education-sum", Prop_Summ); // Фиксируем нужные нам для создания инцидента данные: // ... приоритет инцидента по умолчанию: EduIncident_DefaultPriority = (IncidentPriority)IncidentType.GetPropValue("DefaultPriority", XPropType.vt_i2); // ... начальное состояние инцидента; идентификатор объекта получаем // банальным XPath-запросом, опираясь на то, что свойство прогружено: XmlElement xmlDefaultState = (XmlElement)IncidentType.PropertyXml("States").SelectSingleNode("IncidentState[IsStartState='1']"); if (null == xmlDefaultState) { throw new InvalidOperationException(String.Format( "Для указанного типа инцидента (id={0}) неопределено стартовое состояние", IncidentType.ObjectID.ToString() )); } EduIncident_StartState.ObjectID = new Guid(xmlDefaultState.GetAttribute("oid")); // ...запланированное время для менеджера, по умолчанию: DefaultDuration_for_ManagerRole = (int)Role_Manager.GetPropValue("DefDuration", XPropType.vt_i4); // ...запланированное время для обучаемого, по умолчанию: DefaultDuration_for_TrainedRole = (int)Role_Trained.GetPropValue("DefDuration", XPropType.vt_i4); m_bIsLoaded = true; }
/// <summary> /// Инициализация объекта конфигурации /// </summary> protected void initialize() { // Загружаем XML с данными основного конфигурационного файла load(m_sConfigFileName); // Для основного конфигурационного файла пространство имен ДОЛЖНО // БЫТЬ ОПРЕДЕЛЕНО С ЯВНЫМ ПРЕФИКСОМ: if (null == RootElementNSPrefix || 0 == RootElementNSPrefix.Length) { throw new ConfigurationErrorsException( "Для всех элементов прикладного конфигурационного файла сервисов " + "должны быть определены префиксы соответствующего пространства имен!"); } // ИНИЦИАЛИЗАЦИЯ // #1: Данные "собственной" организации m_helperOwnOrganization = loadObjectPresentation( "itws:common-params/itws:own-organization", "определение \"собственной\" организации ", "Organization" ); // ... проверяем, что для указанной организации задан признак "владелец" системы if (!(bool)m_helperOwnOrganization.GetPropValue("Home", XPropType.vt_boolean)) { throw new ConfigurationErrorsException( String.Format( "{0}: Некорретное определение идентификатора \"собственной\" организации - " + "указанное описание (itws:own-organization@id = {1}) описывает организацию," + "у которой не задан признак \"Организация - владелец системы\"", ERR_INCORRECT_CONFIG_DATA, m_helperOwnOrganization.ObjectID) ); } // #2: Получаем данные типа проектных затрат: // #2.1: ... для "Внешних проектов": m_helperExternalProjectsActivityType = loadObjectPresentation( "itws:common-params/itws:external-projects-activity-type", "определение типа проектных затрат для \"Внешних проектов\"", "ActivityType" ); // ... проверяем, что для указанного типа проектных затрат // задан признак "активность по отношению ко внешним клиентам": if (!(bool)m_helperExternalProjectsActivityType.GetPropValue("AccountRelated", XPropType.vt_boolean)) { throw new ConfigurationErrorsException( String.Format( "{0}: Некорретное определение идентификатора типа проектных затрат - " + "указанное описание (external-projects-activity-type@id = {1}) описывает тип затрат," + "у которого не задан признак \"Активность в отношении Клиента\"", ERR_INCORRECT_CONFIG_DATA, m_helperExternalProjectsActivityType.ObjectID) ); } // #2.2: ... для "Пресейл-активности": m_helperPresaleProjectsActivityType = loadObjectPresentation( "itws:common-params/itws:presale-projects-activity-type", "определение типа проектных затрат для \"Пресейл-активности\"", "ActivityType" ); // ... проверяем, что для указанного типа проектных затрат // задан признак "активность по отношению ко внешним клиентам": if (!(bool)m_helperPresaleProjectsActivityType.GetPropValue("AccountRelated", XPropType.vt_boolean)) { throw new ConfigurationErrorsException( String.Format( "{0}: Некорретное определение идентификатора типа проектных затрат - " + "указанное описание (presale-projects-activity-type@id = {1}) описывает тип затрат," + "у которого не задан признак \"Активность в отношении Клиента\"", ERR_INCORRECT_CONFIG_DATA, m_helperExternalProjectsActivityType.ObjectID) ); } // #2.3: ... для "Пилотных/инвестиционных проектов": m_helperPilotProjectsActivityType = loadObjectPresentation( "itws:common-params/itws:pilot-projects-activity-type", "определение типа проектных затрат для \"Пресейл-активности\"", "ActivityType" ); // #2.4: ... для "Тендеров": m_helperTenderProjectsActivityType = loadObjectPresentation( "itws:common-params/itws:tender-projects-activity-type", "определение типа проектных затрат для \"Тендер-активности\"", "ActivityType" ); // #3: Получаем список ссылок из Карты перевода флагов // пользователей в соотв. системные роли m_rolesMap.LoadFormConfigXml(this); // #4: Конфигурационные данные "общего" сервиса m_commonServiceParams = new CommonServiceConfigParams(this); }