001: /*
002: Copyright (C) 2002-2007 MySQL AB
003:
004: This program is free software; you can redistribute it and/or modify
005: it under the terms of version 2 of the GNU General Public License as
006: published by the Free Software Foundation.
007:
008: There are special exceptions to the terms and conditions of the GPL
009: as it is applied to this software. View the full text of the
010: exception in file EXCEPTIONS-CONNECTOR-J in the directory of this
011: software distribution.
012:
013: This program is distributed in the hope that it will be useful,
014: but WITHOUT ANY WARRANTY; without even the implied warranty of
015: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
016: GNU General Public License for more details.
017:
018: You should have received a copy of the GNU General Public License
019: along with this program; if not, write to the Free Software
020: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
021:
022:
023:
024: */
025: package com.mysql.jdbc.jdbc2.optional;
026:
027: import java.util.Hashtable;
028:
029: import javax.naming.Context;
030: import javax.naming.Name;
031: import javax.naming.RefAddr;
032: import javax.naming.Reference;
033: import javax.naming.spi.ObjectFactory;
034:
035: import com.mysql.jdbc.NonRegisteringDriver;
036:
037: /**
038: * Factory class for MysqlDataSource objects
039: *
040: * @author Mark Matthews
041: */
042: public class MysqlDataSourceFactory implements ObjectFactory {
043: /**
044: * The class name for a standard MySQL DataSource.
045: */
046: protected final static String DATA_SOURCE_CLASS_NAME = "com.mysql.jdbc.jdbc2.optional.MysqlDataSource";
047:
048: /**
049: * The class name for a poolable MySQL DataSource.
050: */
051: protected final static String POOL_DATA_SOURCE_CLASS_NAME = "com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource";
052:
053: /**
054: * The class name for a MysqlXADataSource
055: */
056:
057: protected final static String XA_DATA_SOURCE_CLASS_NAME = "com.mysql.jdbc.jdbc2.optional.MysqlXADataSource";
058:
059: /**
060: * DOCUMENT ME!
061: *
062: * @param refObj
063: * DOCUMENT ME!
064: * @param nm
065: * DOCUMENT ME!
066: * @param ctx
067: * DOCUMENT ME!
068: * @param env
069: * DOCUMENT ME!
070: * @return DOCUMENT ME!
071: * @throws Exception
072: * DOCUMENT ME!
073: */
074: public Object getObjectInstance(Object refObj, Name nm,
075: Context ctx, Hashtable env) throws Exception {
076: Reference ref = (Reference) refObj;
077: String className = ref.getClassName();
078:
079: if ((className != null)
080: && (className.equals(DATA_SOURCE_CLASS_NAME)
081: || className
082: .equals(POOL_DATA_SOURCE_CLASS_NAME) || className
083: .equals(XA_DATA_SOURCE_CLASS_NAME))) {
084: MysqlDataSource dataSource = null;
085:
086: try {
087: dataSource = (MysqlDataSource) Class.forName(className)
088: .newInstance();
089: } catch (Exception ex) {
090: throw new RuntimeException(
091: "Unable to create DataSource of " + "class '"
092: + className + "', reason: "
093: + ex.toString());
094: }
095:
096: int portNumber = 3306;
097:
098: String portNumberAsString = nullSafeRefAddrStringGet(
099: "port", ref);
100:
101: if (portNumberAsString != null) {
102: portNumber = Integer.parseInt(portNumberAsString);
103: }
104:
105: dataSource.setPort(portNumber);
106:
107: String user = nullSafeRefAddrStringGet(
108: NonRegisteringDriver.USER_PROPERTY_KEY, ref);
109:
110: if (user != null) {
111: dataSource.setUser(user);
112: }
113:
114: String password = nullSafeRefAddrStringGet(
115: NonRegisteringDriver.PASSWORD_PROPERTY_KEY, ref);
116:
117: if (password != null) {
118: dataSource.setPassword(password);
119: }
120:
121: String serverName = nullSafeRefAddrStringGet("serverName",
122: ref);
123:
124: if (serverName != null) {
125: dataSource.setServerName(serverName);
126: }
127:
128: String databaseName = nullSafeRefAddrStringGet(
129: "databaseName", ref);
130:
131: if (databaseName != null) {
132: dataSource.setDatabaseName(databaseName);
133: }
134:
135: String explicitUrlAsString = nullSafeRefAddrStringGet(
136: "explicitUrl", ref);
137:
138: if (explicitUrlAsString != null) {
139: if (Boolean.valueOf(explicitUrlAsString).booleanValue()) {
140: dataSource.setUrl(nullSafeRefAddrStringGet("url",
141: ref));
142: }
143: }
144:
145: dataSource.setPropertiesViaRef(ref);
146:
147: return dataSource;
148: }
149:
150: // We can't create an instance of the reference
151: return null;
152: }
153:
154: private String nullSafeRefAddrStringGet(String referenceName,
155: Reference ref) {
156: RefAddr refAddr = ref.get(referenceName);
157:
158: String asString = refAddr != null ? (String) refAddr
159: .getContent() : null;
160:
161: return asString;
162: }
163: }
|