/* * Copyright 2018 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.cloudsql; import com.zaxxer.hikari.HikariDataSource; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.sql.SQLException; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; import javax.sql.DataSource; @SuppressFBWarnings( value = {"HARD_CODE_PASSWORD", "WEM_WEAK_EXCEPTION_MESSAGING"}, justification = "Extracted from environment, Exception message adds context.") @WebListener("Creates a connection pool that is stored in the Servlet's context for later use.") public class ConnectionPoolContextListener implements ServletContextListener { @Override public void contextDestroyed(ServletContextEvent event) { // This function is called when the Servlet is destroyed. HikariDataSource pool = (HikariDataSource) event.getServletContext().getAttribute("my-pool"); if (pool != null) { pool.close(); } } @Override public void contextInitialized(ServletContextEvent event) { // This function is called when the application starts and will safely create a connection pool // that can be used to connect to. ServletContext servletContext = event.getServletContext(); DataSource pool = (DataSource) servletContext.getAttribute("my-pool"); if (pool == null) { if (System.getenv("INSTANCE_HOST") != null) { pool = TcpConnectionPoolFactory.createConnectionPool(); } else if (System.getenv("DB_IAM_USER") != null) { pool = ConnectorIamAuthnConnectionPoolFactory.createConnectionPool(); } else { pool = ConnectorConnectionPoolFactory.createConnectionPool(); } servletContext.setAttribute("my-pool", pool); } try { Utils.createTable(pool); } catch (SQLException ex) { throw new RuntimeException( "Unable to verify table schema. Please double check the steps" + "in the README and try again.", ex); } } }