001 package hep.aida.ref.sql;
002
003 // Log4J
004 import org.apache.log4j.Logger;
005
006 // Java
007 import java.util.Properties;
008
009 /** <code>Type</code> manages information about SQL database implementations.
010 * It handles their protocol names, driver Class name and various capabilities.
011 * The features are read from {@link Properties} resource
012 * searched in:
013 * <ol>
014 * <li><code>Implementation.properties</code></li>
015 * <li><code>hep/aida/ref/sql/Implementation.properties</code></li>
016 * </ol>
017 * @see Type Type for list of supported Types.
018 * <p><font color="#880088">
019 * <pre>
020 * $Log: Implementation.java,v $
021 * Revision 1.32 2007/06/11 14:02:29 hrivnac
022 * better support for tags in Oracle
023 *
024 * Revision 1.31 2007/05/23 16:38:44 hrivnac
025 * logical connections for Plotter; better UML
026 *
027 * Revision 1.30 2007/05/22 23:33:20 hrivnac
028 * Plotter uses real arguments parsing
029 *
030 * Revision 1.29 2006/12/14 17:55:52 hrivnac
031 * going back to JAS 0.8.3rc6
032 *
033 * Revision 1.28 2006/12/12 15:21:42 hrivnac
034 * McKoi replaced with Derby; uppercase-only dbs handled better; moving to JAS 0.8.3
035 *
036 * Revision 1.27 2004/11/22 18:09:52 hrivnac
037 * Oracle treatment
038 *
039 * Revision 1.26 2004/10/22 15:32:59 hrivnac
040 * cleaned
041 *
042 * Revision 1.25 2004/10/22 14:22:44 hrivnac
043 * properties loading refactored
044 *
045 * Revision 1.24 2004/10/21 10:39:31 hrivnac
046 * works wel with ColMan
047 *
048 * Revision 1.23 2004/10/20 23:02:29 hrivnac
049 * Types mapping simplified
050 *
051 * Revision 1.22 2004/10/12 19:26:59 hrivnac
052 * MySQL Connector 3.0.14
053 *
054 * Revision 1.21 2004/06/30 13:01:05 hrivnac
055 * oracle sceleton
056 *
057 * Revision 1.20 2004/05/22 15:12:59 hrivnac
058 * class id reformated
059 *
060 * Revision 1.19 2004/05/18 15:34:28 hrivnac
061 * compatible with Java 1.5.0-beta2
062 *
063 * Revision 1.18 2004/04/21 22:05:53 hrivnac
064 * Implementation.properties to configure Inplementation.java, no SQL dependency in code
065 *
066 * Revision 1.17 2004/04/21 22:04:03 hrivnac
067 * Implementation.properties to configure Inplementation.java, no SQL dependency in code
068 *
069 * Revision 1.16 2004/04/21 13:41:32 hrivnac
070 * explicit dependency on MySQL removed
071 *
072 * Revision 1.15 2004/04/20 22:33:33 hrivnac
073 * Implementation/Type handling improved
074 *
075 * Revision 1.14 2004/04/16 15:32:57 hrivnac
076 * Type.properties to setup Type.class
077 *
078 * Revision 1.13 2004/04/14 13:39:46 hrivnac
079 * 1.5 warnings fixed
080 *
081 * Revision 1.12 2004/04/13 15:45:54 hrivnac
082 * AIDA URL introduced
083 *
084 * Revision 1.11 2004/02/10 14:50:58 hrivnac
085 * JavaDoc tags completed
086 *
087 * Revision 1.10 2004/02/04 13:30:39 hrivnac
088 * - improvement of Enums internal mapping
089 * - general cleaning
090 *
091 * Revision 1.9 2003/12/29 23:43:52 hrivnac
092 * Only core SQLTuple; only with Java 1.5
093 *
094 * Revision 1.8 2003/11/05 19:46:22 hrivnac
095 * - FreeHEP 1.2.1
096 * - JAIDA 3.2.1
097 *
098 * Revision 1.1 2003/10/08 15:00:30 hrivnac
099 * Enums introduced as standard entities.
100 *
101 * </pre>
102 * </font></p>
103 * @opt attributes
104 * @opt operations
105 * @opt types
106 * @opt visibility
107 * @version $Id: Implementation.java,v 1.32 2007/06/11 14:02:29 hrivnac Exp $
108 * @author <a href="mailto:Julius.Hrivnac@cern.ch">J.Hrivnac</a> */
109 public class Implementation {
110
111 /** Give associated JDBC driver.
112 * @param protocol The JDBC protocol.
113 * @return The name of the driver Class corresponding to this Impementation. */
114 public static String driver(String protocol) {
115 return (String)_properties.get(_place + ".Driver." + protocol);
116 }
117
118 /** Give associated database creation command, if exists.
119 * @param protocol The JDBC protocol
120 * @return The database creation command, if exists */
121 public static String creationCommand(String protocol) {
122 String creation = (String)_properties.get(_place + ".CreationCommand." + protocol);
123 if (creation == null) {
124 return "";
125 }
126 return creation;
127 }
128
129 /** Tell, if supports only uppercase names.
130 * @param protocol The JDBC protocol.
131 * @return Whether supports only uppercase names. */
132 public static boolean supportsOnlyUpperCase(String protocol) {
133 String supports = (String)_properties.get(_place + ".UpperCase." + protocol);
134 if (supports == null) {
135 return false;
136 }
137 return supports.equals("true");
138 }
139
140 /** Tell, if supports table replication within database.
141 * @param protocol The JDBC protocol.
142 * @return Whether supports table replication within database. */
143 public static boolean supportsReplication(String protocol) {
144 String supports = (String)_properties.get(_place + ".Replication." + protocol);
145 if (supports == null) {
146 return false;
147 }
148 return supports.equals("true");
149 }
150
151 /** Tell, if supports only TYPE_FORWARD_ONLY cursor.
152 * @param protocol The JDBC protocol.
153 * @return Whether supports only TYPE_FORWARD_ONLY cursor. */
154 public static boolean supportsOnlyForwardOnly(String protocol) {
155 String supports = (String)_properties.get(_place + ".ForwardOnly." + protocol);
156 if (supports == null) {
157 return false;
158 }
159 return supports.equals("true");
160 }
161
162 /** Add an implementation not available from default.
163 * @param protocol The JDBC protocol.
164 * @param driver The name of the driver Class corresponding to this Impementation.
165 * @param supportsReplication Whether supports table replication within database. */
166 public static void add(String protocol,
167 String driver,
168 boolean supportsReplication) {
169 _properties.setProperty(_place + ".Driver." + protocol, driver);
170 _properties.setProperty(_place + ".Replication." + protocol, supportsReplication ? "true" : "false");
171 }
172
173 private static Properties _properties = new LoadedProperties("Implementation.properties", "hep/aida/ref/sql");
174
175 private static String _place = Implementation.class.getName();
176
177 /** Logging . */
178 private static Logger log = Logger.getLogger(Implementation.class);
179
180 }