[Jboss-cvs] JBossAS SVN: r56239 - in branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc: . support
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Fri Aug 25 03:33:16 EDT 2006
Author: weston.price at jboss.com
Date: 2006-08-25 03:33:13 -0400 (Fri, 25 Aug 2006)
New Revision: 56239
Added:
branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/support/
branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/support/JdbcExternalCodeHandler.java
branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/support/JdbcSupportCodeDocumentLoader.java
branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/support/JdbcSupportCodeDocumentLoaderException.java
branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/support/JdbcSupportCodeHandler.java
branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/support/JdbcSupportCodeLoader.java
Log:
[JBAS-3453] StaleConnection and PoolPurge policy implementation.
Copied: branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/support/JdbcExternalCodeHandler.java (from rev 56237, branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/JdbcExternalCodeHandler.java)
===================================================================
--- branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/JdbcExternalCodeHandler.java 2006-08-25 04:16:31 UTC (rev 56237)
+++ branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/support/JdbcExternalCodeHandler.java 2006-08-25 07:33:13 UTC (rev 56239)
@@ -0,0 +1,153 @@
+package org.jboss.resource.adapter.jdbc.support;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.jboss.logging.Logger;
+import org.jboss.resource.adapter.jdbc.ExceptionSorter;
+import org.jboss.resource.adapter.jdbc.StaleConnectionChecker;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class JdbcExternalCodeHandler implements ExceptionSorter, StaleConnectionChecker
+{
+ private static final Logger logger = Logger.getLogger(JdbcExternalCodeHandler.class);
+ private final boolean trace = logger.isTraceEnabled();
+
+ private static final String STALE_CODE_ELEMENT = "stale-code";
+ private static final String FATAL_CODE_ELEMENT = "fatal-code";
+
+ private List staleCodes = new ArrayList();
+
+ private List fatalCodes = new ArrayList();
+
+ public boolean hasStaleCodes()
+ {
+ return (staleCodes != null && staleCodes.size() > 0);
+
+ }
+
+ public boolean hasFatalCodes()
+ {
+ return (fatalCodes != null && fatalCodes.size() > 0);
+
+ }
+
+ public JdbcExternalCodeHandler(final Document doc)
+ {
+ NodeList stale = doc.getElementsByTagName(STALE_CODE_ELEMENT);
+
+ for (int i = 0; i < stale.getLength(); i++)
+ {
+ Node staleNode = (Element) stale.item(i);
+ String content = staleNode.getTextContent();
+ Integer code;
+
+ try
+ {
+
+ code = Integer.valueOf(content);
+ staleCodes.add(code);
+
+ }
+ catch (NumberFormatException e)
+ {
+ if (trace)
+ {
+ logger.trace("Stale error code with value " + content + " could not be parsed", e);
+
+ }
+ }
+
+ }
+
+ NodeList fatal = doc.getElementsByTagName(FATAL_CODE_ELEMENT);
+
+ for (int i = 0; i < fatal.getLength(); i++)
+ {
+ Node fatalNode = (Element) stale.item(i);
+ String content = fatalNode.getTextContent();
+ try
+ {
+
+ Integer code = Integer.valueOf(content);
+ fatalCodes.add(code);
+
+ }
+ catch (NumberFormatException e)
+ {
+
+ logger.trace("Fatal error code with value " + content + " could not be parsed", e);
+
+ }
+
+ }
+ }
+
+ public JdbcExternalCodeHandler(List staleList, List fatalList)
+ {
+ this.staleCodes = staleList;
+ this.fatalCodes = fatalList;
+ }
+
+ public void setStaleCodes(List staleCodes)
+ {
+ this.staleCodes = staleCodes;
+ }
+
+ public void setFatalCodes(List fatalCodes)
+ {
+ this.fatalCodes = fatalCodes;
+ }
+
+ public boolean isExceptionFatal(SQLException e)
+ {
+ int fatalCode = e.getErrorCode();
+ return fatalCodes.contains(Integer.valueOf(fatalCode));
+ }
+
+ public boolean isStaleConnection(SQLException e)
+ {
+ int staleCode = e.getErrorCode();
+ return staleCodes.contains(Integer.valueOf(staleCode));
+
+ }
+
+ public int getFatalCodeCount()
+ {
+ return fatalCodes.size();
+ }
+
+ public int getStaleCodeCount()
+ {
+ return staleCodes.size();
+
+ }
+
+ public String toString()
+ {
+ StringBuffer codeBuff = new StringBuffer();
+
+ codeBuff.append("Jdbc External Support Codes: \n");
+ codeBuff.append("StaleConnectionCodes: \n");
+
+ for (Iterator iter = staleCodes.iterator(); iter.hasNext();)
+ {
+ Integer staleCode = (Integer) iter.next();
+ codeBuff.append("Code: " + staleCode + "\n");
+ }
+
+ for (Iterator iter = fatalCodes.iterator(); iter.hasNext();)
+ {
+ Integer staleCode = (Integer) iter.next();
+ codeBuff.append("Code: " + staleCode + "\n");
+ }
+
+ codeBuff.append("\n\n");
+ return codeBuff.toString();
+ }
+}
Copied: branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/support/JdbcSupportCodeDocumentLoader.java (from rev 56237, branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/JdbcSupportCodeDocumentLoader.java)
===================================================================
--- branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/JdbcSupportCodeDocumentLoader.java 2006-08-25 04:16:31 UTC (rev 56237)
+++ branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/support/JdbcSupportCodeDocumentLoader.java 2006-08-25 07:33:13 UTC (rev 56239)
@@ -0,0 +1,128 @@
+package org.jboss.resource.adapter.jdbc.support;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.jboss.logging.Logger;
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+public class JdbcSupportCodeDocumentLoader
+{
+ private static final Logger logger = Logger.getLogger(JdbcSupportCodeDocumentLoader.class);
+
+ public static Document loadDocument(final String fileName) throws JdbcSupportCodeDocumentLoaderException
+ {
+
+ logger.debug("Attempting to locate external code file from url" + fileName);
+
+ File f = new File(fileName);
+
+ if(!f.exists())
+ {
+
+ return loadDocumentFromClassPathResource(fileName);
+ }
+
+ else
+ {
+ return loadDocument(f);
+
+ }
+
+
+ }
+
+ public static Document loadDocument(final File file) throws JdbcSupportCodeDocumentLoaderException
+ {
+ try
+ {
+ InputSource source = new InputSource(new FileReader(file));
+ return loadDocument(source);
+
+ } catch (FileNotFoundException e) {
+
+ logger.error("Error loading JdbcSupportCode file from external source " + file.getAbsolutePath(), e);
+ throw new JdbcSupportCodeDocumentLoaderException(e.getMessage(), e);
+
+ }
+
+ }
+
+ public static Document loadDocumentFromClassPathResource(final String fileName) throws JdbcSupportCodeDocumentLoaderException
+ {
+ InputStream is = null;
+ InputSource source = null;
+
+ logger.debug("Attempting to locate external code file" + fileName + " from classpath.");
+
+ is = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
+
+ try
+ {
+ if(is != null)
+ {
+ source = new InputSource(is);
+
+ }else
+ {
+ throw new JdbcSupportCodeDocumentLoaderException("Error loading JdbcSupportCode file from externalSource.");
+
+ }
+
+ return loadDocument(source);
+
+ }
+
+ finally
+ {
+ if(is != null)
+ {
+ try
+ {
+ is.close();
+
+ } catch (IOException ignore)
+ {
+ }
+ }
+ }
+
+ }
+
+ private static Document loadDocument(final InputSource source) throws JdbcSupportCodeDocumentLoaderException
+ {
+
+ try {
+
+ DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+ Document doc = builder.parse(source);
+ return doc;
+
+ } catch (ParserConfigurationException e) {
+
+ logger.error("Error parsing JdbcSupportCode resource ", e);
+ throw new JdbcSupportCodeDocumentLoaderException(e.getMessage(), e);
+
+
+ } catch (SAXException e) {
+
+ logger.error("Error parsing JdbcSupportCode resource ", e);
+ throw new JdbcSupportCodeDocumentLoaderException(e.getMessage(), e);
+
+ } catch (IOException e) {
+
+ logger.error("Error parsing JdbcSupportCode resource ", e);
+ throw new JdbcSupportCodeDocumentLoaderException(e.getMessage(), e);
+ }
+
+ }
+}
Copied: branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/support/JdbcSupportCodeDocumentLoaderException.java (from rev 56237, branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/JdbcSupportCodeDocumentLoaderException.java)
===================================================================
--- branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/JdbcSupportCodeDocumentLoaderException.java 2006-08-25 04:16:31 UTC (rev 56237)
+++ branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/support/JdbcSupportCodeDocumentLoaderException.java 2006-08-25 07:33:13 UTC (rev 56239)
@@ -0,0 +1,33 @@
+package org.jboss.resource.adapter.jdbc.support;
+
+/**
+ * A JdbcSupportCodeDocumentLoaderException.
+ *
+ * @author <a href="weston.price at jboss.com">Weston Price</a>
+ * @version $Revision: 1.1 $
+ */
+public class JdbcSupportCodeDocumentLoaderException extends Exception
+{
+
+ private static final long serialVersionUID = -6263968193990175525L;
+
+ public JdbcSupportCodeDocumentLoaderException()
+ {
+ }
+
+ public JdbcSupportCodeDocumentLoaderException(String message)
+ {
+ super(message);
+ }
+
+ public JdbcSupportCodeDocumentLoaderException(Throwable t)
+ {
+ super(t);
+ }
+
+ public JdbcSupportCodeDocumentLoaderException(String message, Throwable t)
+ {
+ super(message, t);
+ }
+
+}
Copied: branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/support/JdbcSupportCodeHandler.java (from rev 56237, branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/JdbcSupportCodeHandler.java)
===================================================================
--- branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/JdbcSupportCodeHandler.java 2006-08-25 04:16:31 UTC (rev 56237)
+++ branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/support/JdbcSupportCodeHandler.java 2006-08-25 07:33:13 UTC (rev 56239)
@@ -0,0 +1,124 @@
+package org.jboss.resource.adapter.jdbc.support;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import org.jboss.logging.Logger;
+import org.jboss.resource.adapter.jdbc.ExceptionSorter;
+import org.jboss.resource.adapter.jdbc.StaleConnectionChecker;
+import org.jboss.resource.adapter.jdbc.ValidConnectionChecker;
+
+/**
+ * A JdbcSupportCodeHandler.
+ *
+ * @author <a href="weston.price at jboss.com">Weston Price</a>
+ * @version $Revision: 1.1 $
+ */
+public class JdbcSupportCodeHandler implements StaleConnectionChecker, ExceptionSorter, ValidConnectionChecker
+{
+
+ private static final Logger log = Logger.getLogger(JdbcSupportCodeHandler.class);
+
+ private ExceptionSorter exceptionSorter;
+
+ private ValidConnectionChecker connectionChecker;
+
+ private JdbcExternalCodeHandler externalCodeHandler;
+
+ private JdbcSupportCodeHandler(JdbcExternalCodeHandler ext, ValidConnectionChecker valid, ExceptionSorter sorter)
+ {
+ this.externalCodeHandler = ext;
+ this.connectionChecker = valid;
+ this.exceptionSorter = sorter;
+
+ }
+
+ public void reloadExternalSupportCodes(final String supportCodeUrl)
+ {
+
+ this.externalCodeHandler = null;
+ this.externalCodeHandler = JdbcSupportCodeLoader.loadExternalCodeHandler(supportCodeUrl);
+
+ }
+
+ public static JdbcSupportCodeHandler getInstance(String supportCodeUrl, String exceptionSorterClassName,
+ String validConnectionCheckerClassName, String validConnectionSql)
+ {
+
+ JdbcExternalCodeHandler ext = JdbcSupportCodeLoader.loadExternalCodeHandler(supportCodeUrl);
+ ValidConnectionChecker valid = JdbcSupportCodeLoader.loadValidConnectionChecker(validConnectionCheckerClassName,
+ validConnectionSql);
+ ExceptionSorter sorter = JdbcSupportCodeLoader.loadExceptionSorter(exceptionSorterClassName);
+
+ return new JdbcSupportCodeHandler(ext, valid, sorter);
+
+ }
+
+ public boolean isStaleConnection(SQLException e)
+ {
+
+ log.trace("Checking for stale connection for" + e.getErrorCode() + " code. SQL state is " + e.getSQLState());
+
+ boolean isStale = false;
+
+ if (externalCodeHandler != null && externalCodeHandler.hasStaleCodes())
+ {
+ isStale = externalCodeHandler.isStaleConnection(e);
+
+ }
+
+ return isStale;
+ }
+
+ public boolean isExceptionFatal(SQLException e)
+ {
+
+ log.trace("Checking for fatal connection for" + e.getErrorCode() + " code. SQL state is " + e.getSQLState());
+
+ boolean isFatal = false;
+
+ /*
+ * This should cover the strange condition where the client uses an external code
+ * file with no fatal codes, as well as an explicit Exception sorter in the *-ds.xml
+ * file.
+ */
+ if (externalCodeHandler != null && externalCodeHandler.hasFatalCodes())
+ {
+ isFatal = externalCodeHandler.isExceptionFatal(e);
+
+ }
+ else if (exceptionSorter != null)
+ {
+ isFatal = exceptionSorter.isExceptionFatal(e);
+
+ }
+
+ return isFatal;
+ }
+
+ public SQLException isValidConnection(Connection c)
+ {
+ SQLException sqe = null;
+
+ if (connectionChecker != null)
+ {
+ sqe = connectionChecker.isValidConnection(c);
+
+ }
+
+ return sqe;
+ }
+
+ public int getStaleCodeCount()
+ {
+ return externalCodeHandler != null ? externalCodeHandler.getStaleCodeCount() : 0;
+
+ }
+
+ public int getFatalCodeCount()
+ {
+ return externalCodeHandler != null ? externalCodeHandler.getFatalCodeCount() : 0;
+
+ }
+
+}
Added: branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/support/JdbcSupportCodeLoader.java
===================================================================
--- branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/support/JdbcSupportCodeLoader.java 2006-08-25 07:32:51 UTC (rev 56238)
+++ branches/JBoss_4_0_3_SP1_JBAS_3453/connector/src/main/org/jboss/resource/adapter/jdbc/support/JdbcSupportCodeLoader.java 2006-08-25 07:33:13 UTC (rev 56239)
@@ -0,0 +1,97 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+
+package org.jboss.resource.adapter.jdbc.support;
+
+import org.jboss.logging.Logger;
+import org.jboss.resource.adapter.jdbc.CheckValidConnectionSQL;
+import org.jboss.resource.adapter.jdbc.ExceptionSorter;
+import org.jboss.resource.adapter.jdbc.NullExceptionSorter;
+import org.jboss.resource.adapter.jdbc.NullValidConnectionChecker;
+import org.jboss.resource.adapter.jdbc.ValidConnectionChecker;
+import org.w3c.dom.Document;
+
+public class JdbcSupportCodeLoader
+{
+ private static final Logger logger = Logger.getLogger(JdbcSupportCodeLoader.class);
+
+ public static JdbcExternalCodeHandler loadExternalCodeHandler(final String fileName)
+ {
+ JdbcExternalCodeHandler extHandler = null;
+
+ try {
+
+ if(fileName != null && !fileName.equalsIgnoreCase(""))
+ {
+ Document doc = JdbcSupportCodeDocumentLoader.loadDocument(fileName);
+ extHandler = new JdbcExternalCodeHandler(doc);
+
+ }
+
+ } catch (JdbcSupportCodeDocumentLoaderException e)
+ {
+ logger.error("Document for external support codes could not be loaded.", e);
+
+ }
+
+ return extHandler;
+
+ }
+
+ public static ValidConnectionChecker loadValidConnectionChecker(final String validConnectionCheckerClassName, final String validConnectionSql)
+ {
+ ValidConnectionChecker connectionChecker = null;
+
+ if (validConnectionCheckerClassName != null)
+ {
+ try
+ {
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ Class clazz = cl.loadClass(validConnectionCheckerClassName);
+ connectionChecker = (ValidConnectionChecker) clazz.newInstance();
+
+ }
+ catch (Exception e)
+ {
+ logger.warn("Exception trying to create connection checker (disabling):", e);
+ connectionChecker = new NullValidConnectionChecker();
+ }
+ }
+
+ if (validConnectionSql != null)
+ {
+ connectionChecker = new CheckValidConnectionSQL(validConnectionSql);
+ }
+
+ return connectionChecker;
+
+ }
+
+ public static ExceptionSorter loadExceptionSorter(final String exceptionSorterClassName)
+ {
+ ExceptionSorter exceptionSorter = null;
+
+ if (exceptionSorterClassName != null)
+ {
+ try
+ {
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ Class clazz = cl.loadClass(exceptionSorterClassName);
+ exceptionSorter = (ExceptionSorter)clazz.newInstance();
+ }
+ catch (Exception e2)
+ {
+ logger.warn("exception trying to create exception sorter (disabling):", e2);
+ exceptionSorter = new NullExceptionSorter();
+ }
+ }
+
+ return exceptionSorter;
+ }
+
+
+}
More information about the jboss-cvs-commits
mailing list