xref: /onnv-gate/usr/src/lib/libzfs_jni/common/libzfs_jni_property.c (revision 12164:0eb8d6741e37)
1789Sahrens /*
2789Sahrens  * CDDL HEADER START
3789Sahrens  *
4789Sahrens  * The contents of this file are subject to the terms of the
53654Sgw25295  * Common Development and Distribution License (the "License").
63654Sgw25295  * You may not use this file except in compliance with the License.
7789Sahrens  *
8789Sahrens  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9789Sahrens  * or http://www.opensolaris.org/os/licensing.
10789Sahrens  * See the License for the specific language governing permissions
11789Sahrens  * and limitations under the License.
12789Sahrens  *
13789Sahrens  * When distributing Covered Code, include this CDDL HEADER in each
14789Sahrens  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15789Sahrens  * If applicable, add the following below this CDDL HEADER, with the
16789Sahrens  * fields enclosed by brackets "[]" replaced with your own identifying
17789Sahrens  * information: Portions Copyright [yyyy] [name of copyright owner]
18789Sahrens  *
19789Sahrens  * CDDL HEADER END
20789Sahrens  */
21789Sahrens /*
22*12164SMark.Shellenbaum@Sun.COM  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
23789Sahrens  */
24789Sahrens 
25789Sahrens #include "libzfs_jni_property.h"
26789Sahrens #include "libzfs_jni_util.h"
27789Sahrens #include <strings.h>
28789Sahrens 
29789Sahrens /*
301066Stalley  * Types
311066Stalley  */
321066Stalley 
331066Stalley /* Signature for function to convert string to a specific Java object */
341066Stalley typedef jobject (*str_to_obj_f)(JNIEnv *, char *);
351066Stalley 
361066Stalley /* Signature for function to convert uint64_t to a specific Java object */
371066Stalley typedef jobject (*uint64_to_obj_f)(JNIEnv *, uint64_t);
381066Stalley 
391066Stalley /*
401066Stalley  * Describes a property and the parameters needed to create a Java
411066Stalley  * Property object for it
421066Stalley  */
431066Stalley typedef struct custom_prop_desct {
441066Stalley 	zfs_prop_t prop;
451066Stalley 	str_to_obj_f convert_str;
461066Stalley 	uint64_to_obj_f convert_uint64;
471066Stalley 	char *propClass;
481066Stalley 	char *valueClass;
491066Stalley } custom_prop_desct_t;
501066Stalley 
511066Stalley /*
52789Sahrens  * Function prototypes
53789Sahrens  */
54789Sahrens 
551066Stalley static jobject create_BasicProperty(JNIEnv *, zfs_handle_t *,
561066Stalley     zfs_prop_t, str_to_obj_f, uint64_to_obj_f, char *, char *);
57789Sahrens static jobject create_BooleanProperty(JNIEnv *, zfs_handle_t *, zfs_prop_t);
58789Sahrens static jobject create_LongProperty(JNIEnv *, zfs_handle_t *, zfs_prop_t);
59789Sahrens static jobject create_StringProperty(JNIEnv *, zfs_handle_t *, zfs_prop_t);
601066Stalley static jobject create_ObjectProperty(JNIEnv *, zfs_handle_t *,
611066Stalley     zfs_prop_t, str_to_obj_f, uint64_to_obj_f, char *, char *);
621066Stalley static jobject create_default_BasicProperty(JNIEnv *, zfs_prop_t,
631066Stalley     str_to_obj_f, uint64_to_obj_f, char *, char *);
64789Sahrens static jobject create_default_BooleanProperty(JNIEnv *, zfs_prop_t);
65789Sahrens static jobject create_default_LongProperty(JNIEnv *, zfs_prop_t);
66789Sahrens static jobject create_default_StringProperty(JNIEnv *, zfs_prop_t);
671066Stalley static jobject create_default_ObjectProperty(
681066Stalley     JNIEnv *, zfs_prop_t, str_to_obj_f, uint64_to_obj_f, char *, char *);
691066Stalley static jobject str_to_enum_element(JNIEnv *, char *, char *);
701066Stalley static jobject str_to_aclinherit(JNIEnv *, char *);
711066Stalley static jobject str_to_checksum(JNIEnv *, char *);
721066Stalley static jobject str_to_compression(JNIEnv *, char *);
731066Stalley static jobject str_to_snapdir(JNIEnv *, char *);
741066Stalley static jobject str_to_string(JNIEnv *, char *);
75789Sahrens 
76789Sahrens /*
77789Sahrens  * Static data
78789Sahrens  */
79789Sahrens 
80789Sahrens zfs_prop_t props_boolean[] = {
81789Sahrens 	ZFS_PROP_ATIME,
82789Sahrens 	ZFS_PROP_DEVICES,
83789Sahrens 	ZFS_PROP_EXEC,
84789Sahrens 	ZFS_PROP_MOUNTED,
85789Sahrens 	ZFS_PROP_READONLY,
86789Sahrens 	ZFS_PROP_SETUID,
87789Sahrens 	ZFS_PROP_ZONED,
8810242Schris.kirby@sun.com 	ZFS_PROP_DEFER_DESTROY,
895094Slling 	ZPROP_INVAL
90789Sahrens };
91789Sahrens 
92789Sahrens zfs_prop_t props_long[] = {
93789Sahrens 	ZFS_PROP_AVAILABLE,
941066Stalley 	ZFS_PROP_CREATETXG,
95789Sahrens 	ZFS_PROP_QUOTA,
96789Sahrens 	ZFS_PROP_REFERENCED,
97789Sahrens 	ZFS_PROP_RESERVATION,
98789Sahrens 	ZFS_PROP_USED,
99789Sahrens 	ZFS_PROP_VOLSIZE,
1005378Sck153898 	ZFS_PROP_REFQUOTA,
1015378Sck153898 	ZFS_PROP_REFRESERVATION,
10210242Schris.kirby@sun.com 	ZFS_PROP_USERREFS,
1035094Slling 	ZPROP_INVAL
104789Sahrens };
105789Sahrens 
106789Sahrens zfs_prop_t props_string[] = {
107789Sahrens 	ZFS_PROP_ORIGIN,
1081066Stalley 	/* ZFS_PROP_TYPE, */
1095094Slling 	ZPROP_INVAL
110789Sahrens };
111789Sahrens 
1121066Stalley custom_prop_desct_t props_custom[] = {
1131066Stalley 	{ ZFS_PROP_ACLINHERIT, str_to_aclinherit, NULL,
1141066Stalley 	    ZFSJNI_PACKAGE_DATA "AclInheritProperty",
1151066Stalley 	    ZFSJNI_PACKAGE_DATA "AclInheritProperty$AclInherit" },
1161066Stalley 
1171066Stalley 	{ ZFS_PROP_CHECKSUM, str_to_checksum, NULL,
1181066Stalley 	    ZFSJNI_PACKAGE_DATA "ChecksumProperty",
1191066Stalley 	    ZFSJNI_PACKAGE_DATA "ChecksumProperty$Checksum" },
1201066Stalley 
1211066Stalley 	{ ZFS_PROP_COMPRESSION, str_to_compression, NULL,
1221066Stalley 	    ZFSJNI_PACKAGE_DATA "CompressionProperty",
1231066Stalley 	    ZFSJNI_PACKAGE_DATA "CompressionProperty$Compression" },
1241066Stalley 
1251066Stalley 	{ ZFS_PROP_COMPRESSRATIO, NULL, zjni_long_to_Long,
1261066Stalley 	    ZFSJNI_PACKAGE_DATA "CompressRatioProperty",
1271066Stalley 	    "java/lang/Long" },
1281066Stalley 
1291066Stalley 	{ ZFS_PROP_CREATION, zjni_str_to_date, NULL,
1301066Stalley 	    ZFSJNI_PACKAGE_DATA "CreationProperty",
1311066Stalley 	    "java/util/Date" },
1321066Stalley 
1331066Stalley 	{ ZFS_PROP_MOUNTPOINT, str_to_string, NULL,
1341066Stalley 	    ZFSJNI_PACKAGE_DATA "MountPointProperty",
1351066Stalley 	    "java/lang/String" },
1361066Stalley 
1371066Stalley 	{ ZFS_PROP_RECORDSIZE, NULL, zjni_long_to_Long,
1381066Stalley 	    ZFSJNI_PACKAGE_DATA "RecordSizeProperty",
1391066Stalley 	    "java/lang/Long" },
1401066Stalley 
1411066Stalley 	{ ZFS_PROP_SHARENFS, str_to_string, NULL,
1421066Stalley 	    ZFSJNI_PACKAGE_DATA "ShareNFSProperty",
1431066Stalley 	    "java/lang/String" },
1441066Stalley 
1451066Stalley 	{ ZFS_PROP_SNAPDIR, str_to_snapdir, NULL,
1461066Stalley 	    ZFSJNI_PACKAGE_DATA "SnapDirProperty",
1471066Stalley 	    ZFSJNI_PACKAGE_DATA "SnapDirProperty$SnapDir" },
1481066Stalley 
1491066Stalley 	{ ZFS_PROP_VOLBLOCKSIZE, NULL, zjni_long_to_Long,
1501066Stalley 	    ZFSJNI_PACKAGE_DATA "VolBlockSizeProperty",
1511066Stalley 	    "java/lang/Long" },
1521066Stalley 
1535094Slling 	{ ZPROP_INVAL, NULL, NULL, NULL, NULL },
1541066Stalley };
1551066Stalley 
156789Sahrens /*
157789Sahrens  * Static functions
158789Sahrens  */
159789Sahrens 
160789Sahrens static jobject
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)1611066Stalley create_BasicProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop,
1621066Stalley     str_to_obj_f convert_str, uint64_to_obj_f convert_uint64,
1631066Stalley     char *propClass, char *valueClass)
164789Sahrens {
165789Sahrens 	jobject propertyObject = NULL;
166789Sahrens 	char source[ZFS_MAXNAMELEN];
1675094Slling 	zprop_source_t srctype;
1681066Stalley 	jobject propValue = NULL;
1691066Stalley 
1701066Stalley 	if (convert_str != NULL) {
1714787Sahrens 		char propbuf[ZFS_MAXPROPLEN];
1724787Sahrens 		int result = zfs_prop_get(zhp, prop, propbuf,
1734787Sahrens 		    sizeof (propbuf), &srctype, source, sizeof (source), 1);
174789Sahrens 
1754787Sahrens 		if (result == 0)
1764787Sahrens 			propValue = convert_str(env, propbuf);
1771066Stalley 	} else {
1784787Sahrens 		uint64_t value;
1794787Sahrens 		int result = zfs_prop_get_numeric(
1804787Sahrens 		    zhp, prop, &value, &srctype, source, sizeof (source));
181789Sahrens 
1824787Sahrens 		if (result == 0)
1834787Sahrens 			propValue = convert_uint64(env, value);
1841066Stalley 	}
1851066Stalley 
1861066Stalley 	if (propValue != NULL) {
1871066Stalley 
1881066Stalley 		jmethodID constructor;
1891066Stalley 		char signature[1024];
1901066Stalley 		jclass class = (*env)->FindClass(env, propClass);
191789Sahrens 
192789Sahrens 		jstring propName = (*env)->NewStringUTF(
193789Sahrens 		    env, zfs_prop_to_name(prop));
1941066Stalley 
195789Sahrens 		jboolean readOnly = zfs_prop_readonly(prop) ?
196789Sahrens 		    JNI_TRUE : JNI_FALSE;
197789Sahrens 
1985094Slling 		if (srctype == ZPROP_SRC_INHERITED) {
199789Sahrens 
200789Sahrens 			jstring propSource = (*env)->NewStringUTF(env, source);
2011066Stalley 
2021066Stalley 			(void) snprintf(signature, sizeof (signature),
2031066Stalley 			    "(Ljava/lang/String;L%s;ZLjava/lang/String;)V",
2041066Stalley 			    valueClass);
2051066Stalley 
2061066Stalley 			constructor = (*env)->GetMethodID(
2071066Stalley 			    env, class, "<init>", signature);
208789Sahrens 
209789Sahrens 			propertyObject = (*env)->NewObject(
2101066Stalley 			    env, class, constructor, propName, propValue,
2111066Stalley 			    readOnly, propSource);
212789Sahrens 		} else {
2131206Stalley 			jobject lineage = zjni_int_to_Lineage(env, srctype);
214789Sahrens 
2151066Stalley 			(void) snprintf(signature, sizeof (signature),
2161066Stalley 			    "(Ljava/lang/String;L%s;ZL"
2171066Stalley 			    ZFSJNI_PACKAGE_DATA "Property$Lineage;)V",
2181066Stalley 			    valueClass);
2191066Stalley 
2201066Stalley 			constructor = (*env)->GetMethodID(
2211066Stalley 			    env, class, "<init>", signature);
222789Sahrens 
223789Sahrens 			propertyObject = (*env)->NewObject(
2241066Stalley 			    env, class, constructor, propName, propValue,
2251066Stalley 			    readOnly, lineage);
2261066Stalley 		}
2271066Stalley 	}
2281066Stalley 
2291066Stalley 	return (propertyObject);
2301066Stalley }
2311066Stalley 
2321066Stalley static jobject
create_BooleanProperty(JNIEnv * env,zfs_handle_t * zhp,zfs_prop_t prop)2331066Stalley create_BooleanProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop)
2341066Stalley {
2351066Stalley 	return (create_BasicProperty(env, zhp, prop, NULL, zjni_int_to_boolean,
2361066Stalley 	    ZFSJNI_PACKAGE_DATA "BooleanProperty", "java/lang/Boolean"));
2371066Stalley }
2381066Stalley 
2391066Stalley static jobject
create_LongProperty(JNIEnv * env,zfs_handle_t * zhp,zfs_prop_t prop)2401066Stalley create_LongProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop)
2411066Stalley {
2421066Stalley 	return (create_BasicProperty(env, zhp, prop, NULL, zjni_long_to_Long,
2431066Stalley 	    ZFSJNI_PACKAGE_DATA "LongProperty", "java/lang/Long"));
2441066Stalley }
2451066Stalley 
2461066Stalley static jobject
create_StringProperty(JNIEnv * env,zfs_handle_t * zhp,zfs_prop_t prop)2471066Stalley create_StringProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop)
2481066Stalley {
2491066Stalley 	return (create_BasicProperty(env, zhp, prop, str_to_string, NULL,
2501066Stalley 	    ZFSJNI_PACKAGE_DATA "StringProperty", "java/lang/String"));
2511066Stalley }
2521066Stalley 
2531066Stalley 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)2541066Stalley create_ObjectProperty(JNIEnv *env, zfs_handle_t *zhp, zfs_prop_t prop,
2551066Stalley     str_to_obj_f convert_str, uint64_to_obj_f convert_uint64,
2561066Stalley     char *propClass, char *valueClass)
2571066Stalley {
2581066Stalley 	jobject propertyObject = NULL;
2591066Stalley 	char source[ZFS_MAXNAMELEN];
2605094Slling 	zprop_source_t srctype;
2611066Stalley 	jobject propValue = NULL;
2621066Stalley 
2631066Stalley 	if (convert_str != NULL) {
2644787Sahrens 		char propbuf[ZFS_MAXPROPLEN];
2654787Sahrens 		int result = zfs_prop_get(zhp, prop, propbuf,
2664787Sahrens 		    sizeof (propbuf), &srctype, source, sizeof (source), 1);
2671066Stalley 
2684787Sahrens 		if (result == 0)
2694787Sahrens 			propValue = convert_str(env, propbuf);
2701066Stalley 	} else {
2714787Sahrens 		uint64_t value;
2724787Sahrens 		int result = zfs_prop_get_numeric(
2734787Sahrens 		    zhp, prop, &value, &srctype, source, sizeof (source));
2741066Stalley 
2754787Sahrens 		if (result == 0)
2764787Sahrens 			propValue = convert_uint64(env, value);
2771066Stalley 	}
2781066Stalley 
2791066Stalley 	if (propValue != NULL) {
2801066Stalley 
2811066Stalley 		jmethodID constructor;
2821066Stalley 		char signature[1024];
2831066Stalley 		jclass class = (*env)->FindClass(env, propClass);
2841066Stalley 
2855094Slling 		if (srctype == ZPROP_SRC_INHERITED) {
2861066Stalley 
2871066Stalley 			jstring propSource = (*env)->NewStringUTF(env, source);
2881066Stalley 
2891066Stalley 			(void) snprintf(signature, sizeof (signature),
2901066Stalley 			    "(L%s;Ljava/lang/String;)V", valueClass);
2911066Stalley 
2921066Stalley 			constructor = (*env)->GetMethodID(
2931066Stalley 			    env, class, "<init>", signature);
2941066Stalley 
2951066Stalley 			propertyObject = (*env)->NewObject(env,
2961066Stalley 			    class, constructor, propValue, propSource);
2971066Stalley 
2981066Stalley 		} else {
2991206Stalley 			jobject lineage = zjni_int_to_Lineage(env, srctype);
3001066Stalley 
3011066Stalley 			(void) snprintf(signature, sizeof (signature),
3021066Stalley 			    "(L%s;L" ZFSJNI_PACKAGE_DATA "Property$Lineage;)V",
3031066Stalley 			    valueClass);
3041066Stalley 
3051066Stalley 			constructor = (*env)->GetMethodID(
3061066Stalley 			    env, class, "<init>", signature);
3071066Stalley 
3081066Stalley 			propertyObject = (*env)->NewObject(env,
3091066Stalley 			    class, constructor, propValue, lineage);
3101066Stalley 		}
3111066Stalley 	}
3121066Stalley 
3131066Stalley 	return (propertyObject);
3141066Stalley }
3151066Stalley 
3161066Stalley 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)3171066Stalley create_default_BasicProperty(JNIEnv *env, zfs_prop_t prop,
3181066Stalley     str_to_obj_f convert_str, uint64_to_obj_f convert_uint64,
3191066Stalley     char *propClass, char *valueClass)
3201066Stalley {
3211066Stalley 	jobject propertyObject = NULL;
3221066Stalley 
3231066Stalley 	if (!zfs_prop_readonly(prop)) {
3241066Stalley 		jobject propValue;
3251066Stalley 
3261066Stalley 		if (convert_str != NULL) {
3271356Seschrock 			char *propbuf = (char *)zfs_prop_default_string(prop);
3281066Stalley 			propValue = convert_str(env, propbuf);
3291066Stalley 		} else {
3301066Stalley 			uint64_t value = zfs_prop_default_numeric(prop);
3311066Stalley 			propValue = convert_uint64(env, value);
3321066Stalley 		}
3331066Stalley 
3341066Stalley 		if (propValue != NULL) {
3351066Stalley 			char signature[1024];
3361066Stalley 			jmethodID constructor;
3371066Stalley 
3381066Stalley 			jstring propName =
3391066Stalley 			    (*env)->NewStringUTF(env, zfs_prop_to_name(prop));
3401066Stalley 
3411066Stalley 			jboolean readOnly = zfs_prop_readonly(prop) ?
3421066Stalley 			    JNI_TRUE : JNI_FALSE;
3431066Stalley 
3441066Stalley 			jclass class = (*env)->FindClass(env, propClass);
3451066Stalley 			jobject lineage =
3465094Slling 			    zjni_int_to_Lineage(env, ZPROP_SRC_DEFAULT);
3471066Stalley 
3481066Stalley 			(void) snprintf(signature, sizeof (signature),
3491066Stalley 			    "(Ljava/lang/String;L%s;ZL" ZFSJNI_PACKAGE_DATA
3501066Stalley 			    "Property$Lineage;)V", valueClass);
3511066Stalley 
3521066Stalley 			constructor = (*env)->GetMethodID(
3531066Stalley 			    env, class, "<init>", signature);
3541066Stalley 
3551066Stalley 			propertyObject = (*env)->NewObject(
3561066Stalley 			    env, class, constructor,
357789Sahrens 			    propName, propValue, readOnly, lineage);
358789Sahrens 		}
359789Sahrens 	}
360789Sahrens 
361789Sahrens 	return (propertyObject);
362789Sahrens }
363789Sahrens 
364789Sahrens static jobject
create_default_BooleanProperty(JNIEnv * env,zfs_prop_t prop)3651066Stalley create_default_BooleanProperty(JNIEnv *env, zfs_prop_t prop)
366789Sahrens {
3671066Stalley 	return (create_default_BasicProperty(env, prop, NULL,
3681066Stalley 	    zjni_int_to_boolean, ZFSJNI_PACKAGE_DATA "BooleanProperty",
3691066Stalley 	    "java/lang/Boolean"));
3701066Stalley }
371789Sahrens 
3721066Stalley static jobject
create_default_LongProperty(JNIEnv * env,zfs_prop_t prop)3731066Stalley create_default_LongProperty(JNIEnv *env, zfs_prop_t prop)
3741066Stalley {
3751066Stalley 	return (create_default_BasicProperty(env, prop, NULL,
3761066Stalley 	    zjni_long_to_Long, ZFSJNI_PACKAGE_DATA "LongProperty",
3771066Stalley 	    "java/lang/Long"));
3781066Stalley }
379789Sahrens 
3801066Stalley static jobject
create_default_StringProperty(JNIEnv * env,zfs_prop_t prop)3811066Stalley create_default_StringProperty(JNIEnv *env, zfs_prop_t prop)
3821066Stalley {
3831066Stalley 	return (create_default_BasicProperty(env, prop, str_to_string, NULL,
3841066Stalley 	    ZFSJNI_PACKAGE_DATA "StringProperty", "java/lang/String"));
385789Sahrens }
386789Sahrens 
387789Sahrens static jobject
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)3881066Stalley create_default_ObjectProperty(JNIEnv *env, zfs_prop_t prop,
3891066Stalley     str_to_obj_f convert_str, uint64_to_obj_f convert_uint64,
3901066Stalley     char *propClass, char *valueClass)
391789Sahrens {
392789Sahrens 	jobject propertyObject = NULL;
393789Sahrens 
3941066Stalley 	if (!zfs_prop_readonly(prop)) {
3951066Stalley 		jobject propValue;
396789Sahrens 
3971066Stalley 		if (convert_str != NULL) {
3981356Seschrock 			char *propbuf = (char *)zfs_prop_default_string(prop);
3991066Stalley 			propValue = convert_str(env, propbuf);
4001066Stalley 		} else {
4011066Stalley 			uint64_t value = zfs_prop_default_numeric(prop);
4021066Stalley 			propValue = convert_uint64(env, value);
403789Sahrens 		}
404789Sahrens 
4051066Stalley 		if (propValue != NULL) {
4061066Stalley 			char signature[1024];
4071066Stalley 			jmethodID constructor;
408789Sahrens 
4091066Stalley 			jclass class = (*env)->FindClass(env, propClass);
4101066Stalley 			jobject lineage =
4115094Slling 			    zjni_int_to_Lineage(env, ZPROP_SRC_DEFAULT);
412789Sahrens 
4131066Stalley 			(void) snprintf(signature, sizeof (signature),
4141066Stalley 			    "(L%s;L" ZFSJNI_PACKAGE_DATA "Property$Lineage;)V",
4151066Stalley 			    valueClass);
416789Sahrens 
4171066Stalley 			constructor = (*env)->GetMethodID(
4181066Stalley 			    env, class, "<init>", signature);
419789Sahrens 
4201066Stalley 			propertyObject = (*env)->NewObject(
4211066Stalley 			    env, class, constructor, propValue, lineage);
422789Sahrens 		}
423789Sahrens 	}
424789Sahrens 
425789Sahrens 	return (propertyObject);
426789Sahrens }
427789Sahrens 
428789Sahrens static jobject
str_to_enum_element(JNIEnv * env,char * str,char * valueClass)4291066Stalley str_to_enum_element(JNIEnv *env, char *str, char *valueClass)
430789Sahrens {
4311066Stalley 	char signature[1024];
4321066Stalley 	jmethodID method_valueOf;
433789Sahrens 
4341066Stalley 	jstring utf = (*env)->NewStringUTF(env, str);
4351066Stalley 	jclass class = (*env)->FindClass(env, valueClass);
436789Sahrens 
4371066Stalley 	(void) snprintf(signature, sizeof (signature),
4381066Stalley 	    "(Ljava/lang/String;)L%s;", valueClass);
439789Sahrens 
4401066Stalley 	method_valueOf = (*env)->GetStaticMethodID(
4411066Stalley 	    env, class, "valueOf", signature);
442789Sahrens 
4431066Stalley 	return (*env)->CallStaticObjectMethod(env, class, method_valueOf, utf);
444789Sahrens }
445789Sahrens 
446789Sahrens static jobject
str_to_aclinherit(JNIEnv * env,char * str)4471066Stalley str_to_aclinherit(JNIEnv *env, char *str)
448789Sahrens {
4491066Stalley 	return (str_to_enum_element(env, str,
4501066Stalley 	    ZFSJNI_PACKAGE_DATA "AclInheritProperty$AclInherit"));
451789Sahrens }
452789Sahrens 
453789Sahrens static jobject
str_to_checksum(JNIEnv * env,char * str)454789Sahrens str_to_checksum(JNIEnv *env, char *str)
455789Sahrens {
4561066Stalley 	return (str_to_enum_element(env, str,
4571066Stalley 	    ZFSJNI_PACKAGE_DATA "ChecksumProperty$Checksum"));
458789Sahrens }
459789Sahrens 
460789Sahrens static jobject
str_to_compression(JNIEnv * env,char * str)461789Sahrens str_to_compression(JNIEnv *env, char *str)
462789Sahrens {
4631066Stalley 	return (str_to_enum_element(env, str,
4641066Stalley 	    ZFSJNI_PACKAGE_DATA "CompressionProperty$Compression"));
4651066Stalley }
466789Sahrens 
4671066Stalley static jobject
str_to_snapdir(JNIEnv * env,char * str)4681066Stalley str_to_snapdir(JNIEnv *env, char *str)
4691066Stalley {
4701066Stalley 	return (str_to_enum_element(env, str,
4711066Stalley 	    ZFSJNI_PACKAGE_DATA "SnapDirProperty$SnapDir"));
4721066Stalley }
473789Sahrens 
4741066Stalley static jobject
str_to_string(JNIEnv * env,char * str)4751066Stalley str_to_string(JNIEnv *env, char *str)
4761066Stalley {
4771066Stalley 	return (*env)->NewStringUTF(env, str);
478789Sahrens }
479789Sahrens 
480789Sahrens /*
481789Sahrens  * Package-private functions
482789Sahrens  */
4831066Stalley 
484789Sahrens jobject
zjni_get_default_property(JNIEnv * env,zfs_prop_t prop)485789Sahrens zjni_get_default_property(JNIEnv *env, zfs_prop_t prop)
486789Sahrens {
487789Sahrens 	int i;
4885094Slling 	for (i = 0; props_boolean[i] != ZPROP_INVAL; i++) {
489789Sahrens 		if (prop == props_boolean[i]) {
490789Sahrens 			return (create_default_BooleanProperty(env, prop));
491789Sahrens 		}
492789Sahrens 	}
493789Sahrens 
4945094Slling 	for (i = 0; props_long[i] != ZPROP_INVAL; i++) {
495789Sahrens 		if (prop == props_long[i]) {
496789Sahrens 			return (create_default_LongProperty(env, prop));
497789Sahrens 		}
498789Sahrens 	}
499789Sahrens 
5005094Slling 	for (i = 0; props_string[i] != ZPROP_INVAL; i++) {
501789Sahrens 		if (prop == props_string[i]) {
502789Sahrens 			return (create_default_StringProperty(env, prop));
503789Sahrens 		}
504789Sahrens 	}
505789Sahrens 
5065094Slling 	for (i = 0; props_custom[i].prop != ZPROP_INVAL; i++) {
5071066Stalley 		if (prop == props_custom[i].prop) {
5084787Sahrens 			return create_default_ObjectProperty(env,
5094787Sahrens 			    props_custom[i].prop,
5104787Sahrens 			    props_custom[i].convert_str,
5114787Sahrens 			    props_custom[i].convert_uint64,
5124787Sahrens 			    props_custom[i].propClass,
5134787Sahrens 			    props_custom[i].valueClass);
5141066Stalley 		}
515789Sahrens 	}
516789Sahrens 
517789Sahrens 	return (NULL);
518789Sahrens }
519789Sahrens 
5205094Slling static int
zjni_get_property_from_name_cb(int prop,void * cb)5215094Slling zjni_get_property_from_name_cb(int prop, void *cb)
5223654Sgw25295 {
5233654Sgw25295 	const char *name = cb;
5243654Sgw25295 
5253654Sgw25295 	if (strcasecmp(name, zfs_prop_to_name(prop)) == 0)
5263654Sgw25295 		return (prop);
5273654Sgw25295 
5285094Slling 	return (ZPROP_CONT);
5293654Sgw25295 }
5303654Sgw25295 
531789Sahrens zfs_prop_t
zjni_get_property_from_name(const char * name)532789Sahrens zjni_get_property_from_name(const char *name)
533789Sahrens {
534789Sahrens 	zfs_prop_t prop;
535789Sahrens 
5365094Slling 	prop = zprop_iter(zjni_get_property_from_name_cb, (void *)name,
5375094Slling 	    B_FALSE, B_FALSE, ZFS_TYPE_DATASET);
5385094Slling 	return (prop == ZPROP_CONT ? ZPROP_INVAL : prop);
539789Sahrens }
540789Sahrens 
541789Sahrens jobject
zjni_int_to_Lineage(JNIEnv * env,zprop_source_t srctype)5425094Slling zjni_int_to_Lineage(JNIEnv *env, zprop_source_t srctype)
543789Sahrens {
5445094Slling 	/* zprop_source_t to Property$Lineage map */
5451206Stalley 	static zjni_field_mapping_t lineage_map[] = {
5465094Slling 		{ ZPROP_SRC_NONE, "ZFS_PROP_LINEAGE_NOTINHERITABLE" },
5475094Slling 		{ ZPROP_SRC_DEFAULT, "ZFS_PROP_LINEAGE_DEFAULT" },
5485094Slling 		{ ZPROP_SRC_LOCAL, "ZFS_PROP_LINEAGE_LOCAL" },
5495094Slling 		{ ZPROP_SRC_TEMPORARY, "ZFS_PROP_LINEAGE_TEMPORARY" },
5505094Slling 		{ ZPROP_SRC_INHERITED, "ZFS_PROP_LINEAGE_INHERITED" }
5511206Stalley 	};
552789Sahrens 
5531206Stalley 	return (zjni_int_to_enum(env, srctype,
5541206Stalley 	    ZFSJNI_PACKAGE_DATA "Property$Lineage",
5551206Stalley 	    "ZFS_PROP_LINEAGE_INHERITED", lineage_map));
556789Sahrens }
557789Sahrens 
558789Sahrens jobjectArray
zjni_get_Dataset_properties(JNIEnv * env,zfs_handle_t * zhp)559789Sahrens zjni_get_Dataset_properties(JNIEnv *env, zfs_handle_t *zhp)
560789Sahrens {
561789Sahrens 	jobject prop;
562789Sahrens 	int i;
563789Sahrens 
564789Sahrens 	/* Create an array list for the properties */
565789Sahrens 	zjni_ArrayList_t proplist_obj = {0};
566789Sahrens 	zjni_ArrayList_t *proplist = &proplist_obj;
567789Sahrens 	zjni_new_ArrayList(env, proplist);
568789Sahrens 
5695094Slling 	for (i = 0; props_boolean[i] != ZPROP_INVAL; i++) {
570789Sahrens 		/* Create property and add to list */
571789Sahrens 		prop = create_BooleanProperty(env, zhp, props_boolean[i]);
572789Sahrens 
573789Sahrens 		/* Does this property apply to this object? */
574789Sahrens 		if (prop != NULL) {
575789Sahrens 
576789Sahrens 			(*env)->CallBooleanMethod(
577789Sahrens 			    env, ((zjni_Object_t *)proplist)->object,
578789Sahrens 			    ((zjni_Collection_t *)proplist)->method_add, prop);
579789Sahrens 		} else {
580789Sahrens 
581789Sahrens 			if ((*env)->ExceptionOccurred(env) != NULL) {
582789Sahrens 				return (NULL);
583789Sahrens 			}
584789Sahrens #ifdef	DEBUG
585789Sahrens 			(void) fprintf(stderr, "Property %s is not appropriate "
586789Sahrens 			    "for %s\n", zfs_prop_to_name(props_boolean[i]),
587789Sahrens 			    zfs_get_name(zhp));
588789Sahrens #endif
589789Sahrens 		}
590789Sahrens 	}
591789Sahrens 
5925094Slling 	for (i = 0; props_long[i] != ZPROP_INVAL; i++) {
593789Sahrens 		/* Create property and add to list */
594789Sahrens 		prop = create_LongProperty(env, zhp, props_long[i]);
595789Sahrens 
596789Sahrens 		/* Does this property apply to this object? */
597789Sahrens 		if (prop != NULL) {
598789Sahrens 
599789Sahrens 			(*env)->CallBooleanMethod(
600789Sahrens 			    env, ((zjni_Object_t *)proplist)->object,
601789Sahrens 			    ((zjni_Collection_t *)proplist)->method_add, prop);
602789Sahrens 		} else {
603789Sahrens 			if ((*env)->ExceptionOccurred(env) != NULL) {
604789Sahrens 				return (NULL);
605789Sahrens 			}
606789Sahrens #ifdef	DEBUG
607789Sahrens 			(void) fprintf(stderr, "Property %s is not appropriate "
608789Sahrens 			    "for %s\n", zfs_prop_to_name(props_long[i]),
609789Sahrens 			    zfs_get_name(zhp));
610789Sahrens #endif
611789Sahrens 		}
612789Sahrens 	}
613789Sahrens 
6145094Slling 	for (i = 0; props_string[i] != ZPROP_INVAL; i++) {
615789Sahrens 		/* Create property and add to list */
616789Sahrens 		prop = create_StringProperty(env, zhp, props_string[i]);
617789Sahrens 
618789Sahrens 		/* Does this property apply to this object? */
619789Sahrens 		if (prop != NULL) {
620789Sahrens 
621789Sahrens 			(*env)->CallBooleanMethod(
622789Sahrens 			    env, ((zjni_Object_t *)proplist)->object,
623789Sahrens 			    ((zjni_Collection_t *)proplist)->method_add, prop);
624789Sahrens 		} else {
625789Sahrens 			if ((*env)->ExceptionOccurred(env) != NULL) {
626789Sahrens 				return (NULL);
627789Sahrens 			}
628789Sahrens #ifdef	DEBUG
629789Sahrens 			(void) fprintf(stderr, "Property %s is not appropriate "
630789Sahrens 			    "for %s\n", zfs_prop_to_name(props_string[i]),
631789Sahrens 			    zfs_get_name(zhp));
632789Sahrens #endif
633789Sahrens 		}
634789Sahrens 	}
635789Sahrens 
6365094Slling 	for (i = 0; props_custom[i].prop != ZPROP_INVAL; i++) {
6371066Stalley 		/* Create property and add to list */
6381066Stalley 		prop = create_ObjectProperty(env, zhp, props_custom[i].prop,
6391066Stalley 		    props_custom[i].convert_str, props_custom[i].convert_uint64,
6401066Stalley 		    props_custom[i].propClass, props_custom[i].valueClass);
641789Sahrens 
6421066Stalley 		/* Does this property apply to this object? */
6431066Stalley 		if (prop != NULL) {
644789Sahrens 
6451066Stalley 			(*env)->CallBooleanMethod(
6461066Stalley 			    env, ((zjni_Object_t *)proplist)->object,
6471066Stalley 			    ((zjni_Collection_t *)proplist)->method_add, prop);
6481066Stalley 		} else {
6491066Stalley 			if ((*env)->ExceptionOccurred(env) != NULL) {
6501066Stalley 				return (NULL);
6511066Stalley 			}
652789Sahrens #ifdef	DEBUG
6531066Stalley 			(void) fprintf(stderr, "Property %s is not appropriate "
6541066Stalley 			    "for %s\n", zfs_prop_to_name(props_custom[i].prop),
6551066Stalley 			    zfs_get_name(zhp));
656789Sahrens #endif
6571066Stalley 		}
658789Sahrens 	}
659789Sahrens 
6601066Stalley 	return (zjni_Collection_to_array(env,
6611066Stalley 	    (zjni_Collection_t *)proplist, ZFSJNI_PACKAGE_DATA "Property"));
662789Sahrens }
663