2 * Copyright (C) 2007 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
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.
9 package eu
.etaxonomy
.cdm
.database
.types
;
12 import java
.io
.IOException
;
14 import javax
.sql
.DataSource
;
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
;
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
;
29 public class H2DatabaseType
extends DatabaseTypeBase
{
31 private static final Logger logger
= LogManager
.getLogger();
34 private final String typeName
= "H2 Database";
37 private final String classString
= "org.h2.Driver";
40 private final String urlString
= "jdbc:h2:";
43 private final int defaultPort
= 9092;
46 private final Dialect hibernateDialect
= new H2CorrectedDialect();
49 private final String initMethod
= "init";
52 private final String destroyMethod
= "destroy";
56 public String
getConnectionString(ICdmDataSource ds
, int port
){
57 H2Mode mode
= ds
.getMode();
58 String path
= ds
.getFilePath();
60 path
= getDefaultPath();
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();
69 logger
.warn("Unrecognized mode for Database H2");
75 public String
getServerNameByConnectionString(String connectionString
) {
77 if (connectionString
.startsWith("file:") || connectionString
.startsWith( urlString
+ "file:")){
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:")){
86 logger
.warn("Unknown conncection string format");
93 public String
getDatabaseNameByConnectionString(String connectionString
) {
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:")){
105 logger
.warn("Unknown conncection string format");
112 public int getPortByConnectionString(String connectionString
) {
114 if (connectionString
.startsWith("file:") || connectionString
.startsWith( urlString
+ "file:")){
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:")){
123 logger
.warn("Unknown conncection string format");
129 public H2DatabaseType() {
130 init (typeName
, classString
, urlString
, defaultPort
, hibernateDialect
);
134 public Class
<?
extends DataSource
> getDataSourceClass() {
135 return LocalH2
.class;
139 public String
getInitMethod() {
144 public String
getDestroyMethod() {
145 return destroyMethod
;
148 private static final String
getDefaultPath(){
150 File path
= CdmPersistenceUtils
.getWritableResourceDir();
151 String subPath
= File
.separator
+ "h2" + File
.separator
+ "LocalH2";
152 return path
+ subPath
;
153 }catch(IOException e
){
155 throw new RuntimeException(e
);