【Ovirt 笔记】提示与日志信息国际化实现分析与整理
分析整理的版本为 Ovirt 3.4.5 版本。
Model中直接给出提示信息。
实现步骤
-
org.ovirt.engine.ui.uicompat.UIConstants类中定义信息实现接口。
-
uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/
UIConstants_zh_CN.properties配置提示信息(关键字与UIConstants实现接口名一致)。 -
Model中使用ConstantsManager.getInstance().getConstants()方法,实例化提示信息。
-
通过.replace("{size}", size)的方式替换配置信息中的参数信息。
-
通过Frontend.getInstance().errorMessageHandler(errorMessage)方法,将提示信息设置到前台提示窗口中。
举例说明
@DefaultStringValue("Less than {size} G for system log storage, please consider to export logs or delete them")
String lowFreeSpaceStorageForAuditEvent();
String size = result.getReturnValue().getDescription();
String errorMessage = ConstantsManager.getInstance().getConstants()
.lowFreeSpaceStorageForAuditEvent().replace("{size}", size);
Frontend.getInstance().errorMessageHandler(errorMessage);
执行Command的canDoAction给出提示信息。
实现步骤
-
org.ovirt.engine.core.common.errors.VdcBllMessages类中定义提示信息类型。
-
提示信息封装为ValidationResult对象。
-
通过validate方法,将提示信息加入getCanDoActionMessages()列表。
-
通过failCanDoAction方法,直接返回提示信息。
-
-
org.ovirt.engine.ui.frontend.AppErrors类中定义接口(接口名与VdcBllMessages提示信息类型保持一致)。
-
webadmin/src/main/resources/org/ovirt/engine/ui/frontend/
AppErrors_zh_CN.properties配置提示信息。(关键字与AppErrors实现接口名一致)。 -
Command类中通过覆盖setActionMessageParameters()方法,设置配置文件中的参数信息。
-
通过Frontend执行runAction,如果canDoActionMessage不为空,直接弹出提示信息窗口。
举例说明
LICENSE_IS_NONE(ErrorType.BAD_PARAMETERS),
return failCanDoAction(VdcBllMessages.LICENSE_IS_ERROR);
return checkEncryptPolicy() && validate(validator.exists()) && validate(validator.validateStatusForActivation()) &&
validate(validator.validateUniqueId()) && validate(LicenseValidator.cpuNumLimitValid(getVds().getCpuSockets()));
@DefaultStringValue("License is none.")
String LICENSE_IS_NONE();
runAction(final VdcActionType actionType,
final VdcActionParametersBase parameters,
final IFrontendActionAsyncCallback callback,
final Object state, final
boolean showErrorDialog) {
public void onSuccess(final VdcOperation<VdcActionType,
VdcActionParametersBase> operation,
final VdcReturnValueBase result) {
logger.finer("Frontend: sucessfully executed runAction, determining result!"); handleActionResult(actionType, parameters, result,
callback != null ? callback : NULLABLE_ASYNC_CALLBACK, state, showErrorDialog); RefreshActiveModelEvent.fire(Frontend.this, true);
}
if (!result.getCanDoAction()) {
result.setCanDoActionMessages((ArrayList<String>) translateError(result));
执行Command的executeAction失败给出提示信息。(返回唯一的错误)
实现步骤
-
executeAction中抛出VdcBLLException异常,并且设置succeeded为false。
-
org.ovirt.engine.core.common.errors.VdcBllErrors中定义提示信息类型。
-
webadmin/src/main/resources/org/ovirt/engine/ui/frontend/
VdsmErrors_zh_CN.properties配置提示信息。 -
没有提供传递参数的方式。
-
通过Frontend执行runAction,执行失败,前台弹出错误提示信息窗口。
举例说明
MiscBlockReadIncomplete(2007),
MiscDirCleanupFailure(2008),
ResourceException(3000),
VolumeGeneralException(4000),
returnValue.setExceptionString(errorMessage.toString());
runAction(final VdcActionType actionType,
final VdcActionParametersBase parameters,
final IFrontendActionAsyncCallback callback,
final Object state, final
boolean showErrorDialog) {
↓
public void onFailure(final VdcOperation<VdcActionType, VdcActionParametersBase> operation,
final Throwable caught) {
if (ignoreFailure(caught)) {
return;
}
logger.log(Level.SEVERE, "Failed to execute runAction: " + caught, caught);
failureEventHandler(caught);
FrontendActionAsyncResult f = new FrontendActionAsyncResult(actionType,
parameters,
null,
state);
if (callback != null) {
callback.executed(f);
}
}
执行Query的executeQueryCommand给出提示信息。(返回唯一的错误)
实现步骤
-
与<执行Command的executeAction给出提示信息>同样的流程。
-
通过Frontend执行runQuery,执行失败,前台弹出错误提示信息窗口。
举例说明
if (!result.getSucceeded()) {
logger.log(Level.WARNING, "Failure while invoking runQuery [" + result.getExceptionString() + "]");
if (getEventsHandler() != null) {
ArrayList<VdcQueryReturnValue> failedResult = new ArrayList<VdcQueryReturnValue>();
failedResult.add(result); String errorMessage = result.getExceptionString();
handleNotLoggedInEvent(errorMessage);
}
执行Query的前台自定义提示窗口(返回唯一的错误)。
实现步骤
-
与<执行Command的executeAction失败给出提示信息>同样的流程。
-
定义succeeded为true。
-
org.ovirt.engine.ui.frontend.AppErrors类中定义接口(接口名与VdcBllErrors提示信息类型保持一致)。
-
webadmin/src/main/resources/org/ovirt/engine/ui/frontend/
AppErrors_zh_CN.properties配置提示信息。(关键字与AppErrors实现接口名一致)。 -
前台自定义弹出窗口ConfirmationModel confirmWin = new ConfirmationModel();
-
使用Frontend.getInstance().getAppErrorsTranslator().translateErrorText实例化提示信息。
-
参数传递可以通过在执行translateErrorText之前,做替换操作实现。
举例说明
ConfirmationModel confirmWin = new ConfirmationModel(); setWindow(confirmWin); confirmWin.setTitle(ConstantsManager.getInstance().getConstants().operationRestricted()); confirmWin.setHelpTag(HelpTag.over_vm_limit);
confirmWin.setHashName("over_vm_limit"); confirmWin.setMessage(Frontend.getInstance().getAppErrorsTranslator().translateErrorText(
resolveMessages(vdcQueryReturnValue.getExceptionString())).get(0));
UICommand tempVar2 = new UICommand("Cancel", (VmListModel) model);
tempVar2.setTitle(ConstantsManager.getInstance().getConstants().close()); tempVar2.setIsCancel(true);
confirmWin.getCommands().add(tempVar2);
if (null != vdcQueryReturnValue.getReturnValue() &&
!(vdcQueryReturnValue.getReturnValue() instanceof Boolean)) {
if (((VmType) vdcQueryReturnValue.getReturnValue()) == VmType.Server)
{
runVm(desktopList);
} else if (((VmType) vdcQueryReturnValue.getReturnValue()) == VmType.Desktop)
{
runVm(serversList);
}
}
Command中定义日志信息。(必须executeAction执行,无论成功与否都能定义日志)
实现步骤
-
org.ovirt.engine.core.common.AuditLogType定义日志类型。
-
backend/manager/modules/dal/src/main/resources/bundles/
AuditLogMessages.properties定义日志信息(关键字与AuditLogType一致) -
org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector定义日志属性。
-
Comand类中通过覆盖getAuditLogTypeValue方法,实例化日志对象。
-
通过addCustomValue(final String name, final String value)方法,增加参数定义。
举例说明
LICENSE_FILE_UPDATE_SUCCEED(10501),
severities.put(AuditLogType.LICENSE_FILE_UPDATE_FAILED, AuditLogSeverity.ERROR);
@Override
public AuditLogType getAuditLogTypeValue() {
return getSucceeded() ? AuditLogType.LICENSE_FILE_UPDATE_SUCCEED :
AuditLogType.LICENSE_FILE_UPDATE_FAILED;
}
自定义日志信息
实现步骤
-
org.ovirt.engine.core.common.AuditLogType定义日志类型。
-
backend/manager/modules/dal/src/main/resources/bundles/
AuditLogMessages.properties定义日志信息(关键字与AuditLogType一致) -
通过AuditLogDirector.log实例化日志对象。
-
通过new AuditLogableBase()实例化参数对象。
-
通过AuditLogableBase对象的addCustomValue方法,增加参数定义。
举例说明
AuditLogableBase logable = new AuditLogableBase(); logable.setCurrentUser(getParameters().getUser());
logable.addCustomValue("UserName", getParameters().getUser().getLoginName()); AuditLogDirector.log(logable, AuditLogType.LICENSE_IS_NONE);
用户门户执行Command的canDoAction给出提示信息
实现步骤
- (与<执行Command的canDoAction给出提示信息>一致)唯一区别在于,国际化配置文件:/frontend-all/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors_zh_CN.properties配置提示信息。(关键字与AppErrors实现接口名一致)。
API执行Command的canDoAction给出提示信息。
实现步骤
- (与<执行Command的canDoAction给出提示信息>一致)唯一区别在于,国际化配置文件:/dal/src/main/resources/bundles/AppErrors_zh_CN.properties配置提示信息。(关键字与AppErrors实现接口名一致)。