001: /*
002: * $Id: TypeFactory.java,v 1.6 2004/09/25 23:00:00 spal Exp $
003: * $Source: /cvsroot/sqlunit/sqlunit/src/net/sourceforge/sqlunit/TypeFactory.java,v $
004: * SQLUnit - a test harness for unit testing database stored procedures.
005: * Copyright (C) 2003 The SQLUnit Team
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License
009: * as published by the Free Software Foundation; either version 2
010: * of the License, or (at your option) any later version.
011: *
012: * This program is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
015: * GNU General Public License for more details.
016: *
017: * You should have received a copy of the GNU General Public License
018: * along with this program; if not, write to the Free Software
019: * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
020: */
021: package net.sourceforge.sqlunit;
022:
023: import org.apache.log4j.Logger;
024:
025: /**
026: * Factory for generating concrete implementations of IType.
027: * @author Ralph Brendler (rbrendler@users.sourceforge.net)
028: * @author Sujit Pal (spal@users.sourceforge.net)
029: * @version $Revision: 1.6 $
030: */
031: public final class TypeFactory {
032:
033: private static final Logger LOG = Logger
034: .getLogger(TypeFactory.class);
035:
036: /**
037: * Private Constructor. Cannot be instantiated.
038: */
039: private TypeFactory() {
040: // private constructor, cannot instantiate.
041: }
042:
043: /**
044: * Given an XML type name, instantiates and returns a partially
045: * populated IType object of the specified type.
046: * @param name the XML name for the type. The database server name is
047: * implicitly provided by looking up the metadata for the current
048: * Connection. If there is no match, then the type name without the
049: * server-name (ie server non-specific type) is looked up.
050: * @return a partially populated IType object of the named type.
051: * @exception SQLUnitException if there was a problem.
052: */
053: public static IType getInstance(final String name)
054: throws SQLUnitException {
055: LOG.debug(">> getInstance(" + name + ")");
056: if (name == null) {
057: throw new SQLUnitException(IErrorCodes.UNDEFINED_TYPE,
058: new String[] { "NULL" });
059: }
060: try {
061: // try to find the type mapping specific to this database first
062: // to get any types that have been overriden
063: String typeName = name;
064: String typeClass = null;
065: if (name.indexOf(".") > -1) {
066: // server-name already supplied
067: LOG.debug("Looking up " + typeName);
068: typeClass = TypeMapper.findClassByName(typeName);
069: if (typeClass == null) {
070: throw new SQLUnitException(
071: IErrorCodes.UNDEFINED_TYPE,
072: new String[] { typeName });
073: }
074: } else {
075: // find the server-name
076: String serverName = ConnectionRegistry.getServerName();
077: typeName = serverName + "." + name;
078: LOG.debug("Looking up " + typeName);
079: typeClass = TypeMapper.findClassByName(typeName);
080: LOG.debug("found a typeClass: " + typeClass);
081: if (typeClass == null) {
082: // no server specific type found, fallback to standard type
083: typeName = name;
084: LOG.debug("Falling back on basic type lookup for "
085: + typeName);
086: typeClass = TypeMapper.findClassByName(typeName);
087: }
088: if (typeClass == null) {
089: throw new SQLUnitException(
090: IErrorCodes.UNDEFINED_TYPE,
091: new String[] { name });
092: }
093: }
094: LOG.debug("Instantiating a " + typeClass);
095: IType type = (IType) Class.forName(typeClass).newInstance();
096: type.setName(typeName);
097: type.setId(TypeMapper.findIdByName(typeName));
098: return type;
099: } catch (SQLUnitException e) {
100: throw e;
101: } catch (Exception e) {
102: throw new SQLUnitException(IErrorCodes.GENERIC_ERROR,
103: new String[] { "System", e.getClass().getName(),
104: e.getMessage() }, e);
105: }
106: }
107:
108: /**
109: * Given an SQL Type Id, instantiates and returns a partially populated
110: * IType object of the specified type.
111: * @param typeId an integer that exists in one of the SQLUnit type
112: * mapping properties files.
113: * @return an IType object of the specified type.
114: * @exception SQLUnitException if there was a problem.
115: */
116: public static IType getInstance(final int typeId)
117: throws SQLUnitException {
118: String name = TypeMapper.findNameById(typeId);
119: if (name == null) {
120: throw new SQLUnitException(IErrorCodes.UNDEFINED_TYPE,
121: new String[] { (new Integer(typeId)).toString() });
122: }
123: return getInstance(name);
124: }
125: }
|