← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 9338: local vn - Auto generate form - Rollbacked data automatically if having any error occupy

 

------------------------------------------------------------
revno: 9338
committer: Hieu <hieu.hispvietnam@xxxxxxxxx>
branch nick: dhis2
timestamp: Mon 2012-12-17 17:36:42 +0700
message:
  local vn - Auto generate form - Rollbacked data automatically if having any error occupy
removed:
  local/vn/dhis-web-spreadsheet-reporting/src/main/java/org/hisp/dhis/reportsheet/preview/action/TestAction.java
added:
  local/vn/dhis-web-spreadsheet-reporting/src/main/java/org/hisp/dhis/reportsheet/preview/action/AutoGenerateFormRollBack.java
  local/vn/dhis-web-spreadsheet-reporting/src/main/webapp/dhis-web-spreadsheet-reporting/responseAutoGenerateFormError.vm
modified:
  local/vn/dhis-web-spreadsheet-reporting/src/main/java/org/hisp/dhis/reportsheet/preview/action/AutoGenerateFormByTemplate.java
  local/vn/dhis-web-spreadsheet-reporting/src/main/resources/META-INF/dhis/beans.xml
  local/vn/dhis-web-spreadsheet-reporting/src/main/resources/org/hisp/dhis/reportsheet/i18n_module.properties
  local/vn/dhis-web-spreadsheet-reporting/src/main/resources/org/hisp/dhis/reportsheet/i18n_module_vi_VN.properties
  local/vn/dhis-web-spreadsheet-reporting/src/main/resources/struts.xml
  local/vn/dhis-web-spreadsheet-reporting/src/main/webapp/dhis-web-spreadsheet-reporting/javascript/autoGenerateForm.js
  local/vn/dhis-web-spreadsheet-reporting/src/main/webapp/dhis-web-spreadsheet-reporting/showAutoGenerateForm.vm


--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk

Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== modified file 'local/vn/dhis-web-spreadsheet-reporting/src/main/java/org/hisp/dhis/reportsheet/preview/action/AutoGenerateFormByTemplate.java'
--- local/vn/dhis-web-spreadsheet-reporting/src/main/java/org/hisp/dhis/reportsheet/preview/action/AutoGenerateFormByTemplate.java	2012-12-16 20:17:59 +0000
+++ local/vn/dhis-web-spreadsheet-reporting/src/main/java/org/hisp/dhis/reportsheet/preview/action/AutoGenerateFormByTemplate.java	2012-12-17 10:36:42 +0000
@@ -44,7 +44,6 @@
 import static org.hisp.dhis.reportsheet.utils.ExcelUtils.readValueByPOI;
 
 import java.io.FileInputStream;
-import java.io.IOException;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -138,9 +137,7 @@
 
     private String commonName = "";
 
-    private int exportReportId;
-
-    private int dataSetId;
+    private Set<Integer> vrList = new HashSet<Integer>();
 
     private Map<String, Integer> deMap1 = new HashMap<String, Integer>();
 
@@ -148,8 +145,6 @@
 
     private Map<String, Integer> idMap = new HashMap<String, Integer>();
 
-    private Set<Integer> vrList = new HashSet<Integer>();
-
     private static final Map<String, String> operatorMap = new HashMap<String, String>()
     {
         /**
@@ -224,6 +219,35 @@
         return xmlStructureResponse;
     }
 
+    private int exportReportId;
+
+    public int getExportReportId()
+    {
+        return exportReportId;
+    }
+
+    private int dataSetId;
+
+    public int getDataSetId()
+    {
+        return dataSetId;
+    }
+
+    public Collection<Integer> getDataElementIds()
+    {
+        return deMap1.values();
+    }
+
+    public Collection<Integer> getIndicatorIds()
+    {
+        return idMap.values();
+    }
+
+    public Set<Integer> getValidationRuleIds()
+    {
+        return new HashSet<Integer>( vrList );
+    }
+
     // -------------------------------------------------------------------------
     // Action implementation
     // -------------------------------------------------------------------------
@@ -283,13 +307,14 @@
             e.printStackTrace();
 
             cleanUp();
+
+            return ERROR;
         }
 
         return SUCCESS;
     }
 
     private void printXML( Collection<Integer> collectSheets, List<ImportItem> importItems )
-        throws Exception
     {
         printMergedInfo( collectSheets );
 
@@ -305,267 +330,215 @@
 
     private void printData( int sheetNo, List<ImportItem> importItems )
     {
-        try
+
+        // Create new DataSet
+        DataSet dataSet = new DataSet( commonName, commonName, periodType );
+
+        // Create new ExportReport
+        ExportReport exportReport = new ExportReportNormal( commonName, REPORT_EXCEL_GROUP, excelFileName, null );
+        exportReportId = exportReportService.addExportReport( exportReport );
+
+        Sheet s = WORKBOOK.getSheetAt( sheetNo - 1 );
+
+        xml.append( "<sheet id='" + (sheetNo) + "'>" );
+        xml.append( "<name><![CDATA[" + s.getSheetName() + "]]></name>" );
+
+        for ( Row row : s )
         {
-            // Create new DataSet
-            DataSet dataSet = new DataSet( commonName, commonName, periodType );
-
-            // Create new ExportReport
-            ExportReport exportReport = new ExportReportNormal( commonName, REPORT_EXCEL_GROUP, excelFileName, null );
-            exportReportId = exportReportService.addExportReport( exportReport );
-
-            Sheet s = WORKBOOK.getSheetAt( sheetNo - 1 );
-
-            xml.append( "<sheet id='" + (sheetNo) + "'>" );
-            xml.append( "<name><![CDATA[" + s.getSheetName() + "]]></name>" );
-
-            for ( Row row : s )
+            xml.append( "<row index='" + row.getRowNum() + "'>" );
+
+            for ( Cell cell : row )
             {
-                xml.append( "<row index='" + row.getRowNum() + "'>" );
+                Comment cmt = cell.getCellComment();
+                int rowIndex = cell.getRowIndex();
+                int colIndex = cell.getColumnIndex();
 
-                for ( Cell cell : row )
+                if ( cmt != null )
                 {
-                    Comment cmt = cell.getCellComment();
-                    int rowIndex = cell.getRowIndex();
-                    int colIndex = cell.getColumnIndex();
+                    String values[] = cmt.getString().toString().split( ":" );
 
-                    if ( cmt != null )
+                    if ( values[0].equalsIgnoreCase( DATAELEMENT_KEY ) )
                     {
-                        String values[] = cmt.getString().toString().split( ":" );
-
-                        if ( values[0].equalsIgnoreCase( DATAELEMENT_KEY ) )
-                        {
-                            String deName = cell.getStringCellValue();
-                            String[] colNames = values[1].split( "," );
-
-                            for ( String colName : colNames )
-                            {
-                                int colIdx = convertColumnNameToNumber( colName );
-                                String name = deName + " (" + colIdx + ")";
-
-                                // Generate DataElement
-                                DataElement dataElement = new DataElement( name );
-                                /** TAKE CARE OF SHORT_NAME IS TOO LONG */
-                                dataElement.setShortName( name );
-                                dataElement.setActive( true );
-                                dataElement.setZeroIsSignificant( false );
-                                dataElement.setDomainType( DOMAIN_TYPE_AGGREGATE );
-                                dataElement.setType( VALUE_TYPE_INT );
-                                dataElement.setNumberType( VALUE_TYPE_INT );
-                                dataElement.setAggregationOperator( AGGREGATION_OPERATOR_SUM );
-                                dataElement.setCategoryCombo( optionCombo.getCategoryCombo() );
-
-                                int deId = dataElementService.addDataElement( dataElement );
-
-                                deMap1.put( (colIdx - 1) + "#" + rowIndex, deId );
-                                deMap2.put( colName + (rowIndex + 1), "[" + deId + "." + optionCombo.getId() + "]");
-
-                                // Add the dataElement into the dataSet
-                                dataSet.addDataElement( dataElement );
-
-                                // Generate Report Item
-                                ExportItem exportItem = new ExportItem();
-                                exportItem.setName( name );
-                                exportItem.setItemType( DATAELEMENT );
-                                exportItem.setRow( rowIndex + 1 );
-                                exportItem.setColumn( colIdx );
-                                exportItem.setExpression( "[" + deId + "." + optionCombo.getId() + "]" );
-                                exportItem.setPeriodType( SELECTED_MONTH );
-                                exportItem.setSheetNo( sheetNo );
-                                exportItem.setExportReport( exportReport );
-
-                                exportReportService.addExportItem( exportItem );
-                            }
-                        }
-                        else if ( values[0].equalsIgnoreCase( INDICATOR_KEY ) )
-                        {
-                            String idName = INDICATOR_NAME + values[1];
-                            Integer colIdx = colIndex + 1;
-
-                            if ( values.length == 4 )
-                            {
-                                colIdx = convertColumnNameToNumber( values[3] );
-                            }
-                            else if ( values.length == 5 )
-                            {
-                                colIdx = convertColumnNameToNumber( values[3] );
-                                rowIndex = Integer.parseInt( values[4] ) - 1;
-                            }
-
-                            // Create Indicator
-                            Indicator indicator = new Indicator();
-                            indicator.setName( idName );
-                            indicator.setShortName( idName );
-                            indicator.setAnnualized( false );
-                            indicator.setIndicatorType( indicatorType );
-                            indicator.setNumerator( prepareExcelFormulaForAutoForm( values[2] ) );
-                            indicator.setNumeratorDescription( DESCRIPTION );
-                            indicator.setDenominator( 1 + "" );
-                            indicator.setDenominatorDescription( DESCRIPTION );
-
-                            int indicatorId = indicatorService.addIndicator( indicator );
-
-                            idMap.put( (colIdx - 1) + "#" + rowIndex, indicatorId );
+                        String deName = cell.getStringCellValue();
+                        String[] colNames = values[1].split( "," );
+
+                        for ( String colName : colNames )
+                        {
+                            int colIdx = convertColumnNameToNumber( colName );
+                            String name = deName + " (" + colIdx + ")";
+
+                            // Generate DataElement
+                            DataElement dataElement = new DataElement( name );
+                            /** TAKE CARE OF SHORT_NAME IS TOO LONG */
+                            dataElement.setShortName( name );
+                            dataElement.setActive( true );
+                            dataElement.setZeroIsSignificant( false );
+                            dataElement.setDomainType( DOMAIN_TYPE_AGGREGATE );
+                            dataElement.setType( VALUE_TYPE_INT );
+                            dataElement.setNumberType( VALUE_TYPE_INT );
+                            dataElement.setAggregationOperator( AGGREGATION_OPERATOR_SUM );
+                            dataElement.setCategoryCombo( optionCombo.getCategoryCombo() );
+
+                            int deId = dataElementService.addDataElement( dataElement );
+
+                            deMap1.put( (colIdx - 1) + "#" + rowIndex, deId );
+                            deMap2.put( colName + (rowIndex + 1), "[" + deId + "." + optionCombo.getId() + "]" );
 
                             // Add the dataElement into the dataSet
-                            dataSet.addIndicator( indicator );
+                            dataSet.addDataElement( dataElement );
 
                             // Generate Report Item
                             ExportItem exportItem = new ExportItem();
-                            exportItem.setName( idName );
-                            exportItem.setItemType( INDICATOR );
+                            exportItem.setName( name );
+                            exportItem.setItemType( DATAELEMENT );
                             exportItem.setRow( rowIndex + 1 );
                             exportItem.setColumn( colIdx );
-                            exportItem.setExpression( "[" + indicatorId + "]" );
+                            exportItem.setExpression( "[" + deId + "." + optionCombo.getId() + "]" );
                             exportItem.setPeriodType( SELECTED_MONTH );
                             exportItem.setSheetNo( sheetNo );
                             exportItem.setExportReport( exportReport );
 
                             exportReportService.addExportItem( exportItem );
                         }
-                        else
-                        {
-                            // Validation rules
-                            Expression leftSide = new Expression();
-
-                            leftSide.setExpression( prepareExcelFormulaForAutoForm( values[2] ) );
-                            leftSide.setDescription( DESCRIPTION );
-                            leftSide.setNullIfBlank( true );
-
-                            Expression rightSide = new Expression();
-
-                            rightSide.setExpression( prepareExcelFormulaForAutoForm( values[4] ) );
-                            rightSide.setDescription( DESCRIPTION );
-                            rightSide.setNullIfBlank( true );
-
-                            ValidationRule validationRule = new ValidationRule();
-
-                            validationRule.setName( values[1] );
-                            validationRule.setDescription( DESCRIPTION );
-                            validationRule.setType( ValidationRule.TYPE_ABSOLUTE );
-                            validationRule.setOperator( Operator.valueOf( operatorMap.get( values[3] ) ) );
-                            validationRule.setLeftSide( leftSide );
-                            validationRule.setRightSide( rightSide );
-
-                            validationRule.setPeriodType( periodType );
-
-                            vrList.add( validationRuleService.saveValidationRule( validationRule ) );
-                        }
-                    }
-
-                    String key = colIndex + "#" + rowIndex;
-
-                    if ( deMap1.containsKey( key ) )
-                    {
-                        xml.append( "<col no='" + colIndex + "'>" );
-
-                        xml.append( "<data><![CDATA[<input id=\"" + deMap1.get( key ) + "-" + optionCombo.getId()
-                            + "-val\" style=\"width:7em;text-align:center\" value=\"\" title=\"\" />]]></data>" );
-
-                        xml.append( printFormatInfo( s, cell ) );
-
-                        xml.append( "</col>" );
-                    }
-                    else if ( idMap.containsKey( key ) )
-                    {
-                        int indicatorId = idMap.get( key );
-
-                        xml.append( "<col no='" + colIndex + "'>" );
-
-                        xml.append( "<data><![CDATA[<input id=\"indicator" + indicatorId + "\"" );
-                        xml.append( " indicatorid=\"" + indicatorId + "\" name=\"indicator\" readonly=\"readonly\"" );
-                        xml.append( " style=\"width:7em;text-align:center;\" title=\"\" value=\"\" />]]></data>" );
-
-                        xml.append( printFormatInfo( s, cell ) );
-
-                        xml.append( "</col>" );
-                    }
-                    else if ( (cell.getCellStyle() != null || cell.getCellType() != Cell.CELL_TYPE_BLANK)
-                        && !s.isColumnHidden( colIndex ) )
-                    {
-                        xml.append( "<col no='" + colIndex + "'>" );
-
-                        xml.append( "<data><![CDATA["
-                            + readValueByPOI( row.getRowNum() + 1, colIndex + 1, s, evaluatorFormula ) + "]]></data>" );
-
-                        xml.append( printFormatInfo( s, cell ) );
-
-                        xml.append( "</col>" );
-                    }
-                }
-                xml.append( "</row>" );
-            }
-            xml.append( "</sheet>" );
-
-            // Update DataSet
-            DataEntryForm dataEntryForm = new DataEntryForm( commonName, "<p></p>" );
-            dataEntryFormService.addDataEntryForm( dataEntryForm );
-
-            dataSet.setDataEntryForm( dataEntryForm );
-            dataSetId = dataSetService.addDataSet( dataSet );
-
-            // Update ExportReport
-            Set<DataSet> dataSets = new HashSet<DataSet>();
-            dataSets.add( dataSet );
-
-            exportReport.setDataSets( dataSets );
-            exportReportService.updateExportReport( exportReport );
-
-            xml.append( "<ds id='" + dataSetId + "' n='" + commonName + "'/>" );
-
-            for ( String key1 : idMap.keySet() )
-            {
-                Indicator indicator = indicatorService.getIndicator( idMap.get( key1 ) );
-                String expression = indicator.getNumerator();
-
-                for ( String key2 : deMap2.keySet() )
-                {
-                    expression = expression.replaceAll( "\\[" + key2 + "\\]", deMap2.get( key2 ) );
-                }
-
-                indicator.setNumerator( expression );
-                indicatorService.updateIndicator( indicator );
-            }
-
-            for ( Integer id : vrList )
-            {
-                ValidationRule vr = validationRuleService.getValidationRule( id );
-
-                Expression leftSide = vr.getLeftSide();
-                Expression rightSide = vr.getRightSide();
-
-                String leftExpression = leftSide.getExpression();
-                String rightExpression = rightSide.getExpression();
-
-                for ( String key2 : deMap2.keySet() )
-                {
-                    String operandId = deMap2.get( key2 );
-
-                    leftExpression = leftExpression.replaceAll( "\\[" + key2 + "\\]", operandId );
-                    rightExpression = rightExpression.replaceAll( "\\[" + key2 + "\\]", operandId );
-                }
-
-                leftSide.setDataElementsInExpression( expressionService.getDataElementsInExpression( leftExpression ) );
-                leftSide.setOptionCombosInExpression( expressionService.getOptionCombosInExpression( leftExpression ) );
-
-                rightSide
-                    .setDataElementsInExpression( expressionService.getDataElementsInExpression( rightExpression ) );
-                rightSide
-                    .setOptionCombosInExpression( expressionService.getOptionCombosInExpression( rightExpression ) );
-
-                vr.setLeftSide( leftSide );
-                vr.setRightSide( rightSide );
-
-                validationRuleService.updateValidationRule( vr );
-            }
-        }
-        catch ( Exception e )
-        {
-            e.printStackTrace();
-
-            autoRollBack();
-            cleanUp();
-        }
+                    }
+                    else if ( values[0].equalsIgnoreCase( INDICATOR_KEY ) )
+                    {
+                        String idName = INDICATOR_NAME + values[1];
+                        Integer colIdx = colIndex + 1;
+
+                        if ( values.length == 4 )
+                        {
+                            colIdx = convertColumnNameToNumber( values[3] );
+                        }
+                        else if ( values.length == 5 )
+                        {
+                            colIdx = convertColumnNameToNumber( values[3] );
+                            rowIndex = Integer.parseInt( values[4] ) - 1;
+                        }
+
+                        // Create Indicator
+                        Indicator indicator = new Indicator();
+                        indicator.setName( idName );
+                        indicator.setShortName( idName );
+                        indicator.setAnnualized( false );
+                        indicator.setIndicatorType( indicatorType );
+                        indicator.setNumerator( prepareExcelFormulaForAutoForm( values[2] ) );
+                        indicator.setNumeratorDescription( DESCRIPTION );
+                        indicator.setDenominator( 1 + "" );
+                        indicator.setDenominatorDescription( DESCRIPTION );
+
+                        int indicatorId = indicatorService.addIndicator( indicator );
+
+                        idMap.put( (colIdx - 1) + "#" + rowIndex, indicatorId );
+
+                        // Add the dataElement into the dataSet
+                        dataSet.addIndicator( indicator );
+
+                        // Generate Report Item
+                        ExportItem exportItem = new ExportItem();
+                        exportItem.setName( idName );
+                        exportItem.setItemType( INDICATOR );
+                        exportItem.setRow( rowIndex + 1 );
+                        exportItem.setColumn( colIdx );
+                        exportItem.setExpression( "[" + indicatorId + "]" );
+                        exportItem.setPeriodType( SELECTED_MONTH );
+                        exportItem.setSheetNo( sheetNo );
+                        exportItem.setExportReport( exportReport );
+
+                        exportReportService.addExportItem( exportItem );
+                    }
+                    else
+                    {
+                        // Validation rules
+                        Expression leftSide = new Expression();
+
+                        leftSide.setExpression( prepareExcelFormulaForAutoForm( values[2] ) );
+                        leftSide.setDescription( DESCRIPTION );
+                        leftSide.setNullIfBlank( true );
+
+                        Expression rightSide = new Expression();
+
+                        rightSide.setExpression( prepareExcelFormulaForAutoForm( values[4] ) );
+                        rightSide.setDescription( DESCRIPTION );
+                        rightSide.setNullIfBlank( true );
+
+                        ValidationRule validationRule = new ValidationRule();
+
+                        validationRule.setName( values[1] );
+                        validationRule.setDescription( DESCRIPTION );
+                        validationRule.setType( ValidationRule.TYPE_ABSOLUTE );
+                        validationRule.setOperator( Operator.valueOf( operatorMap.get( values[3] ) ) );
+                        validationRule.setLeftSide( leftSide );
+                        validationRule.setRightSide( rightSide );
+
+                        validationRule.setPeriodType( periodType );
+
+                        vrList.add( validationRuleService.saveValidationRule( validationRule ) );
+                    }
+                }
+
+                String key = colIndex + "#" + rowIndex;
+
+                if ( deMap1.containsKey( key ) )
+                {
+                    xml.append( "<col no='" + colIndex + "'>" );
+
+                    xml.append( "<data><![CDATA[<input id=\"" + deMap1.get( key ) + "-" + optionCombo.getId()
+                        + "-val\" style=\"width:7em;text-align:center\" value=\"\" title=\"\" />]]></data>" );
+
+                    xml.append( printFormatInfo( s, cell ) );
+
+                    xml.append( "</col>" );
+                }
+                else if ( idMap.containsKey( key ) )
+                {
+                    int indicatorId = idMap.get( key );
+
+                    xml.append( "<col no='" + colIndex + "'>" );
+
+                    xml.append( "<data><![CDATA[<input id=\"indicator" + indicatorId + "\"" );
+                    xml.append( " indicatorid=\"" + indicatorId + "\" name=\"indicator\" readonly=\"readonly\"" );
+                    xml.append( " style=\"width:7em;text-align:center;\" title=\"\" value=\"\" />]]></data>" );
+
+                    xml.append( printFormatInfo( s, cell ) );
+
+                    xml.append( "</col>" );
+                }
+                else if ( (cell.getCellStyle() != null || cell.getCellType() != Cell.CELL_TYPE_BLANK)
+                    && !s.isColumnHidden( colIndex ) )
+                {
+                    xml.append( "<col no='" + colIndex + "'>" );
+
+                    xml.append( "<data><![CDATA["
+                        + readValueByPOI( row.getRowNum() + 1, colIndex + 1, s, evaluatorFormula ) + "]]></data>" );
+
+                    xml.append( printFormatInfo( s, cell ) );
+
+                    xml.append( "</col>" );
+                }
+            }
+            xml.append( "</row>" );
+        }
+        xml.append( "</sheet>" );
+
+        // Update DataSet
+        DataEntryForm dataEntryForm = new DataEntryForm( commonName, "<p></p>" );
+        dataEntryFormService.addDataEntryForm( dataEntryForm );
+
+        dataSet.setDataEntryForm( dataEntryForm );
+        dataSetId = dataSetService.addDataSet( dataSet );
+
+        // Update ExportReport
+        Set<DataSet> dataSets = new HashSet<DataSet>();
+        dataSets.add( dataSet );
+
+        exportReport.setDataSets( dataSets );
+        exportReportService.updateExportReport( exportReport );
+
+        updateIndicator();
+        updateValidationRule();
+
+        xml.append( "<ds id='" + dataSetId + "' n='" + commonName + "'/>" );
     }
 
     /**
@@ -624,7 +597,6 @@
     // -------------------------------------------------------------------------
 
     private void printMergedInfo( Collection<Integer> collectSheets )
-        throws IOException
     {
         // Open the main Tag //
         xml.append( MERGEDCELL_OPENTAG );
@@ -679,57 +651,53 @@
         return buffer.toString();
     }
 
-    private void autoRollBack()
-    {
-        try
-        {
-            if ( exportReportId > 0 )
-            {
-                exportReportService.deleteExportReport( exportReportId );
-
-                exportReportId = 0;
-            }
-            if ( dataSetId > 0 )
-            {
-                dataSetService.deleteDataSet( dataSetService.getDataSet( dataSetId ) );
-
-                dataSetId = 0;
-            }
-
-            for ( String key : deMap1.keySet() )
-            {
-                dataElementService.deleteDataElement( dataElementService.getDataElement( deMap1.get( key ) ) );
-            }
-            for ( String key : idMap.keySet() )
-            {
-                indicatorService.deleteIndicator( indicatorService.getIndicator( idMap.get( key ) ) );
-            }
-            for ( Integer vrId : vrList )
-            {
-                validationRuleService.deleteValidationRule( validationRuleService.getValidationRule( vrId ) );
-            }
-
-            deMap1.clear();
-            deMap2.clear();
-            idMap.clear();
-            vrList.clear();
-        }
-        catch ( Exception e )
-        {
-            resetParams();
-
-            e.printStackTrace();
-        }
-    }
-
-    private void resetParams()
-    {
-        exportReportId = 0;
-        dataSetId = 0;
-        deMap1.clear();
-        deMap2.clear();
-        idMap.clear();
-        vrList.clear();
-    }
-
+    private void updateIndicator()
+    {
+        for ( String key1 : idMap.keySet() )
+        {
+            Indicator indicator = indicatorService.getIndicator( idMap.get( key1 ) );
+            String expression = indicator.getNumerator();
+
+            for ( String key2 : deMap2.keySet() )
+            {
+                expression = expression.replaceAll( "\\[" + key2 + "\\]", deMap2.get( key2 ) );
+            }
+
+            indicator.setNumerator( expression );
+            indicatorService.updateIndicator( indicator );
+        }
+    }
+
+    private void updateValidationRule()
+    {
+        for ( Integer id : vrList )
+        {
+            ValidationRule vr = validationRuleService.getValidationRule( id );
+
+            Expression leftSide = vr.getLeftSide();
+            Expression rightSide = vr.getRightSide();
+
+            String leftExpression = leftSide.getExpression();
+            String rightExpression = rightSide.getExpression();
+
+            for ( String key2 : deMap2.keySet() )
+            {
+                String operandId = deMap2.get( key2 );
+
+                leftExpression = leftExpression.replaceAll( "\\[" + key2 + "\\]", operandId );
+                rightExpression = rightExpression.replaceAll( "\\[" + key2 + "\\]", operandId );
+            }
+
+            leftSide.setDataElementsInExpression( expressionService.getDataElementsInExpression( leftExpression ) );
+            leftSide.setOptionCombosInExpression( expressionService.getOptionCombosInExpression( leftExpression ) );
+
+            rightSide.setDataElementsInExpression( expressionService.getDataElementsInExpression( rightExpression ) );
+            rightSide.setOptionCombosInExpression( expressionService.getOptionCombosInExpression( rightExpression ) );
+
+            vr.setLeftSide( leftSide );
+            vr.setRightSide( rightSide );
+
+            validationRuleService.updateValidationRule( vr );
+        }
+    }
 }
\ No newline at end of file

=== added file 'local/vn/dhis-web-spreadsheet-reporting/src/main/java/org/hisp/dhis/reportsheet/preview/action/AutoGenerateFormRollBack.java'
--- local/vn/dhis-web-spreadsheet-reporting/src/main/java/org/hisp/dhis/reportsheet/preview/action/AutoGenerateFormRollBack.java	1970-01-01 00:00:00 +0000
+++ local/vn/dhis-web-spreadsheet-reporting/src/main/java/org/hisp/dhis/reportsheet/preview/action/AutoGenerateFormRollBack.java	2012-12-17 10:36:42 +0000
@@ -0,0 +1,211 @@
+package org.hisp.dhis.reportsheet.preview.action;
+
+/*
+ * Copyright (c) 2004-2012, 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.HashSet;
+import java.util.Set;
+
+import org.hisp.dhis.dataelement.DataElementService;
+import org.hisp.dhis.dataset.DataSet;
+import org.hisp.dhis.dataset.DataSetService;
+import org.hisp.dhis.indicator.IndicatorService;
+import org.hisp.dhis.reportsheet.ExportReport;
+import org.hisp.dhis.reportsheet.ExportReportService;
+import org.hisp.dhis.reportsheet.action.ActionSupport;
+import org.hisp.dhis.validation.ValidationRuleService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * @author Dang Duy Hieu
+ * @version $Id$
+ */
+
+public class AutoGenerateFormRollBack
+    extends ActionSupport
+{
+    // -------------------------------------------------------------------------
+    // Dependencies
+    // -------------------------------------------------------------------------
+
+    @Autowired
+    private DataElementService dataElementService;
+
+    @Autowired
+    private DataSetService dataSetService;
+
+    @Autowired
+    private IndicatorService indicatorService;
+
+    @Autowired
+    private ValidationRuleService validationRuleService;
+
+    @Autowired
+    private ExportReportService exportReportService;
+
+    // -------------------------------------------------------------------------
+    // Input && Output
+    // -------------------------------------------------------------------------
+
+    private int exportReportId;
+
+    public void setExportReportId( int exportReportId )
+    {
+        this.exportReportId = exportReportId;
+    }
+
+    private int dataSetId;
+
+    public void setDataSetId( int dataSetId )
+    {
+        this.dataSetId = dataSetId;
+    }
+
+    private Set<Integer> dataElementIds = new HashSet<Integer>();
+
+    public void setDataElementIds( Set<Integer> dataElementIds )
+    {
+        this.dataElementIds = dataElementIds;
+    }
+
+    private Set<Integer> indicatorIds = new HashSet<Integer>();
+
+    public void setIndicatorIds( Set<Integer> indicatorIds )
+    {
+        this.indicatorIds = indicatorIds;
+    }
+
+    private Set<Integer> validationRuleIds = new HashSet<Integer>();
+
+    public void setValidationRuleIds( Set<Integer> validationRuleIds )
+    {
+        this.validationRuleIds = validationRuleIds;
+    }
+
+    // -------------------------------------------------------------------------
+    // Action implementation
+    // -------------------------------------------------------------------------
+
+    public String execute()
+    {
+        cleanUp();
+
+        autoRollBack();
+
+        return SUCCESS;
+    }
+
+    private void cleanUp()
+    {
+        System.gc();
+    }
+
+    private void autoRollBack()
+    {
+        try
+        {
+            message = "";
+
+            if ( exportReportId > 0 )
+            {
+                ExportReport exportReport = exportReportService.getExportReport( exportReportId );
+
+                if ( exportReport != null )
+                {
+                    message += i18n.getString( "report_with_name" ) + " \"" + exportReport.getDisplayName();
+                }
+
+                exportReportService.deleteExportReport( exportReportId );
+
+                message += "\" " + i18n.getString( "deleted" );
+
+                exportReportId = 0;
+            }
+            if ( dataSetId > 0 )
+            {
+                DataSet ds = dataSetService.getDataSet( dataSetId );
+
+                if ( ds != null )
+                {
+                    message += "<br/>" + i18n.getString( "data_set_with_name" ) + " \"" + ds.getDisplayName();
+                }
+
+                dataSetService.deleteDataSet( ds );
+
+                message += "\" " + i18n.getString( "deleted" );
+
+                dataSetId = 0;
+            }
+
+            int i = 0;
+
+            if ( indicatorIds != null && !indicatorIds.isEmpty() )
+            {
+                for ( Integer id : indicatorIds )
+                {
+                    indicatorService.deleteIndicator( indicatorService.getIndicator( id ) );
+                    i++;
+                }
+
+                message += "<br/>" + i18n.getString( "indicators" ) + ": " + i + "/" + indicatorIds.size() + " "
+                    + i18n.getString( "deleted" );
+            }
+            if ( validationRuleIds != null && !validationRuleIds.isEmpty() )
+            {
+                i = 0;
+
+                for ( Integer id : validationRuleIds )
+                {
+                    validationRuleService.deleteValidationRule( validationRuleService.getValidationRule( id ) );
+                    i++;
+                }
+
+                message += "<br/>" + i18n.getString( "validation_rules" ) + ": " + i + "/" + validationRuleIds.size() + " "
+                    + i18n.getString( "deleted" );
+            }
+            if ( dataElementIds != null && !dataElementIds.isEmpty() )
+            {
+                i = 0;
+
+                for ( Integer id : dataElementIds )
+                {
+                    dataElementService.deleteDataElement( dataElementService.getDataElement( id ) );
+                    i++;
+                }
+
+                message += "<br/>" + i18n.getString( "data_elements" ) + ": " + i + "/" + dataElementIds.size() + " "
+                    + i18n.getString( "deleted" );
+            }
+        }
+        catch ( Exception e )
+        {
+            message = i18n.getString( "auto_roll_back_failed" );
+
+            e.printStackTrace();
+        }
+    }
+}
\ No newline at end of file

=== removed file 'local/vn/dhis-web-spreadsheet-reporting/src/main/java/org/hisp/dhis/reportsheet/preview/action/TestAction.java'
--- local/vn/dhis-web-spreadsheet-reporting/src/main/java/org/hisp/dhis/reportsheet/preview/action/TestAction.java	2012-12-11 15:34:39 +0000
+++ local/vn/dhis-web-spreadsheet-reporting/src/main/java/org/hisp/dhis/reportsheet/preview/action/TestAction.java	1970-01-01 00:00:00 +0000
@@ -1,64 +0,0 @@
-package org.hisp.dhis.reportsheet.preview.action;
-
-/*
- * Copyright (c) 2004-2011, 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.HashSet;
-import java.util.Set;
-
-import com.opensymphony.xwork2.Action;
-
-/**
- * @author
- */
-public class TestAction
-    implements Action
-{
-    // TODO remove not required with struts2
-
-    // -------------------------------------------------------------------------
-    // Action implementation
-    // -------------------------------------------------------------------------
-
-    public String execute()
-    {
-        Set<Integer> collectSheets = new HashSet<Integer>();
-        collectSheets.add( 1 );
-
-        try
-        {
-//            new AutoGenerateFormByTemplate( "d:\\template_file.xls", collectSheets );
-        }
-        catch ( Exception e )
-        {
-            System.out.println( e.getMessage() );
-        }
-
-        return SUCCESS;
-    }
-
-}

=== modified file 'local/vn/dhis-web-spreadsheet-reporting/src/main/resources/META-INF/dhis/beans.xml'
--- local/vn/dhis-web-spreadsheet-reporting/src/main/resources/META-INF/dhis/beans.xml	2012-12-11 15:34:39 +0000
+++ local/vn/dhis-web-spreadsheet-reporting/src/main/resources/META-INF/dhis/beans.xml	2012-12-17 10:36:42 +0000
@@ -1527,14 +1527,15 @@
 	<bean id="org.hisp.dhis.reportsheet.organisationunit.action.AddMultiOrganisationUnitAction"
 		class="org.hisp.dhis.reportsheet.organisationunit.action.AddMultiOrganisationUnitAction"
 		scope="prototype" />
-
-	<bean id="org.hisp.dhis.reportsheet.preview.action.TestAction"
-		class="org.hisp.dhis.reportsheet.preview.action.TestAction"
-		scope="prototype" />
 	
 	<bean id="org.hisp.dhis.reportsheet.preview.action.AutoGenerateFormByTemplate"
 		class="org.hisp.dhis.reportsheet.preview.action.AutoGenerateFormByTemplate"
 		scope="prototype">
 	</bean>
 	
+	<bean id="org.hisp.dhis.reportsheet.preview.action.AutoGenerateFormRollBack"
+		class="org.hisp.dhis.reportsheet.preview.action.AutoGenerateFormRollBack"
+		scope="prototype">
+	</bean>
+	
 </beans>

=== modified file 'local/vn/dhis-web-spreadsheet-reporting/src/main/resources/org/hisp/dhis/reportsheet/i18n_module.properties'
--- local/vn/dhis-web-spreadsheet-reporting/src/main/resources/org/hisp/dhis/reportsheet/i18n_module.properties	2012-12-12 09:34:51 +0000
+++ local/vn/dhis-web-spreadsheet-reporting/src/main/resources/org/hisp/dhis/reportsheet/i18n_module.properties	2012-12-17 10:36:42 +0000
@@ -376,18 +376,21 @@
 permission_notification 	 = You don't have any permission in this Export report. Please contact with
 org_unit_with_name			 = Organisation unit
 data_set_with_name			 = Data set
+report_with_name			 = Export report name
 uncompleted					 = uncompleted
 importing					 = Importing
 specified_data_set_unavailable = Selected data set is not exist
 specified_data_set_unassign_to_export_report = Selected data set is not assign to any Export report
-roll_back_import 			= Rollback imported value
-data_value					= data value
-old_value					= The old value
-new_value					= The new value
-reverted					= reverted
-deleted						= deleted
-no_value_rollbacked			= There is no value rollbacked
-automate					= Automate
-auto_generate_form			= Automatic generating form
-generate_form				= Generate form
-auto_generate_form_completed= Form generated
\ No newline at end of file
+roll_back_import			 = Rollback imported value
+auto_roll_back_failed		 = Automatic rollback failed
+data_value					 = data value
+old_value					 = The old value
+new_value					 = The new value
+reverted					 = reverted
+deleted						 = deleted
+no_value_rollbacked			 = There is no value rollbacked
+automate					 = Automate
+auto_generate_form			 = Automatic generating form
+generate_form				 = Generate form
+generate_form_confirm		 = Would you like to generate form now ?
+auto_generate_form_completed = Form generated
\ No newline at end of file

=== modified file 'local/vn/dhis-web-spreadsheet-reporting/src/main/resources/org/hisp/dhis/reportsheet/i18n_module_vi_VN.properties'
--- local/vn/dhis-web-spreadsheet-reporting/src/main/resources/org/hisp/dhis/reportsheet/i18n_module_vi_VN.properties	2012-12-12 09:34:51 +0000
+++ local/vn/dhis-web-spreadsheet-reporting/src/main/resources/org/hisp/dhis/reportsheet/i18n_module_vi_VN.properties	2012-12-17 10:36:42 +0000
@@ -407,11 +407,13 @@
 via_email = th\u00f4ng qua th\u01b0 \u0111i\u1ec7n t\u1eed
 org_unit_with_name = \u0110\u01a1n v\u1ecb
 data_set_with_name = Bi\u1ec3u nh\u1eadp
+report_with_name = B\u00e1o c\u00e1o Xu\u1ea5t
 uncompleted	= ch\u01b0a ho\u00e0n t\u1ea5t
 importing = T\u00edch h\u1ee3p d\u1eef li\u1ec7u
 specified_data_set_unavailable = M\u1eabu b\u00e1o c\u00e1o n\u00e0y kh\u00f4ng t\u1ed3n t\u1ea1i
 specified_data_set_unassign_to_export_report = M\u1eabu b\u00e1o c\u00e1o n\u00e0y ch\u01b0a \u0111\u01b0\u1ee3c g\u00e1n v\u00e0o b\u1ea5t k\u1ef3 bi\u1ec3u Xu\u1ea5t n\u00e0o
 roll_back_import = Ph\u1ee5c h\u1ed3i gi\u00e1 tr\u1ecb import
+auto_roll_back_failed = Qu\u00e1 tr\u00ecnh ph\u1ee5c h\u1ed3i l\u1ed7i
 data_value = gi\u00e1 tr\u1ecb
 old_value = D\u1eef li\u1ec7u c\u0169
 new_value = D\u1eef li\u1ec7u m\u1edbi
@@ -421,4 +423,5 @@
 automate = T\u1ef1 \u0111\u1ed9ng h\u00f3a
 auto_generate_form = T\u1ef1 \u0111\u1ed9ng t\u1ea1o bi\u1ec3u m\u1eabu
 generate_form = T\u1ea1o bi\u1ec3u m\u1eabu
+generate_form_confirm = B\u1ea1n c\u00f3 mu\u1ed1n t\u1ea1o bi\u1ec3u m\u1eabu ngay b\u00e2y gi\u1edd ?
 auto_generate_form_completed = Bi\u1ec3u m\u1eabu \u0111\u01b0\u1ee3c ho\u00e0n th\u00e0nh
\ No newline at end of file

=== modified file 'local/vn/dhis-web-spreadsheet-reporting/src/main/resources/struts.xml'
--- local/vn/dhis-web-spreadsheet-reporting/src/main/resources/struts.xml	2012-12-12 09:34:51 +0000
+++ local/vn/dhis-web-spreadsheet-reporting/src/main/resources/struts.xml	2012-12-17 10:36:42 +0000
@@ -1841,13 +1841,6 @@
 			<result name="success" type="redirect">administration.action</result>
 			<param name="requiredAuthorities">F_MULTI_ORGANISATION_UNIT_ADD</param>
 		</action>
-
-		<action name="testAction"
-			class="org.hisp.dhis.reportsheet.preview.action.TestAction">
-			<result name="success" type="velocity-json">../dhis-web-commons/ajax/jsonResponseSuccess.vm</result>
-			<result name="error" type="velocity-json">../dhis-web-commons/ajax/jsonResponseError.vm</result>
-			<param name="onExceptionReturn">plainTextError</param>
-		</action>
 		
 		<action name="showAutoGenerateForm"
 			class="org.hisp.dhis.reportsheet.action.NoAction">
@@ -1868,7 +1861,14 @@
 			<result name="success" type="velocity-xml">
 				/dhis-web-spreadsheet-reporting/responseExportReportPreview.vm</result>
 			<result name="error" type="velocity-xml">
-				/dhis-web-commons/ajax/xmlResponseError.vm</result>
+				/dhis-web-spreadsheet-reporting/responseAutoGenerateFormError.vm</result>
+		</action>
+
+		<action name="autoGenerateFormRollback"
+			class="org.hisp.dhis.reportsheet.preview.action.AutoGenerateFormRollBack">
+			<result name="success" type="velocity-json">../dhis-web-commons/ajax/jsonResponseSuccess.vm</result>
+			<result name="error" type="velocity-json">../dhis-web-commons/ajax/jsonResponseError.vm</result>
+			<param name="onExceptionReturn">plainTextError</param>
 		</action>
 		
 	</package>

=== modified file 'local/vn/dhis-web-spreadsheet-reporting/src/main/webapp/dhis-web-spreadsheet-reporting/javascript/autoGenerateForm.js'
--- local/vn/dhis-web-spreadsheet-reporting/src/main/webapp/dhis-web-spreadsheet-reporting/javascript/autoGenerateForm.js	2012-12-15 09:52:30 +0000
+++ local/vn/dhis-web-spreadsheet-reporting/src/main/webapp/dhis-web-spreadsheet-reporting/javascript/autoGenerateForm.js	2012-12-17 10:36:42 +0000
@@ -35,7 +35,9 @@
 		{ 'draft': true, 'allowNewName': false },
 		function( data, e ) {
 			try {
-				window.location.reload();
+				if ( window.confirm( i18n_generate_form_confirm ) ) {
+					autoGenerateFormByTemplate();
+				} else return;
 			}
 			catch(e) {
 				alert(e);
@@ -62,7 +64,41 @@
 	
 	if ( type && type == 'error' )
 	{
-		showErrorMessage( parentElement.firstChild.nodeValue );
+		var dataElementTag 		= parentElement.getElementsByTagName( 'dataElements' )[0];
+		var indicatorTag		= parentElement.getElementsByTagName( 'indicators' )[0];
+		var validationRuleTag	= parentElement.getElementsByTagName( 'validationRules' )[0];
+
+		var dataElements 		= dataElementTag.getElementsByTagName( 'id' );
+		var indicators 			= dataElementTag.getElementsByTagName( 'id' );
+		var validationRules 	= dataElementTag.getElementsByTagName( 'id' );
+		
+		var reportId = getElementAttribute( parentElement, 'exportReport', 'id' );
+		var dataSetId = getElementAttribute( parentElement, 'dataSet', 'id' );
+		
+		var url = 'autoGenerateFormRollback.action?';
+		
+		for ( var i  = 0 ; i < dataElements.length ; i ++ )
+		{
+			url += 'dataElementIds=' + dataElements[i].firstChild.nodeValue + '&';
+		}
+		for ( var i  = 0 ; i < indicators.length ; i ++ )
+		{
+			url += 'indicatorIds=' + indicators[i].firstChild.nodeValue + '&';
+		}
+		for ( var i  = 0 ; i < validationRules.length ; i ++ )
+		{
+			url += 'validationRuleIds=' + validationRules[i].firstChild.nodeValue + '&';
+		}
+		
+		url += 'exportReportId=' + reportId + '&dataSetId=' + dataSetId;
+		
+		jQuery.post( url, {}, function( json ) {
+			if ( json.response == "success" ) {
+				showSuccessMessage( json.message, 7000 );
+			} else {
+				showErrorMessage( json.message, 5000 );
+			}
+		} );
 	}
 	else
 	{	
@@ -169,7 +205,7 @@
 		//showById( "previewDiv" );
 			
 		unLockScreen();
-		showSuccessMessage( i18n_auto_generate_form_completed );
+		showSuccessMessage( i18n_auto_generate_form_completed, 3000 );
 
 		if ( _sHTML.length > 0 )
 		{

=== added file 'local/vn/dhis-web-spreadsheet-reporting/src/main/webapp/dhis-web-spreadsheet-reporting/responseAutoGenerateFormError.vm'
--- local/vn/dhis-web-spreadsheet-reporting/src/main/webapp/dhis-web-spreadsheet-reporting/responseAutoGenerateFormError.vm	1970-01-01 00:00:00 +0000
+++ local/vn/dhis-web-spreadsheet-reporting/src/main/webapp/dhis-web-spreadsheet-reporting/responseAutoGenerateFormError.vm	2012-12-17 10:36:42 +0000
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<data>
+	<message type="error">$encoder.xmlEncode( $message )</message>
+	<exportReport id="$exportReportId" />
+	<dataSet id="$dataSetId" />
+	<dataElements>
+	#foreach( $id in $dataElementIds )
+		<id>$id</id>
+	#end
+	</dataElements>
+	<indicators>
+	#foreach( $id in $indicatorIds )
+		<id>$id</id>
+	#end
+	</indicators>
+	<validationRules>
+	#foreach( $id in $validationRuleIds )
+		<id>$id</id>
+	#end
+	</validationRules>
+</data>
\ No newline at end of file

=== modified file 'local/vn/dhis-web-spreadsheet-reporting/src/main/webapp/dhis-web-spreadsheet-reporting/showAutoGenerateForm.vm'
--- local/vn/dhis-web-spreadsheet-reporting/src/main/webapp/dhis-web-spreadsheet-reporting/showAutoGenerateForm.vm	2012-12-16 20:17:59 +0000
+++ local/vn/dhis-web-spreadsheet-reporting/src/main/webapp/dhis-web-spreadsheet-reporting/showAutoGenerateForm.vm	2012-12-17 10:36:42 +0000
@@ -26,5 +26,6 @@
 </body>
 
 <script type="text/javascript">
+	var i18n_generate_form_confirm = '$encoder.jsEscape( $i18n.getString("generate_form_confirm"), "'" )';
 	var i18n_auto_generate_form_completed = '$encoder.jsEscape( $i18n.getString("auto_generate_form_completed"), "'" )';
 </script>
\ No newline at end of file