帆软报表设计器源代码。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

313 lines
16 KiB

package com.fanruan.boot.env;
import com.fanruan.boot.key.StartupArgsShell;
import com.fanruan.carina.Carina;
import com.fanruan.carina.annotions.FineComponent;
import com.fanruan.carina.annotions.Start;
import com.fanruan.carina.annotions.Stop;
import com.fanruan.carina.annotions.Supplemental;
import com.fanruan.carina.core.partition.ResourceAffiliate;
import com.fanruan.carina.lifecycle.bootstrap.BootstrapFactory;
import com.fanruan.config.realm.ConfigRepositoryFactory;
import com.fanruan.config.realm.local.LocalConfigRepositoryBuilder;
import com.fr.base.operator.org.OrganizationOperator;
import com.fr.base.rpc.encrypt.EncryptOperator;
import com.fr.decision.service.context.ServiceContext;
import com.fr.design.ConfigHelper;
import com.fr.design.DesignerEnvManager;
import com.fr.design.EnvChangeEntrance;
import com.fr.design.PluginClassRefreshManager;
import com.fr.design.backup.DesignContext;
import com.fr.design.constants.DesignerLaunchStatus;
import com.fr.design.editlock.ConnectionLockChangeChecker;
import com.fr.design.editlock.ServerTableDataLockChangeChecker;
import com.fr.design.env.DesignerWorkspaceGenerator;
import com.fr.design.env.DesignerWorkspaceInfo;
import com.fr.design.file.HistoryTemplateListCache;
import com.fr.design.mem.MemConfigRepositoryBuilder;
import com.fr.design.plugin.remind.PluginErrorDesignReminder;
import com.fr.env.utils.WorkspaceUtils;
import com.fr.event.Event;
import com.fr.event.Listener;
import com.fr.event.Null;
import com.fr.file.filetree.FileNodes;
import com.fr.form.share.ShareComponentOperator;
import com.fr.form.share.ShareEmbeddedConverter;
import com.fr.report.lock.DefaultLockInfoOperator;
import com.fr.report.lock.LocalLockInfoOperator;
import com.fr.report.lock.LockInfoOperator;
import com.fr.report.lock.ServerLockInfoOperator;
import com.fr.start.module.StartupArgs;
import com.fr.value.NotNullLazyValue;
import com.fr.workspace.WorkContext;
import com.fr.workspace.Workspace;
import com.fr.workspace.WorkspaceEvent;
import com.fr.workspace.WorkspaceSwitchProcess;
import com.fr.workspace.base.WorkspaceKey;
import com.fr.workspace.pool.WorkRPCRegister;
import com.fr.workspace.pool.WorkRPCType;
import com.fr.workspace.resource.WorkResource;
import com.fr.workspace.server.ServerFileNodes;
import com.fr.workspace.server.ServerWorkResource;
import com.fr.workspace.server.authority.AuthorityOperator;
import com.fr.workspace.server.authority.FineAuthorityOperator;
import com.fr.workspace.server.authority.decision.DecisionOperator;
import com.fr.workspace.server.authority.decision.FineDecisionOperator;
import com.fr.workspace.server.authority.organization.OrganizationOperatorImpl;
import com.fr.workspace.server.authority.user.DefaultUserAuthority;
import com.fr.workspace.server.authority.user.LocalUserAuthority;
import com.fr.workspace.server.authority.user.ServerUserAuthority;
import com.fr.workspace.server.authority.user.UserAuthority;
import com.fr.workspace.server.check.TemplateChecker;
import com.fr.workspace.server.check.TemplateCheckerImpl;
import com.fr.workspace.server.check.VersionInfoOperator;
import com.fr.workspace.server.check.VersionInfoOperatorImpl;
import com.fr.workspace.server.connection.DBConnectAuth;
import com.fr.workspace.server.connection.LocalDBConnectAuth;
import com.fr.workspace.server.connection.ServerDBConnectAuth;
import com.fr.workspace.server.database.DataBaseTypeOperator;
import com.fr.workspace.server.database.DefaultDatabaseTypeOperator;
import com.fr.workspace.server.database.LocalDatabaseTypeOperator;
import com.fr.workspace.server.database.ServerDatabaseTypeOperator;
import com.fr.workspace.server.encrypt.FineEncryptOperator;
import com.fr.workspace.server.exporter.LocalExportOperator;
import com.fr.workspace.server.exporter.ServerExportOperator;
import com.fr.workspace.server.exporter.TemplateExportOperator;
import com.fr.workspace.server.lock.LocalTplOperator;
import com.fr.workspace.server.lock.ServerTplOperator;
import com.fr.workspace.server.lock.TplOperator;
import com.fr.workspace.server.lock.editlock.DefaultEditLockOperator;
import com.fr.workspace.server.lock.editlock.EditLockOperator;
import com.fr.workspace.server.lock.editlock.LocalEditLockOperator;
import com.fr.workspace.server.lock.editlock.ServerEditLockOperator;
import com.fr.workspace.server.repository.WorkplaceConstants;
import com.fr.workspace.server.share.DefaultShareComponentOperator;
import com.fr.workspace.server.share.DefaultShareEmbeddedConverter;
import com.fr.workspace.server.socket.FineSocketInfoOperator;
import com.fr.workspace.server.socket.SocketInfoOperator;
import com.fr.workspace.server.socket.SocketTokenVerifierOperator;
import com.fr.workspace.server.socket.SocketVerifierOperator;
import com.fr.workspace.server.socket.SocketWsidVerifierOperator;
import com.fr.workspace.server.theme.NotSupportThemedCellInnerBorderFeature;
import com.fr.workspace.server.theme.SupportThemedCellInnerBorderFeature;
import com.fr.workspace.server.theme.ThemedCellBorderFeature;
import com.fr.workspace.server.vcs.CompatibleVcsOperator;
import com.fr.workspace.server.vcs.VcsOperator;
import com.fr.workspace.server.vcs.VcsOperatorProxy;
import com.fr.workspace.server.vcs.v2.move.CompatibleVcsMoveOperator;
import com.fr.workspace.server.vcs.v2.move.VcsMoveOperator;
import com.fr.workspace.server.vcs.v2.move.VcsMoveOperatorImpl;
import com.fr.workspace.server.vcs.v2.scheduler.CompatibleAutoCleanOperator;
import com.fr.workspace.server.vcs.v2.scheduler.VcsAutoCleanOperator;
import com.fr.workspace.server.vcs.v2.scheduler.VcsAutoCleanService;
import org.jetbrains.annotations.NotNull;
import java.util.Optional;
/**
* 环境选择模块
*
* @author Destiny.Lin
* @since 11.0
* Created on 2024/6/6
*/
@FineComponent(name = "design_env_choose")
public class DesignEnvChooseComponent extends ResourceAffiliate {
private Listener<Workspace> afterSwitch4Max = new Listener<Workspace>(Integer.MAX_VALUE) {
@Override
public void on(Event event, Workspace current) {
try {
BootstrapFactory.get().reboot("design_env_prepare");
// 环境切换后,等到模块重启更新一下当前的系统信息
WorkplaceConstants.updateBean();
recordModuleStartStop();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private void recordModuleStartStop() {
WorkspaceSwitchProcess process = WorkContext.getSwitcher().getProcess();
Optional.ofNullable(process)
.ifPresent((e) -> e.recordModuleStartUsed(() -> BootstrapFactory.get().profileStart("design_env_prepare")));
Optional.ofNullable(process)
.ifPresent((e) -> e.recordModuleStopUsed(() -> BootstrapFactory.get().profileStop("design_env_prepare")));
}
};
private Listener<Workspace> beforeSwitch4Max = new Listener<Workspace>(Integer.MAX_VALUE) {
@Override
public void on(Event event, Workspace workspace) {
PluginClassRefreshManager.getInstance().removePluginListener();
HistoryTemplateListCache.getInstance().stash();
PluginClassRefreshManager.getInstance().fireTabChange();
}
};
private Listener<Workspace> afterSwitch4Min = new Listener<Workspace>(Integer.MIN_VALUE) {
@Override
public void on(Event event, Workspace workspace) {
HistoryTemplateListCache.getInstance().load();
PluginClassRefreshManager.getInstance().addPluginListener();
}
};
private NotNullLazyValue<StartupArgs> startupArgs = new NotNullLazyValue<StartupArgs>() {
@NotNull
@Override
protected StartupArgs compute() {
return Carina.getApplicationContext().singleton(StartupArgsShell.class).get();
}
};
@Start
public void start() {
startEnvChoose();
registerEnvListener();
afterAllStart();
}
@Stop
public void stop() {
editLockCheckerStop();
}
@Supplemental
public void prepare() {
supplemental();
}
/**
* ----------------------------------------private------------------------------------------
*/
private void afterAllStart() {
DesignerLaunchStatus.setStatus(DesignerLaunchStatus.WORKSPACE_INIT_COMPLETE);
}
private void startEnvChoose() {
//检查环境
DesignerEnvManager.checkNameEnvMap();
if (startupArgs.getValue().isDemo()) {
DesignerEnvManager.getEnvManager().setCurrentEnv2Default();
} else {
DesignerWorkspaceInfo workspaceInfo = null;
try {
String current = DesignerEnvManager.getEnvManager().getCurEnvName();
workspaceInfo = WorkspaceUtils.getWorkspaceInfo();
((DesignContext)Carina.getApplicationContext()).setDesignWebInfPath(workspaceInfo.getPath());
Workspace workspace = DesignerWorkspaceGenerator.generate(workspaceInfo);
boolean checkValid = workspace != null && workspaceInfo.checkValid();
if (!checkValid) {
EnvChangeEntrance.getInstance().dealEvnExceptionWhenStartDesigner(null, workspaceInfo);
} else {
WorkContext.switchTo(workspace);
}
} catch (Throwable e) {
EnvChangeEntrance.getInstance().dealEvnExceptionWhenStartDesigner(e, workspaceInfo);
}
}
updateConfigBuilder();
pluginErrorRemind();
editLockCheckerStart();
}
private void updateConfigBuilder() {
ConfigRepositoryFactory.getInstance().reset();
if (WorkContext.getCurrent().isLocal()) {
ConfigRepositoryFactory.getInstance().registerConfigRepositoryBuilder(new LocalConfigRepositoryBuilder(ConfigHelper.getEnvProperties(), ConfigHelper.getEnvPropertiesPath()));
} else {
ConfigRepositoryFactory.getInstance().registerConfigRepositoryBuilder(new MemConfigRepositoryBuilder());
}
}
/**
* 注册切换环境前后事件监听
*/
private void registerEnvListener() {
/*切换环境前,重启所有相关模块,最后执行*/
listenEvent(WorkspaceEvent.AfterSwitch, afterSwitch4Max);
/*切换环境前,存储一下打开的所有文件对象,要先于 关闭相关模块部分 被触发*/
listenEvent(WorkspaceEvent.BeforeSwitch, beforeSwitch4Max);
/*切换环境后,装载一下打开的所有文件对象,优先级低于默认优先级,要后于 启动相关模块部分 被触发*/
listenEvent(WorkspaceEvent.AfterSwitch, afterSwitch4Min);
}
private void editLockCheckerStart() {
ConnectionLockChangeChecker.getInstance().start();
ServerTableDataLockChangeChecker.getInstance().start();
}
private void pluginErrorRemind() {
listenEvent(DesignerLaunchStatus.STARTUP_COMPLETE, new Listener<Null>() {
@Override
public void on(Event event, Null aNull) {
PluginErrorDesignReminder.getInstance().remindStartFailedPlugins();
PluginErrorDesignReminder.getInstance().remindInvalidatePlugins();
}
});
}
private void editLockCheckerStop() {
ConnectionLockChangeChecker.getInstance().stop();
ServerTableDataLockChangeChecker.getInstance().stop();
}
private void supplemental() {
ServiceContext.group(WorkspaceKey.class).addAll(
WorkRPCRegister.wrap(WorkRPCType.Server, FileNodes.class, new ServerFileNodes()),
WorkRPCRegister.wrap(AuthorityOperator.class, new FineAuthorityOperator()),
WorkRPCRegister.wrap(DecisionOperator.class, new FineDecisionOperator()),
WorkRPCRegister.wrap(SocketInfoOperator.class, new FineSocketInfoOperator()),
WorkRPCRegister.wrap(OrganizationOperator.class, new OrganizationOperatorImpl()),
WorkRPCRegister.wrap(WorkRPCType.Server, WorkResource.class, ServerWorkResource.getInstance()),
WorkRPCRegister.wrap(WorkRPCType.Server, TplOperator.class, ServerTplOperator.getInstance()),
WorkRPCRegister.wrap(WorkRPCType.Local, TplOperator.class, new LocalTplOperator()),
WorkRPCRegister.wrap(WorkRPCType.Server, DBConnectAuth.class, new ServerDBConnectAuth()),
WorkRPCRegister.wrap(WorkRPCType.Local, DBConnectAuth.class, new LocalDBConnectAuth()),
WorkRPCRegister.wrap(WorkRPCType.Local, TemplateExportOperator.class, new LocalExportOperator()),
WorkRPCRegister.wrap(WorkRPCType.Server, TemplateExportOperator.class, new ServerExportOperator()),
WorkRPCRegister.wrap(WorkRPCType.Local, EditLockOperator.class, new LocalEditLockOperator()),
WorkRPCRegister.wrap(WorkRPCType.Server, EditLockOperator.class, ServerEditLockOperator.getInstance()),
WorkRPCRegister.wrap(WorkRPCType.Compatible, EditLockOperator.class, new DefaultEditLockOperator()),
WorkRPCRegister.wrap(EncryptOperator.class, new FineEncryptOperator()),
WorkRPCRegister.wrap(VcsOperator.class, new VcsOperatorProxy()),
WorkRPCRegister.wrap(WorkRPCType.Compatible, VcsOperator.class, new CompatibleVcsOperator()),
WorkRPCRegister.wrap(VcsMoveOperator.class, VcsMoveOperatorImpl.getInstance()),
WorkRPCRegister.wrap(WorkRPCType.Compatible, VcsMoveOperator.class, new CompatibleVcsMoveOperator()),
WorkRPCRegister.wrap(VcsAutoCleanOperator.class, VcsAutoCleanService.getInstance()),
WorkRPCRegister.wrap(WorkRPCType.Compatible, VcsAutoCleanOperator.class, new CompatibleAutoCleanOperator()),
WorkRPCRegister.wrap(TemplateChecker.class, new TemplateCheckerImpl()),
WorkRPCRegister.wrap(ShareComponentOperator.class, new DefaultShareComponentOperator()),
WorkRPCRegister.wrap(ShareEmbeddedConverter.class, new DefaultShareEmbeddedConverter()),
WorkRPCRegister.wrap(VersionInfoOperator.class, new VersionInfoOperatorImpl()),
WorkRPCRegister.wrap(WorkRPCType.Server, UserAuthority.class, new ServerUserAuthority()),
WorkRPCRegister.wrap(WorkRPCType.Local, UserAuthority.class, new LocalUserAuthority()),
WorkRPCRegister.wrap(WorkRPCType.Compatible, UserAuthority.class, new DefaultUserAuthority()),
WorkRPCRegister.wrap(WorkRPCType.Local, ThemedCellBorderFeature.class, new SupportThemedCellInnerBorderFeature()),
WorkRPCRegister.wrap(WorkRPCType.Server, ThemedCellBorderFeature.class, new SupportThemedCellInnerBorderFeature()),
WorkRPCRegister.wrap(WorkRPCType.Compatible, ThemedCellBorderFeature.class, new NotSupportThemedCellInnerBorderFeature()),
WorkRPCRegister.wrap(WorkRPCType.Server, LockInfoOperator.class, ServerLockInfoOperator.getInstance()),
WorkRPCRegister.wrap(WorkRPCType.Local, LockInfoOperator.class, new LocalLockInfoOperator()),
WorkRPCRegister.wrap(WorkRPCType.Compatible, LockInfoOperator.class, new DefaultLockInfoOperator()),
WorkRPCRegister.wrap(WorkRPCType.Local, DataBaseTypeOperator.class, new LocalDatabaseTypeOperator()),
WorkRPCRegister.wrap(WorkRPCType.Server, DataBaseTypeOperator.class, new ServerDatabaseTypeOperator()),
WorkRPCRegister.wrap(WorkRPCType.Compatible, DataBaseTypeOperator.class, new DefaultDatabaseTypeOperator()),
WorkRPCRegister.wrap(WorkRPCType.Simple, SocketVerifierOperator.class, new SocketWsidVerifierOperator()),
WorkRPCRegister.wrap(WorkRPCType.Compatible, SocketVerifierOperator.class, new SocketTokenVerifierOperator()));
}
}