blob: 625642f092748a8ca7a82355d3262d2f84a9b95e [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.sun.star.report;
import com.sun.star.beans.UnknownPropertyException;
import com.sun.star.beans.XPropertySet;
import com.sun.star.container.XIndexAccess;
import com.sun.star.container.XNameAccess;
import com.sun.star.lang.IndexOutOfBoundsException;
import com.sun.star.lang.WrappedTargetException;
import com.sun.star.sdb.XParametersSupplier;
import com.sun.star.sdbc.DataType;
import com.sun.star.sdbc.SQLException;
import com.sun.star.sdbc.XResultSetMetaData;
import com.sun.star.sdbc.XResultSetMetaDataSupplier;
import com.sun.star.sdbc.XRow;
import com.sun.star.sdbc.XRowSet;
import com.sun.star.sdbcx.XColumnsSupplier;
import com.sun.star.uno.Any;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.util.DateTime;
import com.sun.star.util.Time;
import java.sql.Timestamp;
public class SDBCReportData implements DataSource
{
private final XRowSet rowSet;
private final XRow row;
private int rowCount;
private XIndexAccess parameters;
private int firstParameterIndex = -1;
private int columnCount;
private final String[] columnNames;
private final int[] columnTypes;
public SDBCReportData(final XRowSet rowSet) throws SQLException
{
row = (XRow) UnoRuntime.queryInterface(XRow.class, rowSet);
this.rowSet = rowSet;
if (rowSet == null)
{
rowCount = 0;
columnCount = 0;
columnTypes = new int[1];
columnNames = new String[1];
}
else
{
final XParametersSupplier xSuppParams = (XParametersSupplier) UnoRuntime.queryInterface(
XParametersSupplier.class, rowSet);
if (xSuppParams != null)
{
parameters = xSuppParams.getParameters();
}
final XColumnsSupplier columnsSup = (XColumnsSupplier) UnoRuntime.queryInterface(XColumnsSupplier.class, rowSet);
final XNameAccess columns = columnsSup.getColumns();
final String[] columnNamesList = columns.getElementNames();
final XResultSetMetaDataSupplier sup = (XResultSetMetaDataSupplier) UnoRuntime.queryInterface(XResultSetMetaDataSupplier.class, rowSet);
final XResultSetMetaData resultSetMetaData = sup.getMetaData();
columnCount = resultSetMetaData.getColumnCount();
firstParameterIndex = columnCount + 1;
if (parameters != null)
{
columnCount += parameters.getCount();
}
columnTypes = new int[columnCount];
columnNames = new String[columnCount];
for (int i = 1; i <= columnCount; ++i)
{
if (i < firstParameterIndex)
{
columnNames[i - 1] = columnNamesList[i - 1];// resultSetMetaData.getColumnName(i);
columnTypes[i - 1] = resultSetMetaData.getColumnType(i);
}
else
{
try
{
final XPropertySet paramColumn = (XPropertySet) UnoRuntime.queryInterface(
XPropertySet.class, parameters.getByIndex(i - firstParameterIndex));
columnNames[i - 1] = (String) paramColumn.getPropertyValue("Name");
columnTypes[i - 1] = (Integer) paramColumn.getPropertyValue("Type");
}
catch (Exception e)
{
columnNames[i - 1] = "Error";
columnTypes[i - 1] = DataType.CHAR;
}
}
}
if (rowSet.last())
{
rowCount = rowSet.getRow();
rowSet.beforeFirst();
}
else
{
rowCount = 0;
}
}
}
public int getColumnCount() throws DataSourceException
{
return columnCount;
}
public int getRowCount()
{
return rowCount;
}
public String getColumnName(final int column) throws DataSourceException
{
return columnNames[column - 1];
}
public boolean absolute(final int row) throws DataSourceException
{
if (rowSet == null)
{
return false;
}
try
{
if (row == 0)
{
rowSet.beforeFirst();
return true;
}
return rowSet.absolute(row);
}
catch (SQLException e)
{
throw new DataSourceException(e.getMessage(), e);
}
}
public boolean next() throws DataSourceException
{
if (rowSet == null)
{
return false;
}
try
{
return rowSet.next();
}
catch (SQLException e)
{
throw new DataSourceException(e.getMessage(), e);
}
}
public void close() throws DataSourceException
{
}
// public int getCurrentRow() throws DataSourceException
// {
// try
// {
// return rowSet.getRow();
// }
// catch (SQLException e)
// {
// throw new DataSourceException(e.getMessage(), e);
// }
// }
static private java.sql.Date getDate(final Object obj)
{
final java.sql.Date date;
if (obj instanceof com.sun.star.util.Date)
{
final com.sun.star.util.Date unodate = (com.sun.star.util.Date) obj;
date = java.sql.Date.valueOf(getDateString(unodate.Year, unodate.Month, unodate.Day).toString());
}
else
{
date = null;
}
return date;
}
private static StringBuffer getTimeString(final int hours, final int minutes, final int seconds)
{
final StringBuffer timeString = new StringBuffer();
if (hours < 10)
{
timeString.append('0');
}
timeString.append(hours);
timeString.append(':');
if (minutes < 10)
{
timeString.append('0');
}
timeString.append(minutes);
timeString.append(':');
if (seconds < 10)
{
timeString.append('0');
}
timeString.append(seconds);
return timeString;
}
static private StringBuffer getDateString(final int years, final int months, final int days)
{
final StringBuffer str = new StringBuffer();
str.append(years);
final StringBuffer str2 = new StringBuffer("0000");
str2.delete(0, str.length());
str.insert(0, str2);
str.append('-');
if (months < 10)
{
str.append('0');
}
str.append(months);
str.append('-');
if (days < 10)
{
str.append('0');
}
str.append(days);
return str;
}
static private java.sql.Time getTime(final Object obj)
{
final java.sql.Time time;
if (obj instanceof Time)
{
final Time unoTime = (Time) obj;
time = java.sql.Time.valueOf(getTimeString(unoTime.Hours, unoTime.Minutes, unoTime.Seconds).toString());
}
else
{
time = null;
}
return time;
}
static private Timestamp getTimestamp(final Object obj)
{
final Timestamp ts;
if (obj instanceof DateTime)
{
final DateTime unoTs = (DateTime) obj;
final StringBuffer str = getDateString(unoTs.Year, unoTs.Month, unoTs.Day);
str.append(' ');
str.append(getTimeString(unoTs.Hours, unoTs.Minutes, unoTs.Seconds));
str.append('.');
str.append(unoTs.HundredthSeconds);
ts = java.sql.Timestamp.valueOf(str.toString());
}
else
{
ts = null;
}
return ts;
}
public Object getObject(final int column) throws DataSourceException
{
if (rowSet == null)
{
return null;
}
try
{
final boolean isParameterValue = (parameters != null) && (column >= firstParameterIndex);
Object obj;
final boolean wasNull;
if (isParameterValue)
{
final XPropertySet paramCol = (XPropertySet) UnoRuntime.queryInterface(
XPropertySet.class, parameters.getByIndex(column - firstParameterIndex));
obj = paramCol.getPropertyValue("Value");
wasNull = obj == null;
}
else
{
obj = row.getObject(column, null);
wasNull = row.wasNull();
}
if (wasNull)
{
obj = null;
}
else
{
obj = convertObject(columnTypes[column - 1], obj);
}
return obj;
}
catch (SQLException ex)
{
throw new DataSourceException(ex.getMessage(), ex);
}
catch (UnknownPropertyException ex)
{
throw new DataSourceException(ex.getMessage(), ex);
}
catch (IndexOutOfBoundsException ex)
{
throw new DataSourceException(ex.getMessage(), ex);
}
catch (WrappedTargetException ex)
{
throw new DataSourceException(ex.getMessage(), ex);
}
}
private Object convertObject(final int type, final Object obj)
{
Object ret;
switch (type)
{
case DataType.DATE:
ret = getDate(obj);
break;
case DataType.TIME:
ret = getTime(obj);
break;
case DataType.TIMESTAMP:
ret = getTimestamp(obj);
break;
case DataType.DECIMAL:
case DataType.NUMERIC:
if (!(obj instanceof Any))
{
try
{
ret = new java.math.BigDecimal(String.valueOf(obj));
}
catch (NumberFormatException ex)
{
ret = obj;
}
}
else
{
ret = obj;
}
break;
default:
ret = obj;
break;
}
return ret;
}
}