1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.springframework.batch.support;
18
19 import java.util.HashMap;
20 import java.util.Map;
21
22 import javax.sql.DataSource;
23
24 import org.springframework.jdbc.support.JdbcUtils;
25 import org.springframework.jdbc.support.MetaDataAccessException;
26
27
28
29
30
31
32
33
34
35
36 public enum DatabaseType {
37
38 DERBY("Apache Derby"),
39 DB2("DB2"),
40 DB2ZOS("DB2ZOS"),
41 HSQL("HSQL Database Engine"),
42 SQLSERVER("Microsoft SQL Server"),
43 MYSQL("MySQL"),
44 ORACLE("Oracle"),
45 POSTGRES("PostgreSQL"),
46 SYBASE("Sybase"), H2("H2");
47
48 private static final Map<String, DatabaseType> nameMap;
49
50 static{
51 nameMap = new HashMap<String, DatabaseType>();
52 for(DatabaseType type: values()){
53 nameMap.put(type.getProductName(), type);
54 }
55 }
56
57
58 private final String productName;
59
60 private DatabaseType(String productName) {
61 this.productName = productName;
62 }
63
64 public String getProductName() {
65 return productName;
66 }
67
68
69
70
71
72
73
74
75 public static DatabaseType fromProductName(String productName){
76 if(!nameMap.containsKey(productName)){
77 throw new IllegalArgumentException("DatabaseType not found for product name: [" +
78 productName + "]");
79 }
80 else{
81 return nameMap.get(productName);
82 }
83 }
84
85
86
87
88
89
90
91
92 public static DatabaseType fromMetaData(DataSource dataSource) throws MetaDataAccessException {
93 String databaseProductName =
94 JdbcUtils.extractDatabaseMetaData(dataSource, "getDatabaseProductName").toString();
95 if ("DB2".equals(databaseProductName)) {
96 String databaseProductVersion =
97 JdbcUtils.extractDatabaseMetaData(dataSource, "getDatabaseProductVersion").toString();
98 if (!databaseProductVersion.startsWith("SQL")) {
99 databaseProductName = "DB2ZOS";
100 }
101 else {
102 databaseProductName = JdbcUtils.commonDatabaseName(databaseProductName);
103 }
104 }
105 else {
106 databaseProductName = JdbcUtils.commonDatabaseName(databaseProductName);
107 }
108 return fromProductName(databaseProductName);
109 }
110 }