{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "$id": "https://github.com/oracle/graal/blob/master/docs/reference-manual/native-image/assets/reachability-metadata-schema-v1.1.0.json",
  "title": "JSON schema for the reachability metadata used by GraalVM Native Image",
  "type": "object",
  "default": {},
  "properties": {
    "comment": {
      "title": "A comment applying to the whole file (e.g., generation date, author, etc.)",
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      ],
      "default": ""
    },
    "reflection": {
      "title": "Metadata to ensure elements are reachable through reflection",
      "$ref": "#/$defs/reflection"
    },
    "jni": {
      "title": "Metadata to ensure elements are reachable through JNI",
      "$ref": "#/$defs/reflection"
    },
    "serialization": {
      "title": "Metadata for types that are serialized or deserialized at run time. The types must extend 'java.io.Serializable'.",
      "type": "array",
      "default": [],
      "items": {
        "title": "Enables serializing and deserializing objects of the class specified by <type>",
        "type": "object",
        "properties": {
          "reason": {
            "title": "Reason for the type's inclusion in the serialization metadata",
            "$ref": "#/$defs/reason"
          },
          "condition": {
            "title": "Condition under which the class should be registered for serialization",
            "$ref": "#/$defs/condition"
          },
          "type": {
            "title": "Type descriptor of the class that should be registered for serialization",
            "$ref": "#/$defs/type"
          },
          "customTargetConstructorClass": {
            "title": "Fully qualified name of the class whose constructor should be used to serialize the class specified by <type>",
            "type": "string"
          }
        },
        "required": [
          "type"
        ],
        "additionalProperties": false
      }
    },
    "resources": {
      "title": "Metadata to ensure resources are available",
      "type": "array",
      "default": [],
      "items": {
        "oneOf": [
          {
            "title": "Resource that should be available",
            "type": "object",
            "properties": {
              "reason": {
                "title": "Reason for the resource's inclusion in the metadata",
                "$ref": "#/$defs/reason"
              },
              "condition": {
                "title": "Condition under which the resource should be registered for runtime access",
                "$ref": "#/$defs/condition"
              },
              "module": {
                "title": "Module containing the resource",
                "type": "string",
                "default": ""
              },
              "glob": {
                "title": "Resource name or pattern matching multiple resources (accepts * and ** wildcards)",
                "type": "string"
              }
            },
            "required": [
              "glob"
            ],
            "additionalProperties": false
          },
          {
            "title": "Resource bundle that should be available",
            "type": "object",
            "properties": {
              "reason": {
                "title": "Reason for the resource bundle's inclusion in the metadata",
                "$ref": "#/$defs/reason"
              },
              "condition": {
                "title": "Condition under which the resource bundle should be registered for runtime access",
                "$ref": "#/$defs/condition"
              },
              "module": {
                "title": "Module containing the resource bundle",
                "type": "string",
                "default": ""
              },
              "bundle": {
                "title": "Resource bundle name",
                "type": "string"
              }
            },
            "required": [
              "bundle"
            ],
            "additionalProperties": false
          }
        ]
      }
    },
    "bundles": {
      "title": "Metadata to ensure resource bundles are available",
      "type": "array",
      "default": [],
      "deprecated": true,
      "items": {
        "title": "Resource bundle that should be available",
        "type": "object",
        "properties": {
          "reason": {
            "title": "Reason for the resource bundle's inclusion in the metadata",
            "$ref": "#/$defs/reason"
          },
          "condition": {
            "title": "Condition under which the resource bundle should be registered for runtime access",
            "$ref": "#/$defs/condition"
          },
          "name": {
            "title": "Name of the resource bundle",
            "type": "string"
          },
          "locales": {
            "title": "List of locales that should be registered for this resource bundle",
            "type": "array",
            "default": [],
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "name"
        ],
        "additionalProperties": false
      }
    },
    "foreign": {
      "properties": {
        "downcalls": {
          "default": [],
          "items": {
            "properties": {
              "condition": {
                "$ref": "config-condition-schema-v1.0.0.json",
                "title": "Condition under which the downcall stub should be registered"
              },
              "returnType": {
                "type": "string",
                "title": "Memory layout definition (allows canonical layouts; see `java.lang.foreign.Linker`)"
              },
              "parameterTypes": {
                "default": [],
                "items": {
                  "type": "string",
                  "title": "Memory layout definition (allows canonical layouts; see `java.lang.foreign.Linker`)"
                },
                "type": "array",
                "title": "List of the function descriptor's parameter types"
              },
              "options": {
                "type": "object",
                "title": "Linker options (see `java.lang.foreign.Linker.Option`)",
                "properties": {
                  "captureCallState": {
                    "type": "boolean",
                    "title": "Specifies whether a call state should be captured. The specific states to capture are determined at run time. See also: `java.lang.foreign.Linker.Option.captureCallState`"
                  },
                  "critical": {
                    "type": "object",
                    "title": "See `java.lang.foreign.Linker.Option.critical`",
                    "properties": {
                      "allowHeapAccess": {
                        "type": "boolean"
                      }
                    },
                    "additionalProperties": false
                  },
                  "firstVariadicArg": {
                    "type": "integer",
                    "title": "See `java.lang.foreign.Linker.Option.firstVariadicArg`"
                  }
                },
                "additionalProperties": false
              }
            },
            "additionalProperties": false,
            "type": "object",
            "title": "Function descriptor to be registered for a downcall"
          },
          "type": "array",
          "title": "List of function descriptors that should be registered for downcalls"
        },
        "upcalls": {
          "default": [],
          "items": {
            "properties": {
              "condition": {
                "$ref": "config-condition-schema-v1.0.0.json",
                "title": "Condition under which the upcall stub should be registered"
              },
              "returnType": {
                "type": "string",
                "title": "Memory layout definition (allows canonical layouts; see `java.lang.foreign.Linker`)"
              },
              "parameterTypes": {
                "default": [],
                "items": {
                  "type": "string",
                  "title": "Memory layout definition (allows canonical layouts; see `java.lang.foreign.Linker`)"
                },
                "type": "array",
                "title": "List of the function descriptor's parameter types"
              },
              "options": {
                "type": "object",
                "title": "Linker options (see `java.lang.foreign.Linker.Option`)",
                "description": "Currently, no linker options are allowed for upcalls. This may change in the future.",
                "properties": { },
                "additionalProperties": false
              }
            },
            "additionalProperties": false,
            "type": "object",
            "title": "Function descriptor to be registered for an upcall"
          },
          "type": "array",
          "title": "List of function descriptors that should be registered for upcalls"
        },
        "directUpcalls": {
          "default": [],
          "items": {
            "properties": {
              "condition": {
                "$ref": "config-condition-schema-v1.0.0.json",
                "title": "Condition under which the direct upcall stub should be registered"
              },
              "class": {
                "type": "string",
                "title": "Fully-qualified class name (e.g. `org.package.OuterClass$InnerClass`)"
              },
              "method": {
                "type": "string",
                "title": "Method name"
              },
              "returnType": {
                "type": "string",
                "title": "Memory layout definition (allows canonical layouts; see `java.lang.foreign.Linker`)"
              },
              "parameterTypes": {
                "default": [],
                "items": {
                  "type": "string",
                  "title": "Memory layout definition (allows canonical layouts; see `java.lang.foreign.Linker`)"
                },
                "type": "array",
                "title": "List of the function descriptor's parameter types "
              },
              "options": {
                "type": "object",
                "title": "Linker options (see `java.lang.foreign.Linker.Option`)",
                "description": "Currently, no linker options are allowed for direct upcalls. This may change in the future.",
                "properties": { },
                "additionalProperties": false
              }
            },
            "additionalProperties": false,
            "type": "object",
            "title": "Java method and function descriptor to be registered for a direct upcall"
          },
          "type": "array",
          "title": "List of Java methods and function descriptors that should be registered for direct upcalls"
        }
      },
      "type": "object",
      "additionalProperties": false,
      "title": "JSON schema for the FFM API configuration used by GraalVM Native Image",
      "description": "For a description and examples of writing an FFM API configuration, see: https://github.com/oracle/graal/blob/master/docs/reference-manual/native-image/FFM-API.md"
    }
  },
  "required": [],
  "additionalProperties": false,

  "$defs": {
    "reflection": {
      "type": "array",
      "default": [],
      "items": {
        "title": "Elements that should be registered for reflection for a specified type",
        "type": "object",
        "properties": {
          "reason": {
            "title": "Reason for the element's inclusion",
            "$ref": "#/$defs/reason"
          },
          "condition": {
            "title": "Condition under which the class should be registered for reflection",
            "$ref": "#/$defs/condition"
          },
          "type": {
            "title": "Type descriptor of the class that should be registered for reflection",
            "$ref": "#/$defs/type"
          },
          "methods": {
            "title": "List of methods that should be registered for the type declared in <type>",
            "type": "array",
            "default": [],
            "items": {
              "title": "Method descriptor of the method that should be registered for reflection",
              "$ref": "#/$defs/method"
            }
          },
          "fields": {
            "title": "List of class fields that can be read or written to for the type declared in <type>",
            "type": "array",
            "default": [],
            "items": {
              "title": "Field descriptor of the field that should be registered for reflection",
              "$ref": "#/$defs/field"
            }
          },
          "allDeclaredMethods": {
            "title": "Register all declared methods from the type for reflective invocation",
            "type": "boolean",
            "default": false
          },
          "allDeclaredFields": {
            "title": "Register all declared fields from the type for reflective access",
            "type": "boolean",
            "default": false
          },
          "allDeclaredConstructors": {
            "title": "Register all declared constructors from the type for reflective invocation",
            "type": "boolean",
            "default": false
          },
          "allPublicMethods": {
            "title": "Register all public methods from the type for reflective invocation",
            "type": "boolean",
            "default": false
          },
          "allPublicFields": {
            "title": "Register all public fields from the type for reflective access",
            "type": "boolean",
            "default": false
          },
          "allPublicConstructors": {
            "title": "Register all public constructors from the type for reflective invocation",
            "type": "boolean",
            "default": false
          },
          "unsafeAllocated": {
            "title": "Allow objects of this class to be instantiated with a call to jdk.internal.misc.Unsafe#allocateInstance or JNI's AllocObject",
            "type": "boolean",
            "default": false
          },
          "serializable": {
            "title": "Allow objects of this class to be serialized and deserialized",
            "type": "boolean",
            "default": false
          },
          "jniAccessible": {
            "title": "Register the type, including all registered fields and methods, for runtime JNI access",
            "type": "boolean",
            "default": false
          }
        },
        "additionalProperties": false
      }
    },
    "jni": {
      "type": "array",
      "default": [],
      "items": {
        "title": "Elements that should be registered for JNI for a specified type",
        "type": "object",
        "properties": {
          "reason": {
            "title": "Reason for the element's inclusion",
            "$ref": "#/$defs/reason"
          },
          "condition": {
            "title": "Condition under which the class should be registered for JNI",
            "$ref": "#/$defs/condition"
          },
          "type": {
            "title": "Type descriptor of the class that should be registered for JNI",
            "$ref": "#/$defs/type"
          },
          "methods": {
            "title": "List of methods that should be registered for the type declared in <type>",
            "type": "array",
            "default": [],
            "items": {
              "title": "Method descriptor of the method that should be registered for JNI",
              "$ref": "#/$defs/method"
            }
          },
          "fields": {
            "title": "List of class fields that can be read or written to for the type declared in <type>",
            "type": "array",
            "default": [],
            "items": {
              "title": "Field descriptor of the field that should be registered for JNI",
              "$ref": "#/$defs/field"
            }
          },
          "allDeclaredMethods": {
            "title": "Register all declared methods from the type for JNI access",
            "type": "boolean",
            "default": false
          },
          "allDeclaredFields": {
            "title": "Register all declared fields from the type for JNI access",
            "type": "boolean",
            "default": false
          },
          "allDeclaredConstructors": {
            "title": "Register all declared constructors from the type for JNI access",
            "type": "boolean",
            "default": false
          },
          "allPublicMethods": {
            "title": "Register all public methods from the type for JNI access",
            "type": "boolean",
            "default": false
          },
          "allPublicFields": {
            "title": "Register all public fields from the type for JNI access",
            "type": "boolean",
            "default": false
          },
          "allPublicConstructors": {
            "title": "Register all public constructors from the type for JNI access",
            "type": "boolean",
            "default": false
          }
        },
        "additionalProperties": false
      }
    },
    "reason": {
      "type": "string",
      "default": []
    },
    "condition": {
      "title": "Condition used by GraalVM Native Image metadata files",
      "type": "object",
      "properties": {
        "typeReached": {
          "title": "Type descriptor of a class that must be reached in order to enable the corresponding registration",
          "$ref": "#/$defs/type"
        }
      },
      "required": [
        "typeReached"
      ],
      "additionalProperties": false
    },
    "type": {
      "title": "Type descriptors used by GraalVM Native Image metadata files",
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object",
          "properties": {
            "proxy": {
              "title": "List of interfaces defining the proxy class",
              "type": "array",
              "default": [],
              "items": {
                "title": "Fully-qualified name of the interface defining the proxy class",
                "type": "string"
              }
            },
            "lambda": {
              "title": "Lambda class descriptor",
              "type": "object",
              "properties": {
                "declaringClass": {
                  "title": "The class in which the lambda class is defined",
                  "$ref": "#/$defs/type"
                },
                "declaringMethod": {
                  "title": "The method in which the lambda class is defined",
                  "$ref": "#/$defs/method",
                  "default": {}
                },
                "interfaces": {
                  "title": "Non-empty list of interfaces implemented by the lambda class",
                  "type": "array",
                  "items": {
                    "title": "Fully-qualified name of the interface implemented by the lambda class",
                    "type": "string"
                  }
                }
              },
              "required": [
                "declaringClass",
                "interfaces"
              ],
              "additionalProperties": false
            }
          },
          "oneOf": [
            {
              "required": [
                "proxy"
              ]
            },
            {
              "required": [
                "lambda"
              ]
            }
          ],
          "additionalProperties": false
        }
      ]
    },
    "method": {
      "title": "Method descriptors used by GraalVM Native Image metadata files",
      "type": "object",
      "properties": {
        "name": {
          "title": "Method name that should be registered for this class",
          "type": "string"
        },
        "parameterTypes": {
          "default": [],
          "items": {
            "title": "List of the method's parameter types",
            "type": "string"
          },
          "type": "array"
        }
      },
      "required": [
        "name"
      ],
      "additionalProperties": false
    },
    "field": {
      "title": "Field descriptors used by GraalVM Native Image metadata files",
      "type": "object",
      "properties": {
        "name": {
          "title": "Name of the field that should be registered for reflection",
          "type": "string"
        }
      },
      "required": [
        "name"
      ],
      "additionalProperties": false
    }
  }
}