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 2013/03/22 20:34:17 UTC

svn commit: r1459947 [2/2] - in /manifoldcf/trunk: ./ connectors/livelink/ connectors/livelink/build-stub/src/main/java/com/opentext/api/ connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/ connectors/livelink...

Modified: manifoldcf/trunk/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/LivelinkConnector.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/LivelinkConnector.java?rev=1459947&r1=1459946&r2=1459947&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/LivelinkConnector.java (original)
+++ manifoldcf/trunk/connectors/livelink/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/livelink/LivelinkConnector.java Fri Mar 22 19:34:17 2013
@@ -132,10 +132,16 @@ public class LivelinkConnector extends o
   private int LLCATWK_ID;
 
   // Parameter values we need
+  private String serverProtocol = null;
   private String serverName = null;
   private int serverPort = -1;
   private String serverUsername = null;
   private String serverPassword = null;
+  private String serverHTTPCgi = null;
+  private String serverHTTPNTLMDomain = null;
+  private String serverHTTPNTLMUsername = null;
+  private String serverHTTPNTLMPassword = null;
+  private IKeystoreManager serverHTTPSKeystore = null;
 
   private String ingestProtocol = null;
   private String ingestPort = null;
@@ -146,13 +152,12 @@ public class LivelinkConnector extends o
   private String viewPort = null;
   private String viewCgiPath = null;
 
-  private String ntlmDomain = null;
-  private String ntlmUsername = null;
-  private String ntlmPassword = null;
-
-  // SSL support
-  private String keystoreData = null;
-  private IKeystoreManager keystoreManager = null;
+  private String ingestNtlmDomain = null;
+  private String ingestNtlmUsername = null;
+  private String ingestNtlmPassword = null;
+
+  // SSL support for ingestion
+  private IKeystoreManager ingestKeystoreManager = null;
 
   // Connection management
   private ClientConnectionManager connectionManager = null;
@@ -223,7 +228,10 @@ public class LivelinkConnector extends o
       try
       {
         // Create the session
-        llServer = new LLSERVER(serverName,serverPort,serverUsername,serverPassword);
+        llServer = new LLSERVER(!serverProtocol.equals("internal"),serverProtocol.equals("https"),
+          serverName,serverPort,serverUsername,serverPassword,
+          serverHTTPCgi,serverHTTPNTLMDomain,serverHTTPNTLMUsername,serverHTTPNTLMPassword,
+          serverHTTPSKeystore);
 
         LLDocs = new LAPI_DOCUMENTS(llServer.getLLSession());
         LLAttributes = new LAPI_ATTRIBUTES(llServer.getLLSession());
@@ -306,13 +314,18 @@ public class LivelinkConnector extends o
       viewPort = params.getParameter(LiveLinkParameters.viewPort);
       viewCgiPath = params.getParameter(LiveLinkParameters.viewCgiPath);
 
-      ntlmDomain = params.getParameter(LiveLinkParameters.ntlmDomain);
-      ntlmUsername = params.getParameter(LiveLinkParameters.ntlmUsername);
-      ntlmPassword = params.getObfuscatedParameter(LiveLinkParameters.ntlmPassword);
+      ingestNtlmDomain = params.getParameter(LiveLinkParameters.ingestNtlmDomain);
+      ingestNtlmUsername = params.getParameter(LiveLinkParameters.ingestNtlmUsername);
+      ingestNtlmPassword = params.getObfuscatedParameter(LiveLinkParameters.ingestNtlmPassword);
 
+      serverProtocol = params.getParameter(LiveLinkParameters.serverProtocol);
       String serverPortString = params.getParameter(LiveLinkParameters.serverPort);
       serverUsername = params.getParameter(LiveLinkParameters.serverUsername);
       serverPassword = params.getObfuscatedParameter(LiveLinkParameters.serverPassword);
+      serverHTTPCgi = params.getParameter(LiveLinkParameters.serverHTTPCgiPath);
+      serverHTTPNTLMDomain = params.getParameter(LiveLinkParameters.serverHTTPNTLMDomain);
+      serverHTTPNTLMUsername = params.getParameter(LiveLinkParameters.serverHTTPNTLMUsername);
+      serverHTTPNTLMPassword = params.getObfuscatedParameter(LiveLinkParameters.serverHTTPNTLMPassword);
 
       if (ingestProtocol == null || ingestProtocol.length() == 0)
         ingestProtocol = "http";
@@ -373,44 +386,69 @@ public class LivelinkConnector extends o
       if (viewCgiPath == null || viewCgiPath.length() == 0)
         viewCgiPath = ingestCgiPath;
 
-      if (ntlmDomain != null && ntlmDomain.length() == 0)
-        ntlmDomain = null;
-      if (ntlmDomain == null)
+      if (ingestNtlmDomain != null && ingestNtlmDomain.length() == 0)
+        ingestNtlmDomain = null;
+      if (ingestNtlmDomain == null)
       {
-        ntlmUsername = null;
-        ntlmPassword = null;
+        ingestNtlmUsername = null;
+        ingestNtlmPassword = null;
       }
       else
       {
-        if (ntlmUsername == null || ntlmUsername.length() == 0)
+        if (ingestNtlmUsername == null || ingestNtlmUsername.length() == 0)
         {
-          ntlmUsername = serverUsername;
-          if (ntlmPassword == null || ntlmPassword.length() == 0)
-            ntlmPassword = serverPassword;
+          ingestNtlmUsername = serverUsername;
+          if (ingestNtlmPassword == null || ingestNtlmPassword.length() == 0)
+            ingestNtlmPassword = serverPassword;
         }
         else
         {
-          if (ntlmPassword == null)
-            ntlmPassword = "";
+          if (ingestNtlmPassword == null)
+            ingestNtlmPassword = "";
         }
       }
 
-      // First, create server object (llServer)
+      // Server parameter processing
 
+      if (serverProtocol == null || serverProtocol.length() == 0)
+        serverProtocol = "internal";
+      
       if (serverPortString == null)
         serverPort = 2099;
       else
         serverPort = new Integer(serverPortString).intValue();
+      
+      if (serverHTTPNTLMDomain != null && serverHTTPNTLMDomain.length() == 0)
+        serverHTTPNTLMDomain = null;
+      if (serverHTTPNTLMUsername == null || serverHTTPNTLMUsername.length() == 0)
+      {
+        serverHTTPNTLMUsername = serverUsername;
+        if (serverHTTPNTLMPassword == null || serverHTTPNTLMPassword.length() == 0)
+          serverHTTPNTLMPassword = serverPassword;
+      }
+      else
+      {
+        if (serverHTTPNTLMUsername == null)
+          serverHTTPNTLMUsername = "";
+        if (serverHTTPNTLMPassword == null)
+          serverHTTPNTLMPassword = "";
+      }
 
       // Set up connection manager
       PoolingClientConnectionManager localConnectionManager = new PoolingClientConnectionManager();
       localConnectionManager.setMaxTotal(1);
-      // Set up ssl if indicated
-      keystoreData = params.getParameter(LiveLinkParameters.livelinkKeystore);
-      if (keystoreData != null)
+      
+      // Set up server ssl if indicated
+      String serverHTTPSKeystoreData = params.getParameter(LiveLinkParameters.serverHTTPSKeystore);
+      if (serverHTTPSKeystoreData != null)
+        serverHTTPSKeystore = KeystoreManagerFactory.make("",serverHTTPSKeystoreData);
+
+      // Set up ingest ssl if indicated
+      String ingestKeystoreData = params.getParameter(LiveLinkParameters.ingestKeystore);
+      if (ingestKeystoreData != null)
       {
-        keystoreManager = KeystoreManagerFactory.make("",keystoreData);
-        SSLSocketFactory myFactory = new SSLSocketFactory(keystoreManager.getSecureSocketFactory(),
+        ingestKeystoreManager = KeystoreManagerFactory.make("",ingestKeystoreData);
+        SSLSocketFactory myFactory = new SSLSocketFactory(ingestKeystoreManager.getSecureSocketFactory(),
           new BrowserCompatHostnameVerifier());
         Scheme myHttpsProtocol = new Scheme("https", 443, myFactory);
         localConnectionManager.getSchemeRegistry().register(myHttpsProtocol);
@@ -441,10 +479,10 @@ public class LivelinkConnector extends o
 
       localHttpClient.setRedirectStrategy(new DefaultRedirectStrategy());
       // Set up authentication to use
-      if (ntlmDomain != null)
+      if (ingestNtlmDomain != null)
       {
         localHttpClient.getCredentialsProvider().setCredentials(AuthScope.ANY,
-          new NTCredentials(ntlmUsername,ntlmPassword,currentHost,ntlmDomain));
+          new NTCredentials(ingestNtlmUsername,ingestNtlmPassword,currentHost,ingestNtlmDomain));
       }
       httpClient = localHttpClient;
       
@@ -619,14 +657,19 @@ public class LivelinkConnector extends o
     llServer = null;
     LLDocs = null;
     LLAttributes = null;
-    keystoreData = null;
-    keystoreManager = null;
+    ingestKeystoreManager = null;
     ingestPortNumber = -1;
 
+    serverProtocol = null;
     serverName = null;
     serverPort = -1;
     serverUsername = null;
     serverPassword = null;
+    serverHTTPCgi = null;
+    serverHTTPNTLMDomain = null;
+    serverHTTPNTLMUsername = null;
+    serverHTTPNTLMPassword = null;
+    serverHTTPSKeystore = null;
 
     ingestPort = null;
     ingestProtocol = null;
@@ -639,9 +682,9 @@ public class LivelinkConnector extends o
 
     viewBasePath = null;
 
-    ntlmDomain = null;
-    ntlmUsername = null;
-    ntlmPassword = null;
+    ingestNtlmDomain = null;
+    ingestNtlmUsername = null;
+    ingestNtlmPassword = null;
 
     if (connectionManager != null)
       connectionManager.shutdown();
@@ -1436,23 +1479,44 @@ public class LivelinkConnector extends o
     out.print(
 "<script type=\"text/javascript\">\n"+
 "<!--\n"+
-"function LLDeleteCertificate(aliasName)\n"+
+"function ServerDeleteCertificate(aliasName)\n"+
+"{\n"+
+"  editconnection.serverkeystorealias.value = aliasName;\n"+
+"  editconnection.serverconfigop.value = \"Delete\";\n"+
+"  postForm();\n"+
+"}\n"+
+"\n"+
+"function ServerAddCertificate()\n"+
+"{\n"+
+"  if (editconnection.servercertificate.value == \"\")\n"+
+"  {\n"+
+"    alert(\""+Messages.getBodyJavascriptString(locale,"LivelinkConnector.ChooseACertificateFile")+"\");\n"+
+"    editconnection.servercertificate.focus();\n"+
+"  }\n"+
+"  else\n"+
+"  {\n"+
+"    editconnection.serverconfigop.value = \"Add\";\n"+
+"    postForm();\n"+
+"  }\n"+
+"}\n"+
+"\n"+
+"function IngestDeleteCertificate(aliasName)\n"+
 "{\n"+
-"  editconnection.llkeystorealias.value = aliasName;\n"+
-"  editconnection.configop.value = \"Delete\";\n"+
+"  editconnection.ingestkeystorealias.value = aliasName;\n"+
+"  editconnection.ingestconfigop.value = \"Delete\";\n"+
 "  postForm();\n"+
 "}\n"+
 "\n"+
-"function LLAddCertificate()\n"+
+"function IngestAddCertificate()\n"+
 "{\n"+
-"  if (editconnection.llcertificate.value == \"\")\n"+
+"  if (editconnection.ingestcertificate.value == \"\")\n"+
 "  {\n"+
 "    alert(\""+Messages.getBodyJavascriptString(locale,"LivelinkConnector.ChooseACertificateFile")+"\");\n"+
-"    editconnection.llcertificate.focus();\n"+
+"    editconnection.ingestcertificate.focus();\n"+
 "  }\n"+
 "  else\n"+
 "  {\n"+
-"    editconnection.configop.value = \"Add\";\n"+
+"    editconnection.ingestconfigop.value = \"Add\";\n"+
 "    postForm();\n"+
 "  }\n"+
 "}\n"+
@@ -1496,6 +1560,20 @@ public class LivelinkConnector extends o
 "    editconnection.serverport.focus();\n"+
 "    return false;\n"+
 "  }\n"+
+"  if (editconnection.serverhttpcgipath.value == \"\")\n"+
+"  {\n"+
+"    alert(\""+Messages.getBodyJavascriptString(locale,"LivelinkConnector.EnterTheServerCgiPathToLivelink")+"\");\n"+
+"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"LivelinkConnector.Server") + "\");\n"+
+"    editconnection.serverhttpcgipath.focus();\n"+
+"    return false;\n"+
+"  }\n"+
+"  if (editconnection.serverhttpcgipath.value.substring(0,1) != \"/\")\n"+
+"  {\n"+
+"    alert(\""+Messages.getBodyJavascriptString(locale,"LivelinkConnector.TheServerCgiPathMustBeginWithACharacter")+"\");\n"+
+"    SelectTab(\"" + Messages.getBodyJavascriptString(locale,"LivelinkConnector.Server") + "\");\n"+
+"    editconnection.serverhttpcgipath.focus();\n"+
+"    return false;\n"+
+"  }\n"+
 "  if (editconnection.ingestcgipath.value == \"\")\n"+
 "  {\n"+
 "    alert(\""+Messages.getBodyJavascriptString(locale,"LivelinkConnector.EnterTheCrawlCgiPathToLivelink")+"\");\n"+
@@ -1539,64 +1617,109 @@ public class LivelinkConnector extends o
     Locale locale, ConfigParams parameters, String tabName)
     throws ManifoldCFException, IOException
   {
-    String ingestProtocol = parameters.getParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.ingestProtocol);
+    
+    // LAPI parameters
+    String serverProtocol = parameters.getParameter(LiveLinkParameters.serverProtocol);
+    if (serverProtocol == null)
+      serverProtocol = "internal";
+    String serverName = parameters.getParameter(LiveLinkParameters.serverName);
+    if (serverName == null)
+      serverName = "localhost";
+    String serverPort = parameters.getParameter(LiveLinkParameters.serverPort);
+    if (serverPort == null)
+      serverPort = "2099";
+    String serverUserName = parameters.getParameter(LiveLinkParameters.serverUsername);
+    if (serverUserName == null)
+      serverUserName = "";
+    String serverPassword = parameters.getObfuscatedParameter(LiveLinkParameters.serverPassword);
+    if (serverPassword == null)
+      serverPassword = "";
+    String serverHTTPCgiPath = parameters.getParameter(LiveLinkParameters.serverHTTPCgiPath);
+    if (serverHTTPCgiPath == null)
+      serverHTTPCgiPath = "/livelink/livelink.exe";
+    String serverHTTPNTLMDomain = parameters.getParameter(LiveLinkParameters.serverHTTPNTLMDomain);
+    if (serverHTTPNTLMDomain == null)
+      serverHTTPNTLMDomain = "";
+    String serverHTTPNTLMUserName = parameters.getParameter(LiveLinkParameters.serverHTTPNTLMUsername);
+    if (serverHTTPNTLMUserName == null)
+      serverHTTPNTLMUserName = "";
+    String serverHTTPNTLMPassword = parameters.getObfuscatedParameter(LiveLinkParameters.serverHTTPNTLMPassword);
+    if (serverHTTPNTLMPassword == null)
+      serverHTTPNTLMPassword = "";
+    String serverHTTPSKeystore = parameters.getParameter(LiveLinkParameters.serverHTTPSKeystore);
+    IKeystoreManager localServerHTTPSKeystore;
+    if (serverHTTPSKeystore == null)
+      localServerHTTPSKeystore = KeystoreManagerFactory.make("");
+    else
+      localServerHTTPSKeystore = KeystoreManagerFactory.make("",serverHTTPSKeystore);
+
+    // Document access parameters
+    String ingestProtocol = parameters.getParameter(LiveLinkParameters.ingestProtocol);
     if (ingestProtocol == null)
       ingestProtocol = "http";
-    String ingestPort = parameters.getParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.ingestPort);
+    String ingestPort = parameters.getParameter(LiveLinkParameters.ingestPort);
     if (ingestPort == null)
       ingestPort = "";
-    String ingestCgiPath = parameters.getParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.ingestCgiPath);
+    String ingestCgiPath = parameters.getParameter(LiveLinkParameters.ingestCgiPath);
     if (ingestCgiPath == null)
       ingestCgiPath = "/livelink/livelink.exe";
-    String viewProtocol = parameters.getParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.viewProtocol);
+    String ingestNtlmUsername = parameters.getParameter(LiveLinkParameters.ingestNtlmUsername);
+    if (ingestNtlmUsername == null)
+      ingestNtlmUsername = "";
+    String ingestNtlmPassword = parameters.getObfuscatedParameter(LiveLinkParameters.ingestNtlmPassword);
+    if (ingestNtlmPassword == null)
+      ingestNtlmPassword = "";
+    String ingestNtlmDomain = parameters.getParameter(LiveLinkParameters.ingestNtlmDomain);
+    if (ingestNtlmDomain == null)
+      ingestNtlmDomain = "";
+    String ingestKeystore = parameters.getParameter(LiveLinkParameters.ingestKeystore);
+    IKeystoreManager localIngestKeystore;
+    if (ingestKeystore == null)
+      localIngestKeystore = KeystoreManagerFactory.make("");
+    else
+      localIngestKeystore = KeystoreManagerFactory.make("",ingestKeystore);
+    
+    // Document view parameters
+    String viewProtocol = parameters.getParameter(LiveLinkParameters.viewProtocol);
     if (viewProtocol == null)
       viewProtocol = "";
-    String viewServerName = parameters.getParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.viewServerName);
+    String viewServerName = parameters.getParameter(LiveLinkParameters.viewServerName);
     if (viewServerName == null)
       viewServerName = "";
-    String viewPort = parameters.getParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.viewPort);
+    String viewPort = parameters.getParameter(LiveLinkParameters.viewPort);
     if (viewPort == null)
       viewPort = "";
-    String viewCgiPath = parameters.getParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.viewCgiPath);
+    String viewCgiPath = parameters.getParameter(LiveLinkParameters.viewCgiPath);
     if (viewCgiPath == null)
       viewCgiPath = "";
-    String serverName = parameters.getParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.serverName);
-    if (serverName == null)
-      serverName = "localhost";
-    String serverPort = parameters.getParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.serverPort);
-    if (serverPort == null)
-      serverPort = "2099";
-    String serverUserName = parameters.getParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.serverUsername);
-    if (serverUserName == null)
-      serverUserName = "";
-    String serverPassword = parameters.getObfuscatedParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.serverPassword);
-    if (serverPassword == null)
-      serverPassword = "";
-    String ntlmUsername = parameters.getParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.ntlmUsername);
-    if (ntlmUsername == null)
-      ntlmUsername = "";
-    String ntlmPassword = parameters.getObfuscatedParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.ntlmPassword);
-    if (ntlmPassword == null)
-      ntlmPassword = "";
-    String ntlmDomain = parameters.getParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.ntlmDomain);
-    if (ntlmDomain == null)
-      ntlmDomain = "";
-    String livelinkKeystore = parameters.getParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.livelinkKeystore);
-    IKeystoreManager localKeystore;
-    if (livelinkKeystore == null)
-      localKeystore = KeystoreManagerFactory.make("");
-    else
-      localKeystore = KeystoreManagerFactory.make("",livelinkKeystore);
+
+    // The "Server" tab
+    // Always pass the whole keystore as a hidden.
     out.print(
-"<input name=\"configop\" type=\"hidden\" value=\"Continue\"/>\n"
+"<input name=\"serverconfigop\" type=\"hidden\" value=\"Continue\"/>\n"
     );
-    // The "Server" tab
+    if (serverHTTPSKeystore != null)
+    {
+      out.print(
+"<input type=\"hidden\" name=\"serverhttpskeystoredata\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(serverHTTPSKeystore)+"\"/>\n"
+      );
+    }
     if (tabName.equals(Messages.getString(locale,"LivelinkConnector.Server")))
     {
       out.print(
 "<table class=\"displaytable\">\n"+
 "  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
 "  <tr>\n"+
+"    <td class=\"description\">"+Messages.getBodyString(locale,"LivelinkConnector.ServerProtocol")+"</td>\n"+
+"    <td class=\"value\">\n"+
+"      <select name=\"serverprotocol\" size=\"2\">\n"+
+"        <option value=\"internal\" "+((serverProtocol.equals("internal"))?"selected=\"selected\"":"")+">"+Messages.getBodyString(locale,"LivelinkConnector.internal")+"</option>\n"+
+"        <option value=\"http\" "+((serverProtocol.equals("http"))?"selected=\"selected\"":"")+">http</option>\n"+
+"        <option value=\"https\" "+((serverProtocol.equals("https"))?"selected=\"selected\"":"")+">https</option>\n"+
+"      </select>\n"+
+"    </td>\n"+
+"  </tr>\n"+
+"  <tr>\n"+
 "    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.ServerName")+"</nobr></td>\n"+
 "    <td class=\"value\"><input type=\"text\" size=\"64\" name=\"servername\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(serverName)+"\"/></td>\n"+
 "  </tr>\n"+
@@ -1612,6 +1735,72 @@ public class LivelinkConnector extends o
 "    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.ServerPassword")+"</nobr></td>\n"+
 "    <td class=\"value\"><input type=\"password\" size=\"32\" name=\"serverpassword\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(serverPassword)+"\"/></td>\n"+
 "  </tr>\n"+
+"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
+"  <tr>\n"+
+"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.ServerHTTPCGIPath")+"</nobr></td>\n"+
+"    <td class=\"value\"><input type=\"text\" size=\"32\" name=\"serverhttpcgipath\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(serverHTTPCgiPath)+"\"/></td>\n"+
+"  </tr>\n"+
+"  <tr>\n"+
+"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.ServerHTTPNTLMDomain")+"</nobr><br/><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.SetIfNTLMAuthDesired")+"</nobr></td>\n"+
+"    <td class=\"value\">\n"+
+"      <input type=\"text\" size=\"32\" name=\"serverhttpntlmdomain\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(serverHTTPNTLMDomain)+"\"/>\n"+
+"    </td>\n"+
+"  </tr>\n"+
+"  <tr>\n"+
+"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.ServerHTTPNTLMUserName")+"</nobr><br/><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.SetIfDifferentFromServerUserName")+"</nobr></td>\n"+
+"    <td class=\"value\">\n"+
+"      <input type=\"text\" size=\"32\" name=\"serverhttpntlmusername\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(serverHTTPNTLMUserName)+"\"/>\n"+
+"    </td>\n"+
+"  </tr>\n"+
+"  <tr>\n"+
+"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.ServerHTTPNTLMPassword")+"</nobr><br/><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.SetIfDifferentFromServerPassword")+"</nobr></td>\n"+
+"    <td class=\"value\">\n"+
+"      <input type=\"password\" size=\"32\" name=\"serverhttpntlmpassword\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(serverHTTPNTLMPassword)+"\"/>\n"+
+"    </td>\n"+
+"  </tr>\n"+
+"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
+      );
+      out.print(
+"  <tr>\n"+
+"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.ServerSSLCertificateList")+"</nobr></td>\n"+
+"    <td class=\"value\">\n"+
+"      <input type=\"hidden\" name=\"serverkeystorealias\" value=\"\"/>\n"+
+"      <table class=\"displaytable\">\n"
+      );
+      // List the individual certificates in the store, with a delete button for each
+      String[] contents = localServerHTTPSKeystore.getContents();
+      if (contents.length == 0)
+      {
+        out.print(
+"        <tr><td class=\"message\" colspan=\"2\"><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.NoCertificatesPresent")+"</nobr></td></tr>\n"
+        );
+      }
+      else
+      {
+        int i = 0;
+        while (i < contents.length)
+        {
+          String alias = contents[i];
+          String description = localServerHTTPSKeystore.getDescription(alias);
+          if (description.length() > 128)
+            description = description.substring(0,125) + "...";
+          out.print(
+"        <tr>\n"+
+"          <td class=\"value\"><input type=\"button\" onclick='Javascript:ServerDeleteCertificate(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(alias)+"\")' alt=\""+Messages.getAttributeString(locale,"LivelinkConnector.DeleteCert")+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(alias)+"\" value=\""+Messages.getAttributeString(locale,"LivelinkConnector.Delete")+"\"/></td>\n"+
+"          <td>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)+"</td>\n"+
+"        </tr>\n"
+          );
+          i++;
+        }
+      }
+      out.print(
+"      </table>\n"+
+"      <input type=\"button\" onclick='Javascript:ServerAddCertificate()' alt=\""+Messages.getAttributeString(locale,"LivelinkConnector.AddCert")+"\" value=\""+Messages.getAttributeString(locale,"LivelinkConnector.Add")+"\"/>&nbsp;\n"+
+"      "+Messages.getBodyString(locale,"LivelinkConnector.Certificate")+"<input name=\"servercertificate\" size=\"50\" type=\"file\"/>\n"+
+"    </td>\n"+
+"  </tr>\n"
+      );
+      out.print(
 "</table>\n"
       );
     }
@@ -1619,19 +1808,27 @@ public class LivelinkConnector extends o
     {
       // Hiddens for Server tab
       out.print(
+"<input type=\"hidden\" name=\"serverprotocol\" value=\""+serverProtocol+"\"/>\n"+
 "<input type=\"hidden\" name=\"servername\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(serverName)+"\"/>\n"+
 "<input type=\"hidden\" name=\"serverport\" value=\""+serverPort+"\"/>\n"+
 "<input type=\"hidden\" name=\"serverusername\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(serverUserName)+"\"/>\n"+
-"<input type=\"hidden\" name=\"serverpassword\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(serverPassword)+"\"/>\n"
+"<input type=\"hidden\" name=\"serverpassword\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(serverPassword)+"\"/>\n"+
+"<input type=\"hidden\" name=\"serverhttpcgipath\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(serverHTTPCgiPath)+"\"/>\n"+
+"<input type=\"hidden\" name=\"serverhttpntlmdomain\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(serverHTTPNTLMDomain)+"\"/>\n"+
+"<input type=\"hidden\" name=\"serverhttpntlmusername\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(serverHTTPNTLMUserName)+"\"/>\n"+
+"<input type=\"hidden\" name=\"serverhttpntlmpassword\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(serverHTTPNTLMPassword)+"\"/>\n"
       );
     }
 
     // The "Document Access" tab
     // Always pass the whole keystore as a hidden.
-    if (livelinkKeystore != null)
+    out.print(
+"<input name=\"ingestconfigop\" type=\"hidden\" value=\"Continue\"/>\n"
+    );
+    if (ingestKeystore != null)
     {
       out.print(
-"<input type=\"hidden\" name=\"keystoredata\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(livelinkKeystore)+"\"/>\n"
+"<input type=\"hidden\" name=\"ingestkeystoredata\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(ingestKeystore)+"\"/>\n"
       );
     }
     if (tabName.equals(Messages.getString(locale,"LivelinkConnector.DocumentAccess")))
@@ -1652,14 +1849,40 @@ public class LivelinkConnector extends o
 "    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.DocumentFetchPort")+"</nobr></td>\n"+
 "    <td class=\"value\"><input type=\"text\" size=\"5\" name=\"ingestport\" value=\""+ingestPort+"\"/></td>\n"+
 "  </tr>\n"+
+"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
+"  <tr>\n"+
+"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.DocumentFetchCGIPath")+"</nobr></td>\n"+
+"    <td class=\"value\"><input type=\"text\" size=\"32\" name=\"ingestcgipath\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(ingestCgiPath)+"\"/></td>\n"+
+"  </tr>\n"+
+"  <tr>\n"+
+"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.DocumentFetchNTLMDomain")+"</nobr><br/><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.SetIfNTLMAuthDesired")+"</nobr></td>\n"+
+"    <td class=\"value\">\n"+
+"      <input type=\"text\" size=\"32\" name=\"ingestntlmdomain\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(ingestNtlmDomain)+"\"/>\n"+
+"    </td>\n"+
+"  </tr>\n"+
+"  <tr>\n"+
+"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.DocumentFetchNTLMUserName")+"</nobr><br/><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.SetIfDifferentFromServerUserName")+"</nobr></td>\n"+
+"    <td class=\"value\">\n"+
+"      <input type=\"text\" size=\"32\" name=\"ingestntlmusername\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(ingestNtlmUsername)+"\"/>\n"+
+"    </td>\n"+
+"  </tr>\n"+
+"  <tr>\n"+
+"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.DocumentFetchNTLMPassword")+"</nobr><br/><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.SetIfDifferentFromServerPassword")+"</nobr></td>\n"+
+"    <td class=\"value\">\n"+
+"      <input type=\"password\" size=\"32\" name=\"ingestntlmpassword\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(ingestNtlmPassword)+"\"/>\n"+
+"    </td>\n"+
+"  </tr>\n"+
+"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"
+      );
+      out.print(
 "  <tr>\n"+
 "    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.DocumentFetchSSLCertificateList")+"</nobr></td>\n"+
 "    <td class=\"value\">\n"+
-"      <input type=\"hidden\" name=\"llkeystorealias\" value=\"\"/>\n"+
+"      <input type=\"hidden\" name=\"ingestkeystorealias\" value=\"\"/>\n"+
 "      <table class=\"displaytable\">\n"
       );
       // List the individual certificates in the store, with a delete button for each
-      String[] contents = localKeystore.getContents();
+      String[] contents = localIngestKeystore.getContents();
       if (contents.length == 0)
       {
         out.print(
@@ -1672,12 +1895,12 @@ public class LivelinkConnector extends o
         while (i < contents.length)
         {
           String alias = contents[i];
-          String description = localKeystore.getDescription(alias);
+          String description = localIngestKeystore.getDescription(alias);
           if (description.length() > 128)
             description = description.substring(0,125) + "...";
           out.print(
 "        <tr>\n"+
-"          <td class=\"value\"><input type=\"button\" onclick='Javascript:LLDeleteCertificate(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(alias)+"\")' alt=\""+Messages.getAttributeString(locale,"LivelinkConnector.DeleteCert")+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(alias)+"\" value=\"Delete\"/></td>\n"+
+"          <td class=\"value\"><input type=\"button\" onclick='Javascript:IngestDeleteCertificate(\""+org.apache.manifoldcf.ui.util.Encoder.attributeJavascriptEscape(alias)+"\")' alt=\""+Messages.getAttributeString(locale,"LivelinkConnector.DeleteCert")+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(alias)+"\" value=\""+Messages.getAttributeString(locale,"LivelinkConnector.Delete")+"\"/></td>\n"+
 "          <td>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(description)+"</td>\n"+
 "        </tr>\n"
           );
@@ -1686,32 +1909,12 @@ public class LivelinkConnector extends o
       }
       out.print(
 "      </table>\n"+
-"      <input type=\"button\" onclick='Javascript:LLAddCertificate()' alt=\""+Messages.getAttributeString(locale,"LivelinkConnector.AddCert")+"\" value=\"Add\"/>&nbsp;\n"+
-"      "+Messages.getBodyString(locale,"LivelinkConnector.Certificate")+"<input name=\"llcertificate\" size=\"50\" type=\"file\"/>\n"+
+"      <input type=\"button\" onclick='Javascript:IngestAddCertificate()' alt=\""+Messages.getAttributeString(locale,"LivelinkConnector.AddCert")+"\" value=\""+Messages.getAttributeString(locale,"LivelinkConnector.Add")+"\"/>&nbsp;\n"+
+"      "+Messages.getBodyString(locale,"LivelinkConnector.Certificate")+"<input name=\"ingestcertificate\" size=\"50\" type=\"file\"/>\n"+
 "    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.DocumentFetchCGIPath")+"</nobr></td>\n"+
-"    <td class=\"value\"><input type=\"text\" size=\"32\" name=\"ingestcgipath\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(ingestCgiPath)+"\"/></td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.DocumentFetchNTLMDomain")+"</nobr><br/><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.SetIfNTLMAuthDesired")+"</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"text\" size=\"32\" name=\"ntlmdomain\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(ntlmDomain)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.DocumentFetchNTLMUserName")+"</nobr><br/><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.SetIfDifferentFromServerUserName")+"</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"text\" size=\"32\" name=\"ntlmusername\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(ntlmUsername)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
-"  <tr>\n"+
-"    <td class=\"description\"><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.DocumentFetchNTLMPassword")+"</nobr><br/><nobr>"+Messages.getBodyString(locale,"LivelinkConnector.SetIfDifferentFromServerPassword")+"</nobr></td>\n"+
-"    <td class=\"value\">\n"+
-"      <input type=\"password\" size=\"32\" name=\"ntlmpassword\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(ntlmPassword)+"\"/>\n"+
-"    </td>\n"+
-"  </tr>\n"+
+"  </tr>\n"
+      );
+      out.print(
 "</table>\n"
       );
     }
@@ -1722,9 +1925,9 @@ public class LivelinkConnector extends o
 "<input type=\"hidden\" name=\"ingestprotocol\" value=\""+ingestProtocol+"\"/>\n"+
 "<input type=\"hidden\" name=\"ingestport\" value=\""+ingestPort+"\"/>\n"+
 "<input type=\"hidden\" name=\"ingestcgipath\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(ingestCgiPath)+"\"/>\n"+
-"<input type=\"hidden\" name=\"ntlmusername\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(ntlmUsername)+"\"/>\n"+
-"<input type=\"hidden\" name=\"ntlmpassword\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(ntlmPassword)+"\"/>\n"+
-"<input type=\"hidden\" name=\"ntlmdomain\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(ntlmDomain)+"\"/>\n"
+"<input type=\"hidden\" name=\"ingestntlmusername\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(ingestNtlmUsername)+"\"/>\n"+
+"<input type=\"hidden\" name=\"ingestntlmpassword\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(ingestNtlmPassword)+"\"/>\n"+
+"<input type=\"hidden\" name=\"ingestntlmdomain\" value=\""+org.apache.manifoldcf.ui.util.Encoder.attributeEscape(ingestNtlmDomain)+"\"/>\n"
       );
   }
 
@@ -1785,75 +1988,153 @@ public class LivelinkConnector extends o
     Locale locale, ConfigParams parameters)
     throws ManifoldCFException
   {
-    String serverName = variableContext.getParameter("servername");
-    if (serverName != null)
-      parameters.setParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.serverName,serverName);
-    String serverPort = variableContext.getParameter("serverport");
-    if (serverPort != null)
-      parameters.setParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.serverPort,serverPort);
-    String ingestProtocol = variableContext.getParameter("ingestprotocol");
-    if (ingestProtocol != null)
-      parameters.setParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.ingestProtocol,ingestProtocol);
-    String ingestPort = variableContext.getParameter("ingestport");
-    if (ingestPort != null)
-      parameters.setParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.ingestPort,ingestPort);
-    String ingestCgiPath = variableContext.getParameter("ingestcgipath");
-    if (ingestCgiPath != null)
-      parameters.setParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.ingestCgiPath,ingestCgiPath);
+    // View parameters
     String viewProtocol = variableContext.getParameter("viewprotocol");
     if (viewProtocol != null)
-      parameters.setParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.viewProtocol,viewProtocol);
+      parameters.setParameter(LiveLinkParameters.viewProtocol,viewProtocol);
     String viewServerName = variableContext.getParameter("viewservername");
     if (viewServerName != null)
-      parameters.setParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.viewServerName,viewServerName);
+      parameters.setParameter(LiveLinkParameters.viewServerName,viewServerName);
     String viewPort = variableContext.getParameter("viewport");
     if (viewPort != null)
-      parameters.setParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.viewPort,viewPort);
+      parameters.setParameter(LiveLinkParameters.viewPort,viewPort);
     String viewCgiPath = variableContext.getParameter("viewcgipath");
     if (viewCgiPath != null)
-      parameters.setParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.viewCgiPath,viewCgiPath);
+      parameters.setParameter(LiveLinkParameters.viewCgiPath,viewCgiPath);
+    
+    // Server parameters
+    String serverProtocol = variableContext.getParameter("serverprotocol");
+    if (serverProtocol != null)
+      parameters.setParameter(LiveLinkParameters.serverProtocol,serverProtocol);
+    String serverName = variableContext.getParameter("servername");
+    if (serverName != null)
+      parameters.setParameter(LiveLinkParameters.serverName,serverName);
+    String serverPort = variableContext.getParameter("serverport");
+    if (serverPort != null)
+      parameters.setParameter(LiveLinkParameters.serverPort,serverPort);
     String serverUserName = variableContext.getParameter("serverusername");
     if (serverUserName != null)
-      parameters.setParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.serverUsername,serverUserName);
+      parameters.setParameter(LiveLinkParameters.serverUsername,serverUserName);
     String serverPassword = variableContext.getParameter("serverpassword");
     if (serverPassword != null)
-      parameters.setObfuscatedParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.serverPassword,serverPassword);
-    String ntlmDomain = variableContext.getParameter("ntlmdomain");
-    if (ntlmDomain != null)
-      parameters.setParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.ntlmDomain,ntlmDomain);
-    String ntlmUsername = variableContext.getParameter("ntlmusername");
-    if (ntlmUsername != null)
-      parameters.setParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.ntlmUsername,ntlmUsername);
-    String ntlmPassword = variableContext.getParameter("ntlmpassword");
-    if (ntlmPassword != null)
-      parameters.setObfuscatedParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.ntlmPassword,ntlmPassword);
-    String keystoreValue = variableContext.getParameter("keystoredata");
-    if (keystoreValue != null)
-      parameters.setParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.livelinkKeystore,keystoreValue);
+      parameters.setObfuscatedParameter(LiveLinkParameters.serverPassword,serverPassword);
+    String serverHTTPCgiPath = variableContext.getParameter("serverhttpcgipath");
+    if (serverHTTPCgiPath != null)
+      parameters.setParameter(LiveLinkParameters.serverHTTPCgiPath,serverHTTPCgiPath);
+    String serverHTTPNTLMDomain = variableContext.getParameter("serverhttpntlmdomain");
+    if (serverHTTPNTLMDomain != null)
+      parameters.setParameter(LiveLinkParameters.serverHTTPNTLMDomain,serverHTTPNTLMDomain);
+    String serverHTTPNTLMUserName = variableContext.getParameter("serverhttpntlmusername");
+    if (serverHTTPNTLMUserName != null)
+      parameters.setParameter(LiveLinkParameters.serverHTTPNTLMUsername,serverHTTPNTLMUserName);
+    String serverHTTPNTLMPassword = variableContext.getParameter("serverhttpntlmpassword");
+    if (serverHTTPNTLMPassword != null)
+      parameters.setObfuscatedParameter(LiveLinkParameters.serverHTTPNTLMPassword,serverHTTPNTLMPassword);
+    String serverHTTPSKeystoreValue = variableContext.getParameter("serverhttpskeystoredata");
+    if (serverHTTPSKeystoreValue != null)
+      parameters.setParameter(LiveLinkParameters.serverHTTPSKeystore,serverHTTPSKeystoreValue);
+    
+    String serverConfigOp = variableContext.getParameter("serverconfigop");
+    if (serverConfigOp != null)
+    {
+      if (serverConfigOp.equals("Delete"))
+      {
+        String alias = variableContext.getParameter("serverkeystorealias");
+        serverHTTPSKeystoreValue = parameters.getParameter(LiveLinkParameters.serverHTTPSKeystore);
+        IKeystoreManager mgr;
+        if (serverHTTPSKeystoreValue != null)
+          mgr = KeystoreManagerFactory.make("",serverHTTPSKeystoreValue);
+        else
+          mgr = KeystoreManagerFactory.make("");
+        mgr.remove(alias);
+        parameters.setParameter(LiveLinkParameters.serverHTTPSKeystore,mgr.getString());
+      }
+      else if (serverConfigOp.equals("Add"))
+      {
+        String alias = IDFactory.make(threadContext);
+        byte[] certificateValue = variableContext.getBinaryBytes("servercertificate");
+        serverHTTPSKeystoreValue = parameters.getParameter(LiveLinkParameters.serverHTTPSKeystore);
+        IKeystoreManager mgr;
+        if (serverHTTPSKeystoreValue != null)
+          mgr = KeystoreManagerFactory.make("",serverHTTPSKeystoreValue);
+        else
+          mgr = KeystoreManagerFactory.make("");
+        java.io.InputStream is = new java.io.ByteArrayInputStream(certificateValue);
+        String certError = null;
+        try
+        {
+          mgr.importCertificate(alias,is);
+        }
+        catch (Throwable e)
+        {
+          certError = e.getMessage();
+        }
+        finally
+        {
+          try
+          {
+            is.close();
+          }
+          catch (IOException e)
+          {
+            // Eat this exception
+          }
+        }
+
+        if (certError != null)
+        {
+          return "Illegal certificate: "+certError;
+        }
+        parameters.setParameter(LiveLinkParameters.serverHTTPSKeystore,mgr.getString());
+      }
+    }
 
-    String configOp = variableContext.getParameter("configop");
-    if (configOp != null)
+    // Ingest parameters
+    String ingestProtocol = variableContext.getParameter("ingestprotocol");
+    if (ingestProtocol != null)
+      parameters.setParameter(LiveLinkParameters.ingestProtocol,ingestProtocol);
+    String ingestPort = variableContext.getParameter("ingestport");
+    if (ingestPort != null)
+      parameters.setParameter(LiveLinkParameters.ingestPort,ingestPort);
+    String ingestCgiPath = variableContext.getParameter("ingestcgipath");
+    if (ingestCgiPath != null)
+      parameters.setParameter(LiveLinkParameters.ingestCgiPath,ingestCgiPath);
+    String ingestNtlmDomain = variableContext.getParameter("ingestntlmdomain");
+    if (ingestNtlmDomain != null)
+      parameters.setParameter(LiveLinkParameters.ingestNtlmDomain,ingestNtlmDomain);
+    String ingestNtlmUsername = variableContext.getParameter("ingestntlmusername");
+    if (ingestNtlmUsername != null)
+      parameters.setParameter(LiveLinkParameters.ingestNtlmUsername,ingestNtlmUsername);
+    String ingestNtlmPassword = variableContext.getParameter("ingestntlmpassword");
+    if (ingestNtlmPassword != null)
+      parameters.setObfuscatedParameter(LiveLinkParameters.ingestNtlmPassword,ingestNtlmPassword);
+    String ingestKeystoreValue = variableContext.getParameter("ingestkeystoredata");
+    if (ingestKeystoreValue != null)
+      parameters.setParameter(LiveLinkParameters.ingestKeystore,ingestKeystoreValue);
+
+    String ingestConfigOp = variableContext.getParameter("ingestconfigop");
+    if (ingestConfigOp != null)
     {
-      if (configOp.equals("Delete"))
+      if (ingestConfigOp.equals("Delete"))
       {
-        String alias = variableContext.getParameter("llkeystorealias");
-        keystoreValue = parameters.getParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.livelinkKeystore);
+        String alias = variableContext.getParameter("ingestkeystorealias");
+        ingestKeystoreValue = parameters.getParameter(LiveLinkParameters.ingestKeystore);
         IKeystoreManager mgr;
-        if (keystoreValue != null)
-          mgr = KeystoreManagerFactory.make("",keystoreValue);
+        if (ingestKeystoreValue != null)
+          mgr = KeystoreManagerFactory.make("",ingestKeystoreValue);
         else
           mgr = KeystoreManagerFactory.make("");
         mgr.remove(alias);
-        parameters.setParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.livelinkKeystore,mgr.getString());
+        parameters.setParameter(LiveLinkParameters.ingestKeystore,mgr.getString());
       }
-      else if (configOp.equals("Add"))
+      else if (ingestConfigOp.equals("Add"))
       {
         String alias = IDFactory.make(threadContext);
-        byte[] certificateValue = variableContext.getBinaryBytes("llcertificate");
-        keystoreValue = parameters.getParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.livelinkKeystore);
+        byte[] certificateValue = variableContext.getBinaryBytes("ingestcertificate");
+        ingestKeystoreValue = parameters.getParameter(LiveLinkParameters.ingestKeystore);
         IKeystoreManager mgr;
-        if (keystoreValue != null)
-          mgr = KeystoreManagerFactory.make("",keystoreValue);
+        if (ingestKeystoreValue != null)
+          mgr = KeystoreManagerFactory.make("",ingestKeystoreValue);
         else
           mgr = KeystoreManagerFactory.make("");
         java.io.InputStream is = new java.io.ByteArrayInputStream(certificateValue);
@@ -1882,7 +2163,7 @@ public class LivelinkConnector extends o
         {
           return "Illegal certificate: "+certError;
         }
-        parameters.setParameter(org.apache.manifoldcf.crawler.connectors.livelink.LiveLinkParameters.livelinkKeystore,mgr.getString());
+        parameters.setParameter(LiveLinkParameters.ingestKeystore,mgr.getString());
       }
     }
 
@@ -1918,7 +2199,8 @@ public class LivelinkConnector extends o
 "      <nobr>"+org.apache.manifoldcf.ui.util.Encoder.bodyEscape(param)+"=********</nobr><br/>\n"
         );
       }
-      else if (param.length() >="keystore".length() && param.substring(param.length()-"keystore".length()).equalsIgnoreCase("keystore"))
+      else if (param.length() >="keystore".length() && param.substring(param.length()-"keystore".length()).equalsIgnoreCase("keystore") ||
+        param.length() > "truststore".length() && param.substring(param.length()-"truststore".length()).equalsIgnoreCase("truststore"))
       {
         IKeystoreManager kmanager = KeystoreManagerFactory.make("",value);
         out.print(
@@ -2446,7 +2728,7 @@ public class LivelinkConnector extends o
 
     // Find the path-value mapping data
     i = 0;
-    org.apache.manifoldcf.crawler.connectors.livelink.MatchMap matchMap = new org.apache.manifoldcf.crawler.connectors.livelink.MatchMap();
+    MatchMap matchMap = new MatchMap();
     while (i < ds.getChildCount())
     {
       SpecificationNode sn = ds.getChild(i++);
@@ -3553,7 +3835,7 @@ public class LivelinkConnector extends o
     );
     // Find the path-value mapping data
     i = 0;
-    org.apache.manifoldcf.crawler.connectors.livelink.MatchMap matchMap = new org.apache.manifoldcf.crawler.connectors.livelink.MatchMap();
+    MatchMap matchMap = new MatchMap();
     while (i < ds.getChildCount())
     {
       SpecificationNode sn = ds.getChild(i++);
@@ -6691,10 +6973,14 @@ public class LivelinkConnector extends o
       e instanceof com.opentext.api.LLWebAuthInitException
     )
     {
-
       String details = llServer.getErrors();
       throw new ManifoldCFException("Livelink API error: "+e.getMessage()+((details==null)?"":"; "+details),e);
     }
+    else if (e instanceof com.opentext.api.LLSSLNotAvailableException)
+    {
+      String details = llServer.getErrors();
+      throw new ManifoldCFException("Missing llssl.jar error: "+e.getMessage()+((details==null)?"":"; "+details),e);
+    }
     else if (e instanceof com.opentext.api.LLIllegalOperationException)
     {
       // This usually means that LAPI has had a minor communication difficulty but hasn't reported it accurately.
@@ -6702,8 +6988,11 @@ public class LivelinkConnector extends o
       String details = llServer.getErrors();
       return assessRetry(sanityRetryCount,new ManifoldCFException("Livelink API illegal operation error: "+e.getMessage()+((details==null)?"":"; "+details),e));
     }
-    else if (e instanceof com.opentext.api.LLIOException)
+    else if (e instanceof com.opentext.api.LLIOException || (e instanceof RuntimeException && e.getClass().getName().startsWith("com.opentext.api.")))
     {
+      // Catching obfuscated and unspecified opentext runtime exceptions now too - these come from llssl.jar.  We
+      // have to presume these are SSL connection errors; nothing else to go by unfortunately.  UGH.
+      
       // Treat this as a transient error; try again in 5 minutes, and only fail after 12 hours of trying
 
       // LAPI is returning errors that are not terribly explicit, and I don't have control over their wording, so check that server can be resolved by DNS,

Modified: manifoldcf/trunk/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/livelink/common_en_US.properties
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/livelink/common_en_US.properties?rev=1459947&r1=1459946&r2=1459947&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/livelink/common_en_US.properties (original)
+++ manifoldcf/trunk/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/livelink/common_en_US.properties Fri Mar 22 19:34:17 2013
@@ -53,7 +53,7 @@ LivelinkConnector.DocumentFetchSSLCertif
 LivelinkConnector.NoCertificatesPresent=No certificates present
 LivelinkConnector.DeleteCert=Delete cert 
 LivelinkConnector.AddCert=Add cert
-LivelinkConnector.Certificate=Certificate:&nbsp;
+LivelinkConnector.Certificate=Certificate:
 LivelinkConnector.DocumentFetchCGIPath=Document fetch CGI path:
 LivelinkConnector.DocumentFetchNTLMDomain=Document fetch NTLM domain:
 LivelinkConnector.SetIfNTLMAuthDesired=(set if NTLM auth desired)
@@ -132,3 +132,14 @@ LivelinkConnector.CacheLifetimeMustBeAnI
 LivelinkConnector.CacheLRUSizeCannotBeNull=Cache LRU size cannot be null
 LivelinkConnector.CacheLRUSizeMustBeAnInteger=Cache LRU size must be an integer
 
+LivelinkConnector.ServerProtocol=Server protocol:
+LivelinkConnector.internal=internal
+LivelinkConnector.ServerHTTPCGIPath=Server HTTP CGI path:
+LivelinkConnector.ServerHTTPNTLMDomain=Server HTTP domain:
+LivelinkConnector.ServerHTTPNTLMUserName=Server HTTP NTLM user name:
+LivelinkConnector.ServerHTTPNTLMPassword=Server HTTP NTLM password:
+LivelinkConnector.ServerSSLCertificateList=Server SSL certificate list:
+LivelinkConnector.EnterTheServerCgiPathToLivelink=Enter the server CGI path to reach Livelink
+LivelinkConnector.TheServerCgiPathMustBeginWithACharacter=The server CGI path must begin with a '/' character
+LivelinkConnector.Delete=Delete
+LivelinkConnector.Add=Add

Modified: manifoldcf/trunk/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/livelink/common_ja_JP.properties
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/livelink/common_ja_JP.properties?rev=1459947&r1=1459946&r2=1459947&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/livelink/common_ja_JP.properties (original)
+++ manifoldcf/trunk/connectors/livelink/connector/src/main/native2ascii/org/apache/manifoldcf/crawler/connectors/livelink/common_ja_JP.properties Fri Mar 22 19:34:17 2013
@@ -99,7 +99,7 @@ LivelinkConnector.DeleteMetadata=メ�
 LivelinkConnector.NoMetadataSpecified=メタデータは選択されていません
 LivelinkConnector.AddMetadataItem=メタデータを追加
 LivelinkConnector.BackUpMetadataPath=バックアップメタデータパス
-LivelinkConnector.AllAttributesInThisCategory=&nbsp;カテゴリのすべての属性
+LivelinkConnector.AllAttributesInThisCategory=カテゴリのすべての属性
 LivelinkConnector.PickAttributes=-- 属性を選択してください --
 LivelinkConnector.AddToMetadataPath=メタデータパスに追加
 LivelinkConnector.PickWorkspace=-- ワークスペースを選択してください --
@@ -131,3 +131,15 @@ LivelinkConnector.CacheLifetimeCannotBeN
 LivelinkConnector.CacheLifetimeMustBeAnInteger=キャッシュライフタイムには整数を入力してください
 LivelinkConnector.CacheLRUSizeCannotBeNull=キャッシュLRUサイズを入力してください
 LivelinkConnector.CacheLRUSizeMustBeAnInteger=キャッシュLRUサイズには整数を入力してください
+
+LivelinkConnector.ServerProtocol=Server protocol:
+LivelinkConnector.internal=internal
+LivelinkConnector.ServerHTTPCGIPath=Server HTTP CGI path:
+LivelinkConnector.ServerHTTPNTLMDomain=Server HTTP domain:
+LivelinkConnector.ServerHTTPNTLMUserName=Server HTTP NTLM user name:
+LivelinkConnector.ServerHTTPNTLMPassword=Server HTTP NTLM password:
+LivelinkConnector.ServerSSLCertificateList=Server SSL certificate list:
+LivelinkConnector.EnterTheServerCgiPathToLivelink=Enter the server CGI path to reach Livelink
+LivelinkConnector.TheServerCgiPathMustBeginWithACharacter=The server CGI path must begin with a '/' character
+LivelinkConnector.Delete=Delete
+LivelinkConnector.Add=Add

Modified: manifoldcf/trunk/connectors/livelink/lib-proprietary/README.txt
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/livelink/lib-proprietary/README.txt?rev=1459947&r1=1459946&r2=1459947&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/livelink/lib-proprietary/README.txt (original)
+++ manifoldcf/trunk/connectors/livelink/lib-proprietary/README.txt Fri Mar 22 19:34:17 2013
@@ -13,9 +13,11 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-The LiveLink connector requires a client library from OpenText in order to function.
-The client jar is call lapi.jar, and the version we have tested against can be found
-in the LAPI 9.7.1 package from OpenText.  Copy that jar to this directory, and build the
+The LiveLink connector requires a client library from OpenText in order
+to function.  The client jar is call lapi.jar, and the version we have
+tested against can be found in the LAPI 9.7.1 package from OpenText.
+For some modes of operation, the jar llssl.jar from the same package
+may also be required.  Copy these jars to this directory, and build the
 connector using the standard ant build process.  More can be found in the
 "how-to-build-and-deploy.html" documentation page.
 

Modified: manifoldcf/trunk/connectors/livelink/proprietary-library-instructions.txt
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/livelink/proprietary-library-instructions.txt?rev=1459947&r1=1459946&r2=1459947&view=diff
==============================================================================
--- manifoldcf/trunk/connectors/livelink/proprietary-library-instructions.txt (original)
+++ manifoldcf/trunk/connectors/livelink/proprietary-library-instructions.txt Fri Mar 22 19:34:17 2013
@@ -16,13 +16,15 @@
 The LiveLink connector requires a client library from OpenText in
 order to function.  The client jar is call lapi.jar, and the version we
 have tested against can be found in the LAPI 9.7.1 package from
-OpenText.  Copy that jar to this directory, and run ManifoldCF
-using the appropriate means.
+OpenText.  For some modes of operation, you may also need llssl.jar
+from the same package.  Copy those jars to this directory, and run
+ManifoldCF using the appropriate means.
 
 If you find there are incompatibilities between your version of lapi.jar
 and the one your release of ManifoldCF was built against, you must build
-ManifoldCF yourself, and include a copy of your lapi.jar prior to building,
+ManifoldCF yourself, and include a copy of your jars prior to building,
 in the directory "connectors/livelink/lib-proprietary".
 
-More can be found in the "how-to-build-and-deploy.html" documentation page.
+More can be found in the "how-to-build-and-deploy.html"
+documentation page.
 

Modified: manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/system/ManifoldCF.java
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/system/ManifoldCF.java?rev=1459947&r1=1459946&r2=1459947&view=diff
==============================================================================
--- manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/system/ManifoldCF.java (original)
+++ manifoldcf/trunk/framework/core/src/main/java/org/apache/manifoldcf/core/system/ManifoldCF.java Fri Mar 22 19:34:17 2013
@@ -397,21 +397,23 @@ public class ManifoldCF
   }
 
   /** Recursive delete: for cleaning up company folder.
-  *@param directoryPath is the File describing the directory to be removed.
+  *@param directoryPath is the File describing the directory or file to be removed.
   */
-  protected static void recursiveDelete(File directoryPath)
+  public static void recursiveDelete(File directoryPath)
   {
-    File[] children = directoryPath.listFiles();
-    if (children != null)
+    if (!directoryPath.exists())
+      return;
+    if (directoryPath.isDirectory())
     {
-      int i = 0;
-      while (i < children.length)
+      File[] children = directoryPath.listFiles();
+      if (children != null)
       {
-        File x = children[i++];
-        if (x.isDirectory())
+        int i = 0;
+        while (i < children.length)
+        {
+          File x = children[i++];
           recursiveDelete(x);
-        else
-          x.delete();
+        }
       }
     }
     directoryPath.delete();
@@ -718,6 +720,39 @@ public class ManifoldCF
     master.dropUserAndDatabase(masterUsername,masterPassword,null);
   }
 
+  /** Create temporary directory.
+  */
+  public static File createTempDir(String prefix, String suffix)
+    throws ManifoldCFException
+  {
+    String tempDirLocation = System.getProperty("java.io.tmpdir");
+    if (tempDirLocation == null)
+      throw new ManifoldCFException("Can't find temporary directory!");
+    File tempDir = new File(tempDirLocation);
+    // Start with current timestamp, and generate a hash, then look for collision
+    long currentFileID = System.currentTimeMillis();
+    long currentFileHash = (currentFileID << 5) ^ (currentFileID >> 3);
+    int raceConditionRepeat = 0;
+    while (raceConditionRepeat < 1000)
+    {
+      File tempCertDir = new File(tempDir,prefix+currentFileHash+suffix);
+      if (tempCertDir.mkdir())
+      {
+        return tempCertDir;
+      }
+      if (tempCertDir.exists())
+      {
+        currentFileHash++;
+        continue;
+      }
+      // Doesn't exist but couldn't create either.  COULD be a race condition; we'll only know if we retry
+      // lots and nothing changes.
+      raceConditionRepeat++;
+      Thread.yield();
+    }
+    throw new ManifoldCFException("Temporary directory appears to be unwritable");
+  }
+
   /** Add a file to the tracking system. */
   public static void addFile(File f)
   {
@@ -1194,8 +1229,8 @@ public class ManifoldCF
   /** Class that tracks files that need to be cleaned up on exit */
   protected static class FileTrack implements IShutdownHook
   {
-    /** Key and value are both File objects */
-    protected Map<File,File> filesToDelete = new HashMap<File,File>();
+    /** Set of File objects */
+    protected Set<File> filesToDelete = new HashSet<File>();
 
     /** Constructor */
     public FileTrack()
@@ -1207,7 +1242,7 @@ public class ManifoldCF
     {
       synchronized (this)
       {
-        filesToDelete.put(f,f);
+        filesToDelete.add(f);
       }
     }
 
@@ -1216,12 +1251,12 @@ public class ManifoldCF
     {
       // Because we never reuse file names, it is OK to delete twice.
       // So the delete() can be outside the synchronizer.
-      f.delete();
+      recursiveDelete(f);
       synchronized (this)
       {
         filesToDelete.remove(f);
       }
-  }
+    }
 
     /** Delete all remaining files */
     public void doCleanup()
@@ -1229,10 +1264,10 @@ public class ManifoldCF
     {
       synchronized (this)
       {
-	Iterator iter = filesToDelete.keySet().iterator();
+	Iterator<File> iter = filesToDelete.iterator();
 	while (iter.hasNext())
 	{
-	  File f = (File)iter.next();
+	  File f = iter.next();
 	  f.delete();
 	}
 	filesToDelete.clear();

Modified: manifoldcf/trunk/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_en_US.properties
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_en_US.properties?rev=1459947&r1=1459946&r2=1459947&view=diff
==============================================================================
--- manifoldcf/trunk/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_en_US.properties (original)
+++ manifoldcf/trunk/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_en_US.properties Fri Mar 22 19:34:17 2013
@@ -766,7 +766,7 @@ viewauthority.EditThisAuthorityConnectio
 viewauthority.Delete=Delete
 viewauthority.DeleteThisAuthorityConnection=Delete this authority connection
 viewauthority.ApacheManifoldCFViewAuthorityConnectionStatus=Apache ManifoldCF: View Authority Connection Status
-viewauthority.Deleteconnection=Delete connection
+viewauthority.DeleteConnection=Delete connection
 viewauthority.Connectorisnotinstalled=Connector is not installed.
 viewauthority.uninstalled=(uninstalled)
 viewauthority.Threwexception=Threw exception:

Modified: manifoldcf/trunk/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_ja_JP.properties
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_ja_JP.properties?rev=1459947&r1=1459946&r2=1459947&view=diff
==============================================================================
--- manifoldcf/trunk/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_ja_JP.properties (original)
+++ manifoldcf/trunk/framework/ui-core/src/main/native2ascii/org/apache/manifoldcf/ui/i18n/common_ja_JP.properties Fri Mar 22 19:34:17 2013
@@ -767,7 +767,7 @@ viewauthority.EditThisAuthorityConnectio
 viewauthority.Delete=削除
 viewauthority.DeleteThisAuthorityConnection=権限コネクションを削除
 viewauthority.ApacheManifoldCFViewAuthorityConnectionStatus=Apache ManifoldCF: 権限コネクション状態の表示
-viewauthority.Deleteconnection=Delete connection
+viewauthority.DeleteConnection=Delete connection
 viewauthority.Connectorisnotinstalled=Connector is not installed.
 viewauthority.uninstalled=(uninstalled)
 viewauthority.Threwexception=Threw exception:

Modified: manifoldcf/trunk/site/src/documentation/content/xdocs/en_US/how-to-build-and-deploy.xml
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/site/src/documentation/content/xdocs/en_US/how-to-build-and-deploy.xml?rev=1459947&r1=1459946&r2=1459947&view=diff
==============================================================================
--- manifoldcf/trunk/site/src/documentation/content/xdocs/en_US/how-to-build-and-deploy.xml (original)
+++ manifoldcf/trunk/site/src/documentation/content/xdocs/en_US/how-to-build-and-deploy.xml Fri Mar 22 19:34:17 2013
@@ -177,9 +177,9 @@
           <p>This connector needs OpenText's LAPI package in order to be run.  It is usually built against a set of stubs. The stubs, however, mimic the
               class structure of LAPI 9.7.1.  Later versions (such as 10.x) have a different class structure.  Therefore, you may need to rebuild ManifoldCF
               against your lapi.jar, in order for the connector to work properly.</p>
-          <p>If you need to supply your own lapi.jar at build time, copy it to the source directory <em>connectors/livelink/lib-proprietary</em>, and build using "ant build".
+          <p>If you need to supply your own lapi.jar and llssl.jar at build time, copy it to the source directory <em>connectors/livelink/lib-proprietary</em>, and build using "ant build".
               The lapi.jar will be copied into the right place in your <em>dist</em> directory automatically.</p>
-          <p>If you do not wish to build, simply copy your lapi.jar into the binary distribution's <em>connector-lib-proprietary</em>
+          <p>If you do not wish to build, simply copy your lapi.jar and llssl.jar into the binary distribution's <em>connector-lib-proprietary</em>
               directory, and uncomment the LiveLink-related connector lines in <em>connectors.xml</em> file.</p>
           <p></p>
         </section>

Modified: manifoldcf/trunk/site/src/documentation/content/xdocs/ja_JP/how-to-build-and-deploy.xml
URL: http://svn.apache.org/viewvc/manifoldcf/trunk/site/src/documentation/content/xdocs/ja_JP/how-to-build-and-deploy.xml?rev=1459947&r1=1459946&r2=1459947&view=diff
==============================================================================
--- manifoldcf/trunk/site/src/documentation/content/xdocs/ja_JP/how-to-build-and-deploy.xml (original)
+++ manifoldcf/trunk/site/src/documentation/content/xdocs/ja_JP/how-to-build-and-deploy.xml Fri Mar 22 19:34:17 2013
@@ -177,9 +177,9 @@
           <p>This connector needs OpenText's LAPI package in order to be run.  It is usually built against a set of stubs. The stubs, however, mimic the
               class structure of LAPI 9.7.1.  Later versions (such as 10.x) have a different class structure.  Therefore, you may need to rebuild ManifoldCF
               against your lapi.jar, in order for the connector to work properly.</p>
-          <p>If you need to supply your own lapi.jar at build time, copy it to the source directory <em>connectors/livelink/lib-proprietary</em>, and build using "ant build".
+          <p>If you need to supply your own lapi.jar and llssl.jar at build time, copy it to the source directory <em>connectors/livelink/lib-proprietary</em>, and build using "ant build".
               The lapi.jar will be copied into the right place in your <em>dist</em> directory automatically.</p>
-          <p>If you do not wish to build, simply copy your lapi.jar into the binary distribution's <em>connector-lib-proprietary</em>
+          <p>If you do not wish to build, simply copy your lapi.jar and llssl.jar into the binary distribution's <em>connector-lib-proprietary</em>
               directory, and uncomment the LiveLink-related connector lines in <em>connectors.xml</em> file.</p>
           <p></p>
         </section>