/* * 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 ro.nextreports.server.pivot; import java.sql.Connection; import java.sql.ResultSet; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.apache.wicket.injection.Injector; import org.apache.wicket.spring.injection.annot.SpringBean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ro.nextreports.server.domain.Chart; import ro.nextreports.server.domain.DataSource; import ro.nextreports.server.domain.Entity; import ro.nextreports.server.domain.Report; import ro.nextreports.server.report.next.NextUtil; import ro.nextreports.server.report.util.ReportUtil; import ro.nextreports.server.service.DashboardService; import ro.nextreports.server.service.StorageService; import ro.nextreports.server.util.ChartUtil; import ro.nextreports.server.util.ConnectionUtil; import ro.nextreports.server.web.dashboard.DashboardUtil; import ro.nextreports.server.web.dashboard.pivot.PivotWidget; import ro.nextreports.engine.ReportRunnerException; import ro.nextreports.engine.querybuilder.sql.dialect.CSVDialect; import ro.nextreports.engine.queryexec.Query; import ro.nextreports.engine.queryexec.QueryExecutor; import ro.nextreports.engine.queryexec.QueryParameter; import ro.nextreports.engine.queryexec.QueryResult; public class NextPivotDataSource extends ResultSetPivotDataSource { private static final Logger LOG = LoggerFactory.getLogger(NextPivotDataSource.class); @SpringBean private StorageService storageService; @SpringBean private DashboardService dashboardService; public NextPivotDataSource(PivotWidget widget) throws ReportRunnerException { this(widget, null); } public NextPivotDataSource(PivotWidget widget, Map<String, Object> urlQueryParameters) throws ReportRunnerException { Injector.get().inject(this); Entity entity = DashboardUtil.getEntity(widget, storageService); if (!(entity instanceof Chart) && !(entity instanceof Report)) { throw new IllegalArgumentException("Entity for NextPivotDataSource must be a report or a chart!"); } DataSource dataSource = getDataSource(entity); Connection connection = null; try { connection = ConnectionUtil.createConnection(storageService, dataSource); init(getQueryResult(connection, widget, urlQueryParameters)); } catch (Exception e) { throw new ReportRunnerException(e); } finally { ConnectionUtil.closeConnection(connection); } } private DataSource getDataSource(Entity entity) { DataSource dataSource; if (entity instanceof Report) { dataSource = ((Report)entity).getDataSource(); } else { dataSource = ((Chart)entity).getDataSource(); } return dataSource; } private ResultSet getQueryResult(Connection connection, PivotWidget widget, Map<String, Object> urlQueryParameters) throws ReportRunnerException { Entity entity = widget.getEntity(); ro.nextreports.engine.Report report = NextUtil.getNextReport(storageService.getSettings(), entity); DataSource dataSource = getDataSource(entity); String sql = ro.nextreports.engine.util.ReportUtil.getSql(report); // retrieves the report parameters Map<String, QueryParameter> parameters = new LinkedHashMap<String, QueryParameter>(); List<QueryParameter> parameterList = report.getParameters(); if (parameterList != null) { for (QueryParameter param : parameterList) { parameters.put(param.getName(), param); } } Map<String, Object> parameterValues = new HashMap<String, Object>(); // pivot is running with settings parameter values ChartUtil.initParameterSettings(parameterValues, widget.getQueryRuntime(), dashboardService.getUserWidgetParameters(widget.getId())); // parameters from embedded code try { ReportUtil.addUrlQueryParameters(storageService.getSettings(), entity, parameterValues, urlQueryParameters); } catch (Exception e1) { e1.printStackTrace(); LOG.error(e1.getMessage(), e1); } QueryExecutor executor = null; try { boolean csv = CSVDialect.DRIVER_CLASS.equals(dataSource.getDriver()); Query query = new Query(sql); executor = new QueryExecutor(query, parameters, parameterValues, connection, true, true, csv); executor.setMaxRows(0); executor.setTimeout(storageService.getSettings().getQueryTimeout()); QueryResult queryResult = executor.execute(); return queryResult.getResultSet(); } catch (Exception e) { throw new ReportRunnerException(e); } finally { if (executor != null) { executor.closeCursors(); } } } }