/** * executes the specified query template. The query template is first formatted and then executed. * If live, the original result set is made available as an output. If not live, the result set is * converted into memory and the connection and live result set are closed. * * @param rawQuery query template * @param live returns original result set if true, memory result set if false * @return true if successful */ protected boolean runQuery(final String rawQuery, boolean live) { try { if ((connection == null) || !connection.initialized()) { error( Messages.getInstance() .getErrorString("SQLBaseComponent.ERROR_0007_NO_CONNECTION")); // $NON-NLS-1$ return false; } String query = applyInputsToFormat(rawQuery); SQLConnection sqlConnection = null; if ((connection instanceof SQLConnection)) { sqlConnection = (SQLConnection) connection; } // Some of the following Added by Arijit Chatterjee passing the timeout value to SQLConnection // class if (sqlConnection != null) { if (this.getQueryTimeout() >= 0) { sqlConnection.setQueryTimeout(this.getQueryTimeout()); } if (this.getMaxRows() >= 0) { sqlConnection.setMaxRows(this.getMaxRows()); } if (this.getReadOnly()) { sqlConnection.setReadOnly(true); } } AbstractRelationalDbAction relationalDbAction = (AbstractRelationalDbAction) getActionDefinition(); IPentahoResultSet resultSet = null; boolean isForwardOnly = relationalDbAction.getUseForwardOnlyResultSet().getBooleanValue(false); resultSet = doQuery(sqlConnection, query, isForwardOnly); if (sqlConnection.isForcedForwardOnly()) { isForwardOnly = true; live = false; warn( Messages.getInstance() .getString("SQLBaseComponent.WARN_FALL_BACK_TO_NONSCROLLABLE")); // $NON-NLS-1$ } if (live) { // set the result set as the output rSet = resultSet; // After preparation and execution, we need to clear out the // prepared parameters. preparedParameters.clear(); if (resultSet != null) { getMetadata(resultSet, true); IActionOutput actionOutput = relationalDbAction.getOutputResultSet(); if (actionOutput != null) { actionOutput.setValue(resultSet); } return true; } else { // close the connection if owner error( Messages.getInstance() .getErrorString( "SQLBaseComponent.ERROR_0006_EXECUTE_FAILED", getActionName())); //$NON-NLS-1$ if (connectionOwner) { connection.close(); } return false; } } else { // execute the query, read the results and cache them try { // After preparation and execution, we need to clear out the // prepared parameters. preparedParameters.clear(); IPentahoResultSet cachedResultSet = resultSet.memoryCopy(); rSet = cachedResultSet; IActionOutput actionOutput = relationalDbAction.getOutputResultSet(); if (actionOutput != null) { actionOutput.setValue(cachedResultSet); } } finally { // close the connection if owner if (connectionOwner) { connection.close(); connection = null; } } } return true; } catch (Exception e) { error( Messages.getInstance() .getErrorString("SQLBaseComponent.ERROR_0006_EXECUTE_FAILED", getActionName()), e); //$NON-NLS-1$ } return false; }
@Override protected boolean executeAction() { String printFileName = null; IActionSequenceResource printFileResource = null; PrinterAction printAction = (PrinterAction) getActionDefinition(); if (printAction.getPrintfile() != ActionInputConstant.NULL_INPUT) { printFileName = printAction.getPrintfile().getStringValue(); } else if (printAction.getResourcesPrintFile() != null) { org.pentaho.actionsequence.dom.IActionResource tempResource = printAction.getResourcesPrintFile(); printFileResource = getResource(tempResource.getName()); } InputStream inStream = null; String printerName = printAction.getPrinterName().getStringValue(PrintComponent.DEFAULT_PRINTER); String lastPrinter = printAction.getDefaultPrinter().getStringValue(); if ((printAction.getOutputPrinterName() != null) && !printerName.equals("")) { // $NON-NLS-1$ IActionOutput output = printAction.getOutputPrinterName(); output.setValue(printerName); if (printAction.getOutputDefaultPrinter() != null) { IActionOutput defaultPrinterOutput = printAction.getOutputDefaultPrinter(); defaultPrinterOutput.setValue(printerName); } return true; } PrintService printer = getPrinterInternal(printerName, lastPrinter); if (printer == null) { if (!feedbackAllowed()) { error( Messages.getInstance() .getErrorString("PrintComponent.ERROR_0002_NO_SUITABLE_PRINTER")); // $NON-NLS-1$ return false; } // we created the printer feedback entry already return true; } if (printAction.getOutputDefaultPrinter() != null) { IActionOutput defaultPrinterOutput = printAction.getOutputDefaultPrinter(); defaultPrinterOutput.setValue(printerName); } // Get the number of copies int copies = printAction.getCopies().getIntValue(1); // Check for a valid printFileName or printFile Resource if (printFileName != null) { inStream = ActionSequenceResource.getInputStream(printFileName, LocaleHelper.getLocale()); } else if (printFileResource != null) { try { inStream = getResourceInputStream(printFileResource); } catch (FileNotFoundException e) { return false; } } else if (printAction.getReportOutput() != ActionInputConstant.NULL_INPUT) { inStream = getInputStream(PrinterAction.REPORT_OUTPUT); } else { // This should never happen if we validated ok. return false; } try { // Set the input source for sending to the driver. // InputSource source = new InputSource(inStream); try { FopFactory fopFactory = FopFactory.newInstance(); FOUserAgent userAgent = fopFactory.newFOUserAgent(); PrinterJob printerJob = PrinterJob.getPrinterJob(); // Set up our own PrintRenderer instance so we can supply a special PrinterJob instance. PrintRenderer renderer = new PrintRenderer(printerJob, copies); renderer.setUserAgent(userAgent); userAgent.setRendererOverride(renderer); // Construct fop with desired output format (here, it is set through the user agent) Fop fop = fopFactory.newFop(userAgent); // Setup JAXP using identity transformer TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(); // identity transformer // Setup input stream Source src = new StreamSource(inStream); // Resulting SAX events (the generated FO) must be piped through to FOP Result res = new SAXResult(fop.getDefaultHandler()); // Start XSLT transformation and FOP processing transformer.transform(src, res); } catch (Exception ex) { return false; } } finally { try { inStream.close(); } catch (IOException ex) { // TODO: Provide message here... ex.printStackTrace(); } } return true; }
/** * determines state of component, and executes accordingly. * * <p>various inputs that impact the state include: * * <p>live - returns a live result set vs. an in memory copy transform - transform a result set * based on additional inputs prepared_component - if available, use existing connection from * prepared component max_rows - sets the number of rows that should be returned in result sets * * <p>The specified output also impacts the state of the execution. If prepared_component is * defined as an output, setup the query but delay execution. */ @Override protected boolean executeAction() { IActionDefinition actionDefinition = getActionDefinition(); try { if (actionDefinition instanceof AbstractRelationalDbAction) { AbstractRelationalDbAction relationalDbAction = (AbstractRelationalDbAction) actionDefinition; // Added by Arijit Chatterjee IActionInput queryTimeoutInput = relationalDbAction.getQueryTimeout(); IActionInput maxRowsInput = relationalDbAction.getMaxRows(); IActionInput readOnlyInput = relationalDbAction.getReadOnly(); String baseQuery = getQuery(); if (baseQuery == null) { error( Messages.getInstance() .getErrorString( "SQLBaseComponent.ERROR_0001_QUERY_NOT_SPECIFIED", actionDefinition.getDescription())); // $NON-NLS-1$ return false; } IPreparedComponent sharedConnection = (IPreparedComponent) relationalDbAction.getSharedConnection().getValue(); if (readOnlyInput != ActionInputConstant.NULL_INPUT) { this.setReadOnly(readOnlyInput.getBooleanValue()); } if (sharedConnection != null) { connectionOwner = false; IPentahoConnection conn = sharedConnection.shareConnection(); if (conn == null) { error( Messages.getInstance() .getErrorString( "IPreparedComponent.ERROR_0002_CONNECTION_NOT_AVAILABLE", getActionName())); //$NON-NLS-1$ return false; } else if (conn.getDatasourceType() == IPentahoConnection.SQL_DATASOURCE) { connection = conn; } else { error( Messages.getInstance() .getErrorString( "IPreparedComponent.ERROR_0001_INVALID_CONNECTION_TYPE", getActionName())); //$NON-NLS-1$ return false; } } else { dispose(); connection = getDatasourceConnection(); } if (connection == null) { return false; } // Check if this is a prepared query that will be executed later. If so cache the // query and set this component as the output. This query will be run later from a // subreport. if (relationalDbAction.getOutputPreparedStatement() != null) { prepareQuery(baseQuery); IActionOutput actionOutput = relationalDbAction.getOutputPreparedStatement(); if (actionOutput != null) { actionOutput.setValue(this); } return true; } // TODO not sure if this should be allowed without connection ownership? // int maxRows = relationalDbAction.getMaxRows().getIntValue(-1); if (maxRowsInput != ActionInputConstant.NULL_INPUT) { this.setMaxRows(maxRowsInput.getIntValue()); } // Added by Arijit Chatterjee.Sets the value of timeout. Default is -1, if parameter not // found. if (queryTimeoutInput != ActionInputConstant.NULL_INPUT) { this.setQueryTimeout(queryTimeoutInput.getIntValue()); } if (relationalDbAction.getPerformTransform().getBooleanValue(false)) { runQuery(baseQuery, false); // The side effect of // transform rSet here rSet = PentahoDataTransmuter.crossTab( rSet, relationalDbAction.getTransformPivotColumn().getIntValue(-1) - 1, relationalDbAction.getTransformMeasuresColumn().getIntValue(-1) - 1, relationalDbAction.getTransformSortColumn().getIntValue(0) - 1, (Format) relationalDbAction.getTransformPivotDataFormat().getValue(), (Format) relationalDbAction.getTransformSortDataFormat().getValue(), relationalDbAction.getTransformOrderOutputColumns().getBooleanValue(false)); IActionOutput actionOutput = relationalDbAction.getOutputResultSet(); if (actionOutput != null) { actionOutput.setValue(rSet); } return true; } else { return runQuery(baseQuery, relationalDbAction.getLive().getBooleanValue(false)); } } else if (actionDefinition instanceof SqlConnectionAction) { SqlConnectionAction sqlConnectionAction = (SqlConnectionAction) actionDefinition; dispose(); connection = getDatasourceConnection(); if (connection == null) { return false; } else { IActionOutput actionOutput = sqlConnectionAction.getOutputConnection(); if (actionOutput != null) { actionOutput.setValue(this); return true; } else { return false; } } } } catch (Exception e) { error( Messages.getInstance() .getErrorString("SQLBaseComponent.ERROR_0006_EXECUTE_FAILED", getActionName()), e); //$NON-NLS-1$ } return false; }