Improve config key descriptions

Also marks most important config keys as ‘CatalogConfig’ on some 
entities/policies/enrichers.
diff --git a/software/database/src/main/java/org/apache/brooklyn/entity/database/DatastoreMixins.java b/software/database/src/main/java/org/apache/brooklyn/entity/database/DatastoreMixins.java
index 5490e08..def05a3 100644
--- a/software/database/src/main/java/org/apache/brooklyn/entity/database/DatastoreMixins.java
+++ b/software/database/src/main/java/org/apache/brooklyn/entity/database/DatastoreMixins.java
@@ -25,6 +25,8 @@
 import javax.annotation.Nullable;
 
 import com.google.common.collect.ImmutableMap;
+
+import org.apache.brooklyn.api.catalog.CatalogConfig;
 import org.apache.brooklyn.api.effector.Effector;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
@@ -69,22 +71,26 @@
     public static final ConfigKey<String> CREATION_SCRIPT_TEMPLATE = CanGiveCreationScript.CREATION_SCRIPT_TEMPLATE;
 
     public static interface CanGiveCreationScript {
+        @CatalogConfig(label = "Creation script contents")
         @SetFromFlag("creationScriptContents")
         public static final ConfigKey<String> CREATION_SCRIPT_CONTENTS = ConfigKeys.newStringConfigKey(
                 "datastore.creation.script.contents",
                 "Contents of creation script to initialize the datastore",
                 "");
 
+        @CatalogConfig(label = "Creation script URL")
         @SetFromFlag("creationScriptUrl")
         public static final ConfigKey<String> CREATION_SCRIPT_URL = ConfigKeys.newStringConfigKey(
                 "datastore.creation.script.url",
                 "URL of creation script to use to initialize the datastore (ignored if creationScriptContents is specified)",
                 "");
 
+        @CatalogConfig(label = "Creation script template URL")
         @SetFromFlag("creationScriptTemplateUrl")
         public static final ConfigKey<String> CREATION_SCRIPT_TEMPLATE = ConfigKeys.newStringConfigKey(
                 "datastore.creation.script.template.url",
-                "URL of creation script Freemarker template used to initialize the datastore (ignored if datastore.creation.script.contents or datastore.creation.script.url is specified)",
+                "URL of creation script Freemarker template used to initialize the datastore "
+                        + "(ignored if datastore.creation.script.contents or datastore.creation.script.url is specified)",
                 "");
     }
 
diff --git a/software/database/src/main/java/org/apache/brooklyn/entity/database/mysql/MySqlNode.java b/software/database/src/main/java/org/apache/brooklyn/entity/database/mysql/MySqlNode.java
index 568aac5..2996ff4 100644
--- a/software/database/src/main/java/org/apache/brooklyn/entity/database/mysql/MySqlNode.java
+++ b/software/database/src/main/java/org/apache/brooklyn/entity/database/mysql/MySqlNode.java
@@ -61,7 +61,8 @@
 
     @SetFromFlag("serverConf")
     MapConfigKey<Object> MYSQL_SERVER_CONF = new MapConfigKey<Object>(
-            Object.class, "mysql.server.conf", "Configuration options for mysqld");
+            Object.class, "mysql.server.conf", 
+            "Configuration options for mysqld (appended to mysql.conf in the format 'key = value')");
 
     ConfigKey<Object> MYSQL_SERVER_CONF_LOWER_CASE_TABLE_NAMES = MYSQL_SERVER_CONF.subKey("lower_case_table_names", "See MySQL guide. Set 1 to ignore case in table names (useful for OS portability)");
 
@@ -69,25 +70,31 @@
     ConfigKey<Integer> MYSQL_SERVER_ID = ConfigKeys.newIntegerConfigKey("mysql.server_id", "Corresponds to server_id option", 0);
 
     @SetFromFlag("user")
-    AttributeSensor USER = Sensors.newStringSensor("mysql.user", "Database admin user (default is `root`)");
+    AttributeSensor<String> USER = Sensors.newStringSensor("mysql.user", 
+            "Database admin user (default is 'root')");
 
     @SetFromFlag("password")
     StringAttributeSensorAndConfigKey PASSWORD = new StringAttributeSensorAndConfigKey(
-            "mysql.password", "Database admin password (or randomly generated if not set)", null);
+            "mysql.password", 
+            "Database admin password (or randomly generated if not set)", 
+            null);
 
     @SetFromFlag("socketUid")
     StringAttributeSensorAndConfigKey SOCKET_UID = new StringAttributeSensorAndConfigKey(
-            "mysql.socketUid", "Socket uid, for use in file /tmp/mysql.sock.<uid>.3306 (or randomly generated if not set)", null);
+            "mysql.socketUid", 
+            "Socket uid, for use in file /tmp/mysql.sock.<uid>.3306 (or randomly generated if not set)", 
+            null);
 
     @SetFromFlag("generalLog")
-    ConfigKey GENERAL_LOG = ConfigKeys.newBooleanConfigKey("mysql.general_log", "Enable general log", false);
-
-    /** @deprecated since 0.7.0 use DATASTORE_URL */ @Deprecated
-    AttributeSensor<String> MYSQL_URL = DATASTORE_URL;
+    ConfigKey<Boolean> GENERAL_LOG = ConfigKeys.newBooleanConfigKey(
+            "mysql.general_log", 
+            "Enable general_log option in mysql.conf", 
+            false);
 
     @SetFromFlag("configurationTemplateUrl")
     BasicAttributeSensorAndConfigKey<String> TEMPLATE_CONFIGURATION_URL = new StringAttributeSensorAndConfigKey(
-            "mysql.template.configuration.url", "Template file (in freemarker format) for the mysql.conf file",
+            "mysql.template.configuration.url", 
+            "Template file (in freemarker format) for the mysql.conf file. The default respects other config options such as 'mysql.general_log'",
             "classpath://org/apache/brooklyn/entity/database/mysql/mysql.conf");
 
     AttributeSensor<Double> QUERIES_PER_SECOND_FROM_MYSQL = Sensors.newDoubleSensor("mysql.queries.perSec.fromMysql");
diff --git a/software/webapp/src/main/java/org/apache/brooklyn/entity/proxy/LoadBalancer.java b/software/webapp/src/main/java/org/apache/brooklyn/entity/proxy/LoadBalancer.java
index 2a81d0d..6ff9cb4 100644
--- a/software/webapp/src/main/java/org/apache/brooklyn/entity/proxy/LoadBalancer.java
+++ b/software/webapp/src/main/java/org/apache/brooklyn/entity/proxy/LoadBalancer.java
@@ -21,6 +21,7 @@
 import java.net.URI;
 import java.util.Map;
 
+import org.apache.brooklyn.api.catalog.CatalogConfig;
 import org.apache.brooklyn.api.entity.Entity;
 import org.apache.brooklyn.api.entity.Group;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
@@ -55,45 +56,66 @@
  */
 public interface LoadBalancer extends Entity, Startable {
 
+    @CatalogConfig(label = "Server pool")
     @SetFromFlag("serverPool")
     ConfigKey<Group> SERVER_POOL = new BasicConfigKey<Group>(
-            Group.class, "loadbalancer.serverpool", "The default servers to route messages to");
+            Group.class, 
+            "loadbalancer.serverpool", 
+            "The default servers to route messages to (points at an entity of type 'Group' or 'Cluster')");
 
     @SetFromFlag("urlMappings")
     ConfigKey<Group> URL_MAPPINGS = new BasicConfigKey<Group>(
-            Group.class, "loadbalancer.urlmappings", "Special mapping rules (e.g. for domain/path matching, rewrite, etc); not supported by all load balancers");
+            Group.class, 
+            "loadbalancer.urlmappings", 
+            "Special mapping rules (e.g. for domain/path matching, rewrite, etc); not supported by all load balancers");
     
     /** sensor for port to forward to on target entities */
     @SuppressWarnings("serial")
     @SetFromFlag("portNumberSensor")
     public static final BasicAttributeSensorAndConfigKey<AttributeSensor<Integer>> PORT_NUMBER_SENSOR = new BasicAttributeSensorAndConfigKey<AttributeSensor<Integer>>(
-        new TypeToken<AttributeSensor<Integer>>() {}, "member.sensor.portNumber", "Port number sensor on members (defaults to http.port; not supported in all implementations)", Attributes.HTTP_PORT);
+        new TypeToken<AttributeSensor<Integer>>() {}, 
+        "member.sensor.portNumber", 
+        "Port number sensor on members (defaults to http.port; not supported in all implementations)", 
+        Attributes.HTTP_PORT);
 
     /** sensor for hostname to forward to on target entities */
     @SuppressWarnings("serial")
     @SetFromFlag("hostnameSensor")
     public static final BasicAttributeSensorAndConfigKey<AttributeSensor<String>> HOSTNAME_SENSOR = new BasicAttributeSensorAndConfigKey<AttributeSensor<String>>(
-        new TypeToken<AttributeSensor<String>>() {}, "member.sensor.hostname", "Hostname/IP sensor on members (defaults to host.subnet.hostname; not supported in all implementations)", Attributes.SUBNET_HOSTNAME);
+        new TypeToken<AttributeSensor<String>>() {}, 
+        "member.sensor.hostname", 
+        "Hostname/IP sensor on members (defaults to host.subnet.hostname; not supported in all implementations)", 
+        Attributes.SUBNET_HOSTNAME);
 
     /** sensor for hostname to forward to on target entities */
     @SuppressWarnings("serial")
     @SetFromFlag("hostAndPortSensor")
     public static final BasicAttributeSensorAndConfigKey<AttributeSensor<String>> HOST_AND_PORT_SENSOR = new BasicAttributeSensorAndConfigKey<AttributeSensor<String>>(
-            new TypeToken<AttributeSensor<String>>() {}, "member.sensor.hostandport", "host:port sensor on members (invalid to configure this and the portNumber or hostname sensors)", null);
+            new TypeToken<AttributeSensor<String>>() {}, 
+            "member.sensor.hostandport", 
+            "host:port sensor on members (invalid to configure this and the portNumber or hostname sensors)", 
+            null);
     
     @SetFromFlag("port")
     /** port where this controller should live */
     public static final PortAttributeSensorAndConfigKey PROXY_HTTP_PORT = new PortAttributeSensorAndConfigKey(
-            "proxy.http.port", "Main port where this proxy listens if using HTTP", ImmutableList.of(8000, "8001+"));
+            "proxy.http.port", 
+            "Main port where this proxy listens if using HTTP", 
+            ImmutableList.of(8000, "8001+"));
 
     @SetFromFlag("httpsPort")
     /** port where this controller should live */
     public static final PortAttributeSensorAndConfigKey PROXY_HTTPS_PORT = new PortAttributeSensorAndConfigKey(
-            "proxy.https.port", "Main port where this proxy listens if using HTTPS", ImmutableList.of(8443, "8443+"));
+            "proxy.https.port", 
+            "Main port where this proxy listens if using HTTPS", 
+            ImmutableList.of(8443, "8443+"));
 
     @SetFromFlag("protocol")
     public static final BasicAttributeSensorAndConfigKey<String> PROTOCOL = new BasicAttributeSensorAndConfigKey<String>(
-            String.class, "proxy.protocol", "Main URL protocol this proxy answers (typically http or https)", null);
+            String.class, 
+            "proxy.protocol", 
+            "Main URL protocol this proxy answers (typically http or https)", 
+            null);
     
     public static final AttributeSensor<String> HOSTNAME = Attributes.HOSTNAME;
     
diff --git a/software/webapp/src/main/java/org/apache/brooklyn/entity/proxy/nginx/NginxController.java b/software/webapp/src/main/java/org/apache/brooklyn/entity/proxy/nginx/NginxController.java
index a724a98..63cd317 100644
--- a/software/webapp/src/main/java/org/apache/brooklyn/entity/proxy/nginx/NginxController.java
+++ b/software/webapp/src/main/java/org/apache/brooklyn/entity/proxy/nginx/NginxController.java
@@ -75,11 +75,15 @@
 
     @SetFromFlag("stickyVersion")
     ConfigKey<String> STICKY_VERSION = ConfigKeys.newStringConfigKey(
-            "nginx.sticky.version", "Version of ngnix-sticky-module to be installed, if required", "1.2.5");
+            "nginx.sticky.version", 
+            "Version of ngnix-sticky-module to be installed, if required", 
+            "1.2.5");
 
     @SetFromFlag("pcreVersion")
     ConfigKey<String> PCRE_VERSION = ConfigKeys.newStringConfigKey(
-            "pcre.version", "Version of PCRE to be installed, if required", "8.37");
+            "pcre.version", 
+            "Version of PCRE to be installed, if required", 
+            "8.37");
 
     @SetFromFlag("downloadUrl")
     AttributeSensorAndConfigKey<String, String> DOWNLOAD_URL = ConfigKeys.newSensorAndConfigKeyWithDefault(SoftwareProcess.DOWNLOAD_URL,
@@ -97,19 +101,25 @@
 
     @SetFromFlag("httpPollPeriod")
     ConfigKey<Long> HTTP_POLL_PERIOD = ConfigKeys.newLongConfigKey(
-            "nginx.sensorpoll.http", "Poll period (in milliseconds)", 1000L);
+            "nginx.sensorpoll.http", "Poll period (in milliseconds) for health-check over http", 1000L);
 
     @SetFromFlag("withLdOpt")
     ConfigKey<String> WITH_LD_OPT = ConfigKeys.newStringConfigKey(
-            "nginx.install.withLdOpt", "String to pass in with --with-ld-opt=\"<val>\" (and for OS X has pcre auto-appended to this)", "-L /usr/local/lib");
+            "nginx.install.withLdOpt", 
+            "String to pass in with --with-ld-opt=\"<val>\" (and for OS X has pcre auto-appended to this)", 
+            "-L /usr/local/lib");
 
     @SetFromFlag("withCcOpt")
     ConfigKey<String> WITH_CC_OPT = ConfigKeys.newStringConfigKey(
-            "nginx.install.withCcOpt", "String to pass in with --with-cc-opt=\"<val>\"", "-I /usr/local/include");
+            "nginx.install.withCcOpt", 
+            "String to pass in with --with-cc-opt=\"<val>\"", 
+            "-I /usr/local/include");
 
     @SetFromFlag("configGenerator")
     ConfigKey<NginxConfigFileGenerator> SERVER_CONF_GENERATOR = ConfigKeys.newConfigKey(NginxConfigFileGenerator.class,
-            "nginx.config.generator", "The server.conf generator class", new NginxDefaultConfigGenerator());
+            "nginx.config.generator", 
+            "The server.conf generator class", 
+            new NginxDefaultConfigGenerator());
 
     @SetFromFlag("configTemplate")
     ConfigKey<String> SERVER_CONF_TEMPLATE_URL = NginxTemplateConfigGenerator.SERVER_CONF_TEMPLATE_URL;
@@ -119,10 +129,14 @@
             "nginx.config.staticContentArchiveUrl", "The URL of an archive file of static content (To be copied to the server)");
 
     AttributeSensorAndConfigKey<String, String> ACCESS_LOG_LOCATION = ConfigKeys.newStringSensorAndConfigKey(
-            "nginx.log.access", "Nginx access log file location", "logs/access.log");
+            "nginx.log.access", 
+            "Nginx access log file location", 
+            "logs/access.log");
 
     AttributeSensorAndConfigKey<String, String> ERROR_LOG_LOCATION = ConfigKeys.newStringSensorAndConfigKey(
-            "nginx.log.error", "Nginx error log file location", "logs/error.log");
+            "nginx.log.error", 
+            "Nginx error log file location", 
+            "logs/error.log");
 
     boolean isSticky();
 
diff --git a/software/webapp/src/main/java/org/apache/brooklyn/entity/webapp/tomcat/Tomcat8Server.java b/software/webapp/src/main/java/org/apache/brooklyn/entity/webapp/tomcat/Tomcat8Server.java
index f638483..47ce648 100644
--- a/software/webapp/src/main/java/org/apache/brooklyn/entity/webapp/tomcat/Tomcat8Server.java
+++ b/software/webapp/src/main/java/org/apache/brooklyn/entity/webapp/tomcat/Tomcat8Server.java
@@ -48,11 +48,13 @@
 
     @SetFromFlag("server.xml")
     ConfigKey<String> SERVER_XML_RESOURCE = ConfigKeys.newStringConfigKey(
-            "tomcat.serverxml", "The file to template and use as the Tomcat process' server.xml",
+            "tomcat.serverxml", 
+            "The file to template and use as the Tomcat's server.xml",
             JavaClassNames.resolveClasspathUrl(Tomcat8Server.class, "tomcat8-server.xml"));
 
     @SetFromFlag("web.xml")
     ConfigKey<String> WEB_XML_RESOURCE = ConfigKeys.newStringConfigKey(
-            "tomcat.webxml", "The file to template and use as the Tomcat process' web.xml",
+            "tomcat.webxml", 
+            "The file to template and use as the Tomcat's web.xml",
             JavaClassNames.resolveClasspathUrl(Tomcat8Server.class, "tomcat8-web.xml"));
 }
diff --git a/software/webapp/src/main/java/org/apache/brooklyn/entity/webapp/tomcat/TomcatServer.java b/software/webapp/src/main/java/org/apache/brooklyn/entity/webapp/tomcat/TomcatServer.java
index f71bd41..08849a4 100644
--- a/software/webapp/src/main/java/org/apache/brooklyn/entity/webapp/tomcat/TomcatServer.java
+++ b/software/webapp/src/main/java/org/apache/brooklyn/entity/webapp/tomcat/TomcatServer.java
@@ -19,6 +19,7 @@
 package org.apache.brooklyn.entity.webapp.tomcat;
 
 import org.apache.brooklyn.api.catalog.Catalog;
+import org.apache.brooklyn.api.catalog.CatalogConfig;
 import org.apache.brooklyn.api.entity.ImplementedBy;
 import org.apache.brooklyn.api.objs.HasShortName;
 import org.apache.brooklyn.api.sensor.AttributeSensor;
@@ -30,6 +31,7 @@
 import org.apache.brooklyn.core.sensor.Sensors;
 import org.apache.brooklyn.entity.java.UsesJmx;
 import org.apache.brooklyn.entity.software.base.SoftwareProcess;
+import org.apache.brooklyn.entity.webapp.JavaWebAppService;
 import org.apache.brooklyn.entity.webapp.JavaWebAppSoftwareProcess;
 import org.apache.brooklyn.util.core.ResourcePredicates;
 import org.apache.brooklyn.util.core.flags.SetFromFlag;
@@ -45,6 +47,10 @@
 @ImplementedBy(TomcatServerImpl.class)
 public interface TomcatServer extends JavaWebAppSoftwareProcess, UsesJmx, HasShortName {
 
+    @CatalogConfig(label = "Root WAR")
+    @SetFromFlag("war")
+    public static final ConfigKey<String> ROOT_WAR = JavaWebAppService.ROOT_WAR;
+
     @SetFromFlag("version")
     ConfigKey<String> SUGGESTED_VERSION = ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION, "7.0.65");
 
@@ -61,13 +67,14 @@
      * so override default here to a high-numbered port.
      */
     @SetFromFlag("shutdownPort")
-    PortAttributeSensorAndConfigKey SHUTDOWN_PORT =
-            ConfigKeys.newPortSensorAndConfigKey("tomcat.shutdownport", "Suggested shutdown port", PortRanges.fromString("31880+"));
+    PortAttributeSensorAndConfigKey SHUTDOWN_PORT = ConfigKeys.newPortSensorAndConfigKey(
+            "tomcat.shutdownport", 
+            "Suggested shutdown port", PortRanges.fromString("31880+"));
 
     @SetFromFlag("server.xml")
     ConfigKey<String> SERVER_XML_RESOURCE = ConfigKeys.builder(String.class)
             .name("tomcat.serverxml")
-            .description("The file to template and use as the Tomcat process' server.xml")
+            .description("The file to template and use as the Tomcat's server.xml")
             .defaultValue(JavaClassNames.resolveClasspathUrl(TomcatServer.class, "server.xml"))
             .constraint(ResourcePredicates.urlExists())
             .build();
@@ -75,15 +82,16 @@
     @SetFromFlag("web.xml")
     ConfigKey<String> WEB_XML_RESOURCE = ConfigKeys.builder(String.class)
             .name("tomcat.webxml")
-            .description("The file to template and use as the Tomcat process' web.xml")
+            .description("The file to template and use as the Tomcat's web.xml")
             .defaultValue(JavaClassNames.resolveClasspathUrl(TomcatServer.class, "web.xml"))
             .constraint(ResourcePredicates.urlExists())
             .build();
 
     ConfigKey<Duration> START_TIMEOUT = ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.START_TIMEOUT, Duration.FIVE_MINUTES);
 
-    AttributeSensor<String> CONNECTOR_STATUS =
-            Sensors.newStringSensor("webapp.tomcat.connectorStatus", "Catalina connector state name");
+    AttributeSensor<String> CONNECTOR_STATUS = Sensors.newStringSensor(
+            "webapp.tomcat.connectorStatus", 
+            "Catalina connector state name");
 
     AttributeSensor<String> JMX_SERVICE_URL = UsesJmx.JMX_URL;