← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 5946: added ui for batch deletion of lock exceptions

 

------------------------------------------------------------
revno: 5946
committer: Morten Olav Hansen <mortenoh@xxxxxxxxx>
branch nick: dhis2
timestamp: Tue 2012-02-14 09:58:08 +0700
message:
  added ui for batch deletion of lock exceptions
added:
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/java/org/hisp/dhis/dataadmin/action/lockexception/BatchRemoveLockExceptionsAction.java
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/java/org/hisp/dhis/dataadmin/action/lockexception/PrepareBatchRemovalAction.java
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/removeLockExceptionBatch.vm
modified:
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataset/DataSetService.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataset/LockExceptionStore.java
  dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataset/DefaultDataSetService.java
  dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataset/hibernate/HibernateLockExceptionStore.java
  dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/java/org/hisp/dhis/dataadmin/action/lockexception/GetLockExceptionListAction.java
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/META-INF/dhis/beans.xml
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/org/hisp/dhis/dataadmin/i18n_module.properties
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/struts.xml
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/javascript/lockException.js
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/lockException.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 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataset/DataSetService.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataset/DataSetService.java	2012-02-08 12:39:22 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataset/DataSetService.java	2012-02-14 02:58:08 +0000
@@ -29,6 +29,7 @@
 
 import org.hisp.dhis.dataelement.DataElement;
 import org.hisp.dhis.organisationunit.OrganisationUnit;
+import org.hisp.dhis.period.Period;
 import org.hisp.dhis.period.PeriodType;
 
 import java.util.Collection;
@@ -284,4 +285,21 @@
      * @return Collection of LockExceptions withing the range specified
      */
     public Collection<LockException> getLockExceptionsBetween( int first, int max );
+
+    /**
+     * Find all unique dataSet + period combinations
+     * (mainly used for batch removal)
+     *
+     * @return A collection of all unique combinations (only dataSet and period is set)
+     */
+    public Collection<LockException> getLockExceptionCombinations();
+
+    /**
+     * Delete a dataSet + period combination, used for batch removal, e.g. when you
+     * have a lock exception set on 100 OUs with the same dataSet + period combination.
+     *
+     * @param dataSet DataSet part of the combination
+     * @param period  Period part of the combination
+     */
+    public void deleteLockExceptionCombination( DataSet dataSet, Period period );
 }

=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataset/LockExceptionStore.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataset/LockExceptionStore.java	2012-02-05 13:27:40 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataset/LockExceptionStore.java	2012-02-14 02:58:08 +0000
@@ -28,6 +28,9 @@
  */
 
 import org.hisp.dhis.common.GenericStore;
+import org.hisp.dhis.period.Period;
+
+import java.util.Collection;
 
 /**
  * @author Morten Olav Hansen <mortenoh@xxxxxxxxx>
@@ -36,4 +39,8 @@
     extends GenericStore<LockException>
 {
     String ID = LockExceptionStore.class.getName();
+
+    Collection<LockException> getCombinations();
+
+    void deleteCombination( DataSet dataSet, Period period );
 }

=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataset/DefaultDataSetService.java'
--- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataset/DefaultDataSetService.java	2012-02-08 12:04:46 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataset/DefaultDataSetService.java	2012-02-14 02:58:08 +0000
@@ -34,6 +34,7 @@
 import org.hisp.dhis.dataentryform.DataEntryForm;
 import org.hisp.dhis.i18n.I18nService;
 import org.hisp.dhis.organisationunit.OrganisationUnit;
+import org.hisp.dhis.period.Period;
 import org.hisp.dhis.period.PeriodType;
 import org.hisp.dhis.system.util.AuditLogUtil;
 import org.hisp.dhis.system.util.Filter;
@@ -378,4 +379,16 @@
         // FIXME extend lockExceptionStore to include HQL query for this
         return getAllLockExceptions();
     }
+
+    @Override
+    public Collection<LockException> getLockExceptionCombinations()
+    {
+        return lockExceptionStore.getCombinations();
+    }
+
+    @Override
+    public void deleteLockExceptionCombination( DataSet dataSet, Period period )
+    {
+        lockExceptionStore.deleteCombination( dataSet, period );
+    }
 }

=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataset/hibernate/HibernateLockExceptionStore.java'
--- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataset/hibernate/HibernateLockExceptionStore.java	2012-02-05 13:27:40 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataset/hibernate/HibernateLockExceptionStore.java	2012-02-14 02:58:08 +0000
@@ -27,9 +27,21 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hisp.dhis.dataset.DataSet;
+import org.hisp.dhis.dataset.DataSetService;
 import org.hisp.dhis.dataset.LockException;
 import org.hisp.dhis.dataset.LockExceptionStore;
 import org.hisp.dhis.hibernate.HibernateGenericStore;
+import org.hisp.dhis.period.Period;
+import org.hisp.dhis.period.PeriodService;
+import org.springframework.jdbc.core.RowCallbackHandler;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collection;
 
 /**
  * @author Morten Olav Hansen <mortenoh@xxxxxxxxx>
@@ -38,4 +50,70 @@
     extends HibernateGenericStore<LockException>
     implements LockExceptionStore
 {
+    // -------------------------------------------------------------------------
+    // Dependencies
+    // -------------------------------------------------------------------------
+
+    private DataSetService dataSetService;
+
+    public void setDataSetService( DataSetService dataSetService )
+    {
+        this.dataSetService = dataSetService;
+    }
+
+    private PeriodService periodService;
+
+    public void setPeriodService( PeriodService periodService )
+    {
+        this.periodService = periodService;
+    }
+
+    // -------------------------------------------------------------------------
+    // LockExceptionStore Implementation
+    // -------------------------------------------------------------------------
+
+    @Override
+    public Collection<LockException> getCombinations()
+    {
+        final String sql = "SELECT DISTINCT datasetid, periodid FROM LockException";
+
+        final Collection<LockException> lockExceptions = new ArrayList<LockException>();
+
+        jdbcTemplate.query( sql, new RowCallbackHandler()
+        {
+            @Override
+            public void processRow( ResultSet rs ) throws SQLException
+            {
+                int dataSetId = rs.getInt( 1 );
+                int periodId = rs.getInt( 2 );
+
+                LockException lockException = new LockException();
+                Period period = periodService.getPeriod( periodId );
+                DataSet dataSet = dataSetService.getDataSet( dataSetId );
+
+                lockException.setDataSet( dataSet );
+                lockException.setPeriod( period );
+
+                lockExceptions.add( lockException );
+            }
+        } );
+
+        return lockExceptions;
+    }
+
+    @Override
+    public void deleteCombination( DataSet dataSet, Period period )
+    {
+        Session session = sessionFactory.getCurrentSession();
+
+        final String hql = "DELETE FROM LockException WHERE dataSet=:dataSet AND period=:period";
+        Query query = session.createQuery( hql );
+        query.setParameter( "dataSet", dataSet );
+        query.setParameter( "period", period );
+
+        query.executeUpdate();
+
+//        final String sql = "DELETE FROM LockException WHERE dataSetId=? AND periodId=?";
+//        jdbcTemplate.update( sql, new Object[]{dataSet.getId(), period.getId()} );
+    }
 }

=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml'
--- dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml	2012-02-08 12:04:46 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml	2012-02-14 02:58:08 +0000
@@ -88,7 +88,10 @@
   <bean id="org.hisp.dhis.dataset.LockExceptionStore" class="org.hisp.dhis.dataset.hibernate.HibernateLockExceptionStore">
     <property name="clazz" value="org.hisp.dhis.dataset.LockException" />
     <property name="sessionFactory" ref="sessionFactory" />
+    <property name="jdbcTemplate" ref="jdbcTemplate" />
     <property name="cacheable" value="true" />
+    <property name="dataSetService" ref="org.hisp.dhis.dataset.DataSetService" />
+    <property name="periodService" ref="org.hisp.dhis.period.PeriodService" />
   </bean>
 
   <bean id="org.hisp.dhis.dataset.CompleteDataSetRegistrationStore" class="org.hisp.dhis.dataset.hibernate.HibernateCompleteDataSetRegistrationStore">

=== added file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/java/org/hisp/dhis/dataadmin/action/lockexception/BatchRemoveLockExceptionsAction.java'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/java/org/hisp/dhis/dataadmin/action/lockexception/BatchRemoveLockExceptionsAction.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/java/org/hisp/dhis/dataadmin/action/lockexception/BatchRemoveLockExceptionsAction.java	2012-02-14 02:58:08 +0000
@@ -0,0 +1,97 @@
+package org.hisp.dhis.dataadmin.action.lockexception;
+
+/*
+ * 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 com.opensymphony.xwork2.Action;
+import org.hisp.dhis.dataset.DataSet;
+import org.hisp.dhis.dataset.DataSetService;
+import org.hisp.dhis.period.Period;
+import org.hisp.dhis.period.PeriodService;
+
+/**
+ * @author Morten Olav Hansen <mortenoh@xxxxxxxxx>
+ */
+public class BatchRemoveLockExceptionsAction
+    implements Action
+{
+    // -------------------------------------------------------------------------
+    // Dependencies
+    // -------------------------------------------------------------------------
+
+    private DataSetService dataSetService;
+
+    public void setDataSetService( DataSetService dataSetService )
+    {
+        this.dataSetService = dataSetService;
+    }
+
+    private PeriodService periodService;
+
+    public void setPeriodService( PeriodService periodService )
+    {
+        this.periodService = periodService;
+    }
+
+    // -------------------------------------------------------------------------
+    // Input & Output
+    // -------------------------------------------------------------------------
+
+    private int dataSetId;
+
+    public void setDataSetId( int dataSetId )
+    {
+        this.dataSetId = dataSetId;
+    }
+
+    private int periodId;
+
+    public void setPeriodId( int periodId )
+    {
+        this.periodId = periodId;
+    }
+
+    // -------------------------------------------------------------------------
+    // Action Implementation
+    // -------------------------------------------------------------------------
+
+    @Override
+    public String execute() throws Exception
+    {
+        DataSet dataSet = dataSetService.getDataSet( dataSetId );
+        Period period = periodService.getPeriod( periodId );
+
+        if ( dataSet == null || period == null )
+        {
+            return ERROR;
+        }
+
+        dataSetService.deleteLockExceptionCombination( dataSet, period );
+
+        return SUCCESS;
+    }
+}

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/java/org/hisp/dhis/dataadmin/action/lockexception/GetLockExceptionListAction.java'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/java/org/hisp/dhis/dataadmin/action/lockexception/GetLockExceptionListAction.java	2012-02-08 12:04:46 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/java/org/hisp/dhis/dataadmin/action/lockexception/GetLockExceptionListAction.java	2012-02-14 02:58:08 +0000
@@ -102,6 +102,8 @@
             lockExceptions = lockExceptions.subList( paging.getStartPos(), paging.getEndPos() );
         }
 
+        dataSetService.getLockExceptionCombinations();
+
         return SUCCESS;
     }
 }

=== added file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/java/org/hisp/dhis/dataadmin/action/lockexception/PrepareBatchRemovalAction.java'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/java/org/hisp/dhis/dataadmin/action/lockexception/PrepareBatchRemovalAction.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/java/org/hisp/dhis/dataadmin/action/lockexception/PrepareBatchRemovalAction.java	2012-02-14 02:58:08 +0000
@@ -0,0 +1,90 @@
+package org.hisp.dhis.dataadmin.action.lockexception;
+
+/*
+ * 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 com.opensymphony.xwork2.Action;
+import org.hisp.dhis.dataset.DataSetService;
+import org.hisp.dhis.dataset.LockException;
+import org.hisp.dhis.i18n.I18nFormat;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Morten Olav Hansen <mortenoh@xxxxxxxxx>
+ */
+public class PrepareBatchRemovalAction
+    implements Action
+{
+    // -------------------------------------------------------------------------
+    // Dependencies
+    // -------------------------------------------------------------------------
+
+    private DataSetService dataSetService;
+
+    public void setDataSetService( DataSetService dataSetService )
+    {
+        this.dataSetService = dataSetService;
+    }
+
+    private I18nFormat format;
+
+    public void setFormat( I18nFormat format )
+    {
+        this.format = format;
+    }
+
+    // -------------------------------------------------------------------------
+    // Input & Output
+    // -------------------------------------------------------------------------
+
+    private List<LockException> lockExceptions;
+
+    public List<LockException> getLockExceptions()
+    {
+        return lockExceptions;
+    }
+
+    // -------------------------------------------------------------------------
+    // Action Implementation
+    // -------------------------------------------------------------------------
+
+    @Override
+    public String execute() throws Exception
+    {
+        lockExceptions = new ArrayList<LockException>( dataSetService.getLockExceptionCombinations() );
+
+        for ( LockException lockException : lockExceptions )
+        {
+            lockException.getPeriod().setName( format.formatPeriod( lockException.getPeriod() ) );
+
+        }
+
+        return SUCCESS;
+    }
+}

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/META-INF/dhis/beans.xml'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/META-INF/dhis/beans.xml	2012-02-13 04:51:23 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/META-INF/dhis/beans.xml	2012-02-14 02:58:08 +0000
@@ -1,24 +1,27 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
-  xsi:schemaLocation="
+    xsi:schemaLocation="
 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd";>
 
   <!-- Locking -->
 
-  <bean id="org.hisp.dhis.dataadmin.action.lock.GetPeriodTypesAction" class="org.hisp.dhis.dataadmin.action.lock.GetPeriodTypesAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.lock.GetPeriodTypesAction"
+      class="org.hisp.dhis.dataadmin.action.lock.GetPeriodTypesAction"
+      scope="prototype">
     <property name="periodService" ref="org.hisp.dhis.period.PeriodService" />
     <property name="selectionTreeManager" ref="org.hisp.dhis.oust.manager.SelectionTreeManager" />
   </bean>
 
-  <bean id="org.hisp.dhis.dataadmin.action.lock.GetDataSetsForPeriodTypeAction" class="org.hisp.dhis.dataadmin.action.lock.GetDataSetsForPeriodTypeAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.lock.GetDataSetsForPeriodTypeAction"
+      class="org.hisp.dhis.dataadmin.action.lock.GetDataSetsForPeriodTypeAction"
+      scope="prototype">
     <property name="dataSetService" ref="org.hisp.dhis.dataset.DataSetService" />
     <property name="periodService" ref="org.hisp.dhis.period.PeriodService" />
   </bean>
 
-  <bean id="org.hisp.dhis.dataadmin.action.lock.CollectiveDataLockingAction" class="org.hisp.dhis.dataadmin.action.lock.CollectiveDataLockingAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.lock.CollectiveDataLockingAction"
+      class="org.hisp.dhis.dataadmin.action.lock.CollectiveDataLockingAction"
+      scope="prototype">
     <property name="periodService" ref="org.hisp.dhis.period.PeriodService" />
     <property name="dataSetService" ref="org.hisp.dhis.dataset.DataSetService" />
     <property name="dataSetLockService" ref="org.hisp.dhis.datalock.DataSetLockService" />
@@ -26,73 +29,84 @@
     <property name="selectionTreeManager" ref="org.hisp.dhis.oust.manager.SelectionTreeManager" />
   </bean>
 
-  <bean id="org.hisp.dhis.dataadmin.action.lock.GetPeriodsForLockAction" class="org.hisp.dhis.dataadmin.action.lock.GetPeriodsForLockAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.lock.GetPeriodsForLockAction"
+      class="org.hisp.dhis.dataadmin.action.lock.GetPeriodsForLockAction"
+      scope="prototype">
     <property name="periodService" ref="org.hisp.dhis.period.PeriodService" />
   </bean>
 
-  <bean id="org.hisp.dhis.dataadmin.action.lock.ValidateCollectiveDataLockingAction" class="org.hisp.dhis.dataadmin.action.lock.ValidateCollectiveDataLockingAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.lock.ValidateCollectiveDataLockingAction"
+      class="org.hisp.dhis.dataadmin.action.lock.ValidateCollectiveDataLockingAction"
+      scope="prototype">
     <property name="selectionTreeManager" ref="org.hisp.dhis.oust.manager.SelectionTreeManager" />
   </bean>
 
   <!-- Maintenance -->
 
-  <bean id="org.hisp.dhis.dataadmin.action.maintenance.PerformMaintenanceAction" class="org.hisp.dhis.dataadmin.action.maintenance.PerformMaintenanceAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.maintenance.PerformMaintenanceAction"
+      class="org.hisp.dhis.dataadmin.action.maintenance.PerformMaintenanceAction"
+      scope="prototype">
     <property name="maintenanceService" ref="org.hisp.dhis.maintenance.MaintenanceService" />
     <property name="completenessService" ref="compulsoryDataCompletenessService" />
     <property name="aggregatedDataValueService" ref="org.hisp.dhis.aggregation.AggregatedDataValueService" />
-	<property name="aggregatedOrgUnitDataValueService" ref="org.hisp.dhis.aggregation.AggregatedOrgUnitDataValueService" />
+    <property name="aggregatedOrgUnitDataValueService"
+        ref="org.hisp.dhis.aggregation.AggregatedOrgUnitDataValueService" />
     <property name="periodService" ref="org.hisp.dhis.period.PeriodService" />
   </bean>
 
   <!-- Resource table -->
 
-  <bean id="org.hisp.dhis.dataadmin.action.resourcetable.GenerateResourceTableAction" class="org.hisp.dhis.dataadmin.action.resourcetable.GenerateResourceTableAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.resourcetable.GenerateResourceTableAction"
+      class="org.hisp.dhis.dataadmin.action.resourcetable.GenerateResourceTableAction"
+      scope="prototype">
     <property name="resourceTableService" ref="org.hisp.dhis.resourcetable.ResourceTableService" />
     <property name="sqlViewService" ref="org.hisp.dhis.sqlview.SqlViewService" />
   </bean>
 
   <!-- Cache -->
 
-  <bean id="org.hisp.dhis.dataadmin.action.cache.ShowCacheAction" class="org.hisp.dhis.dataadmin.action.cache.ShowCacheAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.cache.ShowCacheAction"
+      class="org.hisp.dhis.dataadmin.action.cache.ShowCacheAction"
+      scope="prototype">
     <property name="cacheManager" ref="cacheManager" />
   </bean>
 
-  <bean id="org.hisp.dhis.dataadmin.action.cache.ClearCacheAction" class="org.hisp.dhis.dataadmin.action.cache.ClearCacheAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.cache.ClearCacheAction"
+      class="org.hisp.dhis.dataadmin.action.cache.ClearCacheAction"
+      scope="prototype">
     <property name="cacheManager" ref="cacheManager" />
   </bean>
 
   <!-- Data integrity -->
 
-  <bean id="org.hisp.dhis.dataadmin.action.dataintegrity.GetDataIntegrityAction" class="org.hisp.dhis.dataadmin.action.dataintegrity.GetDataIntegrityAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.dataintegrity.GetDataIntegrityAction"
+      class="org.hisp.dhis.dataadmin.action.dataintegrity.GetDataIntegrityAction"
+      scope="prototype">
     <property name="dataIntegrityService" ref="org.hisp.dhis.dataintegrity.DataIntegrityService" />
   </bean>
 
   <!-- Statistics -->
 
-  <bean id="org.hisp.dhis.dataadmin.action.statistics.GetStatisticsAction" class="org.hisp.dhis.dataadmin.action.statistics.GetStatisticsAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.statistics.GetStatisticsAction"
+      class="org.hisp.dhis.dataadmin.action.statistics.GetStatisticsAction"
+      scope="prototype">
     <property name="statisticsProvider" ref="org.hisp.dhis.statistics.StatisticsProvider" />
     <property name="userService" ref="org.hisp.dhis.user.UserService" />
     <property name="dataValueService" ref="org.hisp.dhis.datavalue.DataValueService" />
   </bean>
 
-  <bean id="org.hisp.dhis.dataadmin.action.statistics.GetStatisticsChartAction" class="org.hisp.dhis.dataadmin.action.statistics.GetStatisticsChartAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.statistics.GetStatisticsChartAction"
+      class="org.hisp.dhis.dataadmin.action.statistics.GetStatisticsChartAction"
+      scope="prototype">
     <property name="statisticsProvider" ref="org.hisp.dhis.statistics.StatisticsProvider" />
     <property name="chartService" ref="org.hisp.dhis.chart.ChartService" />
   </bean>
 
   <!-- Databrowser Grid -->
 
-  <bean id="org.hisp.dhis.dataadmin.action.databrowser.DataBrowserAction" class="org.hisp.dhis.dataadmin.action.databrowser.DataBrowserAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.databrowser.DataBrowserAction"
+      class="org.hisp.dhis.dataadmin.action.databrowser.DataBrowserAction"
+      scope="prototype">
     <property name="dataBrowserGridService" ref="org.hisp.dhis.databrowser.DataBrowserGridService" />
     <property name="dataElementService" ref="org.hisp.dhis.dataelement.DataElementService" />
     <property name="dataSetService" ref="org.hisp.dhis.dataset.DataSetService" />
@@ -102,101 +116,117 @@
     <property name="organisationUnitGroupService" ref="org.hisp.dhis.organisationunit.OrganisationUnitGroupService" />
   </bean>
 
-  <bean id="org.hisp.dhis.dataadmin.action.databrowser.GetPeriodTypesAction" class="org.hisp.dhis.dataadmin.action.databrowser.GetPeriodTypesAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.databrowser.GetPeriodTypesAction"
+      class="org.hisp.dhis.dataadmin.action.databrowser.GetPeriodTypesAction"
+      scope="prototype">
     <property name="periodService" ref="org.hisp.dhis.period.PeriodService" />
   </bean>
 
-  <bean id="org.hisp.dhis.dataadmin.action.databrowser.ExportResultAction" class="org.hisp.dhis.dataadmin.action.databrowser.ExportResultAction"
-    scope="prototype" />
+  <bean id="org.hisp.dhis.dataadmin.action.databrowser.ExportResultAction"
+      class="org.hisp.dhis.dataadmin.action.databrowser.ExportResultAction"
+      scope="prototype" />
 
   <!-- Organisation unit merge -->
 
-  <bean id="org.hisp.dhis.dataadmin.action.organisationunitmerge.MergeOrganisationUnitsAction" class="org.hisp.dhis.dataadmin.action.organisationunitmerge.MergeOrganisationUnitsAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.organisationunitmerge.MergeOrganisationUnitsAction"
+      class="org.hisp.dhis.dataadmin.action.organisationunitmerge.MergeOrganisationUnitsAction"
+      scope="prototype">
     <property name="dataMergeService" ref="org.hisp.dhis.datamerge.DataMergeService" />
     <property name="organisationUnitService" ref="org.hisp.dhis.organisationunit.OrganisationUnitService" />
   </bean>
 
   <!-- Prune Organisation unit -->
 
-  <bean id="org.hisp.dhis.dataadmin.action.dataprune.PruneOrganisationUnitAction" class="org.hisp.dhis.dataadmin.action.dataprune.PruneOrganisationUnitAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.dataprune.PruneOrganisationUnitAction"
+      class="org.hisp.dhis.dataadmin.action.dataprune.PruneOrganisationUnitAction"
+      scope="prototype">
     <property name="dataPruneService" ref="org.hisp.dhis.dataprune.DataPruneService" />
     <property name="selectionTreeManager" ref="org.hisp.dhis.oust.manager.SelectionTreeManager" />
   </bean>
 
   <!-- Duplicate data elimination -->
 
-  <bean id="org.hisp.dhis.dataadmin.action.duplicatedataelimination.EliminateDuplicateDataAction" class="org.hisp.dhis.dataadmin.action.duplicatedataelimination.EliminateDuplicateDataAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.duplicatedataelimination.EliminateDuplicateDataAction"
+      class="org.hisp.dhis.dataadmin.action.duplicatedataelimination.EliminateDuplicateDataAction"
+      scope="prototype">
     <property name="dataMergeService" ref="org.hisp.dhis.datamerge.DataMergeService" />
     <property name="dataElementService" ref="org.hisp.dhis.dataelement.DataElementService" />
     <property name="categoryService" ref="org.hisp.dhis.dataelement.DataElementCategoryService" />
   </bean>
 
   <!-- Data Element Zero Value Storage Management -->
-  <bean id="org.hisp.dhis.dataadmin.action.zerovaluestorage.OpenDataElementsZeroIsSignificantManagerAction" class="org.hisp.dhis.dataadmin.action.zerovaluestorage.OpenDataElementsZeroIsSignificantManagerAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.zerovaluestorage.OpenDataElementsZeroIsSignificantManagerAction"
+      class="org.hisp.dhis.dataadmin.action.zerovaluestorage.OpenDataElementsZeroIsSignificantManagerAction"
+      scope="prototype">
     <property name="dataElementService" ref="org.hisp.dhis.dataelement.DataElementService" />
   </bean>
 
-  <bean id="org.hisp.dhis.dataadmin.action.zerovaluestorage.UpdateZeroIsSignificantForDataElementsAction" class="org.hisp.dhis.dataadmin.action.zerovaluestorage.UpdateZeroIsSignificantForDataElementsAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.zerovaluestorage.UpdateZeroIsSignificantForDataElementsAction"
+      class="org.hisp.dhis.dataadmin.action.zerovaluestorage.UpdateZeroIsSignificantForDataElementsAction"
+      scope="prototype">
     <property name="dataElementService" ref="org.hisp.dhis.dataelement.DataElementService" />
   </bean>
 
   <!-- Data archive -->
 
-  <bean id="org.hisp.dhis.dataadmin.action.dataarchive.ArchiveDataAction" class="org.hisp.dhis.dataadmin.action.dataarchive.ArchiveDataAction"
-    scope="prototype">
-    <property name="dataArchiveService" ref="org.hisp.dhis.dataarchive.DataArchiveService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.dataarchive.ArchivePatientDataAction" class="org.hisp.dhis.dataadmin.action.dataarchive.ArchivePatientDataAction"
-    scope="prototype">
-    <property name="dataArchiveService" ref="org.hisp.dhis.dataarchive.DataArchiveService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.dataarchive.GetNumberOfOverlapsAction" class="org.hisp.dhis.dataadmin.action.dataarchive.GetNumberOfOverlapsAction"
-    scope="prototype">
-    <property name="dataArchiveService" ref="org.hisp.dhis.dataarchive.DataArchiveService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.dataarchive.GetNumberOfOverlapingPatientValuesAction" class="org.hisp.dhis.dataadmin.action.dataarchive.GetNumberOfOverlapingPatientValuesAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.dataarchive.ArchiveDataAction"
+      class="org.hisp.dhis.dataadmin.action.dataarchive.ArchiveDataAction"
+      scope="prototype">
+    <property name="dataArchiveService" ref="org.hisp.dhis.dataarchive.DataArchiveService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.dataarchive.ArchivePatientDataAction"
+      class="org.hisp.dhis.dataadmin.action.dataarchive.ArchivePatientDataAction"
+      scope="prototype">
+    <property name="dataArchiveService" ref="org.hisp.dhis.dataarchive.DataArchiveService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.dataarchive.GetNumberOfOverlapsAction"
+      class="org.hisp.dhis.dataadmin.action.dataarchive.GetNumberOfOverlapsAction"
+      scope="prototype">
+    <property name="dataArchiveService" ref="org.hisp.dhis.dataarchive.DataArchiveService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.dataarchive.GetNumberOfOverlapingPatientValuesAction"
+      class="org.hisp.dhis.dataadmin.action.dataarchive.GetNumberOfOverlapingPatientValuesAction"
+      scope="prototype">
     <property name="dataArchiveService" ref="org.hisp.dhis.dataarchive.DataArchiveService" />
   </bean>
 
   <!-- Min/Max validation -->
 
-  <bean id="org.hisp.dhis.dataadmin.action.minmaxvalidation.GetMinMaxValidationParamsAction" class="org.hisp.dhis.dataadmin.action.minmaxvalidation.GetMinMaxValidationParamsAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.minmaxvalidation.GetMinMaxValidationParamsAction"
+      class="org.hisp.dhis.dataadmin.action.minmaxvalidation.GetMinMaxValidationParamsAction"
+      scope="prototype">
     <property name="dataSetService" ref="org.hisp.dhis.dataset.DataSetService" />
   </bean>
 
-  <bean id="org.hisp.dhis.dataadmin.action.minmaxvalidation.GenerateMinMaxValuesAction" class="org.hisp.dhis.dataadmin.action.minmaxvalidation.GenerateMinMaxValuesAction">
+  <bean id="org.hisp.dhis.dataadmin.action.minmaxvalidation.GenerateMinMaxValuesAction"
+      class="org.hisp.dhis.dataadmin.action.minmaxvalidation.GenerateMinMaxValuesAction">
     <property name="selectionTreeManager">
       <ref bean="org.hisp.dhis.oust.manager.SelectionTreeManager" />
     </property>
     <property name="dataSetService">
       <ref bean="org.hisp.dhis.dataset.DataSetService" />
     </property>
-    <property name="minMaxValuesGenerationService" ref="org.hisp.dhis.minmax.validation.MinMaxValuesGenerationService" />
+    <property name="minMaxValuesGenerationService"
+        ref="org.hisp.dhis.minmax.validation.MinMaxValuesGenerationService" />
     <property name="minMaxDataElementService" ref="org.hisp.dhis.minmax.MinMaxDataElementService" />
     <property name="systemSettingManager">
       <ref bean="org.hisp.dhis.setting.SystemSettingManager" />
     </property>
   </bean>
 
-  <bean id="org.hisp.dhis.dataadmin.action.minmaxvalidation.RemoveMinMaxValueAction" class="org.hisp.dhis.dataadmin.action.minmaxvalidation.RemoveMinMaxValueAction">
+  <bean id="org.hisp.dhis.dataadmin.action.minmaxvalidation.RemoveMinMaxValueAction"
+      class="org.hisp.dhis.dataadmin.action.minmaxvalidation.RemoveMinMaxValueAction">
     <property name="selectionTreeManager">
       <ref bean="org.hisp.dhis.oust.manager.SelectionTreeManager" />
     </property>
     <property name="dataSetService">
       <ref bean="org.hisp.dhis.dataset.DataSetService" />
     </property>
-    <property name="minMaxValuesGenerationService" ref="org.hisp.dhis.minmax.validation.MinMaxValuesGenerationService" />
+    <property name="minMaxValuesGenerationService"
+        ref="org.hisp.dhis.minmax.validation.MinMaxValuesGenerationService" />
     <property name="minMaxDataElementService" ref="org.hisp.dhis.minmax.MinMaxDataElementService" />
     <property name="systemSettingManager">
       <ref bean="org.hisp.dhis.setting.SystemSettingManager" />
@@ -205,207 +235,256 @@
 
   <!-- Sql View -->
 
-  <bean id="org.hisp.dhis.dataadmin.action.sqlview.GetSqlViewObjectAction" class="org.hisp.dhis.dataadmin.action.sqlview.GetSqlViewObjectAction"
-    scope="prototype">
-    <property name="sqlViewService" ref="org.hisp.dhis.sqlview.SqlViewService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.sqlview.GetSqlViewListAction" class="org.hisp.dhis.dataadmin.action.sqlview.GetSqlViewListAction"
-    scope="prototype">
-    <property name="sqlViewService" ref="org.hisp.dhis.sqlview.SqlViewService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.sqlview.ValidateAddUpdateSqlViewAction" class="org.hisp.dhis.dataadmin.action.sqlview.ValidateAddUpdateSqlViewAction"
-    scope="prototype">
-    <property name="sqlViewService" ref="org.hisp.dhis.sqlview.SqlViewService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.sqlview.AddSqlViewAction" class="org.hisp.dhis.dataadmin.action.sqlview.AddSqlViewAction"
-    scope="prototype">
-    <property name="sqlViewService" ref="org.hisp.dhis.sqlview.SqlViewService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.sqlview.UpdateSqlViewAction" class="org.hisp.dhis.dataadmin.action.sqlview.UpdateSqlViewAction"
-    scope="prototype">
-    <property name="sqlViewService" ref="org.hisp.dhis.sqlview.SqlViewService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.sqlview.RemoveSqlViewAction" class="org.hisp.dhis.dataadmin.action.sqlview.RemoveSqlViewAction"
-    scope="prototype">
-    <property name="sqlViewService" ref="org.hisp.dhis.sqlview.SqlViewService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.sqlview.ExecuteSqlViewQueryAction" class="org.hisp.dhis.dataadmin.action.sqlview.ExecuteSqlViewQueryAction"
-    scope="prototype">
-    <property name="sqlViewService" ref="org.hisp.dhis.sqlview.SqlViewService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.sqlview.CheckViewTableExistenceAction" class="org.hisp.dhis.dataadmin.action.sqlview.CheckViewTableExistenceAction"
-    scope="prototype">
-    <property name="sqlViewService" ref="org.hisp.dhis.sqlview.SqlViewService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.sqlview.ShowUpSqlViewTableAction" class="org.hisp.dhis.dataadmin.action.sqlview.ShowUpSqlViewTableAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.sqlview.GetSqlViewObjectAction"
+      class="org.hisp.dhis.dataadmin.action.sqlview.GetSqlViewObjectAction"
+      scope="prototype">
+    <property name="sqlViewService" ref="org.hisp.dhis.sqlview.SqlViewService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.sqlview.GetSqlViewListAction"
+      class="org.hisp.dhis.dataadmin.action.sqlview.GetSqlViewListAction"
+      scope="prototype">
+    <property name="sqlViewService" ref="org.hisp.dhis.sqlview.SqlViewService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.sqlview.ValidateAddUpdateSqlViewAction"
+      class="org.hisp.dhis.dataadmin.action.sqlview.ValidateAddUpdateSqlViewAction"
+      scope="prototype">
+    <property name="sqlViewService" ref="org.hisp.dhis.sqlview.SqlViewService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.sqlview.AddSqlViewAction"
+      class="org.hisp.dhis.dataadmin.action.sqlview.AddSqlViewAction"
+      scope="prototype">
+    <property name="sqlViewService" ref="org.hisp.dhis.sqlview.SqlViewService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.sqlview.UpdateSqlViewAction"
+      class="org.hisp.dhis.dataadmin.action.sqlview.UpdateSqlViewAction"
+      scope="prototype">
+    <property name="sqlViewService" ref="org.hisp.dhis.sqlview.SqlViewService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.sqlview.RemoveSqlViewAction"
+      class="org.hisp.dhis.dataadmin.action.sqlview.RemoveSqlViewAction"
+      scope="prototype">
+    <property name="sqlViewService" ref="org.hisp.dhis.sqlview.SqlViewService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.sqlview.ExecuteSqlViewQueryAction"
+      class="org.hisp.dhis.dataadmin.action.sqlview.ExecuteSqlViewQueryAction"
+      scope="prototype">
+    <property name="sqlViewService" ref="org.hisp.dhis.sqlview.SqlViewService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.sqlview.CheckViewTableExistenceAction"
+      class="org.hisp.dhis.dataadmin.action.sqlview.CheckViewTableExistenceAction"
+      scope="prototype">
+    <property name="sqlViewService" ref="org.hisp.dhis.sqlview.SqlViewService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.sqlview.ShowUpSqlViewTableAction"
+      class="org.hisp.dhis.dataadmin.action.sqlview.ShowUpSqlViewTableAction"
+      scope="prototype">
     <property name="sqlViewService" ref="org.hisp.dhis.sqlview.SqlViewService" />
   </bean>
 
   <!-- Constant Name -->
 
-  <bean id="org.hisp.dhis.dataadmin.action.constant.AddConstantAction" class="org.hisp.dhis.dataadmin.action.constant.AddConstantAction"
-    scope="prototype">
-    <property name="constantService" ref="org.hisp.dhis.constant.ConstantService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.constant.UpdateConstantAction" class="org.hisp.dhis.dataadmin.action.constant.UpdateConstantAction"
-    scope="prototype">
-    <property name="constantService" ref="org.hisp.dhis.constant.ConstantService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.constant.ValidateConstantAction" class="org.hisp.dhis.dataadmin.action.constant.ValidateConstantAction"
-    scope="prototype">
-    <property name="constantService" ref="org.hisp.dhis.constant.ConstantService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.constant.RemoveConstantAction" class="org.hisp.dhis.dataadmin.action.constant.RemoveConstantAction"
-    scope="prototype">
-    <property name="constantService" ref="org.hisp.dhis.constant.ConstantService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.constant.GetConstantAction" class="org.hisp.dhis.dataadmin.action.constant.GetConstantAction"
-    scope="prototype">
-    <property name="constantService" ref="org.hisp.dhis.constant.ConstantService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.constant.GetConstantListAction" class="org.hisp.dhis.dataadmin.action.constant.GetConstantListAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.constant.AddConstantAction"
+      class="org.hisp.dhis.dataadmin.action.constant.AddConstantAction"
+      scope="prototype">
+    <property name="constantService" ref="org.hisp.dhis.constant.ConstantService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.constant.UpdateConstantAction"
+      class="org.hisp.dhis.dataadmin.action.constant.UpdateConstantAction"
+      scope="prototype">
+    <property name="constantService" ref="org.hisp.dhis.constant.ConstantService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.constant.ValidateConstantAction"
+      class="org.hisp.dhis.dataadmin.action.constant.ValidateConstantAction"
+      scope="prototype">
+    <property name="constantService" ref="org.hisp.dhis.constant.ConstantService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.constant.RemoveConstantAction"
+      class="org.hisp.dhis.dataadmin.action.constant.RemoveConstantAction"
+      scope="prototype">
+    <property name="constantService" ref="org.hisp.dhis.constant.ConstantService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.constant.GetConstantAction"
+      class="org.hisp.dhis.dataadmin.action.constant.GetConstantAction"
+      scope="prototype">
+    <property name="constantService" ref="org.hisp.dhis.constant.ConstantService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.constant.GetConstantListAction"
+      class="org.hisp.dhis.dataadmin.action.constant.GetConstantListAction"
+      scope="prototype">
     <property name="constantService" ref="org.hisp.dhis.constant.ConstantService" />
   </bean>
 
   <!-- DataSet LockExceptions -->
 
-  <bean id="org.hisp.dhis.dataadmin.action.lockexception.GetLockExceptionListAction" class="org.hisp.dhis.dataadmin.action.lockexception.GetLockExceptionListAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.lockexception.GetLockExceptionListAction"
+      class="org.hisp.dhis.dataadmin.action.lockexception.GetLockExceptionListAction"
+      scope="prototype">
     <property name="dataSetService" ref="org.hisp.dhis.dataset.DataSetService" />
   </bean>
 
-  <bean id="org.hisp.dhis.dataadmin.action.lockexception.AddLockExceptionAction" class="org.hisp.dhis.dataadmin.action.lockexception.AddLockExceptionAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.lockexception.AddLockExceptionAction"
+      class="org.hisp.dhis.dataadmin.action.lockexception.AddLockExceptionAction"
+      scope="prototype">
     <property name="dataSetService" ref="org.hisp.dhis.dataset.DataSetService" />
     <property name="organisationUnitService" ref="org.hisp.dhis.organisationunit.OrganisationUnitService" />
     <property name="periodService" ref="org.hisp.dhis.period.PeriodService" />
   </bean>
 
-  <bean id="org.hisp.dhis.dataadmin.action.lockexception.GetLockExceptionAction" class="org.hisp.dhis.dataadmin.action.lockexception.GetLockExceptionAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.lockexception.GetLockExceptionAction"
+      class="org.hisp.dhis.dataadmin.action.lockexception.GetLockExceptionAction"
+      scope="prototype">
     <property name="dataSetService" ref="org.hisp.dhis.dataset.DataSetService" />
   </bean>
 
-  <bean id="org.hisp.dhis.dataadmin.action.lockexception.GetLockExceptionFormAction" class="org.hisp.dhis.dataadmin.action.lockexception.GetLockExceptionFormAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.lockexception.GetLockExceptionFormAction"
+      class="org.hisp.dhis.dataadmin.action.lockexception.GetLockExceptionFormAction"
+      scope="prototype">
     <property name="currentUserService" ref="org.hisp.dhis.user.CurrentUserService" />
     <property name="organisationUnitService" ref="org.hisp.dhis.organisationunit.OrganisationUnitService" />
     <property name="dataSetService" ref="org.hisp.dhis.dataset.DataSetService" />
     <property name="selectionTreeManager" ref="org.hisp.dhis.oust.manager.SelectionTreeManager" />
   </bean>
 
-  <bean id="org.hisp.dhis.dataadmin.action.lockexception.RemoveLockExceptionAction" class="org.hisp.dhis.dataadmin.action.lockexception.RemoveLockExceptionAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.lockexception.RemoveLockExceptionAction"
+      class="org.hisp.dhis.dataadmin.action.lockexception.RemoveLockExceptionAction"
+      scope="prototype">
     <property name="dataSetService" ref="org.hisp.dhis.dataset.DataSetService" />
   </bean>
 
-  <bean id="org.hisp.dhis.dataadmin.action.lockexception.GetDataSetsAction" class="org.hisp.dhis.dataadmin.action.lockexception.GetDataSetsAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.lockexception.GetDataSetsAction"
+      class="org.hisp.dhis.dataadmin.action.lockexception.GetDataSetsAction"
+      scope="prototype">
     <property name="currentUserService" ref="org.hisp.dhis.user.CurrentUserService" />
     <property name="organisationUnitService" ref="org.hisp.dhis.organisationunit.OrganisationUnitService" />
   </bean>
 
-  <bean id="org.hisp.dhis.dataadmin.action.lockexception.GetPeriodsAction" class="org.hisp.dhis.dataadmin.action.lockexception.GetPeriodsAction"
-    scope="prototype">
-    <property name="dataSetService" ref="org.hisp.dhis.dataset.DataSetService" />
+  <bean id="org.hisp.dhis.dataadmin.action.lockexception.GetPeriodsAction"
+      class="org.hisp.dhis.dataadmin.action.lockexception.GetPeriodsAction"
+      scope="prototype">
+    <property name="dataSetService" ref="org.hisp.dhis.dataset.DataSetService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.lockexception.PrepareBatchRemovalAction"
+      class="org.hisp.dhis.dataadmin.action.lockexception.PrepareBatchRemovalAction"
+      scope="prototype">
+    <property name="dataSetService" ref="org.hisp.dhis.dataset.DataSetService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.lockexception.BatchRemoveLockExceptionsAction"
+      class="org.hisp.dhis.dataadmin.action.lockexception.BatchRemoveLockExceptionsAction" scope="prototype">
+    <property name="dataSetService" ref="org.hisp.dhis.dataset.DataSetService" />
+    <property name="periodService" ref="org.hisp.dhis.period.PeriodService" />
   </bean>
 
   <!-- Dynamic Attributes -->
 
-  <bean id="org.hisp.dhis.dataadmin.action.attribute.GetAttributeListAction" class="org.hisp.dhis.dataadmin.action.attribute.GetAttributeListAction"
-    scope="prototype">
-    <property name="attributeService" ref="org.hisp.dhis.attribute.AttributeService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.attribute.GetAttributeListSortOrderAction" class="org.hisp.dhis.dataadmin.action.attribute.GetAttributeListSortOrderAction"
-    scope="prototype">
-    <property name="attributeService" ref="org.hisp.dhis.attribute.AttributeService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.attribute.GetAttributeAction" class="org.hisp.dhis.dataadmin.action.attribute.GetAttributeAction"
-    scope="prototype">
-    <property name="attributeService" ref="org.hisp.dhis.attribute.AttributeService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.attribute.ValidateAttributeAction" class="org.hisp.dhis.dataadmin.action.attribute.ValidateAttributeAction"
-    scope="prototype">
-    <property name="attributeService" ref="org.hisp.dhis.attribute.AttributeService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.attribute.AddAttributeAction" class="org.hisp.dhis.dataadmin.action.attribute.AddAttributeAction"
-    scope="prototype">
-    <property name="attributeService" ref="org.hisp.dhis.attribute.AttributeService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.attribute.SaveAttributeSortOrderAction" class="org.hisp.dhis.dataadmin.action.attribute.SaveAttributeSortOrderAction"
-    scope="prototype">
-    <property name="attributeService" ref="org.hisp.dhis.attribute.AttributeService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.attribute.UpdateAttributeAction" class="org.hisp.dhis.dataadmin.action.attribute.UpdateAttributeAction"
-    scope="prototype">
-    <property name="attributeService" ref="org.hisp.dhis.attribute.AttributeService" />
-  </bean>
-
-  <bean id="org.hisp.dhis.dataadmin.action.attribute.RemoveAttributeAction" class="org.hisp.dhis.dataadmin.action.attribute.RemoveAttributeAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.attribute.GetAttributeListAction"
+      class="org.hisp.dhis.dataadmin.action.attribute.GetAttributeListAction"
+      scope="prototype">
+    <property name="attributeService" ref="org.hisp.dhis.attribute.AttributeService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.attribute.GetAttributeListSortOrderAction"
+      class="org.hisp.dhis.dataadmin.action.attribute.GetAttributeListSortOrderAction"
+      scope="prototype">
+    <property name="attributeService" ref="org.hisp.dhis.attribute.AttributeService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.attribute.GetAttributeAction"
+      class="org.hisp.dhis.dataadmin.action.attribute.GetAttributeAction"
+      scope="prototype">
+    <property name="attributeService" ref="org.hisp.dhis.attribute.AttributeService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.attribute.ValidateAttributeAction"
+      class="org.hisp.dhis.dataadmin.action.attribute.ValidateAttributeAction"
+      scope="prototype">
+    <property name="attributeService" ref="org.hisp.dhis.attribute.AttributeService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.attribute.AddAttributeAction"
+      class="org.hisp.dhis.dataadmin.action.attribute.AddAttributeAction"
+      scope="prototype">
+    <property name="attributeService" ref="org.hisp.dhis.attribute.AttributeService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.attribute.SaveAttributeSortOrderAction"
+      class="org.hisp.dhis.dataadmin.action.attribute.SaveAttributeSortOrderAction"
+      scope="prototype">
+    <property name="attributeService" ref="org.hisp.dhis.attribute.AttributeService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.attribute.UpdateAttributeAction"
+      class="org.hisp.dhis.dataadmin.action.attribute.UpdateAttributeAction"
+      scope="prototype">
+    <property name="attributeService" ref="org.hisp.dhis.attribute.AttributeService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.attribute.RemoveAttributeAction"
+      class="org.hisp.dhis.dataadmin.action.attribute.RemoveAttributeAction"
+      scope="prototype">
     <property name="attributeService" ref="org.hisp.dhis.attribute.AttributeService" />
   </bean>
 
   <!-- Scheduling -->
 
-  <bean id="org.hisp.dhis.dataadmin.action.scheduling.ScheduleTasksAction" class="org.hisp.dhis.dataadmin.action.scheduling.ScheduleTasksAction"
-    scope="prototype">
+  <bean id="org.hisp.dhis.dataadmin.action.scheduling.ScheduleTasksAction"
+      class="org.hisp.dhis.dataadmin.action.scheduling.ScheduleTasksAction"
+      scope="prototype">
     <property name="systemSettingManager" ref="org.hisp.dhis.setting.SystemSettingManager" />
     <property name="schedulingManager" ref="org.hisp.dhis.scheduling.SchedulingManager" />
-	<property name="organisationUnitService" ref="org.hisp.dhis.organisationunit.OrganisationUnitService" />
+    <property name="organisationUnitService" ref="org.hisp.dhis.organisationunit.OrganisationUnitService" />
   </bean>
-  
+
   <!-- OptionSet -->
-  
-  <bean id="org.hisp.dhis.dataadmin.action.option.GetOptionSetListAction" class="org.hisp.dhis.dataadmin.action.option.GetOptionSetListAction"
-    scope="prototype">
-    <property name="optionService" ref="org.hisp.dhis.option.OptionService" />
-  </bean>
-  
-  <bean id="org.hisp.dhis.dataadmin.action.option.AddOptionSetAction" class="org.hisp.dhis.dataadmin.action.option.AddOptionSetAction"
-    scope="prototype">
-    <property name="optionService" ref="org.hisp.dhis.option.OptionService" />
-  </bean>
-  
-  <bean id="org.hisp.dhis.dataadmin.action.option.UpdateOptionSetAction" class="org.hisp.dhis.dataadmin.action.option.UpdateOptionSetAction"
-    scope="prototype">
-    <property name="optionService" ref="org.hisp.dhis.option.OptionService" />
-  </bean>
-  
-  <bean id="org.hisp.dhis.dataadmin.action.option.RemoveOptionSetAction" class="org.hisp.dhis.dataadmin.action.option.RemoveOptionSetAction"
-    scope="prototype">
-    <property name="optionService" ref="org.hisp.dhis.option.OptionService" />
-  </bean>
-  
-  <bean id="org.hisp.dhis.dataadmin.action.option.GetOptionSetAction" class="org.hisp.dhis.dataadmin.action.option.GetOptionSetAction"
-    scope="prototype">
-    <property name="optionService" ref="org.hisp.dhis.option.OptionService" />
-  </bean>
-  
-  <bean id="org.hisp.dhis.dataadmin.action.option.ValidateOptionSetAction" class="org.hisp.dhis.dataadmin.action.option.ValidateOptionSetAction"
-    scope="prototype">
-    <property name="optionService" ref="org.hisp.dhis.option.OptionService" />
-  </bean>
-  
+
+  <bean id="org.hisp.dhis.dataadmin.action.option.GetOptionSetListAction"
+      class="org.hisp.dhis.dataadmin.action.option.GetOptionSetListAction"
+      scope="prototype">
+    <property name="optionService" ref="org.hisp.dhis.option.OptionService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.option.AddOptionSetAction"
+      class="org.hisp.dhis.dataadmin.action.option.AddOptionSetAction"
+      scope="prototype">
+    <property name="optionService" ref="org.hisp.dhis.option.OptionService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.option.UpdateOptionSetAction"
+      class="org.hisp.dhis.dataadmin.action.option.UpdateOptionSetAction"
+      scope="prototype">
+    <property name="optionService" ref="org.hisp.dhis.option.OptionService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.option.RemoveOptionSetAction"
+      class="org.hisp.dhis.dataadmin.action.option.RemoveOptionSetAction"
+      scope="prototype">
+    <property name="optionService" ref="org.hisp.dhis.option.OptionService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.option.GetOptionSetAction"
+      class="org.hisp.dhis.dataadmin.action.option.GetOptionSetAction"
+      scope="prototype">
+    <property name="optionService" ref="org.hisp.dhis.option.OptionService" />
+  </bean>
+
+  <bean id="org.hisp.dhis.dataadmin.action.option.ValidateOptionSetAction"
+      class="org.hisp.dhis.dataadmin.action.option.ValidateOptionSetAction"
+      scope="prototype">
+    <property name="optionService" ref="org.hisp.dhis.option.OptionService" />
+  </bean>
+
 </beans>

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/org/hisp/dhis/dataadmin/i18n_module.properties'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/org/hisp/dhis/dataadmin/i18n_module.properties	2012-02-08 13:38:13 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/org/hisp/dhis/dataadmin/i18n_module.properties	2012-02-14 02:58:08 +0000
@@ -394,9 +394,13 @@
 must_include_option = Please include one or more category options
 edit_option_set = Edit option set
 number_of_members = The number of members
-object_not_deleted_associated_by_objects=Object not deleted because it is associated by objects of type >>>>>>> MERGE-SOURCE
+object_not_deleted_associated_by_objects=Object not deleted because it is associated by objects of type
 lock_exception_management=Lock Exception Management
 lock_exception=Lock Exception
 confirm_delete_lock_exception=Do you want to delete this lock exception?
+confirm_delete_lock_exceptions=Do you want to delete lock exceptions with this configuration?
 create_new_lock_exception=Create new lock exception
 edit_lock_exception=Edit lock exception
+lock_exception_batch_removal=Lock exception batch removal
+back_to_lock_exceptions=Back to lock exception
+batch_delete=Batch deletion

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/struts.xml'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/struts.xml	2012-02-13 19:27:46 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/struts.xml	2012-02-14 02:58:08 +0000
@@ -496,13 +496,6 @@
       <param name="requiredAuthorities">F_DATASET_ADD</param>
     </action>
 
-    <action name="removeLockException" class="org.hisp.dhis.dataadmin.action.lockexception.RemoveLockExceptionAction">
-      <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>
-      <param name="requiredAuthorities">F_DATASET_DELETE</param>
-    </action>
-
     <action name="getDataSets" class="org.hisp.dhis.dataadmin.action.lockexception.GetDataSetsAction">
       <result name="success" type="velocity-json">jsonDataSets.vm</result>
       <param name="onExceptionReturn">plainTextError</param>
@@ -518,6 +511,27 @@
       <param name="onExceptionReturn">plainTextError</param>
     </action>
 
+    <action name="showLockExceptionBatchRemoval" class="org.hisp.dhis.dataadmin.action.lockexception.PrepareBatchRemovalAction">
+      <result name="success" type="velocity">/main.vm</result>
+      <param name="menu">/dhis-web-maintenance-dataadmin/menu.vm</param>
+      <param name="page">/dhis-web-maintenance-dataadmin/removeLockExceptionBatch.vm</param>
+      <param name="requiredAuthorities">F_DATASET_DELETE</param>
+    </action>
+
+    <action name="removeLockException" class="org.hisp.dhis.dataadmin.action.lockexception.RemoveLockExceptionAction">
+      <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>
+      <param name="requiredAuthorities">F_DATASET_DELETE</param>
+    </action>
+
+    <action name="batchRemoveLockException" class="org.hisp.dhis.dataadmin.action.lockexception.BatchRemoveLockExceptionsAction">
+      <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>
+      <param name="requiredAuthorities">F_DATASET_DELETE</param>
+    </action>
+
     <!-- Dynamic Attributes -->
 
     <action name="attribute" class="org.hisp.dhis.dataadmin.action.attribute.GetAttributeListAction">

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/javascript/lockException.js'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/javascript/lockException.js	2012-02-13 04:51:23 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/javascript/lockException.js	2012-02-14 02:58:08 +0000
@@ -55,9 +55,7 @@
 }
 
 function periodChanged( e ) {
-    var periods = jQuery("#periods");
-
-    if ( periods.attr("disabled") ) {
+    if ( jQuery("#periods").attr("disabled") ) {
         jQuery("#submit").attr("disabled", true);
     } else {
         jQuery("#submit").removeAttr("disabled");
@@ -65,13 +63,9 @@
 }
 
 function resetDataSets() {
-    var option = jQuery("<option>-- Please select an organisation unit with a dataset --</option>");
-    jQuery("#dataSets").append(option);
-    jQuery("#dataSets").attr("disabled", true);
+    jQuery("#dataSets").append("<option>-- Please select an organisation unit with a dataset --</option>").attr("disabled", true);
 }
 
 function resetPeriods() {
-    var option = jQuery("<option>-- Please select a dataset --</option>");
-    jQuery("#periods").append(option);
-    jQuery("#periods").attr("disabled", true);
+    jQuery("#periods").append("<option>-- Please select a dataset --</option>").attr("disabled", true);
 }

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/lockException.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/lockException.vm	2012-02-13 04:51:23 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/lockException.vm	2012-02-14 02:58:08 +0000
@@ -32,7 +32,8 @@
 				<tr>
 					<td>#filterDiv( "lockException" )</td>
 					<td colspan="4" style="text-align:right">
-						<input type="button" value="$i18n.getString( 'add_new' )" onclick="window.location.href='showAddLockExceptionForm.action'" style="width:80px"/>
+                        <input type="button" value="$i18n.getString( 'batch_delete' )" onclick="window.location.href='showLockExceptionBatchRemoval.action'" style="width:100px"/>
+                        <input type="button" value="$i18n.getString( 'add_new' )" onclick="window.location.href='showAddLockExceptionForm.action'" style="width:80px"/>
 					</td>
 				</tr>
 			</table>

=== added file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/removeLockExceptionBatch.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/removeLockExceptionBatch.vm	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/removeLockExceptionBatch.vm	2012-02-14 02:58:08 +0000
@@ -0,0 +1,81 @@
+<script type="text/javascript">
+    var i18n_confirm_deletes = '$encoder.jsEscape( $i18n.getString( "confirm_delete_lock_exceptions" ) , "'")';
+
+    function removeLockExceptions( dataSetId, periodId, name )
+    {
+        var result = window.confirm( i18n_confirm_deletes + "\n\n" + name );
+
+        if(result)
+        {
+            $.postJSON(
+           	    "batchRemoveLockException.action",
+           	    {
+           	        "dataSetId": dataSetId,
+                    "periodId": periodId
+           	    },
+           	    function( json )
+           	    {
+           	    	if ( json.response == "success" )
+           	    	{
+                       jQuery( "tr#ds" + dataSetId + "p" + periodId ).remove();
+
+       					jQuery( "table.listTable tbody tr" ).removeClass( "listRow listAlternateRow" );
+       	                jQuery( "table.listTable tbody tr:odd" ).addClass( "listAlternateRow" );
+       	                jQuery( "table.listTable tbody tr:even" ).addClass( "listRow" );
+       					jQuery( "table.listTable tbody" ).trigger("update");
+
+       					showSuccessMessage( i18n_delete_success );
+           	    	}
+           	    	else if ( json.response == "error" )
+           	    	{
+       					showWarningMessage( json.message );
+           	    	}
+           	    }
+           	);
+        }
+    }
+
+</script>
+
+<h3>$i18n.getString( "lock_exception_batch_removal" )</h3>
+
+<table class="mainPageTable">
+	<tr>
+		<td style="vertical-align:top">
+            <table width="100%">
+                <tr>
+                    <td colspan="4" style="text-align:right">
+                         <input type="button" value="$i18n.getString( 'back_to_lock_exceptions' )" onclick="window.location.href='lockException.action'" style="width:160px"/>
+                    </td>
+                </tr>
+            </table>
+			<table class="listTable" id="listTable">
+				<col/>
+				<col width="96px"/>
+                <thead>
+				<tr>
+					<th>$i18n.getString( "name" )</th>
+					<th class="{sorter: false}">$i18n.getString( "operations" )</th>
+				</tr>
+                </thead>
+				<tbody id="list">
+
+				#foreach( $lockException in $lockExceptions )
+				<tr id="ds${lockException.dataSet.id}p${lockException.period.id}">
+                    #set( $name = "$encoder.htmlEncode( $lockException.dataSet.name ) - $encoder.htmlEncode( $lockException.period.name )" )
+					<td>$name</td>
+					<td style="text-align:right">
+                        <a href="javascript:removeLockExceptions($lockException.dataSet.id, $lockException.period.id, '$name')" title="$i18n.getString( 'remove' )"><img src="../images/delete.png" alt="$i18n.getString( 'remove' )"/></a>
+					</td>
+				</tr>
+				#end
+
+				</tbody>
+			</table>
+		</td>
+
+        <td style="width:20em; padding-left:2em; vertical-align:top">
+        </td>
+
+    </tr>
+</table>