/*******************************************************************************
* Copyright (c) 2010-2011 VIVO Harvester Team. For full list of contributors, please see the AUTHORS file provided.
* All rights reserved.
* This program and the accompanying materials are made available under the terms of the new BSD license which accompanies this distribution, and is available at http://www.opensource.org/licenses/bsd-license.html
******************************************************************************/
package org.vivoweb.harvester.util.repo;
import java.io.IOException;
import java.sql.Connection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.vivoweb.harvester.util.IterableAdaptor;
import com.hp.hpl.jena.db.DBConnection;
import com.hp.hpl.jena.db.GraphRDB;
import com.hp.hpl.jena.db.IDBConnection;
import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.ModelMaker;
import com.hp.hpl.jena.sparql.core.DataSourceImpl;
/**
* Connection Helper for RDB Jena Models
* @author Christopher Haines (hainesc@ctrip.ufl.edu)
*/
public class RDBJenaConnect extends DBJenaConnect {
/**
* SLF4J Logger
*/
private static Logger log = LoggerFactory.getLogger(RDBJenaConnect.class);
/**
* The jdbc connection
*/
private IDBConnection conn;
/**
* Constructor (Default Model)
* @param dbUrl jdbc connection url
* @param dbUser username to use
* @param dbPass password to use
* @param dbType database type ex:"MySQL"
* @param dbClass jdbc driver class
* @throws IOException error connecting
*/
public RDBJenaConnect(String dbUrl, String dbUser, String dbPass, String dbType, String dbClass) throws IOException {
this(dbUrl, dbUser, dbPass, dbType, dbClass, null);
}
/**
* Constructor (Named Model)
* @param dbUrl jdbc connection url
* @param dbUser username to use
* @param dbPass password to use
* @param dbType database type ex:"MySQL"
* @param dbClass jdbc driver class
* @param modelName the model to connect to
* @throws IOException error connecting
*/
public RDBJenaConnect(String dbUrl, String dbUser, String dbPass, String dbType, String dbClass, String modelName) throws IOException {
super(dbUrl, dbUser, dbPass, dbType, dbClass);
this.conn = initDB(buildConnection(), getDbType());
init(modelName);
}
/**
* Clone Constructor
* @param original the original to clone
* @param modelName the modelname to connect to
* @throws IOException error creating connection
*/
private RDBJenaConnect(RDBJenaConnect original, String modelName) throws IOException {
super(original);
this.conn = initDB(buildConnection(), getDbType());
init(modelName);
}
/**
* Constructor (connects to existing connection, using a specified named model)
* @param modelName the model name to use
*/
private void init(String modelName) {
if(modelName != null) {
setModelName(modelName);
setJenaModel(initModel(this.conn).openModel(modelName, false));
} else {
setModelName(GraphRDB.DEFAULT);
setJenaModel(initModel(this.conn).createDefaultModel());
}
}
@Override
public void close() {
super.close();
getJenaModel().close();
try {
this.conn.close();
} catch(Exception e) {
// ignore
}
}
@Override
public JenaConnect neighborConnectClone(String modelName) throws IOException {
return new RDBJenaConnect(this, modelName);
}
/**
* Get Model for a database connection
* @param dbConn the database connection
* @return the Model
*/
private ModelMaker initModel(IDBConnection dbConn) {
this.conn = dbConn;
return ModelFactory.createModelRDBMaker(dbConn);
}
/**
* Setup database connection
* @param conn JDBC connection
* @param dbType database type
* @return the database connection
*/
private static IDBConnection initDB(Connection conn, String dbType) {
return new DBConnection(conn, dbType);
}
@Override
public Dataset getDataset() throws IOException {
DataSourceImpl ds = new DataSourceImpl(getJenaModel());
for(String name : IterableAdaptor.adapt(this.conn.getAllModelNames())) {
ds.addNamedModel(name, neighborConnectClone(name).getJenaModel());
}
return ds;
}
@Override
public void printParameters() {
super.printParameters();
log.trace("type: 'rdb'");
}
}