Skip to content

Commit 272db4c

Browse files
committed
Merge branch 'develop' of gitlab.peersafe.cn:chainsql/java-chainsql-api into develop
2 parents f597586 + fdd5bcc commit 272db4c

9 files changed

Lines changed: 137 additions & 68 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
eclipse.preferences.version=1
22
encoding//src/main/java=UTF-8
33
encoding//src/main/resources=UTF-8
4+
encoding//src/test/java=UTF-8
45
encoding//src/test/java/Test.java=UTF-8
56
encoding/<project>=UTF-8
1.15 MB
Binary file not shown.

chainsql/src/main/java/com/peersafe/base/client/Client.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,9 @@ public void run(Runnable runnable) {
588588
if (runningOnClientThread()) {
589589
runnable.run();
590590
} else {
591-
service.submit(errorHandling(runnable));
591+
if(!service.isShutdown()){
592+
service.submit(errorHandling(runnable));
593+
}
592594
}
593595
}
594596

@@ -598,7 +600,9 @@ public void run(Runnable runnable) {
598600
* @param runnable Runnable object.
599601
*/
600602
public void schedule(long ms, Runnable runnable) {
601-
service.schedule(errorHandling(runnable), ms, TimeUnit.MILLISECONDS);
603+
if(!service.isShutdown()) {
604+
service.schedule(errorHandling(runnable), ms, TimeUnit.MILLISECONDS);
605+
}
602606
}
603607

604608
private boolean runningOnClientThread() {

chainsql/src/main/java/com/peersafe/base/client/transport/impl/JavaWebSocketTransportImpl.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ public void connectSSL(URI uri, String[] trustCAsPath, String sslKeyPath, String
221221
if(trustCAsPath.length != 0) {
222222
String certSigAlg = ((X509Certificate)readCert(trustCAsPath[0])).getSigAlgName();
223223
String certPubKeyAlg = "0608";
224-
if(sslCertPath.length() != 0) {
224+
if(sslCertPath != null) {
225225
PemReader pemReader = new PemReader(new InputStreamReader(new FileInputStream(sslCertPath)));
226226
byte[] subPubkeyInfo = org.bouncycastle.asn1.x509.Certificate.getInstance(pemReader.readPemObject()
227227
.getContent()).getSubjectPublicKeyInfo().getEncoded();
@@ -278,7 +278,7 @@ protected void initChannel(SocketChannel ch) {
278278
}
279279
});
280280
wscHandler.setEventHandler(curHandler);
281-
wscHandler.doConnect(b, uri);
281+
wscHandler.doConnect(b, uri, group);
282282
} catch (Exception e){
283283
e.printStackTrace();
284284
group.shutdownGracefully();
@@ -298,6 +298,14 @@ public void disconnect() {
298298
client.close();
299299
client = null;
300300
}
301+
if( wscHandler != null) {
302+
wscHandler.disconnect();
303+
TransportEventHandler handler = this.handler.get();
304+
if (handler != null) {
305+
handler.onDisconnected(false);
306+
}
307+
wscHandler = null;
308+
}
301309
}
302310
private static Certificate readCert(String path) throws IOException, CertificateException {
303311
try (FileInputStream fin = new FileInputStream(path)) {

chainsql/src/main/java/com/peersafe/base/client/transport/impl/WebSocketClientHandler.java

Lines changed: 47 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import io.netty.channel.ChannelFutureListener;
4343
import io.netty.channel.ChannelHandlerContext;
4444
import io.netty.channel.ChannelPromise;
45+
import io.netty.channel.EventLoopGroup;
4546
import io.netty.channel.SimpleChannelInboundHandler;
4647
import io.netty.handler.codec.http.FullHttpResponse;
4748
import io.netty.handler.codec.http.websocketx.CloseWebSocketFrame;
@@ -65,6 +66,7 @@ public class WebSocketClientHandler extends SimpleChannelInboundHandler<Object>
6566
private ChannelPromise handshakeFuture;
6667
WeakReference<TransportEventHandler> tranEventh;
6768
private Channel channel_;
69+
private EventLoopGroup group_;
6870
String appendframeData_ = "";
6971

7072
public WebSocketClientHandler(WebSocketClientHandshaker handshaker) {
@@ -75,6 +77,19 @@ public ChannelFuture handshakeFuture() {
7577
return handshakeFuture;
7678
}
7779

80+
private void onDisconnect(Throwable cause) {
81+
channel_.close();
82+
group_.shutdownGracefully();
83+
TransportEventHandler teHandler = tranEventh.get();
84+
if (teHandler != null) {
85+
if(cause != null) {
86+
cause.printStackTrace();
87+
teHandler.onError((Exception)cause);
88+
}
89+
teHandler.onDisconnected(false);
90+
}
91+
}
92+
7893
/**
7994
* setEventHandler
8095
* @param eventHandler eventHandler
@@ -83,21 +98,17 @@ public void setEventHandler(TransportEventHandler eventHandler) {
8398
tranEventh = new WeakReference<TransportEventHandler>(eventHandler);
8499
}
85100

86-
public void doConnect(Bootstrap bs, URI uri) {
101+
public void doConnect(Bootstrap bs, URI uri, EventLoopGroup group) {
102+
group_ = group;
87103
ChannelFuture chf = bs.connect(uri.getHost(), uri.getPort());
104+
channel_ = chf.channel();
88105
chf.addListener(new ChannelFutureListener() {
89106
@Override public void operationComplete(ChannelFuture future)
90107
throws Exception {
91-
TransportEventHandler teHandler = tranEventh.get();
92108
if( !future.isSuccess() ) {
93-
future.channel().close();
109+
onDisconnect(future.cause());
94110
// bs.connect(uri.getHost(), uri.getPort()).addListener(this);
95-
if (teHandler != null) {
96-
teHandler.onError((Exception)future.cause());
97-
teHandler.onDisconnected(false);
98-
}
99111
} else {
100-
channel_ = future.channel();
101112
//add a listener to detect the connection lost
102113
addCloseDetectListener(future.channel());
103114
}
@@ -108,15 +119,32 @@ private void addCloseDetectListener(Channel channel) {
108119
@Override
109120
public void operationComplete(ChannelFuture future )
110121
throws Exception {
111-
TransportEventHandler teHandler = tranEventh.get();
112-
if (teHandler != null) {
113-
teHandler.onDisconnected(false);
122+
if(future.isDone() && future.isSuccess()) {
123+
System.out.println("syn operation complete successfully");
124+
} else if(future.isDone() && future.isCancellable()) {
125+
System.out.println("syn operation complete cancellation");
126+
} else {
127+
onDisconnect(future.cause());
114128
}
115129
}
116130
});
117131
}
118132
});
119133
}
134+
135+
public void disconnect() {
136+
// System.out.println("Begin to disconnect");
137+
if(channel_ != null && channel_.isActive()) {
138+
channel_.write(new CloseWebSocketFrame());
139+
// channel_.close();
140+
channel_.disconnect();
141+
group_.shutdownGracefully();
142+
// System.out.println("finish disconnect");
143+
}
144+
else {
145+
System.out.println("no connection need close");
146+
}
147+
}
120148
public void sendMessage(String msg) {
121149
WebSocketFrame frame = new TextWebSocketFrame(msg);
122150
channel_.writeAndFlush(frame);
@@ -135,6 +163,10 @@ public void channelActive(ChannelHandlerContext ctx) {
135163
@Override
136164
public void channelInactive(ChannelHandlerContext ctx) {
137165
System.out.println("WebSocket Client disconnected!");
166+
TransportEventHandler teHandler = tranEventh.get();
167+
if (teHandler != null) {
168+
teHandler.onDisconnected(false);
169+
}
138170
}
139171

140172
@Override
@@ -151,9 +183,8 @@ public void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception
151183
handshakeFuture.setSuccess();
152184
} catch (WebSocketHandshakeException e) {
153185
System.out.println("WebSocket Client failed to connect");
154-
if (teHandler != null) {
155-
teHandler.onDisconnected(false);
156-
}
186+
// ch.close();
187+
onDisconnect(null);
157188
handshakeFuture.setFailure(e);
158189
}
159190
return;
@@ -202,7 +233,8 @@ public void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception
202233
System.out.println("WebSocket Client received pong");
203234
} else if (frame instanceof CloseWebSocketFrame) {
204235
System.out.println("WebSocket Client received closing");
205-
ch.close();
236+
// ch.close();
237+
onDisconnect(null);
206238
}
207239
}
208240

chainsql/src/main/java/com/peersafe/base/crypto/X509CryptoSuite.java

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
*/
66
package com.peersafe.base.crypto;
77

8-
import sun.security.util.CurveDB;
8+
// import sun.security.util.CurveDB;
9+
// import sun.security.ec.CurveDB;
910
import sun.security.util.ObjectIdentifier;
1011
import sun.security.x509.AlgorithmId;
1112

@@ -26,8 +27,22 @@ public class X509CryptoSuite {
2627
private static final String CIPHER_GM = "ECDHE-SM2-WITH-SMS4-GCM-SM3";
2728

2829
public static void enableX509CertificateWithGM() throws IllegalAccessException, InvocationTargetException,
29-
NoSuchFieldException, ClassNotFoundException {
30-
Method[] methods = CurveDB.class.getDeclaredMethods();
30+
NoSuchFieldException, ClassNotFoundException{
31+
32+
final String javaVer = System.getProperty("java.version");
33+
int javaSubVer = Integer.parseInt(javaVer.substring(javaVer.length()-3, javaVer.length()));
34+
ClassLoader classLoader = X509CryptoSuite.class.getClassLoader();
35+
Class CurveDB;
36+
if(javaVer.contains("1.6.0") || javaVer.contains("1.7.0") && javaSubVer < 231 ){
37+
throw new RuntimeException("jdk1.7 before 231 or jdk1.6 don't support.");
38+
}
39+
if((javaVer.contains("1.7.0") && javaSubVer < 301 && javaSubVer > 231 ) ||
40+
(javaVer.contains("1.8.0") && javaSubVer < 292)) {
41+
CurveDB = classLoader.loadClass("sun.security.ec.CurveDB");
42+
} else{
43+
CurveDB = classLoader.loadClass("sun.security.util.CurveDB");
44+
}
45+
Method[] methods = CurveDB.getDeclaredMethods();
3146
Method method = null;
3247
Method getNamesByOID = null;
3348
boolean notSeted = true;
@@ -43,7 +58,7 @@ public static void enableX509CertificateWithGM() throws IllegalAccessException,
4358
}
4459
if(getNamesByOID != null) {
4560
getNamesByOID.setAccessible(true);
46-
String[] nameArray = (String [])getNamesByOID.invoke(CurveDB.class, "1.2.156.10197.1.301");
61+
String[] nameArray = (String [])getNamesByOID.invoke(CurveDB, "1.2.156.10197.1.301");
4762
if(nameArray.length != 0)
4863
{
4964
notSeted = false;
@@ -56,7 +71,7 @@ public static void enableX509CertificateWithGM() throws IllegalAccessException,
5671
throw new NoSuchFieldException();
5772
}
5873
method.setAccessible(true);
59-
method.invoke(CurveDB.class, "sm2p256v1", "1.2.156.10197.1.301", 1,
74+
method.invoke(CurveDB, "sm2p256v1", "1.2.156.10197.1.301", 1,
6075
"FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF",
6176
"FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC",
6277
"28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93",
@@ -65,11 +80,11 @@ public static void enableX509CertificateWithGM() throws IllegalAccessException,
6580
"FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123",
6681
1, splitPattern);
6782

68-
final Field specCollection = CurveDB.class.getDeclaredField("specCollection");
69-
final Field oidMap = CurveDB.class.getDeclaredField("oidMap");
83+
final Field specCollection = CurveDB.getDeclaredField("specCollection");
84+
final Field oidMap = CurveDB.getDeclaredField("oidMap");
7085
oidMap.setAccessible(true);
7186
specCollection.setAccessible(true);
72-
specCollection.set(CurveDB.class, Collections.unmodifiableCollection(((Map) oidMap.get(CurveDB.class)).values()));
87+
specCollection.set(CurveDB, Collections.unmodifiableCollection(((Map) oidMap.get(CurveDB)).values()));
7388

7489
Field nameTable = AlgorithmId.class.getDeclaredField("nameTable");
7590
nameTable.setAccessible(true);

chainsql/src/main/java/com/peersafe/chainsql/core/Chainsql.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public class Chainsql extends Submit {
4545
private JSONObject mTxJson;
4646

4747
private static final int PASSWORD_LENGTH = 32;
48-
private int timeout = 5; //unit:seconds
48+
private int timeout = 10; //unit:seconds
4949

5050

5151
// Logger

chainsql/src/main/java/com/peersafe/chainsql/core/Submit.java

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -227,22 +227,25 @@ public void called(Response args) {
227227
}
228228
}
229229

230-
if(sync){
231-
if(submit_state == SubmitState.submit_error ||
232-
(submit_state == SubmitState.send_success && condition == SyncCond.send_success)){
230+
if (sync) {
231+
if (submit_state == SubmitState.submit_error) {
233232
return submitRes;
234-
}else{
233+
} else if (submit_state == SubmitState.send_success && condition == SyncCond.send_success) {
234+
unSubscribeTx(tx.hash.toString());
235+
return submitRes;
236+
} else {
235237
count = sync_maxtime / wait_milli;
236-
while(sync_state != SyncState.sync_response){
238+
while (sync_state != SyncState.sync_response) {
237239
Util.waiting();
238-
if(--count <= 0){
239-
syncRes = getError("waiting sync result timeout",tx.hash.toString());
240+
if (--count <= 0) {
241+
syncRes = getError("waiting sync result timeout", tx.hash.toString());
240242
break;
241243
}
242244
}
245+
unSubscribeTx(tx.hash.toString());
243246
return syncRes;
244247
}
245-
}else{
248+
} else {
246249
return submitRes;
247250
}
248251
}
@@ -279,28 +282,34 @@ public void called(JSONObject data) {
279282

280283
res.put("tx_hash", hash);
281284

282-
boolean bUnsubcribe = true;
283-
if(condition == SyncCond.validate_success &&
284-
(obj.get("status").equals("validate_success") || obj.get("status").equals("db_success"))){
285-
res.put("status", "validate_success");
286-
}else if(condition == SyncCond.db_success && obj.get("status").equals("db_success")){
287-
res.put("status", "db_success");
288-
}else if(!obj.get("status").equals("validate_success") && !obj.get("status").equals("db_success")){
289-
res.put("status", obj.get("status"));
290-
if(obj.has("error_message"))
291-
res.put("error_message", obj.get("error_message"));
292-
if(obj.has("error"))
293-
res.put("error", obj.get("error"));
294-
}else {
295-
bUnsubcribe = false;
296-
}
297-
298-
//unsubscribe tx
299-
if(bUnsubcribe) {
300-
unSubscribeTx(hash);
285+
String status = obj.getString("status");
286+
switch (status) {
287+
case "validate_success":
288+
if (condition.compareTo(SyncCond.db_success) < 0) {
289+
res.put("status", condition.toString());
290+
}
291+
break;
292+
case "db_success":
293+
res.put("status", condition.toString());
294+
break;
295+
default: // validate_(*error) 或者 db_(*error) 错误情况
296+
if (status.startsWith("validate_") &&
297+
condition.compareTo(SyncCond.validate_success) < 0) {
298+
res.put("status", condition.toString());
299+
} else if (status.startsWith("db_") &&
300+
condition.compareTo(SyncCond.db_success) < 0) {
301+
res.put("status", condition.toString());
302+
} else {
303+
res.put("status", status);
304+
if (obj.has("error"))
305+
res.put("error", obj.get("error"));
306+
if (obj.has("error_message"))
307+
res.put("error_message", obj.get("error_message"));
308+
}
309+
break;
301310
}
302311

303-
if(!res.isNull("status") && sync_state == SyncState.waiting_sync){
312+
if (!res.isNull("status") && sync_state == SyncState.waiting_sync) {
304313
syncRes = res;
305314
sync_state = SyncState.sync_response;
306315
submit_state = SubmitState.send_success;

chainsql/src/main/java/com/peersafe/chainsql/manager/EventManager.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -375,18 +375,18 @@ private void onTXMessage(JSONObject data){
375375
// makeCallback(key,data);
376376
// }
377377
makeCallback(key,data);
378-
if(data.has("transaction") && data.getJSONObject("transaction").has("TransactionType"))
379-
{
380-
JSONObject tx = data.getJSONObject("transaction");
381-
TransactionType type = TransactionType.valueOf(tx.getString("TransactionType"));
382-
if(Util.isChainsqlType(type)) {
383-
if(!("validate_success".equals(data.getString("status")))){
384-
mapCache.remove(key);
385-
}
386-
}else {
387-
mapCache.remove(key);
388-
}
389-
}
378+
// if(data.has("transaction") && data.getJSONObject("transaction").has("TransactionType"))
379+
// {
380+
// JSONObject tx = data.getJSONObject("transaction");
381+
// TransactionType type = TransactionType.valueOf(tx.getString("TransactionType"));
382+
// if(Util.isChainsqlType(type)) {
383+
// if(!("validate_success".equals(data.getString("status")))){
384+
// mapCache.remove(key);
385+
// }
386+
// }else {
387+
// mapCache.remove(key);
388+
// }
389+
// }
390390
}
391391

392392

0 commit comments

Comments
 (0)