实现基于解决方案的预先验证
如“预先验证序列”部分所示,验证服务首先执行的预先验证检查将根据已安装的 Windchill 解决方案集来确定是否应该隐藏 UI 组件。例如,如果未安装 Windchill PDMLink,则某些操作将始终不可用。
因此,最好始终不要将此类基于解决方案的逻辑包括在您的验证器或筛选器类中。假设您的验证器或筛选器已被调用,正在验证的 UI 组件已通过任何适用的基于解决方案的检查。
基于解决方案的逻辑应在解决方案组中实现。
实现解决方案组
实现解决方案组类非常简单。您需要做的全部工作就是创建一个实现 UIComponentSolutionGroup 接口的类,并在您的类中实现 getInvalidInstallKeys() 方法。在该方法中,您可以检查并查看已安装的解决方案,同时可返回一个根据所安装的解决方案确定将始终不可用的操作或 UI 组件的验证键列表。
以下页面上的类是一个简单的解决方案组示例,其 getInvalidInstallKeys() 方法将检查是否安装 Pro/INTRALINK。如果已安装 Pro/I,则会返回一个表示始终不可用的操作或组件的验证键列表。
package com.ptc.windchill.enterprise.myPackage;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import wt.log4j.LogR;
import wt.util.InstalledProperties;
public class MySolutionGroup implements UIComponentSolutionGroup
{
private static UIValidationKey listKey =
UIValidationKey.newInstance("list", "change");
private static UIValidationKey crKey =
UIValidationKey.newInstance("listChangeRequests", "change");
private static UIValidationKey cnKey =
UIValidationKey.newInstance("listChangeNotices", "change");
private static UIValidationKey viewKey =
UIValidationKey.newInstance("view", "change");
/*
* DEFINE ADDITIONAL ACTIONS AND UI COMPONENTS AS NEEDED
*/
private static Logger logger =
LogR.getLogger(MySolutionGroup.class.getName());
public List getInvalidInstallKeys()
{
if (logger.isDebugEnabled()){
logger.debug("ENTERING MySolutionGroup.getInvalidKeys");
}
ArrayList invalidList = new ArrayList();
// if PRO-I is installed, the following UI components are
not valid.
if
(InstalledProperties.isInstalled(InstalledProperties.PRO_I)){
invalidList.add(listKey);
invalidList.add(listKey);
invalidList.add(cnKey);
invalidList.add(viewKey);
}
/*
* ADD ADDITIONAL SOLUTION-BASED CHECKS AS NEEDED
*/
if (logger.isTraceEnabled()){
logger.trace("RETURNING " + (List)invalidList);
}
(logger.(trace("RETURNING " + (List)invalidList))){
logger.debug("EXITING MySolutionGroup.getInvalidKeys");
}
return invalidList;
}
}
如果您想知道如何确定在验证键工厂方法中包含哪些值,这需要确定所创建验证键将应用于操作还是属性。如果要创建适用于操作的验证键,则第一个自变量表示操作名称 (来自 *actions.xml),第二个自变量表示对象类型 (来自 *actions.xml)。例如,要创建用于表示以下产品操作的验证键,您将调用 UIValidationKey.newInstance(“product”, “navigation”);
<objecttype name="navigation" class=""
resourceBundle="com.ptc.core.ui.navigationRB">
<action name="product" renderType="GENERAL">
<command class="netmarkets"
method="servlet/Navigation?tab=product" windowType="page"/>
</action>
...
构建 ValidationKey
如果您想知道如何确定在验证键工厂方法中包含哪些值,这需要确定所创建验证键将应用于操作、操作模型还是属性。
如果要创建适用于操作的验证键,则第一个自变量表示操作名称 (来自 *actions.xml),第二个自变量表示对象类型 (来自 *actions.xml)。例如,要创建用于表示以下产品操作的验证键,您将调用 UIValidationKey.newInstance(“product”, “navigation”);
<objecttype name="navigation" class=""
resourceBundle="com.ptc.core.ui.navigationRB">
<action name="product"
renderType="GENERAL">
<command class="netmarkets"
method="servlet/Navigation?tab=product"
windowType="page"/>
</action>
...
如果要创建适用于操作模型的验证键,则第一个自变量表示操作模型名称 (来自 *actionModels.xml),第二个自变量表示始终为 "object" 的对象类型。例如,要创建一个验证键来表示下方 carambola_sub_model,您可以调用 UIValidationKey.newInstance(“carambola_sub_model”, “object”);
<model name="carambola_sub_model">
<action name="ripe" type="carambola" />
<action name="grow" type="carambola" />
</model>
如果要创建适用于属性的验证键,只需在 Windchill 客户端体系结构中使用用于该属性的描述符 ID。例如,要为描述符 ID 为 "iteration" 的属性创建验证键,您可调用 UIValidationKey.newInstance(“iteration”);
注册解决方案组
创建并构建解决方案组后,唯一需要做的就是进行注册。通过创建如下所示条目,可在 *service.properties.xconf 中注册一个解决方案组:
<Service context="default"
name="com.ptc.core.ui.validation.UIComponentSolutionGroup">
<Option requestor="null" serviceClass="[your fully-qualified SolutionGroup class name]"
selector="[any unique key, e.g., "ChangeMgmtSolutionGroup")]" />
</Service>
在 *service.properties 中的传播条目应如下所示:
wt.services/svc/default/com.ptc.core.ui.validation.UIComponentSolu
tionGroup/[any unique key, e.g., "MySolutionGroup"]/null/0=[your fully-qualified solution group class name]
解决方案组注册完成后,每次调用验证服务来执行预先验证时都应检查其逻辑。(实际上,在第一次调用后其结果已缓存。)
实现基于角色的预先验证
验证服务执行的第二个预先验证检查是调用基于角色的 UI 服务,以查看管理员用户是否配置了需要对某些用户隐藏或禁用的组件。此检查在验证服务中构建,因此定制者不需要进行任何工作。有关将基于角色的 UI 服务配置为管理员用户的详细信息,请参阅
自定义基于角色的 UI 功能 - 操作可见性。