package edu.harvard.i2b2.crc.dao;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import edu.harvard.i2b2.common.exception.I2B2Exception;
import edu.harvard.i2b2.crc.datavo.db.DataSourceLookup;
public class DataSourceLookupHelper {
/** log **/
protected final static Log log = LogFactory
.getLog(DataSourceLookupHelper.class);
private DataSourceLookupDAO dsLookupDao = null;
public DataSourceLookupHelper() throws I2B2Exception {
dsLookupDao = DataSourceLookupDAOFactory.getDataSourceLookupDAO();
}
public DataSourceLookupDAO getLookupDAO() {
return dsLookupDao;
}
public DataSourceLookup matchDataSource(String hiveId, String projectId,
String ownerId) throws I2B2Exception {
DataSourceLookup matchedDataSourceLookup = null;
List<DataSourceLookup> dataSourceLookupList = null;
if (projectId == null) {
throw new I2B2Exception(
" Project id is null, could not perform datasource lookup for given domain["
+ hiveId + "] and owner[" + ownerId + "]");
}
if (projectId.equals("@")) {
matchedDataSourceLookup = matchHiveOwner(hiveId, ownerId);
return matchedDataSourceLookup;
}
// check if project id contains subprojects, if so then query by first
// level subproject
if (projectId.endsWith("/") == false) {
projectId += "/";
}
if (projectId.startsWith("/") == false) {
projectId = "/" + projectId;
}
String[] projectSplit = projectId.split("/");
String filterProjectId = "";
if (projectSplit.length > 2) {
filterProjectId = "/" + projectSplit[1] + "/" + projectSplit[2]
+ "/";
} else {
filterProjectId = "/" + projectSplit[1] + "/";
}
dataSourceLookupList = dsLookupDao.getDbLookupByHiveProjectOwner(
hiveId, filterProjectId, ownerId);
// if the project path with two level fails then try with one level
if (dataSourceLookupList.size() < 1) {
filterProjectId = "/" + projectSplit[1] + "/";
dataSourceLookupList = dsLookupDao.getDbLookupByHiveProjectOwner(
hiveId, filterProjectId, ownerId);
}
if (dataSourceLookupList.size() > 0) {
DataSourceLookup matchedDataSource = null;
int projectLevel = projectId.length();
boolean matchedFlag = false;
String parentProjectId = null;
while ((projectLevel = projectId.lastIndexOf('/', projectLevel)) > 0) {
parentProjectId = projectId.substring(0, projectLevel + 1);
log.debug("Trying with project id :" + parentProjectId);
matchedDataSource = match(parentProjectId, ownerId,
dataSourceLookupList);
if (matchedDataSource != null) {
matchedFlag = true;
break;
}
projectLevel = projectId.lastIndexOf('/', projectLevel - 1);
}
if (matchedFlag) {
if (ownerId.equalsIgnoreCase(matchedDataSource.getOwnerId())) {
log.info("Located DataSource for hiveId=[" + hiveId
+ "] projectId=[" + parentProjectId
+ "] and ownerId =[" + ownerId + "]");
} else {
log.info("Located DataSource for hiveId=[" + hiveId
+ "] projectId=[" + parentProjectId + "]");
}
return matchedDataSource;
} else {
log.info("Could not match Project id=[" + projectId
+ "] Trying with hive =" + hiveId);
matchedDataSourceLookup = matchHiveOwner(hiveId, ownerId);
return matchedDataSourceLookup;
}
} else {
log.info("Could not match Project id=[" + projectId
+ "] Trying with hive =" + hiveId);
matchedDataSourceLookup = matchHiveOwner(hiveId, ownerId);
return matchedDataSourceLookup;
}
}
private DataSourceLookup matchHiveOwner(String hiveId, String ownerId)
throws I2B2Exception {
DataSourceLookup matchedDataSourceLookup = null;
// check for hive and owner (userid or @)
List<DataSourceLookup> dataSourceLookupList = dsLookupDao
.getDbLookupByHiveOwner(hiveId, ownerId);
if (dataSourceLookupList.size() == 0) {
throw new I2B2Exception("Could not locate hive= " + hiveId);
} else if (dataSourceLookupList.size() > 0) {
boolean matchedFlag = false;
for (DataSourceLookup dsLookup : dataSourceLookupList) {
if (dsLookup.getOwnerId() != null
&& dsLookup.getOwnerId().equalsIgnoreCase(ownerId)) {
matchedDataSourceLookup = dsLookup;
matchedFlag = true;
break;
} else if (dsLookup.getOwnerId() != null
&& dsLookup.getOwnerId().equals("@")) {
matchedDataSourceLookup = dsLookup;
}
}
if (matchedFlag) {
log.info("Located Datasource matching hive=[" + hiveId
+ "] and owner=[" + ownerId + "]");
} else if (matchedDataSourceLookup != null) {
log.info("Located Datasource matching hive=[" + hiveId
+ " and owner =[@]");
} else {
throw new I2B2Exception(
"Could not locate Datasource matching hive=[" + hiveId
+ "] and owner=[" + ownerId + " or @]");
}
}
return matchedDataSourceLookup;
}
private DataSourceLookup match(String searchProjectId, String owner,
List<DataSourceLookup> dataSourceLookupList) {
DataSourceLookup matchedDataSource = null;
for (DataSourceLookup dataSourceLookup : dataSourceLookupList) {
String lookupProjectId = dataSourceLookup.getProjectPath();
String lookupOwnerId = dataSourceLookup.getOwnerId();
if (searchProjectId.equalsIgnoreCase(lookupProjectId)) {
matchedDataSource = dataSourceLookup;
if (owner.equalsIgnoreCase(lookupOwnerId)) {
break;
}
}
}
return matchedDataSource;
}
}