← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 9969: Impl UI for scheduling of resource tables, analytics tables and data mart tasks

 

------------------------------------------------------------
revno: 9969
committer: Lars Helge Øverland <larshelge@xxxxxxxxx>
branch nick: dhis2
timestamp: Mon 2013-03-04 21:41:25 +0100
message:
  Impl UI for scheduling of resource tables, analytics tables and data mart tasks
added:
  dhis-2/dhis-services/dhis-service-reporting/src/test/java/org/hisp/dhis/scheduling/SchedulingManagerTest.java
modified:
  dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/scheduling/DefaultSchedulingManager.java
  dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/scheduling/ScheduledTasks.java
  dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/scheduling/SchedulingManager.java
  dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/scheduling/Scheduler.java
  dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/widgets.css
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/java/org/hisp/dhis/dataadmin/action/scheduling/ScheduleTasksAction.java
  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/webapp/dhis-web-maintenance-dataadmin/viewScheduledTasks.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-services/dhis-service-reporting/src/main/java/org/hisp/dhis/scheduling/DefaultSchedulingManager.java'
--- dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/scheduling/DefaultSchedulingManager.java	2012-02-02 20:01:36 +0000
+++ dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/scheduling/DefaultSchedulingManager.java	2013-03-04 20:41:25 +0000
@@ -33,6 +33,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.hisp.dhis.common.ListMap;
 import org.hisp.dhis.setting.SystemSettingManager;
 import org.hisp.dhis.system.scheduling.Scheduler;
 
@@ -72,17 +73,16 @@
     // -------------------------------------------------------------------------
 
     public void scheduleTasks()
-    {
-        Map<String, String> keyCronMap = getScheduledTasks();
+    {        
+        ListMap<String, String> cronKeyMap = getCronKeyMap();
         
-        for ( String key : keyCronMap.keySet() )
+        for ( String cron : cronKeyMap.keySet() )
         {
-            String cron = keyCronMap.get( key );
-            Runnable task = tasks.get( key );
+            ScheduledTasks scheduledTasks = getScheduledTasksForCron( cron, cronKeyMap );
             
-            if ( cron != null && task != null )
+            if ( !scheduledTasks.isEmpty() )
             {
-                scheduler.scheduleTask( key, task, cron );
+                scheduler.scheduleTask( cron, scheduledTasks, cron );
             }
         }
     }
@@ -103,34 +103,82 @@
     
     public void executeTasks()
     {
-        Map<String, String> keyCronMap = getScheduledTasks();
+        ListMap<String, String> cronKeyMap = getCronKeyMap();
         
-        for ( String key : keyCronMap.keySet() )
+        for ( String cron : cronKeyMap.keySet() )
         {
-            Runnable task = tasks.get( key );
+            ScheduledTasks scheduledTasks = getScheduledTasksForCron( cron, cronKeyMap );
             
-            if ( task != null )
+            if ( !scheduledTasks.isEmpty() )
             {
-                scheduler.executeTask( task );
+                scheduler.executeTask( scheduledTasks );
             }
         }
     }
+
+    public ListMap<String, String> getCronKeyMap()
+    {
+        Map<String, String> keyCronMap = getKeyCronMap();
+        
+        ListMap<String, String> cronKeyMap = new ListMap<String, String>();
+        
+        for ( String key : keyCronMap.keySet() )
+        {
+            String cron = keyCronMap.get( key );
+            
+            cronKeyMap.putValue( cron, key );
+        }
+        
+        return cronKeyMap;
+    }
+
+    public boolean isScheduled( String key )
+    {
+        Map<String, String> keyCronMap = getKeyCronMap();
+        
+        return keyCronMap.get( key ) != null;
+    }
     
+    public String getTaskStatus()
+    {
+        ListMap<String, String> cronKeyMap = getCronKeyMap();
+
+        if ( cronKeyMap.size() == 0 )
+        {
+            return STATUS_NOT_STARTED;
+        }
+        
+        String firstTask = cronKeyMap.keySet().iterator().next();
+        
+        return scheduler.getTaskStatus( firstTask );
+    }
+
+    // -------------------------------------------------------------------------
+    // Supportive methods
+    // -------------------------------------------------------------------------
+
+    /**
+     * Returns a ScheduledTasks object for the given cron expression. The
+     * ScheduledTasks object contains a list of tasks.
+     */
+    private ScheduledTasks getScheduledTasksForCron( String cron, ListMap<String, String> cronKeyMap )
+    {
+        ScheduledTasks scheduledTasks = new ScheduledTasks();
+        
+        for ( String key : cronKeyMap.get( cron ) )
+        {
+            scheduledTasks.addTask( tasks.get( key ) );
+        }
+        
+        return scheduledTasks;
+    }
+
+    /**
+     * Returns a mapping between task keys and cron expressions.
+     */
     @SuppressWarnings("unchecked")
-    public Map<String, String> getScheduledTasks()
+    private Map<String, String> getKeyCronMap()
     {
         return (Map<String, String>) systemSettingManager.getSystemSetting( KEY_SCHEDULED_TASKS, new HashMap<String, String>() );
     }
-    
-    public String getTaskStatus()
-    {
-        Map<String, String> keyCronMap = getScheduledTasks();
-                
-        if ( keyCronMap.size() == 0 )
-        {
-            return STATUS_NOT_STARTED;
-        }
-        
-        return scheduler.getTaskStatus( keyCronMap.keySet().iterator().next() );
-    }
 }

=== modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/scheduling/ScheduledTasks.java'
--- dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/scheduling/ScheduledTasks.java	2013-03-04 14:44:15 +0000
+++ dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/scheduling/ScheduledTasks.java	2013-03-04 20:41:25 +0000
@@ -40,7 +40,15 @@
     
     public void addTask( Runnable task )
     {
-        this.tasks.add( task );
+        if ( task != null )
+        {
+            this.tasks.add( task );
+        }
+    }
+    
+    public boolean isEmpty()
+    {
+        return tasks == null || tasks.size() == 0;
     }
     
     @Override

=== modified file 'dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/scheduling/SchedulingManager.java'
--- dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/scheduling/SchedulingManager.java	2013-03-04 14:44:15 +0000
+++ dhis-2/dhis-services/dhis-service-reporting/src/main/java/org/hisp/dhis/scheduling/SchedulingManager.java	2013-03-04 20:41:25 +0000
@@ -29,6 +29,8 @@
 
 import java.util.Map;
 
+import org.hisp.dhis.common.ListMap;
+
 /**
  * @author Lars Helge Overland
  */
@@ -36,20 +38,46 @@
 {
     final String TASK_RESOURCE_TABLE = "resourceTableTask";
     final String TASK_DATAMART_LAST_12_MONTHS = "dataMartLast12MonthsTask";
-    final String TASK_DATAMART_LAST_6_MONTS = "dataMartLast6MonthsTask";
+    final String TASK_DATAMART_LAST_6_MONTHS = "dataMartLast6MonthsTask";
     final String TASK_DATAMART_FROM_6_TO_12_MONTS = "dataMartFrom6To12MonthsTask";
     final String TASK_ANALYTICS_ALL = "analyticsAllTask";
     final String TASK_ANALYTICS_LAST_3_YEARS = "analyticsLast3YearsTask";
         
+    /**
+     * Schedule all tasks.
+     */
     void scheduleTasks();
     
+    /**
+     * Schedule the given tasks.
+     * 
+     * @param keyCronMap map of tasks to be scheduled. The map key is the key of
+     *        the task, i.e. the task bean identifier. The map value is the cron 
+     *        expression to use when scheduling the task.
+     */
     void scheduleTasks( Map<String, String> keyCronMap );
     
+    /**
+     * Stop all tasks.
+     */
     void stopTasks();
     
+    /**
+     * Execute all tasks immediately.
+     */
     void executeTasks();
     
-    Map<String, String> getScheduledTasks();
-    
+    /**
+     * Get a mapping of cron expressions and list of task keys for all scheduled
+     * tasks.
+     */
+    ListMap<String, String> getCronKeyMap();
+    
+    boolean isScheduled( String key );
+    
+    /**
+     * Gets the task status. Can be STATUS_RUNNING, STATUS_DONE, STATUS_STOPPED,
+     * STATUS_NOT_STARTED.
+     */
     String getTaskStatus();   
 }

=== added file 'dhis-2/dhis-services/dhis-service-reporting/src/test/java/org/hisp/dhis/scheduling/SchedulingManagerTest.java'
--- dhis-2/dhis-services/dhis-service-reporting/src/test/java/org/hisp/dhis/scheduling/SchedulingManagerTest.java	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-services/dhis-service-reporting/src/test/java/org/hisp/dhis/scheduling/SchedulingManagerTest.java	2013-03-04 20:41:25 +0000
@@ -0,0 +1,108 @@
+package org.hisp.dhis.scheduling;
+
+/*
+ * 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 static org.hisp.dhis.scheduling.SchedulingManager.TASK_ANALYTICS_ALL;
+import static org.hisp.dhis.scheduling.SchedulingManager.TASK_DATAMART_LAST_6_MONTHS;
+import static org.hisp.dhis.scheduling.SchedulingManager.TASK_RESOURCE_TABLE;
+import static org.hisp.dhis.system.scheduling.Scheduler.CRON_DAILY_0AM;
+import static org.hisp.dhis.system.scheduling.Scheduler.CRON_DAILY_0AM_EXCEPT_SUNDAY;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.hisp.dhis.DhisSpringTest;
+import org.hisp.dhis.common.ListMap;
+import org.hisp.dhis.system.scheduling.Scheduler;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * @author Lars Helge Overland
+ */
+public class SchedulingManagerTest
+    extends DhisSpringTest
+{
+    @Autowired
+    private SchedulingManager schedulingManager;
+
+    @Test
+    public void testScheduleTasks()
+    {
+        Map<String, String> keyCronMap = new HashMap<String, String>();
+        keyCronMap.put( TASK_RESOURCE_TABLE, CRON_DAILY_0AM );
+        keyCronMap.put( TASK_ANALYTICS_ALL, CRON_DAILY_0AM );
+        keyCronMap.put( TASK_DATAMART_LAST_6_MONTHS, CRON_DAILY_0AM_EXCEPT_SUNDAY );
+                
+        schedulingManager.scheduleTasks( keyCronMap );
+        
+        ListMap<String, String> cronKeyMap = schedulingManager.getCronKeyMap();
+        
+        assertEquals( 2, cronKeyMap.size() );
+        assertTrue( cronKeyMap.containsKey( CRON_DAILY_0AM ) );
+        assertTrue( cronKeyMap.containsKey( CRON_DAILY_0AM_EXCEPT_SUNDAY ) );
+        assertEquals( 2, cronKeyMap.get( CRON_DAILY_0AM ).size() );
+        assertEquals( 1, cronKeyMap.get( CRON_DAILY_0AM_EXCEPT_SUNDAY ).size() );
+        
+        assertEquals( Scheduler.STATUS_RUNNING, schedulingManager.getTaskStatus() );
+    }
+
+    @Test
+    public void testStopTasks()
+    {
+        Map<String, String> keyCronMap = new HashMap<String, String>();
+        keyCronMap.put( TASK_RESOURCE_TABLE, CRON_DAILY_0AM );
+        keyCronMap.put( TASK_ANALYTICS_ALL, CRON_DAILY_0AM );
+
+        assertEquals( Scheduler.STATUS_NOT_STARTED, schedulingManager.getTaskStatus() );
+        
+        schedulingManager.scheduleTasks( keyCronMap );
+        
+        assertEquals( Scheduler.STATUS_RUNNING, schedulingManager.getTaskStatus() );
+        
+        schedulingManager.stopTasks();
+
+        assertEquals( Scheduler.STATUS_NOT_STARTED, schedulingManager.getTaskStatus() );
+    }
+
+    @Test
+    public void testIsScheduled()
+    {
+        Map<String, String> keyCronMap = new HashMap<String, String>();
+        keyCronMap.put( TASK_RESOURCE_TABLE, CRON_DAILY_0AM );
+        keyCronMap.put( TASK_ANALYTICS_ALL, CRON_DAILY_0AM );
+
+        schedulingManager.scheduleTasks( keyCronMap );
+        
+        assertTrue( schedulingManager.isScheduled( TASK_RESOURCE_TABLE ) );
+        assertFalse( schedulingManager.isScheduled( TASK_DATAMART_LAST_6_MONTHS ) );
+    }
+}

=== modified file 'dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/scheduling/Scheduler.java'
--- dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/scheduling/Scheduler.java	2012-03-06 09:27:38 +0000
+++ dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/scheduling/Scheduler.java	2013-03-04 20:41:25 +0000
@@ -33,7 +33,6 @@
 public interface Scheduler
 {
     final String CRON_DAILY_0AM = "0 0 0 * * ?";
-    final String CRON_DAILY_1AM = "0 0 1 * * ?";
     final String CRON_DAILY_0AM_EXCEPT_SUNDAY = "0 0 0 ? * 1-6";
     final String CRON_WEEKLY_SUNDAY_0AM = "0 0 0 ? * 0";
     final String CRON_TEST = "0 * * * * ?";
@@ -43,13 +42,46 @@
     final String STATUS_STOPPED  = "stopped";
     final String STATUS_NOT_STARTED = "not_started";
     
+    /**
+     * Execute the given task immediately.
+     * 
+     * @task the task to execute.
+     */
     void executeTask( Runnable task );
     
+    /**
+     * Schedule the given task for future execution. The task can be referenced
+     * later through the given task key. A task cannot be scheduled if another
+     * task with the same key is already scheduled. The task must be unique for
+     * the task but can have an arbitrary value.
+     * 
+     * @param key the task key, cannot be null.
+     * @param task the task to schedule.
+     * @param cronExpr the cron expression to use for the task scheduling.
+     * @return true if the task was scheduled for execution as a result of this
+     *         operation, false if not.
+     */
     boolean scheduleTask( String key, Runnable task, String cronExpr );
     
+    /**
+     * Deactivates scheduling of the task with the given key.
+     * 
+     * @param key the task key.
+     * @return true if the task was deactivated as a result of this operation,
+     *         false if not.
+     */
     boolean stopTask( String key );
     
+    /**
+     * Deactivates scheduling for all tasks.
+     */
     void stopAllTasks();
     
+    /**
+     * Gets the status for the task with the given key.
+     * 
+     * @param key the task key.
+     * @return the task status.
+     */
     String getTaskStatus( String key );
 }

=== modified file 'dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/widgets.css'
--- dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/widgets.css	2012-12-04 13:16:24 +0000
+++ dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/css/widgets.css	2013-03-04 20:41:25 +0000
@@ -486,8 +486,15 @@
 /* Settings                                                                   */
 /*----------------------------------------------------------------------------*/
 
+.settingHeader
+{
+  padding: 6px 2px;
+  font-size: 12pt;
+  color: #373737;
+}
+
 .settingLabel
-{
+{	
   padding: 2px;
   font-size: 10pt;
 }

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/java/org/hisp/dhis/dataadmin/action/scheduling/ScheduleTasksAction.java'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/java/org/hisp/dhis/dataadmin/action/scheduling/ScheduleTasksAction.java	2012-02-02 20:01:36 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/java/org/hisp/dhis/dataadmin/action/scheduling/ScheduleTasksAction.java	2013-03-04 20:41:25 +0000
@@ -27,21 +27,24 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+import static org.hisp.dhis.setting.SystemSettingManager.DEFAULT_ORGUNITGROUPSET_AGG_LEVEL;
 import static org.hisp.dhis.setting.SystemSettingManager.DEFAULT_SCHEDULED_PERIOD_TYPES;
 import static org.hisp.dhis.setting.SystemSettingManager.KEY_ORGUNITGROUPSET_AGG_LEVEL;
-import static org.hisp.dhis.setting.SystemSettingManager.DEFAULT_ORGUNITGROUPSET_AGG_LEVEL;
 import static org.hisp.dhis.setting.SystemSettingManager.KEY_SCHEDULED_PERIOD_TYPES;
 
+import static org.hisp.dhis.scheduling.SchedulingManager.*;
+import static org.hisp.dhis.system.scheduling.Scheduler.*;
+
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.hisp.dhis.setting.SystemSettingManager;
 import org.hisp.dhis.organisationunit.OrganisationUnitLevel;
 import org.hisp.dhis.organisationunit.OrganisationUnitService;
 import org.hisp.dhis.scheduling.SchedulingManager;
+import org.hisp.dhis.setting.SystemSettingManager;
 import org.hisp.dhis.system.scheduling.Scheduler;
 
 import com.opensymphony.xwork2.Action;
@@ -54,7 +57,9 @@
 {
     private static final String STRATEGY_LAST_12_DAILY = "last12Daily";
     private static final String STRATEGY_LAST_6_DAILY_6_TO_12_WEEKLY = "last6Daily6To12Weekly";
-        
+    private static final String STRATEGY_ALL_DAILY = "allDaily";
+    private static final String STRATEGY_LAST_3_YEARS_DAILY = "last3YearsDaily";
+    
     // -------------------------------------------------------------------------
     // Dependencies
     // -------------------------------------------------------------------------
@@ -98,6 +103,30 @@
         this.schedule = schedule;
     }
 
+    private String resourceTableStrategy;
+
+    public String getResourceTableStrategy()
+    {
+        return resourceTableStrategy;
+    }
+
+    public void setResourceTableStrategy( String resourceTableStrategy )
+    {
+        this.resourceTableStrategy = resourceTableStrategy;
+    }
+
+    private String analyticsStrategy;
+    
+    public String getAnalyticsStrategy()
+    {
+        return analyticsStrategy;
+    }
+
+    public void setAnalyticsStrategy( String analyticsStrategy )
+    {
+        this.analyticsStrategy = analyticsStrategy;
+    }
+
     private Set<String> scheduledPeriodTypes = new HashSet<String>();
 
     public Set<String> getScheduledPeriodTypes()
@@ -182,15 +211,41 @@
             else
             {
                 Map<String, String> keyCronMap = new HashMap<String, String>();
+
+                // -------------------------------------------------------------
+                // Resource tables
+                // -------------------------------------------------------------
+
+                if ( STRATEGY_ALL_DAILY.equals( resourceTableStrategy ) )
+                {
+                    keyCronMap.put( TASK_RESOURCE_TABLE, CRON_DAILY_0AM );
+                }
+                
+                // -------------------------------------------------------------
+                // Analytics
+                // -------------------------------------------------------------
+
+                if ( STRATEGY_ALL_DAILY.equals( analyticsStrategy ) )
+                {
+                    keyCronMap.put( TASK_ANALYTICS_ALL, CRON_DAILY_0AM );
+                }
+                else if ( STRATEGY_LAST_3_YEARS_DAILY.equals( analyticsStrategy ) )
+                {
+                    keyCronMap.put( TASK_ANALYTICS_LAST_3_YEARS, CRON_DAILY_0AM );
+                }
+                
+                // -------------------------------------------------------------
+                // Data mart
+                // -------------------------------------------------------------
                 
                 if ( STRATEGY_LAST_12_DAILY.equals( dataMartStrategy ) )
                 {
-                    keyCronMap.put( SchedulingManager.TASK_DATAMART_LAST_12_MONTHS, Scheduler.CRON_DAILY_0AM );
+                    keyCronMap.put( TASK_DATAMART_LAST_12_MONTHS, CRON_DAILY_0AM );
                 }
                 else if ( STRATEGY_LAST_6_DAILY_6_TO_12_WEEKLY.equals( dataMartStrategy ) )
                 {
-                    keyCronMap.put( SchedulingManager.TASK_DATAMART_LAST_6_MONTS, Scheduler.CRON_DAILY_0AM_EXCEPT_SUNDAY );
-                    keyCronMap.put( SchedulingManager.TASK_DATAMART_FROM_6_TO_12_MONTS, Scheduler.CRON_WEEKLY_SUNDAY_0AM );
+                    keyCronMap.put( TASK_DATAMART_LAST_6_MONTHS, CRON_DAILY_0AM_EXCEPT_SUNDAY );
+                    keyCronMap.put( TASK_DATAMART_FROM_6_TO_12_MONTS, CRON_WEEKLY_SUNDAY_0AM );
                 }
                 
                 schedulingManager.scheduleTasks( keyCronMap );
@@ -198,16 +253,49 @@
         }
         else
         {
-            scheduledPeriodTypes = (Set<String>) systemSettingManager.getSystemSetting( KEY_SCHEDULED_PERIOD_TYPES, DEFAULT_SCHEDULED_PERIOD_TYPES );
-            orgUnitGroupSetAggLevel = (Integer) systemSettingManager.getSystemSetting( KEY_ORGUNITGROUPSET_AGG_LEVEL, DEFAULT_ORGUNITGROUPSET_AGG_LEVEL );
-            dataMartStrategy = schedulingManager.getScheduledTasks().containsKey( SchedulingManager.TASK_DATAMART_LAST_12_MONTHS ) ? 
-                STRATEGY_LAST_12_DAILY : STRATEGY_LAST_6_DAILY_6_TO_12_WEEKLY;
+            // -----------------------------------------------------------------
+            // Resource tables
+            // -----------------------------------------------------------------
+
+            if ( schedulingManager.isScheduled( TASK_RESOURCE_TABLE ) )
+            {
+                resourceTableStrategy = STRATEGY_ALL_DAILY;
+            }
+            
+            // -----------------------------------------------------------------
+            // Analytics
+            // -----------------------------------------------------------------
+
+            if ( schedulingManager.isScheduled( TASK_ANALYTICS_ALL ) )
+            {
+                analyticsStrategy = STRATEGY_ALL_DAILY;
+            }
+            else if ( schedulingManager.isScheduled( TASK_ANALYTICS_LAST_3_YEARS ) )
+            {
+                analyticsStrategy = STRATEGY_LAST_3_YEARS_DAILY;
+            }
+            
+            // -----------------------------------------------------------------
+            // Data mart
+            // -----------------------------------------------------------------
+
+            if ( schedulingManager.isScheduled( TASK_DATAMART_LAST_12_MONTHS ) )
+            {
+                dataMartStrategy = STRATEGY_LAST_12_DAILY;
+            }
+            else if ( schedulingManager.isScheduled( TASK_DATAMART_LAST_6_MONTHS ) )
+            {
+                dataMartStrategy = STRATEGY_LAST_6_DAILY_6_TO_12_WEEKLY;
+            }            
         }
-
+        
+        scheduledPeriodTypes = (Set<String>) systemSettingManager.getSystemSetting( KEY_SCHEDULED_PERIOD_TYPES, DEFAULT_SCHEDULED_PERIOD_TYPES );
+        orgUnitGroupSetAggLevel = (Integer) systemSettingManager.getSystemSetting( KEY_ORGUNITGROUPSET_AGG_LEVEL, DEFAULT_ORGUNITGROUPSET_AGG_LEVEL );
+        
         status = schedulingManager.getTaskStatus();        
-        running = Scheduler.STATUS_RUNNING.equals( status );
+        running = STATUS_RUNNING.equals( status );
         levels = organisationUnitService.getOrganisationUnitLevels();
-        
+
         return SUCCESS;
     }
 }

=== 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-11-25 20:18:52 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/resources/org/hisp/dhis/dataadmin/i18n_module.properties	2013-03-04 20:41:25 +0000
@@ -268,10 +268,18 @@
 aggregation_period_types=Aggregation period types
 running=active
 done=done
-datamart_task_strategy=Data mart task strategy
+resource_tables=Resource tables
+data_mart=Data mart
+analytics_tables=Analytics tables
+analytics_tables_task_strategy=Analytics tables task strategy
+last_3_years_daily=Last 3 years daily
+all_daily=All daily
+resource_table_task_strategy=Resource tables task strategy
+data_mart_task_strategy=Data mart task strategy
 never=Never
 last_12_months_daily=Last 12 months daily
 last_6_months_daily_6_to_12_months_weekly=Last 6 months daily + 6 to 12 months weekly
+daily=Daily
 organisation_unit_group_set_aggregation_level=Organisation unit group set aggregation level
 aggregated_org_unit_data_values=Aggregated org unit data values
 aggregated_org_unit_indicator_values=Aggregated org unit indicator values

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/viewScheduledTasks.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/viewScheduledTasks.vm	2013-01-28 06:30:22 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-dataadmin/src/main/webapp/dhis-web-maintenance-dataadmin/viewScheduledTasks.vm	2013-03-04 20:41:25 +0000
@@ -8,68 +8,81 @@
 
 <form id="schedulingForm" action="scheduleTasks.action" method="post">
 
-<table style="width:300px">
-<tr>
-	<th style="width:100%">$i18n.getString( "aggregation_period_types" )</th>
-</tr>
-<tr>
-	<td>
-		<label for="weekly">$i18n.getString( "Weekly" )</label><input type="checkbox" id="weekly" class="scheduling" name="scheduledPeriodTypes" value="Weekly"#if( $scheduledPeriodTypes.contains( "Weekly" ) ) checked="checked"#end>&nbsp;
-		<label for="monthly">$i18n.getString( "Monthly" )</label><input type="checkbox" id="monthly" class="scheduling" name="scheduledPeriodTypes" value="Monthly"#if( $scheduledPeriodTypes.contains( "Monthly" ) ) checked="checked"#end>&nbsp;
-		<label for="biMonthly">$i18n.getString( "BiMonthly" )</label><input type="checkbox" id="biMonthly" class="scheduling" name="scheduledPeriodTypes" value="BiMonthly"#if( $scheduledPeriodTypes.contains( "BiMonthly" ) ) checked="checked"#end>&nbsp;
-		<label for="quarterly">$i18n.getString( "Quarterly" )</label><input type="checkbox" id="quarterly" class="scheduling" name="scheduledPeriodTypes" value="Quarterly"#if( $scheduledPeriodTypes.contains( "Quarterly" ) ) checked="checked"#end><br><br>
-		<label for="sixMonthly">$i18n.getString( "SixMonthly" )</label><input type="checkbox" id="sixMonthly" class="scheduling" name="scheduledPeriodTypes" value="SixMonthly"#if( $scheduledPeriodTypes.contains( "SixMonthly" ) ) checked="checked"#end>&nbsp;
-		<label for="yearly">$i18n.getString( "Yearly" )</label><input type="checkbox" id="yearly" class="scheduling" name="scheduledPeriodTypes" value="Yearly"#if( $scheduledPeriodTypes.contains( "Yearly" ) ) checked="checked"#end>&nbsp;
-		<label for="financialYearly">$i18n.getString( "financial_yearly" )</label><input type="checkbox" id="financialYearly" class="scheduling" name="scheduledPeriodTypes" value="FinancialJuly"#if( $scheduledPeriodTypes.contains( "FinancialJuly" ) ) checked="checked"#end>			
-	</td>
-</tr>
-<tr>
-	<td style="height:10px"></td>
-</tr>
-<tr>
-	<th>$i18n.getString( "organisation_unit_group_set_aggregation_level" )</th>
-</tr>
-<tr>
-	<td>
-		<select id="orgUnitGroupSetAggLevel" name="orgUnitGroupSetAggLevel" class="scheduling" style="width:100%">
-		<option value="0"#if( $orgUnitGroupSetAggLevel && $orgUnitGroupSetAggLevel == 0 ) selected="selected"#end>[$i18n.getString( "no_aggregation" )]</option>
-		#foreach( $level in $levels )
-		<option value="$level.level"#if( $orgUnitGroupSetAggLevel && $orgUnitGroupSetAggLevel == $level.level ) selected="selected"#end>$encoder.htmlEncode( $level.displayName )</option>
-		#end
-		</select>
-	</td>
-</tr>
-<tr>
-	<td style="height:10px"></td>
-</tr>
-<tr>
-	<th>$i18n.getString( "datamart_task_strategy" )</th>
-</tr>
-<tr>
-	<td>
-		<select id="dataMartStrategy" name="dataMartStrategy" class="scheduling" style="width:100%">
-		<option value="never">$i18n.getString( "never" )</option>
-		<option value="last12Daily"#if( $dataMartStrategy && $dataMartStrategy == "last12Daily" ) selected="selected"#end>$i18n.getString( "last_12_months_daily" )</option>
-		<option value="last6Daily6To12Weekly"#if( $dataMartStrategy && $dataMartStrategy == "last6Daily6To12Weekly" ) selected="selected"#end>$i18n.getString( "last_6_months_daily_6_to_12_months_weekly" )</option>		
-		</select>
-	</td>
-</tr>
-<tr>
-	<td style="height:10px"></td>
-</tr>
-<tr>
-	<td>
-		<input type="button" style="width:140px" onclick="submitSchedulingForm()"
-		#if ( $running )
-		value="$i18n.getString( 'stop' )"
-		#else
-		value="$i18n.getString( 'start' )"
-		#end
-		/>
-		<input type="button" id="executeButton" style="width:140px" onclick="executeTasks()" value="$i18n.getString( 'execute_now' )" />
-	</td>
-</tr>
-</table>
+<!-- Resource tables -->
+
+<div class="settingHeader">$i18n.getString( "resource_tables" )</div>
+
+<div class="settingLabel">$i18n.getString( "resource_table_task_strategy" )</div>
+
+<div class="setting">
+<select id="resourceTableStrategy" name="resourceTableStrategy" class="scheduling">
+	<option value="never">$i18n.getString( "never" )</option>
+	<option value="allDaily"#if( $resourceTableStrategy && $resourceTableStrategy == "allDaily" ) selected="selected"#end>$i18n.getString( "daily" )</option>
+</select>
+</div>
+
+<!-- Analytics -->
+
+<div class="settingHeader">$i18n.getString( "analytics_tables" )</div>
+
+<div class="settingLabel">$i18n.getString( "analytics_tables_task_strategy" )</div>
+
+<div class="setting">
+<select id="analyticsStrategy" name="analyticsStrategy" class="scheduling">
+    <option value="never">$i18n.getString( "never" )</option>
+    <option value="allDaily"#if( $analyticsStrategy && $analyticsStrategy == "allDaily" ) selected="selected"#end>$i18n.getString( "all_daily" )</option>
+    <option value="last3YearsDaily"#if( $analyticsStrategy && $analyticsStrategy == "last3YearsDaily" ) selected="selected"#end>$i18n.getString( "last_3_years_daily" )</option>
+</select>
+</div>
+
+<!-- Data mart -->
+
+<div class="settingHeader">$i18n.getString( "data_mart" )</div>
+
+<div class="settingLabel">$i18n.getString( "aggregation_period_types" )</div>
+
+<div class="setting">
+<label for="weekly">$i18n.getString( "Weekly" )</label><input type="checkbox" id="weekly" class="scheduling" name="scheduledPeriodTypes" value="Weekly"#if( $scheduledPeriodTypes.contains( "Weekly" ) ) checked="checked"#end>&nbsp;
+<label for="monthly">$i18n.getString( "Monthly" )</label><input type="checkbox" id="monthly" class="scheduling" name="scheduledPeriodTypes" value="Monthly"#if( $scheduledPeriodTypes.contains( "Monthly" ) ) checked="checked"#end>&nbsp;
+<label for="biMonthly">$i18n.getString( "BiMonthly" )</label><input type="checkbox" id="biMonthly" class="scheduling" name="scheduledPeriodTypes" value="BiMonthly"#if( $scheduledPeriodTypes.contains( "BiMonthly" ) ) checked="checked"#end>&nbsp;
+<label for="quarterly">$i18n.getString( "Quarterly" )</label><input type="checkbox" id="quarterly" class="scheduling" name="scheduledPeriodTypes" value="Quarterly"#if( $scheduledPeriodTypes.contains( "Quarterly" ) ) checked="checked"#end><br>
+<label for="sixMonthly">$i18n.getString( "SixMonthly" )</label><input type="checkbox" id="sixMonthly" class="scheduling" name="scheduledPeriodTypes" value="SixMonthly"#if( $scheduledPeriodTypes.contains( "SixMonthly" ) ) checked="checked"#end>&nbsp;
+<label for="yearly">$i18n.getString( "Yearly" )</label><input type="checkbox" id="yearly" class="scheduling" name="scheduledPeriodTypes" value="Yearly"#if( $scheduledPeriodTypes.contains( "Yearly" ) ) checked="checked"#end>&nbsp;
+<label for="financialYearly">$i18n.getString( "financial_yearly" )</label><input type="checkbox" id="financialYearly" class="scheduling" name="scheduledPeriodTypes" value="FinancialJuly"#if( $scheduledPeriodTypes.contains( "FinancialJuly" ) ) checked="checked"#end>			
+</div>
+
+<div class="settingLabel">$i18n.getString( "organisation_unit_group_set_aggregation_level" )</div>
+
+<div class="setting">
+<select id="orgUnitGroupSetAggLevel" name="orgUnitGroupSetAggLevel" class="scheduling">
+    <option value="0"#if( $orgUnitGroupSetAggLevel && $orgUnitGroupSetAggLevel == 0 ) selected="selected"#end>[$i18n.getString( "no_aggregation" )]</option>
+	#foreach( $level in $levels )
+	<option value="$level.level"#if( $orgUnitGroupSetAggLevel && $orgUnitGroupSetAggLevel == $level.level ) selected="selected"#end>$encoder.htmlEncode( $level.displayName )</option>
+	#end
+</select>
+</div>
+
+<div class="settingLabel">$i18n.getString( "data_mart_task_strategy" )</div>
+
+<div class="setting">
+<select id="dataMartStrategy" name="dataMartStrategy" class="scheduling">
+	<option value="never">$i18n.getString( "never" )</option>
+	<option value="last12Daily"#if( $dataMartStrategy && $dataMartStrategy == "last12Daily" ) selected="selected"#end>$i18n.getString( "last_12_months_daily" )</option>
+	<option value="last6Daily6To12Weekly"#if( $dataMartStrategy && $dataMartStrategy == "last6Daily6To12Weekly" ) selected="selected"#end>$i18n.getString( "last_6_months_daily_6_to_12_months_weekly" )</option>		
+</select>
+</div>
+
+<div class="setting">
+	<input type="button" style="width:140px" onclick="submitSchedulingForm()"
+	#if ( $running )
+	value="$i18n.getString( 'stop' )"
+	#else
+	value="$i18n.getString( 'start' )"
+	#end
+	/>
+	<input type="button" id="executeButton" style="width:140px" onclick="executeTasks()" value="$i18n.getString( 'execute_now' )" />
+</div>
+
 </form>
 
 <span id="info">$i18n.getString( "scheduling_is" ) $!i18n.getString( $!status )</span>