fix uuid as UniqueKey problem
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / database / types / DatabaseTypeBase.java
1 /**
2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9
10 package eu.etaxonomy.cdm.database.types;
11
12 import javax.sql.DataSource;
13
14 import org.apache.log4j.Logger;
15 import org.hibernate.dialect.Dialect;
16
17 import eu.etaxonomy.cdm.database.ICdmDataSource;
18 import eu.etaxonomy.cdm.database.NomenclaturalCodeAwareDataSource;
19
20
21 /**
22 * @author a.mueller
23 *
24 */
25 abstract class DatabaseTypeBase implements IDatabaseType {
26 private static final Logger logger = Logger.getLogger(DatabaseTypeBase.class);
27
28 //typeName
29 private String typeName;
30 //String for DriverClass
31 private String classString;
32 //url
33 private String urlString;
34 //defaultPort
35 private int defaultPort;
36 //hibernate dialect
37 private Dialect hibernateDialect;
38 //init method
39 private String initMethod = null;
40 //init method
41 private String destroyMethod = null;
42
43
44 //init
45 protected void init(String typeName, String classString, String urlString, int defaultPort, Dialect hibernateDialect) {
46 this.typeName = typeName;
47 this.classString = classString;
48 this.urlString = urlString;
49 this.defaultPort = defaultPort;
50 this.hibernateDialect = hibernateDialect;
51 }
52
53 @Override
54 public String getName(){
55 return typeName;
56 }
57
58 @Override
59 public String getClassString(){
60 return classString;
61 }
62
63 @Override
64 public String getUrlString(){
65 return urlString;
66 }
67
68 @Override
69 public int getDefaultPort(){
70 return defaultPort;
71 }
72
73 @Override
74 public Dialect getHibernateDialect(){
75 return hibernateDialect;
76 }
77
78 @Override
79 public String getHibernateDialectCanonicalName(){
80 return hibernateDialect.getClass().getCanonicalName();
81 }
82
83 @Override
84 public String getConnectionString(ICdmDataSource cdmDataSource){
85 int port = cdmDataSource.getPort();
86 if (port< 1){
87 port = defaultPort;
88 }
89 return getConnectionString(cdmDataSource, port);
90 }
91
92 abstract protected String getConnectionString(ICdmDataSource cdmDataSource, int port);
93
94 @Override
95 public Class<? extends DataSource> getDataSourceClass() {
96 return NomenclaturalCodeAwareDataSource.class;
97 }
98
99 @Override
100 public String getInitMethod() {
101 return initMethod;
102 }
103
104 @Override
105 public String getDestroyMethod() {
106 return destroyMethod;
107 }
108
109 @Override
110 public String getServerNameByConnectionString(String connectionString){
111 return getServerNameByConnectionString(connectionString, urlString, "/");
112 }
113
114 protected String getServerNameByConnectionString(String connectionString, String strUrl, String dbSeparator){
115 String result;
116 if (connectionString == null || !connectionString.startsWith(urlString)){
117 return null;
118 }
119 connectionString = connectionString.substring(strUrl.length());
120 int posPort = connectionString.indexOf(":");
121 int posDb = connectionString.indexOf(dbSeparator);
122 if (posPort != -1 && posPort < posDb){
123 result = connectionString.substring(0, posPort);
124 }else if (posDb != -1){
125 result = connectionString.substring(0, posDb);
126 }else{
127 logger.warn("No database defined or override for getServerNameByConnectionString() needed for this database type");
128 result = connectionString;
129 }
130 return result;
131 }
132
133 @Override
134 public int getPortByConnectionString(String connectionString){
135 String dbSeparator = "/";
136 return getPortByConnectionString(connectionString, urlString, dbSeparator);
137 }
138
139 protected int getPortByConnectionString(String connectionString, String strUrl, String dbSeparator){
140 if (connectionString == null || !connectionString.startsWith(urlString)){
141 return -1;
142 }
143 int result;
144 connectionString = connectionString.substring(strUrl.length());
145 int posPort = connectionString.indexOf(":");
146 int posDb = connectionString.indexOf(dbSeparator, posPort+1);
147 if (posPort == -1){
148 result = defaultPort;
149 }else{
150 if (posDb != -1){
151 connectionString = connectionString.substring(posPort + 1, posDb);
152 try {
153 result = Integer.valueOf(connectionString);
154 } catch (NumberFormatException e) {
155 logger.warn("Port is not an Integer in connection string: " + connectionString);
156 return -1;
157 }
158 }else{
159 logger.warn("No database defined or override for getPortByConnectionString() needed for this database type");
160 result = -1;
161 }
162 }
163 return result;
164 }
165
166
167 protected String getDatabasePartOfConnectionString(String connectionString, String dbSeparator){
168 String result;
169 if (connectionString == null || !connectionString.startsWith(urlString)){
170 return null;
171 }
172
173 connectionString = connectionString.substring(urlString.length()); //delete prefix
174 int posDb = connectionString.indexOf(dbSeparator);
175 if (posDb != -1){
176 result = connectionString.substring(posDb + dbSeparator.length() );
177 }else{
178 logger.warn("No database defined or override for getServerNameByConnectionString() needed for this database type");
179 result = connectionString;
180 }
181 return result;
182 }
183
184 @Override
185 public abstract String getDatabaseNameByConnectionString(String connectionString);
186
187
188 }