Browse Source

add the retrieval;

tags/1.1.0
zhaoguangwei 5 years ago
parent
commit
caa9cead9c
24 changed files with 1393 additions and 10 deletions
  1. +19
    -1
      source/manager/ump-booter/src/main/java/com/jd/blockchain/ump/UmpBooter.java
  2. +4
    -1
      source/manager/ump-booter/src/main/resources/application.properties
  3. +4
    -1
      source/manager/ump-booter/src/main/resources/config.properties
  4. +73
    -0
      source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/ApiResult.java
  5. +33
    -0
      source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/ErrorCode.java
  6. +13
    -0
      source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/UmpConstant.java
  7. +47
    -0
      source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/penetrate/DataAccountSchema.java
  8. +46
    -0
      source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/penetrate/FieldSchema.java
  9. +79
    -0
      source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/penetrate/LeaderDomain.java
  10. +177
    -0
      source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/penetrate/PeerDomain.java
  11. +90
    -0
      source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/penetrate/SchemaDomain.java
  12. +70
    -0
      source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/penetrate/store/MemQueue.java
  13. +49
    -0
      source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/penetrate/store/MemStore.java
  14. +26
    -0
      source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/DataAccountUmpService.java
  15. +31
    -0
      source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/DataAccountUmpServiceImpl.java
  16. +28
    -0
      source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/DataRetrievalService.java
  17. +45
    -0
      source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/DataRetrievalServiceHandler.java
  18. +51
    -0
      source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UmpStoreService.java
  19. +76
    -0
      source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UmpStoreServiceImpl.java
  20. +21
    -7
      source/manager/ump-service/src/main/java/com/jd/blockchain/ump/util/HttpClientPool.java
  21. +270
    -0
      source/manager/ump-web/src/main/java/com/jd/blockchain/ump/controller/RetrievalController.java
  22. +59
    -0
      source/manager/ump-web/src/main/java/com/jd/blockchain/ump/controller/TaskRetrievalController.java
  23. +62
    -0
      source/manager/ump-web/src/main/java/com/jd/blockchain/ump/web/RetrievalConfig.java
  24. +20
    -0
      source/manager/ump-web/src/main/java/com/jd/blockchain/ump/web/RetrievalConfigListener.java

+ 19
- 1
source/manager/ump-booter/src/main/java/com/jd/blockchain/ump/UmpBooter.java View File

@@ -1,8 +1,10 @@
package com.jd.blockchain.ump;

import com.jd.blockchain.ump.web.RetrievalConfigListener;
import org.springframework.boot.SpringApplication;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
@@ -16,6 +18,7 @@ public class UmpBooter {
private static final String ARG_HOST = "-h";

private static final String CONFIG = "BOOT-INF" + File.separator + "classes" + File.separator + "config.properties";
private static final String CONFIG_APPLICATION = "BOOT-INF" + File.separator + "classes" + File.separator + "application.properties";

private static final String CONFIG_PROP_HOST = "server.host";

@@ -44,7 +47,22 @@ public class UmpBooter {
String[] args = argList.toArray(new String[argList.size()]);

// 启动服务器;
SpringApplication.run(UmpConfiguration.class, args);
// SpringApplication.run(UmpConfiguration.class, args);
InputStream inputStream = UmpBooter.class.getResourceAsStream(File.separator + CONFIG_APPLICATION);
if (inputStream == null) {
System.err.println("InputStream is NULL !!!");
}
Properties props = new Properties();
try {
props.load(inputStream);
} catch (IOException e) {
e.printStackTrace();
}

// 启动服务器;
SpringApplication springApplication = new SpringApplication(UmpConfiguration.class);
springApplication.addListeners(new RetrievalConfigListener(props));
springApplication.run(args);
}

private static Server server(String[] args) {


+ 4
- 1
source/manager/ump-booter/src/main/resources/application.properties View File

@@ -2,4 +2,7 @@ server.tomcat.uri-encoding=utf-8

spring.mvc.favicon.enabled=false

logging.config=classpath:log4j2-jump.xml
logging.config=classpath:log4j2-jump.xml

retrieval.schemaUrl=http://192.168.151.39:8082
retrieval.taskUrl=http://192.168.151.39:10005

+ 4
- 1
source/manager/ump-booter/src/main/resources/config.properties View File

@@ -5,4 +5,7 @@ server.host=0.0.0.0
server.port=8080

# 本地数据库存储位置
db.url=rocksdb://#project#/jumpdb
db.url=rocksdb://#project#/jumpdb

schema.retrieval.url=http://192.168.151.39:8082
task.retrieval.url=http://192.168.151.39:10005

+ 73
- 0
source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/ApiResult.java View File

@@ -0,0 +1,73 @@
package com.jd.blockchain.ump.model;

/**
* @author zhaogw
* date 2019/7/10 15:31
*/
public class ApiResult {
/**
* 错误码,对应{@link ErrorCode},表示一种错误类型
* 如果是成功,则code为1
*/
private int code;
/**
* 具体解释
*/
private String message;
/**
* 返回的结果包装在value中,value可以是单个对象
*/
private Object value;

public ApiResult (){ }

public ApiResult (Object obj){
this.value = obj;
}

public ApiResult (int code, String message){
this.code = code;
this.message = message;
}

public ApiResult(ErrorCode errorCode){
this.code = errorCode.getCode();
this.message = errorCode.getMsg();
}

public ApiResult(ErrorCode errorCode, Object obj){
this.code = errorCode.getCode();
this.message = errorCode.getMsg();
this.value = obj;
}

public ApiResult (int code, String message, Object value){
this.code = code;
this.message = message;
this.value = value;
}

public int getCode() {
return code;
}

public void setCode(int code) {
this.code = code;
}

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}

public Object getValue() {
return value;
}

public void setValue(Object value) {
this.value = value;
}
}

+ 33
- 0
source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/ErrorCode.java View File

@@ -0,0 +1,33 @@
package com.jd.blockchain.ump.model;

/**
* @author zhaogw
* date 2019/7/10 15:32
*/
public enum ErrorCode {
SUCCESS(1,"成功"),
NO_PERMISSION(2,"权限不足"),
SERVER_ERROR(3,"服务器异常"),
AUTH_ERROR(4,"认证失败"),
PARAMS_ERROR(5,"参数错误"),
JSON_PARSE_ERROR(6,"Json解析错误"),
ILLEAGAL_STRING(7,"非法字符串"),
GEN_KEY_INPUT_LACK(8,"缺少必要的输入参数:name/randomSeed/basePath/password"),
UNKNOW_ERROR(10000,"未知错误");

private int code;
private String msg;

ErrorCode(int code,String msg){
this.code = code;
this.msg = msg;
}

public int getCode() {
return code;
}

public String getMsg() {
return msg;
}
}

+ 13
- 0
source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/UmpConstant.java View File

@@ -101,4 +101,17 @@ public class UmpConstant {
public static final String PATH_LOCAL_CONFIG = PATH_CONFIG_INIT + File.separator + "local.conf";

public static final String PATH_LEDGER_INIT_CONFIG = PATH_CONFIG_INIT + File.separator + "ledger.init";

public static final String PEER_HOST_IP = "peerHostIp";
public static final String INIT_PORT = "iPort";
public static final String CONSENSUS_PORT = "cPort";
public static final String DELIMETER_QUESTION = "?"; //逗号分隔符;
public static final String LEDGER_LIST = "ledger_list"; //the key that save all the ledger hash in the rocksdb;
public static final int MEMORY_MAP_MAX_COUNT=10000;
public static final int MEMORY_MAP_REMOVE_COUNT=50;
public static final String ALL_LEDGER="all_ledger";
public static final String DELIMETER_MINUS = "-";
public static final String SCHEMA_PREFIX = "schema_";
public static final String SCHEMA_RETRIEVAL_URL = "retrieval.schemaUrl";
public static final String TASK_RETRIEVAL_URL = "retrieval.taskUrl";
}

+ 47
- 0
source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/penetrate/DataAccountSchema.java View File

@@ -0,0 +1,47 @@
package com.jd.blockchain.ump.model.penetrate;

import java.util.List;

/**
* 数据账户信息
* @author zhaogw
* date 2019/7/26 14:49
*/
public class DataAccountSchema {
private String ledgerHash;
private String dataAccount;
private String memo;
private List<FieldSchema> fieldSchemaList;

public String getLedgerHash() {
return ledgerHash;
}

public void setLedgerHash(String ledgerHash) {
this.ledgerHash = ledgerHash;
}

public String getDataAccount() {
return dataAccount;
}

public void setDataAccount(String dataAccount) {
this.dataAccount = dataAccount;
}

public String getMemo() {
return memo;
}

public void setMemo(String memo) {
this.memo = memo;
}

public List<FieldSchema> getFieldSchemaList() {
return fieldSchemaList;
}

public void setFieldSchemaList(List<FieldSchema> fieldSchemaList) {
this.fieldSchemaList = fieldSchemaList;
}
}

+ 46
- 0
source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/penetrate/FieldSchema.java View File

@@ -0,0 +1,46 @@
package com.jd.blockchain.ump.model.penetrate;

/**
* ump中记录的字段信息;
* @author zhaogw
* date 2019/7/26 14:50
*/
public class FieldSchema {
private String code;
private String fieldType;
private boolean isPrimary;
//备注;
private String memo;

public String getCode() {
return code;
}

public void setCode(String code) {
this.code = code;
}

public String getFieldType() {
return fieldType;
}

public void setFieldType(String fieldType) {
this.fieldType = fieldType;
}

public boolean isPrimary() {
return isPrimary;
}

public void setPrimary(boolean primary) {
isPrimary = primary;
}

public String getMemo() {
return memo;
}

public void setMemo(String memo) {
this.memo = memo;
}
}

+ 79
- 0
source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/penetrate/LeaderDomain.java View File

@@ -0,0 +1,79 @@
package com.jd.blockchain.ump.model.penetrate;

import com.alibaba.fastjson.annotation.JSONField;

import java.util.List;

/**
* mediator's domain;
* @author zhaogw
* date 2019/7/2 18:02
*/
public class LeaderDomain {

@JSONField(name="host")
private String host;

@JSONField(name="port")
private String port;

@JSONField(name="createTime")
private String createTime;

@JSONField(name="ledgerSeed")
private String ledgerSeed;

@JSONField(name="peerDomainList")
private List<PeerDomain> peerDomainList;

@JSONField(name="ledgerHash")
private String ledgerHash;

public List<PeerDomain> getPeerDomainList() {
return peerDomainList;
}

public void setPeerDomainList(List<PeerDomain> peerDomainList) {
this.peerDomainList = peerDomainList;
}

public String getCreateTime() {
return createTime;
}

public void setCreateTime(String createTime) {
this.createTime = createTime;
}

public String getLedgerSeed() {
return ledgerSeed;
}

public void setLedgerSeed(String ledgerSeed) {
this.ledgerSeed = ledgerSeed;
}

public String getHost() {
return host;
}

public void setHost(String host) {
this.host = host;
}

public String getPort() {
return port;
}

public void setPort(String port) {
this.port = port;
}

public String getLedgerHash() {
return ledgerHash;
}

public void setLedgerHash(String ledgerHash) {
this.ledgerHash = ledgerHash;
}
}

+ 177
- 0
source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/penetrate/PeerDomain.java View File

@@ -0,0 +1,177 @@
package com.jd.blockchain.ump.model.penetrate;

import com.alibaba.fastjson.annotation.JSONField;

/**
* @author zhaogw
* date 2019/7/2 10:10
*/
public class PeerDomain {
@JSONField(name="peerId")
private int peerId;

private String basePath;

@JSONField(name="peerName")
private String peerName;

@JSONField(name="host")
private String host;

private String serverPort;

@JSONField(name="initPort")
private String initPort;

@JSONField(name="consensusPort")
private String consensusPort;

@JSONField(name="visitPort")
private String visitPort;

@JSONField(name="mediatorUrl")
private String mediatorUrl;

private String dbUri;

private boolean gatewayBindPeer;

//the random String from front input by mouse device;
private String randomSeed;

@JSONField(name="peerPubKey")
private String peerPubKey;

private String peerPrivKey;

private String peerRawPasswd;
private String peerPasswd;

public int getPeerId() {
return peerId;
}

public void setPeerId(int peerId) {
this.peerId = peerId;
}

public String getBasePath() {
return basePath;
}

public void setBasePath(String basePath) {
this.basePath = basePath;
}

public String getPeerName() {
return peerName;
}

public void setPeerName(String peerName) {
this.peerName = peerName;
}

public String getHost() {
return host;
}

public void setHost(String host) {
this.host = host;
}

public String getServerPort() {
return serverPort;
}

public void setServerPort(String serverPort) {
this.serverPort = serverPort;
}

public String getInitPort() {
return initPort;
}

public void setInitPort(String initPort) {
this.initPort = initPort;
}

public String getConsensusPort() {
return consensusPort;
}

public void setConsensusPort(String consensusPort) {
this.consensusPort = consensusPort;
}

public String getVisitPort() {
return visitPort;
}

public void setVisitPort(String visitPort) {
this.visitPort = visitPort;
}

public String getMediatorUrl() {
return mediatorUrl;
}

public void setMediatorUrl(String mediatorUrl) {
this.mediatorUrl = mediatorUrl;
}

public String getDbUri() {
return dbUri;
}

public void setDbUri(String dbUri) {
this.dbUri = dbUri;
}

public boolean isGatewayBindPeer() {
return gatewayBindPeer;
}

public void setGatewayBindPeer(boolean gatewayBindPeer) {
this.gatewayBindPeer = gatewayBindPeer;
}

public String getRandomSeed() {
return randomSeed;
}

public void setRandomSeed(String randomSeed) {
this.randomSeed = randomSeed;
}

public String getPeerPubKey() {
return peerPubKey;
}

public void setPeerPubKey(String peerPubKey) {
this.peerPubKey = peerPubKey;
}

public String getPeerPrivKey() {
return peerPrivKey;
}

public void setPeerPrivKey(String peerPrivKey) {
this.peerPrivKey = peerPrivKey;
}

public String getPeerRawPasswd() {
return peerRawPasswd;
}

public void setPeerRawPasswd(String peerRawPasswd) {
this.peerRawPasswd = peerRawPasswd;
}

public String getPeerPasswd() {
return peerPasswd;
}

public void setPeerPasswd(String peerPasswd) {
this.peerPasswd = peerPasswd;
}
}

+ 90
- 0
source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/penetrate/SchemaDomain.java View File

@@ -0,0 +1,90 @@
package com.jd.blockchain.ump.model.penetrate;

import com.alibaba.fastjson.annotation.JSONField;
import com.jd.blockchain.ump.model.UmpConstant;
import org.springframework.util.CollectionUtils;

import java.util.List;

/**
* @author zhaogw
* date 2019/7/19 11:33
*/
public class SchemaDomain {

@JSONField(serialize = false)
private String schemaId;

@JSONField(serialize = false)
private String schemaAllId;

@JSONField(name="ledger")
private String ledgerHash;

@JSONField(name="associate_account")
private String dataAccount;

@JSONField(serialize = false)
private List<FieldSchema> fieldSchemaList;

private String content;

public String getSchemaId() {
return schemaId;
}

public void setSchemaId(String schemaId) {
this.schemaId = schemaId;
}

public String getLedgerHash() {
return ledgerHash;
}

public void setLedgerHash(String ledgerHash) {
this.ledgerHash = ledgerHash;
}

public String getDataAccount() {
return dataAccount;
}

public void setDataAccount(String dataAccount) {
this.dataAccount = dataAccount;
}

public String getContent() {
if(CollectionUtils.isEmpty(fieldSchemaList)){
throw new IllegalStateException("content is empty! you must choose the field first!");
}
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("type "+this.schemaId).append("{").append(" ");
for(FieldSchema fieldSchema : fieldSchemaList){
if(fieldSchema.isPrimary()){
stringBuffer.append(fieldSchema.getCode()+"(isPrimaryKey: Boolean = true):"+fieldSchema.getFieldType()).append(" ");
}else {
stringBuffer.append(fieldSchema.getCode()+":"+fieldSchema.getFieldType()).append(" ");
}
}
stringBuffer.append("}");
return stringBuffer.toString();
}

public void setContent(String content) {
this.content = content;
}

public List<FieldSchema> getFieldSchemaList() {
return fieldSchemaList;
}

public void setFieldSchemaList(List<FieldSchema> fieldSchemaList) {
this.fieldSchemaList = fieldSchemaList;
}

public String getSchemaAllId() {
this.schemaAllId = schemaId+ UmpConstant.DELIMETER_MINUS+ledgerHash.substring(0,6)+
UmpConstant.DELIMETER_MINUS+ dataAccount.substring(0,6);
return schemaAllId;
}
}

+ 70
- 0
source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/penetrate/store/MemQueue.java View File

@@ -0,0 +1,70 @@
package com.jd.blockchain.ump.model.penetrate.store;

import com.jd.blockchain.ump.model.UmpConstant;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

/**
* 通过枚举的方式来实现内存队列;避免大并发时引起的不必要的多次实例化;
*
* @author zhaoguangwei
*
*/
public enum MemQueue {
instance;
private BlockingQueue<String> queue = null;

private MemQueue() {
queue = new LinkedBlockingQueue<String>();
}

/**
* 记录放入内存队列;
* @param key
* @return
*/
public boolean put(String key) {
boolean rtn = false;
try {
while (queue.size() >= UmpConstant.MEMORY_MAP_MAX_COUNT) {
queue.remove();
}
queue.add(key);
rtn = true;
} catch (Exception e) {
e.printStackTrace();
}
return rtn;
}

/**
* 从内存队列取出一条记录;
*
* @return
*/
public String get() {
String record = null;
try {
record = queue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
return record;
}

/**
* 内存队列清除;
*/
public void clear() {
queue.clear();
}

/**
* 获得记录数;
*
* @return
*/
public int size() {
return queue.size();
}
}

+ 49
- 0
source/manager/ump-model/src/main/java/com/jd/blockchain/ump/model/penetrate/store/MemStore.java View File

@@ -0,0 +1,49 @@
package com.jd.blockchain.ump.model.penetrate.store;

import com.jd.blockchain.ump.model.UmpConstant;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import static com.jd.blockchain.ump.model.UmpConstant.MEMORY_MAP_MAX_COUNT;
import static com.jd.blockchain.ump.model.UmpConstant.MEMORY_MAP_REMOVE_COUNT;

/**
* @author zhaogw
* date 2019/7/17 17:10
*/
public enum MemStore {
instance;

private Map<String,Object> records = null;

MemStore(){
records = new ConcurrentHashMap();
}

public Object get(String key){
return records.get(key);
}

public Object remove(String key){
return records.remove(key);
}

public boolean put(String key, Object obj){
boolean rtn = false;
MemQueue.instance.put(key);
if(records.size()>MEMORY_MAP_MAX_COUNT){
//clear 50 records;
for(int i=0; i< MEMORY_MAP_REMOVE_COUNT; i++){
String _key = MemQueue.instance.get();
if(_key.equals(UmpConstant.ALL_LEDGER)){
//don't remove the all_ledger;
continue;
}
records.remove(_key);
}
}
records.put(key,obj);
return true;
}
}

+ 26
- 0
source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/DataAccountUmpService.java View File

@@ -0,0 +1,26 @@
/**
* Copyright: Copyright 2016-2020 JD.COM All Right Reserved
* FileName: com.jd.blockchain.gateway.service.DataRetrievalService
* Author: shaozhuguang
* Department: 区块链研发部
* Date: 2019/1/15 下午3:08
* Description:
*/
package com.jd.blockchain.ump.service;

import com.jd.blockchain.ump.model.penetrate.DataAccountSchema;

/**
* data account ump store;
*/
public interface DataAccountUmpService {
/**
* 整体新增dataAccountSchema,单独某个field不会更新;如果原先库中有记录,则更新为最新内容;
* @param dataAccountSchema
*/
boolean addDataAccountSchema(DataAccountSchema dataAccountSchema);

DataAccountSchema deleteDataAcccountSchema(String ledgerHash, String dataAccount);

DataAccountSchema findDataAccountSchema(String ledgerHash, String dataAccount);
}

+ 31
- 0
source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/DataAccountUmpServiceImpl.java View File

@@ -0,0 +1,31 @@
package com.jd.blockchain.ump.service;

import com.jd.blockchain.ump.model.penetrate.DataAccountSchema;
import com.jd.blockchain.ump.model.penetrate.store.MemStore;
import org.springframework.stereotype.Service;

import static com.jd.blockchain.ump.model.UmpConstant.SCHEMA_PREFIX;
import static com.jd.blockchain.utils.BaseConstant.DELIMETER_UNDERLINE;

/**
* @author zhaogw
* date 2019/7/26 15:14
*/
@Service
public class DataAccountUmpServiceImpl implements DataAccountUmpService {
@Override
public boolean addDataAccountSchema(DataAccountSchema dataAccountSchema) {
return MemStore.instance.put(SCHEMA_PREFIX+dataAccountSchema.getLedgerHash()+
DELIMETER_UNDERLINE+dataAccountSchema.getDataAccount(),dataAccountSchema);
}

@Override
public DataAccountSchema deleteDataAcccountSchema(String ledgerHash, String dataAccount) {
return (DataAccountSchema)MemStore.instance.remove(SCHEMA_PREFIX+ledgerHash+ DELIMETER_UNDERLINE+dataAccount);
}

@Override
public DataAccountSchema findDataAccountSchema(String ledgerHash, String dataAccount) {
return (DataAccountSchema)MemStore.instance.get(SCHEMA_PREFIX+ledgerHash+ DELIMETER_UNDERLINE+dataAccount);
}
}

+ 28
- 0
source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/DataRetrievalService.java View File

@@ -0,0 +1,28 @@
/**
* Copyright: Copyright 2016-2020 JD.COM All Right Reserved
* FileName: com.jd.blockchain.gateway.service.DataRetrievalService
* Author: shaozhuguang
* Department: 区块链研发部
* Date: 2019/1/15 下午3:08
* Description:
*/
package com.jd.blockchain.ump.service;

import com.alibaba.fastjson.JSONObject;

import java.util.Map;

/**
*
* @author shaozhuguang
* @create 2019/1/15
* @since 1.0.0
*/

public interface DataRetrievalService {

String retrieval(String url) throws Exception;
String retrievalPost(String url, JSONObject jsonObject) throws Exception;
String retrievalPost(String url, String queryString) throws Exception;
String delete(String url) throws Exception;
}

+ 45
- 0
source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/DataRetrievalServiceHandler.java View File

@@ -0,0 +1,45 @@
/**
* Copyright: Copyright 2016-2020 JD.COM All Right Reserved
* FileName: com.jd.blockchain.gateway.service.DeepQueryServiceImpl
* Author: shaozhuguang
* Department: 区块链研发部
* Date: 2019/1/15 下午3:09
* Description:
*/
package com.jd.blockchain.ump.service;

import com.alibaba.fastjson.JSONObject;
import com.jd.blockchain.ump.util.HttpClientPool;
import org.springframework.stereotype.Component;

import java.util.Map;

/**
*
* @author shaozhuguang
* @create 2019/1/15
* @since 1.0.0
*/
@Component
public class DataRetrievalServiceHandler implements DataRetrievalService {

@Override
public String retrieval(String url) throws Exception {
return HttpClientPool.get(url);
}

@Override
public String retrievalPost(String url, JSONObject jsonObject) throws Exception {
return HttpClientPool.jsonPost(url,jsonObject.toJSONString());
}

@Override
public String delete(String url) throws Exception {
return HttpClientPool.delete(url);
}

@Override
public String retrievalPost(String url, String queryString) throws Exception {
return HttpClientPool.jsonPost(url,queryString);
}
}

+ 51
- 0
source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UmpStoreService.java View File

@@ -0,0 +1,51 @@
/**
* Copyright: Copyright 2016-2020 JD.COM All Right Reserved
* FileName: com.jd.blockchain.gateway.service.DataRetrievalService
* Author: shaozhuguang
* Department: 区块链研发部
* Date: 2019/1/15 下午3:08
* Description:
*/
package com.jd.blockchain.ump.service;

import com.jd.blockchain.ump.model.penetrate.LeaderDomain;

import java.util.List;

/**
* data store;
*/
public interface UmpStoreService {
/**
* get ledger info by ledgerHash;
* @param ledgerHash
* @return
*/
LeaderDomain findLedgerInfo(String ledgerHash);

/**
* get all ledgers;
* @return
*/
List <LeaderDomain> findAllLedgers();

/**
* get all states by seed;
* @param seed
* @return
*/
List<String> findStates(String seed);

/**
* get value by key;
* @param key
* @return
*/
Object findRecord(String key);

void saveLedgerInfo(LeaderDomain leaderDomain);

void saveRecord(String key, Object obj);

void saveState4Seed(String key, String state);
}

+ 76
- 0
source/manager/ump-service/src/main/java/com/jd/blockchain/ump/service/UmpStoreServiceImpl.java View File

@@ -0,0 +1,76 @@
/**
* Copyright: Copyright 2016-2020 JD.COM All Right Reserved
* FileName: com.jd.blockchain.gateway.service.DataRetrievalService
* Author: shaozhuguang
* Department: 区块链研发部
* Date: 2019/1/15 下午3:08
* Description:
*/
package com.jd.blockchain.ump.service;

import com.jd.blockchain.ump.model.UmpConstant;
import com.jd.blockchain.ump.model.penetrate.LeaderDomain;
import com.jd.blockchain.ump.model.penetrate.store.MemStore;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
* data store;
*/
@Service
public class UmpStoreServiceImpl implements UmpStoreService{
@Override
public LeaderDomain findLedgerInfo(String ledgerHash) {
return (LeaderDomain) MemStore.instance.get(ledgerHash);
}

@Override
public List<LeaderDomain> findAllLedgers() {
return (List<LeaderDomain>)MemStore.instance.get(UmpConstant.ALL_LEDGER);
}

@Override
public List<String> findStates(String seed) {
return (List<String>)MemStore.instance.get(seed);
}

@Override
public Object findRecord(String key) {
return MemStore.instance.get(key);
}

@Override
public void saveLedgerInfo(LeaderDomain leaderDomain) {
MemStore.instance.put(leaderDomain.getLedgerHash(),leaderDomain);
//also put it into ALL_LEDGER;
Object obj = MemStore.instance.get(UmpConstant.ALL_LEDGER);
List<LeaderDomain> leaderDomains = null;
if(obj == null){
leaderDomains = new ArrayList<>();
}else {
leaderDomains = (List<LeaderDomain>)obj;
}
leaderDomains.add(leaderDomain);
MemStore.instance.put(UmpConstant.ALL_LEDGER,leaderDomains);
}

@Override
public void saveRecord(String key, Object obj) {
MemStore.instance.put(key,obj);
}

@Override
public void saveState4Seed(String key, String state) {
Object obj = MemStore.instance.get(key);
List<String> states = null;
if(obj == null){
states = new ArrayList<>();
}else {
states = (List<String>)obj;
}
states.add(state);
MemStore.instance.put(key,states);
}
}

+ 21
- 7
source/manager/ump-service/src/main/java/com/jd/blockchain/ump/util/HttpClientPool.java View File

@@ -8,14 +8,13 @@
*/
package com.jd.blockchain.ump.util;

import com.alibaba.fastjson.JSONObject;
import org.apache.http.*;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.methods.*;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
@@ -29,14 +28,14 @@ import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import javax.net.ssl.SSLException;
import javax.net.ssl.SSLHandshakeException;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.io.UnsupportedEncodingException;
import java.io.*;
import java.net.UnknownHostException;
import java.nio.charset.Charset;
import java.util.ArrayList;
@@ -286,4 +285,19 @@ public class HttpClientPool {
EntityUtils.consume(entity);
return result;
}

public static String delete(String url) throws IOException {
HttpDelete httpDelete = new HttpDelete(url);
config(httpDelete);
try (CloseableHttpResponse response = httpDelete(url, httpDelete)) {
return parseResponse(response);
}
}

private static CloseableHttpResponse httpDelete(String url, HttpDelete httpDelete) throws IOException {
return getHttpClient(url)
.execute(httpDelete, HttpClientContext.create());
}


}

+ 270
- 0
source/manager/ump-web/src/main/java/com/jd/blockchain/ump/controller/RetrievalController.java View File

@@ -0,0 +1,270 @@
package com.jd.blockchain.ump.controller;

import com.alibaba.fastjson.JSONObject;
import com.jd.blockchain.ump.model.ApiResult;
import com.jd.blockchain.ump.model.ErrorCode;
import com.jd.blockchain.ump.model.UmpConstant;
import com.jd.blockchain.ump.model.penetrate.DataAccountSchema;
import com.jd.blockchain.ump.model.penetrate.SchemaDomain;
import com.jd.blockchain.ump.service.DataAccountUmpService;
import com.jd.blockchain.ump.service.DataRetrievalService;
import com.jd.blockchain.ump.web.RetrievalConfig;
import com.jd.blockchain.utils.ConsoleUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

/**
* @Author zhaogw
* date 2019/07/18 17:01
*/
@RestController
@RequestMapping(path = "/schema")
public class RetrievalController {
private static final Log log = LogFactory.getLog(RetrievalController.class);

@Autowired
private DataRetrievalService dataRetrievalService;

@Autowired
private DataAccountUmpService dataAccountUmpService;


/**
* add schema by web;
* @param request
* @return
*/
@RequestMapping(method = RequestMethod.POST, value = "")
public Object addSchema4Web(HttpServletRequest request, @RequestBody SchemaDomain schemaDomain) {
String result;
if (RetrievalConfig.getSchemaUrl() == null || RetrievalConfig.getSchemaUrl().length() <= 0) {
result = "{'message':'OK','data':'" + "schema.retrieval.url is empty" + "'}";
} else {
String queryParams = request.getQueryString() == null ? "": request.getQueryString();
String fullQueryUrl = new StringBuffer(RetrievalConfig.getSchemaUrl())
.append(request.getRequestURI())
.append(UmpConstant.DELIMETER_QUESTION)
.append(queryParams)
.toString();
try {

result = dataRetrievalService.retrievalPost(fullQueryUrl,JSONObject.toJSONString(schemaDomain));
ConsoleUtils.info("request = {%s} \r\n result = {%s} \r\n", fullQueryUrl, result);
} catch (Exception e) {
result = "{'message':'error','data':'" + e.getMessage() + "'}";
}
}
return JSONObject.parse(result);
}

/**
* add schema;
* @param request
* @return
*/
// @RequestMapping(method = RequestMethod.POST, value = "")
@Deprecated
public Object addSchema(HttpServletRequest request,@RequestBody JSONObject jsonObject) {
String result;
if (RetrievalConfig.getSchemaUrl() == null || RetrievalConfig.getSchemaUrl().length() <= 0) {
result = "{'message':'OK','data':'" + "schema.retrieval.url is empty" + "'}";
} else {
String queryParams = request.getQueryString() == null ? "": request.getQueryString();
String fullQueryUrl = new StringBuffer(RetrievalConfig.getSchemaUrl())
.append(request.getRequestURI())
.append(UmpConstant.DELIMETER_QUESTION)
.append(queryParams)
.toString();
try {
result = dataRetrievalService.retrievalPost(fullQueryUrl,jsonObject);
ConsoleUtils.info("request = {%s} \r\n result = {%s} \r\n", fullQueryUrl, result);
} catch (Exception e) {
result = "{'message':'error','data':'" + e.getMessage() + "'}";
}
}
return JSONObject.parse(result);
}

/**
* list schema;
* @param request
* @return
*/
@RequestMapping(method = RequestMethod.GET, value = "/list")
public Object listSchema(HttpServletRequest request) {
String result;
if (RetrievalConfig.getSchemaUrl() == null || RetrievalConfig.getSchemaUrl().length() <= 0) {
result = "{'message':'OK','data':'" + "schema.retrieval.url is empty" + "'}";
} else {
String queryParams = request.getQueryString() == null ? "": request.getQueryString();
String fullQueryUrl = new StringBuffer(RetrievalConfig.getSchemaUrl())
.append(request.getRequestURI())
.append(UmpConstant.DELIMETER_QUESTION)
.append(queryParams)
.toString();
try {
result = dataRetrievalService.retrieval(fullQueryUrl);
ConsoleUtils.info("request = {%s} \r\n result = {%s} \r\n", fullQueryUrl, result);
} catch (Exception e) {
result = "{'message':'error','data':'" + e.getMessage() + "'}";
}
}
return JSONObject.parse(result);
}

/**
* delete schema;
* @param request
* @return
*/
@RequestMapping(method = RequestMethod.DELETE, value = "/{schemaId}")
public Object deleteSchema(HttpServletRequest request) {
String result;
if (RetrievalConfig.getSchemaUrl() == null || RetrievalConfig.getSchemaUrl().length() <= 0) {
result = "{'message':'OK','data':'" + "schema.retrieval.url is empty" + "'}";
} else {
String queryParams = request.getQueryString() == null ? "": request.getQueryString();
String fullQueryUrl = new StringBuffer(RetrievalConfig.getSchemaUrl())
.append(request.getRequestURI())
.append(UmpConstant.DELIMETER_QUESTION)
.append(queryParams)
.toString();
try {
result = dataRetrievalService.delete(fullQueryUrl);
ConsoleUtils.info("request = {%s} \r\n result = {%s} \r\n", fullQueryUrl, result);
} catch (Exception e) {
result = "{'message':'error','data':'" + e.getMessage() + "'}";
}
}
return JSONObject.parse(result);
}

/**
* start schema;
* @param request
* @return
*/
@RequestMapping(method = RequestMethod.GET, value = "/start/{schemaId}")
public Object startSchema(HttpServletRequest request) {
String result;
if (RetrievalConfig.getSchemaUrl()==null || RetrievalConfig.getSchemaUrl().length() <= 0) {
result = "{'message':'OK','data':'" + "schema.retrieval.url is empty" + "'}";
} else {
String queryParams = request.getQueryString() == null ? "": request.getQueryString();
String fullQueryUrl = new StringBuffer(RetrievalConfig.getSchemaUrl())
.append(request.getRequestURI())
.append(UmpConstant.DELIMETER_QUESTION)
.append(queryParams)
.toString();
try {
result = dataRetrievalService.retrieval(fullQueryUrl);
ConsoleUtils.info("request = {%s} \r\n result = {%s} \r\n", fullQueryUrl, result);
} catch (Exception e) {
result = "{'message':'error','data':'" + e.getMessage() + "'}";
}
}
return JSONObject.parse(result);
}

/**
* stop schema;
* @param request
* @return
*/
@RequestMapping(method = RequestMethod.GET, value = "/stop/{schemaId}")
public Object stopSchema(HttpServletRequest request) {
String result;
if (RetrievalConfig.getSchemaUrl() == null || RetrievalConfig.getSchemaUrl().length() <= 0) {
result = "{'message':'OK','data':'" + "schema.retrieval.url is empty" + "'}";
} else {
String queryParams = request.getQueryString() == null ? "": request.getQueryString();
String fullQueryUrl = new StringBuffer(RetrievalConfig.getSchemaUrl())
.append(request.getRequestURI())
.append(UmpConstant.DELIMETER_QUESTION)
.append(queryParams)
.toString();
try {
result = dataRetrievalService.retrieval(fullQueryUrl);
ConsoleUtils.info("request = {%s} \r\n result = {%s} \r\n", fullQueryUrl, result);
} catch (Exception e) {
result = "{'message':'error','data':'" + e.getMessage() + "'}";
}
}
return JSONObject.parse(result);
}

/**
* querysql;
* @param request
* @return
*/
@RequestMapping(method = RequestMethod.POST, value = "/querysql")
public Object queryBySql(HttpServletRequest request,@RequestBody String queryString) {
String result;
if (RetrievalConfig.getSchemaUrl() == null || RetrievalConfig.getSchemaUrl().length() <= 0) {
result = "{'message':'OK','data':'" + "schema.retrieval.url is empty" + "'}";
} else {
String queryParams = request.getQueryString() == null ? "": request.getQueryString();
String fullQueryUrl = new StringBuffer(RetrievalConfig.getSchemaUrl())
.append(request.getRequestURI())
.append(UmpConstant.DELIMETER_QUESTION)
.append(queryParams)
.toString();
try {
result = dataRetrievalService.retrievalPost(fullQueryUrl,queryString);
ConsoleUtils.info("request = {%s} \r\n result = {%s} \r\n", fullQueryUrl, result);
} catch (Exception e) {
result = "{'message':'error','data':'" + e.getMessage() + "'}";
}
}
return JSONObject.parse(result);
}

/**
* add dataAccountSchema;
* @return
*/
@RequestMapping(method = RequestMethod.POST, value = "/addDataAccountSchema")
public ApiResult addDataAccountSchema( @RequestBody DataAccountSchema dataAccountSchema) {
try {
dataAccountUmpService.addDataAccountSchema(dataAccountSchema);
return new ApiResult(ErrorCode.SUCCESS);
} catch (Exception e) {
return new ApiResult(ErrorCode.SERVER_ERROR,e.getMessage());
}
}

/**
* delete dataAccountSchema;
* @return
*/
@RequestMapping(method = RequestMethod.GET, value = "/delDataAccountSchema/ledger/{ledgerHash}/account/{dataAccount}")
public ApiResult deleteDataAccountSchema(@PathVariable(name = "ledgerHash") String ledgerHash,
@PathVariable(name = "dataAccount") String dataAccount) {
try {
DataAccountSchema dataAccountSchema = dataAccountUmpService.deleteDataAcccountSchema(ledgerHash, dataAccount);
return new ApiResult(ErrorCode.SUCCESS,dataAccountSchema);
} catch (Exception e) {
return new ApiResult(ErrorCode.SERVER_ERROR,e.getMessage());
}
}

/**
* find dataAccountSchema;
* @return
*/
@RequestMapping(method = RequestMethod.GET, value = "/findDataAccountSchema/ledger/{ledgerHash}/account/{dataAccount}")
public ApiResult findDataAccountSchema(@PathVariable(name = "ledgerHash") String ledgerHash,
@PathVariable(name = "dataAccount") String dataAccount) {
try {
DataAccountSchema dataAccountSchema = dataAccountUmpService.findDataAccountSchema(ledgerHash, dataAccount);
return new ApiResult(ErrorCode.SUCCESS,dataAccountSchema);
} catch (Exception e) {
return new ApiResult(ErrorCode.SERVER_ERROR,e.getMessage());
}
}
}

+ 59
- 0
source/manager/ump-web/src/main/java/com/jd/blockchain/ump/controller/TaskRetrievalController.java View File

@@ -0,0 +1,59 @@
package com.jd.blockchain.ump.controller;

import com.alibaba.fastjson.JSONObject;
import com.jd.blockchain.ump.model.UmpConstant;
import com.jd.blockchain.ump.service.DataRetrievalService;
import com.jd.blockchain.ump.web.RetrievalConfig;
import com.jd.blockchain.utils.ConsoleUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

/**
* @Author zhaogw
* date 2019/07/18 17:01
*/
@RestController
@RequestMapping(path = "/tasks")
public class TaskRetrievalController {
private static final Log log = LogFactory.getLog(TaskRetrievalController.class);

// @Value("${task.retrieval.url}")
// private String taskRetrievalUrl;

@Autowired
private DataRetrievalService dataRetrievalService;

/**
* get the nums of all tasks;
* @param request
* @return
*/
@RequestMapping(method = RequestMethod.GET, value = "")
public Object listSchema(HttpServletRequest request) {
String result;
if (RetrievalConfig.getTaskUrl() == null || RetrievalConfig.getTaskUrl().length() <= 0) {
result = "{'message':'OK','data':'" + "schema.retrieval.url is empty" + "'}";
} else {
String queryParams = request.getQueryString() == null ? "": request.getQueryString();
String fullQueryUrl = new StringBuffer(RetrievalConfig.getTaskUrl())
.append(request.getRequestURI())
.append(UmpConstant.DELIMETER_QUESTION)
.append(queryParams)
.toString();
try {
result = dataRetrievalService.retrieval(fullQueryUrl);
ConsoleUtils.info("request = {%s} \r\n result = {%s} \r\n", fullQueryUrl, result);
} catch (Exception e) {
result = "{'message':'error','data':'" + e.getMessage() + "'}";
}
}
return JSONObject.parse(result);
}

}

+ 62
- 0
source/manager/ump-web/src/main/java/com/jd/blockchain/ump/web/RetrievalConfig.java View File

@@ -0,0 +1,62 @@
package com.jd.blockchain.ump.web;

import org.springframework.beans.BeansException;
import org.springframework.core.io.support.PropertiesLoaderUtils;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import static com.jd.blockchain.ump.model.UmpConstant.SCHEMA_RETRIEVAL_URL;
import static com.jd.blockchain.ump.model.UmpConstant.TASK_RETRIEVAL_URL;

public class RetrievalConfig {

private static Map<String,String> propertiesMap = new HashMap<>();

private String schemaUrl;
private String taskUrl;

public static void processProperties(Properties props) throws BeansException {
propertiesMap = new HashMap<String, String>();
for (Object key : props.keySet()) {
String keyStr = key.toString();
try {
// PropertiesLoaderUtils的默认编码是ISO-8859-1,在这里转码一下
propertiesMap.put(keyStr, new String(props.getProperty(keyStr).getBytes("ISO-8859-1"), "utf-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (java.lang.Exception e) {
e.printStackTrace();
}
}
}

public static void loadAllProperties(String propertyFileName) {
try {
Properties properties = PropertiesLoaderUtils.loadAllProperties(propertyFileName);
processProperties(properties);
} catch (IOException e) {
e.printStackTrace();
}
}

public static String getProperty(String name) {
return propertiesMap.get(name).toString();
}

public static Map<String, String> getAllProperty() {
return propertiesMap;
}

public static String getSchemaUrl() {
return propertiesMap.get(SCHEMA_RETRIEVAL_URL);
}

public static String getTaskUrl() {
return propertiesMap.get(TASK_RETRIEVAL_URL);
}

}

+ 20
- 0
source/manager/ump-web/src/main/java/com/jd/blockchain/ump/web/RetrievalConfigListener.java View File

@@ -0,0 +1,20 @@
package com.jd.blockchain.ump.web;


import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;

import java.util.Properties;

public class RetrievalConfigListener implements ApplicationListener<ContextRefreshedEvent> {
private Properties props;

public RetrievalConfigListener(Properties props){
this.props = props;
}

@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
RetrievalConfig.processProperties(props);
}
}

Loading…
Cancel
Save