initial commit

This commit is contained in:
CaiHQ 2022-02-17 17:06:10 +08:00
commit a2fa767d89
11 changed files with 321 additions and 0 deletions

26
.gitignore vendored Normal file
View File

@ -0,0 +1,26 @@
/build/
/testoutput/
*/build/*
# Compiled class file
*.class
.DS_Store
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

38
build.gradle Normal file
View File

@ -0,0 +1,38 @@
plugins {
id 'java-library'
}
group 'com.bdware.sc'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
sourceSets {
main {
java {
srcDir 'src/main/java'
}
resources {
srcDir 'src/main/resources'
}
}
test {
java {
srcDir 'src/test/java'
}
resources {
srcDir 'src/test/resources'
}
}
}
dependencies {
api project(":cm")
api project(":front-base")
testImplementation 'junit:junit:4.13.2'
}

View File

@ -0,0 +1,176 @@
package org.bdware.sdk.consistency;
import org.apache.commons.io.FileUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.bdware.sc.bean.ContractExecType;
import org.bdware.sdk.consistency.api.ContractExecutorFactory;
import org.bdware.sdk.consistency.api.context.ISDKContext;
import org.bdware.server.CMDConf;
import org.bdware.server.trustedmodel.ContractExecutor;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Modifier;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public class ConsistencyPluginManager {
private static final Logger LOGGER = LogManager.getLogger(ConsistencyPluginManager.class);
private static final String CONFIG_PATH = "cmconfig.json";
private ISDKContext SDKContext;
public static void setContext(ISDKContext SDKContext) {
getInstance().SDKContext = SDKContext;
}
public static ConsistencyPluginManager getInstance() {
return Inner.instance;
}
public static ISDKContext getContext() {
return getInstance().SDKContext;
}
/**
* 静态内部类单例 懒加载
*/
private static class Inner {
private static final ConsistencyPluginManager instance = new ConsistencyPluginManager();
}
private final Map<String, ContractExecutorFactory> factoriesMap = new HashMap<>();
private URLClassLoader urlClassLoader;
private ConsistencyPluginManager() {
loadPlugins();
}
private void loadPlugins() {
// 读取配置
CMDConf cmdConf = getCmdConf();
if (cmdConf.consistencyPlugins.isEmpty()) {
LOGGER.info("Consistency SDK: no plugin detected");
return;
}
// 装配urlClassLoader
String[] consistencyPluginURLs = cmdConf.consistencyPlugins.split(",");
URL[] urls = new URL[consistencyPluginURLs.length];
for (int i = 0; i < consistencyPluginURLs.length; i++) {
try {
if(consistencyPluginURLs[i].endsWith(".jar")) {
urls[i] = new URL("file:" + consistencyPluginURLs[i]);
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
urlClassLoader = new URLClassLoader(urls, Thread.currentThread().getContextClassLoader());
// 扫描jar包 转载插件
for (String path : consistencyPluginURLs) {
parseJar(path);
}
System.out.println();
}
private CMDConf getCmdConf() {
File confFile = new File(CONFIG_PATH);
File confTemplate = new File(CONFIG_PATH + ".template");
if (!confTemplate.exists()) {
CMDConf conf = new CMDConf();
conf.write(confTemplate.getAbsolutePath());
}
if (!confFile.exists() && confTemplate.exists()) {
try {
FileUtils.copyFile(confTemplate, confFile);
} catch (IOException e) {
e.printStackTrace();
}
}
return CMDConf.parseFile(CONFIG_PATH);
}
/**
* 从jar包中解析ContractExecutorFactory子类
*
* @param path
*/
private void parseJar(String path) {
try {
File file = new File(path);
if (file.exists()) {
JarFile jarFile = new JarFile(file.getCanonicalPath());
Enumeration<JarEntry> enumeration = jarFile.entries();
while (enumeration.hasMoreElements()) {
JarEntry entry = enumeration.nextElement();
String entryName = entry.getName();
if (entryName.endsWith(".class") && entryName.lastIndexOf(".") >= entryName.lastIndexOf("/")) {
try {
String className = entryName.replaceAll("/", ".").substring(0, entryName.length() - 6);
Class<?> clazz = urlClassLoader.loadClass(className);
// ContractExecutorFactory子类 && 非抽象类
if (ContractExecutorFactory.class.isAssignableFrom(clazz) && !Modifier.isAbstract(clazz.getModifiers())) {
ContractExecutorFactory factory = (ContractExecutorFactory)(clazz.newInstance());
factoriesMap.put(factory.getExecutorName(), factory);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public ContractExecutor createContractExecutor(String name, Map<String, Object> args) {
return factoriesMap.containsKey(name) ? factoriesMap.get(name).getInstance(args) : null;
}
@Deprecated
public ContractExecutor createContractExecutor(ContractExecType type, Map<String, Object> args) {
String name = "";
switch (type) {
case Sole:
name = "Sole";
break;
case PBFT:
name = "PBFT";
break;
case Sharding:
name = "Sharding";
break;
case RequestOnce:
name = "RequestOnce";
break;
case ResponseOnce:
name = "ResponseOnce";
break;
case SelfAdaptiveSharding:
name = "SASharding";
break;
case RequestAllResponseAll:
name = "RARA";
break;
case RequestAllResponseHalf:
name = "RARH";
break;
case RequestAllResponseFirst:
name = "RARF";
break;
}
return createContractExecutor(name, args);
}
}

View File

@ -0,0 +1,11 @@
package org.bdware.sdk.consistency.api;
import org.bdware.server.trustedmodel.ContractExecutor;
import java.util.Map;
public interface ContractExecutorFactory {
String getExecutorName();
ContractExecutor getInstance(Map<String, Object> args);
}

View File

@ -0,0 +1,7 @@
package org.bdware.sdk.consistency.api;
public interface NotifiableResultMerger {
String getContractID();
String getInfo();
}

View File

@ -0,0 +1,7 @@
package org.bdware.sdk.consistency.api.context;
import org.bdware.sc.ContractManager;
public interface ICMActions {
ContractManager getManager();
}

View File

@ -0,0 +1,9 @@
package org.bdware.sdk.consistency.api.context;
import org.zz.gmhelper.SM2KeyPair;
public interface IGlobalConf {
String getNodeID();
SM2KeyPair getKeyPair();
}

View File

@ -0,0 +1,11 @@
package org.bdware.sdk.consistency.api.context;
import org.bdware.sc.units.RecoverFlag;
import java.util.Map;
public interface IMasterServerRecoverMechAction {
Map<String, Map<String, RecoverFlag>> getRecoverStatusMap();
void restartContractFromCommonMode(String nodeID, String contractID);
}

View File

@ -0,0 +1,12 @@
package org.bdware.sdk.consistency.api.context;
import org.bdware.sc.units.RequestCache;
import org.bdware.server.action.SyncResult;
import java.util.Map;
public interface IMasterServerTCPAction {
SyncResult getSync();
Map<String, RequestCache> getReqCache();
}

View File

@ -0,0 +1,11 @@
package org.bdware.sdk.consistency.api.context;
import org.bdware.sc.conn.ResultCallback;
public interface INetworkManager {
void sendToAgent(String pubkey, String content);
boolean hasAgentConnection(String pubKey);
ResultCallback createResultCallback(String requestID, ResultCallback rc, int count);
}

View File

@ -0,0 +1,13 @@
package org.bdware.sdk.consistency.api.context;
public interface ISDKContext {
IMasterServerTCPAction getMasterServerTCPAction();
INetworkManager getNetworkManager();
ICMActions getCMActions();
IMasterServerRecoverMechAction getMasterServerRecoverMechAction();
IGlobalConf getGlobalConf();
}