import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.security.auth.Subject;

import com.adeptia.indigo.security.AuthUtil;
import com.adeptia.indigo.services.mapping.support.ReferenceConnection;
import com.adeptia.indigo.services.transport.connector.DatabaseConnectionInfo;
import com.adeptia.indigo.storage.Entity;
import com.adeptia.indigo.utils.JdbcUtils;

public class ExecuteOracleProcedureForUpdate { 

	private static Map databaseConnectionInfoMap = new HashMap();

	public static String execute(String identifier, String dbInfoName,
			Subject subject, String query) throws SQLException {  
		Connection con = null;
		CallableStatement cs = null;
		String result = "";
		try {
			DatabaseConnectionInfo _databaseConnectionInfo = null;
			String userId = AuthUtil.extractIndigoUser(subject).getId();
			_databaseConnectionInfo = (DatabaseConnectionInfo) databaseConnectionInfoMap
					.get(userId + dbInfoName);
			if (_databaseConnectionInfo == null) {
				Entity beanObject = (Entity) DatabaseConnectionInfo.class
						.newInstance();
				Iterator it = ReferenceConnection.getEntity(
						beanObject.getClass(), subject);
				while (it.hasNext()) {
					DatabaseConnectionInfo temp = (DatabaseConnectionInfo) it
							.next();
					String entityName = temp.getEntityName();
					if (entityName.equals(dbInfoName)) {
						_databaseConnectionInfo = temp;
						break;
					}
				}
				databaseConnectionInfoMap.put(userId + dbInfoName,
						_databaseConnectionInfo);
			}
			if (_databaseConnectionInfo.isEnablePooling()) {
				con = JdbcUtils.getConnection(_databaseConnectionInfo, subject);
			} else {
				con = ReferenceConnection.getDBConnection(identifier,
						dbInfoName, subject);
			}
			cs = con.prepareCall(query);
			cs.execute();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (cs != null) {
				cs.close();
			}
			if (con != null) {
				con.close();
			}
		}
		return result;
	}
}
