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
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())); |
|
} |
|
|
|
|
|
|
|
}
|
|
|