![JAR search and dependency download from the Maven repository](/logo.png)
org.kawanfw.sql.tomcat.TomcatStarterUtil Maven / Gradle / Ivy
/*
* This file is part of AceQL.
* AceQL: Remote JDBC access over HTTP.
* Copyright (C) 2015, KawanSoft SAS
* (http://www.kawansoft.com). All rights reserved.
*
* AceQL is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* AceQL is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*
* Any modifications to this file must keep this entire header
* intact.
*/
package org.kawanfw.sql.tomcat;
import static org.kawanfw.file.servlet.ServerFileManager.COMMONS_CONFIGURATOR_CLASS_NAME;
import static org.kawanfw.file.servlet.ServerFileManager.FILE_CONFIGURATOR_CLASS_NAME;
import static org.kawanfw.sql.servlet.ServerSqlManager.SQL_CONFIGURATOR_CLASS_NAME;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.DatagramSocket;
import java.net.ServerSocket;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Enumeration;
import java.util.Properties;
import java.util.Set;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.apache.tomcat.jdbc.pool.PoolProperties;
import org.kawanfw.commons.server.util.embed.TomcatModeStore;
import org.kawanfw.sql.api.server.SqlConfigurationException;
import org.kawanfw.sql.servlet.sql.DbVendorManager;
import org.kawanfw.sql.tomcat.util.LinkedProperties;
import org.kawanfw.sql.util.SqlTag;
/**
* @author Nicolas de Pomereu
*
* Utility classes called at Tomcat startup
*/
public class TomcatStarterUtil {
/**
* protected constructor
*/
protected TomcatStarterUtil() {
}
/**
* If the user has created a driverClassName property in the properties
* file: we create a Tomcat JDBC Pool from the properties
*
* @param properties
* properties extracted from the properties file
* @param index
* the servlet index: "" for first servlet, then ".2", ".3", etc.
* @throws SqlConfigurationException
*/
public static void createAndStoreDataSource(Properties properties,
String index) throws SqlConfigurationException {
String driverClassName = properties.getProperty("driverClassName"
+ index);
String serverSqlManagerServletName = properties
.getProperty("serverSqlManagerServletName" + index);
serverSqlManagerServletName = serverSqlManagerServletName.trim();
if (driverClassName == null || driverClassName.isEmpty()) {
System.out.println(SqlTag.SQL_PRODUCT_START
+ " WARNING: driverClassName" + index
+ " property not found for servlet "
+ serverSqlManagerServletName + "! ");
System.out
.println(SqlTag.SQL_PRODUCT_START
+ " Connection management must be defined in CommonsConfigurator.getConnection()");
return;
}
if (index == null) {
throw new IllegalArgumentException("index can not be null");
}
if (!index.equals("") && !index.startsWith(".")) {
throw new IllegalArgumentException(
"index must be empty or start with \".\"");
}
String url = properties.getProperty("url" + index);
if ((url == null) || url.isEmpty()) {
throw new SqlConfigurationException(
"the url"
+ index
+ " property is not set in properties file for driverClassName "
+ driverClassName + ". " + SqlTag.PLEASE_CORRECT);
}
String username = properties.getProperty("username" + index);
if ((username == null) || username.isEmpty()) {
throw new SqlConfigurationException(
"the username"
+ index
+ " property is not set in properties file for driverClassName "
+ driverClassName + ". " + SqlTag.PLEASE_CORRECT);
}
String password = properties.getProperty("password" + index);
if ((password == null) || password.isEmpty()) {
throw new SqlConfigurationException(
"the password"
+ index
+ " property is not set in properties file for driverClassName "
+ driverClassName + ". " + SqlTag.PLEASE_CORRECT);
}
System.out.println(SqlTag.SQL_PRODUCT_START
+ " Setting Tomcat JDBC Pool attributes for "
+ serverSqlManagerServletName + " Servlet:");
// OK! create and test the DataSource
PoolPropertiesCreator poolPropertiesCreator = new PoolPropertiesCreator(
properties, index);
PoolProperties poolProperties = null;
try {
poolProperties = poolPropertiesCreator.create();
} catch (Exception e) {
throw new SqlConfigurationException(e.getMessage());
}
DataSource dataSource = new DataSource();
dataSource.setPoolProperties(poolProperties);
Connection connection = null;
try {
try {
System.out.println(SqlTag.SQL_PRODUCT_START
+ " Testing DataSource.getConnection() for "
+ serverSqlManagerServletName + " Servlet:");
connection = dataSource.getConnection();
// Connection connection2 = dataSource.getConnection();
// System.out.println("dataSource.getActive()): " +
// dataSource.getActive());
// connection2.close();
if (connection == null) {
throw new SqlConfigurationException(
"Connection is null. Please verify all the values in properties file.");
}
// Checks that DB Vendor is supported
DbVendorManager.checkDbVendor(properties, connection);
System.out.println(SqlTag.SQL_PRODUCT_START
+ " -> Connection OK!");
} catch (SQLException e) {
throw new SqlConfigurationException(e.getMessage() + " "
+ e.getCause());
}
} finally {
if (connection != null) {
try {
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
TomcatModeStore.setDataSource(serverSqlManagerServletName, dataSource);
}
/**
* Returns the index from the servlet name
*
* @param properties
* Properties extracted from the server-sql.properties files
* @param serverSqlManagerServletName
* The Server SQL servlet name that is defined in a property of
* properties
* @return the index corresponding to the Server SQL servlet name
* @throws IllegalArgumentException
*/
public static String getIndexFromServletName(Properties properties,
String serverSqlManagerServletName) throws IllegalArgumentException {
if (properties == null) {
throw new IllegalArgumentException("properties can not be null");
}
if (serverSqlManagerServletName == null) {
throw new IllegalArgumentException(
"serverSqlManagerServletName can not be null");
}
serverSqlManagerServletName = serverSqlManagerServletName.trim();
for (Enumeration> e = properties.propertyNames(); e.hasMoreElements();) {
String propertyName = (String) e.nextElement();
String propertyValue = properties.getProperty(propertyName);
propertyValue = propertyValue.trim();
if (propertyValue.equals(serverSqlManagerServletName)) {
String index = null;
propertyName = propertyName.trim();
if (!propertyName.contains(".")) {
index = ""; // First Servlet, no index
} else {
index = "."
+ StringUtils.substringAfterLast(propertyName, ".");
}
return index;
}
}
throw new SqlConfigurationException(
"Server SQL Manager servlet name not found in properties file: "
+ serverSqlManagerServletName);
}
/**
* Returns the Properties extracted from a file.
*
* @param file
* the file containinf the properties
* @return the Properties extracted from the file
*
* @throws IOException
* @throws SqlConfigurationException
*/
public static Properties getProperties(File file) throws IOException,
SqlConfigurationException {
if (file == null) {
throw new IllegalArgumentException("file can not be null!");
}
if (!file.exists()) {
throw new SqlConfigurationException("properties file not found: "
+ file);
}
// Get the properties with order of position in file:
Set linkedProperties = LinkedProperties
.getLinkedPropertiesName(file);
InputStream in = null;
// Create the ordered properties
Properties properties;
try {
in = new FileInputStream(file);
properties = new LinkedProperties(linkedProperties);
properties.load(in);
} finally {
IOUtils.closeQuietly(in);
}
return properties;
}
/**
* Set the servlet parameters store with the values extracted from the
* Properties.
*
* @param properties
* Properties extractec from the server-sql.properties files
* @param index
* the servlet index: "" for first servlet, then ".2", ".3", etc.
*
* @throws IllegalArgumentException
*/
public static void setInitParametersInStore(Properties properties,
String index) throws IllegalArgumentException {
if (properties == null) {
throw new IllegalArgumentException("properties can not be null");
}
if (index == null) {
throw new IllegalArgumentException("index can not be null");
}
if (!index.equals("") && !index.startsWith(".")) {
throw new IllegalArgumentException(
"index must be empty or start with \".\"");
}
String serverSqlManagerServletName = properties
.getProperty("serverSqlManagerServletName" + index);
if (serverSqlManagerServletName == null
|| serverSqlManagerServletName.isEmpty()) {
throw new SqlConfigurationException(
"serverSqlManagerServletName property is null. "
+ SqlTag.PLEASE_CORRECT);
}
serverSqlManagerServletName = serverSqlManagerServletName.trim();
// Set the configurators to use
String commonsConfiguratorClassName = TomcatStarterUtil
.trimSafe(properties
.getProperty(COMMONS_CONFIGURATOR_CLASS_NAME + index));
String sqlConfiguratorClassName = TomcatStarterUtil.trimSafe(properties
.getProperty(SQL_CONFIGURATOR_CLASS_NAME + index));
String fileConfiguratorClassName = TomcatStarterUtil
.trimSafe(properties.getProperty(FILE_CONFIGURATOR_CLASS_NAME
+ index));
ServletParametersStore.setInitParameter(serverSqlManagerServletName,
new InitParamNameValuePair(COMMONS_CONFIGURATOR_CLASS_NAME,
commonsConfiguratorClassName));
ServletParametersStore.setInitParameter(serverSqlManagerServletName,
new InitParamNameValuePair(SQL_CONFIGURATOR_CLASS_NAME,
sqlConfiguratorClassName));
ServletParametersStore.setInitParameter(serverSqlManagerServletName,
new InitParamNameValuePair(FILE_CONFIGURATOR_CLASS_NAME,
fileConfiguratorClassName));
}
/**
* Safely trim a String
*
* @param s
* the String to trim
* @return
*/
public static String trimSafe(String s) {
if (s != null) {
s = s.trim();
}
return s;
}
/**
* Checks to see if a specific port is available.
*
* @param port
* the port to check for availability
*/
public static boolean available(int port) {
ServerSocket ss = null;
DatagramSocket ds = null;
try {
ss = new ServerSocket(port);
ss.setReuseAddress(true);
ds = new DatagramSocket(port);
ds.setReuseAddress(true);
return true;
} catch (IOException e) {
// e.printStackTrace();
} finally {
if (ds != null) {
ds.close();
}
if (ss != null) {
try {
ss.close();
} catch (IOException e) {
/* should not be thrown */
}
}
}
return false;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy