diff --git a/src/main/java/org/bdware/sc/repo/Controller.java b/src/main/java/org/bdware/sc/repo/Controller.java index 8a018919e1f61dbe57018ca27bd36128363e2c48..6d274e659a8c41e69faa2de987757550060cded1 100644 --- a/src/main/java/org/bdware/sc/repo/Controller.java +++ b/src/main/java/org/bdware/sc/repo/Controller.java @@ -1,6 +1,7 @@ package org.bdware.sc.repo; import com.google.gson.JsonArray; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.mysql.cj.jdbc.result.ResultSetMetaData; @@ -21,14 +22,18 @@ import org.bdware.doip.endpoint.event.TopicHandler; import org.bdware.doip.endpoint.server.RepositoryHandler; import org.bdware.irp.stateinfo.StateInfoBase; import org.bdware.sc.ContractProcess; +import org.bdware.sc.bean.Contract; +import org.bdware.sc.debugger.DebugMain; import org.bdware.sc.engine.JSONTool; import org.bdware.sc.repo.merkel.RepoEventHandler; +import org.bdware.sc.util.FileUtil; import org.bdware.sc.util.JsonUtil; import org.rocksdb.RocksIterator; import org.zz.gmhelper.SM2KeyPair; import wrp.jdk.nashorn.api.scripting.ScriptObjectMirror; import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.nio.charset.StandardCharsets; @@ -174,8 +179,10 @@ public class Controller implements RepositoryHandler, TopicHandler { @Override public DoipMessage handleDelete(DoipMessage doipMessage) { + + String fullDoid = doipMessage.header.parameters.id; - // 同步注销标识解析系统中注册的DoId + DoipMessageFactory.DoipMessageBuilder builder = new DoipMessageFactory.DoipMessageBuilder(); DoipMessage ret = builder.createResponse(DoipResponseCode.Invalid, doipMessage).create(); String result = null; @@ -194,13 +201,20 @@ public class Controller implements RepositoryHandler, TopicHandler { "unRegister failed! meets exception".getBytes(StandardCharsets.UTF_8); } + + + LOGGER.info(result); + String suffix = getSuffix(fullDoid); Storage.doTable.delete(suffix); deleteDoMeta(fullDoid); DoipMessageFactory.DoipMessageBuilder builder2 = new DoipMessageFactory.DoipMessageBuilder(); builder2.createResponse(DoipResponseCode.Success, doipMessage); + // ret.body.encodedData = "fullDoid delete success!".getBytes(StandardCharsets.UTF_8); + builder2.setBody(("Do: " + fullDoid + " has been deleted !").getBytes()); return builder2.create(); + } @@ -211,28 +225,83 @@ public class Controller implements RepositoryHandler, TopicHandler { String fullDoid = doipMessage.header.parameters.id; String suffix = getSuffix(fullDoid); builder.createResponse(DoipResponseCode.Success, doipMessage); - if (!doipMessage.header.parameters.attributes.has("offset") - || !doipMessage.header.parameters.attributes.has("count")) { - // 修复检索删除的DO报错问题 - if (Storage.doTable.get(suffix) == null) { - builder.setBody("DoId is not exist!".getBytes()); - } else { - builder.setBody(Storage.doTable.get(suffix).getBytes()); + String retrieveType = ""; + if (doipMessage.header.parameters.attributes.has("retrieveType")) { + retrieveType = + doipMessage.header.parameters.attributes.get("retrieveType").getAsString(); + } + if (retrieveType.equals("updateDoMeta")) { + int offset = 0; + if (doipMessage.header.parameters.attributes.has("offset")) { + offset = doipMessage.header.parameters.attributes.get("offset").getAsInt(); + } + int count = 10; + if (doipMessage.header.parameters.attributes.has("count")) { + count = doipMessage.header.parameters.attributes.get("count").getAsInt(); + } + builder.setBody(pool.getDoEvents(offset, count)); + } else if (retrieveType.equals("DoId")) { + int offset = 0; + if (doipMessage.header.parameters.attributes.has("offset")) { + offset = doipMessage.header.parameters.attributes.get("offset").getAsInt(); + } + int count = 10; + if (doipMessage.header.parameters.attributes.has("count")) { + count = doipMessage.header.parameters.attributes.get("count").getAsInt(); } - } else { - int offset = doipMessage.header.parameters.attributes.get("offset").getAsInt(); - int count = doipMessage.header.parameters.attributes.get("count").getAsInt(); RocksIterator iter = Storage.doTable.newIterator(); iter.seekToFirst(); for (int i = 0; i < offset && iter.isValid(); i++) iter.next(); JsonArray array = new JsonArray(); - for (int i = 0; i < count && iter.isValid();) { - iter.next(); - array.add(repoId + "/" + new String(iter.key())); + if (count != 0) { + for (int i = 0; i < count && iter.isValid(); i++, iter.next()) { + array.add(repoId + "/" + new String(iter.key())); + } + } else { + for (; iter.isValid(); iter.next()) { + array.add(repoId + "/" + new String(iter.key())); + } } builder.addAttributes("bodyBase64Encoded", false); builder.setBody(array.toString().getBytes()); + } else { + if (!doipMessage.header.parameters.attributes.has("offset") + && !doipMessage.header.parameters.attributes.has("count") + && retrieveType.equals("")) { + builder.setBody(Storage.doTable.get(suffix).getBytes()); + } else { + int offset = 0; + if (doipMessage.header.parameters.attributes.has("offset")) { + offset = doipMessage.header.parameters.attributes.get("offset").getAsInt(); + } + int count = 10; + if (doipMessage.header.parameters.attributes.has("count")) { + count = doipMessage.header.parameters.attributes.get("count").getAsInt(); + } + RocksIterator iter = Storage.doTable.newIterator(); + iter.seekToFirst(); + for (int i = 0; i < offset && iter.isValid(); i++) + iter.next(); + JsonArray array = new JsonArray(); + if (count != 0) { + for (int i = 0; i < count && iter.isValid(); i++, iter.next()) { + JsonObject jo = new JsonObject(); + jo.addProperty(repoId + "/" + new String(iter.key()), + new String(iter.value())); + array.add(jo); + } + } else { + for (; iter.isValid(); iter.next()) { + JsonObject jo = new JsonObject(); + jo.addProperty(repoId + "/" + new String(iter.key()), + new String(iter.value())); + array.add(jo); + } + } + builder.addAttributes("bodyBase64Encoded", false); + builder.setBody(array.toString().getBytes()); + } } return builder.create(); } catch (Exception e) { diff --git a/src/main/java/org/bdware/sc/repo/PersistencePublisher.java b/src/main/java/org/bdware/sc/repo/PersistencePublisher.java index 213b08d1782c479cb51db92dd9f35a384518ea4d..25538891f5ba914d0d4bcdca294c5afab87c5533 100644 --- a/src/main/java/org/bdware/sc/repo/PersistencePublisher.java +++ b/src/main/java/org/bdware/sc/repo/PersistencePublisher.java @@ -169,4 +169,27 @@ public class PersistencePublisher implements Publisher { }); }).start(); } + + public JsonArray getDoEvents(int offset, int count) { + RocksIterator iter = storageManager.newIterator(); + iter.seekToFirst(); + JsonArray ja = new JsonArray(); + for (int i = 0; i < offset && iter.isValid(); i++) { + iter.next(); + } + if (count != 0) { + for (int i = 0; i < count && iter.isValid(); i++, iter.next()) { + JsonObject jo = new JsonObject(); + jo.addProperty(new String(iter.key()), new String(iter.value())); + ja.add(jo); + } + } else { + for (; iter.isValid(); iter.next()) { + JsonObject jo = new JsonObject(); + jo.addProperty(new String(iter.key()), new String(iter.value())); + ja.add(jo); + } + } + return ja; + } } diff --git a/src/main/java/org/bdware/sc/repo/merkel/RepoEventHandler.java b/src/main/java/org/bdware/sc/repo/merkel/RepoEventHandler.java index 7a7aefeca6cdf4cd5930f55ca26ee61734fd42a8..8c50d5b60e7d5a2123f33beb402965c2af9b34cd 100644 --- a/src/main/java/org/bdware/sc/repo/merkel/RepoEventHandler.java +++ b/src/main/java/org/bdware/sc/repo/merkel/RepoEventHandler.java @@ -29,4 +29,8 @@ public class RepoEventHandler { public void publish(DoipMessage message) { publisher.publish(this.topicId, message); } + + public byte[] getDoEvents(int offset, int count) { + return publisher.getDoEvents(offset, count).toString().getBytes(); + } }