Files

201 lines
13 KiB
Markdown
Raw Permalink Normal View History

2026-04-17 14:55:32 -04:00
---
source_files:
- DataPRO/Modules/PreviousDBVersions/Version57/DatabaseExport/Classes/TestObject/TemplateChannelUI.cs
- DataPRO/Modules/PreviousDBVersions/Version57/DatabaseExport/Classes/TestObject/GroupTemplateTableInfo.cs
- DataPRO/Modules/PreviousDBVersions/Version57/DatabaseExport/Classes/TestObject/TestObjectList.cs
- DataPRO/Modules/PreviousDBVersions/Version57/DatabaseExport/Classes/TestObject/TestObjectTemplateCollection.cs
- DataPRO/Modules/PreviousDBVersions/Version57/DatabaseExport/Classes/TestObject/TestTestObject.cs
- DataPRO/Modules/PreviousDBVersions/Version57/DatabaseExport/Classes/TestObject/TestObjectTemplate.cs
generated_at: "2026-04-16T05:00:11.636548+00:00"
model: "Qwen/Qwen3-Coder-Next-FP8"
schema_version: 1
sha256: "5a4f5e976b551f99"
---
# Documentation: `DatabaseExport.TestObject` Module
## 1. Purpose
This module provides a legacy (Version57) abstraction layer over ISO 13499 test object and template data for database export operations. It encapsulates domain entities—such as `TestObject`, `TestObjectTemplate`, and `TestTestObject`—and their relationships, enabling retrieval, manipulation, and serialization of test configuration data (including channel definitions, zones, and metadata) from a database-backed ISO 13499 file structure. It serves as an intermediate layer between raw database access (`DbOperations`, `ISO13499FileDb`) and higher-level UI or export logic, specifically supporting legacy workflows where templates and test objects must be exported or migrated.
## 2. Public Interface
### `TemplateChannelUI`
- **Constructor**: `public TemplateChannelUI(TestObjectTemplateChannel channel)`
- Wraps a `TestObjectTemplateChannel` instance for UI binding purposes. No additional behavior beyond storage.
### `GroupTemplateTableInfo`
- **Constructor**: `public GroupTemplateTableInfo(string templateName, SerializedSettings.ISOSupportLevels isoSupportLevel, bool sysBuilt, string templateDescription, DateTime lastModified, string lastModifiedBy, bool embedded)`
- Immutable data transfer object (DTO) representing metadata for a test object template.
- **Properties**:
- `TemplateName` (`string`)
- `ISOSupportLevel` (`SerializedSettings.ISOSupportLevels`)
- `SysBuilt` (`bool`)
- `TemplateDescription` (`string`)
- `LastModified` (`DateTime`)
- `LastModifiedBy` (`string`)
- `Embedded` (`bool`)
- **Overrides**: `ToString()` returns `TemplateName`.
### `TestObjectList`
- **Static Property**: `public static TestObjectList TestObjectsList { get; }`
- Implements lazy-initialized singleton pattern (thread-safe via `lock`). Returns the single instance of `TestObjectList`.
- **Instance Method**: `public List<string> GetAllGroupSerialNumbers()`
- Queries `tblTestObjects` for all `SerialNumber` values, deduplicates, and returns them as a `List<string>`.
- **Instance Method**: `public TestObject GetTestObject(string serialNumber)`
- Retrieves a `TestObject` by `serialNumber` using `ISO.TestObject.GetTestObject`, wrapping the result in a new `TestObject` instance with `SysBuilt` flag preserved. Returns `null` if not found.
- **Instance Method**: `public TestObject GetAddedGroup(string serialNumber)`
- Alias for `GetTestObject`. Delegates directly to it.
### `TestObjectTemplateCollection`
- **Static Property**: `public static TestObjectTemplateCollection TemplateCollection { get; }`
- Thread-safe lazy singleton via double-checked locking (`volatile` + null-coalescing assignment).
- **Instance Method**: `public GroupTemplateTableInfo[] GetAllTemplates(bool bIncludeEmbeddedAndSysBuilt = true)`
- Queries `tblTestObjectTemplates`. If `bIncludeEmbeddedAndSysBuilt` is `false`, filters rows where `Embedded = 0 OR NULL` and `SysBuilt = 0`.
- For each row, constructs a `GroupTemplateTableInfo`:
- `ISOSupportLevel` is inferred: `NO_ISO` if `TestObjectType` contains `NON_ISO_TESTOBJECT_CHANNEL_TYPE` or `NONISOCHANNELTYPE`; otherwise `ISO_ONLY`.
- `Embedded` is safely parsed (treats `DBNull` as `false`).
- Returns array of `GroupTemplateTableInfo`.
- **Instance Property**: `public TestObjectTemplate SysBuiltTestObjectTemplate { get; }`
- Returns the static `_sysBuiltTestObjectTemplate` field (currently unassigned in source; always `null`).
- **Instance Method**: `public TestObjectTemplate GetTemplate(string templateId)`
- Retrieves a template by `templateId` via `ISO.TestObjectTemplate.GetTemplate`.
- If not found, returns a default-constructed `TestObjectTemplate()`; otherwise wraps the ISO template in a new `TestObjectTemplate`.
### `TestTestObject`
- **Constructor**: `public TestTestObject(TestObject obj)`
- Base constructor; delegates to `TestObject` base class.
- **Properties**:
- `Position` (`MMEPositions`)
- Gets/sets position key (`#` = channel defaults, `@` = user-set/multiple).
- On set: updates `_position`, toggles `GroupPositionComboBoxVisible`/`GroupPositionButtonVisible`, and if not `UserSetKey`, propagates position to all required sensors with valid serial numbers.
- `GroupPositionComboBoxVisible`, `GroupPositionButtonVisible` (`System.Windows.Visibility`)
- Visibility depends on `ISOSupportLevel`: always `Collapsed` if `NO_ISO`; otherwise reflects internal `_groupPosition*` fields.
- `TestObject` (`MMETestObjects`)
- Gets/sets the test object. On set, propagates `TestObject.Test_Object` to all required sensors with valid serial numbers.
- `AvailablePositions` (`MMEPositions[]`)
- Returns all positions from `ISO13499FileDb.IsoDb.GetPositions()`.
- `AvailableGroupPositions` (`MMEPositions[]`)
- Returns `AvailablePositions` + a special `ChannelDefaultsKey` (`#`) entry and a `UserSetKey` (`@`) entry.
- `ExcitationWarmupTimeMS` (`int`)
- Gets/sets warmup time (ms), default from `Properties.Settings.Default.DefaultTestExcitationWarmupMS`.
- `TargetSampleRate` (`double`)
- Gets/sets target sample rate.
- **Constants**:
- `ChannelDefaultsKey = "#"`
- `UserSetKey = "@"`
- **Methods**:
- `SetTestObject(string s)`, `SetPosition(string s)`
- Setters that bypass property change propagation logic (e.g., no sensor propagation); only update backing field and raise `OnPropertyChanged`.
### `TestObjectTemplate`
- **Constants**:
- `NON_ISO_TESTOBJECT_CHANNEL_TYPE = "x_NonISOTestObjectType_x"`
- `NON_ISO_TESTOBJECT_NAME = "x_NonISOTestObjectName_x"`
- **Properties**:
- `LastModifiedBy` (`string`, default `"N/A"`)
- `LastModified` (`DateTime`, default `SqlDateTime.MinValue`)
- `CurrentZoneIndex` (`int`)
- Setter updates `CurrentZone` and `AreZoneControlsEnabled`.
- `CurrentZone` (`Zone`)
- Setter toggles `AreZoneControlsEnabled` based on nullability.
- `AreZoneControlsEnabled` (`bool`)
- `RequiredChannels` (`List<TestObjectTemplateChannel>`)
- `TemplateParent` (`string`)
- `SysBuilt` (`bool`)
- `Embedded` (`bool`)
- `OriginalTemplateName` (`string`)
- `TemplateName` (`string`)
- `TemplateDescription` (`string`)
- `IsLocalOnly` (`bool`)
- `TestObject` (`MMETestObjects`)
- Setter initializes `AvailableTestObjectTypes` and `TestObjectTypeIndex`.
- `TestObjectType` (`string`)
- Setter populates `_channels` and `TemplateAllChannels`.
- `TemplateAllChannels` (`TestObjectTemplateChannel[]`)
- Getter sorts by `DisplayOrder`; setter builds `TemplateAllUIChannels`.
- `TemplateAllUIChannels` (`TemplateChannelUI[]`)
- `TemplateZones` (`Zone[]`)
- `AvailableTestObjectTypes` (`string[]`)
- Lazy-initialized from `ISO13499FileDb.IsoDb.GetTestObjectTypeForTestObject`.
- `TestObjectTypeIndex` (`int`)
- Getter: index in `AvailableTestObjectTypes`; setter: updates `TestObjectType` and rebuilds channels.
- **Static Methods**:
- `GetNonISOTestObject()`
- Finds or creates a system test object with code `NON_ISO_TESTOBJECT_NAME`. Returns first unused alpha (`A``Z`) or numeric (`0``9`) code. Throws `NotSupportedException` if none available.
- **Instance Methods**:
- `ToISOTestObjectTemplate()`
- Converts this instance to an `ISO.TestObjectTemplate`, including zones, regions, channels, and metadata. Includes extensive logging via `EventLog`.
- `GetValues()`
- Returns a dictionary mapping `GroupTemplateFields` enum names to string values (from the ISO template).
- `GetTemplateChannelValues(TestObjectTemplateChannel channel)`
- Returns a dictionary mapping `GroupTemplateChannelFields` enum names to string values (from the channel).
- **Constructors**:
- `TestObjectTemplate(TestObjectTemplate copy, ref ISO13499FileDb db)`
- Deep copy constructor.
- `TestObjectTemplate(ISO.TestObjectTemplate template, ref ISO13499FileDb db)`
- Wraps an ISO template.
- `TestObjectTemplate()`
- Default constructor: initializes `TestObject` based on `SerializedSettings.ISOSupportLevel`. For `NO_ISO`, calls `InitializeNonISO()`.
## 3. Invariants
- **Singleton Consistency**:
- `TestObjectList.TestObjectsList` and `TestObjectTemplateCollection.TemplateCollection` are lazily initialized singletons. Once created, the same instance persists for the application lifetime.
- **Template Channel Sorting**:
- `TestObjectTemplate.TemplateAllChannels` getter always returns channels sorted by `DisplayOrder`.
- **ISO Support Level Inference**:
- `TestObjectTemplateCollection.GetAllTemplates` infers `ISOSupportLevel` strictly based on `TestObjectType` string content (`NON_ISO_TESTOBJECT_CHANNEL_TYPE` or `NONISOCHANNELTYPE``NO_ISO`; else → `ISO_ONLY`).
- **Embedded Field Handling**:
- `GroupTemplateTableInfo.Embedded` and `TestObjectTemplate.Embedded` safely handle `DBNull` in database queries (treated as `false`).
- **Non-ISO Template Initialization**:
- When `TestObjectTemplate()` is constructed with `NO_ISO` support level, `TestObject` is set to a system-created object with code `NON_ISO_TESTOBJECT_NAME`, and `TestObjectType` is set to `NON_ISO_TESTOBJECT_CHANNEL_TYPE`.
## 4. Dependencies
### Imports/Usings
- `System`, `System.Collections.Generic`, `System.Data` (via `DataRow`, `DataSet`)
- `DatabaseExport` namespace (same module)
- `ISO` namespace (e.g., `ISO.TestObject`, `ISO.TestObjectTemplate`, `ISO13499FileDb`)
- `SerializedSettings` (for `ISOSupportLevels`)
- `Properties.Settings` (for `DefaultTestExcitationWarmupMS`)
- `System.Diagnostics` (for `EventLog`)
### External Dependencies
- **Database**:
- `tblTestObjects` (used by `TestObjectList.GetAllGroupSerialNumbers`)
- `tblTestObjectTemplates` (used by `TestObjectTemplateCollection.GetAllTemplates`)
- **ISO Layer**:
- `ISO13499FileDb.IsoDb` (static property) for database access and metadata lookups.
- `DbOperations.GetCommand()` and `DbOperations.Connection.QueryDataSet()` for SQL execution.
- **UI Framework**:
- `System.Windows.Visibility` (used in `TestTestObject` for WPF visibility properties).
- **Other Modules**:
- `MMEPositions`, `MMETestObjects`, `MMEPossibleChannels` (from `ISO` or related modules).
- `Zone`, `TemplateZone`, `TemplateRegion` (referenced but not defined here; assumed external).
### Dependents
- **Inferred**:
- UI layers (e.g., WPF) consuming `TemplateChannelUI`, `TestTestObject`, `GroupTemplateTableInfo`.
- Export/migration workflows relying on `TestObjectTemplateCollection.GetAllTemplates()` and `TestObjectList.TestObjectsList`.
## 5. Gotchas
- **`SysBuiltTestObjectTemplate` is always `null`**:
- The static field `_sysBuiltTestObjectTemplate` in `TestObjectTemplateCollection` is declared but never assigned. Accessing `SysBuiltTestObjectTemplate` will always return `null`.
- **`TestObjectTemplateCollection.GetAllTemplates()` filters `Embedded` permissive**:
- `DBNull` values in `Embedded` column are treated as `false`, which may differ from database semantics if `NULL` has special meaning.
- **`TestObjectTemplate.GetTemplate()` returns default instance on failure**:
- Returns a new `TestObjectTemplate()` (with default properties) instead of `null` when template is not found, potentially masking errors.
- **`TestTestObject.Position` propagation is conditional**:
- Sensor position updates only occur for required channels with non-whitespace `SensorSerialNumber`. Channels missing these are silently skipped.
- **`TestObjectTemplate()` constructor behavior depends on global settings**:
- Default constructor behavior changes based on `SerializedSettings.ISOSupportLevel`, which may not be obvious to callers expecting consistent initialization.
- **`GetNonISOTestObject()` may throw**:
- If no unused single-character test object codes (`A``Z`, `0``9`) are available, it throws `NotSupportedException` instead of returning `null` or retrying.
- **`TemplateAllChannels` setter rebuilds `TemplateAllUIChannels`**:
- Assigning directly to `TemplateAllChannels` triggers construction of new `TemplateChannelUI` wrappers. This side effect is not obvious from the property name.
- **`CurrentZoneIndex` setter has side effects**:
- Setting `CurrentZoneIndex` updates `CurrentZone` and toggles `AreZoneControlsEnabled`, which may affect UI state unexpectedly if not coordinated.
- **`TestObjectTemplate.ToISOTestObjectTemplate()` logs heavily**:
- Uses `EventLog.Source = "DataPROInstaller"` and writes many entries. May impact performance or cause issues in non-installer contexts (e.g., unit tests).