Merge branch 'release/5.45.0'
[cdmlib.git] / cdmlib-persistence / src / main / java / eu / etaxonomy / cdm / database / types / H2DatabaseType.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 package eu.etaxonomy.cdm.database.types;
10
11 import java.io.File;
12 import java.io.IOException;
13
14 import javax.sql.DataSource;
15
16 import org.apache.logging.log4j.LogManager;
17 import org.apache.logging.log4j.Logger;
18 import org.hibernate.dialect.Dialect;
19 import org.hibernate.dialect.H2CorrectedDialect;
20
21 import eu.etaxonomy.cdm.database.H2Mode;
22 import eu.etaxonomy.cdm.database.ICdmDataSource;
23 import eu.etaxonomy.cdm.database.LocalH2;
24 import eu.etaxonomy.cdm.persistence.utils.CdmPersistenceUtils;
25
26 /**
27 * @author a.mueller
28 */
29 public class H2DatabaseType extends DatabaseTypeBase {
30
31 private static final Logger logger = LogManager.getLogger();
32
33 //typeName
34 private final String typeName = "H2 Database";
35
36 //class
37 private final String classString = "org.h2.Driver";
38
39 //url
40 private final String urlString = "jdbc:h2:";
41
42 //port
43 private final int defaultPort = 9092;
44
45 //hibernate dialect
46 private final Dialect hibernateDialect = new H2CorrectedDialect();
47
48 //init method
49 private final String initMethod = "init";
50
51 //destroy method
52 private final String destroyMethod = "destroy";
53
54 //connection String
55 @Override
56 public String getConnectionString(ICdmDataSource ds, int port){
57 H2Mode mode = ds.getMode();
58 String path = ds.getFilePath();
59 if (path == null){
60 path = getDefaultPath();
61 }
62 if (mode.equals(H2Mode.IN_MEMORY)){
63 return urlString + "mem:";
64 }else if (mode.equals(H2Mode.EMBEDDED)){
65 return urlString + "file:" + path + "/" + ds.getDatabase();
66 }else if (mode.equals(H2Mode.TCP)){
67 return urlString + "tcp://" + ds.getServer() + ":" + port + "/" + path + "/" + ds.getDatabase();
68 }else{
69 logger.warn("Unrecognized mode for Database H2");
70 return null;
71 }
72 }
73
74 @Override
75 public String getServerNameByConnectionString(String connectionString) {
76 String result;
77 if (connectionString.startsWith("file:") || connectionString.startsWith( urlString + "file:")){
78 result = null;
79 }else if (connectionString.startsWith("tcp://")){
80 String prefix = "tcp://";
81 String dbSeparator = "/";
82 result = getServerNameByConnectionString(connectionString, prefix, dbSeparator);
83 }else if (connectionString.startsWith("mem:")){
84 result = null;
85 }else{
86 logger.warn("Unknown conncection string format");
87 result = null;
88 }
89 return result;
90 }
91
92 @Override
93 public String getDatabaseNameByConnectionString(String connectionString) {
94 int pos = -1;
95 String result;
96 if (connectionString.startsWith("file:") || connectionString.startsWith( urlString + "file:")){
97 pos = connectionString.lastIndexOf("/");
98 result = connectionString.substring(pos + 1);
99 }else if (connectionString.startsWith("tcp://")){
100 pos = connectionString.lastIndexOf("/");
101 result = connectionString.substring(pos + 1);
102 }else if (connectionString.startsWith("mem:")){
103 return null;
104 }else{
105 logger.warn("Unknown conncection string format");
106 return null;
107 }
108 return result;
109 }
110
111 @Override
112 public int getPortByConnectionString(String connectionString) {
113 int result;
114 if (connectionString.startsWith("file:") || connectionString.startsWith( urlString + "file:")){
115 result = -1;
116 }else if (connectionString.startsWith("tcp://")){
117 String prefix = "tcp://";
118 String dbSeparator = "/";
119 result = getPortByConnectionString(connectionString, prefix, dbSeparator);
120 }else if (connectionString.startsWith("mem:")){
121 result = -1;
122 }else{
123 logger.warn("Unknown conncection string format");
124 result = -1;
125 }
126 return result;
127 }
128
129 public H2DatabaseType() {
130 init (typeName, classString, urlString, defaultPort, hibernateDialect );
131 }
132
133 @Override
134 public Class<? extends DataSource> getDataSourceClass() {
135 return LocalH2.class;
136 }
137
138 @Override
139 public String getInitMethod() {
140 return initMethod;
141 }
142
143 @Override
144 public String getDestroyMethod() {
145 return destroyMethod;
146 }
147
148 private static final String getDefaultPath(){
149 try{
150 File path = CdmPersistenceUtils.getWritableResourceDir();
151 String subPath = File.separator + "h2" + File.separator + "LocalH2";
152 return path + subPath;
153 }catch(IOException e){
154 logger.error(e);
155 throw new RuntimeException(e);
156 }
157 }
158 }