/*******************************************************************************
* Copyright 2012 University of Southern California
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This code was developed by the Information Integration Group as part
* of the Karma project at the Information Sciences Institute of the
* University of Southern California. For more information, publications,
* and related projects, please see: http://www.isi.edu/integration
******************************************************************************/
package edu.isi.karma.rdf;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import org.json.JSONException;
import com.hp.hpl.jena.rdf.model.Model;
import edu.isi.karma.kr2rml.ErrorReport;
import edu.isi.karma.kr2rml.KR2RMLWorksheetRDFGenerator;
import edu.isi.karma.kr2rml.WorksheetR2RMLJenaModelParser;
import edu.isi.karma.rep.HNode;
import edu.isi.karma.rep.HTable;
import edu.isi.karma.rep.RepFactory;
import edu.isi.karma.rep.Row;
import edu.isi.karma.rep.Table;
import edu.isi.karma.rep.Worksheet;
import edu.isi.karma.rep.Workspace;
import edu.isi.karma.util.AbstractJDBCUtil;
import edu.isi.karma.util.AbstractJDBCUtil.DBType;
import edu.isi.karma.util.JDBCUtilFactory;
import edu.isi.karma.view.VWorksheet;
import edu.isi.karma.view.VWorkspace;
import edu.isi.karma.webserver.KarmaException;
public class DatabaseTableRDFGenerator {
private DBType dbType;
private String hostname;
private int portnumber;
private String username;
private String password;
private String dBorSIDName;
private String tablename;
private static int DATABASE_TABLE_FETCH_SIZE = 1000;
public DatabaseTableRDFGenerator(DBType dbType, String hostname,
int portnumber, String username, String password,
String dBorSIDName, String tablename) {
super();
this.dbType = dbType;
this.hostname = hostname;
this.portnumber = portnumber;
this.username = username;
this.password = password;
this.dBorSIDName = dBorSIDName;
this.tablename = tablename;
}
public void generateRDF(VWorkspace vWorkspace, PrintWriter pw, Model model)
throws IOException, JSONException, KarmaException, SQLException, ClassNotFoundException {
System.out.println("Generating RDF...");
RepFactory factory = vWorkspace.getRepFactory();
Workspace workspace = vWorkspace.getWorkspace();
AbstractJDBCUtil dbUtil = JDBCUtilFactory.getInstance(dbType);
Connection conn = dbUtil.getConnection(hostname, portnumber, username, password, dBorSIDName);
String query = "Select * FROM " + tablename;
java.sql.Statement stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(DATABASE_TABLE_FETCH_SIZE);
ResultSet r = stmt.executeQuery(query);
ResultSetMetaData meta = r.getMetaData();;
// Get the column names
ArrayList<String> columnNames = dbUtil.getColumnNames(tablename, conn);
// Prepare required Karma objects
Worksheet wk = factory.createWorksheet(tablename, workspace);
ArrayList<String> headersList = addHeaders(wk, columnNames, factory);
vWorkspace.addAllWorksheets();
VWorksheet vWorksheet = vWorkspace.getVWorksheet(wk.getId());
int counter = 0;
while (r.next()) {
// Generate RDF and create a new worksheet for every DATABASE_TABLE_FETCH_SIZE rows
if(counter%DATABASE_TABLE_FETCH_SIZE == 0 && counter != 0) {
generateRDFFromWorksheet(vWorksheet, wk, vWorkspace, model, pw);
System.out.println("Done for " + counter + " rows ..." );
wk = factory.createWorksheet(tablename, workspace);
headersList = addHeaders(wk, columnNames, factory);
vWorkspace.addAllWorksheets();
vWorksheet = vWorkspace.getVWorksheet(wk.getId());
}
/** Add the data **/
Table dataTable = wk.getDataTable();
Row row = dataTable.addRow(factory);
for (int i = 1; i <= meta.getColumnCount(); i++) {
String val = r.getString(i);
row.setValue(headersList.get(i-1), val, factory);
}
counter++;
}
generateRDFFromWorksheet(vWorksheet, wk, vWorkspace, model, pw);
// Releasing all the resources
r.close();
conn.close();
stmt.close();
System.out.println("done");
}
private void generateRDFFromWorksheet(VWorksheet vw, Worksheet wk,
VWorkspace vWorkspace, Model model, PrintWriter pw)
throws IOException, JSONException, KarmaException {
Workspace workspace = vWorkspace.getWorkspace();
// Generate RDF for the remaining rows
WorksheetR2RMLJenaModelParser parserTest = new WorksheetR2RMLJenaModelParser(
vw, vWorkspace, model, tablename);
// Gets all the errors generated during the RDF generation
ErrorReport errorReport = new ErrorReport();
// RDF generation object initialization
KR2RMLWorksheetRDFGenerator rdfGen = new KR2RMLWorksheetRDFGenerator(wk,
workspace.getFactory(), workspace.getOntologyManager(), pw,
parserTest.getAuxInfo(), errorReport, false);
// Generate the rdf
rdfGen.generateRDF(false);
}
private ArrayList<String> addHeaders (Worksheet wk, ArrayList<String> columnNames,
RepFactory factory) {
HTable headers = wk.getHeaders();
ArrayList<String> headersList = new ArrayList<String>();
for(int i=0; i< columnNames.size(); i++){
HNode hNode = null;
hNode = headers.addHNode(columnNames.get(i), wk, factory);
headersList.add(hNode.getId());
}
return headersList;
}
}