帆软报表设计器源代码。
 
 
 
 

188 lines
7.8 KiB

package com.fr.start;
import com.fr.common.report.ReportState;
import com.fr.common.util.Collections;
import com.fr.design.RestartHelper;
import com.fr.design.dialog.FineJOptionPane;
import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.DesignerFrame;
import com.fr.design.mainframe.messagecollect.StartErrorMessageCollector;
import com.fr.design.mainframe.messagecollect.entity.DesignerErrorMessage;
import com.fr.env.detect.base.DetectorBridge;
import com.fr.env.detect.bean.DetectorResult;
import com.fr.env.detect.bean.DetectorStatus;
import com.fr.env.detect.bean.DetectorType;
import com.fr.env.detect.ui.DetectorErrorDialog;
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.engine.core.CarryMessageEvent;
import com.fr.process.engine.core.FineProcessContext;
import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils;
import com.fr.stable.lifecycle.ErrorType;
import com.fr.stable.lifecycle.ErrorTypeHelper;
import com.fr.stable.lifecycle.FineLifecycleFatalError;
import com.fr.stable.project.ProjectConstants;
import javax.swing.JOptionPane;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @author hades
* @version 10.0
* Created by hades on 2020/3/16
*/
public class LifecycleFatalErrorHandler {
private static final LifecycleFatalErrorHandler INSTANCE = new LifecycleFatalErrorHandler();
private Map<ErrorType, Handler> map = new HashMap<>();
private LifecycleFatalErrorHandler() {
map.put(ErrorTypeHelper.FINEDB, FineDBHandler.SELF);
}
public static LifecycleFatalErrorHandler getInstance() {
return INSTANCE;
}
public void handle(FineLifecycleFatalError fatal) {
SplashContext.getInstance().hide();
FineProcessContext.getParentPipe().fire(new CarryMessageEvent(ReportState.STOP.getValue()));
Handler handler = map.get(fatal.getErrorType());
if (handler == null) {
handler = DefaultHandler.SELF;
}
handler.handle(fatal);
}
interface Handler {
void handle(FineLifecycleFatalError error);
}
/**
* finedb处理
*/
enum FineDBHandler implements Handler {
/**
* 自检测
*/
SELF {
final EnumMap<DetectorType, String> solutionMap = new EnumMap<>(DetectorType.class);
{
solutionMap.put(DetectorType.FINE_DB_LOCKED, "Fine-Design_Error_Finedb_Locked_Backup_Reset");
solutionMap.put(DetectorType.FINE_DB_PERMISSION, "Fine-Design_Error_Finedb_Permission_Backup_Reset");
solutionMap.put(DetectorType.FINE_DB_DIRTY, "Fine-Design_Error_Finedb_Dirty_Backup_Reset");
}
@Override
public void handle(FineLifecycleFatalError fatal) {
Stream<DetectorResult> resultStream = DetectorBridge.getInstance().detect(fatal);
List<DetectorResult> results = resultStream
.filter((e) -> e.getStatus() == DetectorStatus.EXCEPTION)
.collect(Collectors.toList());
String showText = generateShowText(results);
// 如果还是异常,说明并不是 DB 的异常,抛出预期外的错误
if (StringUtils.isEmpty(showText)) {
DesignerFrame designerFrame = DesignerContext.getDesignerFrame();
DetectorErrorDialog errorDialog = new DetectorErrorDialog(designerFrame, results);
errorDialog.setVisible(true);
return;
}
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,
showText,
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 String generateShowText(List<DetectorResult> results) {
String showText = StringUtils.EMPTY;
if (Collections.isEmpty(results)) {
showText = Toolkit.i18nText("Fine-Design_Error_Finedb_Backup_Reset");
} else {
for (DetectorResult result : results) {
DetectorType type = result.getType();
String solutionLocale = solutionMap.get(type);
if (StringUtils.isNotEmpty(solutionLocale)) {
showText = Toolkit.i18nText(solutionLocale);
break;
}
}
}
return showText;
}
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) {
DesignerExiter.getInstance().exit(fatal);
}
}
}
}