1   package com.atlassian.config.db;
2   
3   import com.atlassian.config.ApplicationConfiguration;
4   
5   import java.util.Properties;
6   
7   /**
8    * Wrapper around ApplicationConfiguration to provide easy access to Hibernate configuration info
9    */
10  public class HibernateConfig
11  {
12      public static final String HIBERNATE_SETUP = "hibernate.setup";
13      public static final String HIBERNATE_CONFIG_PREFIX = "hibernate.";
14      private static final String DIALECT_KEY = "hibernate.dialect";
15  
16      private ApplicationConfiguration applicationConfig;
17  
18      /**
19       * Do not construct. Do not take orally. Consult a doctor if pain persists.
20       */
21      public HibernateConfig() {
22      }
23  
24      public void setApplicationConfig(ApplicationConfiguration applicationConfiguration)
25      {
26          this.applicationConfig = applicationConfiguration;
27      }
28  
29      public ApplicationConfiguration getApplicationConfig()
30      {
31          return applicationConfig;
32      }
33  
34      public boolean isHibernateSetup()
35      {
36          return (applicationConfig.getBooleanProperty(HibernateConfig.HIBERNATE_SETUP));
37      }
38  
39      /**
40       * Gets all hibernate properties from the config starting 'hibernate.'
41       * @return all hibernate properties in a Properties map
42       */
43      public Properties getHibernateProperties()
44      {
45          Properties props = new Properties();
46          props.putAll(applicationConfig.getPropertiesWithPrefix(HIBERNATE_CONFIG_PREFIX));
47          return props;
48      }
49  
50      public static  boolean isOracleDialect(final String dialect)
51      {
52          return null != dialect && dialect.matches(".*Oracle.*Dialect$");
53      }
54  
55      public static boolean isSqlServerDialect(final String dialect)
56      {
57          return null != dialect && dialect.matches(".*?SQLServer.*?Dialect$");
58      }
59  
60      public static boolean isDb2Dialect(final String dialect)
61      {
62          return null != dialect && dialect.matches(".*?DB2.*?Dialect$");
63      }
64  
65      public static boolean isHsqlDialect(final String dialect)
66      {
67          return null != dialect && dialect.matches(".*?HSQL.*?Dialect$");
68      }
69  
70      public static boolean isMySqlDialect(final String dialect)
71      {
72          return null != dialect && dialect.matches(".*?MySQL.*?Dialect$");
73      }
74  
75      public static boolean isPostgreSqlDialect(final String dialect)
76      {
77          return null != dialect && dialect.matches(".*?PostgreSQL.*?Dialect$");
78      }
79  
80      public boolean isDb2()
81      {
82          return isDb2Dialect(getConfiguredDialect());
83      }
84  
85      public boolean isSqlServer()
86      {
87          return isSqlServerDialect(getConfiguredDialect());
88      }
89  
90      public boolean isPostgreSql()
91      {
92          return isPostgreSqlDialect(getConfiguredDialect());
93      }
94  
95      public boolean isMySql()
96      {
97          return isMySqlDialect(getConfiguredDialect());
98      }
99  
100     public boolean isOracle()
101     {
102         return isOracleDialect(getConfiguredDialect());
103     }
104 
105     public boolean isHSQL()
106     {
107         return isHsqlDialect(getConfiguredDialect());
108     }
109 
110     public boolean booleanRequiresSubstitution()
111     {
112         return isOracle() || isSqlServer() || isDb2();
113     }
114 
115     /**
116      * @return true if the current database allows multiple null values to be inserted in a column on which there is
117      * a unique constraint.
118      */
119     public boolean uniqueAllowsMultipleNullValues()
120     {
121         return !(isOracle() || isSqlServer());
122     }
123 
124     /**
125      * @return true if the current database allows unique constraints over columns that can contain null values. The
126      * null values may or may not be treated like they are unique.
127      * @see #uniqueAllowsMultipleNullValues()
128      */
129     public boolean uniqueAllowsAnyNullValues()
130     {
131         return !isDb2();
132     }
133 
134     private String getConfiguredDialect()
135     {
136         return getConfiguredStringProperty(DIALECT_KEY);
137     }
138 
139     private String getConfiguredStringProperty(String key)
140     {
141         return (String) getApplicationConfig().getProperty(key);
142     }
143 
144 }