package com.fr.start; import com.fr.common.report.ReportState; import com.fr.design.RestartHelper; import com.fr.design.dialog.ErrorDialog; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.messagecollect.StartErrorMessageCollector; import com.fr.design.mainframe.messagecollect.entity.DesignerErrorMessage; import com.fr.exit.DesignerExiter; import com.fr.general.IOUtils; import com.fr.io.utils.ResourceIOUtils; import com.fr.log.FineLoggerFactory; import com.fr.process.ProcessEventPipe; import com.fr.process.engine.core.CarryMessageEvent; import com.fr.process.engine.core.FineProcessContext; import com.fr.stable.StableUtils; import com.fr.stable.lifecycle.ErrorType; import com.fr.stable.lifecycle.FineLifecycleFatalError; import com.fr.stable.project.ProjectConstants; import javax.swing.*; import java.util.HashMap; import java.util.Map; /** * @author hades * @version 10.0 * Created by hades on 2020/3/16 */ public class LifecycleFatalErrorHandler { private static final LifecycleFatalErrorHandler INSTANCE = new LifecycleFatalErrorHandler(); private Map map = new HashMap<>(); private LifecycleFatalErrorHandler() { for (ErrorType type : ErrorType.values()) { if (ErrorType.FINEDB.equals(type)) { map.put(type, FineDBHandler.SELF); } else { map.put(type, DefaultHandler.SELF); } } } public static LifecycleFatalErrorHandler getInstance() { return INSTANCE; } public void handle(FineLifecycleFatalError fatal) { SplashContext.getInstance().hide(); ProcessEventPipe eventPipe = FineProcessContext.getParentPipe(); if (eventPipe != null) { eventPipe.fire(new CarryMessageEvent(ReportState.STOP.getValue())); } map.get(fatal.getErrorType()).handle(fatal); } interface Handler { void handle(FineLifecycleFatalError error); } /** * finedb处理 */ enum FineDBHandler implements Handler { SELF { @Override public void handle(FineLifecycleFatalError fatal) { StartErrorMessageCollector.getInstance().record(DesignerErrorMessage.FINEDB_PROBLEM.getId(), DesignerErrorMessage.FINEDB_PROBLEM.getMessage(), fatal.getMessage()); FineLoggerFactory.getLogger().error(DesignerErrorMessage.FINEDB_PROBLEM.getId() + ": " + DesignerErrorMessage.FINEDB_PROBLEM.getMessage()); int result = FineJOptionPane.showOptionDialog(null, Toolkit.i18nText("Fine-Design_Error_Finedb_Backup_Reset"), Toolkit.i18nText("Fine-Design_Basic_Error_Tittle"), JOptionPane.YES_NO_OPTION, JOptionPane.ERROR_MESSAGE, IOUtils.readIcon("com/fr/design/images/error/error2.png"), new Object[] {Toolkit.i18nText("Fine-Design_Basic_Reset"), Toolkit.i18nText("Fine-Design_Basic_Cancel")}, null); if (result == JOptionPane.YES_OPTION) { boolean success = false; try { ResourceIOUtils.copy(StableUtils.pathJoin(ProjectConstants.EMBED_DB_DIRECTORY, ProjectConstants.FINE_DB_NAME), StableUtils.pathJoin(ProjectConstants.EMBED_DB_DIRECTORY, ProjectConstants.FINE_DB_BAK_NAME)); success = ResourceIOUtils.delete(StableUtils.pathJoin(ProjectConstants.EMBED_DB_DIRECTORY, ProjectConstants.FINE_DB_NAME)); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); afterBackupFailed(); } if (!success) { afterBackupFailed(); } else { RestartHelper.restart(); } } else { DesignerExiter.getInstance().execute(); } } private void afterBackupFailed() { FineJOptionPane.showMessageDialog(null, Toolkit.i18nText("Fine-Design_Error_Finedb_Backup_Reset_Result", ResourceIOUtils.getRealPath(StableUtils.pathJoin(ProjectConstants.EMBED_DB_DIRECTORY, ProjectConstants.FINE_DB_NAME))), Toolkit.i18nText("Fine-Design_Basic_Error"), JOptionPane.ERROR_MESSAGE); DesignerExiter.getInstance().execute(); } } } /** * 默认处理 */ enum DefaultHandler implements Handler { SELF { @Override public void handle(FineLifecycleFatalError fatal) { FineLoggerFactory.getLogger().error(fatal.getMessage(), fatal); StartErrorMessageCollector.getInstance().record(DesignerErrorMessage.UNEXCEPTED_START_FAILED.getId(), DesignerErrorMessage.UNEXCEPTED_START_FAILED.getMessage(), fatal.getMessage()); ErrorDialog dialog = new ErrorDialog(null, Toolkit.i18nText("Fine-Design_Error_Start_Apology_Message"), Toolkit.i18nText("Fine-Design_Error_Start_Report"), fatal.getMessage()) { @Override protected void okEvent() { dispose(); DesignerExiter.getInstance().execute(); } @Override protected void restartEvent() { dispose(); RestartHelper.restart(); } }; dialog.setVisible(true); } } } }