=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/aggregation/AggregatedDataValueService.java' (properties changed: -x to +x) --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/aggregation/AggregatedDataValueService.java 2010-08-31 08:14:32 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/aggregation/AggregatedDataValueService.java 2010-12-19 00:24:59 +0000 @@ -11,6 +11,7 @@ import org.hisp.dhis.dimension.DimensionOption; import org.hisp.dhis.indicator.Indicator; import org.hisp.dhis.organisationunit.OrganisationUnit; +import org.hisp.dhis.organisationunit.OrganisationUnitLevel; import org.hisp.dhis.period.Period; public interface AggregatedDataValueService @@ -103,6 +104,16 @@ */ int deleteAggregatedDataValues(); + + /** + * Returns values for children of an orgunit at a particular level + * @param orgunit the root organisationunit + * @param level the level to retrieve values at + * @param periods the periods to retrieve values for + * @return an iterator type object for retrieving the values + */ + public AggregatedDataValueStoreIterator getAggregateDataValuesAtLevel(OrganisationUnit orgunit, OrganisationUnitLevel level, Collection periods); + // ---------------------------------------------------------------------- // AggregatedDataMapValue // ---------------------------------------------------------------------- === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/aggregation/AggregatedDataValueStore.java' (properties changed: -x to +x) --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/aggregation/AggregatedDataValueStore.java 2010-08-31 07:06:55 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/aggregation/AggregatedDataValueStore.java 2010-12-19 00:24:59 +0000 @@ -9,6 +9,7 @@ import org.hisp.dhis.datavalue.DeflatedDataValue; import org.hisp.dhis.dimension.DimensionOption; import org.hisp.dhis.organisationunit.OrganisationUnit; +import org.hisp.dhis.organisationunit.OrganisationUnitLevel; import org.hisp.dhis.period.Period; public interface AggregatedDataValueStore @@ -146,6 +147,17 @@ */ int deleteAggregatedIndicatorValues(); + + /** + * Returns values for children of an orgunit at a particular level + * @param orgunit the root organisationunit + * @param level the level to retrieve values at + * @param periods the period to retrieve values for + * @return an iterator type object for retrieving the values + */ + public AggregatedDataValueStoreIterator getAggregateDataValuesAtLevel(OrganisationUnit orgunit, OrganisationUnitLevel level, Collection periods); + + // ---------------------------------------------------------------------- // AggregatedIndicatorMapValue // ---------------------------------------------------------------------- === added file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/aggregation/AggregatedDataValueStoreIterator.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/aggregation/AggregatedDataValueStoreIterator.java 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/aggregation/AggregatedDataValueStoreIterator.java 2010-12-19 00:24:59 +0000 @@ -0,0 +1,55 @@ +package org.hisp.dhis.aggregation; + +/* + * Copyright (c) 2004-2010, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @interface AggregatedDataValueStoreIterator + * Provides an object for processing a collection of Aggregateddatavalues, such + * as from a jdbc resultset + * + * @author bobj + */ +public interface AggregatedDataValueStoreIterator { + + // ---------------------------------------------------------------------- + // AggregatedDataValueStoreIterator + // ---------------------------------------------------------------------- + + /** + * Gets the next AggregatedDataValue + * + * @return the aggregated value or null. + */ + AggregatedDataValue next(); + + /** + * Close any underlying resources + * + */ + void close(); +} === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/aggregation/DefaultAggregatedDataValueService.java' (properties changed: -x to +x) --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/aggregation/DefaultAggregatedDataValueService.java 2010-08-31 07:06:55 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/aggregation/DefaultAggregatedDataValueService.java 2010-12-19 00:24:59 +0000 @@ -16,6 +16,7 @@ import org.hisp.dhis.dimension.DimensionOption; import org.hisp.dhis.indicator.Indicator; import org.hisp.dhis.organisationunit.OrganisationUnit; +import org.hisp.dhis.organisationunit.OrganisationUnitLevel; import org.hisp.dhis.period.Period; public class DefaultAggregatedDataValueService @@ -72,6 +73,11 @@ return aggregatedDataValueStore.deleteAggregatedDataValues(); } + public AggregatedDataValueStoreIterator getAggregateDataValuesAtLevel(OrganisationUnit orgunit, OrganisationUnitLevel level, Collection periods) + { + return aggregatedDataValueStore.getAggregateDataValuesAtLevel(orgunit, level, periods); + } + // ------------------------------------------------------------------------- // AggregatedDataMapValue // ------------------------------------------------------------------------- === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/aggregation/jdbc/JdbcAggregatedDataValueStore.java' (properties changed: -x to +x) --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/aggregation/jdbc/JdbcAggregatedDataValueStore.java 2010-11-25 22:22:10 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/aggregation/jdbc/JdbcAggregatedDataValueStore.java 2010-12-19 00:24:59 +0000 @@ -1,10 +1,13 @@ package org.hisp.dhis.aggregation.jdbc; +import org.hisp.dhis.aggregation.AggregatedDataValueStoreIterator; +import org.hisp.dhis.organisationunit.OrganisationUnitLevel; import static org.hisp.dhis.system.util.ConversionUtils.getIdentifiers; import static org.hisp.dhis.system.util.TextUtils.getCommaDelimitedString; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Statement; import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -12,6 +15,8 @@ import org.amplecode.quick.StatementHolder; import org.amplecode.quick.StatementManager; import org.amplecode.quick.mapper.ObjectMapper; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.hisp.dhis.aggregation.AggregatedDataValue; import org.hisp.dhis.aggregation.AggregatedDataValueStore; import org.hisp.dhis.aggregation.AggregatedIndicatorValue; @@ -37,6 +42,13 @@ public class JdbcAggregatedDataValueStore extends HibernateGenericStore implements AggregatedDataValueStore { + + // number of rows to fetch from db for large resultset + private int FETCH_SIZE = 100; + + private static final Log log = LogFactory.getLog( JdbcAggregatedDataValueStore.class ); + + // ------------------------------------------------------------------------- // Dependencies // ------------------------------------------------------------------------- @@ -126,7 +138,46 @@ holder.close(); } } - + + @Override + public AggregatedDataValueStoreIterator getAggregateDataValuesAtLevel(OrganisationUnit rootOrgunit, OrganisationUnitLevel level, Collection periods) + { + final StatementHolder holder = statementManager.getHolder(); + + try + { + int rootlevel = rootOrgunit.getLevel(); + + String periodids = getCommaDelimitedString( getIdentifiers(Period.class, periods)); + + final String sql = + "SELECT dataelementid, categoryoptioncomboid, periodid, adv.organisationunitid, periodtypeid, adv.level, value " + + "FROM aggregateddatavalue AS adv " + + "INNER JOIN _orgunitstructure AS ous on adv.organisationunitid=ous.organisationunitid " + + "WHERE adv.level = " + level.getLevel() + + " AND ous.idlevel" + rootlevel + "=" + rootOrgunit.getId() + + " AND adv.periodid IN (" + periodids + ") "; + + log.info("sql: " + sql); + + Statement statement = holder.getStatement(); + + statement.setFetchSize(FETCH_SIZE); + + final ResultSet resultSet = statement.executeQuery( sql ); + + return new JdbcAggregatedDataValueStoreIterator(resultSet, holder); + } + catch ( SQLException ex ) + { + throw new RuntimeException( "Failed to get aggregated data value", ex ); + } + finally + { + // holder.close(); + } + } + public int deleteAggregatedDataValues( Collection dataElementIds, Collection periodIds, Collection organisationUnitIds ) { final String sql = === added file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/aggregation/jdbc/JdbcAggregatedDataValueStoreIterator.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/aggregation/jdbc/JdbcAggregatedDataValueStoreIterator.java 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/aggregation/jdbc/JdbcAggregatedDataValueStoreIterator.java 2010-12-19 00:24:59 +0000 @@ -0,0 +1,103 @@ +package org.hisp.dhis.aggregation.jdbc; + +/* + * Copyright (c) 2004-2010, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +import java.sql.ResultSet; +import java.sql.SQLException; +import org.amplecode.quick.StatementHolder; +import org.amplecode.quick.mapper.RowMapper; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.hisp.dhis.aggregation.AggregatedDataValue; +import org.hisp.dhis.aggregation.AggregatedDataValueStoreIterator; +import org.hisp.dhis.system.objectmapper.AggregatedDataValueRowMapper; + +/** + * + * @author bobj + */ +public class JdbcAggregatedDataValueStoreIterator implements AggregatedDataValueStoreIterator { + + private static final Log log = LogFactory.getLog(AggregatedDataValueStoreIterator.class); + + static RowMapper rowmapper = new AggregatedDataValueRowMapper(); + + private ResultSet resultSet; + + public ResultSet getResultSet() { + return resultSet; + } + + public void setResultSet(ResultSet resultSet) { + this.resultSet = resultSet; + } + + private StatementHolder holder; + + public StatementHolder getHolder() + { + return holder; + } + + public void setHolder( StatementHolder holder ) + { + this.holder = holder; + } + + public JdbcAggregatedDataValueStoreIterator(ResultSet resultSet, StatementHolder holder) { + this.resultSet = resultSet; + this.holder = holder; + } + + @Override + public AggregatedDataValue next() { + AggregatedDataValue row = null; + try { + if (resultSet.next()) { + row = rowmapper.mapRow(resultSet); + } else { + this.close(); + } + } catch (SQLException ex) { + log.warn("Error reading aggregateddatavalue row: " + ex); + } + return row; + } + + @Override + public void close() { + try { + if (!resultSet.isClosed()) { + resultSet.close(); + } + } catch (SQLException ex) { + log.warn("Error closing resultset: " + ex); + } + + holder.close(); + } +} === added directory 'dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/synchronous' === added file 'dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/synchronous/ExportPivotViewService.java' --- dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/synchronous/ExportPivotViewService.java 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-services/dhis-service-importexport/src/main/java/org/hisp/dhis/importexport/synchronous/ExportPivotViewService.java 2010-12-19 00:24:59 +0000 @@ -0,0 +1,125 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package org.hisp.dhis.importexport.synchronous; + + +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.Writer; +import java.util.Collection; +import java.util.Date; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.hisp.dhis.aggregation.AggregatedDataValue; +import org.hisp.dhis.aggregation.AggregatedDataValueService; +import org.hisp.dhis.aggregation.AggregatedDataValueStore; +import org.hisp.dhis.aggregation.AggregatedDataValueStoreIterator; +import org.hisp.dhis.organisationunit.OrganisationUnit; +import org.hisp.dhis.organisationunit.OrganisationUnitLevel; +import org.hisp.dhis.organisationunit.OrganisationUnitService; +import org.hisp.dhis.period.MonthlyPeriodType; +import org.hisp.dhis.period.Period; +import org.hisp.dhis.period.PeriodService; + +/** + * Exports pivot view synchronously (using calling thread) + * + * TODO: use exportparams and abstract service + * TODO: implement indicator and width-wise queries + * + * @author bobj + */ + +public class ExportPivotViewService { + + private static final Log log = LogFactory.getLog( ExportPivotViewService.class ); + + // ------------------------------------------------------------------------- + // Dependencies + // ------------------------------------------------------------------------- + + private AggregatedDataValueService aggregatedDataValueService; + + public void setAggregatedDataValueService( AggregatedDataValueService aggregatedDataValueService ) + { + this.aggregatedDataValueService = aggregatedDataValueService; + } + + private OrganisationUnitService organisationUnitService; + + public void setOrganisationUnitService( OrganisationUnitService organisationUnitService ) + { + this.organisationUnitService = organisationUnitService; + } + + private PeriodService periodService; + + public void setPeriodService( PeriodService periodService ) + { + this.periodService = periodService; + } + + public void execute (OutputStream out, Date startDate, Date endDate, int level, int root) + throws IOException + { + Writer writer = new BufferedWriter(new OutputStreamWriter(out)); + + // out.write("Hello World\n".getBytes()); + + Collection periods + = periodService.getIntersectingPeriodsByPeriodType( new MonthlyPeriodType(), startDate, endDate ); + + if (periods.size() == 0) + { + log.info( "no periods to export"); + return; + } + + OrganisationUnit rootOrgUnit = organisationUnitService.getOrganisationUnit( root ); + + if (rootOrgUnit == null) + { + log.info( "no orgunit root to export with id = " + rootOrgUnit); + return; + } + + rootOrgUnit.setLevel(organisationUnitService.getLevelOfOrganisationUnit( rootOrgUnit )); + + log.info("Orgunit: " + rootOrgUnit.getName()); + log.info("Orgunit level: " + rootOrgUnit.getLevel()); + + OrganisationUnitLevel orgUnitLevel = organisationUnitService.getOrganisationUnitLevelByLevel( level ); + + if (orgUnitLevel == null) + { + log.info( "no level with level id = " + orgUnitLevel); + return; + } + + log.info( "Exporting for " + rootOrgUnit.getName() + " at level: " + orgUnitLevel.getName()); + + AggregatedDataValueStoreIterator advIterator = aggregatedDataValueService.getAggregateDataValuesAtLevel( rootOrgUnit , orgUnitLevel, periods ); + + AggregatedDataValue adv = advIterator.next(); + + while (adv != null) + { + // process adv .. + writer.write( adv.getPeriodId() + ","); + writer.write( adv.getOrganisationUnitId() + ","); + writer.write( adv.getDataElementId() + ","); + writer.write( adv.getCategoryOptionComboId() + ","); + writer.write( adv.getLevel() + "\n"); + + adv = advIterator.next(); + } + + writer.flush(); + } + +} === modified file 'dhis-2/dhis-services/dhis-service-importexport/src/main/resources/META-INF/dhis/beans.xml' --- dhis-2/dhis-services/dhis-service-importexport/src/main/resources/META-INF/dhis/beans.xml 2010-12-09 05:53:20 +0000 +++ dhis-2/dhis-services/dhis-service-importexport/src/main/resources/META-INF/dhis/beans.xml 2010-12-19 00:24:59 +0000 @@ -381,7 +381,18 @@ - + + + + + + + + + + + === modified file 'dhis-2/dhis-services/dhis-service-importexport/src/main/resources/org/hisp/dhis/importexport/hibernate/ImportDataValue.hbm.xml' --- dhis-2/dhis-services/dhis-service-importexport/src/main/resources/org/hisp/dhis/importexport/hibernate/ImportDataValue.hbm.xml 2009-08-12 21:06:37 +0000 +++ dhis-2/dhis-services/dhis-service-importexport/src/main/resources/org/hisp/dhis/importexport/hibernate/ImportDataValue.hbm.xml 2010-12-19 00:24:59 +0000 @@ -1,29 +1,17 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + === modified file 'dhis-2/dhis-services/dhis-service-importexport/src/main/resources/org/hisp/dhis/importexport/hibernate/ImportObject.hbm.xml' --- dhis-2/dhis-services/dhis-service-importexport/src/main/resources/org/hisp/dhis/importexport/hibernate/ImportObject.hbm.xml 2009-08-12 21:06:37 +0000 +++ dhis-2/dhis-services/dhis-service-importexport/src/main/resources/org/hisp/dhis/importexport/hibernate/ImportObject.hbm.xml 2010-12-19 00:24:59 +0000 @@ -1,26 +1,14 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + === added file 'dhis-2/dhis-web/dhis-web-importexport/src/main/java/org/hisp/dhis/importexport/action/exp/ExportPivotViewAction.java' --- dhis-2/dhis-web/dhis-web-importexport/src/main/java/org/hisp/dhis/importexport/action/exp/ExportPivotViewAction.java 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-web/dhis-web-importexport/src/main/java/org/hisp/dhis/importexport/action/exp/ExportPivotViewAction.java 2010-12-19 00:24:59 +0000 @@ -0,0 +1,225 @@ +package org.hisp.dhis.importexport.action.exp; + +/* + * Copyright (c) 2004-2010, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + +import java.util.Date; + +import org.hisp.dhis.user.CurrentUserService; + +import com.opensymphony.xwork2.Action; +import java.io.IOException; +import java.io.OutputStream; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.struts2.ServletActionContext; +import org.hisp.dhis.importexport.synchronous.ExportPivotViewService; +import org.hisp.dhis.system.util.DateUtils; +import org.hisp.dhis.system.util.StreamUtils; + +/** + * @author Bob Jolliffe + * + * This action is called to export a csv formatted selection from the datamart + * It requires 4 parameters: + * startdate and enddate: 8 character string representation of date - 20100624 + * root: id of root organization unit + * level: level number to fetch aggregated values for + */ +public class ExportPivotViewAction + implements Action +{ + + private static final Log log = LogFactory.getLog( ExportPivotViewAction.class ); + + private static final DateFormat dateFormat = new SimpleDateFormat( "yyyyMMdd" ); + // parameter errors + + private static final String NO_STARTDATE = "The request is missing a startDate parameter"; + + private static final String NO_ENDDATE = "The request is missing an endDate parameter"; + + private static final String BAD_STARTDATE = "The request has a bad startDate parameter. Required format is YYYMMDD"; + + private static final String BAD_ENDDATE = "The request has a bad endDate parameter. Required format is YYYMMDD"; + + private static final String NO_ROOT = "The request is missing a non-zero dataSourceRoot parameter"; + + private static final String NO_LEVEL = "The request is missing a non-zero datasourceLevel parameter"; + // http header result type + + private static final String CLIENT_ERROR = "client-error"; + + private static final int HTTP_ERROR = 400; + // ------------------------------------------------------------------------- + // Dependencies + // ------------------------------------------------------------------------- + + private CurrentUserService currentUserService; + + public void setCurrentUserService( CurrentUserService currentUserService ) + { + this.currentUserService = currentUserService; + } + + private ExportPivotViewService exportPivotViewService; + + public void setExportPivotViewService( ExportPivotViewService exportPivotViewService ) + { + this.exportPivotViewService = exportPivotViewService; + } + + // ------------------------------------------------------------------------- + // Input + // ------------------------------------------------------------------------- + + private String startDate; + + public void setStartDate( String startDate ) + { + this.startDate = startDate; + } + + private String endDate; + + public void setEndDate( String endDate ) + { + this.endDate = endDate; + } + + private int dataSourceLevel; + + public void setDataSourceLevel( int dataSourceLevel ) + { + this.dataSourceLevel = dataSourceLevel; + } + + private int dataSourceRoot; + + public void setDataSourceRoot( int dataSourceRoot ) + { + this.dataSourceRoot = dataSourceRoot; + } + + // ------------------------------------------------------------------------- + // Action implementation + // ------------------------------------------------------------------------- + public String execute() throws IOException + { + // do a basic audit log + HttpServletRequest request = ServletActionContext.getRequest(); + + log.info( "PivotView export request from " + currentUserService.getCurrentUsername() + + " @ " + request.getRemoteAddr() ); + + HttpServletResponse response = ServletActionContext.getResponse(); + + // --------------------------------------------------------------------- + // Check all parameters + // --------------------------------------------------------------------- + + String paramError = null; + + if ( startDate == null ) + { + paramError = NO_STARTDATE; + } + + if ( endDate == null ) + { + paramError = NO_ENDDATE; + } + + if ( dataSourceRoot == 0 ) + { + paramError = NO_ROOT; + } + + if ( dataSourceLevel == 0 ) + { + paramError = NO_LEVEL; + } + + Date start = null; + Date end = null; + + if ( paramError == null ) + { + try + { + start = dateFormat.parse( startDate ); + + if ( start == null ) + { + paramError = BAD_STARTDATE; + } + + end = dateFormat.parse( endDate ); + + if ( end == null ) + { + paramError = BAD_ENDDATE; + } + } catch ( java.text.ParseException ex ) + { + paramError = ex.getMessage(); + } + } + + if ( paramError != null ) + { + response.sendError( HTTP_ERROR, paramError ); + log.info( paramError ); + return CLIENT_ERROR; + } + + // prepare to write output + OutputStream out = null; + + // response.setContentType( "application/gzip"); + // response.addHeader( "Content-Disposition", "attachment; filename=\"test.csv\"" ); + response.addHeader( "Cache-Control", "no-cache" ); + response.addHeader( "Expires", DateUtils.getExpiredHttpDateString() ); + + try + { + out = response.getOutputStream(); + exportPivotViewService.execute(out, start, end, dataSourceLevel, dataSourceRoot); + } + finally + { + StreamUtils.closeOutputStream( out ); + } + + return SUCCESS; + } +} === modified file 'dhis-2/dhis-web/dhis-web-importexport/src/main/resources/META-INF/dhis/beans.xml' --- dhis-2/dhis-web/dhis-web-importexport/src/main/resources/META-INF/dhis/beans.xml 2010-07-30 12:59:39 +0000 +++ dhis-2/dhis-web/dhis-web-importexport/src/main/resources/META-INF/dhis/beans.xml 2010-12-19 00:24:59 +0000 @@ -186,6 +186,13 @@ + + + + + === modified file 'dhis-2/dhis-web/dhis-web-importexport/src/main/resources/struts.xml' --- dhis-2/dhis-web/dhis-web-importexport/src/main/resources/struts.xml 2010-11-19 09:27:17 +0000 +++ dhis-2/dhis-web/dhis-web-importexport/src/main/resources/struts.xml 2010-12-19 00:24:59 +0000 @@ -168,13 +168,8 @@ filename="${fileName}" 10240 - - - - /dhis-web-importexport/responseSuccess.vm - plainTextError - + /dhis-web-importexport/responseExportStatus.vm plainTextError @@ -195,7 +190,13 @@ /dhis-web-importexport/responseError.vm plainTextError - + + + + + + +