/**
* Copyright 2010-2011 Federico Cairo, Giuseppe Futia
*
* This file is part of ICONVIS.
*
* ICONVIS is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ICONVIS 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ICONVIS. If not, see <http://www.gnu.org/licenses/>.
*/
package it.polito.iconvis.integration.db;
import it.polito.iconvis.business.startup.IconvisBean;
import javax.ejb.Singleton;
import javax.ejb.LocalBean;
import it.polito.iconvis.exception.IconvisDBOperationException;
import java.io.File;
import java.net.MalformedURLException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import static it.polito.iconvis.util.Constants.*;
/**
*
* @author Federico Cairo
*/
@Singleton
@LocalBean
public class IconvisDAO {
protected static Logger log = Logger.getLogger(APPLICATION_CODE + ".integration.db");
public void getConnectionDataFromXml() throws MalformedURLException, DocumentException {
log.debug("[QueryManager::getConnectionDataFromXml] BEGIN");
File xml = new File(IconvisBean.ontologyFolderPath + "/query_mapping.xml");
SAXReader reader = new SAXReader();
Document doc = reader.read(xml);
Element root = doc.getRootElement();
Element database = root.element("database");
IconvisBean.databaseURL = database.elementText("url");
IconvisBean.databaseVendor = database.elementText("vendor");
IconvisBean.databaseDriver = database.elementText("driver");
IconvisBean.databaseUser = database.elementText("user");
IconvisBean.databasePassword = database.elementText("password");
log.info("[iconviz] Got DB connection data from XML. USERNAME: " + IconvisBean.databaseUser + " PASSWORD: " + IconvisBean.databasePassword + " URL: " + IconvisBean.databaseURL);
log.debug("[QueryManager::getConnectionDataFromXml] END");
}
public Connection getDBConnection() {
log.debug("[QueryManager::getDBConnection] BEGIN");
Connection con = null;
try {
Class.forName(IconvisBean.databaseDriver).newInstance();
con = DriverManager.getConnection(IconvisBean.databaseURL, IconvisBean.databaseUser, IconvisBean.databasePassword);
} catch (Exception e) {
log.error("[QueryManager::getDBConnection] Exception: ", e);
}
log.debug("[QueryManager::getDBConnection] END");
return con;
}
public String retrieveData(String s) throws IconvisDBOperationException {
log.debug("[QueryManager::retrieveData] BEGIN");
String result = null;
try {
Connection con = getDBConnection();
Statement stmt = con.createStatement();
String query = null;
StringBuilder sb = new StringBuilder();
String[] split = s.split(";;");
String URI = split[0];
String classIndiv = split[1];
if (classIndiv.equals("indiv")) {
query = IconvisBean.individualQueryMap.get(URI);
log.info("[QueryManager::retrieveData] SQL query: " + query);
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
sb.append(rs.getString(1)).append(SEPARATOR_2).append(rs.getString(2)).append(SEPARATOR_3);
}
} else {
for (String indiv : IconvisBean.individualsOfClassesTable.get(URI)) {
query = IconvisBean.individualQueryMap.get(indiv);
log.info("[QueryManager::retrieveData] SQL query: " + query);
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
sb.append(rs.getString(1)).append(SEPARATOR_2).append(rs.getString(2)).append(SEPARATOR_3);
}
}
}
con.close();
log.info("[QueryManager::retrieveData] Result: " + sb.toString());
result = sb.toString();
} catch (Exception e) {
log.error("[QueryManager::retrieveData] Exception: ", e);
throw new IconvisDBOperationException("Exception generated during CRUD operations on DB. ");
}
log.debug("[QueryManager::retrieveData] END");
return result;
}
// input: a query output: number of results
public int countQueryResults(String query) throws IconvisDBOperationException {
log.debug("[QueryManager::countQueryResults] BEGIN");
int count = 0;
try {
Connection con = getDBConnection();
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
count++;
}
} catch (Exception e) {
log.error("[QueryManager::countQueryResults] Exception: ", e);
throw new IconvisDBOperationException("Exception generated during results query counting on DB.");
}
log.debug("[QueryManager::countQueryResults] END");
return count;
}
}