You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by ar...@apache.org on 2006/08/03 13:36:23 UTC

svn commit: r428359 - /db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformFactory.java

Author: arminw
Date: Thu Aug  3 04:36:23 2006
New Revision: 428359

URL: http://svn.apache.org/viewvc?rev=428359&view=rev
Log:
fix OJB-108, make Platform class instantiation more tolerant against platform token. Allow full qualified custom Platform names.

Modified:
    db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformFactory.java

Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformFactory.java
URL: http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformFactory.java?rev=428359&r1=428358&r2=428359&view=diff
==============================================================================
--- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformFactory.java (original)
+++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/platforms/PlatformFactory.java Thu Aug  3 04:36:23 2006
@@ -15,55 +15,154 @@
  * limitations under the License.
  */
 
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.SystemUtils;
+import org.apache.ojb.broker.OJBRuntimeException;
 import org.apache.ojb.broker.metadata.JdbcConnectionDescriptor;
-import org.apache.ojb.broker.util.logging.LoggerFactory;
 import org.apache.ojb.broker.util.ClassHelper;
-
-import java.util.HashMap;
+import org.apache.ojb.broker.util.logging.Logger;
+import org.apache.ojb.broker.util.logging.LoggerFactory;
 
 /**
- * this factory class is responsible to create Platform objects that
+ * This factory class is responsible to create Platform objects that
  * define RDBMS platform specific behaviour.
- * @version 	1.0
- * @author		Thomas Mahler
+ *
+ * @version $Id: $
  */
 public class PlatformFactory
 {
+    private static Logger log = LoggerFactory.getLogger(PlatformFactory.class);
+
+    private static Map names = new HashMap();
     private static HashMap platforms = new HashMap();
 
+    static
+    {
+        // comment out the correct typed mappings (with correct upper
+        // and lower case, the first letter will always transformed to upper case)
+        // , because these mappings will be automatically resolved
+        //
+        //names.put("db2", "Db2");
+        //names.put("default", "Default");
+        //names.put("derby", "Derby");
+        //names.put("firebird", "Firebird");
+        //names.put("hsqldb", "Hsqldb");
+        names.put("hsql", "Hsqldb");
+        //names.put("informix", "Informix");
+        names.put("maxdb", "MaxDB");
+        names.put("msaccess", "MsAccess");
+        names.put("mssql", "MsSQLServer");
+        names.put("mssqlserver", "MsSQLServer");
+        names.put("mysql", "MySQL");
+        names.put("oracle", "Oracle");
+        names.put("oracle9i", "Oracle9i");
+        names.put("postgre", "PostgreSQL");
+        names.put("postgresql", "PostgreSQL");
+        names.put("sapdb", "Sapdb");
+        names.put("sybase", "Sybase");
+        names.put("sybaseasa", "SybaseASA");
+        names.put("sybasease", "SybaseASE");
+    }
+
     /**
      * returns the Platform matching to the JdbcConnectionDescriptor jcd.
      * The method jcd.getDbms(...) is used to determine the Name of the
      * platform.
      * BRJ : cache platforms
+     *
      * @param jcd the JdbcConnectionDescriptor defining the platform
      */
     public static Platform getPlatformFor(JdbcConnectionDescriptor jcd)
     {
         String dbms = jcd.getDbms();
-        Platform result = null;
-        String platformName = null;
+        if(dbms == null)
+        {
+            throw new NullPointerException("The Platform is not specified. " + jcd);
+        }
+        Platform result = (Platform) platforms.get(dbms);
+        if(result == null)
+        {
+            result = resolvePlatform(dbms);
+            if(log.isEnabledFor(Logger.INFO))
+            {
+                log.info("Resolve platform class for name '" + dbms + "', Platform instance: " + result);
+            }
+            platforms.put(dbms, result); // cache the Platform
+        }
+        return result;
+    }
 
-        result = (Platform) getPlatforms().get(dbms);
-        if (result == null)
+    private static Platform resolvePlatform(final String platformName)
+    {
+        Platform result = null;
+        String name = null;
+        try
+        {
+            name = createClassName(platformName);
+            result = instantiatePlatform(name);
+        }
+        catch(ClassNotFoundException e)
+        {
+            // ignore
+        }
+        if(result == null)
         {
             try
             {
-                platformName = getClassnameFor(dbms);
-                Class platformClass = ClassHelper.getClass(platformName);
-                result = (Platform) platformClass.newInstance();
-
+                result = instantiatePlatform(platformName);
             }
-            catch (Throwable t)
+            catch(ClassNotFoundException e)
             {
-                LoggerFactory.getDefaultLogger().warn(
-                        "[PlatformFactory] problems with platform " + platformName, t);
-                LoggerFactory.getDefaultLogger().warn(
-                        "[PlatformFactory] OJB will use PlatformDefaultImpl instead");
-
-                result = new PlatformDefaultImpl();
+                // ignore
             }
-            getPlatforms().put(dbms, result); // cache the Platform
+        }
+        if(result == null)
+        {
+            try
+            {
+                String str = (String) names.get(platformName.toLowerCase());
+                if(str != null)
+                {
+                    String resolvedName = createClassName(str);
+                    result = instantiatePlatform(resolvedName);
+                    log.warn("The correct Platform token is '" + str
+                            + "' instead of the specified '" + platformName + "'");
+                }
+            }
+            catch(ClassNotFoundException e)
+            {
+                // ignore
+            }
+        }
+        if(result == null)
+        {
+            String eol = SystemUtils.LINE_SEPARATOR;
+            String msg = eol + "Can't resolve Platform class based on specified name and internal created names:" + eol
+                    + "    Attempt 1: " + platformName + " ---> class not found!" + eol
+                    + "    Attempt 2: " + name + " ---> class not found!"
+                    + eol + "!!Please check the specified Platform token or full qualified Platform class name!!";
+            throw new OJBRuntimeException(msg);
+        }
+        return result;
+    }
+
+    private static Platform instantiatePlatform(String name) throws ClassNotFoundException
+    {
+        Platform result;
+        try
+        {
+            result = (Platform) ClassHelper.newInstance(name);
+        }
+        catch(InstantiationException e)
+        {
+            throw new OJBRuntimeException("Platform class " + name + " exists, but can't be instantiated", e);
+        }
+        catch(IllegalAccessException e)
+        {
+            throw new OJBRuntimeException("Platform class " + name + " exists, but access isn't allowed", e);
         }
         return result;
     }
@@ -71,24 +170,40 @@
     /**
      * compute the name of the concrete Class representing the Platform
      * specified by <code>platform</code>
+     *
      * @param platform the name of the platform as specified in the repository
      */
-    private static String getClassnameFor(String platform)
+    private static String createClassName(String platform)
     {
-        String pf = "Default";
-        if (platform != null)
+        String pf;
+        if(StringUtils.isNotBlank(platform))
         {
             pf = platform;
         }
-        return "org.apache.ojb.broker.platforms.Platform" + pf.substring(0, 1).toUpperCase() + pf.substring(1) + "Impl";
+        else
+        {
+            log.error("Platform class not specified, please set a correct Platform token or " +
+                    "the full Platform class name");
+            throw new OJBRuntimeException("Platform class not specified!");
+        }
+        return Platform.class.getName() + pf.substring(0, 1).toUpperCase() + pf.substring(1) + "Impl";
     }
 
-    /**
-     * Gets the platforms.
-     * @return Returns a HashMap
-     */
-    private static HashMap getPlatforms()
-    {
-        return platforms;
-    }
+// for internal testing
+//    public static void main(String[] args)
+//    {
+//        Iterator it = names.values().iterator();
+//        while(it.hasNext())
+//        {
+//            String name =  (String) it.next();
+//            try
+//            {
+//                System.out.println("Platform: " + instantiatePlatform(createClassName(name)));
+//            }
+//            catch(ClassNotFoundException e)
+//            {
+//                System.err.println("### INCORRECT NAME: " + name);
+//            }
+//        }
+//    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org