/**
SpagoBI, the Open Source Business Intelligence suite
Copyright (C) 2012 Engineering Ingegneria Informatica S.p.A. - SpagoBI Competency Center
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this file,
You can obtain one at http://mozilla.org/MPL/2.0/.
**/
package it.eng.spagobi.studio.oda.impl;
import it.eng.spagobi.sdk.datasets.bo.SDKDataSet;
import it.eng.spagobi.sdk.datasets.bo.SDKDataSetParameter;
import it.eng.spagobi.sdk.datasets.bo.SDKDataStoreMetadata;
import it.eng.spagobi.sdk.exceptions.NotAllowedOperationException;
import it.eng.spagobi.sdk.proxy.DataSetsSDKServiceProxy;
import it.eng.spagobi.server.services.api.bo.IDataSet;
import it.eng.spagobi.server.services.api.bo.IDataSetParameter;
import it.eng.spagobi.server.services.api.bo.IDataStoreMetadata;
import it.eng.spagobi.studio.utils.bo.DataStoreMetadata;
import it.eng.spagobi.studio.utils.bo.Dataset;
import it.eng.spagobi.studio.utils.bo.DatasetParameter;
import it.eng.spagobi.studio.utils.services.serverobjects.ServerDatasets;
import it.eng.spagobi.tools.dataset.common.datareader.JSONDataReader;
import it.eng.spagobi.tools.dataset.common.datareader.XmlDataReader;
import it.eng.spagobi.tools.dataset.common.datastore.IDataStore;
import java.math.BigDecimal;
import java.rmi.RemoteException;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;
import org.eclipse.datatools.connectivity.oda.IParameterMetaData;
import org.eclipse.datatools.connectivity.oda.IQuery;
import org.eclipse.datatools.connectivity.oda.IResultSet;
import org.eclipse.datatools.connectivity.oda.IResultSetMetaData;
import org.eclipse.datatools.connectivity.oda.OdaException;
import org.eclipse.datatools.connectivity.oda.SortSpec;
import org.eclipse.datatools.connectivity.oda.spec.QuerySpecification;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Implementation class of IQuery for an ODA runtime driver.
* <br>
* For demo purpose, the auto-generated method stubs have
* hard-coded implementation that returns a pre-defined set
* of meta-data and query results.
* A custom ODA driver is expected to implement own data source specific
* behavior in its place.
*/
public class Query implements IQuery
{
int maxRows;
String queryString;
Map<String, Integer> parameterNamesToIndexMap;
ServerDatasets dataSetServiceProxy;
Dataset dataSetMeta;
IDataSetParameter[] dataSetParametersMeta;
IDataStoreMetadata dataStoreMeta;
private static Logger logger = LoggerFactory.getLogger(Query.class);
public Query(ServerDatasets dataSetServiceProxy) {
this.maxRows = -1;
this.queryString = null;
this.parameterNamesToIndexMap = new HashMap<String, Integer>();
this.dataSetServiceProxy = dataSetServiceProxy;
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#prepare(java.lang.String)
*/
public void prepare( String queryText ) throws OdaException
{
logger.debug("IN");
try {
logger.debug("Prepare query for dataset [" + queryText + "]");
if(queryText == null || queryText.trim().length() == 0) {
throw new RuntimeException("Query cannot be null or empty");
}
this.queryString = queryText;
logger.debug("Retriving dataset list from spagobi server...");
Vector<IDataSet> datasets = null;
try {
datasets = dataSetServiceProxy.getAllDatasets();
} catch(Throwable t) {
throw new RuntimeException("Impossible to retrive spagobi's dataset list", t);
}
logger.debug("Dataset list from spagobi server retrieved succesfully");
logger.debug("Look up dataset list for [" + queryText + "]");
dataSetMeta = null;
try {
for(int i =0; i<datasets.size(); i++){
Dataset datsSet = (Dataset)datasets.get(i);
if(queryText.equals(datsSet.getLabel())){
dataSetMeta = datsSet;
break;
}
}
} catch (Throwable t) {
throw new RuntimeException("Impossible to retrive store metadata for dataset [" + dataSetMeta.getName() + "]", t);
}
if(dataSetMeta == null) {
throw new RuntimeException("Impssible to find on server a dataset named [" + queryText + "]");
}
logger.debug("Dataset [" + queryText + "] succesfully found");
logger.debug("Retrieving data store meta for dataset [" + queryText + "]...");
dataStoreMeta = null;
try {
dataStoreMeta = dataSetServiceProxy.getDataStoreMetadata(dataSetMeta.getId());
if(dataStoreMeta == null) {
throw new RuntimeException("Bad server response [null] for service [getDataStoreMetadata]");
}
} catch(Throwable t) {
throw new RuntimeException("Impossible to retrive store metadata for dataset [" + dataSetMeta.getName() + "]", t);
}
logger.debug("Data store meta for dataset [" + queryText + "] retrieved succesfully");
logger.debug("Parsing dataset's parameters meta for dataset[" + queryText + "]...");
dataSetParametersMeta = dataSetMeta.getParameters();
if(dataSetParametersMeta != null) {
for(int i = 0; i < dataSetParametersMeta.length; i++) {
parameterNamesToIndexMap.put(dataSetParametersMeta[i].getName(), new Integer(i+1));
}
}
logger.debug("Dataset's parameters meta for dataset[" + queryText + "] parsed succesfully");
logger.debug("Query for dataset [" + queryText + "] prepared successfully");
} catch (Exception t) {
throw (OdaException) new OdaException("Impossible to prepare query [" + queryText +"]").initCause(t);
} finally {
logger.debug("OUT");
}
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#setAppContext(java.lang.Object)
*/
public void setAppContext( Object context ) throws OdaException
{
// do nothing; assumes no support for pass-through context
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#close()
*/
public void close() throws OdaException
{
dataSetServiceProxy = null;
dataStoreMeta = null;
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#getMetaData()
*/
public IResultSetMetaData getMetaData() throws OdaException
{
return new ResultSetMetaData( dataStoreMeta );
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#executeQuery()
*/
public IResultSet executeQuery() throws OdaException
{
String result;
IDataStore dataStore;
logger.debug("IN");
try {
for(int i = 0; i < dataSetParametersMeta.length; i++) {
String name = dataSetParametersMeta[i].getName();
String value = dataSetParametersMeta[i].getValues() != null ? dataSetParametersMeta[i].getValues()[0]: "NULL";
//System.err.println("Input parameter [" + name + "] is equal to [" + value + "]");
}
result = dataSetServiceProxy.executeDataSet( dataSetMeta.getLabel(), dataSetParametersMeta );
} catch (Throwable t) {
throw (OdaException) new OdaException("Impossible to execute dataset [" + dataSetMeta.getLabel() + "]").initCause(t);
}
dataStore = null;
try {
//XmlDataReader dataReader = new XmlDataReader();
JSONDataReader dataReader = new JSONDataReader ();
dataStore = dataReader.read( result );
} catch (Throwable t) {
throw (OdaException) new OdaException("Impossible to parse resultset [" + result + "]").initCause(t);
}
logger.debug("OUT");
return new ResultSet( dataStore, dataStoreMeta );
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#setProperty(java.lang.String, java.lang.String)
*/
public void setProperty( String name, String value ) throws OdaException
{
// do nothing; assumes no data set query property
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#setMaxRows(int)
*/
public void setMaxRows( int max ) throws OdaException
{
maxRows = max;
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#getMaxRows()
*/
public int getMaxRows() throws OdaException
{
return maxRows;
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#clearInParameters()
*/
public void clearInParameters() throws OdaException
{
for(int i = 0; i < dataSetParametersMeta.length; i++) {
dataSetParametersMeta[i].setValues(new String[]{""});
}
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#setInt(java.lang.String, int)
*/
public void setInt( String parameterName, int value ) throws OdaException
{
setInt ( findInParameter( parameterName ), value);
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#setInt(int, int)
*/
public void setInt( int parameterId, int value ) throws OdaException
{
//System.err.println("Paraeter [" + dataSetParametersMeta[parameterId-1].getName() + "] is equal to [" + value + "]");
dataSetParametersMeta[parameterId-1].setValues(new String[]{"" + value});
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#setDouble(java.lang.String, double)
*/
public void setDouble( String parameterName, double value ) throws OdaException
{
setDouble ( findInParameter( parameterName ), value);
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#setDouble(int, double)
*/
public void setDouble( int parameterId, double value ) throws OdaException
{
//System.err.println("Paraeter [" + dataSetParametersMeta[parameterId-1].getName() + "] is equal to [" + value + "]");
dataSetParametersMeta[parameterId-1].setValues(new String[]{"" + value});
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#setBigDecimal(java.lang.String, java.math.BigDecimal)
*/
public void setBigDecimal( String parameterName, BigDecimal value ) throws OdaException
{
setBigDecimal ( findInParameter( parameterName ), value);
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#setBigDecimal(int, java.math.BigDecimal)
*/
public void setBigDecimal( int parameterId, BigDecimal value ) throws OdaException
{
//System.err.println("Paraeter [" + dataSetParametersMeta[parameterId-1].getName() + "] is equal to [" + value + "]");
dataSetParametersMeta[parameterId-1].setValues(new String[]{"" + value});
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#setString(java.lang.String, java.lang.String)
*/
public void setString( String parameterName, String value ) throws OdaException
{
//System.err.println("Paraeter [" + parameterName + "] is equal to [" + value + "]");
setString ( findInParameter( parameterName ), value);
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#setString(int, java.lang.String)
*/
public void setString( int parameterId, String value ) throws OdaException
{
//System.err.println("Paraeter [" + dataSetParametersMeta[parameterId-1].getName() + "] is equal to [" + value + "]");
dataSetParametersMeta[parameterId-1].setValues(new String[]{"" + value});
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#setDate(java.lang.String, java.sql.Date)
*/
public void setDate( String parameterName, Date value ) throws OdaException
{
setDate ( findInParameter( parameterName ), value);
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#setDate(int, java.sql.Date)
*/
public void setDate( int parameterId, Date value ) throws OdaException
{
dataSetParametersMeta[parameterId-1].setValues(new String[]{"" + value});
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#setTime(java.lang.String, java.sql.Time)
*/
public void setTime( String parameterName, Time value ) throws OdaException
{
setTime ( findInParameter( parameterName ), value);
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#setTime(int, java.sql.Time)
*/
public void setTime( int parameterId, Time value ) throws OdaException
{
dataSetParametersMeta[parameterId-1].setValues(new String[]{"" + value});
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#setTimestamp(java.lang.String, java.sql.Timestamp)
*/
public void setTimestamp( String parameterName, Timestamp value ) throws OdaException
{
setTimestamp ( findInParameter( parameterName ), value);
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#setTimestamp(int, java.sql.Timestamp)
*/
public void setTimestamp( int parameterId, Timestamp value ) throws OdaException
{
dataSetParametersMeta[parameterId-1].setValues(new String[]{"" + value});
}
/* (non-Javadoc)
* @see org.eclipse.datatools.connectivity.oda.IQuery#setBoolean(java.lang.String, boolean)
*/
public void setBoolean( String parameterName, boolean value )
throws OdaException
{
setBoolean ( findInParameter( parameterName ), value);
}
/* (non-Javadoc)
* @see org.eclipse.datatools.connectivity.oda.IQuery#setBoolean(int, boolean)
*/
public void setBoolean( int parameterId, boolean value )
throws OdaException
{
dataSetParametersMeta[parameterId-1].setValues(new String[]{"" + value});
}
/* (non-Javadoc)
* @see org.eclipse.datatools.connectivity.oda.IQuery#setNull(java.lang.String)
*/
public void setNull( String parameterName ) throws OdaException
{
setNull ( findInParameter( parameterName ));
}
/* (non-Javadoc)
* @see org.eclipse.datatools.connectivity.oda.IQuery#setNull(int)
*/
public void setNull( int parameterId ) throws OdaException
{
dataSetParametersMeta[parameterId-1].setValues(new String[]{""});
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#findInParameter(java.lang.String)
*/
public int findInParameter( String parameterName ) throws OdaException
{
Integer index = parameterNamesToIndexMap.get(parameterName);
return index != null? index.intValue(): -1;
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#getParameterMetaData()
*/
public IParameterMetaData getParameterMetaData() throws OdaException
{
return new ParameterMetaData(dataSetParametersMeta);
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#setSortSpec(org.eclipse.datatools.connectivity.oda.SortSpec)
*/
public void setSortSpec( SortSpec sortBy ) throws OdaException
{
throw new UnsupportedOperationException();
}
/*
* @see org.eclipse.datatools.connectivity.oda.IQuery#getSortSpec()
*/
public SortSpec getSortSpec() throws OdaException
{
return null;
}
@Override
public void cancel() throws OdaException, UnsupportedOperationException {
// TODO Auto-generated method stub
}
@Override
public String getEffectiveQueryText() {
// TODO Auto-generated method stub
return null;
}
@Override
public QuerySpecification getSpecification() {
// TODO Auto-generated method stub
return null;
}
@Override
public void setObject(String arg0, Object arg1) throws OdaException {
// TODO Auto-generated method stub
}
@Override
public void setObject(int arg0, Object arg1) throws OdaException {
// TODO Auto-generated method stub
}
@Override
public void setSpecification(QuerySpecification arg0) throws OdaException,
UnsupportedOperationException {
// TODO Auto-generated method stub
}
}