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 (> V6.5)</option>\n"
- + " <option value=\"jtds:sybase:\" " +
(lJdbcProvider.equals("jtds:sybase:") ? "selected=\"selected\"" : "") +
">Sybase (>= V10)</option>\n"
- + " <option value=\"mysql:\" " +
(lJdbcProvider.equals("mysql:") ? "selected=\"selected\"" : "") + ">MySQL
(>= 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 (> V6.5)</option>\n"+
+" <option value=\"jtds:sybase:\" " +
(lJdbcProvider.equals("jtds:sybase:") ? "selected=\"selected\"" : "") +
">Sybase (>= V10)</option>\n"+
+" <option value=\"mysql:\" " + (lJdbcProvider.equals("mysql:") ?
"selected=\"selected\"" : "") + ">MySQL (>= 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 */