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