From 4861ec5a40aef22189f8bd00011da6924c4e50c7 Mon Sep 17 00:00:00 2001 From: Brenton Bostick Date: Tue, 31 Jan 2023 13:40:17 -0500 Subject: [PATCH] make NodeStatus a plain data class --- java/jni/ZT_jnicache.cpp | 10 +--- java/jni/ZT_jnicache.h | 4 -- java/jni/ZT_jniutils.cpp | 31 ++++++++++++ java/jni/ZT_jniutils.h | 2 + java/jni/com_zerotierone_sdk_Node.cpp | 32 +----------- java/src/com/zerotier/sdk/NodeStatus.java | 59 +++++++++++++++-------- 6 files changed, 75 insertions(+), 63 deletions(-) diff --git a/java/jni/ZT_jnicache.cpp b/java/jni/ZT_jnicache.cpp index 86f61e106..16b2add65 100644 --- a/java/jni/ZT_jnicache.cpp +++ b/java/jni/ZT_jnicache.cpp @@ -114,10 +114,6 @@ jmethodID VirtualNetworkType_fromInt_method; // Instance fields // -jfieldID NodeStatus_address_field; -jfieldID NodeStatus_online_field; -jfieldID NodeStatus_publicIdentity_field; -jfieldID NodeStatus_secretIdentity_field; jfieldID Node_configListener_field; jfieldID Node_eventListener_field; jfieldID Node_frameListener_field; @@ -218,7 +214,7 @@ void setupJNICache(JavaVM *vm) { EXCEPTIONANDNULLCHECK(InetSocketAddress_ctor = env->GetMethodID(InetSocketAddress_class, "", "(Ljava/net/InetAddress;I)V")); EXCEPTIONANDNULLCHECK(InetSocketAddress_getAddress_method = env->GetMethodID(InetSocketAddress_class, "getAddress", "()Ljava/net/InetAddress;")); EXCEPTIONANDNULLCHECK(InetSocketAddress_getPort_method = env->GetMethodID(InetSocketAddress_class, "getPort", "()I")); - EXCEPTIONANDNULLCHECK(NodeStatus_ctor = env->GetMethodID(NodeStatus_class, "", "()V")); + EXCEPTIONANDNULLCHECK(NodeStatus_ctor = env->GetMethodID(NodeStatus_class, "", "(JLjava/lang/String;Ljava/lang/String;Z)V")); EXCEPTIONANDNULLCHECK(PacketSender_onSendPacketRequested_method = env->GetMethodID(PacketSender_class, "onSendPacketRequested", "(JLjava/net/InetSocketAddress;[BI)I")); EXCEPTIONANDNULLCHECK(PathChecker_onPathCheck_method = env->GetMethodID(PathChecker_class, "onPathCheck", "(JJLjava/net/InetSocketAddress;)Z")); EXCEPTIONANDNULLCHECK(PathChecker_onPathLookup_method = env->GetMethodID(PathChecker_class, "onPathLookup", "(JI)Ljava/net/InetSocketAddress;")); @@ -247,10 +243,6 @@ void setupJNICache(JavaVM *vm) { // Instance fields // - EXCEPTIONANDNULLCHECK(NodeStatus_address_field = env->GetFieldID(NodeStatus_class, "address", "J")); - EXCEPTIONANDNULLCHECK(NodeStatus_online_field = env->GetFieldID(NodeStatus_class, "online", "Z")); - EXCEPTIONANDNULLCHECK(NodeStatus_publicIdentity_field = env->GetFieldID(NodeStatus_class, "publicIdentity", "Ljava/lang/String;")); - EXCEPTIONANDNULLCHECK(NodeStatus_secretIdentity_field = env->GetFieldID(NodeStatus_class, "secretIdentity", "Ljava/lang/String;")); EXCEPTIONANDNULLCHECK(Node_configListener_field = env->GetFieldID(Node_class, "configListener", "Lcom/zerotier/sdk/VirtualNetworkConfigListener;")); EXCEPTIONANDNULLCHECK(Node_eventListener_field = env->GetFieldID(Node_class, "eventListener", "Lcom/zerotier/sdk/EventListener;")); EXCEPTIONANDNULLCHECK(Node_frameListener_field = env->GetFieldID(Node_class, "frameListener", "Lcom/zerotier/sdk/VirtualNetworkFrameListener;")); diff --git a/java/jni/ZT_jnicache.h b/java/jni/ZT_jnicache.h index e9d553f00..12f9f7301 100644 --- a/java/jni/ZT_jnicache.h +++ b/java/jni/ZT_jnicache.h @@ -83,10 +83,6 @@ extern jmethodID VirtualNetworkType_fromInt_method; // Instance fields // -extern jfieldID NodeStatus_address_field; -extern jfieldID NodeStatus_online_field; -extern jfieldID NodeStatus_publicIdentity_field; -extern jfieldID NodeStatus_secretIdentity_field; extern jfieldID Node_configListener_field; extern jfieldID Node_eventListener_field; extern jfieldID Node_frameListener_field; diff --git a/java/jni/ZT_jniutils.cpp b/java/jni/ZT_jniutils.cpp index 128b30097..5f4b1f702 100644 --- a/java/jni/ZT_jniutils.cpp +++ b/java/jni/ZT_jniutils.cpp @@ -428,3 +428,34 @@ jobject newVirtualNetworkDNS(JNIEnv *env, const ZT_VirtualNetworkDNS &dns) } return NULL; } + +jobject newNodeStatus(JNIEnv *env, const ZT_NodeStatus &status) { + + jstring pubIdentStr = env->NewStringUTF(status.publicIdentity); + if(env->ExceptionCheck() || pubIdentStr == NULL) + { + LOGE("Exception creating new string"); + return NULL; + } + + jstring secIdentStr = env->NewStringUTF(status.secretIdentity); + if(env->ExceptionCheck() || secIdentStr == NULL) + { + LOGE("Exception creating new string"); + return NULL; + } + + jobject nodeStatusObj = env->NewObject( + NodeStatus_class, + NodeStatus_ctor, + status.address, + pubIdentStr, + secIdentStr, + status.online); + if(env->ExceptionCheck() || nodeStatusObj == NULL) { + LOGE("Exception creating new NodeStatus"); + return NULL; + } + + return nodeStatusObj; +} diff --git a/java/jni/ZT_jniutils.h b/java/jni/ZT_jniutils.h index 3a9b227f1..164030ee5 100644 --- a/java/jni/ZT_jniutils.h +++ b/java/jni/ZT_jniutils.h @@ -96,4 +96,6 @@ jobject newVirtualNetworkRoute(JNIEnv *env, const ZT_VirtualNetworkRoute &route) jobject newVirtualNetworkDNS(JNIEnv *env, const ZT_VirtualNetworkDNS &dns); +jobject newNodeStatus(JNIEnv *env, const ZT_NodeStatus &status); + #endif // ZT_jniutils_h_ diff --git a/java/jni/com_zerotierone_sdk_Node.cpp b/java/jni/com_zerotierone_sdk_Node.cpp index e9686c302..6e524c48c 100644 --- a/java/jni/com_zerotierone_sdk_Node.cpp +++ b/java/jni/com_zerotierone_sdk_Node.cpp @@ -1126,41 +1126,11 @@ JNIEXPORT jobject JNICALL Java_com_zerotier_sdk_Node_status { int64_t nodeId = (int64_t) id; ZT_Node *node = findNode(nodeId); - if(node == NULL) - { - // cannot find valid node. We should never get here. - return 0; - } - - // create a com.zerotier.sdk.NodeStatus object - jobject nodeStatusObj = env->NewObject(NodeStatus_class, NodeStatus_ctor); - if(nodeStatusObj == NULL) - { - return NULL; - } ZT_NodeStatus nodeStatus; ZT_Node_status(node, &nodeStatus); - env->SetLongField(nodeStatusObj, NodeStatus_address_field, nodeStatus.address); - - jstring pubIdentStr = env->NewStringUTF(nodeStatus.publicIdentity); - if(pubIdentStr == NULL) - { - return NULL; // out of memory - } - env->SetObjectField(nodeStatusObj, NodeStatus_publicIdentity_field, pubIdentStr); - - jstring secIdentStr = env->NewStringUTF(nodeStatus.secretIdentity); - if(secIdentStr == NULL) - { - return NULL; // out of memory - } - env->SetObjectField(nodeStatusObj, NodeStatus_secretIdentity_field, secIdentStr); - - env->SetBooleanField(nodeStatusObj, NodeStatus_online_field, nodeStatus.online); - - return nodeStatusObj; + return newNodeStatus(env, nodeStatus); } /* diff --git a/java/src/com/zerotier/sdk/NodeStatus.java b/java/src/com/zerotier/sdk/NodeStatus.java index 11e49ade1..1172650b1 100644 --- a/java/src/com/zerotier/sdk/NodeStatus.java +++ b/java/src/com/zerotier/sdk/NodeStatus.java @@ -27,43 +27,64 @@ package com.zerotier.sdk; -public final class NodeStatus { - private long address; - private String publicIdentity; - private String secretIdentity; - private boolean online; +import com.zerotier.sdk.util.StringUtils; - private NodeStatus() {} +/** + * Current node status + * + * Defined in ZeroTierOne.h as ZT_NodeStatus + */ +public class NodeStatus { + + private final long address; + + private final String publicIdentity; + + private final String secretIdentity; + + private final boolean online; + + public NodeStatus(long address, String publicIdentity, String secretIdentity, boolean online) { + this.address = address; + this.publicIdentity = publicIdentity; + this.secretIdentity = secretIdentity; + this.online = online; + } + + @Override + public String toString() { + return "NodeStatus(" + StringUtils.addressToString(address) + ", " + publicIdentity + ", " + secretIdentity + ", " + online + ")"; + } /** * 40-bit ZeroTier address of this node */ - public final long getAddress() { - return address; - } + public long getAddress() { + return address; + } /** * Public identity in string-serialized form (safe to send to others) * *

This identity will remain valid as long as the node exists.

*/ - public final String getPublicIdentity() { - return publicIdentity; - } + public String getPublicIdentity() { + return publicIdentity; + } /** * Full identity including secret key in string-serialized form * *

This identity will remain valid as long as the node exists.

*/ - public final String getSecretIdentity() { - return secretIdentity; - } + public String getSecretIdentity() { + return secretIdentity; + } /** * True if some kind of connectivity appears available */ - public final boolean isOnline() { - return online; - } -} \ No newline at end of file + public boolean isOnline() { + return online; + } +}