Author: kwright
Date: Fri Nov  1 16:44:08 2013
New Revision: 1537982

URL: http://svn.apache.org/r1537982
Log:
Fix for CONNECTORS-801.  Warning: Change is not backwards compatible!

Added:
    
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/
    
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/IDynamicResultSet.java
      - copied, changed from r1537543, 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/IDynamicResultSet.java
    
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConnection.java
      - copied, changed from r1537836, 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/JDBCConnection.java
    
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConnectionFactory.java
   (with props)
    
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConstants.java
      - copied, changed from r1537543, 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/JDBCConstants.java
Removed:
    
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/IDynamicResultSet.java
    
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/JDBCConnection.java
    
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/JDBCConnectionFactory.java
    
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/JDBCConstants.java
Modified:
    manifoldcf/trunk/CHANGES.txt
    
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jdbc/JDBCAuthority.java
    
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/JDBCConnector.java

Modified: manifoldcf/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/CHANGES.txt?rev=1537982&r1=1537981&r2=1537982&view=diff
==============================================================================
--- manifoldcf/trunk/CHANGES.txt (original)
+++ manifoldcf/trunk/CHANGES.txt Fri Nov  1 16:44:08 2013
@@ -3,6 +3,12 @@ $Id$
 
 ======================= 1.5-dev =====================
 
+CONNECTORS-801: Refactor JDBC authority to bring it into compliance with 
current
+conventions in JDBC connector.  Warning: this change is not backwards
+compatible!  JDBC authority queries now require explicit return column
+names for the user id and token queries!
+(Karl Wright)
+
 CONNECTORS-798: Bring JDBC connector support for CLOBs into the
 modern era.  This also required extension of the CharacterInputFile
 paradigm slightly - a new method to find the utf8 byte length was needed.
@@ -13,7 +19,7 @@ database table for the jobstatus screen.
 (Graeme Seaton, Karl Wright)
 
 CONNECTORS-796: Fix NPE in RSS connector having to do with
-tags that aren't nested as expected.
+tags that aren't nested as expected.  CDATA parsing was also broken.
 (Benjamin Brandmeier, Karl Wright)
 
 CONNECTORS-792: Introduce concepts of authorization domain

Modified: 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jdbc/JDBCAuthority.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jdbc/JDBCAuthority.java?rev=1537982&r1=1537981&r2=1537982&view=diff
==============================================================================
--- 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jdbc/JDBCAuthority.java
 (original)
+++ 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/authorities/authorities/jdbc/JDBCAuthority.java
 Fri Nov  1 16:44:08 2013
@@ -45,11 +45,12 @@ import org.apache.manifoldcf.core.interf
 import org.apache.manifoldcf.core.interfaces.ManifoldCFException;
 import org.apache.manifoldcf.core.interfaces.StringSet;
 import org.apache.manifoldcf.core.interfaces.TimeMarker;
-import org.apache.manifoldcf.core.jdbcpool.WrappedConnection;
-import org.apache.manifoldcf.crawler.connectors.jdbc.JDBCConnectionFactory;
-import org.apache.manifoldcf.crawler.connectors.jdbc.JDBCConstants;
+import org.apache.manifoldcf.core.interfaces.IResultRow;
+import org.apache.manifoldcf.jdbc.JDBCConnection;
+import org.apache.manifoldcf.jdbc.JDBCConstants;
+import org.apache.manifoldcf.jdbc.IDynamicResultSet;
 import org.apache.manifoldcf.crawler.connectors.jdbc.Messages;
-import org.apache.manifoldcf.crawler.system.Logging;
+import org.apache.manifoldcf.authorities.system.Logging;
 
 /**
  *
@@ -58,14 +59,18 @@ import org.apache.manifoldcf.crawler.sys
 public class JDBCAuthority extends BaseAuthorityConnector {
 
   public static final String _rcsid = "@(#)$Id: JDBCAuthority.java $";
-  protected WrappedConnection connection = null;
+
+  protected JDBCConnection connection = null;
   protected String jdbcProvider = null;
+  protected String accessMethod = null;
   protected String host = null;
   protected String databaseName = null;
   protected String userName = null;
   protected String password = null;
+
   protected String idQuery = null;
   protected String tokenQuery = null;
+
   private long responseLifetime = 60000L; //60sec
   private int LRUsize = 1000;
   /**
@@ -93,10 +98,12 @@ public class JDBCAuthority extends BaseA
     super.connect(configParams);
 
     jdbcProvider = configParams.getParameter(JDBCConstants.providerParameter);
+    accessMethod = configParams.getParameter(JDBCConstants.methodParameter);
     host = configParams.getParameter(JDBCConstants.hostParameter);
     databaseName = 
configParams.getParameter(JDBCConstants.databaseNameParameter);
     userName = configParams.getParameter(JDBCConstants.databaseUserName);
     password = 
configParams.getObfuscatedParameter(JDBCConstants.databasePassword);
+
     idQuery = configParams.getParameter(JDBCConstants.databaseUserIdQuery);
     tokenQuery = configParams.getParameter(JDBCConstants.databaseTokensQuery);
   }
@@ -108,12 +115,13 @@ public class JDBCAuthority extends BaseA
   public String check()
     throws ManifoldCFException {
     try {
-      WrappedConnection tempConnection = 
JDBCConnectionFactory.getConnection(jdbcProvider, host, databaseName, userName, 
password);
-      JDBCConnectionFactory.releaseConnection(tempConnection);
+      getSession();
+      // Attempt to fetch a connection; if this succeeds we pass
+      connection.testConnection();
       return super.check();
-    } catch (Throwable e) {
-      if (Logging.connectors.isDebugEnabled()) {
-        Logging.connectors.debug("Service interruption in check(): " + 
e.getMessage(), e);
+    } catch (ServiceInterruption e) {
+      if (Logging.authorityConnectors.isDebugEnabled()) {
+        Logging.authorityConnectors.debug("Service interruption in check(): " 
+ e.getMessage(), e);
       }
       return "Transient error: " + e.getMessage();
     }
@@ -125,12 +133,10 @@ public class JDBCAuthority extends BaseA
   @Override
   public void disconnect()
     throws ManifoldCFException {
-    if (connection != null) {
-      JDBCConnectionFactory.releaseConnection(connection);
-      connection = null;
-    }
+    connection = null;
     host = null;
     jdbcProvider = null;
+    accessMethod = null;
     databaseName = null;
     userName = null;
     password = null;
@@ -151,7 +157,7 @@ public class JDBCAuthority extends BaseA
         throw new ManifoldCFException("Missing parameter '" + 
JDBCConstants.hostParameter + "'");
       }
 
-      connection = JDBCConnectionFactory.getConnection(jdbcProvider, host, 
databaseName, userName, password);
+      connection = new JDBCConnection(jdbcProvider,(accessMethod==null || 
accessMethod.equals("name")),host,databaseName,userName,password);
     }
   }
 
@@ -204,10 +210,12 @@ public class JDBCAuthority extends BaseA
 
   public AuthorizationResponse getAuthorizationResponseUncached(String 
userName)
     throws ManifoldCFException {
-    try {
+    try
+    {
       getSession();
 
       VariableMap vm = new VariableMap();
+      addConstant(vm, JDBCConstants.idReturnVariable, 
JDBCConstants.idReturnColumnName);
       addVariable(vm, JDBCConstants.userNameVariable, userName);
 
       // Find user id
@@ -215,54 +223,74 @@ public class JDBCAuthority extends BaseA
       StringBuilder sb = new StringBuilder();
       substituteQuery(idQuery, vm, sb, paramList);
 
-      PreparedStatement ps = 
connection.getConnection().prepareStatement(sb.toString());
-      loadPS(ps, paramList);
-      ResultSet rs = ps.executeQuery();
-      if (rs == null) {
+      IDynamicResultSet idSet;
+      try {
+        idSet = connection.executeUncachedQuery(sb.toString(),paramList,-1);
+      }
+      catch (ServiceInterruption e)
+      {
         return RESPONSE_UNREACHABLE;
       }
-      String uid;
-      if (rs.next()) {
-        uid = rs.getString(1);
-      } else {
-        return RESPONSE_USERNOTFOUND;
+      catch (ManifoldCFException e)
+      {
+        throw e;
       }
-      if (uid == null || uid.isEmpty()) {
-        return RESPONSE_UNREACHABLE;
+
+      IResultRow row = idSet.getNextRow();
+      if (row == null)
+        return RESPONSE_USERNOTFOUND;
+      
+      Object oUid = row.getValue(JDBCConstants.idReturnColumnName);
+      if (oUid == null)
+        throw new ManifoldCFException("Bad id query; doesn't return 
$(IDCOLUMN) column.  Try using quotes around $(IDCOLUMN) variable, e.g. 
\"$(IDCOLUMN)\".");
+      String uid = oUid.toString();
+
+      if (uid.isEmpty()) {
+        return RESPONSE_USERNOTFOUND;
       }
 
       // now check tokens
       vm = new VariableMap();
+      addConstant(vm, JDBCConstants.tokenReturnVariable, 
JDBCConstants.tokenReturnColumnName);
       addVariable(vm, JDBCConstants.userNameVariable, userName);
       addVariable(vm, JDBCConstants.userIDVariable, uid);
       sb = new StringBuilder();
       paramList = new ArrayList();
       substituteQuery(tokenQuery, vm, sb, paramList);
-      ps = connection.getConnection().prepareStatement(sb.toString());
-      loadPS(ps, paramList);
-      rs = ps.executeQuery();
-      if (rs == null) {
+      
+      try {
+        idSet = connection.executeUncachedQuery(sb.toString(),paramList,-1);
+      }
+      catch (ServiceInterruption e)
+      {
         return RESPONSE_UNREACHABLE;
       }
+      catch (ManifoldCFException e)
+      {
+        throw e;
+      }
+
       ArrayList<String> tokenArray = new ArrayList<String>();
-      while (rs.next()) {
-        String token = rs.getString(1);
-        if (token != null && !token.isEmpty()) {
+      while (true)
+      {
+        row = idSet.getNextRow();
+        if (row == null)
+          break;
+        
+        Object oToken = row.getValue(JDBCConstants.tokenReturnColumnName);
+        if (oToken == null)
+          throw new ManifoldCFException("Bad token query; doesn't return 
$(TOKENCOLUMN) column.  Try using quotes around $(TOKENCOLUMN) variable, e.g. 
\"$(TOKENCOLUMN)\".");
+        String token = oToken.toString();
+
+        if (!token.isEmpty()) {
           tokenArray.add(token);
         }
       }
-
-      String[] tokens = new String[tokenArray.size()];
-      int k = 0;
-      while (k < tokens.length) {
-        tokens[k] = tokenArray.get(k);
-        k++;
-      }
-
-      return new AuthorizationResponse(tokens, 
AuthorizationResponse.RESPONSE_OK);
-
-    } catch (Exception e) {
-      // Unreachable
+      return new AuthorizationResponse(tokenArray.toArray(new String[0]), 
AuthorizationResponse.RESPONSE_OK);
+    }
+    catch (ServiceInterruption e)
+    {
+      Logging.authorityConnectors.warn("JDBCAuthority: Service interruption: 
"+e.getMessage(),e);
       return RESPONSE_UNREACHABLE;
     }
   }
@@ -350,6 +378,9 @@ public class JDBCAuthority extends BaseA
     if (lJdbcProvider == null) {
       lJdbcProvider = "oracle:thin:@";
     }
+    String lAccessMethod = 
parameters.getParameter(JDBCConstants.methodParameter);
+    if (lAccessMethod == null)
+      lAccessMethod = "name";
     String lHost = parameters.getParameter(JDBCConstants.hostParameter);
     if (lHost == null) {
       lHost = "localhost";
@@ -370,33 +401,44 @@ public class JDBCAuthority extends BaseA
     }
     String lIdQuery = 
parameters.getParameter(JDBCConstants.databaseUserIdQuery);
     if (lIdQuery == null) {
-      lIdQuery = "SELECT idfield FROM usertable WHERE login = $(USERNAME)";
+      lIdQuery = "SELECT idfield AS $(IDCOLUMN) FROM usertable WHERE login = 
$(USERNAME)";
     }
     String lTokenQuery = 
parameters.getParameter(JDBCConstants.databaseTokensQuery);
     if (lTokenQuery == null) {
-      lTokenQuery = "SELECT groupnamefield FROM grouptable WHERE user_id = 
$(UID) or login = $(USERNAME)";
+      lTokenQuery = "SELECT groupnamefield AS $(TOKENCOLUMN) FROM grouptable 
WHERE user_id = $(UID) OR login = $(USERNAME)";
     }
 
     // "Database Type" tab
     if (tabName.equals(Messages.getString(locale, 
"JDBCAuthority.DatabaseType"))) {
       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, "JDBCAuthority.DatabaseType2") + 
"</nobr></td><td class=\"value\">\n"
-        + "      <select multiple=\"false\" name=\"databasetype\" 
size=\"2\">\n"
-        + "        <option value=\"oracle:thin:@\" " + 
(lJdbcProvider.equals("oracle:thin:@") ? "selected=\"selected\"" : "") + 
">Oracle</option>\n"
-        + "        <option value=\"postgresql:\" " + 
(lJdbcProvider.equals("postgresql:") ? "selected=\"selected\"" : "") + 
">Postgres SQL</option>\n"
-        + "        <option value=\"jtds:sqlserver:\" " + 
(lJdbcProvider.equals("jtds:sqlserver:") ? "selected=\"selected\"" : "") + ">MS 
SQL Server (&gt; V6.5)</option>\n"
-        + "        <option value=\"jtds:sybase:\" " + 
(lJdbcProvider.equals("jtds:sybase:") ? "selected=\"selected\"" : "") + 
">Sybase (&gt;= V10)</option>\n"
-        + "        <option value=\"mysql:\" " + 
(lJdbcProvider.equals("mysql:") ? "selected=\"selected\"" : "") + ">MySQL 
(&gt;= V5)</option>\n"
-        + "      </select>\n"
-        + "    </td>\n"
-        + "  </tr>\n"
-        + "</table>\n");
+"<table class=\"displaytable\">\n"+
+"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
+"  <tr>\n"+
+"    <td class=\"description\"><nobr>" + Messages.getBodyString(locale, 
"JDBCAuthority.DatabaseType2") + "</nobr></td><td class=\"value\">\n"+
+"      <select multiple=\"false\" name=\"databasetype\" size=\"2\">\n"+
+"        <option value=\"oracle:thin:@\" " + 
(lJdbcProvider.equals("oracle:thin:@") ? "selected=\"selected\"" : "") + 
">Oracle</option>\n"+
+"        <option value=\"postgresql:\" " + 
(lJdbcProvider.equals("postgresql:") ? "selected=\"selected\"" : "") + 
">Postgres SQL</option>\n"+
+"        <option value=\"jtds:sqlserver:\" " + 
(lJdbcProvider.equals("jtds:sqlserver:") ? "selected=\"selected\"" : "") + ">MS 
SQL Server (&gt; V6.5)</option>\n"+
+"        <option value=\"jtds:sybase:\" " + 
(lJdbcProvider.equals("jtds:sybase:") ? "selected=\"selected\"" : "") + 
">Sybase (&gt;= V10)</option>\n"+
+"        <option value=\"mysql:\" " + (lJdbcProvider.equals("mysql:") ? 
"selected=\"selected\"" : "") + ">MySQL (&gt;= V5)</option>\n"+
+"      </select>\n"+
+"    </td>\n"+
+"  </tr>\n"+
+"  <tr><td class=\"separator\" colspan=\"2\"><hr/></td></tr>\n"+
+"  <tr>\n"+
+"    <td class=\"description\"><nobr>" + 
Messages.getBodyString(locale,"JDBCConnector.AccessMethod") + "</nobr></td><td 
class=\"value\">\n"+
+"      <select multiple=\"false\" name=\"accessmethod\" size=\"2\">\n"+
+"        <option value=\"name\" 
"+(lAccessMethod.equals("name")?"selected=\"selected\"":"")+">"+Messages.getBodyString(locale,"JDBCConnector.ByName")+"</option>\n"+
+"        <option value=\"label\" 
"+(lAccessMethod.equals("label")?"selected=\"selected\"":"")+">"+Messages.getBodyString(locale,"JDBCConnector.ByLabel")+"</option>\n"+
+"      </select>\n"+
+"    </td>\n"+
+"  </tr>\n"+
+"</table>\n");
     } else {
       out.print(
-        "<input type=\"hidden\" name=\"databasetype\" value=\"" + 
lJdbcProvider + "\"/>\n");
+"<input type=\"hidden\" name=\"databasetype\" value=\"" + lJdbcProvider + 
"\"/>\n"+
+"<input type=\"hidden\" name=\"accessmethod\" value=\""+lAccessMethod+"\"/>\n"
+      );
     }
 
     // "Server" tab
@@ -481,6 +523,10 @@ public class JDBCAuthority extends BaseA
       parameters.setParameter(JDBCConstants.providerParameter, type);
     }
 
+    String accessMethod = variableContext.getParameter("accessmethod");
+    if (accessMethod != null)
+      parameters.setParameter(JDBCConstants.methodParameter,accessMethod);
+
     String lHost = variableContext.getParameter("databasehost");
     if (lHost != null) {
       parameters.setParameter(JDBCConstants.hostParameter, lHost);

Modified: 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/JDBCConnector.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/JDBCConnector.java?rev=1537982&r1=1537981&r2=1537982&view=diff
==============================================================================
--- 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/JDBCConnector.java
 (original)
+++ 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/JDBCConnector.java
 Fri Nov  1 16:44:08 2013
@@ -23,6 +23,9 @@ import org.apache.manifoldcf.agents.inte
 import org.apache.manifoldcf.crawler.interfaces.*;
 import org.apache.manifoldcf.crawler.system.Logging;
 import org.apache.manifoldcf.core.database.*;
+import org.apache.manifoldcf.jdbc.JDBCConnection;
+import org.apache.manifoldcf.jdbc.JDBCConstants;
+import org.apache.manifoldcf.jdbc.IDynamicResultSet;
 
 import java.sql.*;
 import javax.naming.*;
@@ -169,6 +172,7 @@ public class JDBCConnector extends org.a
     connection = null;
     host = null;
     jdbcProvider = null;
+    accessMethod = null;
     databaseName = null;
     userName = null;
     password = null;

Copied: 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/IDynamicResultSet.java
 (from r1537543, 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/IDynamicResultSet.java)
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/IDynamicResultSet.java?p2=manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/IDynamicResultSet.java&p1=manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/IDynamicResultSet.java&r1=1537543&r2=1537982&rev=1537982&view=diff
==============================================================================
--- 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/IDynamicResultSet.java
 (original)
+++ 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/IDynamicResultSet.java
 Fri Nov  1 16:44:08 2013
@@ -16,7 +16,7 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
-package org.apache.manifoldcf.crawler.connectors.jdbc;
+package org.apache.manifoldcf.jdbc;
 
 import org.apache.manifoldcf.core.interfaces.*;
 import org.apache.manifoldcf.agents.interfaces.*;

Copied: 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConnection.java
 (from r1537836, 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/JDBCConnection.java)
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConnection.java?p2=manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConnection.java&p1=manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/JDBCConnection.java&r1=1537836&r2=1537982&rev=1537982&view=diff
==============================================================================
--- 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/JDBCConnection.java
 (original)
+++ 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConnection.java
 Fri Nov  1 16:44:08 2013
@@ -16,7 +16,7 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
-package org.apache.manifoldcf.crawler.connectors.jdbc;
+package org.apache.manifoldcf.jdbc;
 
 import org.apache.manifoldcf.core.interfaces.*;
 import org.apache.manifoldcf.core.database.*;

Added: 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConnectionFactory.java
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConnectionFactory.java?rev=1537982&view=auto
==============================================================================
--- 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConnectionFactory.java
 (added)
+++ 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConnectionFactory.java
 Fri Nov  1 16:44:08 2013
@@ -0,0 +1,181 @@
+/* $Id$ */
+
+/**
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.apache.manifoldcf.jdbc;
+
+import org.apache.manifoldcf.core.interfaces.*;
+import org.apache.manifoldcf.core.jdbcpool.*;
+import org.apache.manifoldcf.agents.interfaces.*;
+import org.apache.manifoldcf.crawler.system.Logging;
+import org.apache.manifoldcf.crawler.system.ManifoldCF;
+
+import java.util.*;
+import java.sql.*;
+import javax.naming.*;
+import javax.sql.*;
+import java.util.*;
+
+/** This class creates a connection
+*/
+public class JDBCConnectionFactory
+{
+  public static final String _rcsid = "@(#)$Id$";
+
+  private static Map driverMap;
+
+  private static ConnectionPoolManager _pool = null;
+
+  static
+  {
+    driverMap = new HashMap();
+    driverMap.put("oracle:thin:@","oracle.jdbc.OracleDriver");
+    driverMap.put("postgresql:","org.postgresql.Driver");
+    driverMap.put("jtds:sqlserver:","net.sourceforge.jtds.jdbc.Driver");
+    driverMap.put("jtds:sybase:","net.sourceforge.jtds.jdbc.Driver");
+    driverMap.put("mysql:","com.mysql.jdbc.Driver");
+    try
+    {
+      _pool = new ConnectionPoolManager(120,false);
+    }
+    catch (Exception e)
+    {
+      System.err.println("Can't set up pool");
+      e.printStackTrace(System.err);
+    }
+  }
+
+  private JDBCConnectionFactory()
+  {
+  }
+
+
+  public static WrappedConnection getConnection(String providerName, String 
host, String database, String userName, String password)
+    throws ManifoldCFException, ServiceInterruption
+  {
+    if (database.length() == 0)
+      database = "_root_";
+
+    String driverClassName = (String)driverMap.get(providerName);
+    if (driverClassName == null)
+      throw new ManifoldCFException("Unrecognized jdbc provider: 
'"+providerName+"'");
+
+    String instanceName = null;
+    // Special for MSSQL: Allow database spec to contain an instance name too, 
in form:
+    // <instance>/<database>
+    if (providerName.startsWith("jtds:"))
+    {
+      int slashIndex = database.indexOf("/");
+      if (slashIndex != -1)
+      {
+        instanceName = database.substring(0,slashIndex);
+        database = database.substring(slashIndex+1);
+      }
+    }
+
+    String dburl = "jdbc:" + providerName + "//" + host + "/" + database + 
((instanceName==null)?"":";instance="+instanceName);
+    if (Logging.connectors != null && Logging.connectors.isDebugEnabled())
+      Logging.connectors.debug("JDBC: The connect string is '"+dburl+"'");
+    try
+    {
+      // Hope for a connection now
+      if (_pool != null)
+      {
+        // Build a unique string to identify the pool.  This has to include
+        // the database and host at a minimum.
+
+        // Provider is part of the pool key, so that the pools can distinguish 
between different databases
+        String poolKey = providerName + "/";
+
+        // Distinguish between instance names and databases too
+        if (instanceName == null)
+          poolKey += host + "/" + database;
+        else
+          poolKey += host + "/" + instanceName + "/" + database;
+
+        // Better include the credentials on the pool key, or we won't be able 
to change those and have it build new connections
+        // The password value is SHA-1 hashed, because the pool driver reports 
the password in many exceptions and we don't want it
+        // to be displayed.
+        poolKey += "/" + userName + "/" + ManifoldCF.hash(password);
+
+        ConnectionPool cp;
+        synchronized (_pool)
+        {
+          cp = _pool.getPool(poolKey);
+          if (cp == null)
+          {
+            // Register the driver here
+            Class.forName(driverClassName);
+            //System.out.println("Class name '"+driverClassName+"'; URL = 
'"+dburl+"'");
+            cp =_pool.addAlias(poolKey, driverClassName, dburl,
+              userName, password, 30, 300000L);
+          }
+        }
+        return cp.getConnection();
+      }
+      else
+        throw new ManifoldCFException("Can't get connection since pool driver 
did not initialize properly");
+    }
+    catch (InterruptedException e)
+    {
+      throw new 
ManifoldCFException(e.getMessage(),ManifoldCFException.INTERRUPTED);
+    }
+    catch (java.sql.SQLException e)
+    {
+      e.printStackTrace();
+      // Unfortunately, the connection pool manager manages to eat all actual 
connection setup errors.  This makes it very hard to figure anything out
+      // when something goes wrong.  So, we try again, going directly this 
time as a means of getting decent error feedback.
+      try
+      {
+        if (userName != null && userName.length() > 0)
+        {
+          DriverManager.getConnection(dburl, userName, password).close();
+        }
+        else
+        {
+          DriverManager.getConnection(dburl).close();
+        }
+      }
+      catch (java.sql.SQLException e2)
+      {
+        throw new ManifoldCFException("Error getting connection: 
"+e2.getMessage(),e2,ManifoldCFException.SETUP_ERROR);
+      }
+      // By definition, this must be a service interruption, because the 
direct route in setting up the connection succeeded.
+      long currentTime = System.currentTimeMillis();
+      throw new ServiceInterruption("Error getting connection: 
"+e.getMessage(),e,currentTime + 300000L,currentTime + 6 * 60 * 60000L,-1,true);
+    }
+    catch (java.lang.ClassNotFoundException e)
+    {
+      throw new ManifoldCFException("Driver class not found: 
"+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
+    }
+    catch (java.lang.InstantiationException e)
+    {
+      throw new ManifoldCFException("Driver class not instantiable: 
"+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
+    }
+    catch (java.lang.IllegalAccessException e)
+    {
+      throw new ManifoldCFException("Driver class not accessible: 
"+e.getMessage(),e,ManifoldCFException.SETUP_ERROR);
+    }
+  }
+
+  public static void releaseConnection(WrappedConnection c)
+  {
+    c.release();
+  }
+
+}
+

Propchange: 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConnectionFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConnectionFactory.java
------------------------------------------------------------------------------
    svn:keywords = Id

Copied: 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConstants.java
 (from r1537543, 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/JDBCConstants.java)
URL: 
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConstants.java?p2=manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConstants.java&p1=manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/JDBCConstants.java&r1=1537543&r2=1537982&rev=1537982&view=diff
==============================================================================
--- 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/jdbc/JDBCConstants.java
 (original)
+++ 
manifoldcf/trunk/connectors/jdbc/connector/src/main/java/org/apache/manifoldcf/jdbc/JDBCConstants.java
 Fri Nov  1 16:44:08 2013
@@ -16,7 +16,7 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
-package org.apache.manifoldcf.crawler.connectors.jdbc;
+package org.apache.manifoldcf.jdbc;
 
 /** These are the constant strings needed by the Oracle connector.
 */
@@ -54,6 +54,8 @@ public class JDBCConstants
   public static String dataReturnColumnName = "lcf__data";
   /** The name of the content type return column */
   public static String contentTypeReturnColumnName = "lcf__contenttype";
+  /** The name of the token return column */
+  public static String tokenReturnColumnName = "lcf__token";
   
   /** The name of the id return variable */
   public static String idReturnVariable = "IDCOLUMN";
@@ -71,6 +73,8 @@ public class JDBCConstants
   public static String endTimeVariable = "ENDTIME";
   /** The name of the id list */
   public static String idListVariable = "IDLIST";
+  /** The name of token return variable */
+  public static String tokenReturnVariable = "TOKENCOLUMN";
 
   /** JDBCAuthority */
   /** Query returning user Id parameter name */


Reply via email to