[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