All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.alterioncorp.requestlogger.PersisterJdbcImpl Maven / Gradle / Ivy

package com.alterioncorp.requestlogger;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.List;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import javax.sql.rowset.serial.SerialClob;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class PersisterJdbcImpl implements Persister, Constants {
	
	private final Logger log = LoggerFactory.getLogger(this.getClass());
	
	private final DataSource dataSource;
	private final String tableName;

	public PersisterJdbcImpl() {

		super();
		
		tableName = System.getProperty(
				PROPERTY_NAME_JDBC_TABLE_NAME, PROPERTY_DEFAULT_JDBC_TABLE_NAME);

		String dataSourceJndi = System.getProperty(
				PROPERTY_NAME_JDBC_DATASOURCE_JNDI, PROPERTY_DEFAULT_JDBC_DATASOURCE_JNDI);

		try {
			InitialContext initialContext = new InitialContext();
			dataSource = (DataSource)initialContext.lookup(dataSourceJndi);
		}
		catch (NamingException e) {
			throw new RuntimeException(e);
		}
	}

	public PersisterJdbcImpl(DataSource dataSource, String tableName) {
		super();
		this.dataSource = dataSource;
		this.tableName = tableName;
	}

	@Override
	public void saveRequests(List requests, PropertyRegistry propertyRegistry) {
		
		if (requests != null && ! requests.isEmpty()) {

			StringBuilder sql = new StringBuilder();
			sql.append("insert into ");
			sql.append(tableName);
			sql.append(" (");
			for (int i = 0; i < propertyRegistry.getRegisteredProperties().size(); i++) {
				if (i > 0) {
					sql.append(", ");
				}
				sql.append(propertyRegistry.getRegisteredProperties().get(i));
			}
			sql.append(" ) values ( ");
			for (int i = 0; i < propertyRegistry.getRegisteredProperties().size(); i++) {
				if (i > 0) {
					sql.append(", ");
				}
				sql.append("?");
			}
			sql.append(")");

			Connection connection = null;
			PreparedStatement statement = null;
			
			try {
				
				connection = dataSource.getConnection();
				connection.setAutoCommit(false);
				
				statement = connection.prepareStatement(sql.toString());
				
				for (Request request : requests) {

					for (int i = 0; i < propertyRegistry.getRegisteredProperties().size(); i++) {
						
						String property = propertyRegistry.getRegisteredProperties().get(i);
						int type = propertyRegistry.getDataType(property);
						Object value = request.getData().get(property);
						
						if (type == Types.CLOB && value instanceof String) {
							value = new SerialClob(((String)value).toCharArray());
						}
						
						if (value == null) {
							statement.setNull(i + 1, type);
						}
						else {
							statement.setObject(i + 1, value, type);
						}
					}
					
					statement.addBatch();
				}
				
				statement.executeBatch();
				connection.commit();
			}
			catch (SQLException e) {
				try {
					if (connection != null) {
						connection.rollback();
					}
				}
				catch (SQLException e2) {
					log.error("Error rolling back transaction", e2);
				}
				throw new RuntimeException(e);
			}
			finally {
				close(statement);
				close(connection);
			}
		}
	}
	
	public String getTableName() {
		return tableName;
	}

	DataSource getDataSource() {
		return dataSource;
	}
	
	static void close(ResultSet closeable) {
		if (closeable != null) {
			try {
				closeable.close();
			}
			catch (Exception e) {
				// ignore
			}
		}
	}

	static void close(Statement closeable) {
		if (closeable != null) {
			try {
				closeable.close();
			}
			catch (Exception e) {
				// ignore
			}
		}
	}
	
	static void close(Connection closeable) {
		if (closeable != null) {
			try {
				closeable.close();
			}
			catch (Exception e) {
				// ignore
			}
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy