You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@manifoldcf.apache.org by kw...@apache.org on 2017/05/02 16:00:56 UTC

svn commit: r1793547 [2/4] - in /manifoldcf/trunk: ./ connectors/webcrawler/ connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/ connectors/webcrawler/connector/src/main/native2ascii/org/apache/manifoldcf/...

Modified: manifoldcf/trunk/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/WebcrawlerConnector.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/WebcrawlerConnector.java?rev=1793547&r1=1793546&r2=1793547&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/WebcrawlerConnector.java (original)
+++ manifoldcf/trunk/connectors/webcrawler/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/webcrawler/WebcrawlerConnector.java Tue May  2 16:00:56 2017
@@ -1563,344 +1563,90 @@ public class WebcrawlerConnector extends
     tabsArray.add(Messages.getString(locale,"WebcrawlerConnector.Certificates"));
     tabsArray.add(Messages.getString(locale,"WebcrawlerConnector.Proxy"));
 
-    out.print(
-"<script type=\"text/javascript\">\n"+
-"<!--\n"+
-"function checkConfig()\n"+
-"{\n"+
-"  if (editconnection.email.value != \"\" && editconnection.email.value.indexOf(\"@\") == -1)\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.NeedAValidEmailAddress")+"\");\n"+
-"    editconnection.email.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"\n"+
-"  // If the Bandwidth tab is up, check to be sure we have valid numbers and regexps everywhere.\n"+
-"  var i = 0;\n"+
-"  var count = editconnection.bandwidth_count.value;\n"+
-"  while (i < count)\n"+
-"  {\n"+
-"    var connections = eval(\"editconnection.connections_bandwidth_\"+i+\".value\");\n"+
-"    if (connections != \"\" && !isInteger(connections))\n"+
-"    {\n"+
-"      alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.MaximumConnectionsMustBeAnInteger")+"\");\n"+
-"      eval(\"editconnection.connections_bandwidth_\"+i+\".focus()\");\n"+
-"      return false;\n"+
-"    }\n"+
-"    var rate = eval(\"editconnection.rate_bandwidth_\"+i+\".value\");\n"+
-"    if (rate != \"\" && !isInteger(rate))\n"+
-"    {\n"+
-"      alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.MaximumKbytesPerSecondMustBeAnInteger")+"\");\n"+
-"      eval(\"editconnection.rate_bandwidth_\"+i+\".focus()\");\n"+
-"      return false;\n"+
-"    }\n"+
-"    var fetches = eval(\"editconnection.fetches_bandwidth_\"+i+\".value\");\n"+
-"    if (fetches != \"\" && !isInteger(fetches))\n"+
-"    {\n"+
-"      alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.MaximumFetchesPerMinuteMustBeAnInteger")+"\");\n"+
-"      eval(\"editconnection.fetches_bandwidth_\"+i+\".focus()\");\n"+
-"      return false;\n"+
-"    }\n"+
-"\n"+
-"    i = i + 1;\n"+
-"  }\n"+
-"    \n"+
-"  // Make sure access credentials are all legal\n"+
-"  i = 0;\n"+
-"  count = editconnection.acredential_count.value;\n"+
-"  while (i < count)\n"+
-"  {\n"+
-"    var username = eval(\"editconnection.username_acredential_\"+i+\".value\");\n"+
-"    if (username == \"\")\n"+
-"    {\n"+
-"      alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.CredentialMustHaveNonNullUserName")+"\");\n"+
-"      eval(\"editconnection.username_acredential_\"+i+\".focus()\");\n"+
-"      return false;\n"+
-"    }\n"+
-"    i = i + 1;\n"+
-"  }\n"+
-"\n"+
-"  // Make sure session credentials are all legal\n"+
-"  i = 0;\n"+
-"  count = editconnection.scredential_count.value;\n"+
-"  while (i < count)\n"+
-"  {\n"+
-"    var loginpagecount = eval(\"editconnection.scredential_\"+i+\"_loginpagecount.value\");\n"+
-"    var j = 0;\n"+
-"    while (j < loginpagecount)\n"+
-"    {\n"+
-"      var matchregexp = eval(\"editconnection.scredential_\"+i+\"_\"+j+\"_matchregexp.value\");\n"+
-"      if (!isRegularExpression(matchregexp))\n"+
-"      {\n"+
-"        alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.MatchExpressionMustBeAValidRegularExpression")+"\");\n"+
-"        eval(\"editconnection.scredential_\"+i+\"_\"+j+\"_matchregexp.focus()\");\n"+
-"        return false;\n"+
-"      }\n"+
-"      if (eval(\"editconnection.scredential_\"+i+\"_\"+j+\"_type.value\") == \"form\")\n"+
-"      {\n"+
-"        var paramcount = eval(\"editconnection.scredential_\"+i+\"_\"+j+\"_loginparamcount.value\");\n"+
-"        var k = 0;\n"+
-"        while (k < paramcount)\n"+
-"        {\n"+
-"          var paramname = eval(\"editconnection.scredential_\"+i+\"_\"+j+\"_\"+k+\"_param.value\");\n"+
-"          if (paramname == \"\")\n"+
-"          {\n"+
-"            alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.ParameterMustHaveNonEmptyName")+"\");\n"+
-"            eval(\"editconnection.scredential_\"+i+\"_\"+j+\"_\"+k+\"_param.focus()\");\n"+
-"            return false;\n"+
-"          }\n"+
-"          var paramvalue = eval(\"editconnection.scredential_\"+i+\"_\"+j+\"_\"+k+\"_value.value\");\n"+
-"          var parampassword = eval(\"editconnection.scredential_\"+i+\"_\"+j+\"_\"+k+\"_password.value\");\n"+
-"          if (paramvalue != \"\" && parampassword != \"\")\n"+
-"          {\n"+
-"            alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.ParameterCanEitherBeHidden")+"\");\n"+
-"            eval(\"editconnection.scredential_\"+i+\"_\"+j+\"_\"+k+\"_value.focus()\");\n"+
-"            return false;\n"+
-"          }\n"+
-"          k = k + 1;\n"+
-"        }\n"+
-"      }\n"+
-"      j = j + 1;\n"+
-"    }\n"+
-"    i = i + 1;\n"+
-"  }\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"function checkConfigForSave()\n"+
-"{\n"+
-"  if (editconnection.email.value == \"\")\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.EmailAaddressRequired") + "\");\n"+
-"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.Email") + "\");\n"+
-"    editconnection.email.focus();\n"+
-"    return false;\n"+
-"  }\n"+
-"  return true;\n"+
-"}\n"+
-"\n"+
-"function deleteRegexp(i)\n"+
-"{\n"+
-"  // Set the operation\n"+
-"  eval(\"editconnection.op_bandwidth_\"+i+\".value=\\\"Delete\\\"\");\n"+
-"  // Submit\n"+
-"  if (editconnection.bandwidth_count.value==i)\n"+
-"    postFormSetAnchor(\"bandwidth\");\n"+
-"  else\n"+
-"    postFormSetAnchor(\"bandwidth_\"+i)\n"+
-"  // Undo, so we won't get two deletes next time\n"+
-"  eval(\"editconnection.op_bandwidth_\"+i+\".value=\\\"Continue\\\"\");\n"+
-"}\n"+
-"\n"+
-"function addRegexp()\n"+
-"{\n"+
-"  if (editconnection.connections_bandwidth.value != \"\" && !isInteger(editconnection.connections_bandwidth.value))\n"+
-"  {\n"+
-"    alert(\"" + Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.MaximumConnectionsMustBeAnInteger")+"\");\n"+
-"    editconnection.connections_bandwidth.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  if (editconnection.rate_bandwidth.value != \"\" && !isInteger(editconnection.rate_bandwidth.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.MaximumKbytesPerSecondMustBeAnInteger")+"\");\n"+
-"    editconnection.rate_bandwidth.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  if (editconnection.fetches_bandwidth.value != \"\" && !isInteger(editconnection.fetches_bandwidth.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.MaximumFetchesPerMinuteMustBeAnInteger")+"\");\n"+
-"    editconnection.fetches_bandwidth.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  if (!isRegularExpression(editconnection.regexp_bandwidth.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.AValidRegularExpressionIsRequired")+"\");\n"+
-"    editconnection.regexp_bandwidth.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  editconnection.bandwidth_op.value=\"Add\";\n"+
-"  postFormSetAnchor(\"bandwidth\");\n"+
-"}\n"+
-"\n"+
-"function deleteARegexp(i)\n"+
-"{\n"+
-"  // Set the operation\n"+
-"  eval(\"editconnection.op_acredential_\"+i+\".value=\\\"Delete\\\"\");\n"+
-"  // Submit\n"+
-"  if (editconnection.acredential_count.value==i)\n"+
-"    postFormSetAnchor(\"acredential\");\n"+
-"  else\n"+
-"    postFormSetAnchor(\"acredential_\"+i)\n"+
-"  // Undo, so we won't get two deletes next time\n"+
-"  eval(\"editconnection.op_acredential_\"+i+\".value=\\\"Continue\\\"\");\n"+
-"}\n"+
-"\n"+
-"function addARegexp()\n"+
-"{\n"+
-"  if (editconnection.username_acredential.value == \"\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.CredentialMustIncludeANonNullUserName")+"\");\n"+
-"    editconnection.username_acredential.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  if (!isRegularExpression(editconnection.regexp_acredential.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.AValidRegularExpressionIsRequired")+"\");\n"+
-"    editconnection.regexp_acredential.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  editconnection.acredential_op.value=\"Add\";\n"+
-"  postFormSetAnchor(\"acredential\");\n"+
-"}\n"+
-"\n"+
-"function deleteSRegexp(i)\n"+
-"{\n"+
-"  // Set the operation\n"+
-"  eval(\"editconnection.scredential_\"+i+\"_op.value=\\\"Delete\\\"\");\n"+
-"  // Submit\n"+
-"  if (editconnection.scredential_count.value==i)\n"+
-"    postFormSetAnchor(\"scredential\");\n"+
-"  else\n"+
-"    postFormSetAnchor(\"scredential_\"+i)\n"+
-"  // Undo, so we won't get two deletes next time\n"+
-"  eval(\"editconnection.scredential_\"+i+\"_op.value=\\\"Continue\\\"\");\n"+
-"}\n"+
-"\n"+
-"function addSRegexp()\n"+
-"{\n"+
-"  if (!isRegularExpression(editconnection.scredential_regexp.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.AValidRegularExpressionIsRequired")+"\");\n"+
-"    editconnection.scredential_regexp.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  editconnection.scredential_op.value=\"Add\";\n"+
-"  postFormSetAnchor(\"scredential\");\n"+
-"}\n"+
-"\n"+
-"function deleteLoginPage(credential,loginpage)\n"+
-"{\n"+
-"  // Set the operation\n"+
-"  eval(\"editconnection.scredential_\"+credential+\"_\"+loginpage+\"_op.value=\\\"Delete\\\"\");\n"+
-"  // Submit\n"+
-"  if (eval(\"editconnection.scredential_\"+credential+\"_loginpagecount.value\")==credential)\n"+
-"    postFormSetAnchor(\"scredential_loginpage\");\n"+
-"  else\n"+
-"    postFormSetAnchor(\"scredential_\"+credential+\"_\"+loginpage)\n"+
-"  // Undo, so we won't get two deletes next time\n"+
-"  eval(\"editconnection.scredential_\"+credential+\"_\"+loginpage+\"_op.value=\\\"Continue\\\"\");\n"+
-"\n"+
-"}\n"+
-"  \n"+
-"function addLoginPage(credential)\n"+
-"{\n"+
-"  if (!isRegularExpression(eval(\"editconnection.scredential_\"+credential+\"_loginpageregexp.value\")))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.AValidRegularExpressionIsRequired")+"\");\n"+
-"    eval(\"editconnection.scredential_\"+credential+\"_loginpageregexp.focus()\");\n"+
-"    return;\n"+
-"  }\n"+
-"  if (!isRegularExpression(eval(\"editconnection.scredential_\"+credential+\"_loginpagematchregexp.value\")))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.AValidRegularExpressionIsRequired")+"\");\n"+
-"    eval(\"editconnection.scredential_\"+credential+\"_loginpagematchregexp.focus()\");\n"+
-"    return;\n"+
-"  }\n"+
-"  eval(\"editconnection.scredential_\"+credential+\"_loginpageop.value=\\\"Add\\\"\");\n"+
-"  postFormSetAnchor(\"scredential_\"+credential);\n"+
-"}\n"+
-"  \n"+
-"function deleteLoginPageParameter(credential,loginpage,parameter)\n"+
-"{\n"+
-"  // Set the operation\n"+
-"  eval(\"editconnection.scredential_\"+credential+\"_\"+loginpage+\"_\"+parameter+\"_op.value=\\\"Delete\\\"\");\n"+
-"  // Submit\n"+
-"  if (eval(\"editconnection.scredential_\"+credential+\"_\"+loginpage+\"_loginparamcount.value\")==credential)\n"+
-"    postFormSetAnchor(\"scredential_\"+credential+\"_loginparam\");\n"+
-"  else\n"+
-"    postFormSetAnchor(\"scredential_\"+credential+\"_\"+loginpage+\"_\"+parameter)\n"+
-"  // Undo, so we won't get two deletes next time\n"+
-"  eval(\"editconnection.scredential_\"+credential+\"_\"+loginpage+\"_\"+parameter+\"_op.value=\\\"Continue\\\"\");\n"+
-"}\n"+
-"  \n"+
-"function addLoginPageParameter(credential,loginpage)\n"+
-"{\n"+
-"  if (!isRegularExpression(eval(\"editconnection.scredential_\"+credential+\"_\"+loginpage+\"_loginparamname.value\")))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.ParameterNameMustBeARegularExpression")+"\");\n"+
-"    eval(\"editconnection.scredential_\"+credential+\"_\"+loginpage+\"_loginparamname.focus()\");\n"+
-"    return;\n"+
-"  }\n"+
-"  if (eval(\"editconnection.scredential_\"+credential+\"_\"+loginpage+\"_loginparamvalue.value\") != \"\" && eval(\"editconnection.scredential_\"+credential+\"_\"+loginpage+\"_loginparampassword.value\") != \"\")\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.ParameterCanEitherBeHidden")+"\");\n"+
-"    eval(\"editconnection.scredential_\"+credential+\"_\"+loginpage+\"_loginparamvalue.focus()\");\n"+
-"    return;\n"+
-"  }\n"+
-"  eval(\"editconnection.scredential_\"+credential+\"_\"+loginpage+\"_loginparamop.value=\\\"Add\\\"\");\n"+
-"  postFormSetAnchor(\"scredential_\"+credential+\"_\"+loginpage);\n"+
-"}\n"+
-"  \n"+
-"function deleteTRegexp(i)\n"+
-"{\n"+
-"  // Set the operation\n"+
-"  eval(\"editconnection.op_trust_\"+i+\".value=\\\"Delete\\\"\");\n"+
-"  // Submit\n"+
-"  if (editconnection.trust_count.value==i)\n"+
-"    postFormSetAnchor(\"trust\");\n"+
-"  else\n"+
-"    postFormSetAnchor(\"trust_\"+i);\n"+
-"  // Undo, so we won't get two deletes next time\n"+
-"  eval(\"editconnection.op_trust_\"+i+\".value=\\\"Continue\\\"\");\n"+
-"}\n"+
-"\n"+
-"function addTRegexp()\n"+
-"{\n"+
-"  if (editconnection.certificate_trust.value == \"\" && editconnection.all_trust.checked == false)\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.SpecifyATrustCertificateFileToUploadFirst")+"\");\n"+
-"    editconnection.certificate_trust.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  if (!isRegularExpression(editconnection.regexp_trust.value))\n"+
-"  {\n"+
-"    alert(\""+Messages.getBodyJavascriptString(locale,"WebcrawlerConnector.AValidRegularExpressionIsRequired")+"\");\n"+
-"    editconnection.regexp_trust.focus();\n"+
-"    return;\n"+
-"  }\n"+
-"  editconnection.trust_op.value=\"Add\";\n"+
-"  postFormSetAnchor(\"trust\");\n"+
-"}\n"+
-"  \n"+
-"//-->\n"+
-"</script>\n"
-    );
+    final Map<String,Object> velocityContext = new HashMap<String,Object>();
+    Messages.outputResourceWithVelocity(out, locale, "editConfiguration.js.vm", velocityContext);
   }
-  
-  /** Output the configuration body section.
-  * This method is called in the body section of the connector's configuration page.  Its purpose is to present the required form elements for editing.
-  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
-  * form is "editconnection".
-  *@param threadContext is the local thread context.
-  *@param out is the output to which any HTML should be sent.
-  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
-  *@param tabName is the current tab name.
-  */
-  @Override
-  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
-    Locale locale, ConfigParams parameters, String tabName)
-    throws ManifoldCFException, IOException
+
+  private void fillInEmailTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters)
   {
-    
     String email = parameters.getParameter(WebcrawlerConfig.PARAMETER_EMAIL);
     if (email == null)
       email = "";
+
+    velocityContext.put("EMAIL",email);
+  }
+
+  private void fillInRobotsTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters)
+  {
     String robotsUsage = parameters.getParameter(WebcrawlerConfig.PARAMETER_ROBOTSUSAGE);
     if (robotsUsage == null)
       robotsUsage = "all";
     String metaRobotsTagsUsage = parameters.getParameter(WebcrawlerConfig.PARAMETER_META_ROBOTS_TAGS_USAGE);
     if (metaRobotsTagsUsage == null)
       metaRobotsTagsUsage = "all";
+
+    velocityContext.put("ROBOTSUSAGE",robotsUsage);
+    velocityContext.put("METAROBOTSTAGSUSAGE",metaRobotsTagsUsage);
+  }
+
+  private void fillInBandwidthTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters)
+  {
+    int i = 0;
+    int binCounter = 0;
+    List<Map<String,String>> throttlesMapList = new ArrayList<>();
+    while (i < parameters.getChildCount())
+    {
+      ConfigNode cn = parameters.getChild(i++);
+      if (cn.getType().equals(WebcrawlerConfig.NODE_BINDESC))
+      {
+        Map<String,String> throttleMap = new HashMap<>();
+        // A bin description node!  Look for all its parameters.
+        String regexp = cn.getAttributeValue(WebcrawlerConfig.ATTR_BINREGEXP);
+        String isCaseInsensitive = cn.getAttributeValue(WebcrawlerConfig.ATTR_INSENSITIVE);
+        String maxConnections = null;
+        String maxKBPerSecond = null;
+        String maxFetchesPerMinute = null;
+        int j = 0;
+        while (j < cn.getChildCount())
+        {
+          ConfigNode childNode = cn.getChild(j++);
+          if (childNode.getType().equals(WebcrawlerConfig.NODE_MAXCONNECTIONS))
+            maxConnections = childNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
+          else if (childNode.getType().equals(WebcrawlerConfig.NODE_MAXKBPERSECOND))
+            maxKBPerSecond = childNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
+          else if (childNode.getType().equals(WebcrawlerConfig.NODE_MAXFETCHESPERMINUTE))
+            maxFetchesPerMinute = childNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
+        }
+        if (maxConnections == null)
+          maxConnections = "";
+        if (maxKBPerSecond == null)
+          maxKBPerSecond = "";
+        if (maxFetchesPerMinute == null)
+          maxFetchesPerMinute = "";
+        if(regexp == null)
+          regexp = "";
+
+        if (isCaseInsensitive == null || isCaseInsensitive.length() == 0)
+          isCaseInsensitive = "false";
+
+        throttleMap.put("regexp",regexp);
+        throttleMap.put("isCaseInsensitive",isCaseInsensitive);
+        throttleMap.put("maxConnections",maxConnections);
+        throttleMap.put("maxKBPerSecond",maxKBPerSecond);
+        throttleMap.put("maxFetchesPerMinute",maxFetchesPerMinute);
+        throttlesMapList.add(throttleMap);
+        binCounter++;
+      }
+    }
+    if (parameters.getChildCount() == 0)
+    {
+      velocityContext.put("BRANDNEW",true);
+    }
+    velocityContext.put("THROTTLESMAPLIST",throttlesMapList);
+  }
+
+  private void fillInProxyTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters)
+  {
     String proxyHost = parameters.getParameter(WebcrawlerConfig.PARAMETER_PROXYHOST);
     if (proxyHost == null)
       proxyHost = "";
@@ -1919,969 +1665,217 @@ public class WebcrawlerConnector extends
     else
       proxyAuthPassword = out.mapPasswordToKey(proxyAuthPassword);
 
-    // Proxy tab
-    if (tabName.equals(Messages.getString(locale,"WebcrawlerConnector.Proxy")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.ProxyHostColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"40\" name=\"proxyhost\" value=\""+Encoder.attributeEscape(proxyHost)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.ProxyPortColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"5\" name=\"proxyport\" value=\""+Encoder.attributeEscape(proxyPort)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.ProxyAuthenticationDomainColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"32\" name=\"proxyauthdomain\" value=\""+Encoder.attributeEscape(proxyAuthDomain)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.ProxyAuthenticationUserNameColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"32\" name=\"proxyauthusername\" value=\""+Encoder.attributeEscape(proxyAuthUsername)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.ProxyAuthenticationPasswordColon") + "</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"password\" size=\"16\" name=\"proxyauthpassword\" value=\""+Encoder.attributeEscape(proxyAuthPassword)+"\"/></td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\"proxyhost\" value=\""+Encoder.attributeEscape(proxyHost)+"\"/>\n"+
-"<input type=\"hidden\" name=\"proxyport\" value=\""+Encoder.attributeEscape(proxyPort)+"\"/>\n"+
-"<input type=\"hidden\" name=\"proxyauthusername\" value=\""+Encoder.attributeEscape(proxyAuthUsername)+"\"/>\n"+
-"<input type=\"hidden\" name=\"proxyauthdomain\" value=\""+Encoder.attributeEscape(proxyAuthDomain)+"\"/>\n"+
-"<input type=\"hidden\" name=\"proxyauthpassword\" value=\""+Encoder.attributeEscape(proxyAuthPassword)+"\"/>\n"
-      );
-    }
-
-    // Email tab
-    if (tabName.equals(Messages.getString(locale,"WebcrawlerConnector.Email")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.EmailAddressToContact") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"text\" size=\"32\" name=\"email\" value=\""+Encoder.attributeEscape(email)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\"email\" value=\""+Encoder.attributeEscape(email)+"\"/>\n"
-      );
-    }
-
-    // Robots tab
-    if (tabName.equals(Messages.getString(locale,"WebcrawlerConnector.Robots")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.RobotsTxtUsage") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <select name=\"robotsusage\" size=\"3\">\n"+
-"        <option value=\"none\" "+(robotsUsage.equals("none")?"selected=\"selected\"":"")+">" + Messages.getBodyString(locale,"WebcrawlerConnector.DontLookAtRobotsTxt") + "</option>\n"+
-"        <option value=\"data\" "+(robotsUsage.equals("data")?"selected=\"selected\"":"")+">" + Messages.getBodyString(locale,"WebcrawlerConnector.ObeyRobotsTxtForDataFetchesOnly") + "</option>\n"+
-"        <option value=\"all\" "+(robotsUsage.equals("all")?"selected=\"selected\"":"")+">" + Messages.getBodyString(locale,"WebcrawlerConnector.ObeyRobotsTxtForAllFetches") + "</option>\n"+
-"      </select>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.MetaRobotsTagsUsage") + "</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <select name=\"metarobotstagsusage\" size=\"3\">\n"+
-"        <option value=\"none\" "+(metaRobotsTagsUsage.equals("none")?"selected=\"selected\"":"")+">" + Messages.getBodyString(locale,"WebcrawlerConnector.DontLookAtMetaRobotsTags") + "</option>\n"+
-"        <option value=\"all\" "+(metaRobotsTagsUsage.equals("all")?"selected=\"selected\"":"")+">" + Messages.getBodyString(locale,"WebcrawlerConnector.ObeyMetaRobotsTags") + "</option>\n"+
-"      </select>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      out.print(
-"<input type=\"hidden\" name=\"robotsusage\" value=\""+robotsUsage+"\"/>\n"+
-"<input type=\"hidden\" name=\"metarobotstagsusage\" value=\""+metaRobotsTagsUsage+"\"/>\n"
-      );
-    }
-
-    // Bandwidth tab
-    if (tabName.equals(Messages.getString(locale,"WebcrawlerConnector.Bandwidth")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.Throttles") + "</nobr></td>\n"+
-"    <td class=\"boxcell\">\n"+
-"      <table class=\"formtable\">\n"+
-"        <tr class=\"formheaderrow\">\n"+
-"          <td class=\"formcolumnheader\"></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.BinRegularExpression") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.CaseInsensitive") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.MaxConnections") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.MaxKbytesSec") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.MaxFetchesMin") + "</nobr></td>\n"+
-"        </tr>\n"
-      );
-      int i = 0;
-      int binCounter = 0;
-      while (i < parameters.getChildCount())
-      {
-        ConfigNode cn = parameters.getChild(i++);
-        if (cn.getType().equals(WebcrawlerConfig.NODE_BINDESC))
-        {
-          // A bin description node!  Look for all its parameters.
-          String regexp = cn.getAttributeValue(WebcrawlerConfig.ATTR_BINREGEXP);
-          String isCaseInsensitive = cn.getAttributeValue(WebcrawlerConfig.ATTR_INSENSITIVE);
-          String maxConnections = null;
-          String maxKBPerSecond = null;
-          String maxFetchesPerMinute = null;
-          int j = 0;
-          while (j < cn.getChildCount())
-          {
-            ConfigNode childNode = cn.getChild(j++);
-            if (childNode.getType().equals(WebcrawlerConfig.NODE_MAXCONNECTIONS))
-              maxConnections = childNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-            else if (childNode.getType().equals(WebcrawlerConfig.NODE_MAXKBPERSECOND))
-              maxKBPerSecond = childNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-            else if (childNode.getType().equals(WebcrawlerConfig.NODE_MAXFETCHESPERMINUTE))
-              maxFetchesPerMinute = childNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-          }
-          if (maxConnections == null)
-            maxConnections = "";
-          if (maxKBPerSecond == null)
-            maxKBPerSecond = "";
-          if (maxFetchesPerMinute == null)
-            maxFetchesPerMinute = "";
-            
-          if (isCaseInsensitive == null || isCaseInsensitive.length() == 0)
-            isCaseInsensitive = "false";
-
-          // It's prefix will be...
-          String prefix = "bandwidth_" + Integer.toString(binCounter);
-          out.print(
-"        <tr class=\""+(((binCounter % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <a name=\""+prefix+"\">\n"+
-"              <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.Delete") + "\" alt=\""+Messages.getAttributeString(locale,"WebcrawlerConnector.DeleteBinRegularExpression")+Integer.toString(binCounter+1)+"\" onclick='javascript:deleteRegexp("+Integer.toString(binCounter)+");'/>\n"+
-"              <input type=\"hidden\" name=\""+"op_"+prefix+"\" value=\"Continue\"/>\n"+
-"              <input type=\"hidden\" name=\""+"regexp_"+prefix+"\" value=\""+Encoder.attributeEscape(regexp)+"\"/>\n"+
-"            </a>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>"+Encoder.bodyEscape(regexp)+"</nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"checkbox\" name=\"insensitive_"+prefix+"\" value=\"true\" "+(isCaseInsensitive.equals("true")?"checked=\"\"":"")+" /></nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"text\" size=\"5\" name=\"connections_"+prefix+"\" value=\""+maxConnections+"\"/></nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"text\" size=\"5\" name=\"rate_"+prefix+"\" value=\""+maxKBPerSecond+"\"/></nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"text\" size=\"5\" name=\"fetches_"+prefix+"\" value=\""+maxFetchesPerMinute+"\"/></nobr>\n"+
-"          </td>\n"+
-"        </tr>\n"
-          );
-          binCounter++;
-        }
-      }
-
-      // If it looks like this is a brand-new configuration, add in a default throttle.
-      // This only works because other nodes must get created on the first post, and cannot then be deleted.
-      if (parameters.getChildCount() == 0)
-      {
-        // It's prefix will be...
-        String prefix = "bandwidth_" + Integer.toString(binCounter);
-        out.print(
-"        <tr class=\""+(((binCounter % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <a name=\""+prefix+"\">\n"+
-"              <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.Delete") + "\" alt=\""+ Messages.getAttributeString(locale,"WebcrawlerConnector.DeleteBinRegularExpression") +Integer.toString(binCounter+1)+"\" onclick='javascript:deleteRegexp("+Integer.toString(binCounter)+");'/>\n"+
-"              <input type=\"hidden\" name=\""+"op_"+prefix+"\" value=\"Continue\"/>\n"+
-"              <input type=\"hidden\" name=\""+"regexp_"+prefix+"\" value=\"\"/>\n"+
-"            </a>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr></nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"checkbox\" name=\"insensitive_"+prefix+"\" value=\"false\"/></nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"text\" size=\"5\" name=\"connections_"+prefix+"\" value=\"2\"/></nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"text\" size=\"5\" name=\"rate_"+prefix+"\" value=\"64\"/></nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"text\" size=\"5\" name=\"fetches_"+prefix+"\" value=\"12\"/></nobr>\n"+
-"          </td>\n"+
-"        </tr>\n"
-        );
-        binCounter++;
-      }
+    velocityContext.put("PROXYHOST",proxyHost);
+    velocityContext.put("PROXYPORT",proxyPort);
+    velocityContext.put("PROXYAUTHDOMAIN",proxyAuthDomain);
+    velocityContext.put("PROXYAUTHUSERNAME",proxyAuthUsername);
+    velocityContext.put("PROXYAUTHPASSWORD",proxyAuthPassword);
+  }
 
-      if (binCounter == 0)
-      {
-        out.print(
-"        <tr class=\"formrow\"><td class=\"formmessage\" colspan=\"6\">"+Messages.getBodyString(locale,"WebcrawlerConnector.NoBandwidthOrConnectionThrottlingSpecified")+"</td></tr>\n"
-        );
-      }
-      out.print(
-"        <tr class=\"formrow\"><td class=\"formseparator\" colspan=\"6\"><hr/></td></tr>\n"+
-"        <tr class=\"formrow\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <a name=\"bandwidth\">\n"+
-"              <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.Add") + "\" alt=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.AddBinRegularExpression") + "\" onclick=\"javascript:addRegexp();\"/>\n"+
-"            </a>\n"+
-"            <input type=\"hidden\" name=\"bandwidth_count\" value=\""+binCounter+"\"/>\n"+
-"            <input type=\"hidden\" name=\"bandwidth_op\" value=\"Continue\"/>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"text\" size=\"30\" name=\"regexp_bandwidth\" value=\"\"/></nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"checkbox\" name=\"insensitive_bandwidth\" value=\"true\"/></nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"text\" size=\"5\" name=\"connections_bandwidth\" value=\"\"/></nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"text\" size=\"5\" name=\"rate_bandwidth\" value=\"\"/></nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"text\" size=\"5\" name=\"fetches_bandwidth\" value=\"\"/></nobr>\n"+
-"          </td>\n"+
-"        </tr>\n"+
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
+  private void fillInCertificatesTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters) throws ManifoldCFException
+  {
+    int i = 0;
+    List<Map<String,String>> trustMapList = new ArrayList<>();
+    while (i < parameters.getChildCount())
     {
-      // Hiddens for bandwidth tab.
-      int i = 0;
-      int binCounter = 0;
-      while (i < parameters.getChildCount())
+      ConfigNode cn = parameters.getChild(i++);
+      if (cn.getType().equals(WebcrawlerConfig.NODE_TRUST))
       {
-        ConfigNode cn = parameters.getChild(i++);
-        if (cn.getType().equals(WebcrawlerConfig.NODE_BINDESC))
-        {
-          // A bin description node!  Look for all its parameters.
-          String regexp = cn.getAttributeValue(WebcrawlerConfig.ATTR_BINREGEXP);
-          String isCaseInsensitive = cn.getAttributeValue(WebcrawlerConfig.ATTR_INSENSITIVE);
-          String maxConnections = null;
-          String maxKBPerSecond = null;
-          String maxFetchesPerMinute = null;
-          int j = 0;
-          while (j < cn.getChildCount())
-          {
-            ConfigNode childNode = cn.getChild(j++);
-            if (childNode.getType().equals(WebcrawlerConfig.NODE_MAXCONNECTIONS))
-              maxConnections = childNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-            else if (childNode.getType().equals(WebcrawlerConfig.NODE_MAXKBPERSECOND))
-              maxKBPerSecond = childNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-            else if (childNode.getType().equals(WebcrawlerConfig.NODE_MAXFETCHESPERMINUTE))
-              maxFetchesPerMinute = childNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-          }
-          if (maxConnections == null)
-            maxConnections = "";
-          if (maxKBPerSecond == null)
-            maxKBPerSecond = "";
-          if (maxFetchesPerMinute == null)
-            maxFetchesPerMinute = "";
-          if (isCaseInsensitive == null || isCaseInsensitive.length() == 0)
-            isCaseInsensitive = "false";
-
-          // It's prefix will be...
-          String prefix = "bandwidth_" + Integer.toString(binCounter);
-          out.print(
-"<input type=\"hidden\" name=\""+"regexp_"+prefix+"\" value=\""+Encoder.attributeEscape(regexp)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+"insensitive_"+prefix+"\" value=\""+isCaseInsensitive+"\"/>\n"+
-"<input type=\"hidden\" name=\""+"connections_"+prefix+"\" value=\""+maxConnections+"\"/>\n"+
-"<input type=\"hidden\" name=\""+"rate_"+prefix+"\" value=\""+maxKBPerSecond+"\"/>\n"+
-"<input type=\"hidden\" name=\""+"fetches_"+prefix+"\" value=\""+maxFetchesPerMinute+"\"/>\n"
-          );
-          binCounter++;
-        }
-      }
+        Map<String,String> trustMap = new HashMap<>();
 
-      // If it looks like this is a brand-new configuration, add in a default throttle.
-      // This only works because other nodes must get created on the first post, and cannot then be deleted.
-      if (parameters.getChildCount() == 0)
-      {
-        // It's prefix will be...
-        String prefix = "bandwidth_" + Integer.toString(binCounter);
-        out.print(
-"<input type=\"hidden\" name=\""+"regexp_"+prefix+"\" value=\"\"/>\n"+
-"<input type=\"hidden\" name=\""+"insensitive_"+prefix+"\" value=\"false\"/>\n"+
-"<input type=\"hidden\" name=\""+"connections_"+prefix+"\" value=\"2\"/>\n"+
-"<input type=\"hidden\" name=\""+"rate_"+prefix+"\" value=\"64\"/>\n"+
-"<input type=\"hidden\" name=\""+"fetches_"+prefix+"\" value=\"12\"/>\n"
-        );
-        binCounter++;
-      }
+        // A bin description node!  Look for all its parameters.
+        String regexp = cn.getAttributeValue(WebcrawlerConfig.ATTR_URLREGEXP);
+        String trustEverything = cn.getAttributeValue(WebcrawlerConfig.ATTR_TRUSTEVERYTHING);
 
-      out.print(
-"<input type=\"hidden\" name=\"bandwidth_count\" value=\""+binCounter+"\"/>\n"
-      );
-    }
+        trustMap.put("trustEverything",trustEverything);
+        trustMap.put("regexp",regexp);
 
-    // Access Credentials tab
-    if (tabName.equals(Messages.getString(locale,"WebcrawlerConnector.AccessCredentials")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.PageAccessCredentials") + "</nobr></td>\n"+
-"    <td class=\"boxcell\">\n"+
-"      <table class=\"formtable\">\n"+
-"        <tr class=\"formheaderrow\">\n"+
-"          <td class=\"formcolumnheader\"></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.URLRegularExpression") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.AuthenticationType") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.Domain") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.UserName") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.Password") + "</nobr></td>\n"+
-"        </tr>\n"
-      );
-      int i = 0;
-      int accessCounter = 0;
-      while (i < parameters.getChildCount())
-      {
-        ConfigNode cn = parameters.getChild(i++);
-        if (cn.getType().equals(WebcrawlerConfig.NODE_ACCESSCREDENTIAL))
+        if (trustEverything != null && trustEverything.equals("true"))
         {
-          // A bin description node!  Look for all its parameters.
-          String type = cn.getAttributeValue(WebcrawlerConfig.ATTR_TYPE);
-          if (!type.equals(WebcrawlerConfig.ATTRVALUE_SESSION))
-          {
-            String regexp = cn.getAttributeValue(WebcrawlerConfig.ATTR_URLREGEXP);
-            String domain = cn.getAttributeValue(WebcrawlerConfig.ATTR_DOMAIN);
-            if (domain == null)
-              domain = "";
-            String userName = cn.getAttributeValue(WebcrawlerConfig.ATTR_USERNAME);
-            String password = out.mapPasswordToKey(ManifoldCF.deobfuscate(cn.getAttributeValue(WebcrawlerConfig.ATTR_PASSWORD)));
-                                        
-            // It's prefix will be...
-            String prefix = "acredential_" + Integer.toString(accessCounter);
-            out.print(
-"        <tr class=\""+(((accessCounter % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <a name=\""+prefix+"\">\n"+
-"              <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.Delete") + "\" alt=\""+Messages.getAttributeString(locale,"WebcrawlerConnector.DeletePageAuthenticationUrlRegularExpression")+Integer.toString(accessCounter+1)+"\" onclick='javascript:deleteARegexp("+Integer.toString(accessCounter)+");'/>\n"+
-"              <input type=\"hidden\" name=\"op_"+prefix+"\" value=\"Continue\"/>\n"+
-"              <input type=\"hidden\" name=\"regexp_"+prefix+"\" value=\""+Encoder.attributeEscape(regexp)+"\"/>\n"+
-"            </a>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>"+Encoder.bodyEscape(regexp)+"</nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"radio\" name=\"type_"+prefix+"\" value=\"basic\" "+(type.equals("basic")?"checked=\"\"":"")+" />&nbsp;" + Messages.getBodyString(locale,"WebcrawlerConnector.BasicAuthentication") + "</nobr><br/>\n"+
-"            <nobr><input type=\"radio\" name=\"type_"+prefix+"\" value=\"ntlm\" "+(type.equals("ntlm")?"checked=\"\"":"")+" />&nbsp;" + Messages.getBodyString(locale,"WebcrawlerConnector.NTLMAuthentication") + "</nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"text\" size=\"16\" name=\""+"domain_"+prefix+"\" value=\""+Encoder.attributeEscape(domain)+"\"/></nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"text\" size=\"16\" name=\""+"username_"+prefix+"\" value=\""+Encoder.attributeEscape(userName)+"\"/></nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"password\" size=\"16\" name=\""+"password_"+prefix+"\" value=\""+Encoder.attributeEscape(password)+"\"/></nobr>\n"+
-"          </td>\n"+
-"        </tr>\n"
-            );
-            accessCounter++;
-          }
         }
-      }
-
-      if (accessCounter == 0)
-      {
-        out.print(
-"        <tr class=\"formrow\"><td class=\"formmessage\" colspan=\"6\">" + Messages.getBodyString(locale,"WebcrawlerConnector.NoPageAccessCredentialsSpecified") + "</td></tr>\n"
-        );
-      }
-      out.print(
-"        <tr class=\"formrow\"><td class=\"formseparator\" colspan=\"6\"><hr/></td></tr>\n"+
-"        <tr class=\"formrow\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <a name=\"acredential\">\n"+
-"              <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.Add") + "\" alt=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.AddPageAuthenticationUrlRegularExpression") + "\" onclick=\"javascript:addARegexp();\"/>\n"+
-"            </a>\n"+
-"            <input type=\"hidden\" name=\"acredential_count\" value=\""+accessCounter+"\"/>\n"+
-"            <input type=\"hidden\" name=\"acredential_op\" value=\"Continue\"/>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"text\" size=\"30\" name=\"regexp_acredential\" value=\"\"/></nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"radio\" name=\"type_acredential\" value=\"basic\" checked=\"\" />&nbsp;" + Messages.getBodyString(locale,"WebcrawlerConnector.BasicAuthentication") + "</nobr><br/>\n"+
-"            <nobr><input type=\"radio\" name=\"type_acredential\" value=\"ntlm\" />&nbsp;" + Messages.getBodyString(locale,"WebcrawlerConnector.NTLMAuthentication") + "</nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"text\" size=\"16\" name=\"domain_acredential\" value=\"\"/></nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"text\" size=\"16\" name=\"username_acredential\" value=\"\"/></nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"password\" size=\"16\" name=\"password_acredential\" value=\"\"/></nobr>\n"+
-"          </td>\n"+
-"        </tr>\n"+
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"        \n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.SessionBasedAccessCredentials") + "</nobr></td>\n"+
-"    <td class=\"boxcell\">\n"+
-"      <table class=\"formtable\">\n"+
-"        <tr class=\"formheaderrow\">\n"+
-"          <td class=\"formcolumnheader\"></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.URLRegularExpression") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.LoginPages") + "</nobr></td>\n"+
-"        </tr>\n"
-      );
-      i = 0;
-      accessCounter = 0;
-      while (i < parameters.getChildCount())
-      {
-        ConfigNode cn = parameters.getChild(i++);
-        if (cn.getType().equals(WebcrawlerConfig.NODE_ACCESSCREDENTIAL))
+        else
         {
-          // A bin description node!  Look for all its parameters.
-          String type = cn.getAttributeValue(WebcrawlerConfig.ATTR_TYPE);
-          if (type.equals(WebcrawlerConfig.ATTRVALUE_SESSION))
+          String trustStore = cn.getAttributeValue(WebcrawlerConfig.ATTR_TRUSTSTORE);
+          IKeystoreManager localTruststore = KeystoreManagerFactory.make("",trustStore);
+          String[] truststoreContents = localTruststore.getContents();
+
+          // Each trust store will have only at most one cert in it at this level.  These individual certs are assembled into the proper trust store
+          // for each individual url at fetch time.
+
+          if (truststoreContents.length == 1)
           {
-            String regexp = cn.getAttributeValue(WebcrawlerConfig.ATTR_URLREGEXP);
-                                        
-            // It's prefix will be...
-            String prefix = "scredential_" + Integer.toString(accessCounter);
-            out.print(
-"        <tr class=\""+(((accessCounter % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <a name=\""+prefix+"\">\n"+
-"              <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.Delete") + "\" alt=\""+Messages.getAttributeString(locale,"WebcrawlerConnector.DeleteSessionAuthenticationUrlRegularExpression")+Integer.toString(accessCounter+1)+"\" onclick='javascript:deleteSRegexp("+Integer.toString(accessCounter)+");'/>\n"+
-"              <input type=\"hidden\" name=\""+prefix+"_op"+"\" value=\"Continue\"/>\n"+
-"              <input type=\"hidden\" name=\""+prefix+"_regexp"+"\" value=\""+Encoder.attributeEscape(regexp)+"\"/>\n"+
-"            </a>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>"+Encoder.bodyEscape(regexp)+"</nobr>\n"+
-"          </td>\n"+
-"          <td class=\"boxcell\">\n"+
-"            <table class=\"formtable\">\n"+
-"              <tr class=\"formheaderrow\">\n"+
-"                <td class=\"formcolumnheader\"></td>\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.LoginURLRegularExpression") + "</nobr></td>\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.PageType") + "</nobr></td>\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.FormNamelinkTargetRegularExpression") + "</nobr></td>\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.OverrideTargetURL") + "</nobr></td>\n"+
-"                <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.OverrideFormParameters") + "</nobr></td>\n"+
-"              </tr>\n"
-            );
-            int q = 0;
-            int authPageCounter = 0;
-            while (q < cn.getChildCount())
-            {
-              ConfigNode authPageNode = cn.getChild(q++);
-              if (authPageNode.getType().equals(WebcrawlerConfig.NODE_AUTHPAGE))
-              {
-                String pageRegexp = authPageNode.getAttributeValue(WebcrawlerConfig.ATTR_URLREGEXP);
-                String pageType = authPageNode.getAttributeValue(WebcrawlerConfig.ATTR_TYPE);
-                String matchRegexp = authPageNode.getAttributeValue(WebcrawlerConfig.ATTR_MATCHREGEXP);
-                if (matchRegexp == null)
-                  matchRegexp = "";
-                String overrideTargetURL = authPageNode.getAttributeValue(WebcrawlerConfig.ATTR_OVERRIDETARGETURL);
-                if (overrideTargetURL == null)
-                  overrideTargetURL = "";
-                String authpagePrefix = prefix + "_" + authPageCounter;
-                out.print(
-"              <tr class=\""+(((authPageCounter % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <a name=\""+authpagePrefix+"\">\n"+
-"                    <input type=\"button\" value=\"Delete\" alt=\""+Messages.getAttributeString(locale,"WebcrawlerConnector.DeleteLoginPage")+(authPageCounter+1)+" for url regular expression #"+Integer.toString(accessCounter+1)+"\" onclick='javascript:deleteLoginPage("+Integer.toString(accessCounter)+","+Integer.toString(authPageCounter)+");'/>\n"+
-"                    <input type=\"hidden\" name=\""+authpagePrefix+"_op"+"\" value=\"Continue\"/>\n"+
-"                    <input type=\"hidden\" name=\""+authpagePrefix+"_regexp"+"\" value=\""+Encoder.attributeEscape(pageRegexp)+"\"/>\n"+
-"                    <input type=\"hidden\" name=\""+authpagePrefix+"_type"+"\" value=\""+pageType+"\"/>\n"+
-"                  </a>\n"+
-"                </td>\n"+
-"\n"+
-"                <td class=\"formcolumncell\"><nobr>"+Encoder.bodyEscape(pageRegexp)+"</nobr></td>\n"+
-"                <td class=\"formcolumncell\"><nobr>"+pageType+"</nobr></td>\n"+
-"                <td class=\"formcolumncell\"><nobr><input type=\"text\" size=\"30\" name=\""+authpagePrefix+"_matchregexp"+"\" value=\""+Encoder.attributeEscape(matchRegexp)+"\"/></nobr></td>\n"+
-"                <td class=\"formcolumncell\"><nobr><input type=\"text\" size=\"30\" name=\""+authpagePrefix+"_overridetargeturl"+"\" value=\""+Encoder.attributeEscape(overrideTargetURL)+"\"/></nobr></td>\n"
-                );
-                if (pageType.equals(WebcrawlerConfig.ATTRVALUE_FORM))
-                {
-                  out.print(
-"                <td class=\"boxcell\">\n"+
-"                  <table class=\"formtable\">\n"+
-"                    <tr class=\"formheaderrow\">\n"+
-"                      <td class=\"formcolumnheader\"></td>\n"+
-"                      <td class=\"formcolumnheader\"><nobr>"+Messages.getBodyString(locale,"WebcrawlerConnector.ParameterRegularExpression")+"</nobr></td>\n"+
-"                      <td class=\"formcolumnheader\"><nobr>"+Messages.getBodyString(locale,"WebcrawlerConnector.Value")+"</nobr></td>\n"+
-"                      <td class=\"formcolumnheader\"><nobr>"+Messages.getBodyString(locale,"WebcrawlerConnector.Password")+"</nobr></td>\n"+
-"                    </tr>\n"
-                  );
-                  int z = 0;
-                  int paramCounter = 0;
-                  while (z < authPageNode.getChildCount())
-                  {
-                    ConfigNode paramNode = authPageNode.getChild(z++);
-                    if (paramNode.getType().equals(WebcrawlerConfig.NODE_AUTHPARAMETER))
-                    {
-                      String param = paramNode.getAttributeValue(WebcrawlerConfig.ATTR_NAMEREGEXP);
-                      if (param == null)
-                        param = "";
-                      String value = paramNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-                      if (value == null)
-                        value = "";
-                      String password = paramNode.getAttributeValue(WebcrawlerConfig.ATTR_PASSWORD);
-                      if (password == null)
-                        password = "";
-                      else
-                        password = out.mapPasswordToKey(ManifoldCF.deobfuscate(password));
-                      String authParamPrefix = authpagePrefix + "_" + paramCounter;
-                      out.print(
-"                    <tr class=\""+(((paramCounter % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"                      <td class=\"formcolumncell\">\n"+
-"                        <a name=\""+authParamPrefix+"\">\n"+
-"                          <input type=\"button\" value=\"Delete\" alt=\""+Messages.getAttributeString(locale,"WebcrawlerConnector.DeleteParameter")+(paramCounter+1)+Messages.getAttributeString(locale,"WebcrawlerConnector.ForLoginPage")+(authPageCounter+1)+Messages.getAttributeString(locale,"WebcrawlerConnector.ForCredential")+(accessCounter+1)+"\" onclick='javascript:deleteLoginPageParameter("+accessCounter+","+authPageCounter+","+paramCounter+");'/>\n"+
-"                          <input type=\"hidden\" name=\""+authParamPrefix+"_op"+"\" value=\"Continue\"/>\n"+
-"                        </a>\n"+
-"                      </td>\n"+
-"                      <td class=\"formcolumncell\">\n"+
-"                        <nobr><input type=\"text\" size=\"30\" name=\""+authParamPrefix+"_param"+"\" value=\""+Encoder.attributeEscape(param)+"\"/></nobr>\n"+
-"                      </td>\n"+
-"                      <td class=\"formcolumncell\">\n"+
-"                        <nobr><input type=\"text\" size=\"15\" name=\""+authParamPrefix+"_value"+"\" value=\""+Encoder.attributeEscape(value)+"\"/></nobr>\n"+
-"                      </td>\n"+
-"                      <td class=\"formcolumncell\">\n"+
-"                        <nobr><input type=\"password\" size=\"15\" name=\""+authParamPrefix+"_password"+"\" value=\""+Encoder.attributeEscape(password)+"\"/></nobr>\n"+
-"                      </td>\n"+
-"                    </tr>\n"
-                      );
-                      paramCounter++;
-                    }
-                  }
-                  out.print(
-"                    <tr class=\"formrow\"><td class=\"formseparator\" colspan=\"4\"><hr/></td></tr>\n"+
-"                    <tr class=\"formrow\">\n"+
-"                      <td class=\"formcolumncell\">\n"+
-"                        <a name=\""+authpagePrefix+"_loginparam"+"\">\n"+
-"                          <input type=\"button\" value=\"Add\" alt=\""+Messages.getAttributeString(locale,"WebcrawlerConnector.AddParameterToLoginPage")+(authPageCounter+1)+Messages.getAttributeString(locale,"WebcrawlerConnector.ForCredential")+(accessCounter+1)+"\" onclick='javascript:addLoginPageParameter("+accessCounter+","+authPageCounter+");'/>\n"+
-"                        </a>\n"+
-"                        <input type=\"hidden\" name=\""+authpagePrefix+"_loginparamcount"+"\" value=\""+paramCounter+"\"/>\n"+
-"                        <input type=\"hidden\" name=\""+authpagePrefix+"_loginparamop"+"\" value=\"Continue\"/>\n"+
-"                      </td>\n"+
-"                      <td class=\"formcolumncell\">\n"+
-"                        <nobr><input type=\"text\" size=\"30\" name=\""+authpagePrefix+"_loginparamname"+"\" value=\"\"/></nobr>\n"+
-"                      </td>\n"+
-"                      <td class=\"formcolumncell\">\n"+
-"                        <nobr><input type=\"text\" size=\"15\" name=\""+authpagePrefix+"_loginparamvalue"+"\" value=\"\"/></nobr>\n"+
-"                      </td>\n"+
-"                      <td class=\"formcolumncell\">\n"+
-"                        <nobr><input type=\"password\" size=\"15\" name=\""+authpagePrefix+"_loginparampassword"+"\" value=\"\"/></nobr>\n"+
-"                      </td>\n"+
-"                    </tr>\n"+
-"                  </table>\n"+
-"                </td>\n"
-                  );
-                }
-                else
-                {
-                  out.print(
-"                <td class=\"formcolumncell\"></td>\n"
-                  );
-                }
-                out.print(
-"              </tr>\n"
-                );
-                authPageCounter++;
-              }
-            }
-            out.print(
-"              <tr class=\"formrow\"><td class=\"formseparator\" colspan=\"6\"><hr/></td></tr>\n"+
-"              <tr class=\"formrow\">\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <a name=\""+prefix+"_loginpage"+"\">\n"+
-"                    <input type=\"button\" value=\"Add\" alt=\""+Messages.getAttributeString(locale,"WebcrawlerConnector.AddLoginPageToCredential")+(accessCounter+1)+"\" onclick='javascript:addLoginPage("+accessCounter+");'/>\n"+
-"                  </a>\n"+
-"                  <input type=\"hidden\" name=\""+prefix+"_loginpagecount"+"\" value=\""+authPageCounter+"\"/>\n"+
-"                  <input type=\"hidden\" name=\""+prefix+"_loginpageop"+"\" value=\"Continue\"/>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr><input type=\"text\" size=\"30\" name=\""+prefix+"_loginpageregexp"+"\" value=\"\"/></nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr><input type=\"radio\" name=\""+prefix+"_loginpagetype"+"\" value=\""+WebcrawlerConfig.ATTRVALUE_FORM+"\" checked=\"\"/>"+Messages.getBodyString(locale,"WebcrawlerConnector.FormName")+"</nobr><br/>\n"+
-"                  <nobr><input type=\"radio\" name=\""+prefix+"_loginpagetype"+"\" value=\""+WebcrawlerConfig.ATTRVALUE_LINK+"\"/>"+Messages.getBodyString(locale,"WebcrawlerConnector.LinkTarget")+"</nobr>\n"+
-"                  <nobr><input type=\"radio\" name=\""+prefix+"_loginpagetype"+"\" value=\""+WebcrawlerConfig.ATTRVALUE_REDIRECTION+"\"/>"+Messages.getBodyString(locale,"WebcrawlerConnector.RedirectionTo")+"</nobr>\n"+
-"                  <nobr><input type=\"radio\" name=\""+prefix+"_loginpagetype"+"\" value=\""+WebcrawlerConfig.ATTRVALUE_CONTENT+"\"/>"+Messages.getBodyString(locale,"WebcrawlerConnector.PageContent")+"</nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr><input type=\"text\" size=\"30\" name=\""+prefix+"_loginpagematchregexp"+"\" value=\"\"/></nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                  <nobr><input type=\"text\" size=\"30\" name=\""+prefix+"_loginpageoverridetargeturl"+"\" value=\"\"/></nobr>\n"+
-"                </td>\n"+
-"                <td class=\"formcolumncell\">\n"+
-"                </td>\n"+
-"              </tr>\n"+
-"\n"+
-"            </table>\n"+
-"          </td>\n"+
-"        </tr>\n"
-            );
-            accessCounter++;
+            String alias = truststoreContents[0];
+            String description = localTruststore.getDescription(alias);
+            String shortenedDescription = description;
+            if (shortenedDescription.length() > 100)
+              shortenedDescription = shortenedDescription.substring(0,100) + "...";
+
+            trustMap.put("trustStore",trustStore);
+            trustMap.put("shortenedDescription",shortenedDescription);
           }
         }
+        trustMapList.add(trustMap);
       }
-
-      if (accessCounter == 0)
-      {
-        out.print(
-"        <tr class=\"formrow\"><td class=\"formmessage\" colspan=\"3\">" + Messages.getBodyString(locale,"WebcrawlerConnector.NoSessionBasedAccessCredentialsSpecified") + "</td></tr>\n"
-        );
-      }
-      out.print(
-"        <tr class=\"formrow\"><td class=\"formseparator\" colspan=\"3\"><hr/></td></tr>\n"+
-"        <tr class=\"formrow\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <a name=\"scredential\">\n"+
-"              <input type=\"button\" value=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.Add") + "\" alt=\""+Messages.getAttributeString(locale,"WebcrawlerConnector.AddSessionAuthenticationUrlRegularExpression")+"\" onclick=\"javascript:addSRegexp();\"/>\n"+
-"            </a>\n"+
-"            <input type=\"hidden\" name=\"scredential_count\" value=\""+accessCounter+"\"/>\n"+
-"            <input type=\"hidden\" name=\"scredential_op\" value=\"Continue\"/>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"text\" size=\"30\" name=\"scredential_regexp\" value=\"\"/></nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"          </td>\n"+
-"        </tr>\n"+
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"\n"+
-"</table>\n"
-      );
     }
-    else
+    velocityContext.put("TRUSTMAPLIST",trustMapList);
+  }
+
+  private void fillInAccessTab(Map<String,Object> velocityContext, IHTTPOutput out, ConfigParams parameters) throws ManifoldCFException
+  {
+    int i = 0;
+    List<Map<String,String>> pageAccessMapList = new ArrayList<>();
+    while (i < parameters.getChildCount())
     {
-      // Hiddens for Access Credentials tab.
-      
-      // Page credentials first.
-      int i = 0;
-      int accessCounter = 0;
-      while (i < parameters.getChildCount())
+      ConfigNode cn = parameters.getChild(i++);
+      if (cn.getType().equals(WebcrawlerConfig.NODE_ACCESSCREDENTIAL))
       {
-        ConfigNode cn = parameters.getChild(i++);
-        if (cn.getType().equals(WebcrawlerConfig.NODE_ACCESSCREDENTIAL))
+        Map<String,String> pageAccessMap = new HashMap<>();
+
+        // A bin description node!  Look for all its parameters.
+        String type = cn.getAttributeValue(WebcrawlerConfig.ATTR_TYPE);
+        if (!type.equals(WebcrawlerConfig.ATTRVALUE_SESSION))
         {
-          // A bin description node!  Look for all its parameters.
-          String type = cn.getAttributeValue(WebcrawlerConfig.ATTR_TYPE);
-          if (!type.equals(WebcrawlerConfig.ATTRVALUE_SESSION))
-          {
-            String regexp = cn.getAttributeValue(WebcrawlerConfig.ATTR_URLREGEXP);
-            String domain = cn.getAttributeValue(WebcrawlerConfig.ATTR_DOMAIN);
-            if (domain == null)
-              domain = "";
-            String userName = cn.getAttributeValue(WebcrawlerConfig.ATTR_USERNAME);
-            String password = out.mapPasswordToKey(ManifoldCF.deobfuscate(cn.getAttributeValue(WebcrawlerConfig.ATTR_PASSWORD)));
-
-            // It's prefix will be...
-            String prefix = "acredential_" + Integer.toString(accessCounter);
-            out.print(
-"<input type=\"hidden\" name=\""+"regexp_"+prefix+"\" value=\""+Encoder.attributeEscape(regexp)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+"type_"+prefix+"\" value=\""+type+"\"/>\n"+
-"<input type=\"hidden\" name=\""+"domain_"+prefix+"\" value=\""+Encoder.attributeEscape(domain)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+"username_"+prefix+"\" value=\""+Encoder.attributeEscape(userName)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+"password_"+prefix+"\" value=\""+Encoder.attributeEscape(password)+"\"/>\n"
-            );
-            accessCounter++;
-          }
+          String regexp = cn.getAttributeValue(WebcrawlerConfig.ATTR_URLREGEXP);
+          if(regexp == null)
+            regexp = "";
+          String domain = cn.getAttributeValue(WebcrawlerConfig.ATTR_DOMAIN);
+          if (domain == null)
+            domain = "";
+          String userName = cn.getAttributeValue(WebcrawlerConfig.ATTR_USERNAME);
+          String password = out.mapPasswordToKey(ManifoldCF.deobfuscate(cn.getAttributeValue(WebcrawlerConfig.ATTR_PASSWORD)));
+
+          pageAccessMap.put("regexp",regexp);
+          pageAccessMap.put("domain",domain);
+          pageAccessMap.put("userName",userName);
+          pageAccessMap.put("password",password);
+          pageAccessMap.put("type",type);
+
+          pageAccessMapList.add(pageAccessMap);
         }
       }
-      out.print(
-"<input type=\"hidden\" name=\"acredential_count\" value=\""+accessCounter+"\"/>\n"
-      );
+    }
+    velocityContext.put("PAGEACCESSMAPLIST",pageAccessMapList);
 
-      // Now, session credentials
-      i = 0;
-      accessCounter = 0;
-      while (i < parameters.getChildCount())
+    i = 0;
+    List<Map<String,Object>> sessionAccessMapList = new ArrayList<>();
+    while (i < parameters.getChildCount())
+    {
+      ConfigNode cn = parameters.getChild(i++);
+      if (cn.getType().equals(WebcrawlerConfig.NODE_ACCESSCREDENTIAL))
       {
-        ConfigNode cn = parameters.getChild(i++);
-        if (cn.getType().equals(WebcrawlerConfig.NODE_ACCESSCREDENTIAL))
+        // A bin description node!  Look for all its parameters.
+        String type = cn.getAttributeValue(WebcrawlerConfig.ATTR_TYPE);
+        if (type.equals(WebcrawlerConfig.ATTRVALUE_SESSION))
         {
-          // A bin description node!  Look for all its parameters.
-          String type = cn.getAttributeValue(WebcrawlerConfig.ATTR_TYPE);
-          if (type.equals(WebcrawlerConfig.ATTRVALUE_SESSION))
+          Map<String,Object> sessionAccessMap = new HashMap<>();
+          String regexp = cn.getAttributeValue(WebcrawlerConfig.ATTR_URLREGEXP);
+          if(regexp == null)
+            regexp = "";
+          sessionAccessMap.put("regexp",regexp);
+
+          int q = 0;
+          List<Map<String,Object>> authPageMapList = new ArrayList<>();
+          while (q < cn.getChildCount())
           {
-            String regexp = cn.getAttributeValue(WebcrawlerConfig.ATTR_URLREGEXP);
-            // It's identifier will be...
-            String prefix = "scredential_" + Integer.toString(accessCounter);
-            out.print(
-"<input type=\"hidden\" name=\""+prefix+"_regexp"+"\" value=\""+Encoder.attributeEscape(regexp)+"\"/>\n"
-            );
-            // Loop through login pages...
-            int q = 0;
-            int authPageCounter = 0;
-            while (q < cn.getChildCount())
+            ConfigNode authPageNode = cn.getChild(q++);
+            if (authPageNode.getType().equals(WebcrawlerConfig.NODE_AUTHPAGE))
             {
-              ConfigNode authPageNode = cn.getChild(q++);
-              if (authPageNode.getType().equals(WebcrawlerConfig.NODE_AUTHPAGE))
+              Map<String,Object> authPageMap = new HashMap<>();
+
+              String pageRegexp = authPageNode.getAttributeValue(WebcrawlerConfig.ATTR_URLREGEXP);
+              String pageType = authPageNode.getAttributeValue(WebcrawlerConfig.ATTR_TYPE);
+              String matchRegexp = authPageNode.getAttributeValue(WebcrawlerConfig.ATTR_MATCHREGEXP);
+              if (matchRegexp == null)
+                matchRegexp = "";
+              String overrideTargetURL = authPageNode.getAttributeValue(WebcrawlerConfig.ATTR_OVERRIDETARGETURL);
+              if (overrideTargetURL == null)
+                overrideTargetURL = "";
+
+              authPageMap.put("pageRegexp",pageRegexp);
+              authPageMap.put("pageType",pageType);
+              authPageMap.put("matchRegexp",matchRegexp);
+              authPageMap.put("overrideTargetURL",overrideTargetURL);
+
+              if (pageType.equals(WebcrawlerConfig.ATTRVALUE_FORM))
               {
-                String pageRegexp = authPageNode.getAttributeValue(WebcrawlerConfig.ATTR_URLREGEXP);
-                String pageType = authPageNode.getAttributeValue(WebcrawlerConfig.ATTR_TYPE);
-                String matchRegexp = authPageNode.getAttributeValue(WebcrawlerConfig.ATTR_MATCHREGEXP);
-                if (matchRegexp == null)
-                  matchRegexp = "";
-                String overrideTargetURL = authPageNode.getAttributeValue(WebcrawlerConfig.ATTR_OVERRIDETARGETURL);
-                if (overrideTargetURL == null)
-                  overrideTargetURL = "";
-                String authpagePrefix = prefix + "_" + authPageCounter;
-                out.print(
-"<input type=\"hidden\" name=\""+authpagePrefix+"_regexp"+"\" value=\""+Encoder.attributeEscape(pageRegexp)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+authpagePrefix+"_type"+"\" value=\""+pageType+"\"/>\n"+
-"<input type=\"hidden\" name=\""+authpagePrefix+"_matchregexp"+"\" value=\""+Encoder.attributeEscape(matchRegexp)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+authpagePrefix+"_overridetargeturl"+"\" value=\""+Encoder.attributeEscape(overrideTargetURL)+"\"/>\n"
-                );
-                if (pageType.equals(WebcrawlerConfig.ATTRVALUE_FORM))
+                int z = 0;
+                List<Map<String,String>> authPageParamMapList = new ArrayList<>();
+                while (z < authPageNode.getChildCount())
                 {
-                  int z = 0;
-                  int paramCounter = 0;
-                  while (z < authPageNode.getChildCount())
+                  ConfigNode paramNode = authPageNode.getChild(z++);
+                  if (paramNode.getType().equals(WebcrawlerConfig.NODE_AUTHPARAMETER))
                   {
-                    ConfigNode paramNode = authPageNode.getChild(z++);
-                    if (paramNode.getType().equals(WebcrawlerConfig.NODE_AUTHPARAMETER))
-                    {
-                      String param = paramNode.getAttributeValue(WebcrawlerConfig.ATTR_NAMEREGEXP);
-                      if (param == null)
-                        param = "";
-                      String value = paramNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-                      if (value == null)
-                        value = "";
-                      String password = paramNode.getAttributeValue(WebcrawlerConfig.ATTR_PASSWORD);
-                      if (password == null)
-                        password = "";
-                      else
-                        password = out.mapPasswordToKey(ManifoldCF.deobfuscate(password));
-                      String authParamPrefix = authpagePrefix + "_" + paramCounter;
-                      out.print(
-"<input type=\"hidden\" name=\""+authParamPrefix+"_param"+"\" value=\""+Encoder.attributeEscape(param)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+authParamPrefix+"_value"+"\" value=\""+Encoder.attributeEscape(value)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+authParamPrefix+"_password"+"\" value=\""+Encoder.attributeEscape(password)+"\"/>\n"
-                      );
-                      paramCounter++;
-                    }
+                    Map<String,String> authPageParamMap = new HashMap<>();
+
+                    String param = paramNode.getAttributeValue(WebcrawlerConfig.ATTR_NAMEREGEXP);
+                    if (param == null)
+                      param = "";
+                    String value = paramNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
+                    if (value == null)
+                      value = "";
+                    String password = paramNode.getAttributeValue(WebcrawlerConfig.ATTR_PASSWORD);
+                    if (password == null)
+                      password = "";
+                    else
+                      password = out.mapPasswordToKey(ManifoldCF.deobfuscate(password));
+
+                    authPageParamMap.put("param",param);
+                    authPageParamMap.put("value",value);
+                    authPageParamMap.put("password",password);
+
+                    authPageParamMapList.add(authPageParamMap);
                   }
-                  out.print(
-"<input type=\"hidden\" name=\""+authpagePrefix+"_loginparamcount"+"\" value=\""+paramCounter+"\"/>\n"
-                  );
                 }
-                authPageCounter++;
+                authPageMap.put("authPageParamMapList",authPageParamMapList);
               }
+              authPageMapList.add(authPageMap);
             }
-            out.print(
-"<input type=\"hidden\" name=\""+prefix+"_loginpagecount"+"\" value=\""+authPageCounter+"\"/>\n"
-            );
-            accessCounter++;
           }
+          sessionAccessMap.put("authPageMapList",authPageMapList);
+          sessionAccessMapList.add(sessionAccessMap);
         }
       }
-      out.print(
-"<input type=\"hidden\" name=\"scredential_count\" value=\""+accessCounter+"\"/>\n"
-      );
-    }
-
-    // "Certificates" tab
-    if (tabName.equals(Messages.getString(locale,"WebcrawlerConnector.Certificates")))
-    {
-      out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.TrustCertificates") + "</nobr></td>\n"+
-"    <td class=\"boxcell\">\n"+
-"      <table class=\"formtable\">\n"+
-"        <tr class=\"formheaderrow\">\n"+
-"          <td class=\"formcolumnheader\"></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.URLRegularExpression") + "</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.Certificate") + "</nobr></td>\n"+
-"        </tr>\n"
-      );
-      int i = 0;
-      int trustsCounter = 0;
-      while (i < parameters.getChildCount())
-      {
-        ConfigNode cn = parameters.getChild(i++);
-        if (cn.getType().equals(WebcrawlerConfig.NODE_TRUST))
-        {
-          // It's prefix will be...
-          String prefix = "trust_" + Integer.toString(trustsCounter);
-          // A bin description node!  Look for all its parameters.
-          String regexp = cn.getAttributeValue(WebcrawlerConfig.ATTR_URLREGEXP);
-          String trustEverything = cn.getAttributeValue(WebcrawlerConfig.ATTR_TRUSTEVERYTHING);
-          if (trustEverything != null && trustEverything.equals("true"))
-          {
-            // We trust everything that matches this regexp
-            out.print(
-"        <tr class=\""+(((trustsCounter % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <a name=\""+prefix+"\"><input type=\"button\" value=\"Delete\" alt=\""+Messages.getAttributeString(locale,"WebcrawlerConnector.DeleteTrustUrlRegularExpression")+Integer.toString(trustsCounter+1)+"\" onclick='javascript:deleteTRegexp("+Integer.toString(trustsCounter)+");'/>\n"+
-"            <input type=\"hidden\" name=\""+"op_"+prefix+"\" value=\"Continue\"/>\n"+
-"            <input type=\"hidden\" name=\""+"regexp_"+prefix+"\" value=\""+Encoder.attributeEscape(regexp)+"\"/>\n"+
-"            <input type=\"hidden\" name=\""+"trustall_"+prefix+"\" value=\"true\"/>\n"+
-"            <input type=\"hidden\" name=\""+"truststore_"+prefix+"\" value=\"\"/>\n"+
-"            </a>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>"+Encoder.bodyEscape(regexp)+"</nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><i>"+Messages.getBodyString(locale,"WebcrawlerConnector.TrustEverything")+"</i></nobr>\n"+
-"          </td>\n"+
-"        </tr>\n"
-            );
-            trustsCounter++;
-          }
-          else
-          {
-            String trustStore = cn.getAttributeValue(WebcrawlerConfig.ATTR_TRUSTSTORE);
-            IKeystoreManager localTruststore = KeystoreManagerFactory.make("",trustStore);
-            String[] truststoreContents = localTruststore.getContents();
-            
-            // Each trust store will have only at most one cert in it at this level.  These individual certs are assembled into the proper trust store
-            // for each individual url at fetch time.
-            
-            if (truststoreContents.length == 1)
-            {
-              String alias = truststoreContents[0];
-              String description = localTruststore.getDescription(alias);
-              String shortenedDescription = description;
-              if (shortenedDescription.length() > 100)
-                shortenedDescription = shortenedDescription.substring(0,100) + "...";
-              out.print(
-"        <tr class=\""+(((trustsCounter % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <a name=\""+prefix+"\">\n"+
-"              <input type=\"button\" value=\"Delete\" alt=\""+Messages.getAttributeString(locale,"WebcrawlerConnector.DeleteTrustUrlRegularExpression")+Integer.toString(trustsCounter+1)+"\" onclick='javascript:deleteTRegexp("+Integer.toString(trustsCounter)+");'/>\n"+
-"              <input type=\"hidden\" name=\""+"op_"+prefix+"\" value=\"Continue\"/>\n"+
-"              <input type=\"hidden\" name=\""+"regexp_"+prefix+"\" value=\""+Encoder.attributeEscape(regexp)+"\"/>\n"+
-"              <input type=\"hidden\" name=\""+"trustall_"+prefix+"\" value=\"false\"/>\n"+
-"              <input type=\"hidden\" name=\""+"truststore_"+prefix+"\" value=\""+Encoder.attributeEscape(trustStore)+"\"/>\n"+
-"            </a>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>"+Encoder.bodyEscape(regexp)+"</nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>"+Encoder.bodyEscape(shortenedDescription)+"</nobr>\n"+
-"          </td>\n"+
-"        </tr>\n"
-              );
-              trustsCounter++;
-            }
-          }
+    }
+    velocityContext.put("SESSIONACCESSMAPLIST",sessionAccessMapList);
+  }
+  
+  /** Output the configuration body section.
+  * This method is called in the body section of the connector's configuration page.  Its purpose is to present the required form elements for editing.
+  * The coder can presume that the HTML that is output from this configuration will be within appropriate <html>, <body>, and <form> tags.  The name of the
+  * form is "editconnection".
+  *@param threadContext is the local thread context.
+  *@param out is the output to which any HTML should be sent.
+  *@param parameters are the configuration parameters, as they currently exist, for this connection being configured.
+  *@param tabName is the current tab name.
+  */
+  @Override
+  public void outputConfigurationBody(IThreadContext threadContext, IHTTPOutput out,
+    Locale locale, ConfigParams parameters, String tabName)
+    throws ManifoldCFException, IOException
+  {
 
-        }
-      }
+    final Map<String,Object> velocityContext = new HashMap<String,Object>();
+    velocityContext.put("TABNAME",tabName);
 
-      if (trustsCounter == 0)
-      {
-        out.print(
-"        <tr class=\"formrow\"><td class=\"formmessage\" colspan=\"3\">" + Messages.getBodyString(locale,"WebcrawlerConnector.NoTrustCertificatesSpecified") + "</td></tr>\n"
-        );
-      }
-      out.print(
-"        <tr class=\"formrow\"><td class=\"formseparator\" colspan=\"3\"><hr/></td></tr>\n"+
-"        <tr class=\"formrow\">\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <a name=\"trust\"><input type=\"button\" value=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.Add") + "\" alt=\"" + Messages.getAttributeString(locale,"WebcrawlerConnector.AddUrlRegularExpressionForTruststore") + "\" onclick=\"javascript:addTRegexp();\"/></a>\n"+
-"            <input type=\"hidden\" name=\"trust_count\" value=\""+trustsCounter+"\"/>\n"+
-"            <input type=\"hidden\" name=\"trust_op\" value=\"Continue\"/>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr><input type=\"text\" size=\"30\" name=\"regexp_trust\" value=\"\"/></nobr>\n"+
-"          </td>\n"+
-"          <td class=\"formcolumncell\">\n"+
-"            <nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.UploadCertificate") + " <input name=\"certificate_trust\" size=\"50\" type=\"file\"/>&nbsp;<input name=\"all_trust\" type=\"checkbox\" value=\"true\">" + Messages.getBodyString(locale,"WebcrawlerConnector.TrustEverything") + "</input></nobr>\n"+
-"          </td>\n"+
-"        </tr>\n"+
-"      </table>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"</table>\n"
-      );
-    }
-    else
-    {
-      // Hiddens for Certificates tab.
-      int i = 0;
-      int trustsCounter = 0;
-      while (i < parameters.getChildCount())
-      {
-        ConfigNode cn = parameters.getChild(i++);
-        if (cn.getType().equals(WebcrawlerConfig.NODE_TRUST))
-        {
-          // It's prefix will be...
-          String prefix = "trust_" + Integer.toString(trustsCounter);
+    fillInEmailTab(velocityContext,out,parameters);
+    fillInRobotsTab(velocityContext,out,parameters);
+    fillInBandwidthTab(velocityContext,out,parameters);
+    fillInAccessTab(velocityContext,out,parameters);
+    fillInCertificatesTab(velocityContext,out,parameters);
+    fillInProxyTab(velocityContext,out,parameters);
 
-          // A bin description node!  Look for all its parameters.
-          String regexp = cn.getAttributeValue(WebcrawlerConfig.ATTR_URLREGEXP);
-          String trustEverything = cn.getAttributeValue(WebcrawlerConfig.ATTR_TRUSTEVERYTHING);
-          if (trustEverything != null && trustEverything.equals("true"))
-          {
-            // We trust everything that matches this regexp
-            out.print(
-"<input type=\"hidden\" name=\""+"regexp_"+prefix+"\" value=\""+Encoder.attributeEscape(regexp)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+"truststore_"+prefix+"\" value=\"\"/>\n"+
-"<input type=\"hidden\" name=\""+"trustall_"+prefix+"\" value=\"true\"/>\n"
-            );
-            trustsCounter++;
-          }
-          else
-          {
-            String trustStore = cn.getAttributeValue(WebcrawlerConfig.ATTR_TRUSTSTORE);
-            out.print(
-"<input type=\"hidden\" name=\""+"regexp_"+prefix+"\" value=\""+Encoder.attributeEscape(regexp)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+"truststore_"+prefix+"\" value=\""+Encoder.attributeEscape(trustStore)+"\"/>\n"+
-"<input type=\"hidden\" name=\""+"trustall_"+prefix+"\" value=\"false\"/>\n"
-            );
-            trustsCounter++;
-          }
-        }
-      }
-      out.print(
-"<input type=\"hidden\" name=\"trust_count\" value=\""+trustsCounter+"\"/>\n"
-      );
-    }
+    // Email tab
+    Messages.outputResourceWithVelocity(out,locale,"editConfiguration_Email.html.vm",velocityContext);
+    // Robots tab
+    Messages.outputResourceWithVelocity(out,locale,"editConfiguration_Robots.html.vm",velocityContext);
+    //Bandwidth tab
+    Messages.outputResourceWithVelocity(out,locale,"editConfiguration_Bandwidth.html.vm",velocityContext);
+    // Access Credentials tab
+    Messages.outputResourceWithVelocity(out,locale,"editConfiguration_Access.html.vm",velocityContext);
+    //Certificates tab
+    Messages.outputResourceWithVelocity(out,locale,"editConfiguration_Certificates.html.vm",velocityContext);
+    // Proxy tab
+    Messages.outputResourceWithVelocity(out,locale,"editConfiguration_Proxy.html.vm",velocityContext);
 
   }
   
@@ -3299,367 +2293,18 @@ public class WebcrawlerConnector extends
     Locale locale, ConfigParams parameters)
     throws ManifoldCFException, IOException
   {
-    String email = parameters.getParameter(WebcrawlerConfig.PARAMETER_EMAIL);
-    String robots = parameters.getParameter(WebcrawlerConfig.PARAMETER_ROBOTSUSAGE);
-    if (robots.equals("none"))
-      robots = Messages.getBodyString(locale,"WebcrawlerConnector.DontLookAtRobotsTxt");
-    else if (robots.equals("data"))
-      robots = Messages.getBodyString(locale,"WebcrawlerConnector.ObeyRobotsTxtForDataFetchesOnly");
-    else if (robots.equals("all"))
-      robots = Messages.getBodyString(locale,"WebcrawlerConnector.ObeyRobotsTxtForAllFetches");
-    String metaRobotsTagsUsage = parameters.getParameter(WebcrawlerConfig.PARAMETER_META_ROBOTS_TAGS_USAGE);
-    if (metaRobotsTagsUsage == null || metaRobotsTagsUsage.equals("all"))
-      metaRobotsTagsUsage = Messages.getBodyString(locale,"WebcrawlerConnector.ObeyMetaRobotsTags");
-    else if (metaRobotsTagsUsage.equals("none"))
-      metaRobotsTagsUsage = Messages.getBodyString(locale,"WebcrawlerConnector.DontLookAtMetaRobotsTags");
-    String proxyHost = parameters.getParameter(WebcrawlerConfig.PARAMETER_PROXYHOST);
-    if (proxyHost == null)
-      proxyHost = "";
-    String proxyPort = parameters.getParameter(WebcrawlerConfig.PARAMETER_PROXYPORT);
-    if (proxyPort == null)
-      proxyPort = "";
-    String proxyAuthDomain = parameters.getParameter(WebcrawlerConfig.PARAMETER_PROXYAUTHDOMAIN);
-    if (proxyAuthDomain == null)
-      proxyAuthDomain = "";
-    String proxyAuthUsername = parameters.getParameter(WebcrawlerConfig.PARAMETER_PROXYAUTHUSERNAME);
-    if (proxyAuthUsername == null)
-      proxyAuthUsername = "";
 
-    out.print(
-"<table class=\"displaytable\">\n"+
-"  <tr>\n"+
-"    <td class=\"description\" colspan=\"1\"><nobr>"+Messages.getBodyString(locale,"WebcrawlerConnector.EmailAddress")+"</nobr></td>\n"+
-"    <td class=\"value\" colspan=\"3\">"+Encoder.bodyEscape(email)+"</td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\" colspan=\"1\"><nobr>"+Messages.getBodyString(locale,"WebcrawlerConnector.RobotsUsage")+"</nobr></td>\n"+
-"    <td class=\"value\" colspan=\"1\"><nobr>"+Encoder.bodyEscape(robots)+"</nobr></td>\n"+
-"    <td class=\"description\" colspan=\"1\"><nobr>"+Messages.getBodyString(locale,"WebcrawlerConnector.MetaRobotsTagsUsage")+"</nobr></td>\n"+
-"    <td class=\"value\" colspan=\"1\">"+Encoder.bodyEscape(metaRobotsTagsUsage)+"</td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.ProxyHostColon") + "</nobr></td>\n"+
-"    <td class=\"value\">"+Encoder.bodyEscape(proxyHost)+"</td>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.ProxyPortColon") + "</nobr></td>\n"+
-"    <td class=\"value\">"+Encoder.bodyEscape(proxyPort)+"</td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.ProxyAuthenticationDomainColon") + "</nobr></td>\n"+
-"    <td class=\"value\">"+Encoder.bodyEscape(proxyAuthDomain)+"</td>\n"+
-"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale,"WebcrawlerConnector.ProxyAuthenticationUserNameColon") + "</nobr></td>\n"+
-"    <td class=\"value\">"+Encoder.bodyEscape(proxyAuthUsername)+"</td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\" colspan=\"1\"><nobr>"+Messages.getBodyString(locale,"WebcrawlerConnector.BandwidthThrottling")+"</nobr></td>\n"+
-"    <td class=\"boxcell\" colspan=\"3\">\n"+
-"      <table class=\"formtable\">\n"+
-"        <tr class=\"formheaderrow\">\n"+
-"          <td class=\"formcolumnheader\"><nobr>"+Messages.getBodyString(locale,"WebcrawlerConnector.BinRegularExpression")+"</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>"+Messages.getBodyString(locale,"WebcrawlerConnector.CaseInsensitive")+"</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>"+Messages.getBodyString(locale,"WebcrawlerConnector.MaxConnections")+"</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>"+Messages.getBodyString(locale,"WebcrawlerConnector.MaxKbytesSec")+"</nobr></td>\n"+
-"          <td class=\"formcolumnheader\"><nobr>"+Messages.getBodyString(locale,"WebcrawlerConnector.MaxFetchesMin")+"</nobr></td>\n"+
-"        </tr>\n"
-    );
-    int i = 0;
-    int instanceNumber = 0;
-    while (i < parameters.getChildCount())
-    {
-      ConfigNode cn = parameters.getChild(i++);
-      if (cn.getType().equals(WebcrawlerConfig.NODE_BINDESC))
-      {
-        // A bin description node!  Look for all its parameters.
-        String regexp = cn.getAttributeValue(WebcrawlerConfig.ATTR_BINREGEXP);
-        String isCaseInsensitive = cn.getAttributeValue(WebcrawlerConfig.ATTR_INSENSITIVE);
-        String maxConnections = null;
-        String maxKBPerSecond = null;
-        String maxFetchesPerMinute = null;
-        int j = 0;
-        while (j < cn.getChildCount())
-        {
-          ConfigNode childNode = cn.getChild(j++);
-          if (childNode.getType().equals(WebcrawlerConfig.NODE_MAXCONNECTIONS))
-            maxConnections = childNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-          else if (childNode.getType().equals(WebcrawlerConfig.NODE_MAXKBPERSECOND))
-            maxKBPerSecond = childNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-          else if (childNode.getType().equals(WebcrawlerConfig.NODE_MAXFETCHESPERMINUTE))
-            maxFetchesPerMinute = childNode.getAttributeValue(WebcrawlerConfig.ATTR_VALUE);
-        }
-        if (maxConnections == null)
-          maxConnections = "Not limited";
-        if (maxKBPerSecond == null)
-          maxKBPerSecond = "Not limited";
-        if (maxFetchesPerMinute == null)
-          maxFetchesPerMinute = "Not limited";
-        if (isCaseInsensitive == null || isCaseInsensitive.length() == 0)
-          isCaseInsensitive = "false";
-        out.print(
-"        <tr class=\""+(((instanceNumber % 2)==0)?"evenformrow":"oddformrow")+"\">\n"+
-"          <td class=\"formcolumncell\"><nobr>"+Encoder.bodyEscape(regexp)+"</nobr></td>\n"+
-"          <td class=\"formcolumncell\">"+isCaseInsensitive+"</td>\n"+
-"          <td class=\"formcolumncell\"><nobr>"+maxConnections+"</nobr></td>\n"+

[... 1790 lines stripped ...]