Richard.Fang
2 months ago
10 changed files with 169 additions and 137 deletions
@ -0,0 +1,117 @@
|
||||
package com.fr.env; |
||||
|
||||
import com.fanruan.repository.ConfigRepository; |
||||
import com.fr.config.dao.DaoContext; |
||||
import com.fr.config.dao.impl.remote.RemoteConfigOperable; |
||||
import com.fr.config.utils.ConfData; |
||||
import com.fr.config.utils.ConfigReadUtils; |
||||
import com.fr.config.utils.PrefixHandler; |
||||
import com.fr.config.utils.SetupDataOperator; |
||||
import com.fr.nx.app.web.out.widget.utils.CollectionUtils; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.tenant.context.TenantContext; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.util.stream.Collectors; |
||||
|
||||
import static com.sun.org.apache.xalan.internal.xsltc.compiler.Constants.STRING; |
||||
|
||||
/** |
||||
* 设计器远程下获取Updata的操作类 |
||||
* |
||||
* @author Destiny.Lin |
||||
* @since 11.0 |
||||
* Created on 2024/10/14 |
||||
*/ |
||||
public class SetupDataDesignerRemoteOperator implements SetupDataOperator { |
||||
|
||||
private static final SetupDataDesignerRemoteOperator INSTANCE = new SetupDataDesignerRemoteOperator(); |
||||
|
||||
private static final String EMPTY_STRING = ""; |
||||
|
||||
/** |
||||
* 单例 |
||||
*/ |
||||
public static SetupDataDesignerRemoteOperator getInstance() { |
||||
return INSTANCE; |
||||
} |
||||
|
||||
/** |
||||
* 批量拉取配置 |
||||
* @param nameSpaces |
||||
*/ |
||||
public void fetchBatchConfDatas(List<String> nameSpaces) { |
||||
if(nameSpaces.isEmpty()){ |
||||
return; |
||||
} |
||||
List<String> namespaceList = nameSpaces.stream() |
||||
.filter(namespace -> !checkRemoteConfigCacheExistence(namespace)) |
||||
.collect(Collectors.toList()); |
||||
if(CollectionUtils.isEmpty(namespaceList)){ |
||||
return; |
||||
} |
||||
ConfigRepository.getInstance().batchGetConfigsByConfigsCache(namespaceList, () -> { |
||||
batchSaveConfigs(namespaceList, TenantContext.getCurrentWithException().getId()); |
||||
return null; |
||||
}); |
||||
} |
||||
|
||||
private void batchSaveConfigs(List<String> nameSpaces, String tenantId) { |
||||
nameSpaces.forEach(namespace -> { |
||||
String prefix = PrefixHandler.concatPrefix(namespace, EMPTY_STRING); |
||||
ConfigReadUtils.getData(prefix, tenantId); |
||||
ConfigReadUtils.getClassInfo(prefix, tenantId); |
||||
}); |
||||
} |
||||
|
||||
@Override |
||||
public ConfData getData(String prefix, String tenantId) { |
||||
String configNamespace = getConfigNameSpace(prefix); |
||||
if (checkRemoteConfigCacheExistence(configNamespace)) { |
||||
return createConfData(prefix, tenantId); |
||||
} |
||||
return ConfigRepository.getInstance().getConfigByConfigsCache(configNamespace, () -> createConfData(prefix, tenantId)); |
||||
} |
||||
|
||||
private ConfData createConfData(String prefix, String tenantId) { |
||||
ConfData data = new ConfData(); |
||||
data.setDataMap(ConfigReadUtils.getData(prefix, tenantId)); |
||||
data.setMap(ConfigReadUtils.getClassInfo(prefix, tenantId)); |
||||
return data; |
||||
} |
||||
|
||||
private String getConfigNameSpace(String id) { |
||||
|
||||
if (StringUtils.isEmpty(id)) { |
||||
throw new IllegalArgumentException("id cannot be null"); |
||||
} |
||||
int length = id.length(); |
||||
for (int i = 0; i < length; i++) { |
||||
if (PrefixHandler.SEPERATOR == id.charAt(i)) { |
||||
return id.substring(0, i); |
||||
} |
||||
} |
||||
throw new IllegalArgumentException("cannot resolve namespace of " + id); |
||||
} |
||||
|
||||
/** |
||||
* 检查远程配置缓存是否存在 |
||||
* <p> |
||||
* 该方法通过判断三个远程配置相关的DAO(EntityDao、XmlEntityDao、ClassHelperDao)是否在缓存中存在指定的命名空间。 |
||||
* 如果DAO实现了RemoteConfigOperable接口,则会依次检查缓存。 |
||||
* 如果DAO不支持远程缓存检查,返回false。 |
||||
* |
||||
* @param nameSpace 命名空间 |
||||
* @return 如果三个远程DAO的缓存中都存在指定命名空间的数据,返回true;否则返回false |
||||
*/ |
||||
private boolean checkRemoteConfigCacheExistence(String nameSpace) { |
||||
// 只判断一次,所有远程的Dao都实现了RemoteConfigOperable接口
|
||||
if (DaoContext.getEntityDao() instanceof RemoteConfigOperable) { |
||||
return ((RemoteConfigOperable) DaoContext.getEntityDao()).checkCacheExistence(nameSpace) && |
||||
((RemoteConfigOperable) DaoContext.getXmlEntityDao()).checkCacheExistence(nameSpace) && |
||||
((RemoteConfigOperable) DaoContext.getClassHelperDao()).checkCacheExistence(nameSpace); |
||||
} |
||||
// 非远程配置不支持设计器缓存检查,返回false
|
||||
return false; |
||||
} |
||||
} |
@ -1,51 +0,0 @@
|
||||
package com.fanruan.config; |
||||
|
||||
import com.fanruan.repository.ConfigRepository; |
||||
import com.fr.config.utils.ConfData; |
||||
import com.fr.config.utils.ConfigReadUtils; |
||||
import com.fr.config.utils.PrefixHandler; |
||||
import com.fr.config.utils.SetupDataOperator; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
/** |
||||
* 设计器远程下获取Updata的操作类 |
||||
* |
||||
* @author Destiny.Lin |
||||
* @since 11.0 |
||||
* Created on 2024/10/14 |
||||
*/ |
||||
public class SetupDataDesignerRemoteOperator implements SetupDataOperator { |
||||
|
||||
private static final SetupDataDesignerRemoteOperator INSTANCE = new SetupDataDesignerRemoteOperator(); |
||||
|
||||
/** |
||||
* 单例 |
||||
*/ |
||||
public static SetupDataDesignerRemoteOperator getInstance() { |
||||
return INSTANCE; |
||||
} |
||||
|
||||
@Override |
||||
public ConfData getData(String prefix, String tenantId) { |
||||
return ConfigRepository.getInstance().getConfigByConfigsCache(getConfigNameSpace(prefix), () -> { |
||||
ConfData data = new ConfData(); |
||||
data.setDataMap(ConfigReadUtils.getData(prefix, tenantId)); |
||||
data.setMap(ConfigReadUtils.getClassInfo(prefix, tenantId)); |
||||
return data; |
||||
}); |
||||
} |
||||
|
||||
private String getConfigNameSpace(String id) { |
||||
|
||||
if (StringUtils.isEmpty(id)) { |
||||
throw new IllegalArgumentException("id cannot be null"); |
||||
} |
||||
int length = id.length(); |
||||
for (int i = 0; i < length; i++) { |
||||
if (PrefixHandler.SEPERATOR == id.charAt(i)) { |
||||
return id.substring(0, i); |
||||
} |
||||
} |
||||
throw new IllegalArgumentException("cannot resolve namespace of " + id); |
||||
} |
||||
} |
Loading…
Reference in new issue