usr/src/lib/libzfs_jni/common/libzfs_jni_property.c
changeset 1066 7ebdc59e2074
parent 789 b348f31ed315
child 1206 84469f0f684d
--- a/usr/src/lib/libzfs_jni/common/libzfs_jni_property.c	Thu Dec 08 13:38:16 2005 -0800
+++ b/usr/src/lib/libzfs_jni/common/libzfs_jni_property.c	Thu Dec 08 17:00:18 2005 -0800
@@ -31,26 +31,52 @@
 #include <strings.h>
 
 /*
+ * Types
+ */
+
+/* Signature for function to convert string to a specific Java object */
+typedef jobject (*str_to_obj_f)(JNIEnv *, char *);
+
+/* Signature for function to convert uint64_t to a specific Java object */
+typedef jobject (*uint64_to_obj_f)(JNIEnv *, uint64_t);
+
+/*
+ * Describes a property and the parameters needed to create a Java
+ * Property object for it
+ */
+typedef struct custom_prop_desct {
+	zfs_prop_t prop;
+	str_to_obj_f convert_str;
+	uint64_to_obj_f convert_uint64;
+	char *propClass;
+	char *valueClass;
+} custom_prop_desct_t;
+
+/*
  * Function prototypes
  */
 
+static jobject create_BasicProperty(JNIEnv *, zfs_handle_t *,
+    zfs_prop_t, str_to_obj_f, uint64_to_obj_f, char *, char *);
 static jobject create_BooleanProperty(JNIEnv *, zfs_handle_t *, zfs_prop_t);
-static jobject create_ChecksumProperty(JNIEnv *, zfs_handle_t *);
-static jobject create_CompressionProperty(JNIEnv *, zfs_handle_t *);
-static jobject create_DateProperty(JNIEnv *, zfs_handle_t *, zfs_prop_t);
 static jobject create_LongProperty(JNIEnv *, zfs_handle_t *, zfs_prop_t);
-static jobject create_RecordSizeProperty(JNIEnv *, zfs_handle_t *);
 static jobject create_StringProperty(JNIEnv *, zfs_handle_t *, zfs_prop_t);
-static jobject str_to_checksum(JNIEnv *, char *);
-static jobject str_to_compression(JNIEnv *, char *);
+static jobject create_ObjectProperty(JNIEnv *, zfs_handle_t *,
+    zfs_prop_t, str_to_obj_f, uint64_to_obj_f, char *, char *);
+static jobject create_default_BasicProperty(JNIEnv *, zfs_prop_t,
+    str_to_obj_f, uint64_to_obj_f, char *, char *);
 static jobject create_default_BooleanProperty(JNIEnv *, zfs_prop_t);
 static jobject create_default_LongProperty(JNIEnv *, zfs_prop_t);
 static jobject create_default_StringProperty(JNIEnv *, zfs_prop_t);
-static jobject create_default_MountPointProperty(JNIEnv *);
-static jobject create_default_ShareNFSProperty(JNIEnv *);
-static jobject create_default_ChecksumProperty(JNIEnv *);
-static jobject create_default_CompressionProperty(JNIEnv *);
-static jobject create_default_RecordSizeProperty(JNIEnv *);
+static jobject create_default_ObjectProperty(
+    JNIEnv *, zfs_prop_t, str_to_obj_f, uint64_to_obj_f, char *, char *);
+static jobject str_to_enum_element(JNIEnv *, char *, char *);
+static jobject str_to_aclinherit(JNIEnv *, char *);
+static jobject str_to_aclmode(JNIEnv *, char *);
+static jobject str_to_checksum(JNIEnv *, char *);
+static jobject str_to_compression(JNIEnv *, char *);
+static jobject str_to_snapdir(JNIEnv *, char *);
+static jobject str_to_string(JNIEnv *, char *);
 
 /*
  * Static data
@@ -69,8 +95,8 @@
 
 zfs_prop_t props_long[] = {
 	ZFS_PROP_AVAILABLE,
+	ZFS_PROP_CREATETXG,
 	ZFS_PROP_QUOTA,
-	/*	ZFS_PROP_RATIO, */
 	ZFS_PROP_REFERENCED,
 	ZFS_PROP_RESERVATION,
 	ZFS_PROP_USED,
@@ -80,60 +106,265 @@
 
 zfs_prop_t props_string[] = {
 	ZFS_PROP_ORIGIN,
-	/*	ZFS_PROP_TYPE, */
+	/* ZFS_PROP_TYPE, */
 	ZFS_PROP_INVAL
 };
 
+custom_prop_desct_t props_custom[] = {
+	{ ZFS_PROP_ACLINHERIT, str_to_aclinherit, NULL,
+	    ZFSJNI_PACKAGE_DATA "AclInheritProperty",
+	    ZFSJNI_PACKAGE_DATA "AclInheritProperty$AclInherit" },
+
+	{ ZFS_PROP_ACLMODE, str_to_aclmode, NULL,
+	    ZFSJNI_PACKAGE_DATA "AclModeProperty",
+	    ZFSJNI_PACKAGE_DATA "AclModeProperty$AclMode" },
+
+	{ ZFS_PROP_CHECKSUM, str_to_checksum, NULL,
+	    ZFSJNI_PACKAGE_DATA "ChecksumProperty",
+	    ZFSJNI_PACKAGE_DATA "ChecksumProperty$Checksum" },
+
+	{ ZFS_PROP_COMPRESSION, str_to_compression, NULL,
+	    ZFSJNI_PACKAGE_DATA "CompressionProperty",
+	    ZFSJNI_PACKAGE_DATA "CompressionProperty$Compression" },
+
+	{ ZFS_PROP_COMPRESSRATIO, NULL, zjni_long_to_Long,
+	    ZFSJNI_PACKAGE_DATA "CompressRatioProperty",
+	    "java/lang/Long" },
+
+	{ ZFS_PROP_CREATION, zjni_str_to_date, NULL,
+	    ZFSJNI_PACKAGE_DATA "CreationProperty",
+	    "java/util/Date" },
+
+	{ ZFS_PROP_MOUNTPOINT, str_to_string, NULL,
+	    ZFSJNI_PACKAGE_DATA "MountPointProperty",
+	    "java/lang/String" },
+
+	{ ZFS_PROP_RECORDSIZE, NULL, zjni_long_to_Long,
+	    ZFSJNI_PACKAGE_DATA "RecordSizeProperty",
+	    "java/lang/Long" },
+
+	{ ZFS_PROP_SHARENFS, str_to_string, NULL,
+	    ZFSJNI_PACKAGE_DATA "ShareNFSProperty",
+	    "java/lang/String" },
+
+	{ ZFS_PROP_SNAPDIR, str_to_snapdir, NULL,
+	    ZFSJNI_PACKAGE_DATA "SnapDirProperty",
+	    ZFSJNI_PACKAGE_DATA "SnapDirProperty$SnapDir" },
+
+	{ ZFS_PROP_VOLBLOCKSIZE, NULL, zjni_long_to_Long,
+	    ZFSJNI_PACKAGE_DATA "VolBlockSizeProperty",
+	    "java/lang/Long" },
+
+	{ ZFS_PROP_INVAL, NULL, NULL, NULL, NULL },
+};
+
 /*
  * Static functions
  */
 
 static jobject
-create_BooleanProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop)
+create_BasicProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop,
+    str_to_obj_f convert_str, uint64_to_obj_f convert_uint64,
+    char *propClass, char *valueClass)
 {
 	jobject propertyObject = NULL;
 	char source[ZFS_MAXNAMELEN];
-	uint64_t value;
 	zfs_source_t srctype;
+	jobject propValue = NULL;
+
+	if (convert_str != NULL) {
+	    char propbuf[ZFS_MAXPROPLEN];
+	    int result = zfs_prop_get(zhp, prop, propbuf,
+		sizeof (propbuf), &srctype, source, sizeof (source), 1);
 
-	int result = zfs_prop_get_numeric(zhp, prop, &value,
-	    &srctype, source, sizeof (source));
+	    if (result == 0) {
+		propValue = convert_str(env, propbuf);
+	    }
+	} else {
+	    uint64_t value;
+	    int result = zfs_prop_get_numeric(
+		zhp, prop, &value, &srctype, source, sizeof (source));
 
-	if (result == 0) {
-		jclass class_BooleanProperty = (*env)->FindClass(env,
-		    ZFSJNI_PACKAGE_DATA "BooleanProperty");
+	    if (result == 0) {
+		propValue = convert_uint64(env, value);
+	    }
+	}
+
+	if (propValue != NULL) {
+
+		jmethodID constructor;
+		char signature[1024];
+		jclass class = (*env)->FindClass(env, propClass);
 
 		jstring propName = (*env)->NewStringUTF(
 		    env, zfs_prop_to_name(prop));
-		jobject propValue = zjni_int_to_boolean(env, value);
+
 		jboolean readOnly = zfs_prop_readonly(prop) ?
 		    JNI_TRUE : JNI_FALSE;
 
-		jmethodID constructor_BooleanProperty;
-
 		if (srctype == ZFS_SRC_INHERITED) {
 
 			jstring propSource = (*env)->NewStringUTF(env, source);
-			constructor_BooleanProperty = (*env)->GetMethodID(
-			    env, class_BooleanProperty, "<init>",
-			    "(Ljava/lang/String;Ljava/lang/Boolean;ZL"
-			    "java/lang/String;)V");
+
+			(void) snprintf(signature, sizeof (signature),
+			    "(Ljava/lang/String;L%s;ZLjava/lang/String;)V",
+			    valueClass);
+
+			constructor = (*env)->GetMethodID(
+			    env, class, "<init>", signature);
 
 			propertyObject = (*env)->NewObject(
-			    env, class_BooleanProperty,
-			    constructor_BooleanProperty,
-			    propName, propValue, readOnly, propSource);
+			    env, class, constructor, propName, propValue,
+			    readOnly, propSource);
 		} else {
 			jobject lineage = zjni_get_lineage(env, srctype);
 
-			constructor_BooleanProperty = (*env)->GetMethodID(
-			    env, class_BooleanProperty, "<init>",
-			    "(Ljava/lang/String;Ljava/lang/Boolean;ZL"
-			    ZFSJNI_PACKAGE_DATA "Property$Lineage;)V");
+			(void) snprintf(signature, sizeof (signature),
+			    "(Ljava/lang/String;L%s;ZL"
+			    ZFSJNI_PACKAGE_DATA "Property$Lineage;)V",
+			    valueClass);
+
+			constructor = (*env)->GetMethodID(
+			    env, class, "<init>", signature);
 
 			propertyObject = (*env)->NewObject(
-			    env, class_BooleanProperty,
-			    constructor_BooleanProperty,
+			    env, class, constructor, propName, propValue,
+			    readOnly, lineage);
+		}
+	}
+
+	return (propertyObject);
+}
+
+static jobject
+create_BooleanProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop)
+{
+	return (create_BasicProperty(env, zhp, prop, NULL, zjni_int_to_boolean,
+	    ZFSJNI_PACKAGE_DATA "BooleanProperty", "java/lang/Boolean"));
+}
+
+static jobject
+create_LongProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop)
+{
+	return (create_BasicProperty(env, zhp, prop, NULL, zjni_long_to_Long,
+	    ZFSJNI_PACKAGE_DATA "LongProperty", "java/lang/Long"));
+}
+
+static jobject
+create_StringProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop)
+{
+	return (create_BasicProperty(env, zhp, prop, str_to_string, NULL,
+	    ZFSJNI_PACKAGE_DATA "StringProperty", "java/lang/String"));
+}
+
+static jobject
+create_ObjectProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop,
+    str_to_obj_f convert_str, uint64_to_obj_f convert_uint64,
+    char *propClass, char *valueClass)
+{
+	jobject propertyObject = NULL;
+	char source[ZFS_MAXNAMELEN];
+	zfs_source_t srctype;
+	jobject propValue = NULL;
+
+	if (convert_str != NULL) {
+	    char propbuf[ZFS_MAXPROPLEN];
+	    int result = zfs_prop_get(zhp, prop, propbuf,
+		sizeof (propbuf), &srctype, source, sizeof (source), 1);
+
+	    if (result == 0) {
+		propValue = convert_str(env, propbuf);
+	    }
+	} else {
+	    uint64_t value;
+	    int result = zfs_prop_get_numeric(
+		zhp, prop, &value, &srctype, source, sizeof (source));
+
+	    if (result == 0) {
+		propValue = convert_uint64(env, value);
+	    }
+	}
+
+	if (propValue != NULL) {
+
+		jmethodID constructor;
+		char signature[1024];
+		jclass class = (*env)->FindClass(env, propClass);
+
+		if (srctype == ZFS_SRC_INHERITED) {
+
+			jstring propSource = (*env)->NewStringUTF(env, source);
+
+			(void) snprintf(signature, sizeof (signature),
+			    "(L%s;Ljava/lang/String;)V", valueClass);
+
+			constructor = (*env)->GetMethodID(
+			    env, class, "<init>", signature);
+
+			propertyObject = (*env)->NewObject(env,
+			    class, constructor, propValue, propSource);
+
+		} else {
+			jobject lineage = zjni_get_lineage(env, srctype);
+
+			(void) snprintf(signature, sizeof (signature),
+			    "(L%s;L" ZFSJNI_PACKAGE_DATA "Property$Lineage;)V",
+			    valueClass);
+
+			constructor = (*env)->GetMethodID(
+			    env, class, "<init>", signature);
+
+			propertyObject = (*env)->NewObject(env,
+			    class, constructor, propValue, lineage);
+		}
+	}
+
+	return (propertyObject);
+}
+
+static jobject
+create_default_BasicProperty(JNIEnv *env, zfs_prop_t prop,
+    str_to_obj_f convert_str, uint64_to_obj_f convert_uint64,
+    char *propClass, char *valueClass)
+{
+	jobject propertyObject = NULL;
+
+	if (!zfs_prop_readonly(prop)) {
+		jobject propValue;
+
+		if (convert_str != NULL) {
+			char propbuf[ZFS_MAXPROPLEN];
+			zfs_prop_default_string(
+			    prop, propbuf, sizeof (propbuf));
+			propValue = convert_str(env, propbuf);
+		} else {
+			uint64_t value = zfs_prop_default_numeric(prop);
+			propValue = convert_uint64(env, value);
+		}
+
+		if (propValue != NULL) {
+			char signature[1024];
+			jmethodID constructor;
+
+			jstring propName =
+			    (*env)->NewStringUTF(env, zfs_prop_to_name(prop));
+
+			jboolean readOnly = zfs_prop_readonly(prop) ?
+			    JNI_TRUE : JNI_FALSE;
+
+			jclass class = (*env)->FindClass(env, propClass);
+			jobject lineage =
+			    zjni_get_lineage(env, ZFS_SRC_DEFAULT);
+
+			(void) snprintf(signature, sizeof (signature),
+			    "(Ljava/lang/String;L%s;ZL" ZFSJNI_PACKAGE_DATA
+			    "Property$Lineage;)V", valueClass);
+
+			constructor = (*env)->GetMethodID(
+			    env, class, "<init>", signature);
+
+			propertyObject = (*env)->NewObject(
+			    env, class, constructor,
 			    propName, propValue, readOnly, lineage);
 		}
 	}
@@ -142,238 +373,65 @@
 }
 
 static jobject
-create_ChecksumProperty(JNIEnv *env, zfs_handle_t *zhp)
+create_default_BooleanProperty(JNIEnv *env, zfs_prop_t prop)
 {
-	jobject propertyObject = NULL;
-	char propbuf[ZFS_MAXPROPLEN];
-	char source[ZFS_MAXNAMELEN];
-	zfs_source_t srctype;
-
-	int result = zfs_prop_get(zhp, ZFS_PROP_CHECKSUM,
-	    propbuf, sizeof (propbuf), &srctype, source, sizeof (source), 1);
-
-	if (result == 0) {
-		jobject propValue = str_to_checksum(env, propbuf);
-
-		if (propValue != NULL) {
-
-			jclass class_ChecksumProperty = (*env)->FindClass(env,
-			    ZFSJNI_PACKAGE_DATA "ChecksumProperty");
-
-			jmethodID constructor_ChecksumProperty;
-
-			if (srctype == ZFS_SRC_INHERITED) {
+	return (create_default_BasicProperty(env, prop, NULL,
+	    zjni_int_to_boolean, ZFSJNI_PACKAGE_DATA "BooleanProperty",
+	    "java/lang/Boolean"));
+}
 
-				jstring propSource = (*env)->NewStringUTF(env,
-				    source);
-				constructor_ChecksumProperty =
-				    (*env)->GetMethodID(
-					env, class_ChecksumProperty, "<init>",
-					"(L" ZFSJNI_PACKAGE_DATA
-					"ChecksumProperty$Checksum;Ljava/lang/"
-					"String;)V");
-
-				propertyObject = (*env)->NewObject(env,
-				    class_ChecksumProperty,
-				    constructor_ChecksumProperty,
-				    propValue, propSource);
+static jobject
+create_default_LongProperty(JNIEnv *env, zfs_prop_t prop)
+{
+	return (create_default_BasicProperty(env, prop, NULL,
+	    zjni_long_to_Long, ZFSJNI_PACKAGE_DATA "LongProperty",
+	    "java/lang/Long"));
+}
 
-			} else {
-				jobject lineage =
-				    zjni_get_lineage(env, srctype);
-				constructor_ChecksumProperty =
-				    (*env)->GetMethodID(
-					env, class_ChecksumProperty, "<init>",
-					"(L" ZFSJNI_PACKAGE_DATA
-					"ChecksumProperty$Checksum;L"
-					ZFSJNI_PACKAGE_DATA
-					"Property$Lineage;)V");
-
-				propertyObject = (*env)->NewObject(env,
-				    class_ChecksumProperty,
-				    constructor_ChecksumProperty,
-				    propValue, lineage);
-			}
-		}
-	}
-
-	return (propertyObject);
+static jobject
+create_default_StringProperty(JNIEnv *env, zfs_prop_t prop)
+{
+	return (create_default_BasicProperty(env, prop, str_to_string, NULL,
+	    ZFSJNI_PACKAGE_DATA "StringProperty", "java/lang/String"));
 }
 
 static jobject
-create_CompressionProperty(JNIEnv *env, zfs_handle_t *zhp)
-{
-	jobject propertyObject = NULL;
-	char propbuf[ZFS_MAXPROPLEN];
-	char source[ZFS_MAXNAMELEN];
-	zfs_source_t srctype;
-
-	int result = zfs_prop_get(zhp, ZFS_PROP_COMPRESSION,
-	    propbuf, sizeof (propbuf), &srctype, source, sizeof (source), 1);
-
-	if (result == 0) {
-		jobject propValue = str_to_compression(env, propbuf);
-
-		if (propValue != NULL) {
-
-			jclass class_CompressionProperty =
-			    (*env)->FindClass(env,
-				ZFSJNI_PACKAGE_DATA "CompressionProperty");
-
-			jmethodID constructor_CompressionProperty;
-
-			if (srctype == ZFS_SRC_INHERITED) {
-
-				jstring propSource = (*env)->NewStringUTF(env,
-				    source);
-				constructor_CompressionProperty =
-				    (*env)->GetMethodID(
-					env, class_CompressionProperty,
-					"<init>",
-					"(L" ZFSJNI_PACKAGE_DATA
-					"CompressionProperty$Compression;Ljava/"
-					"lang/String;)V");
-
-				propertyObject = (*env)->NewObject(env,
-				    class_CompressionProperty,
-				    constructor_CompressionProperty,
-				    propValue, propSource);
-			} else {
-				jobject lineage = zjni_get_lineage(env,
-				    srctype);
-
-				constructor_CompressionProperty =
-				    (*env)->GetMethodID(
-					env, class_CompressionProperty,
-					"<init>",
-					"(L" ZFSJNI_PACKAGE_DATA
-					"CompressionProperty$Compression;L"
-					ZFSJNI_PACKAGE_DATA
-					"Property$Lineage;)V");
-
-				propertyObject = (*env)->NewObject(env,
-				    class_CompressionProperty,
-				    constructor_CompressionProperty,
-				    propValue, lineage);
-			}
-		}
-	}
-
-	return (propertyObject);
-}
-
-static jobject
-create_DateProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop)
+create_default_ObjectProperty(JNIEnv *env, zfs_prop_t prop,
+    str_to_obj_f convert_str, uint64_to_obj_f convert_uint64,
+    char *propClass, char *valueClass)
 {
 	jobject propertyObject = NULL;
-	char propbuf[ZFS_MAXPROPLEN];
-	char source[ZFS_MAXNAMELEN];
-	zfs_source_t srctype;
 
-	int result = zfs_prop_get(zhp, prop, propbuf, sizeof (propbuf),
-	    &srctype, source, sizeof (source), 1);
-
-	if (result == 0) {
-
-		jobject propValue = zjni_str_to_date(env, propbuf);
-		if (propValue != NULL) {
-
-			jclass class_DateProperty = (*env)->FindClass(env,
-			    ZFSJNI_PACKAGE_DATA "DateProperty");
-
-			jstring propName = (*env)->NewStringUTF(
-			    env, zfs_prop_to_name(prop));
-			jboolean readOnly =
-			    zfs_prop_readonly(prop) ? JNI_TRUE : JNI_FALSE;
-
-			jmethodID constructor_DateProperty;
-
-			if (srctype == ZFS_SRC_INHERITED) {
+	if (!zfs_prop_readonly(prop)) {
+		jobject propValue;
 
-				jstring propSource = (*env)->NewStringUTF(env,
-				    source);
-				constructor_DateProperty = (*env)->GetMethodID(
-				    env, class_DateProperty, "<init>",
-				    "(Ljava/lang/String;Ljava/util/Date;ZL"
-				    "java/lang/String;)V");
-
-				propertyObject = (*env)->NewObject(
-				    env, class_DateProperty,
-				    constructor_DateProperty,
-				    propName, propValue, readOnly, propSource);
-			} else {
-				jobject lineage = zjni_get_lineage(env,
-				    srctype);
-
-				constructor_DateProperty = (*env)->GetMethodID(
-				    env, class_DateProperty, "<init>",
-				    "(Ljava/lang/String;Ljava/util/Date;ZL"
-				    ZFSJNI_PACKAGE_DATA "Property$Lineage;)V");
-
-				propertyObject = (*env)->NewObject(
-				    env, class_DateProperty,
-				    constructor_DateProperty,
-				    propName, propValue, readOnly, lineage);
-			}
+		if (convert_str != NULL) {
+			char propbuf[ZFS_MAXPROPLEN];
+			zfs_prop_default_string(
+			    prop, propbuf, sizeof (propbuf));
+			propValue = convert_str(env, propbuf);
+		} else {
+			uint64_t value = zfs_prop_default_numeric(prop);
+			propValue = convert_uint64(env, value);
 		}
-	}
 
-	return (propertyObject);
-}
-
-static jobject
-create_LongProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop)
-{
-	jobject propertyObject = NULL;
-	char propbuf[ZFS_MAXPROPLEN];
-	char source[ZFS_MAXNAMELEN];
-	zfs_source_t srctype;
+		if (propValue != NULL) {
+			char signature[1024];
+			jmethodID constructor;
 
-	int result = zfs_prop_get(zhp, prop, propbuf, sizeof (propbuf),
-	    &srctype, source, sizeof (source), 1);
-
-	if (result == 0) {
-
-		jobject propValue = zjni_str_to_long(env, propbuf);
-		if (propValue != NULL) {
-
-			jclass class_LongProperty = (*env)->FindClass(env,
-			    ZFSJNI_PACKAGE_DATA "LongProperty");
-
-			jstring propName = (*env)->NewStringUTF(
-			    env, zfs_prop_to_name(prop));
-			jboolean readOnly =
-			    zfs_prop_readonly(prop) ? JNI_TRUE : JNI_FALSE;
+			jclass class = (*env)->FindClass(env, propClass);
+			jobject lineage =
+			    zjni_get_lineage(env, ZFS_SRC_DEFAULT);
 
-			jmethodID constructor_LongProperty;
-
-			if (srctype == ZFS_SRC_INHERITED) {
-
-				jstring propSource =
-				    (*env)->NewStringUTF(env, source);
-				constructor_LongProperty = (*env)->GetMethodID(
-				    env, class_LongProperty, "<init>",
-				    "(Ljava/lang/String;Ljava/lang/Long;ZL"
-				    "java/lang/String;)V");
+			(void) snprintf(signature, sizeof (signature),
+			    "(L%s;L" ZFSJNI_PACKAGE_DATA "Property$Lineage;)V",
+			    valueClass);
 
-				propertyObject = (*env)->NewObject(
-				    env, class_LongProperty,
-				    constructor_LongProperty,
-				    propName, propValue, readOnly, propSource);
-			} else {
-				jobject lineage = zjni_get_lineage(env,
-				    srctype);
+			constructor = (*env)->GetMethodID(
+			    env, class, "<init>", signature);
 
-				constructor_LongProperty = (*env)->GetMethodID(
-				    env, class_LongProperty, "<init>",
-				    "(Ljava/lang/String;Ljava/lang/Long;ZL"
-				    ZFSJNI_PACKAGE_DATA "Property$Lineage;)V");
-
-				propertyObject = (*env)->NewObject(
-				    env, class_LongProperty,
-				    constructor_LongProperty,
-				    propName, propValue, readOnly, lineage);
-			}
+			propertyObject = (*env)->NewObject(
+			    env, class, constructor, propValue, lineage);
 		}
 	}
 
@@ -381,250 +439,68 @@
 }
 
 static jobject
-create_RecordSizeProperty(JNIEnv *env, zfs_handle_t *zhp)
+str_to_enum_element(JNIEnv *env, char *str, char *valueClass)
 {
-	jobject propertyObject = NULL;
-	char propbuf[ZFS_MAXPROPLEN];
-	char source[ZFS_MAXNAMELEN];
-	zfs_source_t srctype;
-
-	int result = zfs_prop_get(zhp, ZFS_PROP_RECORDSIZE,
-	    propbuf, sizeof (propbuf), &srctype, source, sizeof (source), 1);
+	char signature[1024];
+	jmethodID method_valueOf;
 
-	if (result == 0) {
-
-		jobject propValue = zjni_str_to_long(env, propbuf);
-		if (propValue != NULL) {
-
-			jclass class_RecordSizeProperty = (*env)->FindClass(env,
-			    ZFSJNI_PACKAGE_DATA "RecordSizeProperty");
-
-			jmethodID constructor_RecordSizeProperty;
-
-			if (srctype == ZFS_SRC_INHERITED) {
+	jstring utf = (*env)->NewStringUTF(env, str);
+	jclass class = (*env)->FindClass(env, valueClass);
 
-				jstring propSource =
-				    (*env)->NewStringUTF(env, source);
-				constructor_RecordSizeProperty =
-				    (*env)->GetMethodID(
-					env, class_RecordSizeProperty, "<init>",
-					"(Ljava/lang/Long;Ljava/lang/"
-					"String;)V");
-
-				propertyObject = (*env)->NewObject(env,
-				    class_RecordSizeProperty,
-				    constructor_RecordSizeProperty,
-				    propValue, propSource);
-			} else {
-				jobject lineage =
-				    zjni_get_lineage(env, srctype);
+	(void) snprintf(signature, sizeof (signature),
+	    "(Ljava/lang/String;)L%s;", valueClass);
 
-				constructor_RecordSizeProperty =
-				    (*env)->GetMethodID(
-					env, class_RecordSizeProperty, "<init>",
-					"(Ljava/lang/Long;L"
-					ZFSJNI_PACKAGE_DATA
-					"Property$Lineage;)V");
+	method_valueOf = (*env)->GetStaticMethodID(
+	    env, class, "valueOf", signature);
 
-				propertyObject = (*env)->NewObject(env,
-				    class_RecordSizeProperty,
-				    constructor_RecordSizeProperty,
-				    propValue, lineage);
-			}
-		}
-	}
-
-	return (propertyObject);
+	return (*env)->CallStaticObjectMethod(env, class, method_valueOf, utf);
 }
 
 static jobject
-create_StringProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop)
+str_to_aclinherit(JNIEnv *env, char *str)
 {
-	jobject propertyObject = NULL;
-	char propbuf[ZFS_MAXPROPLEN];
-	char source[ZFS_MAXNAMELEN];
-	zfs_source_t srctype;
-
-	int result = zfs_prop_get(zhp, prop, propbuf, sizeof (propbuf),
-	    &srctype, source, sizeof (source), 1);
-
-	if (result == 0) {
-		jmethodID constructor_StringProperty;
-
-		jclass class_StringProperty =
-		    (*env)->FindClass(env, ZFSJNI_PACKAGE_DATA
-			"StringProperty");
-
-		jstring propName =
-		    (*env)->NewStringUTF(env, zfs_prop_to_name(prop));
-
-		jobject propValue = (*env)->NewStringUTF(env, propbuf);
-		jboolean readOnly = zfs_prop_readonly(prop) ?
-		    JNI_TRUE : JNI_FALSE;
-
-		if (srctype == ZFS_SRC_INHERITED) {
-
-			jstring propSource = (*env)->NewStringUTF(env, source);
-			constructor_StringProperty = (*env)->GetMethodID(
-			    env, class_StringProperty, "<init>",
-			    "(Ljava/lang/String;Ljava/lang/String;ZL"
-			    "java/lang/String;)V");
-
-			propertyObject = (*env)->NewObject(
-			    env, class_StringProperty,
-			    constructor_StringProperty,
-			    propName, propValue, readOnly, propSource);
-		} else {
-			jobject lineage = zjni_get_lineage(env, srctype);
-
-			constructor_StringProperty = (*env)->GetMethodID(
-			    env, class_StringProperty, "<init>",
-			    "(Ljava/lang/String;Ljava/lang/String;ZL"
-			    ZFSJNI_PACKAGE_DATA "Property$Lineage;)V");
-
-			propertyObject = (*env)->NewObject(
-			    env, class_StringProperty,
-			    constructor_StringProperty,
-			    propName, propValue, readOnly, lineage);
-		}
-	}
-
-	return (propertyObject);
+	return (str_to_enum_element(env, str,
+	    ZFSJNI_PACKAGE_DATA "AclInheritProperty$AclInherit"));
 }
 
 static jobject
-create_MountPointProperty(JNIEnv *env, zfs_handle_t *zhp)
+str_to_aclmode(JNIEnv *env, char *str)
 {
-	jobject propertyObject = NULL;
-	char propbuf[ZFS_MAXPROPLEN];
-	char source[ZFS_MAXNAMELEN];
-	zfs_source_t srctype;
-
-	int result = zfs_prop_get(zhp, ZFS_PROP_MOUNTPOINT,
-	    propbuf, sizeof (propbuf), &srctype, source, sizeof (source), 1);
-
-	if (result == 0) {
-		jmethodID constructor_MountPointProperty;
-
-		jclass class_MountPointProperty = (*env)->FindClass(
-		    env, ZFSJNI_PACKAGE_DATA "MountPointProperty");
-
-		jobject propValue = (*env)->NewStringUTF(env, propbuf);
-
-		if (srctype == ZFS_SRC_INHERITED) {
-
-			jstring propSource = (*env)->NewStringUTF(env, source);
-			constructor_MountPointProperty = (*env)->GetMethodID(
-			    env, class_MountPointProperty, "<init>",
-			    "(Ljava/lang/String;Ljava/lang/String;)V");
-
-			propertyObject = (*env)->NewObject(env,
-			    class_MountPointProperty,
-			    constructor_MountPointProperty,
-			    propValue, propSource);
-		} else {
-			jobject lineage = zjni_get_lineage(env, srctype);
-
-			constructor_MountPointProperty = (*env)->GetMethodID(
-			    env, class_MountPointProperty, "<init>",
-			    "(Ljava/lang/String;L"
-			    ZFSJNI_PACKAGE_DATA "Property$Lineage;)V");
-
-			propertyObject = (*env)->NewObject(env,
-			    class_MountPointProperty,
-			    constructor_MountPointProperty,
-			    propValue, lineage);
-		}
-	}
-
-	return (propertyObject);
-}
-
-static jobject
-create_ShareNFSProperty(JNIEnv *env, zfs_handle_t *zhp)
-{
-	jobject propertyObject = NULL;
-	char propbuf[ZFS_MAXPROPLEN];
-	char source[ZFS_MAXNAMELEN];
-	zfs_source_t srctype;
-
-	int result = zfs_prop_get(zhp, ZFS_PROP_SHARENFS,
-	    propbuf, sizeof (propbuf), &srctype, source, sizeof (source), 1);
-
-	if (result == 0) {
-		jmethodID constructor_ShareNFSProperty;
-
-		jclass class_ShareNFSProperty = (*env)->FindClass(
-		    env, ZFSJNI_PACKAGE_DATA "ShareNFSProperty");
-
-		jobject propValue = (*env)->NewStringUTF(env, propbuf);
-
-		if (srctype == ZFS_SRC_INHERITED) {
-
-			jstring propSource = (*env)->NewStringUTF(env, source);
-			constructor_ShareNFSProperty = (*env)->GetMethodID(
-			    env, class_ShareNFSProperty, "<init>",
-			    "(Ljava/lang/String;Ljava/lang/String;)V");
-
-			propertyObject = (*env)->NewObject(
-			    env, class_ShareNFSProperty,
-			    constructor_ShareNFSProperty,
-			    propValue, propSource);
-		} else {
-			jobject lineage = zjni_get_lineage(env, srctype);
-
-			constructor_ShareNFSProperty = (*env)->GetMethodID(
-			    env, class_ShareNFSProperty, "<init>",
-			    "(Ljava/lang/String;L"
-			    ZFSJNI_PACKAGE_DATA "Property$Lineage;)V");
-
-			propertyObject = (*env)->NewObject(
-			    env, class_ShareNFSProperty,
-			    constructor_ShareNFSProperty,
-			    propValue, lineage);
-		}
-	}
-
-	return (propertyObject);
+	return (str_to_enum_element(env, str,
+	    ZFSJNI_PACKAGE_DATA "AclModeProperty$AclMode"));
 }
 
 static jobject
 str_to_checksum(JNIEnv *env, char *str)
 {
-	jclass class_Checksum = (*env)->FindClass(
-	    env, ZFSJNI_PACKAGE_DATA "ChecksumProperty$Checksum");
-
-	jmethodID method_valueOf = (*env)->GetStaticMethodID(
-	    env, class_Checksum, "valueOf",
-	    "(Ljava/lang/String;)L"
-	    ZFSJNI_PACKAGE_DATA "ChecksumProperty$Checksum;");
-
-	jstring utf = (*env)->NewStringUTF(env, str);
-
-	return (*env)->CallStaticObjectMethod(
-	    env, class_Checksum, method_valueOf, utf);
+	return (str_to_enum_element(env, str,
+	    ZFSJNI_PACKAGE_DATA "ChecksumProperty$Checksum"));
 }
 
 static jobject
 str_to_compression(JNIEnv *env, char *str)
 {
-	jclass class_Compression = (*env)->FindClass(
-	    env, ZFSJNI_PACKAGE_DATA "CompressionProperty$Compression");
+	return (str_to_enum_element(env, str,
+	    ZFSJNI_PACKAGE_DATA "CompressionProperty$Compression"));
+}
 
-	jmethodID method_valueOf = (*env)->GetStaticMethodID(
-	    env, class_Compression, "valueOf",
-	    "(Ljava/lang/String;)L"
-	    ZFSJNI_PACKAGE_DATA "CompressionProperty$Compression;");
+static jobject
+str_to_snapdir(JNIEnv *env, char *str)
+{
+	return (str_to_enum_element(env, str,
+	    ZFSJNI_PACKAGE_DATA "SnapDirProperty$SnapDir"));
+}
 
-	jstring utf = (*env)->NewStringUTF(env, str);
-
-	return (*env)->CallStaticObjectMethod(
-	    env, class_Compression, method_valueOf, utf);
+static jobject
+str_to_string(JNIEnv *env, char *str)
+{
+	return (*env)->NewStringUTF(env, str);
 }
 
 /*
  * Package-private functions
  */
+
 jobject
 zjni_get_default_property(JNIEnv *env, zfs_prop_t prop)
 {
@@ -647,24 +523,13 @@
 		}
 	}
 
-	if (prop == ZFS_PROP_MOUNTPOINT) {
-		return (create_default_MountPointProperty(env));
-	}
-
-	if (prop == ZFS_PROP_SHARENFS) {
-		return (create_default_ShareNFSProperty(env));
-	}
-
-	if (prop == ZFS_PROP_CHECKSUM) {
-		return (create_default_ChecksumProperty(env));
-	}
-
-	if (prop == ZFS_PROP_COMPRESSION) {
-		return (create_default_CompressionProperty(env));
-	}
-
-	if (prop == ZFS_PROP_RECORDSIZE) {
-		return (create_default_RecordSizeProperty(env));
+	for (i = 0; props_custom[i].prop != ZFS_PROP_INVAL; i++) {
+		if (prop == props_custom[i].prop) {
+		    return create_default_ObjectProperty(env,
+			props_custom[i].prop, props_custom[i].convert_str,
+			props_custom[i].convert_uint64,
+			props_custom[i].propClass, props_custom[i].valueClass);
+		}
 	}
 
 	return (NULL);
@@ -800,364 +665,30 @@
 		}
 	}
 
-	prop = create_MountPointProperty(env, zhp);
-	/* Does this property apply to this object? */
-	if (prop != NULL) {
-
-		(*env)->CallBooleanMethod(env,
-		    ((zjni_Object_t *)proplist)->object,
-		    ((zjni_Collection_t *)proplist)->method_add, prop);
-	} else {
-		if ((*env)->ExceptionOccurred(env) != NULL) {
-			return (NULL);
-		}
-#ifdef	DEBUG
-		(void) fprintf(stderr, "Property %s is not appropriate "
-		    "for %s\n", zfs_prop_to_name(ZFS_PROP_MOUNTPOINT),
-		    zfs_get_name(zhp));
-#endif
-	}
-
-	prop = create_ShareNFSProperty(env, zhp);
-	/* Does this property apply to this object? */
-	if (prop != NULL) {
-
-		(*env)->CallBooleanMethod(env,
-		    ((zjni_Object_t *)proplist)->object,
-		    ((zjni_Collection_t *)proplist)->method_add, prop);
-	} else {
-		if ((*env)->ExceptionOccurred(env) != NULL) {
-			return (NULL);
-		}
-#ifdef	DEBUG
-		(void) fprintf(stderr, "Property %s is not appropriate "
-		    "for %s\n", zfs_prop_to_name(ZFS_PROP_SHARENFS),
-		    zfs_get_name(zhp));
-#endif
-	}
-
-	prop = create_ChecksumProperty(env, zhp);
-	/* Does this property apply to this object? */
-	if (prop != NULL) {
+	for (i = 0; props_custom[i].prop != ZFS_PROP_INVAL; i++) {
+		/* Create property and add to list */
+		prop = create_ObjectProperty(env, zhp, props_custom[i].prop,
+		    props_custom[i].convert_str, props_custom[i].convert_uint64,
+		    props_custom[i].propClass, props_custom[i].valueClass);
 
-		(*env)->CallBooleanMethod(env,
-		    ((zjni_Object_t *)proplist)->object,
-		    ((zjni_Collection_t *)proplist)->method_add, prop);
-	} else {
-		if ((*env)->ExceptionOccurred(env) != NULL) {
-			return (NULL);
-		}
-#ifdef	DEBUG
-		(void) fprintf(stderr, "Property %s is not appropriate "
-		    "for %s\n", zfs_prop_to_name(ZFS_PROP_CHECKSUM),
-		    zfs_get_name(zhp));
-#endif
-	}
-
-	prop = create_CompressionProperty(env, zhp);
-	/* Does this property apply to this object? */
-	if (prop != NULL) {
+		/* Does this property apply to this object? */
+		if (prop != NULL) {
 
-		(*env)->CallBooleanMethod(env,
-		    ((zjni_Object_t *)proplist)->object,
-		    ((zjni_Collection_t *)proplist)->method_add, prop);
-	} else {
-		if ((*env)->ExceptionOccurred(env) != NULL) {
-			return (NULL);
-		}
-#ifdef	DEBUG
-		(void) fprintf(stderr, "Property %s is not appropriate "
-		    "for %s\n", zfs_prop_to_name(ZFS_PROP_COMPRESSION),
-		    zfs_get_name(zhp));
-#endif
-	}
-
-	prop = create_RecordSizeProperty(env, zhp);
-	/* Does this property apply to this object? */
-	if (prop != NULL) {
-
-		(*env)->CallBooleanMethod(env,
-		    ((zjni_Object_t *)proplist)->object,
-		    ((zjni_Collection_t *)proplist)->method_add, prop);
-	} else {
-		if ((*env)->ExceptionOccurred(env) != NULL) {
-			return (NULL);
-		}
+			(*env)->CallBooleanMethod(
+			    env, ((zjni_Object_t *)proplist)->object,
+			    ((zjni_Collection_t *)proplist)->method_add, prop);
+		} else {
+			if ((*env)->ExceptionOccurred(env) != NULL) {
+				return (NULL);
+			}
 #ifdef	DEBUG
-		(void) fprintf(stderr, "Property %s is not appropriate "
-		    "for %s\n", zfs_prop_to_name(ZFS_PROP_RECORDSIZE),
-		    zfs_get_name(zhp));
-#endif
-	}
-
-	prop = create_DateProperty(env, zhp, ZFS_PROP_CREATION);
-	/* Does this property apply to this object? */
-	if (prop != NULL) {
-
-		(*env)->CallBooleanMethod(env,
-		    ((zjni_Object_t *)proplist)->object,
-		    ((zjni_Collection_t *)proplist)->method_add, prop);
-	} else {
-		if ((*env)->ExceptionOccurred(env) != NULL) {
-			return (NULL);
-		}
-#ifdef	DEBUG
-		(void) fprintf(stderr, "Property %s is not appropriate "
-		    "for %s\n", zfs_prop_to_name(ZFS_PROP_CREATION),
-		    zfs_get_name(zhp));
+			(void) fprintf(stderr, "Property %s is not appropriate "
+			    "for %s\n", zfs_prop_to_name(props_custom[i].prop),
+			    zfs_get_name(zhp));
 #endif
-	}
-
-	return (zjni_Collection_to_array(
-	    env, (zjni_Collection_t *)proplist,
-	    ZFSJNI_PACKAGE_DATA "Property"));
-}
-
-static jobject
-create_default_BooleanProperty(JNIEnv *env, zfs_prop_t prop)
-{
-	jobject propertyObject = NULL;
-
-	if (!zfs_prop_readonly(prop)) {
-
-		jclass class_BooleanProperty = (*env)->FindClass(env,
-		    ZFSJNI_PACKAGE_DATA "BooleanProperty");
-
-		jmethodID constructor_BooleanProperty = (*env)->GetMethodID(
-		    env, class_BooleanProperty, "<init>",
-		    "(Ljava/lang/String;Ljava/lang/Boolean;ZL"
-		    ZFSJNI_PACKAGE_DATA "Property$Lineage;)V");
-
-		jstring propName =
-		    (*env)->NewStringUTF(env, zfs_prop_to_name(prop));
-		jobject propValue =
-		    zjni_int_to_boolean(env, zfs_prop_default_numeric(prop));
-		jboolean readOnly = zfs_prop_readonly(prop) ?
-		    JNI_TRUE : JNI_FALSE;
-		jobject lineage = zjni_get_lineage(env, ZFS_SRC_DEFAULT);
-
-		propertyObject = (*env)->NewObject(
-		    env, class_BooleanProperty, constructor_BooleanProperty,
-		    propName, propValue, readOnly, lineage);
-	}
-
-	return (propertyObject);
-}
-
-static jobject
-create_default_LongProperty(JNIEnv *env, zfs_prop_t prop)
-{
-	jobject propertyObject = NULL;
-
-	if (!zfs_prop_readonly(prop)) {
-
-		jclass class_LongProperty = (*env)->FindClass(env,
-		    ZFSJNI_PACKAGE_DATA "LongProperty");
-
-		jmethodID constructor_LongProperty = (*env)->GetMethodID(
-		    env, class_LongProperty, "<init>",
-		    "(Ljava/lang/String;Ljava/lang/Long;ZL"
-		    ZFSJNI_PACKAGE_DATA "Property$Lineage;)V");
-
-		jstring propName =
-		    (*env)->NewStringUTF(env, zfs_prop_to_name(prop));
-		jobject propValue =
-		    zjni_long_to_Long(env, zfs_prop_default_numeric(prop));
-		jboolean readOnly = zfs_prop_readonly(prop)
-		    ? JNI_TRUE : JNI_FALSE;
-		jobject lineage = zjni_get_lineage(env, ZFS_SRC_DEFAULT);
-
-		propertyObject = (*env)->NewObject(
-		    env, class_LongProperty, constructor_LongProperty,
-		    propName, propValue, readOnly, lineage);
+		}
 	}
 
-	return (propertyObject);
-}
-
-static jobject
-create_default_StringProperty(JNIEnv *env, zfs_prop_t prop)
-{
-	jobject propertyObject = NULL;
-
-	if (zfs_prop_is_string(prop) && !zfs_prop_readonly(prop)) {
-
-		char propbuf[ZFS_MAXPROPLEN];
-		jclass class_StringProperty;
-		jmethodID constructor_StringProperty;
-		jstring propName;
-		jobject propValue;
-		jboolean readOnly;
-		jobject lineage;
-
-		zfs_prop_default_string(prop, propbuf, sizeof (propbuf));
-
-		class_StringProperty =
-		    (*env)->FindClass(env,
-			ZFSJNI_PACKAGE_DATA "StringProperty");
-
-		constructor_StringProperty = (*env)->GetMethodID(
-		    env, class_StringProperty, "<init>",
-		    "(Ljava/lang/String;Ljava/lang/String;ZL"
-		    ZFSJNI_PACKAGE_DATA "Property$Lineage;)V");
-
-		propName = (*env)->NewStringUTF(env, zfs_prop_to_name(prop));
-		propValue = (*env)->NewStringUTF(env, propbuf);
-		readOnly = zfs_prop_readonly(prop) ? JNI_TRUE : JNI_FALSE;
-		lineage = zjni_get_lineage(env, ZFS_SRC_DEFAULT);
-
-		propertyObject = (*env)->NewObject(
-		    env, class_StringProperty, constructor_StringProperty,
-		    propName, propValue, readOnly, lineage);
-	}
-
-	return (propertyObject);
-}
-
-static jobject
-create_default_MountPointProperty(JNIEnv *env)
-{
-	jobject propertyObject = NULL;
-
-	char propbuf[ZFS_MAXPROPLEN];
-	jclass class_MountPointProperty;
-	jmethodID constructor_MountPointProperty;
-	jobject propValue;
-	jobject lineage;
-
-	zfs_prop_default_string(ZFS_PROP_MOUNTPOINT, propbuf, sizeof (propbuf));
-
-	class_MountPointProperty = (*env)->FindClass(
-	    env, ZFSJNI_PACKAGE_DATA "MountPointProperty");
-
-	propValue = (*env)->NewStringUTF(env, propbuf);
-	lineage = zjni_get_lineage(env, ZFS_SRC_DEFAULT);
-
-	constructor_MountPointProperty = (*env)->GetMethodID(
-	    env, class_MountPointProperty, "<init>",
-	    "(Ljava/lang/String;L"
-	    ZFSJNI_PACKAGE_DATA "Property$Lineage;)V");
-
-	propertyObject = (*env)->NewObject(
-	    env, class_MountPointProperty, constructor_MountPointProperty,
-	    propValue, lineage);
-
-	return (propertyObject);
+	return (zjni_Collection_to_array(env,
+	    (zjni_Collection_t *)proplist, ZFSJNI_PACKAGE_DATA "Property"));
 }
-
-static jobject
-create_default_ShareNFSProperty(JNIEnv *env)
-{
-	jobject propertyObject = NULL;
-
-	char propbuf[ZFS_MAXPROPLEN];
-	jclass class_ShareNFSProperty;
-	jmethodID constructor_ShareNFSProperty;
-	jobject propValue;
-	jobject lineage;
-
-	zfs_prop_default_string(ZFS_PROP_SHARENFS, propbuf, sizeof (propbuf));
-
-	class_ShareNFSProperty = (*env)->FindClass(
-	    env, ZFSJNI_PACKAGE_DATA "ShareNFSProperty");
-
-	propValue = (*env)->NewStringUTF(env, propbuf);
-	lineage = zjni_get_lineage(env, ZFS_SRC_DEFAULT);
-
-	constructor_ShareNFSProperty = (*env)->GetMethodID(
-	    env, class_ShareNFSProperty, "<init>",
-	    "(Ljava/lang/String;L"
-	    ZFSJNI_PACKAGE_DATA "Property$Lineage;)V");
-
-	propertyObject = (*env)->NewObject(
-	    env, class_ShareNFSProperty, constructor_ShareNFSProperty,
-	    propValue, lineage);
-
-	return (propertyObject);
-}
-
-static jobject
-create_default_ChecksumProperty(JNIEnv *env)
-{
-	jobject propertyObject = NULL;
-
-	char propbuf[ZFS_MAXPROPLEN];
-	jclass class_ChecksumProperty;
-	jmethodID constructor_ChecksumProperty;
-	jobject propValue;
-	jobject lineage;
-
-	zfs_prop_default_string(ZFS_PROP_CHECKSUM, propbuf, sizeof (propbuf));
-	propValue = str_to_checksum(env, propbuf);
-
-	class_ChecksumProperty = (*env)->FindClass(
-	    env, ZFSJNI_PACKAGE_DATA "ChecksumProperty");
-
-	lineage = zjni_get_lineage(env, ZFS_SRC_DEFAULT);
-
-	constructor_ChecksumProperty = (*env)->GetMethodID(
-	    env, class_ChecksumProperty, "<init>",
-	    "(L" ZFSJNI_PACKAGE_DATA "ChecksumProperty$Checksum;L"
-	    ZFSJNI_PACKAGE_DATA "Property$Lineage;)V");
-
-	propertyObject = (*env)->NewObject(env,
-	    class_ChecksumProperty, constructor_ChecksumProperty,
-	    propValue, lineage);
-
-	return (propertyObject);
-}
-
-static jobject
-create_default_CompressionProperty(JNIEnv *env)
-{
-	jobject propertyObject = NULL;
-
-	char propbuf[ZFS_MAXPROPLEN];
-	jclass class_CompressionProperty;
-	jmethodID constructor_CompressionProperty;
-	jobject propValue;
-	jobject lineage;
-
-	zfs_prop_default_string(
-	    ZFS_PROP_COMPRESSION, propbuf, sizeof (propbuf));
-	propValue = str_to_compression(env, propbuf);
-
-	class_CompressionProperty = (*env)->FindClass(
-	    env, ZFSJNI_PACKAGE_DATA "CompressionProperty");
-
-	lineage = zjni_get_lineage(env, ZFS_SRC_DEFAULT);
-
-	constructor_CompressionProperty = (*env)->GetMethodID(
-	    env, class_CompressionProperty, "<init>",
-	    "(L" ZFSJNI_PACKAGE_DATA "CompressionProperty$Compression;L"
-	    ZFSJNI_PACKAGE_DATA "Property$Lineage;)V");
-
-	propertyObject = (*env)->NewObject(env,
-	    class_CompressionProperty, constructor_CompressionProperty,
-	    propValue, lineage);
-
-	return (propertyObject);
-}
-
-static jobject
-create_default_RecordSizeProperty(JNIEnv *env)
-{
-	jclass class_RecordSizeProperty = (*env)->FindClass(env,
-	    ZFSJNI_PACKAGE_DATA "RecordSizeProperty");
-
-	jmethodID constructor_RecordSizeProperty = (*env)->GetMethodID(
-	    env, class_RecordSizeProperty, "<init>",
-	    "(Ljava/lang/Long;L"
-	    ZFSJNI_PACKAGE_DATA "Property$Lineage;)V");
-
-	jobject propValue = zjni_long_to_Long(
-	    env, zfs_prop_default_numeric(ZFS_PROP_RECORDSIZE));
-
-	jobject lineage = zjni_get_lineage(env, ZFS_SRC_DEFAULT);
-
-	jobject propertyObject = (*env)->NewObject(
-	    env, class_RecordSizeProperty, constructor_RecordSizeProperty,
-	    propValue, lineage);
-
-	return (propertyObject);
-}