【仅供内部供应商使用,不提供对外解答和培训】
...
| Code Block | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||||
package com.fr.io.context.info;
import com.fr.cluster.ClusterBridge;
import com.fr.common.annotations.Open;
import com.fr.config.Identifier;
import com.fr.config.holder.Conf;
import com.fr.config.holder.factory.Holders;
import com.fr.config.holder.impl.MapConf;
import com.fr.config.utils.UniqueKey;
import com.fr.io.base.exception.RepositoryException;
import com.fr.io.base.provider.RepositoryFactoryProvider;
import com.fr.io.base.provider.Updatable;
import com.fr.io.config.RepositoryConfig;
import com.fr.io.context.ResourceModuleContext;
import com.fr.stable.StringUtils;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
* Created by rinoux on 2018/3/26.
*/
@SuppressWarnings("all")
@Open
public abstract class RepositoryProfile<T extends RepositoryConfig> extends UniqueKey implements Serializable, Updatable {
/**
* 仓库类型
*/
@Identifier("identity")
private Conf<String> identity = Holders.simple(StringUtils.EMPTY);
/**
* 仓库名称
*/
@Identifier("repoName")
private Conf<String> repoName = Holders.simple(StringUtils.EMPTY);
/**
* 是否集群共享
*/
@Identifier("shared")
private Conf<Boolean> shared = Holders.simple(Boolean.FALSE);
/**
* 各个机器上的工作路径,如果是共享就共用一个,非共享则各自有各自的workroot,即[id, workroot]
*/
@Identifier("workroots")
private MapConf<Map<String, String>> workroots = Holders.map(new HashMap<String, String>(), String.class, String.class);
public RepositoryProfile() {
}
public RepositoryProfile(String identity, String repoName, String workRoot) {
init(identity, repoName, workRoot, false);
}
public RepositoryProfile(String identity, String repoName, String workRoot, T config) {
init(identity, repoName, workRoot, false);
}
public RepositoryProfile(String identity, String repoName, String workRoot, boolean shared) {
init(identity, repoName, workRoot, shared);
}
public RepositoryProfile(String identity, String repoName, String workRoot, boolean shared, T config) {
init(identity, repoName, workRoot, shared);
}
private void init(String identity, String repoName, String workRoot, boolean shared) {
this.identity.set(identity);
this.repoName.set(repoName);
this.shared.set(shared);
this.setWorkRoot(workRoot);
}
public String getIdentity() {
return identity.get();
}
public void setIdentity(String identity) {
this.identity.set(identity);
}
public String getRepoName() {
return repoName.get();
}
public void setRepoName(String repoName) {
this.repoName.set(repoName);
}
public String getWorkRoot() {
String currentNodeId = ClusterBridge.getView().getCurrent().getID();
if (workroots.containsKey(currentNodeId)) {
return (String) workroots.get(currentNodeId);
}
else if (isShared()) {
Iterator<String> iterator = workroots.get().values().iterator();
while (iterator.hasNext()) {
return iterator.next();
}
}
return null;
}
public void setWorkRoot(String workRoot) {
String currentNodeId = ClusterBridge.getView().getCurrent().getID();
if (isShared()) {
// 共享时改所有的 workroots
Set<String> ids = workroots.get().keySet();
for (String id : ids) {
workroots.put(id, workRoot);
}
}
// 改自己的
this.workroots.put(currentNodeId, workRoot);
}
public boolean isShared() {
return shared.get();
}
public void setShared(boolean shared) {
this.shared.set(shared);
}
public abstract T getConfig();
public abstract void setConfig(T config);
@Override
public RepositoryProfile<T> clone() throws CloneNotSupportedException {
RepositoryProfile<T> cloned = (RepositoryProfile<T>) super.clone();
cloned.identity = (Conf<String>) this.identity.clone();
cloned.repoName = (Conf<String>) this.repoName.clone();
cloned.shared = (Conf<Boolean>) this.shared.clone();
cloned.workroots = (MapConf<Map<String, String>>) this.workroots.clone();
return cloned;
}
/**
* 安装并返回生产的安装组件
*
* @return 仓库安装组件
* @throws RepositoryException
*/
public InstalledComponent<T> install() {
return ResourceModuleContext.install(this);
}
private boolean validate() {
if (StringUtils.isEmpty(getIdentity())) {
return false;
}
if (StringUtils.isEmpty(getRepoName())) {
return false;
}
// 不共享但是没有本机的workroot
if (!isShared() && StringUtils.isEmpty(getWorkRoot())) {
return false;
}
// 共享但是没有workroot配置
if (isShared() && workroots.get().isEmpty()) {
return false;
}
return true;
}
/**
* 是否适合本机安装
*
* @return
*/
public boolean suitable() {
if (ResourceModuleContext.getFactory(getIdentity()) == null) {
return false;
}
return validate();
}
@Override
public final void update(String srcRepo) {
InstalledComponent c = ResourceModuleContext.getInstalledComponent(srcRepo);
this.setWorkRoot(c.getWorkRoot());
this.setShared(c.isShared());
if (getConfig() != null) {
this.getConfig().update(srcRepo);
}
}
/**
* 仅生成安装组件(不安装)
*
* @return 仓库安装组件
*/
public final InstalledComponent<T> generateComponent() {
RepositoryFactoryProvider<T> fac = ResourceModuleContext.getFactory(getIdentity());
return new InstalledComponent<T>(fac, getRepoName(), getWorkRoot(), isShared());
}
}
|
产品线 | 版本 | 支持情况 | 备注 |
|---|---|---|---|
| FR | 10.0 | 支持 |
| Code Block | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
<extra-core>
<AlternateResultProvider class="your class name"/>
</extra-core> |
...