FileDocCategorySizeDatePackage
DataSourceObjectBuilder.javaAPI DocGlassfish v2 API11918Fri May 04 22:36:02 BST 2007com.sun.gjc.common

DataSourceObjectBuilder

public class DataSourceObjectBuilder extends Object implements Serializable
Utility class, which would create necessary Datasource object according to the specification.
version
1.0, 02/07/23
author
Binod P.G
see
com.sun.gjc.common.DataSourceSpec
see
com.sun.gjc.util.MethodExcecutor

Fields Summary
private DataSourceSpec
spec
private Hashtable
driverProperties
private com.sun.gjc.util.MethodExecutor
executor
private static Logger
_logger
private static boolean
jdbc40
private boolean
debug
private static final com.sun.enterprise.util.i18n.StringManager
sm
Constructors Summary
public DataSourceObjectBuilder(DataSourceSpec spec)
Construct a DataSource Object from the spec.

param
spec DataSourceSpec object.


                            
       
        this.spec = spec;
        executor = new MethodExecutor();
    
Methods Summary
public java.lang.ObjectconstructDataSourceObject()
Construct the DataSource Object from the spec.

return
Object constructed using the DataSourceSpec.
throws
ResourceException if the class is not found or some issue in executing some method.

        driverProperties = parseDriverProperties(spec);
        Object dataSourceObject = getDataSourceObject();
        Method[] methods = dataSourceObject.getClass().getMethods();
        for (int i = 0; i < methods.length; i++) {
            String methodName = methods[i].getName();
            //Check for driver properties first since some jdbc properties
            //may be supported in form of driver properties
            if (driverProperties.containsKey(methodName.toUpperCase())) {
                Vector values = (Vector) driverProperties.get(methodName.toUpperCase());
                executor.runMethod(methods[i], dataSourceObject, values);
            } else if (methodName.equalsIgnoreCase("setUser")) {
                executor.runJavaBeanMethod(spec.getDetail(DataSourceSpec.USERNAME), methods[i], dataSourceObject);

            } else if (methodName.equalsIgnoreCase("setPassword")) {
                executor.runJavaBeanMethod(spec.getDetail(DataSourceSpec.PASSWORD), methods[i], dataSourceObject);

            } else if (methodName.equalsIgnoreCase("setLoginTimeOut")) {
                executor.runJavaBeanMethod(spec.getDetail(DataSourceSpec.LOGINTIMEOUT), methods[i], dataSourceObject);

            } else if (methodName.equalsIgnoreCase("setLogWriter")) {
                executor.runJavaBeanMethod(spec.getDetail(DataSourceSpec.LOGWRITER), methods[i], dataSourceObject);

            } else if (methodName.equalsIgnoreCase("setDatabaseName")) {
                executor.runJavaBeanMethod(spec.getDetail(DataSourceSpec.DATABASENAME), methods[i], dataSourceObject);

            } else if (methodName.equalsIgnoreCase("setDataSourceName")) {
                executor.runJavaBeanMethod(spec.getDetail(DataSourceSpec.DATASOURCENAME), methods[i], dataSourceObject);

            } else if (methodName.equalsIgnoreCase("setDescription")) {
                executor.runJavaBeanMethod(spec.getDetail(DataSourceSpec.DESCRIPTION), methods[i], dataSourceObject);

            } else if (methodName.equalsIgnoreCase("setNetworkProtocol")) {
                executor.runJavaBeanMethod(spec.getDetail(DataSourceSpec.NETWORKPROTOCOL), methods[i], dataSourceObject);

            } else if (methodName.equalsIgnoreCase("setPortNumber")) {
                executor.runJavaBeanMethod(spec.getDetail(DataSourceSpec.PORTNUMBER), methods[i], dataSourceObject);

            } else if (methodName.equalsIgnoreCase("setRoleName")) {
                executor.runJavaBeanMethod(spec.getDetail(DataSourceSpec.ROLENAME), methods[i], dataSourceObject);

            } else if (methodName.equalsIgnoreCase("setServerName")) {
                executor.runJavaBeanMethod(spec.getDetail(DataSourceSpec.SERVERNAME), methods[i], dataSourceObject);

            } else if (methodName.equalsIgnoreCase("setMaxStatements")) {
                executor.runJavaBeanMethod(spec.getDetail(DataSourceSpec.MAXSTATEMENTS), methods[i], dataSourceObject);

            } else if (methodName.equalsIgnoreCase("setInitialPoolSize")) {
                executor.runJavaBeanMethod(spec.getDetail(DataSourceSpec.INITIALPOOLSIZE), methods[i], dataSourceObject);

            } else if (methodName.equalsIgnoreCase("setMinPoolSize")) {
                executor.runJavaBeanMethod(spec.getDetail(DataSourceSpec.MINPOOLSIZE), methods[i], dataSourceObject);

            } else if (methodName.equalsIgnoreCase("setMaxPoolSize")) {
                executor.runJavaBeanMethod(spec.getDetail(DataSourceSpec.MAXPOOLSIZE), methods[i], dataSourceObject);

            } else if (methodName.equalsIgnoreCase("setMaxIdleTime")) {
                executor.runJavaBeanMethod(spec.getDetail(DataSourceSpec.MAXIDLETIME), methods[i], dataSourceObject);

            } else if (methodName.equalsIgnoreCase("setPropertyCycle")) {
                executor.runJavaBeanMethod(spec.getDetail(DataSourceSpec.PROPERTYCYCLE), methods[i], dataSourceObject);

            }
        }
        return dataSourceObject;
    
private static booleandetectJDBC40()
Check whether the jdbc api version is 4.0 or not.

return
boolean

        boolean jdbc40 = false;
        try {
            Class.forName("java.sql.Wrapper");
            jdbc40 = true;
        } catch (ClassNotFoundException cnfe) {
            _logger.log(Level.FINEST, "could not find Wrapper(available in jdbc-40), jdk supports only jdbc-30");
        }
        return jdbc40;
      
private java.lang.ObjectgetDataSourceObject()
Creates a Datasource object according to the spec.

return
Initial DataSource Object instance.
throws
ResourceException If class name is wrong or classpath is not set properly.

        String className = spec.getDetail(DataSourceSpec.CLASSNAME);
        try {
            Class dataSourceClass = Thread.currentThread().getContextClassLoader().loadClass(className);
            Object dataSourceObject = dataSourceClass.newInstance();
            return dataSourceObject;
        } catch (ClassNotFoundException cnfe) {
            _logger.log(Level.SEVERE, "jdbc.exc_cnfe_ds", cnfe); 
            String msg = sm.getString("dsob.class_not_found", className);
            throw new ResourceException(msg);
        } catch (InstantiationException ce) {
            _logger.log(Level.SEVERE, "jdbc.exc_inst", className);
            String msg = sm.getString("dsob.error_instantiating", className);
            throw new ResourceException(msg);
        } catch (IllegalAccessException ce) {
            _logger.log(Level.SEVERE, "jdbc.exc_acc_inst", className);
            String msg = sm.getString("dsob.access_error", className);
            throw new ResourceException(msg);
        }
    
public static booleanisJDBC40()

        return jdbc40;
    
private java.util.HashtableparseDriverProperties(DataSourceSpec spec)
Get the extra driver properties from the DataSourceSpec object and parse them to a set of methodName and parameters. Prepare a hashtable containing these details and return.

param
spec DataSourceSpec object.
return
Hashtable containing method names and parameters,
throws
ResourceException If delimiter is not provided and property string is not null.

        String delim = spec.getDetail(DataSourceSpec.DELIMITER);

        String prop = spec.getDetail(DataSourceSpec.DRIVERPROPERTIES);
        if (prop == null || prop.trim().equals("")) {
            return new Hashtable();
        } else if (delim == null || delim.equals("")) {
            String msg = sm.getString("dsob.delim_not_specified");
            throw new ResourceException(msg);
        }

        Hashtable properties = new Hashtable();
        delim = delim.trim();
        String sep = delim + delim;
        int sepLen = sep.length();
        String cache = prop;
        Vector methods = new Vector();

        while (cache.indexOf(sep) != -1) {
            int index = cache.indexOf(sep);
            String name = cache.substring(0, index);
            if (!name.trim().equals("")) {
                methods.add(name);
                cache = cache.substring(index + sepLen);
            }
        }

        Enumeration allMethods = methods.elements();
        while (allMethods.hasMoreElements()) {
            String oneMethod = (String) allMethods.nextElement();
            if (!oneMethod.trim().equals("")) {
                String methodName = null;
                Vector parms = new Vector();
                StringTokenizer methodDetails = new StringTokenizer(oneMethod, delim);
                for (int i = 0; methodDetails.hasMoreTokens(); i++) {
                    String token = (String) methodDetails.nextToken();
                    if (i == 0) {
                        methodName = token.toUpperCase();
                    } else {
                        parms.add(token);
                    }
                }
                properties.put(methodName, parms);
            }
        }
        return properties;