{
	"$schema": "http://json-schema.org/draft-06/schema#",
	"definitions": {
		"trayOptionsItem": {
			"title": "Tray Option",
			"description": "An object that represents a single tray menu item",
			"type": "object",
			"properties": {
				"label": {
					"title": "Label",
					"description": "Text of menu item",
					"type": "string"
				},
				"action": {
					"title": "Action",
					"description": "Action to perform when user clicks this menu item. 'openfilesystem', 'openbrowser', or 'stopserver'",
					"type": "string"
				},
				"url": {
					"title": "URL",
					"description": "Url to open for 'openbrowser' action",
					"type": "string"
				},
				"disabled": {
					"title": "Disabled",
					"description": "Turn menu item grey and nothing happens when clicking on it",
					"type": "boolean",
					"default": false
				},
				"image": {
					"title": "Image",
					"description": "Path to PNG image to display on menu item next to the label",
					"type": "string",
					"default": ""
				},
				"hotkey": {
					"title": "Hotkey",
					"description": "Keyboard shortcut to choose this menu item",
					"type": "string",
					"default": ""
				},
				"path": {
					"title": "Path",
					"description": "Filesystem path to open for 'openfilesystem' action",
					"type": "string",
					"default": ""
				},
				"items": {
					"title": "Items",
					"description": "Nested menu items",
					"type": "array",
					"minItems": 0,
					"items": {
						"$ref": "#/definitions/trayOptionsItem"
					},
					"default": []
				}
			}
		}
	},
	"title": "CommandBox Server",
	"description": "Configuration file for a CommandBox server",
	"type": "object",
	"properties": {
		"name": {
			"title": "Name",
			"description": "The name of the server",
			"type": "string",
			"default": ""
		},
		"openBrowser": {
			"title": "Open Browser",
			"description": "Controls whether browser opens by default when starting server",
			"type": "boolean",
			"default": true
		},
		"openBrowserURL": {
			"title": "Open Browser URL",
			"description": "Override the URL to open when starting the server",
			"type": "string",
			"default": ""
		},
		"startTimeout": {
			"title": "Server start timeout",
			"description": "The length of time in seconds to wait for the server to start",
			"type": "number",
			"default": 240
		},
		"stopsocket": {
			"title": "Stop Socket",
			"description": "The port the server listens on to receive a stop command",
			"type": "number",
			"default": 0
		},
		"debug": {
			"title": "Debug",
			"description": "Enable debug level logging for server",
			"type": "boolean",
			"default": false
		},
		"trace": {
			"title": "Trace",
			"description": "Enable trace level logging for server",
			"type": "boolean",
			"default": false
		},
		"console": {
			"title": "Console",
			"description": "Start the server in console mode instead of in the background",
			"type": "boolean",
			"default": false
		},
		"trayEnable": {
			"title": "Tray Enable",
			"description": "Control whether the server has an associated icon in the system tray",
			"type": "boolean",
			"default": true
		},
		"trayicon": {
			"title": "Tray Icon",
			"description": "Path to the server's tray icon",
			"type": "string",
			"default": ""
		},
		"trayOptions": {
			"title": "Tray Options",
			"description": "An array of custom menu items to be added to the server's tray menu",
			"type": "array",
			"minItems": 0,
			"items": {
				"$ref": "#/definitions/trayOptionsItem"
			},
			"default": []
		},
		"jvm": {
			"title": "JVM",
			"description": "JVM Options",
			"type": "object",
			"properties": {
				"heapSize": {
					"title": "Max Heap Size",
					"description": "The max heap size of the server",
					"type": [
						"number",
						"string"
					],
					"default": ""
				},
				"minHeapSize": {
					"title": "Min Heap Size",
					"description": "The starting heap size for the server",
					"type": [
						"number",
						"string"
					],
					"default": ""
				},
				"args": {
					"title": "JVM Arguments",
					"description": "Ad-hoc JVM args for the server such as -X:name",
					"type": "string",
					"default": ""
				},
				"javaHome": {
					"title": "Java Home Path",
					"description": "Path to custom JRE. Default is the one that the CommandBox CLI is using",
					"type": "string",
					"default": ""
				},
				"javaVersion": {
					"title": "Java Version",
					"description": "A Java installation ID. In its entirety, it has the form <version>_<type>_<arch>_<os>_<jvm-implementation>_<release>",
					"type": "string",
					"default": ""
				}
			}
		},
		"web": {
			"title": "Web",
			"description": "Web Server Options",
			"type": "object",
			"properties": {
				"host": {
					"title": "Host",
					"description": "The default host name of the server",
					"type": "string",
					"default": "127.0.0.1"
				},
				"webroot": {
					"title": "Webroot",
					"description": "Webroot directory",
					"type": "string",
					"default": ""
				},
				"directoryBrowsing": {
					"title": "Directory Browsing",
					"description": "Enables file listing for directories with no welcome file",
					"type": "boolean",
					"default": false
				},
				"accessLogEnable": {
					"title": "Access Log Enable",
					"description": "Enable web server access log",
					"type": "boolean",
					"default": true
				},
				"GZIPEnable": {
					"title": "GZIP Enable",
					"description": "Enable GZip compression in HTTP responses",
					"type": "boolean",
					"default": true
				},
				"welcomeFiles": {
					"title": "Welcome Files",
					"description": "A comma-delimited list of files that you would like CommandBox to look for when a user hits a directory",
					"type": "string",
					"default": ""
				},
				"aliases": {
					"title": "Aliases",
					"description": "Web aliases for the web server, similar to virtual directories",
					"type": "object",
					"patternProperties": {
						"^(/[^/]+)+$": {
							"title": "Alias",
							"description": "The key is the web-accessible virtual path and the value is the relative or absolute path to the folder the alias points to",
							"type": "string"
						}
					},
					"additionalProperties": false,
					"default": {}
				},
				"errorPages": {
					"title": "Error Pages",
					"description": "The error pages that CommandBox servers return. You can have a setting for each status code including a default error page to be used if no other setting applies",
					"type": "object",
					"properties": {
						"default": {
							"title": "Default",
							"description": "Path to default error page",
							"type": "string",
							"default": ""
						}
					},
					"patternProperties": {
						"^[1-5][0-9]{2}$": {
							"title": "Error Page",
							"description": "The key is the status code integer and the value is a relative (to the web root) path to be loaded for that status code",
							"type": "string"
						}
					},
					"additionalProperties": false,
					"default": {}
				},
				"HTTP": {
					"title": "HTTP Settings",
					"description": "Configure the HTTP listener on the server",
					"type": "object",
					"properties": {
						"enable": {
							"title": "Enable",
							"description": "Enable HTTP for this serer",
							"type": "boolean",
							"default": true
						},
						"port": {
							"title": "Port",
							"description": "HTTP port to use",
							"type": "number",
							"default": 0
						}
					}
				},
				"SSL": {
					"title": "SSL",
					"description": "Configure the HTTPS listener on the server",
					"type": "object",
					"properties": {
						"enable": {
							"title": "Enable",
							"description": "Enable HTTPS for this server",
							"type": "boolean",
							"default": false
						},
						"port": {
							"title": "Port",
							"description": "HTTPS port to use",
							"type": "number",
							"default": 1443
						},
						"certFile": {
							"title": "Cert File",
							"description": "Path to SSL cert file",
							"type": "string",
							"default": ""
						},
						"keyFile": {
							"title": "Key File",
							"description": "Path to SSL key file",
							"type": "string",
							"default": ""
						},
						"keyPass": {
							"title": "Key Pass",
							"description": "Password for SSL key file",
							"type": "string",
							"default": ""
						}
					}
				},
				"AJP": {
					"title": "AJP",
					"description": "Configure the AJP listener on the server",
					"type": "object",
					"properties": {
						"enable": {
							"title": "Enable",
							"description": "Enable AJP for this server",
							"type": "boolean",
							"default": false
						},
						"port": {
							"title": "Port",
							"description": "AJP port to use",
							"type": "number",
							"default": 8009
						}
					}
				},
				"rewrites": {
					"title": "Rewrites",
					"description": "Configure URL Rewrites",
					"type": "object",
					"properties": {
						"enable": {
							"title": "Enable",
							"description": "Enable URL Rewrites on this server",
							"type": "boolean",
							"default": false
						},
						"logEnable": {
							"title": "Log Enable",
							"description": "Enable Rewrite log file",
							"type": "boolean",
							"default": false
						},
						"config": {
							"title": "Config",
							"description": "Path to xml config file or .htaccess",
							"type": "string",
							"default": ""
						},
						"statusPath": {
							"title": "Tuckey Status Path",
							"description": "URL path to visit Tuckey status page like '/tuckey-status'",
							"type": "string",
							"default": "/tuckey-status"
						},
						"configReloadSeconds": {
							"title": "Config Reload Seconds",
							"description": "Number of seconds to check rewrite config file for changes",
							"type": "number"
						}
					}
				},
				"basicAuth": {
					"title": "Configure basic authentication",
					"description": "",
					"type": "object",
					"properties": {
						"enable": {
							"title": "Enable",
							"description": "Enable basic auth for this server",
							"type": "boolean",
							"default": true
						},
						"users": {
							"title": "Users",
							"description": "Users who can authenticate to basic auth",
							"type": "object",
							"additionalProperties": {
								"title": "User",
								"description": "The key is the user name and the value is the password.",
								"type": "string"
							},
							"default": {}
						}
					}
				}
			}
		},
		"app": {
			"title": "Application",
			"description": "Application Server Options",
			"type": "object",
			"properties": {
				"logDir": {
					"title": "Log Directory",
					"description": "The folder path where the servlet out, rewrite, and access log are written to",
					"type": "string",
					"default": ""
				},
				"libDirs": {
					"title": "Jar lib Directories",
					"description": "A comma-delimited list of directories from which CommandBox will load JARs",
					"type": "string",
					"default": ""
				},
				"webConfigDir": {
					"title": "Web Context Directory",
					"description": "Directory for Lucee/Railo web context",
					"type": "string",
					"default": ""
				},
				"serverConfigDir": {
					"title": "Server Context Directory",
					"description": "Directory for Lucee/Railo server context",
					"type": "string",
					"default": ""
				},
				"webXML": {
					"title": "Web XML",
					"description": "Path to web.xml file",
					"type": "string",
					"default": ""
				},
				"WARPath": {
					"title": "WAR Path",
					"description": "Path to a local WAR archive or exploded WAR folder.  Mutually exclusive with cfengine.",
					"type": "string",
					"default": ""
				},
				"cfengine": {
					"title": "CFML Engine",
					"description": "An Endpoint ID that resolves to a CF engine such as 'adobe' or 'lucee'. Include version as 'adobe@2016'",
					"type": "string",
					"default": ""
				},
				"restMappings": {
					"title": "REST Mappings",
					"description": "Comma delimited list of paths to map to the CF engine's REST servlet such as '/rest/*,/api/*'",
					"type": "string",
					"default": ""
				},
				"serverHomeDirectory": {
					"title": "Server Home Directory",
					"description": "Path to folder where the server WAR will be expanded",
					"type": "string",
					"default": ""
				},
				"sessionCookieSecure": {
					"title": "Session Cookie Secure",
					"description": "Enable secure session cookies",
					"type": "boolean",
					"default": false
				},
				"sessionCookieHTTPOnly": {
					"title": "Session Cookie HttpOnly",
					"description": "Enable HTTP-only session cookies",
					"type": "boolean",
					"default": false
				}
			}
		},
		"runwar": {
			"title": "Configure RunWar",
			"description": "These settings apply to the underlying Runwar library that starts servers",
			"type": "object",
			"properties": {
				"args": {
					"title": "Arguments",
					"description": "Ad-hoc options for the underlying Runwar library",
					"type": "string",
					"default": ""
				}
			}
		}
	}
}