映射器类
Windchill ESI 映射功能由图 Windchill ESI 映射器类中所示的类提供。所有类均无法序列化。因此,它们不适用于 Windchill GUI 客户端。
3.1.1.1 ESIMapManager
ESIMapManager 会保留 ESIMap 对象的集合。映射管理器会将 ESIMap 对象保留在缓存中,因此只需从外部存储检索一次即可。检索到映射信息后,在 java 虚拟机重新启动之前不会从磁盘重新读取映射信息。
| 当修改给定分布目标上的 responseMetaInfoPath 属性值时,上述内容会发生异常。这将导致在修改和保存分布目标后立即读取新指定的 ESI 响应元信息文件的内容。还将在映射管理器中为响应元信息文件的已修改版本创建新条目。如果将给定的分布目标设置为未启用,保存并再次启用,则也会从文件中检索信息。 |
类遵循单态设计模式,以确保 java 虚拟机中仅存在一个实例。ESIMap 对象的所有用户需要从映射管理器中获取这些对象。
<<Static>> instance() : ESIMapManager
返回属性 _instance 的值。如果值为空,则先创建一个实例并将其存储在属性中,然后返回结果。
<<final>> getMap(id : String) : ESIMap
返回由 id 自变量标识的 ESIMap。如果输入 ID 作为映射中的键存在,则该方法仅返回相应的值。否则,记录错误消息后将返回空值。
| 此方法仅适用于 ESI 响应元信息文件中的 ESIMap 对象;对于由映射文件 (例如 ESITarget.map) 表示的对象,改用文件实例中采用的无差别加载版本。 |
<<final>> getMap(file : File) : ESIMap
返回由输入自变量标识的 ESIMap 对象。如果输入文件的名称作为映射中的键存在,则该方法仅返回相应的值。否则,除了在映射中为新创建的对象创建条目外,它将创建新的 ESIMap 实例,使用输入映射文件的内容对其进行初始化,并返回产生的对象。
ESIMap
Windchill ESI 映射是表示 ESI 响应元信息文件中映射元素内容的对象。映射元素可具有一个或多个名为 attributeMapping 的子元素,其中每个子元素表示一对源和目标属性名称,也可以选择为该属性指定一个默认值。文件中的每个 attributeMapping 条目采用以下格式:
<esi:attributeMapping sourceAttribute="Source_Name" defaultValue="Default">Target_Name</esi:attributeMapping>
• Source_Name 是介绍在何处查找要提取的数据的说明。条目的此部分是必填项。
◦ 如果正在映射的对象是 Info*Engine 元素对象,则 Source_Name 为该元素对象上 Info*Engine Att 对象的名称。
◦ 如果正在映射的对象不是 Info*Engine 元素,则 Source_Name 是用于调用该对象的“getter 方法”的名称。为 Source_Name 提供的值前附有字符 "get",且生成的字符串将用作方法名称。映射器仅调用不采用任何自变量且名称以 "get" 开头的方法。
◦ 映射器能够导航对象结构。如果 Source_Name 包含句点,则系统会将句点解释为方法分隔符。映射器将调用由所映射对象中 Source_Name 的第一段标识的“getter 方法”。如果该方法返回结果,则映射器将调用结果中 Source_Name 的第二段。映射器继续获取 Source_Name 的每个部分的结果。
示例:这是 Windchill ESI BOM 组件呈现器所用 attributeMapping 条目之一的 Source_Name 值:Quantity.Amount。映射器对正在映射的对象执行 getQuantity() 方法。如果结果不为空,则映射器将对通过 getQuantity() 方法获得的对象执行 getAmount() 方法。如果 getAmount() 返回一个值,则映射器会将该值分配给输出。
• Target_Name 是映射器所创建的输出 Att 对象的名称。条目的此部分是必填项。
• 如果无法从源中获取该值,则 Default 将是分配给输出的值。条目的这一部分是可选的。
以下是此类的可用方法:
ESIMap(fileName : String)
加载由 fileName 自变量标识的映射文件。仅当要从映射文件创建 ESI 映射时,才使用此构造器。有关映射文件的详细信息,请参阅本节结尾处的“注解”。
ESIMap(mapID : String, attributes : List<Entry>)
创建新的 ESIMap 实例,将其属性 id 和 entries 设置为输入值。此构造器由解析 ESI 响应元信息文件的 API 调用。
getID() : String
返回属性 id 的值。
3.1.1.2.4 getSourceAttributes() : Collection
返回表示源属性名称的字符串集合。
3.1.1.2.5 getTargetAttributes() : Collection
返回表示目标属性名称的字符串集合。
3.1.1.2.6 iterator() : java.util.Iterator
返回条目属性中集合的迭代器。
| ESIMap 实例包含一个条目实例列表,其中每个条目实例都表示 ESI 响应元信息文件中给定 Map 元素的给定 attributeMapping 条目。上文中的“条目”指上述条目实例列表。 |
| 虽然大多数 ESI 映射对象均使用 ESI 响应元信息文件的内容填充,但还有其他一些对象是通过填充映射文件 ESITarget.map、ESIReleaseActivities.map 得到。映射文件为 ASCII 文本文件。映射文件中的各个条目应具有以下格式: Source_Name = Target_Name|Default 其中,Source_Name、Target_Name 和 Default 与本节前面所述的含义相同。 |
3.1.1.3 ESIMapper
ESIMapper 对象包含用于解释 ESIMap 对象内容的逻辑。它们还会创建输出。ESIMapper 对象提供三种公共方法。这些方法包括:
3.1.1.3.1 map(object : Object, map : ESIMap) : Element
此方法通过对象自变量创建映射的 Info*Engine 元素对象。
3.1.1.3.2 map(inputElement : Element, map : ESIMap) : Element
此方法通过其他 Info*Engine 元素对象创建映射的 Info*Engine 元素对象。
3.1.1.3.3 map(inputElement : Element, map : ESIMap, includeEmptyAttributes : boolean) : Element
此方法通过其他 Info*Engine 元素对象创建映射的 Info*Engine 元素对象。如果为 includeEmptyAttributes 传入 false,则仅具有值的 Att 才会随输出元素一起返回。如果为 includeEmptyAttributes 传入 true,则此方法的行为与 map(inputElement : Element, map : ESIMap) 相同。
3.1.1.3.4 map(inputElement : Element, persistedObject : Persistable, map : ESIMap) : Element
此方法通过其他 Info*Engine 元素对象创建映射的 Info*Engine 元素对象。如果源元素对象没有在 attributeMapping (或映射文件) 条目的 Source_Name 中指定值,则映射器会尝试在第二个方法自变量中从 Persistable 对象获取值。
3.1.1.3.5 map(object : Object, map : ESIMap, softTypes : Map) : Element
此方法通过对象自变量创建映射的 Info*Engine 元素对象。如果此方法无法获取所传递的 ESIMap 实例中给定源属性的值,则会在输出映射 (softTypes) 中创建一个条目,并将相关的源和目标属性名称作为键和值。因此,输出映射最终将包含添加到给定对象的所有可变属性的条目。然后,调用方将能够处理此映射,并根据需要继续映射这些可变属性。
3.1.1.4 映射器类协作
以下序列图显示了对象如何使用 Windchill ESI 映射器:
1. 请求对象从 Windchill ESI 映射管理器获取 ESIMap 对象。(要获取 ESIMap 对象的) id 属性的值将从与当前所处理分布目标的映射进程和请求对象类型相关的组名称中提取。
2. 映射管理器将检查其缓存并返回相应的 ESIMap 对象。如果缓存中不存在 ESIMap 对象,则映射管理器会创建该对象并将其添加到缓存中。
3. 请求对象会创建 ESIMapper 对象并调用相应的映射方法。
4. ESIMapper 对象会从 Windchill ESI 映射中获取迭代器。对于由迭代器标识的每个条目:
a. ESIMapper 获取 Source_Name。
b. ESIMapper 从源中获取该属性的值并将其添加到输出。