/*
* � Copyright IBM Corp. 2010
*
* 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.
*/
package com.ibm.xsp.extlib.relational.jdbc.model;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.faces.FacesException;
import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;
import javax.faces.model.DataModel;
import com.ibm.commons.util.StringUtil;
import com.ibm.xsp.extlib.model.DataAccessorBlockSource;
import com.ibm.xsp.extlib.relational.util.JdbcUtil;
import com.ibm.xsp.model.TabularDataSource;
import com.ibm.xsp.util.StateHolderUtil;
/**
* Data source used to access JDBC enabled databases.
* @author Philippe Riand
*/
public class JdbcDataSource extends DataAccessorBlockSource implements TabularDataSource {
// Service access
private String connectionManager;
private String connectionName;
private String connectionUrl;
private String sqlFile;
private String sqlCountFile;
private String sqlQuery;
private String sqlCountQuery;
private String sqlTable;
private Boolean calculateCount;
private List<SqlParameter> sqlParameters;
private String defaultOrderBy;
public JdbcDataSource() {
}
@Override
protected JdbcDataBlockAccessor createAccessor() {
return new JdbcDataBlockAccessor(this);
}
@Override
public DataModel getDataModel() {
return new JdbcDataAccessorModel(this,(Container)getDataContainer());
}
// PHIL: we assume the default id -> if the SQL change, the user must refresh the
// data source explicitly
// @Override
// protected String composeUniqueId() {
// String sq = getSqlQuery();
// if(StringUtil.isNotEmpty(sq)) {
// return sq;
// }
// String sf = getSqlFile();
// if(StringUtil.isNotEmpty(sf)) {
// return sf;
// }
// return super.composeUniqueId();
// }
public String getConnectionManager() {
if (null != connectionManager) {
return connectionManager;
}
ValueBinding valueBinding = getValueBinding("connectionManager"); // $NON-NLS-1$
if (valueBinding != null) {
String value = (String)valueBinding.getValue(getFacesContext());
return value;
}
return null;
}
public void setConnectionManager(String connectionManager) {
this.connectionManager = connectionManager;
}
public String getConnectionName() {
if (null != connectionName) {
return connectionName;
}
ValueBinding valueBinding = getValueBinding("connectionName"); // $NON-NLS-1$
if (valueBinding != null) {
String value = (String)valueBinding.getValue(getFacesContext());
return value;
}
return null;
}
public void setConnectionName(String connectionName) {
this.connectionName = connectionName;
}
public String getConnectionUrl() {
if (null != connectionUrl) {
return connectionUrl;
}
ValueBinding valueBinding = getValueBinding("connectionUrl"); // $NON-NLS-1$
if (valueBinding != null) {
String value = (String)valueBinding.getValue(getFacesContext());
return value;
}
return null;
}
public void setConnectionUrl(String connectionUrl) {
this.connectionUrl = connectionUrl;
}
public String getSqlFile() {
if (null != sqlFile) {
return sqlFile;
}
ValueBinding valueBinding = getValueBinding("sqlFile"); // $NON-NLS-1$
if (valueBinding != null) {
String value = (String)valueBinding.getValue(getFacesContext());
return value;
}
return null;
}
public void setSqlFile(String sqlFile) {
this.sqlFile = sqlFile;
}
public String getSqlCountFile() {
if (null != sqlCountFile) {
return sqlCountFile;
}
ValueBinding valueBinding = getValueBinding("sqlCountFile"); // $NON-NLS-1$
if (valueBinding != null) {
String value = (String)valueBinding.getValue(getFacesContext());
return value;
}
return null;
}
public void setSqlCountFile(String sqlCountFile) {
this.sqlCountFile = sqlCountFile;
}
public String getSqlQuery() {
if (null != sqlQuery) {
return sqlQuery;
}
ValueBinding valueBinding = getValueBinding("sqlQuery"); // $NON-NLS-1$
if (valueBinding != null) {
String value = (String)valueBinding.getValue(getFacesContext());
return value;
}
return null;
}
public void setSqlQuery(String sqlQuery) {
this.sqlQuery = sqlQuery;
}
public String getSqlCountQuery() {
if (null != sqlCountQuery) {
return sqlCountQuery;
}
ValueBinding valueBinding = getValueBinding("sqlCountQuery"); // $NON-NLS-1$
if (valueBinding != null) {
String value = (String)valueBinding.getValue(getFacesContext());
return value;
}
return null;
}
public void setSqlCountQuery(String sqlQueryCount) {
this.sqlCountQuery = sqlQueryCount;
}
public String getSqlTable() {
if (null != sqlTable) {
return sqlTable;
}
ValueBinding valueBinding = getValueBinding("sqlTable"); // $NON-NLS-1$
if (valueBinding != null) {
String value = (String)valueBinding.getValue(getFacesContext());
return value;
}
return null;
}
public void setSqlTable(String sqlTable) {
this.sqlTable = sqlTable;
}
public List<SqlParameter> getSqlParameters() {
return this.sqlParameters;
}
public void addSqlParameter(SqlParameter attribute) {
if(sqlParameters==null) {
sqlParameters = new ArrayList<SqlParameter>();
}
sqlParameters.add(attribute);
}
public void setSqlParameters(List<SqlParameter> parameters) {
this.sqlParameters = parameters;
}
public String getDefaultOrderBy() {
if (null != defaultOrderBy) {
return defaultOrderBy;
}
ValueBinding valueBinding = getValueBinding("defaultOrderBy"); // $NON-NLS-1$
if (valueBinding != null) {
String value = (String)valueBinding.getValue(getFacesContext());
return value;
}
return null;
}
public void setDefaultOrderBy(String defaultOrderBy) {
this.defaultOrderBy = defaultOrderBy;
}
public boolean isCalculateCount() {
if (null != this.calculateCount) {
return this.calculateCount;
}
ValueBinding _vb = getValueBinding("calculateCount"); //$NON-NLS-1$
if (_vb != null) {
Boolean val = (java.lang.Boolean) _vb.getValue(FacesContext.getCurrentInstance());
if(val!=null) {
return val;
}
}
return false;
}
public void setCalculateCount(boolean calculateCount) {
this.calculateCount = calculateCount;
}
@Override
public Object saveState(FacesContext context) {
if (isTransient()) {
return null;
}
Object[] state = new Object[12];
state[0] = super.saveState(context);
state[1] = connectionManager;
state[2] = connectionName;
state[3] = connectionUrl;
state[4] = sqlFile;
state[5] = sqlCountFile;
state[6] = sqlQuery;
state[7] = sqlCountQuery;
state[8] = sqlTable;
state[9] = StateHolderUtil.saveList(context, sqlParameters);
state[10] = defaultOrderBy;
state[11] = calculateCount;
return state;
}
@Override
public void restoreState(FacesContext context, Object state) {
Object[] values = (Object[])state;
super.restoreState(context, values[0]);
this.connectionManager = (String)values[1];
this.connectionName = (String)values[2];
this.connectionUrl = (String)values[3];
this.sqlFile = (String)values[4];
this.sqlCountFile = (String)values[5];
this.sqlQuery = (String)values[6];
this.sqlCountQuery = (String)values[7];
this.sqlTable = (String)values[8];
this.sqlParameters = StateHolderUtil.restoreList(context, getComponent(), values[9]);
this.defaultOrderBy = (String)values[10];
this.calculateCount = (Boolean)values[11];
}
// ===================================================================
// JDBC related methods
// ===================================================================
public String findSqlQuery() {
// Look for a table name first
String tableName = getSqlTable();
if(StringUtil.isNotEmpty(tableName)) {
return StringUtil.format("SELECT * FROM {0}", tableName); // $NON-NLS-1$
}
// Look for the sql query property
String sql = getSqlQuery();
if(StringUtil.isNotEmpty(sql)) {
return sql;
}
// Then look for a resource
return JdbcUtil.readSqlFile(getSqlFile());
}
public String findSqlCountQuery(String sqlQuery) {
try {
// Look for a specific query count
String queryCount = getSqlCountQuery();
if(StringUtil.isNotEmpty(queryCount)) {
return queryCount;
}
// Look for a resource if specified
String queryCountFile = getSqlCountFile();
if(StringUtil.isNotEmpty(queryCountFile)) {
return JdbcUtil.readSqlFile(queryCountFile);
}
// Ok, try to compose it dynamically from the query
return JdbcUtil.getCountQuery(sqlQuery);
} catch(SQLException ex) {
throw new FacesException(ex);
}
}
}