← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 6250: Web API, impl a new configurable caching solution where data resources can be cached until 6 am t...

 

------------------------------------------------------------
revno: 6250
committer: Lars Helge Overland <larshelge@xxxxxxxxx>
branch nick: dhis2
timestamp: Mon 2012-03-12 13:33:20 +0100
message:
  Web API, impl a new configurable caching solution where data resources can be cached until 6 am the next day, two weeks or not at all. This is intended to be used together with the nightly scheduled data mart tasks and utilize the fact that we know when the aggregated data will be refreshed - there is no need to regenerate data resources/reports when the data has not changed.
modified:
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementCategoryOptionCombo.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/setting/SystemSettingManager.java
  dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/security/DefaultUserDetailsService.java
  dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/ChartController.java
  dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/DocumentController.java
  dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/MapController.java
  dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/ReportController.java
  dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/ReportTableController.java
  dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/utils/ContextUtils.java
  dhis-2/dhis-web/dhis-web-commons/src/main/java/org/hisp/dhis/interceptor/SystemSettingInterceptor.java
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/java/org/hisp/dhis/settings/action/system/SetGeneralSettingsAction.java
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/resources/org/hisp/dhis/settings/i18n_module.properties
  dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/webapp/dhis-web-maintenance-settings/systemGeneralSettings.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/dataelement/DataElementCategoryOptionCombo.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementCategoryOptionCombo.java	2012-03-07 12:10:37 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementCategoryOptionCombo.java	2012-03-12 12:33:20 +0000
@@ -28,7 +28,6 @@
  */
 
 import org.apache.commons.lang.StringEscapeUtils;
-import org.codehaus.jackson.annotate.JsonIgnore;
 import org.codehaus.jackson.annotate.JsonProperty;
 import org.codehaus.jackson.map.annotate.JsonSerialize;
 import org.hisp.dhis.common.BaseIdentifiableObject;

=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/setting/SystemSettingManager.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/setting/SystemSettingManager.java	2012-03-05 16:37:17 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/setting/SystemSettingManager.java	2012-03-12 12:33:20 +0000
@@ -68,6 +68,7 @@
     final String KEY_SCHEDULED_TASKS = "keyScheduledTasks";
     final String KEY_ORGUNITGROUPSET_AGG_LEVEL = "orgUnitGroupSetAggregationLevel";
     final String KEY_SMS_CONFIG = "SMS_CONFIG";
+    final String KEY_CACHE_STRATEGY = "keyCacheStrategy";
     
     final int DEFAULT_MAX_NUMBER_OF_ATTEMPTS = 20;
     final int DEFAULT_TIMEFRAME_MINUTES = 1;

=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/security/DefaultUserDetailsService.java'
--- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/security/DefaultUserDetailsService.java	2012-03-07 14:37:56 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/security/DefaultUserDetailsService.java	2012-03-12 12:33:20 +0000
@@ -36,7 +36,6 @@
 import org.hisp.dhis.user.UserService;
 import org.springframework.dao.DataAccessException;
 import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.GrantedAuthorityImpl;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
 import org.springframework.security.core.userdetails.User;
 import org.springframework.security.core.userdetails.UserDetails;

=== modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/ChartController.java'
--- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/ChartController.java	2012-03-10 10:01:52 +0000
+++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/ChartController.java	2012-03-12 12:33:20 +0000
@@ -81,6 +81,9 @@
 
     @Autowired
     private I18nManager i18nManager;
+    
+    @Autowired
+    private ContextUtils contextUtils;
 
     //-------------------------------------------------------------------------------------------------------
     // GET
@@ -146,7 +149,7 @@
         
         String filename = CodecUtils.filenameEncode( chart.getName() ) + ".png";
         
-        ContextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_PNG, CacheStrategy.NO_CACHE, filename, false );
+        contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_PNG, CacheStrategy.RESPECT_SYSTEM_SETTING, filename, false );
         
         ChartUtilities.writeChartAsPNG( response.getOutputStream(), jFreeChart, width, height );
     }
@@ -174,7 +177,7 @@
             chart = chartService.getJFreeOrganisationUnitChart( indicator, unit, !skipTitle, i18nManager.getI18nFormat() );
         }
 
-        ContextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_PNG, CacheStrategy.NO_CACHE, "chart.png", false );
+        contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_PNG, CacheStrategy.RESPECT_SYSTEM_SETTING, "chart.png", false );
         
         ChartUtilities.writeChartAsPNG( response.getOutputStream(), chart, width, height );
     }

=== modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/DocumentController.java'
--- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/DocumentController.java	2012-03-10 10:01:52 +0000
+++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/DocumentController.java	2012-03-12 12:33:20 +0000
@@ -72,6 +72,9 @@
     @Autowired
     private LocationManager locationManager;
 
+    @Autowired
+    private ContextUtils contextUtils;
+
     //-------------------------------------------------------------------------------------------------------
     // GET
     //-------------------------------------------------------------------------------------------------------
@@ -140,7 +143,7 @@
             
             boolean attachment = !( CONTENT_TYPE_PDF.equals( ct ) || CONTENT_TYPE_JPG.equals( ct ) || CONTENT_TYPE_PNG.equals( ct ) );
             
-            ContextUtils.configureResponse( response, document.getContentType(), CacheStrategy.CACHE_TWO_WEEKS, document.getUrl(), attachment );
+            contextUtils.configureResponse( response, document.getContentType(), CacheStrategy.CACHE_TWO_WEEKS, document.getUrl(), attachment );
 
             InputStream in = locationManager.getInputStream( document.getUrl(), DocumentService.DIR );
 

=== modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/MapController.java'
--- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/MapController.java	2012-03-10 10:01:52 +0000
+++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/MapController.java	2012-03-12 12:33:20 +0000
@@ -77,6 +77,9 @@
     @Autowired
     private MapGenerationService mapGenerationService;
 
+    @Autowired
+    private ContextUtils contextUtils;
+
     //-------------------------------------------------------------------------------------------------------
     // GET
     //-------------------------------------------------------------------------------------------------------
@@ -200,7 +203,7 @@
         
         if ( image != null )
         {
-            ContextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_PNG, CacheStrategy.NO_CACHE, "mapview.png", false );
+            contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_PNG, CacheStrategy.RESPECT_SYSTEM_SETTING, "mapview.png", false );
             
             ImageIO.write( image, "PNG", response.getOutputStream() );
         }

=== modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/ReportController.java'
--- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/ReportController.java	2012-03-10 10:01:52 +0000
+++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/ReportController.java	2012-03-12 12:33:20 +0000
@@ -75,6 +75,9 @@
     @Autowired
     private I18nManager i18nManager;
 
+    @Autowired
+    private ContextUtils contextUtils;
+
     // -------------------------------------------------------------------------------------------------------
     // GET
     // -------------------------------------------------------------------------------------------------------
@@ -165,7 +168,7 @@
         Date date = period != null ? DateUtils.getMediumDate( period ) : new Cal().now().subtract( Calendar.MONTH, 1 ).time();
 
         String filename = CodecUtils.filenameEncode( report.getName() ) + "." + type;
-        ContextUtils.configureResponse( response, contentType, CacheStrategy.NO_CACHE, filename, attachment );
+        contextUtils.configureResponse( response, contentType, CacheStrategy.RESPECT_SYSTEM_SETTING, filename, attachment );
 
         reportService.renderReport( response.getOutputStream(), uid, date, organisationUnitUid, type,
             i18nManager.getI18nFormat() );

=== modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/ReportTableController.java'
--- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/ReportTableController.java	2012-03-10 10:01:52 +0000
+++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/ReportTableController.java	2012-03-12 12:33:20 +0000
@@ -83,6 +83,9 @@
     @Autowired
     private I18nManager i18nManager;
 
+    @Autowired
+    private ContextUtils contextUtils;
+
     //-------------------------------------------------------------------------------------------------------
     // GET
     //-------------------------------------------------------------------------------------------------------
@@ -176,7 +179,7 @@
         Grid grid = reportTableService.getReportTableGrid( uid, i18nManager.getI18nFormat(), date, organisationUnitUid );
 
         String filename = filenameEncode( grid.getTitle() ) + ".pdf";
-        ContextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_PDF, CacheStrategy.NO_CACHE, filename, false );
+        contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_PDF, CacheStrategy.RESPECT_SYSTEM_SETTING, filename, false );
 
         GridUtils.toPdf( grid, response.getOutputStream() );
     }
@@ -199,7 +202,7 @@
         Grid grid = reportTableService.getReportTableGrid( uid, i18nManager.getI18nFormat(), date, organisationUnitUid );
 
         String filename = filenameEncode( grid.getTitle() ) + ".xls";
-        ContextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_EXCEL, CacheStrategy.NO_CACHE, filename, true );
+        contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_EXCEL, CacheStrategy.RESPECT_SYSTEM_SETTING, filename, true );
 
         GridUtils.toXls( grid, response.getOutputStream() );
     }
@@ -222,7 +225,7 @@
         Grid grid = reportTableService.getReportTableGrid( uid, i18nManager.getI18nFormat(), date, organisationUnitUid );
 
         String filename = filenameEncode( grid.getTitle() ) + ".csv";
-        ContextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_CSV, CacheStrategy.NO_CACHE, filename, true );
+        contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_CSV, CacheStrategy.RESPECT_SYSTEM_SETTING, filename, true );
 
         GridUtils.toCsv( grid, response.getOutputStream() );
     }

=== modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/utils/ContextUtils.java'
--- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/utils/ContextUtils.java	2012-03-10 10:01:52 +0000
+++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/utils/ContextUtils.java	2012-03-12 12:33:20 +0000
@@ -33,11 +33,18 @@
 
 import javax.servlet.http.HttpServletResponse;
 
+import org.hisp.dhis.setting.SystemSettingManager;
 import org.hisp.dhis.system.util.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import static org.hisp.dhis.setting.SystemSettingManager.KEY_CACHE_STRATEGY;
+import static org.apache.commons.lang.StringUtils.trimToNull;
 
 /**
  * @author Lars Helge Overland
  */
+@Component
 public class ContextUtils
 {
     public static final String CONTENT_TYPE_PDF = "application/pdf";
@@ -54,15 +61,22 @@
     public static final String CONTENT_TYPE_JAVASCRIPT = "application/javascript";
 
     public static final String HEADER_USER_AGENT = "User-Agent";
+    public static final String HEADER_CACHE_CONTROL = "Cache-Control";
+    public static final String HEADER_EXPIRES = "Expires";
+    public static final String HEADER_CONTENT_DISPOSITION = "Content-Disposition";
 
+    @Autowired
+    private SystemSettingManager systemSettingManager;
+    
     public enum CacheStrategy
     {
         NO_CACHE,
+        CACHE_6AM_TOMORROW,
         CACHE_TWO_WEEKS,
         RESPECT_SYSTEM_SETTING
     }
     
-    public static void configureResponse( HttpServletResponse response, String contentType, CacheStrategy cacheStrategy,
+    public void configureResponse( HttpServletResponse response, String contentType, CacheStrategy cacheStrategy,
         String filename, boolean attachment )
     {
         if ( contentType != null )
@@ -70,6 +84,13 @@
             response.setContentType( contentType );
         }
 
+        if ( cacheStrategy.equals( CacheStrategy.RESPECT_SYSTEM_SETTING ) )
+        {
+            String strategy = trimToNull( (String) systemSettingManager.getSystemSetting( KEY_CACHE_STRATEGY ) );
+            
+            cacheStrategy = strategy != null ? CacheStrategy.valueOf( strategy ) : CacheStrategy.NO_CACHE;
+        }
+        
         if ( cacheStrategy == null || cacheStrategy.equals( CacheStrategy.NO_CACHE ) )
         {
             // -----------------------------------------------------------------
@@ -77,23 +98,28 @@
             // responses to disk over SSL, was "no-cache".
             // -----------------------------------------------------------------
 
-            response.setHeader( "Cache-Control", "max-age=1" );
-            response.setHeader( "Expires", DateUtils.getExpiredHttpDateString() );
+            response.setHeader( HEADER_CACHE_CONTROL, "max-age=1" );
+            response.setHeader( HEADER_EXPIRES, DateUtils.getExpiredHttpDateString() );
+        }
+        else if ( cacheStrategy.equals( CacheStrategy.CACHE_6AM_TOMORROW ) )
+        {
+            response.setHeader( HEADER_CACHE_CONTROL, "max-age=" + DateUtils.getSecondsUntilTomorrow( 6 ) );
+            response.setHeader( HEADER_EXPIRES, DateUtils.getHttpDateString( DateUtils.getDateForTomorrow( 6 ) ) );
         }
         else if ( cacheStrategy.equals( CacheStrategy.CACHE_TWO_WEEKS ) )
         {
             Calendar cal = Calendar.getInstance();
             cal.add( Calendar.DAY_OF_YEAR, 14 );
             
-            response.setHeader( "Cache-Control", "max-age=1209600" );
-            response.setHeader( "Expires", DateUtils.getHttpDateString( cal.getTime() ) );
+            response.setHeader( HEADER_CACHE_CONTROL, "max-age=1209600" );
+            response.setHeader( HEADER_EXPIRES, DateUtils.getHttpDateString( cal.getTime() ) );
         }
 
         if ( filename != null )
         {
             String type = attachment ? "attachment" : "inline";
 
-            response.setHeader( "Content-Disposition", type + "; filename=\"" + filename + "\"" );
+            response.setHeader( HEADER_CONTENT_DISPOSITION, type + "; filename=\"" + filename + "\"" );
         }
     }
 

=== modified file 'dhis-2/dhis-web/dhis-web-commons/src/main/java/org/hisp/dhis/interceptor/SystemSettingInterceptor.java'
--- dhis-2/dhis-web/dhis-web-commons/src/main/java/org/hisp/dhis/interceptor/SystemSettingInterceptor.java	2012-03-05 16:37:17 +0000
+++ dhis-2/dhis-web/dhis-web-commons/src/main/java/org/hisp/dhis/interceptor/SystemSettingInterceptor.java	2012-03-12 12:33:20 +0000
@@ -72,7 +72,8 @@
     {
         Map<String, Object> map = new HashMap<String, Object>();
         
-        map.put( KEY_SYSTEM_IDENTIFIER, systemSettingManager.getSystemIdentifier() );
+        map.put( KEY_SYSTEM_IDENTIFIER, systemSettingManager.getSystemIdentifier() ); //TODO remove
+        map.put( KEY_CACHE_STRATEGY, systemSettingManager.getSystemSetting( KEY_CACHE_STRATEGY ) );
         map.put( KEY_APPLICATION_TITLE, systemSettingManager.getSystemSetting( KEY_APPLICATION_TITLE ) );
         map.put( KEY_FLAG, systemSettingManager.getSystemSetting( KEY_FLAG ) );
         map.put( KEY_FLAG_IMAGE, systemSettingManager.getFlagImage() );

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/java/org/hisp/dhis/settings/action/system/SetGeneralSettingsAction.java'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/java/org/hisp/dhis/settings/action/system/SetGeneralSettingsAction.java	2012-03-05 16:37:17 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/java/org/hisp/dhis/settings/action/system/SetGeneralSettingsAction.java	2012-03-12 12:33:20 +0000
@@ -31,6 +31,7 @@
 import static org.hisp.dhis.setting.SystemSettingManager.KEY_DISABLE_DATAENTRYFORM_WHEN_COMPLETED;
 import static org.hisp.dhis.setting.SystemSettingManager.KEY_FACTOR_OF_DEVIATION;
 import static org.hisp.dhis.setting.SystemSettingManager.KEY_OMIT_INDICATORS_ZERO_NUMERATOR_DATAMART;
+import static org.hisp.dhis.setting.SystemSettingManager.KEY_CACHE_STRATEGY;
 
 import org.hisp.dhis.configuration.Configuration;
 import org.hisp.dhis.configuration.ConfigurationService;
@@ -93,6 +94,13 @@
     // Output
     // -------------------------------------------------------------------------
 
+    private String cacheStrategy;
+    
+    public void setCacheStrategy( String cacheStrategy )
+    {
+        this.cacheStrategy = cacheStrategy;
+    }
+
     private Integer infrastructuralDataElements;
 
     public void setInfrastructuralDataElements( Integer infrastructuralDataElements )
@@ -169,6 +177,7 @@
 
     public String execute()
     {
+        systemSettingManager.saveSystemSetting( KEY_CACHE_STRATEGY, cacheStrategy );
         systemSettingManager.saveSystemSetting( KEY_OMIT_INDICATORS_ZERO_NUMERATOR_DATAMART, omitIndicatorsZeroNumeratorDataMart );
         systemSettingManager.saveSystemSetting( KEY_DISABLE_DATAENTRYFORM_WHEN_COMPLETED, disableDataEntryWhenCompleted );
         systemSettingManager.saveSystemSetting( KEY_FACTOR_OF_DEVIATION, factorDeviation );

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/resources/org/hisp/dhis/settings/i18n_module.properties'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/resources/org/hisp/dhis/settings/i18n_module.properties	2012-03-04 13:26:24 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/resources/org/hisp/dhis/settings/i18n_module.properties	2012-03-12 12:33:20 +0000
@@ -96,4 +96,8 @@
 completeness_recipients=Completeness notification recipients
 no_completeness_recipients=No completeness recipients
 use_db_locale_no_translation=Use database locale / no translation
-system_overview=System overview
\ No newline at end of file
+system_overview=System overview
+cache_strategy=Cache strategy
+no_cache=No cache
+cache_until_6am_tomorrow=Cache until 6 AM tomorrow
+cache_for_two_weeks=Cache for two weeks
\ No newline at end of file

=== modified file 'dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/webapp/dhis-web-maintenance-settings/systemGeneralSettings.vm'
--- dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/webapp/dhis-web-maintenance-settings/systemGeneralSettings.vm	2012-03-05 16:37:17 +0000
+++ dhis-2/dhis-web/dhis-web-maintenance/dhis-web-maintenance-settings/src/main/webapp/dhis-web-maintenance-settings/systemGeneralSettings.vm	2012-03-12 12:33:20 +0000
@@ -2,6 +2,7 @@
 	jQuery(document).ready(function() {
 		jQuery("input[type=button]").click(function() {
 			jQuery.postUTF8( 'setSystemGeneralSettings.action', {
+				cacheStrategy: getFieldValue( 'cacheStrategy' ),
 				infrastructuralDataElements: getFieldValue( 'infrastructuralDataElements' ),
 				infrastructuralPeriodType: getFieldValue( 'infrastructuralPeriodType' ),
 				feedbackRecipients: getFieldValue( 'feedbackRecipients' ),
@@ -20,6 +21,17 @@
 
 <h3>$i18n.getString( "general_settings" )</h3>
 
+<!-- cache_strategy -->
+<h4>$i18n.getString( "cache_strategy" )</h4>
+
+<p>
+<select id="cacheStrategy" name="cacheStrategy" style="width:30em">
+	<option value="NO_CACHE" #if( $keyCacheStrategy == "NO_CACHE" )selected="selected"#end>$i18n.getString( "no_cache" )</option>
+	<option value="CACHE_6AM_TOMORROW" #if( $keyCacheStrategy == "CACHE_6AM_TOMORROW" )selected="selected"#end>$i18n.getString( "cache_until_6am_tomorrow" )</option>
+	<option value="CACHE_TWO_WEEKS" #if( $keyCacheStrategy == "CACHE_TWO_WEEKS" )selected="selected"#end>$i18n.getString( "cache_for_two_weeks" )</option>
+</select>
+</p>
+
 <!-- infrastructural_data_elements -->
 <h4>$i18n.getString( "infrastructural_data_elements" )</h4>