| 26  * POSSIBILITY OF SUCH DAMAGE. | 26  * POSSIBILITY OF SUCH DAMAGE. | 
| 27  * | 27  * | 
| 28  */ | 28  */ | 
| 29 package de.uapcore.lightpit; | 29 package de.uapcore.lightpit; | 
| 30 | 30 | 
| 31 import de.uapcore.lightpit.dao.DataAccessObjects; |  | 
| 32 import de.uapcore.lightpit.dao.postgres.PGDataAccessObjects; |  | 
| 33 import org.slf4j.Logger; | 31 import org.slf4j.Logger; | 
| 34 import org.slf4j.LoggerFactory; | 32 import org.slf4j.LoggerFactory; | 
| 35 | 33 | 
| 36 import javax.naming.Context; | 34 import javax.naming.Context; | 
| 37 import javax.naming.InitialContext; | 35 import javax.naming.InitialContext; | 
| 89      */ | 87      */ | 
| 90     public static final String SC_ATTR_NAME = DatabaseFacade.class.getName(); | 88     public static final String SC_ATTR_NAME = DatabaseFacade.class.getName(); | 
| 91 | 89 | 
| 92     private static final String DS_JNDI_NAME = "jdbc/lightpit/app"; | 90     private static final String DS_JNDI_NAME = "jdbc/lightpit/app"; | 
| 93     private DataSource dataSource; | 91     private DataSource dataSource; | 
| 94     private DataAccessObjects dataAccessObjects; |  | 
| 95 | 92 | 
| 96     /** | 93     /** | 
| 97      * Returns the data source. | 94      * Returns the data source. | 
| 98      * <p> |  | 
| 99      * The Optional returned should never be empty. However, if something goes |  | 
| 100      * wrong during initialization, the data source might be absent. |  | 
| 101      * Hence, users of this data source are forced to check the existence. |  | 
| 102      * | 95      * | 
| 103      * @return a data source | 96      * @return a data source | 
| 104      */ | 97      */ | 
| 105     public Optional<DataSource> getDataSource() { | 98     public DataSource getDataSource() { | 
| 106         // TODO: this should not be an optional, if an empty optional is actually an exception | 99         return dataSource; | 
| 107         return Optional.ofNullable(dataSource); |  | 
| 108     } |  | 
| 109 |  | 
| 110     /** |  | 
| 111      * Returns the data access objects. |  | 
| 112      * |  | 
| 113      * @return an interface to obtain the data access objects |  | 
| 114      */ |  | 
| 115     public DataAccessObjects getDataAccessObjects() { |  | 
| 116         return dataAccessObjects; |  | 
| 117     } | 100     } | 
| 118 | 101 | 
| 119     public Dialect getSQLDialect() { | 102     public Dialect getSQLDialect() { | 
| 120         return dialect; | 103         return dialect; | 
| 121     } | 104     } | 
| 169             } catch (IllegalArgumentException ex) { | 152             } catch (IllegalArgumentException ex) { | 
| 170                 LOG.error("Unknown or unsupported database dialect {}. Defaulting to {}.", dbDialect, dialect); | 153                 LOG.error("Unknown or unsupported database dialect {}. Defaulting to {}.", dbDialect, dialect); | 
| 171             } | 154             } | 
| 172         } | 155         } | 
| 173 | 156 | 
| 174         dataAccessObjects = createDataAccessObjects(dialect); |  | 
| 175 |  | 
| 176         try { | 157         try { | 
| 177             LOG.debug("Trying to access JNDI context {}...", contextName); | 158             LOG.debug("Trying to access JNDI context {}...", contextName); | 
| 178             Context initialCtx = new InitialContext(); | 159             Context initialCtx = new InitialContext(); | 
| 179             Context ctx = (Context) initialCtx.lookup(contextName); | 160             Context ctx = (Context) initialCtx.lookup(contextName); | 
| 180 | 161 | 
| 189 | 170 | 
| 190         sc.setAttribute(SC_ATTR_NAME, this); | 171         sc.setAttribute(SC_ATTR_NAME, this); | 
| 191         LOG.info("Database facade injected into ServletContext."); | 172         LOG.info("Database facade injected into ServletContext."); | 
| 192     } | 173     } | 
| 193 | 174 | 
| 194     private static DataAccessObjects createDataAccessObjects(Dialect dialect) { |  | 
| 195         switch (dialect) { |  | 
| 196             case Postgres: |  | 
| 197                 return new PGDataAccessObjects(); |  | 
| 198             default: |  | 
| 199                 throw new AssertionError("Non-exhaustive switch - this is a bug."); |  | 
| 200         } |  | 
| 201     } |  | 
| 202 |  | 
| 203     @Override | 175     @Override | 
| 204     public void contextDestroyed(ServletContextEvent sce) { | 176     public void contextDestroyed(ServletContextEvent sce) { | 
| 205         dataSource = null; | 177         dataSource = null; | 
| 206     } | 178     } | 
| 207 } | 179 } |