Native UUID factory fully implemented.
authorMathieu Baudier <mbaudier@argeo.org>
Mon, 31 Jan 2022 07:27:49 +0000 (08:27 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Mon, 31 Jan 2022 07:27:49 +0000 (08:27 +0100)
org.argeo.api.uuid/jni/.cproject
org.argeo.api.uuid/jni/.project
org.argeo.api.uuid/jni/org_argeo_api_uuid/org_argeo_api_uuid_NativeUuidFactory.c
org.argeo.api.uuid/src/org/argeo/api/uuid/NativeUuidFactory.java

index 8ebb27348dbc15bdddc2a260f1a1adef96571774..8467d732b039e97bd4bc631f64ac7a0e8304bcdc 100644 (file)
@@ -41,7 +41,7 @@
                                                                                
                             <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.targetPlatform.gnu.cross.2070205849" isAbstract="false" osList="all" superClass="cdt.managedbuild.targetPlatform.gnu.cross"/>
                                                                                
-                            <builder id="cdt.managedbuild.builder.gnu.cross.1468217036" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="cdt.managedbuild.builder.gnu.cross"/>
+                            <builder enableAutoBuild="true" id="cdt.managedbuild.builder.gnu.cross.1468217036" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="cdt.managedbuild.builder.gnu.cross"/>
                                                                                
                             <tool id="cdt.managedbuild.tool.gnu.cross.c.compiler.453851306" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler">
                                                                                                
        
     <storageModule moduleId="refreshScope" versionNumber="2">
                        
+        <configuration configurationName="Linux x86_64"/>
+                       
         <configuration configurationName="Default">
                                
             <resource resourceType="PROJECT" workspacePath="/Java_org_argeo_api_uuid"/>
index f8321d76e50c3ada6d8bc56a1a3af1af7c829da3..74fde08ced997ab9320ec1bc83acc3e4940efd72 100644 (file)
@@ -7,7 +7,6 @@
        <buildSpec>
                <buildCommand>
                        <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
-                       <triggers>clean,full,incremental,</triggers>
                        <arguments>
                        </arguments>
                </buildCommand>
index faad90602e289838bf6eac19ef967c5e93fa1105..714abeb069ac7082e08c39381d1472b637190d3b 100644 (file)
@@ -3,18 +3,13 @@
 #include "org_argeo_api_uuid_NativeUuidFactory.h"
 
 /*
- * Class:     org_argeo_api_uuid_NativeUuidFactory
- * Method:    timeUUID
- * Signature: ()Ljava/util/UUID;
+ * UTILITIES
  */
-JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_timeUUID(
-               JNIEnv *env, jobject) {
-       uuid_t out;
+
+static inline jobject fromBytes(JNIEnv *env, uuid_t out) {
        jlong msb = 0;
        jlong lsb = 0;
 
-       uuid_generate_time(out);
-
        for (int i = 0; i < 8; i++)
                msb = (msb << 8) | (out[i] & 0xff);
        for (int i = 8; i < 16; i++)
@@ -30,16 +25,56 @@ JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_timeUUID(
        return jUUID;
 }
 
+static inline void toBytes(JNIEnv *env, jobject jUUID, uuid_t result) {
+
+       jclass uuidClass = (*env)->FindClass(env, "java/util/UUID");
+       jmethodID getMostSignificantBits = (*env)->GetMethodID(env, uuidClass,
+                       "getMostSignificantBits", "()J");
+       jmethodID getLeastSignificantBits = (*env)->GetMethodID(env, uuidClass,
+                       "getLeastSignificantBits", "()J");
+
+       jlong msb = (*env)->CallLongMethod(env, jUUID, getMostSignificantBits);
+       jlong lsb = (*env)->CallLongMethod(env, jUUID, getLeastSignificantBits);
+
+       for (int i = 0; i < 8; i++)
+               result[i] = (unsigned char) ((msb >> ((7 - i) * 8)) & 0xff);
+       for (int i = 8; i < 16; i++)
+               result[i] = (unsigned char) ((lsb >> ((15 - i) * 8)) & 0xff);
+}
+
+/*
+ * JNI IMPLEMENTATION
+ */
+
+/*
+ * Class:     org_argeo_api_uuid_NativeUuidFactory
+ * Method:    timeUUID
+ * Signature: ()Ljava/util/UUID;
+ */
+JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_timeUUID(
+               JNIEnv *env, jobject) {
+       uuid_t out;
+
+       uuid_generate_time(out);
+       return fromBytes(env, out);
+}
+
 /*
  * Class:     org_argeo_api_uuid_NativeUuidFactory
  * Method:    nameUUIDv5
  * Signature: (Ljava/util/UUID;[B)Ljava/util/UUID;
  */
 JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_nameUUIDv5(
-               JNIEnv *env, jobject, jobject, jbyteArray name) {
-       size_t length = (*env)->GetArrayLength(env, name);
+               JNIEnv *env, jobject, jobject namespaceUuid, jbyteArray name) {
+       uuid_t ns;
+       uuid_t out;
+
+       toBytes(env, namespaceUuid, ns);
+       jsize length = (*env)->GetArrayLength(env, name);
        jbyte *bytes = (*env)->GetByteArrayElements(env, name, 0);
-       return NULL;
+
+       uuid_generate_sha1(out, ns, bytes, length);
+       return fromBytes(env, out);
 }
 
 /*
@@ -48,8 +83,16 @@ JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_nameUUIDv5(
  * Signature: (Ljava/util/UUID;[B)Ljava/util/UUID;
  */
 JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_nameUUIDv3(
-               JNIEnv *env, jobject, jobject, jbyteArray) {
-       return NULL;
+               JNIEnv *env, jobject, jobject namespaceUuid, jbyteArray name) {
+       uuid_t ns;
+       uuid_t out;
+
+       toBytes(env, namespaceUuid, ns);
+       jsize length = (*env)->GetArrayLength(env, name);
+       jbyte *bytes = (*env)->GetByteArrayElements(env, name, 0);
+
+       uuid_generate_md5(out, ns, bytes, length);
+       return fromBytes(env, out);
 }
 
 /*
@@ -62,61 +105,5 @@ JNIEXPORT jobject JNICALL Java_org_argeo_api_uuid_NativeUuidFactory_randomUUIDSt
        uuid_t out;
 
        uuid_generate_random(out);
-       return NULL;
+       return fromBytes(env, out);
 }
-
-//     void fromBytes(JNIEnv *env, jobject jUUID, jmethodID uuidConstructor, uuid_t out){
-//             jlong msb = 0;
-//             jlong lsb = 0;
-//
-//             for (int i = 0; i < 8; i++)
-//                     msb = (msb << 8) | (out[i] & 0xff);
-//             for (int i = 8; i < 16; i++)
-//                     lsb = (lsb << 8) | (out[i] & 0xff);
-//
-//             (*env)->CallVoidMethod(env, jUUID, uuidConstructor, msb, lsb);
-//
-//     }
-
-//     void getMostSignificantBits(uuid_t out) {
-//             jlong msb = 0;
-//             for (int i = 0; i < 8; i++)
-//                     msb = (msb << 8) | (out[i] & 0xff);
-//             return msb;
-//     }
-//
-//     jlong getLeastSignificantBits(uuid_t out) {
-//             jlong lsb = 0;
-//             for (int i = 8; i < 16; i++)
-//                     lsb = (lsb << 8) | (out[i] & 0xff);
-//             return lsb;
-//     }
-//
-//     jobject fromBits(JNIEnv *env, jlong msb, jlong lsb) {
-//             jclass uuidClass = (*env)->FindClass(env, "java/util/UUID");
-//             jmethodID uuidConstructor = (*env)->GetMethodID(env, uuidClass,
-//                             "<init>", "(JJ)V");
-//
-//             jobject jUUID = (*env)->AllocObject(env, uuidClass);
-//             (*env)->CallVoidMethod(env, jUUID, uuidConstructor, msb, lsb);
-//             return jUUID;
-//     }
-
-//     uuid_t toBytes(JNIEnv *env, jobject jUUID) {
-//             uuid_t result;
-//
-//             jclass uuidClass = (*env)->FindClass(env, "java/util/UUID");
-//             jmethodID getMostSignificantBits = (*env)->GetMethodID(env, uuidClass,
-//                             "getMostSignificantBits", "J");
-//             jmethodID getLeastSignificantBits = (*env)->GetMethodID(env, uuidClass,
-//                             "getLeastSignificantBits", "J");
-//
-//             jlong msb = (*env)->CallLongMethod(env, jUUID, getMostSignificantBits);
-//             jlong lsb = (*env)->CallLongMethod(env, jUUID, getMostSignificantBits);
-//
-//             for (int i = 0; i < 8; i++)
-//                     result[i] = (unsigned char) ((msb >> ((7 - i) * 8)) & 0xff);
-//             for (int i = 8; i < 16; i++)
-//                     result[i] = (unsigned char) ((lsb >> ((15 - i) * 8)) & 0xff);
-//             return result;
-//     }
index cc7b367d6509f350485b54e123b11008271c12d4..0c6088aa2d0fbe0a35aaedbf6069823f230fee54 100644 (file)
@@ -27,7 +27,7 @@ public class NativeUuidFactory implements UuidFactory, TypedUuidFactory {
 
        @Override
        public UUID randomUUIDWeak() {
-               throw new UnsupportedOperationException();
+               return randomUUIDStrong();
        }
 
 }