Compare commits

..

11 Commits

Author SHA1 Message Date
CaiHQ
1785426e53 merge update 2024-05-23 20:13:33 +08:00
Frank.R.Wu
dffcadd116
build: fixes a bug in build.gradle 2023-12-25 15:41:17 +08:00
CaiHQ
d4e76259db update file handler 2023-12-15 16:50:18 +08:00
Frank.R.Wu
6dfe551a1d build: config spotless plugin and reformat code 2023-06-15 11:08:02 +08:00
CaiHQ
912ecc21fc add public support 2023-04-24 18:58:17 +08:00
CaiHQ
27e47f4142 update cmdconf 2023-03-30 23:56:13 +08:00
CaiHQ
4122cc0128 optimize http result callback 2022-09-02 21:24:29 +08:00
CaiHQ
e7f7b80152 front: support startMulitipoint with args
fix: ContractClient missing arguments error
update: @Router arguments format
fix: ContractStatusRecorder null exception
2022-06-26 17:54:30 +08:00
CaiHQ
19a033c699 feat: support createParam
feat: docker script
2022-04-21 10:18:48 +08:00
CaiHQ
87ddb79d83 support ledgerparams
add startContract at cmconfig.json
add docker scripts
2022-03-22 23:52:02 +08:00
汪旭鑫
a99c4e9af4 refactor: sdk for consensus algorithm 2022-02-15 14:44:16 +08:00
35 changed files with 832 additions and 645 deletions

View File

@ -1,7 +1,10 @@
plugins {
id 'java'
id 'java-library'
id 'maven-publish'
id 'signing'
}
apply from: '../spotless.gradle'
sourceSets {
main {
@ -23,8 +26,87 @@ sourceSets {
}
dependencies {
api project (":common")
api 'io.netty:netty-tcnative-boringssl-static:2.0.46.Final'
api 'io.netty:netty-tcnative-boringssl-static:2.0.59.Final'
api 'com.google.code.gson:gson:2.8.8'
testImplementation 'junit:junit:4.13.2'
}
version = "1.0.1"
task classJar(type: Jar, dependsOn: classes) {
classifier = "jar"
}
task sourceJar(type: Jar, dependsOn: classes) {
archiveClassifier = "sources"
classifier = "sources"
from sourceSets.main.allSource
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
tasks.withType(Javadoc) {
options.addStringOption('Xdoclint:none', '-quiet')
}
task javadocJar(type: Jar, dependsOn: javadoc) {
archiveClassifier = 'javadoc'
classifier = "javadoc"
exclude {
details -> details.file.getAbsolutePath().contains("/gm/")
}
from javadoc.destinationDir
}
publishing {
publications {
mavenJava(MavenPublication) {
groupId project.group
artifactId "front-base"
version "${version}"
from components.java
artifact sourceJar
artifact javadocJar
artifact classJar
pom {
name = "bdware-front-base"
description = "front-base"
url = "https://gitee.com/BDWare/front-base"
licenses {
license {
name = "Mulan PSL v2"
url = "http://license.coscl.org.cn/MulanPSL2"
}
}
developers {
developer {
id = "dataware"
email = "caihq@pku.edu.cn"
}
}
scm {
connection = "scm:git:https://gitee.com/BDWare/front-base.git"
developerConnection = "scm:git:https://gitee.com/BDWare/front-base.git"
url = "https://gitee.com/BDWare/front-base"
}
}
}
}
repositories {
maven {
name 'bdwareSnapshot'
url 'https://oss.sonatype.org/content/repositories/snapshots'
credentials {
username = "${NEXUS_USERNAME}"
password = "${NEXUS_PASSWORD}"
}
}
maven {
name 'bdware'
url 'https://oss.sonatype.org/service/local/staging/deploy/maven2'
credentials {
username = "${NEXUS_USERNAME}"
password = "${NEXUS_PASSWORD}"
}
}
}
}
signing {
sign publishing.publications.mavenJava
}

View File

@ -4,8 +4,7 @@ public class ByteHexUtil {
protected static final char[] hexArray = "0123456789ABCDEF".toCharArray();
// lower ascii only
private static final int[] HEX_TO_INT =
new int[]{
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0-15
new int[] {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0-15
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 16-31
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 32-47
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, // 48-63

View File

@ -1,5 +1,6 @@
package org.bdware.server;
import com.google.gson.JsonArray;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.bdware.sc.util.JsonUtil;
@ -17,16 +18,15 @@ public class CMDConf {
public String cmi = "";
public String debug = "";
public boolean disableDoRepo = false;
public boolean disableLocalLhs = false;
public String doipCertPath = "";
public String doipLhsAddress = "";
public String repoDoid = "";
public String lhsAddress = "";
public String repoName;
public int doipPort = -1;
public String doipUserHandle = "";
public boolean enableEventPersistence = false;
public String enableSsl = "./ssl/chained.pem:./ssl/domain.pem";
public String ip = "127.0.0.1";
public boolean isLAN = true;
public boolean overwrite = false;
public int servicePort = 18005;
public String textFileSuffixes = ".yjs,.json,.txt,.css,.js,.html,.md,.conf,.csv";
@ -37,6 +37,9 @@ public class CMDConf {
public String clientToAgentPlugins = "";
public String clientToClusterPlugins = "";
public String tcpPlugins = "";
public String consistencyPlugins = "";
public JsonArray startContract = null;
public String datachainConf = null;
public static CMDConf parseFile(String confPath) {
CMDConf ret = null;

View File

@ -36,8 +36,10 @@ public class Entry {
Thread.sleep(1000);
Process p = Runtime.getRuntime().exec("./bdledger_go");
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
BufferedReader stdInput = new BufferedReader(
new InputStreamReader(p.getInputStream()));
BufferedReader stdError = new BufferedReader(
new InputStreamReader(p.getErrorStream()));
// read the output from the command
System.out.println("Here is the standard output of the command:\n");
@ -46,7 +48,8 @@ public class Entry {
}
// read any errors from the attempted command
System.out.println("Here is the standard error of the command (if any):\n");
System.out.println(
"Here is the standard error of the command (if any):\n");
while ((s = stdError.readLine()) != null) {
System.out.println(s);
}

View File

@ -84,11 +84,8 @@ public class ActionExecutor<T, U> {
handlers.put(method.getName(), new Pair<>(method, obj));
if (!method.getReturnType().equals(Void.TYPE)
|| method.getParameterCount() != 2) {
LOGGER.error(
"action ret is not void:"
+ obj.getClass().getCanonicalName()
+ "-->"
+ method.getName());
LOGGER.error("action ret is not void:"
+ obj.getClass().getCanonicalName() + "-->" + method.getName());
System.exit(0);
}
@ -97,10 +94,8 @@ public class ActionExecutor<T, U> {
handlers.put(a, new Pair<>(method, obj));
if (!method.getReturnType().equals(Void.TYPE)
|| method.getParameterCount() != 2) {
LOGGER.error(
"action ret is not void:"
+ obj.getClass().getCanonicalName()
+ "-->"
LOGGER.error("action ret is not void:"
+ obj.getClass().getCanonicalName() + "-->"
+ method.getName());
System.exit(0);
@ -117,7 +112,7 @@ public class ActionExecutor<T, U> {
public void handle(String action, final U args, final T callback)
throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
// LOGGER.info("handling " + action + "...");
// LOGGER.debug("handle : " + action + " ->" + JsonUtil.toJson(args));
// LOGGER.info("handle : " + action + " ->" + JsonUtil.toJson(args));
if (null != action) {
if (staticData.containsKey(action)) {
@ -135,7 +130,7 @@ public class ActionExecutor<T, U> {
final Pair<Method, Object> pair = handlers.get(action);
Action actionAnnotations = pair.first.getAnnotation(Action.class);
if (!checkPermission(actionAnnotations, args, permission)) {
LOGGER.info("unauthorised action " + action);
LOGGER.info("unauthorised action " + action + " -> " + JsonUtil.toJson(args));
throw new IllegalArgumentException("unauthorised action " + action);
}
@ -144,9 +139,7 @@ public class ActionExecutor<T, U> {
try {
pair.first.invoke(pair.second, args, callback);
} catch (Exception e) {
LOGGER.debug(
pair.first.getDeclaringClass().getCanonicalName()
+ "->"
LOGGER.debug(pair.first.getDeclaringClass().getCanonicalName() + "->"
+ pair.first.getName());
e.printStackTrace();
}

View File

@ -49,7 +49,8 @@ public class HttpResultCallback extends ResultCallback implements Runnable {
bytes = ret.getBytes();
}
assert bytes != null;
response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, OK, Unpooled.wrappedBuffer(bytes));
response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, OK,
Unpooled.wrappedBuffer(bytes));
for (String key : extraHeaders.keySet())
response.headers().add(key, extraHeaders.get(key));
@ -58,8 +59,9 @@ public class HttpResultCallback extends ResultCallback implements Runnable {
}
public void addHeader(String key, String val) {
public HttpResultCallback addHeader(String key, String val) {
extraHeaders.put(key, val);
return this;
}
@Override
@ -73,10 +75,3 @@ public class HttpResultCallback extends ResultCallback implements Runnable {
decodeAsB64 = true;
}
}
/*
scp ./libs/front-base-0.80.jar dev@023.node.internetapi.cn:./
scp ./libs/front-base-0.80.jar dev@021.node.internetapi.cn:./
scp ./libs/front-base-0.80.jar dev@024.node.internetapi.cn:./
* */

View File

@ -0,0 +1,89 @@
package org.bdware.server.action;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.*;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.io.Closeable;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
public class HttpServerSentEventResultCallback extends HttpResultCallback implements Closeable {
public static ScheduledExecutorService scheduledThreadPool =
Executors.newScheduledThreadPool(1);
private ScheduledFuture<?> currentScheduler;
private long lastUpdate;
public HttpServerSentEventResultCallback(ChannelHandlerContext ctx, String jsonCallback) {
super(ctx, jsonCallback);
ctxField = ctx;
}
public void writeInitialHead() {
HttpResponse response =
new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);
for (String key : extraHeaders.keySet())
response.headers().add(key, extraHeaders.get(key));
ctxField.writeAndFlush(response);
currentScheduler = scheduledThreadPool.schedule(this, 10, TimeUnit.SECONDS);
final ByteBuf buffer = Unpooled.copiedBuffer("\n", StandardCharsets.UTF_8);
ctxField.writeAndFlush(new DefaultHttpContent(buffer));
}
boolean closed = false;
@Override
public void onResult(String ret) {
ByteBuf event = Unpooled.copiedBuffer("event: onResult\n", StandardCharsets.UTF_8);
ctxField.writeAndFlush(new DefaultHttpContent(event));
ByteBuf buffer = Unpooled.copiedBuffer("data: " + ret + "\n\n", StandardCharsets.UTF_8);
ctxField.writeAndFlush(new DefaultHttpContent(buffer));
lastUpdate = System.currentTimeMillis();
if (ret.contains("\"onDistributeFinish\"")) {
lastUpdate = 0;
currentScheduler.cancel(true);
try {
close();
} catch (Exception e) {
}
}
}
static Logger LOGGER = LogManager.getLogger(HttpServerSentEventResultCallback.class);
@Override
public void run() {
try {
if (System.currentTimeMillis() - lastUpdate < 10000L) {
// reschedule
LOGGER.info("Reschedule time out");
currentScheduler = scheduledThreadPool.schedule(this, 10, TimeUnit.SECONDS);
return;
}
if (!closed) {
final ByteBuf buffer = Unpooled.copiedBuffer(
"{\"action\":\"onDistributeFinish\",\"progress\":\"-1\",\"data\":\"timeout\"}"
+ "\n\n",
StandardCharsets.UTF_8);
ctxField.writeAndFlush(new DefaultHttpContent(buffer));
}
close();
} catch (IOException e) {
}
}
@Override
public synchronized void close() throws IOException {
closed = true;
ctxField.close();
}
}

View File

@ -15,7 +15,8 @@ public class ReplyUtil {
resultCallback.onResult(ret);
}
public static void replyWithStatus(ResultCallback resultCallback, String action, boolean status,Object data) {
public static void replyWithStatus(ResultCallback resultCallback, String action, boolean status,
Object data) {
Map<String, Object> ret = new HashMap<>();
ret.put("action", action);
ret.put("status", status);

View File

@ -19,11 +19,8 @@ import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class SyncResult {
public static final HashedWheelTimer timer = new HashedWheelTimer(
Executors.defaultThreadFactory(),
5,
TimeUnit.MILLISECONDS,
2);
public static final HashedWheelTimer timer =
new HashedWheelTimer(Executors.defaultThreadFactory(), 5, TimeUnit.MILLISECONDS, 2);
private static final Logger LOGGER = LogManager.getLogger(SyncResult.class);
public Map<String, ResultCallback> waitObj = new ConcurrentHashMap<>();
@ -38,10 +35,8 @@ public class SyncResult {
}
}
public void instrumentWakeUp(
String requestID,
InstrumentedResultCallback instrumentedResultCallback,
JsonObject result) {
public void instrumentWakeUp(String requestID,
InstrumentedResultCallback instrumentedResultCallback, JsonObject result) {
ResultCallback ob = waitObj.get(requestID);
// TODO 难怪之前这是注释的
waitObj.remove(requestID);

View File

@ -0,0 +1,100 @@
package org.bdware.server.http;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufInputStream;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.QueryStringDecoder;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.bdware.sc.util.ExceptionUtil;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import org.zz.gmhelper.BCECUtil;
import org.zz.gmhelper.SM2Util;
import java.io.InputStreamReader;
import java.net.URLDecoder;
import java.util.List;
import java.util.Map;
public class ArgParser {
public interface VerifiedCallback {
void onResult(boolean verified, JsonObject param);
}
private static final Logger LOGGER = LogManager.getLogger(ArgParser.class);
public static JsonObject parseGetAndVerify(FullHttpRequest msg, VerifiedCallback cb)
throws Exception {
QueryStringDecoder decoderQuery = new QueryStringDecoder(msg.uri());
Map<String, List<String>> parameters = decoderQuery.parameters();
JsonObject transformedParam = new JsonObject();
for (String key : parameters.keySet()) {
List<String> val = parameters.get(key);
if (null != val) {
transformedParam.addProperty(key, val.get(0));
}
}
// 匿名用户权限为0
transformedParam.addProperty("permission", 0);
transformedParam.remove("verifiedPubKey");
// 验签 有pubKey就必须有sign
String uri = URLDecoder.decode(msg.uri(), "UTF-8").split("\\?")[1];
int index = uri.lastIndexOf('&');
if (index >= 0)
verifyParam(transformedParam, uri.substring(0, index), cb);
return transformedParam;
}
private static void verifyParam(JsonObject transformedParam, String toVerifyStr,
VerifiedCallback cb) {
boolean verify = false;
if (transformedParam.has("pubKey")) {
LOGGER.info("before verifying: " + toVerifyStr);
try {
ECPublicKeyParameters pubKey = BCECUtil.createECPublicKeyFromStrParameters(
transformedParam.get("pubKey").getAsString(), SM2Util.CURVE,
SM2Util.DOMAIN_PARAMS);
verify = SM2Util.verify(pubKey, toVerifyStr.getBytes(),
ByteUtils.fromHexString(transformedParam.get("sign").getAsString()));
} catch (Exception e) {
LOGGER.error(e.getMessage());
LOGGER.debug(ExceptionUtil.exceptionToString(e));
}
}
if (cb != null)
cb.onResult(verify, transformedParam);
return;
}
public static JsonObject parsePostAndVerify(FullHttpRequest msg, VerifiedCallback cb)
throws Exception {
ByteBuf content = msg.content();
JsonObject map =
JsonParser.parseReader(new InputStreamReader(new ByteBufInputStream(content)))
.getAsJsonObject();
StringBuilder toSign = new StringBuilder();
boolean isFirst = true;
for (String key : map.keySet()) {
if (!key.equals("sign")) {
if (!isFirst)
toSign.append("&");
isFirst = false;
toSign.append(key).append("=");
JsonElement je = map.get(key);
if (je.isJsonPrimitive())
toSign.append(je.getAsString());
else
toSign.append(je.toString());
}
}
verifyParam(map, toSign.toString(), cb);
return map;
}
}

View File

@ -24,7 +24,8 @@ public class FileDownloaderCallback extends HttpResultCallback {
public void onResult(final String filePath) {
try {
final RandomAccessFile file = new RandomAccessFile(filePath, "r");
HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);
HttpResponse response =
new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK);
// 设置文件格式内容
response.headers().set(HttpHeaderNames.CONTENT_TYPE, "application/x-msdownload");
response.headers().set(HttpHeaderNames.CONTENT_DISPOSITION,
@ -33,13 +34,14 @@ public class FileDownloaderCallback extends HttpResultCallback {
HttpUtil.setContentLength(response, file.length());
LOGGER.debug("FileLength:" + file.length());
ctxField.write(response);
ChannelFuture future = ctxField.write(new DefaultFileRegion(file.getChannel(), 0, file.length()),
ChannelFuture future =
ctxField.write(new DefaultFileRegion(file.getChannel(), 0, file.length()),
ctxField.newProgressivePromise());
ctxField.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT);
future.addListener(new ChannelProgressiveFutureListener() {
@Override
public void operationProgressed(ChannelProgressiveFuture future, long progress, long total) {
}
public void operationProgressed(ChannelProgressiveFuture future, long progress,
long total) {}
@Override
public void operationComplete(ChannelProgressiveFuture future) throws Exception {

View File

@ -24,12 +24,8 @@ public class HttpFileHandleAdapter extends SimpleChannelInboundHandler<FullHttpR
}
public static void sendError(ChannelHandlerContext ctx, HttpResponseStatus status) {
FullHttpResponse response =
new DefaultFullHttpResponse(
HTTP_1_1,
status,
Unpooled.wrappedBuffer(
("Failure: " + status + "\r\n").getBytes()));
FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, status,
Unpooled.wrappedBuffer(("Failure: " + status + "\r\n").getBytes()));
response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain; charset=UTF-8");
ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
}
@ -44,7 +40,9 @@ public class HttpFileHandleAdapter extends SimpleChannelInboundHandler<FullHttpR
} else if (path.endsWith(".ico")) {
headers.set(HttpHeaderNames.CONTENT_TYPE, "image/x-icon;");
} else if (path.endsWith(".svg")) {
headers.set(HttpHeaderNames.CONTENT_TYPE, "text/xml;charset=utf-8");
headers.set(HttpHeaderNames.CONTENT_TYPE, "image/svg+xml;charset=utf-8");
} else if (path.endsWith(".ypk")) {
headers.set(HttpHeaderNames.CONTENT_TYPE, "application/ypk");
}
}

View File

@ -1,15 +1,7 @@
package org.bdware.server.http;
public enum HttpMethod {
OPTIONS,
GET,
HEAD,
POST,
PUT,
PATCH,
DELETE,
TRACE,
CONNECT;
OPTIONS, GET, HEAD, POST, PUT, PATCH, DELETE, TRACE, CONNECT;
io.netty.handler.codec.http.HttpMethod get() {
switch (this) {

View File

@ -17,7 +17,7 @@ import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1;
public class URIHandler {
private static final Logger LOGGER = LogManager.getLogger(URIHandler.class);
Map<io.netty.handler.codec.http.HttpMethod, List<Tuple<String, Method, Object>>> handlers;
private Map<io.netty.handler.codec.http.HttpMethod, List<Tuple<String, Method, Object>>> handlers;
public URIHandler() {
handlers = new HashMap<>();
@ -59,14 +59,26 @@ public class URIHandler {
});
}
public void handle(ChannelHandlerContext ctx, FullHttpRequest msg) {
try {
public Tuple<String, Method, Object> findHandler(FullHttpRequest msg) {
List<Tuple<String, Method, Object>> handlerList = handlers.get(msg.method());
for (Tuple<String, Method, Object> t : handlerList)
if (msg.uri().startsWith(t.t)) {
t.u.invoke(t.s, ctx, msg);
return;
return t;
}
return null;
}
public void handle(ChannelHandlerContext ctx, FullHttpRequest msg) {
Tuple<String, Method, Object> t = findHandler(msg);
handle(ctx, msg, t);
}
public void handle(ChannelHandlerContext ctx, FullHttpRequest msg,
Tuple<String, Method, Object> t) {
try {
if (t != null)
t.u.invoke(t.s, ctx, msg);
else
sendUnsupported(ctx);
} catch (Exception e) {
e.printStackTrace();
@ -80,29 +92,25 @@ public class URIHandler {
for (Tuple<String, Method, Object> t : handlers.get(m)) {
String className = t.u.getDeclaringClass().getSimpleName();
sbl.append("\t\t").append(t.t.isEmpty() ? "<null>" : t.t).append(" --> ")
.append(className.isEmpty() ? "null" : className)
.append(".").append(t.u.getName()).append("\n");
.append(className.isEmpty() ? "null" : className).append(".")
.append(t.u.getName()).append("\n");
}
}
LOGGER.info(sbl.substring(0, sbl.length() - 1));
}
private void sendUnsupported(ChannelHandlerContext ctx) {
FullHttpResponse response =
new DefaultFullHttpResponse(
HTTP_1_1,
HttpResponseStatus.BAD_REQUEST,
Unpooled.wrappedBuffer(
("Failure: " + HttpResponseStatus.BAD_REQUEST + "\r\n")
.getBytes()));
FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1,
HttpResponseStatus.BAD_REQUEST, Unpooled.wrappedBuffer(
("Failure: " + HttpResponseStatus.BAD_REQUEST + "\r\n").getBytes()));
response.headers().set(HttpHeaderNames.CONTENT_TYPE, "text/plain; charset=UTF-8");
ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
}
static class Tuple<T, U, S> {
T t;
U u;
S s;
public static class Tuple<T, U, S> {
public T t;
public U u;
public S s;
Tuple(T t, U u, S s) {
this.t = t;

View File

@ -9,5 +9,6 @@ import java.lang.annotation.Target;
@Target(ElementType.METHOD)
public @interface URIPath {
String[] value() default {""};
HttpMethod method() default HttpMethod.GET;
}

View File

@ -22,9 +22,9 @@ public class CMNodeBean {
// TODO nodeMangerPubkey
public void updateContract(Map<String, String> json) {
String jsonStr = json.get("contracts");
contracts = JsonUtil.fromJson(jsonStr, new TypeToken<List<ContractDesp>>() {
}.getType());
// KeyValueDBUtil.instance.setValue(NCTables.NodesDB.toString(), pubKey, JsonUtil.toJson(this));
contracts = JsonUtil.fromJson(jsonStr, new TypeToken<List<ContractDesp>>() {}.getType());
// KeyValueDBUtil.instance.setValue(NCTables.NodesDB.toString(), pubKey,
// JsonUtil.toJson(this));
}
@ -33,7 +33,8 @@ public class CMNodeBean {
public String formatContractName(String contractIDOrName) {
if (null != contracts) {
for (ContractDesp desp : contracts) {
if (desp.contractID.equals(contractIDOrName) || desp.contractName.equals(contractIDOrName)) {
if (desp.contractID.equals(contractIDOrName)
|| desp.contractName.equals(contractIDOrName)) {
return desp.contractName;
}
}
@ -44,7 +45,8 @@ public class CMNodeBean {
public boolean containsContract(String contractIDOrName) {
if (null != contracts) {
for (ContractDesp desp : contracts) {
if (desp.contractID.equals(contractIDOrName) || desp.contractName.equals(contractIDOrName))
if (desp.contractID.equals(contractIDOrName)
|| desp.contractName.equals(contractIDOrName))
return true;
}
}
@ -54,7 +56,8 @@ public class CMNodeBean {
public boolean containsEvent(String contractIDOrName, String event) {
if (null != contracts) {
for (ContractDesp desp : contracts) {
if (desp.contractID.equals(contractIDOrName) || desp.contractName.equals(contractIDOrName)) {
if (desp.contractID.equals(contractIDOrName)
|| desp.contractName.equals(contractIDOrName)) {
if (desp.events.containsKey(event))
return true;
}

View File

@ -45,16 +45,10 @@ public enum Permission {
// TODO: 20205/20 需要整理权限就权限和最新的权限
// CenterManager (其他部分代码中出现的暂未合并整理)
ApplyRole(1 << 0),
NodeStateList(1 << 1),
AuthNodeManager(1 << 2),
ListAllUsers(1 << 3),
ListApplyUser(1 << 4),
DeleteNodeManager(1 << 5),
ListTrustCluster(1 << 6),
AssignTrustedCluster(1 << 7),
QueryActionLog(1 << 8),
QueryUserStateLog(1 << 9),
ApplyRole(1 << 0), NodeStateList(1 << 1), AuthNodeManager(1 << 2), ListAllUsers(
1 << 3), ListApplyUser(1 << 4), DeleteNodeManager(1 << 5), ListTrustCluster(
1 << 6), AssignTrustedCluster(
1 << 7), QueryActionLog(1 << 8), QueryUserStateLog(1 << 9),
// Node
ConfigureNode(1 << 10), // 其他地方代码中的权限

View File

@ -1,13 +1,8 @@
package org.bdware.server.permission;
public enum Role {
CenterManager(0x3ffL),
NodeManager(0xe41L),
Node(0x1L),
ContractProvider(0x3f000L),
ContractInstanceManager(0x7ff10c0L),
ContractUser(0x5c0000L),
Anonymous(0);
CenterManager(0x3ffL), NodeManager(0xe41L), Node(0x1L), ContractProvider(
0x3f000L), ContractInstanceManager(0x7ff10c0L), ContractUser(0x5c0000L), Anonymous(0);
long value;

View File

@ -5,13 +5,11 @@ import io.netty.buffer.Unpooled;
import io.netty.channel.CombinedChannelDuplexHandler;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
public class DelimiterCodec
extends CombinedChannelDuplexHandler<
DelimiterBasedFrameDecoder, DelimiterBasedFrameEncoder> {
public class DelimiterCodec extends
CombinedChannelDuplexHandler<DelimiterBasedFrameDecoder, DelimiterBasedFrameEncoder> {
public DelimiterCodec() {
ByteBuf buf = Unpooled.wrappedBuffer(DelimiterBasedFrameEncoder.delimiter);
init(
new DelimiterBasedFrameDecoder(10 * 1024 * 1024, buf),
init(new DelimiterBasedFrameDecoder(10 * 1024 * 1024, buf),
new DelimiterBasedFrameEncoder());
}
}

View File

@ -36,25 +36,26 @@ public class WebSocketIndexPageHandler extends SimpleChannelInboundHandler<FullH
protected void channelRead0(ChannelHandlerContext ctx, FullHttpRequest req) throws Exception {
// Handle a bad request.
if (!req.getUri().startsWith("/SCIDE/SCExecutor")) {
sendHttpResponse(ctx, req,
new DefaultFullHttpResponse(req.protocolVersion(), NOT_FOUND, ctx.alloc().buffer(0)));
sendHttpResponse(ctx, req, new DefaultFullHttpResponse(req.protocolVersion(), NOT_FOUND,
ctx.alloc().buffer(0)));
return;
}
if (!req.decoderResult().isSuccess()) {
sendHttpResponse(ctx, req,
new DefaultFullHttpResponse(req.protocolVersion(), BAD_REQUEST, ctx.alloc().buffer(0)));
sendHttpResponse(ctx, req, new DefaultFullHttpResponse(req.protocolVersion(),
BAD_REQUEST, ctx.alloc().buffer(0)));
return;
}
// Allow only GET methods.
if (!GET.equals(req.method())) {
sendHttpResponse(ctx, req,
new DefaultFullHttpResponse(req.protocolVersion(), FORBIDDEN, ctx.alloc().buffer(0)));
sendHttpResponse(ctx, req, new DefaultFullHttpResponse(req.protocolVersion(), FORBIDDEN,
ctx.alloc().buffer(0)));
return;
}
// Send the index page
if ("/SCIDE/SCExecutor/".equals(req.uri()) || "/SCIDE/SCExecutor/index.html".equals(req.uri())) {
if ("/SCIDE/SCExecutor/".equals(req.uri())
|| "/SCIDE/SCExecutor/index.html".equals(req.uri())) {
String webSocketLocation = getWebSocketLocation(ctx.pipeline(), req, websocketPath);
ByteBuf content = WebSocketServerIndexPage.getContent(webSocketLocation);
FullHttpResponse res = new DefaultFullHttpResponse(req.protocolVersion(), OK, content);
@ -62,8 +63,8 @@ public class WebSocketIndexPageHandler extends SimpleChannelInboundHandler<FullH
HttpUtil.setContentLength(res, content.readableBytes());
sendHttpResponse(ctx, req, res);
} else {
sendHttpResponse(ctx, req,
new DefaultFullHttpResponse(req.protocolVersion(), NOT_FOUND, ctx.alloc().buffer(0)));
sendHttpResponse(ctx, req, new DefaultFullHttpResponse(req.protocolVersion(), NOT_FOUND,
ctx.alloc().buffer(0)));
}
}
@ -73,7 +74,8 @@ public class WebSocketIndexPageHandler extends SimpleChannelInboundHandler<FullH
ctx.close();
}
private static void sendHttpResponse(ChannelHandlerContext ctx, FullHttpRequest req, FullHttpResponse res) {
private static void sendHttpResponse(ChannelHandlerContext ctx, FullHttpRequest req,
FullHttpResponse res) {
// Generate an error page if response getStatus code is not OK (200).
HttpResponseStatus responseStatus = res.status();
if (responseStatus.code() != 200) {

View File

@ -9,93 +9,33 @@ public final class WebSocketServerIndexPage {
private static final String NEWLINE = "\r\n";
public static ByteBuf getContent(String webSocketLocation) {
String str =
"<html><head><title>Web Socket Test</title></head>"
+ NEWLINE
+ "<body>"
+ NEWLINE
+ "<script type=\"text/javascript\">"
+ NEWLINE
+ "var socket;"
+ NEWLINE
+ "if (!window.WebSocket) {"
+ NEWLINE
+ " window.WebSocket = window.MozWebSocket;"
+ NEWLINE
+ '}'
+ NEWLINE
+ "if (window.WebSocket) {"
+ NEWLINE
+ " socket = new WebSocket(\""
+ webSocketLocation
+ "\");"
+ NEWLINE
+ " socket.onmessage = function(event) {"
+ NEWLINE
+ " var ta = document.getElementById('responseText');"
+ NEWLINE
+ " ta.value = ta.value + '\\n' + event.data"
+ NEWLINE
+ " };"
+ NEWLINE
+ " socket.onopen = function(event) {"
+ NEWLINE
+ " var ta = document.getElementById('responseText');"
+ NEWLINE
+ " ta.value = \"Web Socket opened!\";"
+ NEWLINE
+ " };"
+ NEWLINE
+ " socket.onclose = function(event) {"
+ NEWLINE
+ " var ta = document.getElementById('responseText');"
+ NEWLINE
+ " ta.value = ta.value + \"Web Socket closed\"; "
+ NEWLINE
+ " };"
+ NEWLINE
+ "} else {"
+ NEWLINE
+ " alert(\"Your browser does not support Web Socket.\");"
+ NEWLINE
+ '}'
+ NEWLINE
+ NEWLINE
+ "function send(message) {"
+ NEWLINE
+ " if (!window.WebSocket) { return; }"
+ NEWLINE
+ " if (socket.readyState == WebSocket.OPEN) {"
+ NEWLINE
+ " socket.send(message);"
+ NEWLINE
+ " } else {"
+ NEWLINE
+ " alert(\"The socket is not open.\");"
+ NEWLINE
+ " }"
+ NEWLINE
+ '}'
+ NEWLINE
+ "</script>"
+ NEWLINE
+ "<form onsubmit=\"return false;\">"
+ NEWLINE
String str = "<html><head><title>Web Socket Test</title></head>" + NEWLINE + "<body>"
+ NEWLINE + "<script type=\"text/javascript\">" + NEWLINE + "var socket;" + NEWLINE
+ "if (!window.WebSocket) {" + NEWLINE + " window.WebSocket = window.MozWebSocket;"
+ NEWLINE + '}' + NEWLINE + "if (window.WebSocket) {" + NEWLINE
+ " socket = new WebSocket(\"" + webSocketLocation + "\");" + NEWLINE
+ " socket.onmessage = function(event) {" + NEWLINE
+ " var ta = document.getElementById('responseText');" + NEWLINE
+ " ta.value = ta.value + '\\n' + event.data" + NEWLINE + " };" + NEWLINE
+ " socket.onopen = function(event) {" + NEWLINE
+ " var ta = document.getElementById('responseText');" + NEWLINE
+ " ta.value = \"Web Socket opened!\";" + NEWLINE + " };" + NEWLINE
+ " socket.onclose = function(event) {" + NEWLINE
+ " var ta = document.getElementById('responseText');" + NEWLINE
+ " ta.value = ta.value + \"Web Socket closed\"; " + NEWLINE + " };" + NEWLINE
+ "} else {" + NEWLINE + " alert(\"Your browser does not support Web Socket.\");"
+ NEWLINE + '}' + NEWLINE + NEWLINE + "function send(message) {" + NEWLINE
+ " if (!window.WebSocket) { return; }" + NEWLINE
+ " if (socket.readyState == WebSocket.OPEN) {" + NEWLINE
+ " socket.send(message);" + NEWLINE + " } else {" + NEWLINE
+ " alert(\"The socket is not open.\");" + NEWLINE + " }" + NEWLINE + '}'
+ NEWLINE + "</script>" + NEWLINE + "<form onsubmit=\"return false;\">" + NEWLINE
+ "<input type=\"text\" name=\"message\" value=\"Hello, World!\"/>"
+ "<input type=\"button\" value=\"Send Web Socket Data\""
+ NEWLINE
+ " onclick=\"send(this.form.message.value)\" />"
+ NEWLINE
+ "<h3>Output</h3>"
+ NEWLINE
+ "<input type=\"button\" value=\"Send Web Socket Data\"" + NEWLINE
+ " onclick=\"send(this.form.message.value)\" />" + NEWLINE
+ "<h3>Output</h3>" + NEWLINE
+ "<textarea id=\"responseText\" style=\"width:500px;height:300px;\"></textarea>"
+ NEWLINE
+ "</form>"
+ NEWLINE
+ "</body>"
+ NEWLINE
+ "</html>"
+ NEWLINE;
+ NEWLINE + "</form>" + NEWLINE + "</body>" + NEWLINE + "</html>" + NEWLINE;
return Unpooled.wrappedBuffer(str.getBytes());
}

View File

@ -44,7 +44,8 @@ public class IndexServer {
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel arg0) throws Exception {
arg0.pipeline().addLast(new HttpServerCodec()).addLast(new HttpObjectAggregator(65536))
arg0.pipeline().addLast(new HttpServerCodec())
.addLast(new HttpObjectAggregator(65536))
.addLast(new ChunkedWriteHandler()).addLast(serverHandler);
}
});

View File

@ -20,8 +20,7 @@ public class IndexAction {
static final String MISSING_ARGUMENT = "{\"status\":\"Errorr\",\"data\":\"missing arguments\"}";
static Map<String, LenVarTimeSerialIndex2> fileMap = new HashMap<>();
public IndexAction() {
}
public IndexAction() {}
@Action(async = true)
public void createFile(JsonObject args, final ResultCallback resultCallback) {
@ -42,8 +41,8 @@ public class IndexAction {
fout.write(1);
fout.close();
// LenVarTimeSerialIndex2 index = getIndexFile(fileName);
resultCallback.onResult(
"{\"status\":\"Success\",\"dataLength\":" + dataLength + ",\".datasize\":" + f.length() + "}");
resultCallback.onResult("{\"status\":\"Success\",\"dataLength\":" + dataLength
+ ",\".datasize\":" + f.length() + "}");
} catch (Exception e) {
ByteArrayOutputStream bo = new ByteArrayOutputStream();
@ -85,7 +84,8 @@ public class IndexAction {
try {
LenVarTimeSerialIndex2 index = getIndexFile(args.get("file").getAsString());
resultCallback.onResult("{\"dataSize\":" + index.dataSize + ",\"fileSize\":" + index.fileSize + "}");
resultCallback.onResult(
"{\"dataSize\":" + index.dataSize + ",\"fileSize\":" + index.fileSize + "}");
} catch (Exception e) {
ByteArrayOutputStream bo = new ByteArrayOutputStream();

View File

@ -34,11 +34,10 @@ public class IndexHttpHandler extends SimpleChannelInboundHandler<HttpObject> {
private static final String UNSUPPORTED_HTTP_METHOD = "{\"msg\":\"unsupported http method\"}";
private static final String UNSUPPORTED_ACTION = "{\"msg\":\"unsupported action\"}";
private static final Logger LOGGER = LogManager.getLogger(IndexHttpHandler.class);
private static ActionExecutor<ResultCallback, JsonObject> actionExecutor = new ActionExecutor<>(
Executors.newFixedThreadPool(5), new IndexAction());
private static ActionExecutor<ResultCallback, JsonObject> actionExecutor =
new ActionExecutor<>(Executors.newFixedThreadPool(5), new IndexAction());
public IndexHttpHandler() {
}
public IndexHttpHandler() {}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) {
@ -58,7 +57,8 @@ public class IndexHttpHandler extends SimpleChannelInboundHandler<HttpObject> {
private void handleHttpRequest(ChannelHandlerContext ctx, FullHttpRequest msg) {
if (!msg.uri().startsWith("/SCIDE/Index")) {
try {
DefaultFullHttpResponse fullResponse = new DefaultFullHttpResponse(msg.getProtocolVersion(), OK,
DefaultFullHttpResponse fullResponse =
new DefaultFullHttpResponse(msg.getProtocolVersion(), OK,
Unpooled.wrappedBuffer(UNSUPPORTED_HTTP_METHOD.getBytes()));
ChannelFuture f = ctx.write(fullResponse);
f.addListener(ChannelFutureListener.CLOSE);
@ -109,8 +109,8 @@ public class IndexHttpHandler extends SimpleChannelInboundHandler<HttpObject> {
String action = null;
if (!map.has("action")) {
ret = UNSUPPORTED_ACTION.getBytes();
DefaultFullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, OK,
Unpooled.wrappedBuffer(ret));
DefaultFullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1,
OK, Unpooled.wrappedBuffer(ret));
ChannelFuture f = ctx.write(response);
f.addListener(ChannelFutureListener.CLOSE);
return;

View File

@ -14,30 +14,22 @@ public class URIHandlerTest {
handler.register(this);
}
@URIPath(
method = HttpMethod.OPTIONS,
value = {"/"})
@URIPath(method = HttpMethod.OPTIONS, value = {"/"})
public void h1(ChannelHandlerContext ctx, FullHttpRequest request) {
return;
}
@URIPath(
method = HttpMethod.GET,
value = {"/SCIDE/ABC/", "/SCIDE/CEEEE"})
@URIPath(method = HttpMethod.GET, value = {"/SCIDE/ABC/", "/SCIDE/CEEEE"})
public void h2(ChannelHandlerContext ctx, FullHttpRequest request) {
return;
}
@URIPath(
method = HttpMethod.GET,
value = {"/"})
@URIPath(method = HttpMethod.GET, value = {"/"})
public void h3(ChannelHandlerContext ctx, FullHttpRequest request) {
return;
}
@URIPath(
method = HttpMethod.GET,
value = {"/client"})
@URIPath(method = HttpMethod.GET, value = {"/client"})
public void h4(ChannelHandlerContext ctx, FullHttpRequest request) {
return;
}

View File

@ -39,7 +39,8 @@ public class PermissionTest {
for (Permission p : setNodeManager) {
NodeManager |= p.getValue();
}
System.out.println("[NodeManager]" + String.format("0x%xL", NodeManager) + " " + NodeManager);
System.out
.println("[NodeManager]" + String.format("0x%xL", NodeManager) + " " + NodeManager);
EnumSet<Permission> setContractProvider = EnumSet.noneOf(Permission.class);
// 合约提供者
@ -74,7 +75,8 @@ public class PermissionTest {
for (Permission p : ContractInstanceManager) {
ContractInstanceManagerVAL |= p.getValue();
}
System.out.println("[ContractInstanceManager]" + String.format("0x%xL", ContractInstanceManagerVAL));
System.out.println(
"[ContractInstanceManager]" + String.format("0x%xL", ContractInstanceManagerVAL));
EnumSet<Permission> ContractUser = EnumSet.noneOf(Permission.class);
// 合约使用者

View File

@ -42,13 +42,8 @@ public class BDLedgerClient {
public void send() {
String mockedFrom = "0xb60e8dd61c5d32be8058bb8eb970870f07233155";
LedgerProto.SendTransactionResponse ret2 =
client.sendTransactionSync(
"default",
CommonProto.TransactionType.MESSAGE,
mockedFrom,
random.nextLong(),
mockedFrom,
LedgerProto.SendTransactionResponse ret2 = client.sendTransactionSync("default",
CommonProto.TransactionType.MESSAGE, mockedFrom, random.nextLong(), mockedFrom,
"Hellooooo".getBytes(StandardCharsets.UTF_8));
ByteString hash = ret2.getHash();
System.out.println("[BDLedgerClient] hash:" + byteArray2Str(hash.toByteArray(), 0));
@ -60,9 +55,7 @@ public class BDLedgerClient {
// "ea508a07b79afc03c94a84ff190ca29f1153ef75"
// cb304919522a4acd8f2b23fadf993829ac40795a
QueryProto.GetBlocksResponse blocks =
client.getBlocksSync(
"default",
System.currentTimeMillis() - 23L * 3600L * 1000L,
client.getBlocksSync("default", System.currentTimeMillis() - 23L * 3600L * 1000L,
QueryProto.IncludeTransactions.FULL);
System.out.println("BlockCount:" + blocks.getBlocksCount());
// GetTransactionByHashResponse result = client.getTransactionByHashSync("test",
@ -75,9 +68,8 @@ public class BDLedgerClient {
public void queryTransaction() {
// test2 31b50daa8d607c673af5ef449a4d78c70bf952d4
// bdcontract cb304919522a4acd8f2b23fadf993829ac40795a
QueryProto.GetTransactionByHashResponse result =
client.getTransactionByHashSync(
"default", "78bf9fb27963b26bf2f8d558f20bf44559178b67");
QueryProto.GetTransactionByHashResponse result = client.getTransactionByHashSync("default",
"78bf9fb27963b26bf2f8d558f20bf44559178b67");
ByteString bytes = result.getTransaction().getData();
System.out.println(new String(bytes.toByteArray()));
}

View File

@ -39,7 +39,8 @@ public class CMHttpTest {
System.out.println(httpGet(url1));
url1 = host + "killAllContract";
System.out.println(httpGet(url1));
url1 = host + "startContractBatched&fileList=" + URLEncoder.encode("[\"algorithmExample.yjs\",\"AAA.yjs\"]");
url1 = host + "startContractBatched&fileList="
+ URLEncoder.encode("[\"algorithmExample.yjs\",\"AAA.yjs\"]");
System.out.println(httpGet(url1));
// url1 = host + "startContractInTempZips";
// System.out.println(httpGet(url1));
@ -52,8 +53,8 @@ public class CMHttpTest {
System.out.println(httpGet(url1));
url1 = host + "downloadUUID";
System.out.println(httpGet(url1));
url1 = host + "updateConfig&key=projectDir&val="
+ URLEncoder.encode("/Users/huaqiancai/java_workspace/SmartContract/contractExamples");
url1 = host + "updateConfig&key=projectDir&val=" + URLEncoder
.encode("/Users/huaqiancai/java_workspace/SmartContract/contractExamples");
System.out.println(httpGet(url1));
url1 = host + "loadConfig";
System.out.println(httpGet(url1));

View File

@ -11,11 +11,11 @@ import org.bdware.sc.bean.ContractDesp;
public class GsonParseTest {
public static void main(String[] args) {
String jsonStr = "{\"action\":\"updateContract\",\"contracts\":\"[{\\\"contractID\\\":\\\"-1306108766\\\",\\\"contractName\\\":\\\"EventSuberAtCHQ\\\",\\\"events\\\":[\\\"def\\\"],\\\"exportedFunctions\\\":[{\\\"annotations\\\":[{\\\"type\\\":\\\"LogType\\\",\\\"args\\\":[\\\"\\\\\\\"Arg\\\\\\\"\\\"]}],\\\"functionName\\\":\\\"init\\\"},{\\\"annotations\\\":[{\\\"type\\\":\\\"LogType\\\",\\\"args\\\":[\\\"\\\\\\\"Arg\\\\\\\"\\\"]}],\\\"functionName\\\":\\\"handler\\\"}]}]\"}\n";
String jsonStr =
"{\"action\":\"updateContract\",\"contracts\":\"[{\\\"contractID\\\":\\\"-1306108766\\\",\\\"contractName\\\":\\\"EventSuberAtCHQ\\\",\\\"events\\\":[\\\"def\\\"],\\\"exportedFunctions\\\":[{\\\"annotations\\\":[{\\\"type\\\":\\\"LogType\\\",\\\"args\\\":[\\\"\\\\\\\"Arg\\\\\\\"\\\"]}],\\\"functionName\\\":\\\"init\\\"},{\\\"annotations\\\":[{\\\"type\\\":\\\"LogType\\\",\\\"args\\\":[\\\"\\\\\\\"Arg\\\\\\\"\\\"]}],\\\"functionName\\\":\\\"handler\\\"}]}]\"}\n";
JsonObject jo = new JsonParser().parse(jsonStr).getAsJsonObject();
List<ContractDesp> contracts = new Gson().fromJson(jo.get("contracts").getAsString(),
new TypeToken<List<ContractDesp>>() {
}.getType());
new TypeToken<List<ContractDesp>>() {}.getType());
System.out.println(new GsonBuilder().setPrettyPrinting().create().toJson(contracts));
}
}

View File

@ -33,7 +33,8 @@ public class HttpPostFormTest {
String BOUNDARY = "----------" + System.currentTimeMillis();
// httpConnection.setRequestProperty("Content-Type", "multipart/form-data;
// boundary=" + BOUNDARY);
httpConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;boundary=" + BOUNDARY);
httpConnection.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded;boundary=" + BOUNDARY);
// 连接从postUrl.openConnection()至此的配置必须要在connect之前完成
// 要注意的是connection.getOutputStream会隐含的进行connect
@ -75,7 +76,8 @@ public class HttpPostFormTest {
}
try {
reader = new BufferedReader(new InputStreamReader(httpConnection.getInputStream(), "UTF-8"));
reader = new BufferedReader(
new InputStreamReader(httpConnection.getInputStream(), "UTF-8"));
while ((responseMessage = reader.readLine()) != null) {
response.append(responseMessage);
response.append("\n");

View File

@ -27,7 +27,8 @@ public class NCHttpTest {
url1 = host + "updateContract";
System.out.println(httpGet(url1));
url1 = host + "executeContractOnOtherNodes&requestID=33333&contractRequest={\"contractID\":\"BDCoin\",\"action\":\"totalSupply\",\"arg\":\"n\"}";
url1 = host
+ "executeContractOnOtherNodes&requestID=33333&contractRequest={\"contractID\":\"BDCoin\",\"action\":\"totalSupply\",\"arg\":\"n\"}";
System.out.println(httpGet(url1));
// url1 = host + "startContractInTempZips";
// System.out.println(httpGet(url1));
@ -40,8 +41,8 @@ public class NCHttpTest {
System.out.println(httpGet(url1));
url1 = host + "downloadUUID";
System.out.println(httpGet(url1));
url1 = host + "updateConfig&key=projectDir&val="
+ URLEncoder.encode("/Users/huaqiancai/java_workspace/SmartContract/contractExamples");
url1 = host + "updateConfig&key=projectDir&val=" + URLEncoder
.encode("/Users/huaqiancai/java_workspace/SmartContract/contractExamples");
System.out.println(httpGet(url1));
url1 = host + "loadConfig";
System.out.println(httpGet(url1));

View File

@ -4,16 +4,19 @@ public class StringTest {
public static void main(String[] arg) {
// String str = "\\manifest.json\\dadad\\daaa";
// System.out.println(str.replaceAll("\\\\", (byte)"/"));
byte[] arr = new byte[] { (byte) 0x1, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x2, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0x89, (byte) 0x7f, (byte) 0x51, (byte) 0x8c, (byte) 0x50,
(byte) 0xbb, (byte) 0xd0, (byte) 0x7f, (byte) 0xff, (byte) 0xff, (byte) 0xe9, (byte) 0xf4, (byte) 0xf8,
(byte) 0xfc, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x4, (byte) 0xff, (byte) 0xff, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0x89, (byte) 0x7f, (byte) 0x51, (byte) 0x8c, (byte) 0x3e, (byte) 0xf4,
(byte) 0x8, (byte) 0x40, (byte) 0x9f, (byte) 0x84, (byte) 0x50, (byte) 0xbb, (byte) 0xd0, (byte) 0x7f,
(byte) 0xff, (byte) 0xff, (byte) 0xe9, (byte) 0xf4, (byte) 0xf8, (byte) 0xfc, (byte) 0xf8, (byte) 0xfc,
(byte) 0x0 };
byte[] arr = new byte[] {(byte) 0x1, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x2,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0x89,
(byte) 0x7f, (byte) 0x51, (byte) 0x8c, (byte) 0x50, (byte) 0xbb, (byte) 0xd0,
(byte) 0x7f, (byte) 0xff, (byte) 0xff, (byte) 0xe9, (byte) 0xf4, (byte) 0xf8,
(byte) 0xfc, (byte) 0x0, (byte) 0x0, (byte) 0x0, (byte) 0x4, (byte) 0xff,
(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0x89, (byte) 0x7f,
(byte) 0x51, (byte) 0x8c, (byte) 0x3e, (byte) 0xf4, (byte) 0x8, (byte) 0x40,
(byte) 0x9f, (byte) 0x84, (byte) 0x50, (byte) 0xbb, (byte) 0xd0, (byte) 0x7f,
(byte) 0xff, (byte) 0xff, (byte) 0xe9, (byte) 0xf4, (byte) 0xf8, (byte) 0xfc,
(byte) 0xf8, (byte) 0xfc, (byte) 0x0};
System.out.println(new String(arr));
String str = "042668227e8283cc132863cf7b83489f81056c87a19f878515d6787db7f86da7145ae05926b8e8053e59f93afdddc8705d7e17a5293b60a124a2e842d3c77cf74f";
String str =
"042668227e8283cc132863cf7b83489f81056c87a19f878515d6787db7f86da7145ae05926b8e8053e59f93afdddc8705d7e17a5293b60a124a2e842d3c77cf74f";
System.out.println(str.hashCode());
}
}