CWS-TOOLING: integrate CWS autorecovery
This commit is contained in:
@@ -207,7 +207,7 @@ public class SDBCReportDataFactory implements DataSourceFactory
|
||||
final Boolean escapeProcessing = (Boolean) parameters.get(ESCAPE_PROCESSING);
|
||||
final String filter = (String) parameters.get(UNO_FILTER);
|
||||
final Integer maxRows = (Integer) parameters.get("MaxRows");
|
||||
RowSetProperties rowSetProps = new RowSetProperties(escapeProcessing, commandType, command, filter, maxRows);
|
||||
final RowSetProperties rowSetProps = new RowSetProperties(escapeProcessing, commandType, command, filter, maxRows);
|
||||
|
||||
final Object[] p = createRowSet(rowSetProps, parameters);
|
||||
final XRowSet rowSet = (XRowSet) p[0];
|
||||
@@ -251,33 +251,35 @@ public class SDBCReportDataFactory implements DataSourceFactory
|
||||
final String quote = connection.getMetaData().getIdentifierQuoteString();
|
||||
final XComponent[] hold = new XComponent[1];
|
||||
final XNameAccess columns = getFieldsByCommandDescriptor(commandType, command, hold);
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
if (columns != null)
|
||||
{
|
||||
final Object[] pair = (Object[]) groupExpressions.get(i);
|
||||
String expression = (String) pair[0];
|
||||
|
||||
if (columns.hasByName(expression))
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
expression = quote + expression + quote;
|
||||
}
|
||||
expression = expression.trim(); // Trim away white spaces
|
||||
final Object[] pair = (Object[]) groupExpressions.get(i);
|
||||
String expression = (String) pair[0];
|
||||
|
||||
if (expression.length() > 0)
|
||||
{
|
||||
order.append(expression);
|
||||
if (order.length() > 0)
|
||||
if (!expression.startsWith(quote) && columns.hasByName(expression))
|
||||
{
|
||||
order.append(' ');
|
||||
expression = quote + expression + quote;
|
||||
}
|
||||
final String sorting = (String) pair[1];
|
||||
if (sorting == null || sorting.equals(OfficeToken.FALSE))
|
||||
expression = expression.trim(); // Trim away white spaces
|
||||
|
||||
if (expression.length() > 0)
|
||||
{
|
||||
order.append("DESC");
|
||||
}
|
||||
if ((i + 1) < count)
|
||||
{
|
||||
order.append(", ");
|
||||
order.append(expression);
|
||||
if (order.length() > 0)
|
||||
{
|
||||
order.append(' ');
|
||||
}
|
||||
final String sorting = (String) pair[1];
|
||||
if (sorting == null || sorting.equals(OfficeToken.FALSE))
|
||||
{
|
||||
order.append("DESC");
|
||||
}
|
||||
if ((i + 1) < count)
|
||||
{
|
||||
order.append(", ");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -293,7 +295,7 @@ public class SDBCReportDataFactory implements DataSourceFactory
|
||||
private XNameAccess getFieldsByCommandDescriptor(final int commandType, final String command, final XComponent[] out) throws SQLException
|
||||
{
|
||||
final Class[] parameter = new Class[3];
|
||||
parameter[0] = Integer.class;
|
||||
parameter[0] = int.class;
|
||||
parameter[1] = String.class;
|
||||
parameter[2] = out.getClass();
|
||||
final XConnectionTools tools = (XConnectionTools) UnoRuntime.queryInterface(XConnectionTools.class, connection);
|
||||
@@ -306,171 +308,7 @@ public class SDBCReportDataFactory implements DataSourceFactory
|
||||
{
|
||||
}
|
||||
|
||||
XNameAccess xFields = null;
|
||||
// some kind of state machine to ease the sharing of code
|
||||
int eState = FAILED;
|
||||
switch (commandType)
|
||||
{
|
||||
case CommandType.TABLE:
|
||||
eState = HANDLE_TABLE;
|
||||
break;
|
||||
case CommandType.QUERY:
|
||||
eState = HANDLE_QUERY;
|
||||
break;
|
||||
case CommandType.COMMAND:
|
||||
eState = HANDLE_SQL;
|
||||
break;
|
||||
}
|
||||
|
||||
// needed in various states:
|
||||
XNameAccess xObjectCollection = null;
|
||||
XColumnsSupplier xSupplyColumns = null;
|
||||
|
||||
try
|
||||
{
|
||||
// go!
|
||||
while ((DONE != eState) && (FAILED != eState))
|
||||
{
|
||||
switch (eState)
|
||||
{
|
||||
case HANDLE_TABLE:
|
||||
{
|
||||
// initial state for handling the tables
|
||||
|
||||
// get the table objects
|
||||
final XTablesSupplier xSupplyTables = (XTablesSupplier) UnoRuntime.queryInterface(XTablesSupplier.class, connection);
|
||||
if (xSupplyTables != null)
|
||||
{
|
||||
xObjectCollection = xSupplyTables.getTables();
|
||||
// if something went wrong 'til here, then this will be handled in the next state
|
||||
|
||||
// next state: get the object
|
||||
}
|
||||
eState = RETRIEVE_OBJECT;
|
||||
}
|
||||
break;
|
||||
|
||||
case HANDLE_QUERY:
|
||||
{
|
||||
// initial state for handling the tables
|
||||
|
||||
// get the table objects
|
||||
final XQueriesSupplier xSupplyQueries = (XQueriesSupplier) UnoRuntime.queryInterface(XQueriesSupplier.class, connection);
|
||||
if (xSupplyQueries != null)
|
||||
{
|
||||
xObjectCollection = xSupplyQueries.getQueries();
|
||||
// if something went wrong 'til here, then this will be handled in the next state
|
||||
|
||||
// next state: get the object
|
||||
}
|
||||
eState = RETRIEVE_OBJECT;
|
||||
}
|
||||
break;
|
||||
|
||||
case RETRIEVE_OBJECT:
|
||||
// here we should have an object (aka query or table) collection, and are going
|
||||
// to retrieve the desired object
|
||||
|
||||
// next state: default to FAILED
|
||||
eState = FAILED;
|
||||
|
||||
if (xObjectCollection != null && xObjectCollection.hasByName(command))
|
||||
{
|
||||
xSupplyColumns = (XColumnsSupplier) UnoRuntime.queryInterface(XColumnsSupplier.class, xObjectCollection.getByName(command));
|
||||
|
||||
// next: go for the columns
|
||||
eState = RETRIEVE_COLUMNS;
|
||||
}
|
||||
break;
|
||||
|
||||
case RETRIEVE_COLUMNS:
|
||||
// next state: default to FAILED
|
||||
eState = FAILED;
|
||||
|
||||
if (xSupplyColumns != null)
|
||||
{
|
||||
xFields = xSupplyColumns.getColumns();
|
||||
// that's it
|
||||
eState = DONE;
|
||||
}
|
||||
break;
|
||||
|
||||
case HANDLE_SQL:
|
||||
{
|
||||
String sStatementToExecute = command;
|
||||
|
||||
// well, the main problem here is to handle statements which contain a parameter
|
||||
// If we would simply execute a parametrized statement, then this will fail because
|
||||
// we cannot supply any parameter values.
|
||||
// Thus, we try to analyze the statement, and to append a WHERE 0=1 filter criterion
|
||||
// This should cause every driver to not really execute the statement, but to return
|
||||
// an empty result set with the proper structure. We then can use this result set
|
||||
// to retrieve the columns.
|
||||
|
||||
try
|
||||
{
|
||||
final XMultiServiceFactory xComposerFac = (XMultiServiceFactory) UnoRuntime.queryInterface(XMultiServiceFactory.class, connection);
|
||||
|
||||
if (xComposerFac != null)
|
||||
{
|
||||
final XSingleSelectQueryComposer xComposer = (XSingleSelectQueryComposer) UnoRuntime.queryInterface(XSingleSelectQueryComposer.class, xComposerFac.createInstance("com.sun.star.sdb.SingleSelectQueryComposer"));
|
||||
if (xComposer != null)
|
||||
{
|
||||
xComposer.setQuery(sStatementToExecute);
|
||||
|
||||
// Now set the filter to a dummy restriction which will result in an empty
|
||||
// result set.
|
||||
xComposer.setFilter("0=1");
|
||||
|
||||
sStatementToExecute = xComposer.getQuery();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (com.sun.star.uno.Exception ex)
|
||||
{
|
||||
// silent this error, this was just a try. If we're here, we did not change sStatementToExecute,
|
||||
// so it will still be _rCommand, which then will be executed without being touched
|
||||
}
|
||||
|
||||
// now execute
|
||||
final XPreparedStatement xStatement = connection.prepareStatement(sStatementToExecute);
|
||||
// transfer ownership of this temporary object to the caller
|
||||
out[0] = (XComponent) UnoRuntime.queryInterface(XComponent.class, xStatement);
|
||||
|
||||
// set the "MaxRows" to 0. This is just in case our attempt to append a 0=1 filter
|
||||
// failed - in this case, the MaxRows restriction should at least ensure that there
|
||||
// is no data returned (which would be potentially expensive)
|
||||
final XPropertySet xStatementProps = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xStatement);
|
||||
try
|
||||
{
|
||||
if (xStatementProps != null)
|
||||
{
|
||||
xStatementProps.setPropertyValue("MaxRows", Integer.valueOf(0));
|
||||
}
|
||||
}
|
||||
catch (com.sun.star.uno.Exception ex)
|
||||
{
|
||||
// oh damn. Not much of a chance to recover, we will no retrieve the complete
|
||||
// full blown result set
|
||||
}
|
||||
|
||||
xSupplyColumns = (XColumnsSupplier) UnoRuntime.queryInterface(XColumnsSupplier.class, xStatement.executeQuery());
|
||||
// this should have given us a result set which does not contain any data, but
|
||||
// the structural information we need
|
||||
|
||||
// so the next state is to get the columns
|
||||
eState = RETRIEVE_COLUMNS;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
eState = FAILED;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (com.sun.star.uno.Exception ex)
|
||||
{
|
||||
}
|
||||
return xFields;
|
||||
throw new SQLException();
|
||||
}
|
||||
|
||||
private XSingleSelectQueryComposer getComposer(final XConnectionTools tools,
|
||||
@@ -501,61 +339,7 @@ public class SDBCReportDataFactory implements DataSourceFactory
|
||||
// should not happen
|
||||
// assert False
|
||||
}
|
||||
try
|
||||
{
|
||||
final XMultiServiceFactory factory = (XMultiServiceFactory) UnoRuntime.queryInterface(XMultiServiceFactory.class, connection);
|
||||
final XSingleSelectQueryComposer out = (XSingleSelectQueryComposer) UnoRuntime.queryInterface(XSingleSelectQueryComposer.class, factory.createInstance("com.sun.star.sdb.SingleSelectQueryAnalyzer"));
|
||||
final String quote = connection.getMetaData().getIdentifierQuoteString();
|
||||
String statement = command;
|
||||
switch (commandType)
|
||||
{
|
||||
case CommandType.TABLE:
|
||||
statement = "SELECT * FROM " + quote + command + quote;
|
||||
break;
|
||||
case CommandType.QUERY:
|
||||
{
|
||||
final XQueriesSupplier xSupplyQueries = (XQueriesSupplier) UnoRuntime.queryInterface(XQueriesSupplier.class, connection);
|
||||
final XNameAccess queries = xSupplyQueries.getQueries();
|
||||
if (queries.hasByName(command))
|
||||
{
|
||||
final XPropertySet prop = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, queries.getByName(command));
|
||||
final Boolean escape = (Boolean) prop.getPropertyValue(ESCAPEPROCESSING);
|
||||
if (escape)
|
||||
{
|
||||
statement = (String) prop.getPropertyValue(UNO_COMMAND);
|
||||
final XSingleSelectQueryComposer composer = getComposer(tools, statement, CommandType.COMMAND);
|
||||
if (composer != null)
|
||||
{
|
||||
final String order = (String) prop.getPropertyValue(UNO_ORDER);
|
||||
if (order != null && order.length() != 0)
|
||||
{
|
||||
composer.setOrder(order);
|
||||
}
|
||||
final Boolean applyFilter = (Boolean) prop.getPropertyValue(UNO_APPLY_FILTER);
|
||||
if (applyFilter)
|
||||
{
|
||||
final String filter = (String) prop.getPropertyValue(UNO_FILTER);
|
||||
if (filter != null && filter.length() != 0)
|
||||
{
|
||||
composer.setFilter(filter);
|
||||
}
|
||||
}
|
||||
statement = composer.getQuery();
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case CommandType.COMMAND:
|
||||
statement = command;
|
||||
break;
|
||||
}
|
||||
out.setElementaryQuery(statement);
|
||||
return out;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@@ -254,6 +254,11 @@ public class PentahoReportJob implements ReportJob
|
||||
if (parameters.length > 0)
|
||||
{
|
||||
String name = parameters[0].toString();
|
||||
if (parameters[0] instanceof ContextLookup)
|
||||
{
|
||||
final ContextLookup context = (ContextLookup) parameters[0];
|
||||
name = context.getName();
|
||||
}
|
||||
for (int j = 0; j < reportFunctions.length; j++)
|
||||
{
|
||||
if (reportFunctions[j] instanceof FormulaExpression)
|
||||
@@ -367,7 +372,7 @@ public class PentahoReportJob implements ReportJob
|
||||
catch (final Exception e)
|
||||
{
|
||||
String message = e.getMessage();
|
||||
if (message.length() == 0)
|
||||
if (message == null || message.length() == 0)
|
||||
{
|
||||
message = "Failed to process the report";
|
||||
}
|
||||
|
@@ -54,7 +54,7 @@ public class FormatValueUtility
|
||||
private static final String BOOLEAN_VALUE = "boolean-value";
|
||||
private static final String STRING_VALUE = "string-value";
|
||||
public static final String VALUE_TYPE = "value-type";
|
||||
private static final String VALUE = "value";
|
||||
public static final String VALUE = "value";
|
||||
private static SimpleDateFormat dateFormat;
|
||||
private static SimpleDateFormat timeFormat;
|
||||
|
||||
|
@@ -77,6 +77,10 @@ public class TableCellLayoutController extends SectionLayoutController
|
||||
{
|
||||
FormatValueUtility.applyValueForCell(value.getValue(), attributeMap, valueType);
|
||||
}
|
||||
else if ( "float".equals(valueType))
|
||||
{
|
||||
attributeMap.setAttribute(OfficeNamespaces.OFFICE_NS, FormatValueUtility.VALUE, "1.#NAN");
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
Reference in New Issue
Block a user