/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.datamanagement.backend.metadata.derby.internal;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.SQLException;
import de.rcenvironment.core.utils.common.StringUtils;
/**
* InvocationHandler for pooled connections.
*
* @author Christian Weiss
*/
final class PooledConnectionInvocationHandler implements InvocationHandler {
private final Connection connection;
private int count = 0;
PooledConnectionInvocationHandler(final Connection connection) {
this.connection = connection;
}
@Override
public Object invoke(final Object proxy, final Method method, final Object[] args) {
boolean execute = true;
if (method.getName().equals("increment")) {
count++;
execute = false;
} else if (method.getName().equals("decrement")) {
count--;
execute = false;
} else if (method.getName().equals("close")) {
count--;
if (count > 0) {
execute = false;
}
}
if (count == 0) {
try {
if (!connection.isClosed()) {
connection.close();
}
} catch (SQLException e) {
throw new RuntimeException("Failed to close connection.", e);
}
}
if (execute) {
try {
return method.invoke(connection, args);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
throw new RuntimeException(StringUtils.format("Failed to execute database query. %s", e.getMessage()));
}
}
return null;
}
}