package ro.nextreports.server.report; import java.sql.Connection; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import javax.jcr.RepositoryException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ro.nextreports.engine.FluentReportRunner; import ro.nextreports.engine.Report; import ro.nextreports.engine.ReportRunnerException; import ro.nextreports.engine.queryexec.QueryResult; import ro.nextreports.server.domain.NextContent; import ro.nextreports.server.etl.DefaultProcessor; import ro.nextreports.server.etl.DocumentTransformer; import ro.nextreports.server.etl.Extractor; import ro.nextreports.server.etl.OrientDbLoader; import ro.nextreports.server.etl.Processor; import ro.nextreports.server.etl.ResultSetExtractor; import ro.nextreports.server.etl.Transformer; import ro.nextreports.server.exception.ReportEngineException; import ro.nextreports.server.report.next.NextRunnerFactory; import ro.nextreports.server.report.next.NextUtil; import ro.nextreports.server.service.AnalysisService; import ro.nextreports.server.service.StorageService; import ro.nextreports.server.util.ConnectionUtil; public class ETLExporter { private static final Logger LOG = LoggerFactory.getLogger(ETLExporter.class); private ExportContext exportContext; private StorageService storageService; private AnalysisService analysisService; public ETLExporter(ExportContext exportContext) { this.exportContext = exportContext; } public void setStorageService(StorageService storageService) { this.storageService = storageService; } public void setAnalysisService(AnalysisService analysisService) { this.analysisService = analysisService; } private Connection createConnection() throws ReportEngineException { Connection connection; try { connection = ConnectionUtil.createConnection(storageService, exportContext.getReportDataSource()); return connection; } catch (RepositoryException e) { throw new ReportEngineException("Cannot connect to database", e); } } public void export() throws ReportEngineException, InterruptedException { Report report = NextUtil.getNextReport(storageService.getSettings(), (NextContent) exportContext.getReportContent()); LOG.info("Export report '" + report.getName() + "' format="+ReportConstants.ETL_FORMAT + " queryTimeout="+storageService.getSettings().getQueryTimeout()); FluentReportRunner runner = FluentReportRunner.report(report); NextRunnerFactory.addRunner(exportContext.getKey(), runner); Connection conn = createConnection(); runner = runner.connectTo(conn). withQueryTimeout(storageService.getSettings().getQueryTimeout()). withParameterValues(new HashMap<String, Object>(exportContext.getReportParameterValues())); try { String tableName = getEtlTableName(exportContext.getCreator(), exportContext.getServerReportName()); createEtl(runner.executeQuery(), tableName); } catch (ReportRunnerException ex) { throw new ReportEngineException(ex.getMessage(), ex); } finally { NextRunnerFactory.removeRunner(exportContext.getKey()); ConnectionUtil.closeConnection(conn); } } private String getEtlTableName(String userName, String reportName) { return userName + "-" + reportName; } private void createEtl(QueryResult queryResult, String tableName) { // create extractor Extractor extractor = new ResultSetExtractor(queryResult.getResultSet()); // create loader OrientDbLoader loader = new OrientDbLoader(); loader.setDbUrl(analysisService.getDatabasePath()); loader.setClassName(tableName); loader.setAutoDropClass(true); loader.setDbAutoCreateProperties(true); // create transformers List<Transformer> transformers = new ArrayList<Transformer>(); transformers.add(new DocumentTransformer()); // create processor and go Processor processor = new DefaultProcessor(extractor, transformers, loader); long time = System.currentTimeMillis(); processor.init(); processor.process(); processor.destroy(); time = System.currentTimeMillis() - time; LOG.info("Executed in {} ms", time); } }