Ovirt程序员

【Ovirt 笔记】提示与日志信息国际化实现分析与整理

2017-04-19  本文已影响8人  58bc06151329

分析整理的版本为 Ovirt 3.4.5 版本。

Model中直接给出提示信息。

实现步骤

  1. org.ovirt.engine.ui.uicompat.UIConstants类中定义信息实现接口。

  2. uicompat/src/main/resources/org/ovirt/engine/ui/uicompat/
    UIConstants_zh_CN.properties配置提示信息(关键字与UIConstants实现接口名一致)。

  3. Model中使用ConstantsManager.getInstance().getConstants()方法,实例化提示信息。

  4. 通过.replace("{size}", size)的方式替换配置信息中的参数信息。

  5. 通过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给出提示信息。

实现步骤

  1. org.ovirt.engine.core.common.errors.VdcBllMessages类中定义提示信息类型。

  2. 提示信息封装为ValidationResult对象。

    1. 通过validate方法,将提示信息加入getCanDoActionMessages()列表。

    2. 通过failCanDoAction方法,直接返回提示信息。

  3. org.ovirt.engine.ui.frontend.AppErrors类中定义接口(接口名与VdcBllMessages提示信息类型保持一致)。

  4. webadmin/src/main/resources/org/ovirt/engine/ui/frontend/
    AppErrors_zh_CN.properties配置提示信息。(关键字与AppErrors实现接口名一致)。

  5. Command类中通过覆盖setActionMessageParameters()方法,设置配置文件中的参数信息。

  6. 通过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失败给出提示信息。(返回唯一的错误)

实现步骤

  1. executeAction中抛出VdcBLLException异常,并且设置succeeded为false。

  2. org.ovirt.engine.core.common.errors.VdcBllErrors中定义提示信息类型。

  3. webadmin/src/main/resources/org/ovirt/engine/ui/frontend/
    VdsmErrors_zh_CN.properties配置提示信息。

  4. 没有提供传递参数的方式。

  5. 通过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给出提示信息。(返回唯一的错误)

实现步骤

  1. 与<执行Command的executeAction给出提示信息>同样的流程。

  2. 通过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的前台自定义提示窗口(返回唯一的错误)。

实现步骤

  1. 与<执行Command的executeAction失败给出提示信息>同样的流程。

  2. 定义succeeded为true。

  3. org.ovirt.engine.ui.frontend.AppErrors类中定义接口(接口名与VdcBllErrors提示信息类型保持一致)。

  4. webadmin/src/main/resources/org/ovirt/engine/ui/frontend/
    AppErrors_zh_CN.properties配置提示信息。(关键字与AppErrors实现接口名一致)。

  5. 前台自定义弹出窗口ConfirmationModel confirmWin = new ConfirmationModel();

  6. 使用Frontend.getInstance().getAppErrorsTranslator().translateErrorText实例化提示信息。

  7. 参数传递可以通过在执行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执行,无论成功与否都能定义日志)

实现步骤

  1. org.ovirt.engine.core.common.AuditLogType定义日志类型。

  2. backend/manager/modules/dal/src/main/resources/bundles/
    AuditLogMessages.properties定义日志信息(关键字与AuditLogType一致)

  3. org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector定义日志属性。

  4. Comand类中通过覆盖getAuditLogTypeValue方法,实例化日志对象。

  5. 通过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; 
}

自定义日志信息

实现步骤

  1. org.ovirt.engine.core.common.AuditLogType定义日志类型。

  2. backend/manager/modules/dal/src/main/resources/bundles/
    AuditLogMessages.properties定义日志信息(关键字与AuditLogType一致)

  3. 通过AuditLogDirector.log实例化日志对象。

  4. 通过new AuditLogableBase()实例化参数对象。

  5. 通过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给出提示信息

实现步骤

  1. (与<执行Command的canDoAction给出提示信息>一致)唯一区别在于,国际化配置文件:/frontend-all/webadmin/modules/webadmin/src/main/resources/org/ovirt/engine/ui/frontend/AppErrors_zh_CN.properties配置提示信息。(关键字与AppErrors实现接口名一致)。

API执行Command的canDoAction给出提示信息。

实现步骤

  1. (与<执行Command的canDoAction给出提示信息>一致)唯一区别在于,国际化配置文件:/dal/src/main/resources/bundles/AppErrors_zh_CN.properties配置提示信息。(关键字与AppErrors实现接口名一致)。
上一篇下一篇

猜你喜欢

热点阅读