=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/setting/SettingKey.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/setting/SettingKey.java 2016-01-07 19:01:46 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/setting/SettingKey.java 2016-02-09 15:26:32 +0000 @@ -28,22 +28,32 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import org.apache.commons.lang3.LocaleUtils; +import org.hisp.dhis.common.ListMap; +import org.hisp.dhis.configuration.Configuration; +import org.hisp.dhis.sms.config.SmsConfiguration; + import java.io.Serializable; import java.util.Date; import java.util.Locale; import java.util.Map; import java.util.Optional; -import org.apache.commons.lang3.LocaleUtils; -import org.hisp.dhis.common.ListMap; -import org.hisp.dhis.configuration.Configuration; -import org.hisp.dhis.sms.config.SmsConfiguration; - /** * @author Lars Helge Overland */ public enum SettingKey { + MESSAGE_EMAIL_NOTIFICATION( "keyMessageEmailNotification", Boolean.FALSE, Boolean.class ), + MESSAGE_SMS_NOTIFICATION( "keyMessageSmsNotification", Boolean.FALSE, Boolean.class ), + UI_LOCALE( "keyUiLocale", Locale.class ), + DB_LOCALE( "keyDbLocale", Locale.class ), + ANALYSIS_DISPLAY_PROPERTY( "keyAnalysisDisplayProperty", "name", String.class ), + CURRENT_DOMAIN_TYPE( "keyCurrentDomainType" ), + AUTO_SAVE_CASE_ENTRY_FORM( "keyAutoSaveCaseEntryForm", Boolean.FALSE, Boolean.class ), + AUTO_SAVE_TRACKED_ENTITY_REGISTRATION_ENTRY_FORM( "keyAutoSavetTrackedEntityForm", Boolean.FALSE, Boolean.class ), + AUTO_SAVE_DATA_ENTRY_FORM( "keyAutoSaveDataEntryForm", Boolean.FALSE, Boolean.class ), + TRACKER_DASHBOARD_LAYOUT( "keyTrackerDashboardLayout" ), APPLICATION_TITLE( "applicationTitle", "DHIS 2", String.class ), APPLICATION_INTRO( "keyApplicationIntro" ), APPLICATION_NOTIFICATION( "keyApplicationNotification" ), @@ -111,7 +121,7 @@ DATE_FORMAT( "keyDateFormat", "yyyy-MM-dd", String.class ), APP_STORE_URL( "appStoreUrl", "https://www.dhis2.org/appstore", String.class ), APP_STORE_INDEX_URL( "appStoreIndexUrl", "https://s3-eu-west-1.amazonaws.com/dhis2-appstore/appstore.json", String.class ), - STYLE( "currentStyle", "light_blue/light_blue.css", String.class ), + STYLE( "keyStyle", "light_blue/light_blue.css", String.class ), REMOTE_INSTANCE_URL( "keyRemoteInstanceUrl", "", String.class ), REMOTE_INSTANCE_USERNAME( "keyRemoteInstanceUsername", "", String.class ), REMOTE_INSTANCE_PASSWORD( "keyRemoteInstancePassword", "", String.class, true ); === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserSettingKey.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserSettingKey.java 2016-01-12 13:06:50 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserSettingKey.java 2016-02-09 15:26:32 +0000 @@ -28,33 +28,31 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import org.apache.commons.lang3.LocaleUtils; + import java.io.Serializable; import java.util.Locale; import java.util.Optional; -import org.apache.commons.lang3.LocaleUtils; - /** * @author Lars Helge Overland */ public enum UserSettingKey { STYLE( "keyStyle" ), - MESSAGE_EMAIL_NOTIFICATION( "keyMessageEmailNotification", Boolean.FALSE, Boolean.class ), - MESSAGE_SMS_NOTIFICATION( "keyMessageSmsNotification", Boolean.FALSE, Boolean.class ), + MESSAGE_EMAIL_NOTIFICATION( "keyMessageEmailNotification", Boolean.class ), + MESSAGE_SMS_NOTIFICATION( "keyMessageSmsNotification", Boolean.class ), UI_LOCALE( "keyUiLocale", Locale.class ), DB_LOCALE( "keyDbLocale", Locale.class ), - ANALYSIS_DISPLAY_PROPERTY( "keyAnalysisDisplayProperty", "name", String.class ), + ANALYSIS_DISPLAY_PROPERTY( "keyAnalysisDisplayProperty", String.class ), CURRENT_DOMAIN_TYPE( "keyCurrentDomainType" ), - AUTO_SAVE_CASE_ENTRY_FORM( "keyAutoSaveCaseEntryForm", Boolean.FALSE, Boolean.class ), - AUTO_SAVE_TRACKED_ENTITY_REGISTRATION_ENTRY_FORM( "keyAutoSavetTrackedEntityForm", Boolean.FALSE, Boolean.class ), - AUTO_SAVE_DATA_ENTRY_FORM( "keyAutoSaveDataEntryForm", Boolean.FALSE, Boolean.class ), + AUTO_SAVE_CASE_ENTRY_FORM( "keyAutoSaveCaseEntryForm", Boolean.class ), + AUTO_SAVE_TRACKED_ENTITY_REGISTRATION_ENTRY_FORM( "keyAutoSavetTrackedEntityForm", Boolean.class ), + AUTO_SAVE_DATA_ENTRY_FORM( "keyAutoSaveDataEntryForm", Boolean.class ), TRACKER_DASHBOARD_LAYOUT( "keyTrackerDashboardLayout" ); private final String name; - private final Serializable defaultValue; - private final Class clazz; // ------------------------------------------------------------------------- @@ -64,21 +62,12 @@ private UserSettingKey( String name ) { this.name = name; - this.defaultValue = null; this.clazz = String.class; } private UserSettingKey( String name, Class clazz ) { this.name = name; - this.defaultValue = null; - this.clazz = clazz; - } - - private UserSettingKey( String name, Serializable defaultValue, Class clazz ) - { - this.name = name; - this.defaultValue = defaultValue; this.clazz = clazz; } @@ -129,11 +118,6 @@ return value; } - - public boolean hasDefaultValue() - { - return defaultValue != null; - } // ------------------------------------------------------------------------- // Getters @@ -144,11 +128,6 @@ return name; } - public Serializable getDefaultValue() - { - return defaultValue; - } - public Class getClazz() { return clazz; === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/user/DefaultUserSettingService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/user/DefaultUserSettingService.java 2016-01-05 19:38:32 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/user/DefaultUserSettingService.java 2016-02-09 15:26:32 +0000 @@ -28,18 +28,23 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.google.common.collect.Sets; +import org.hisp.dhis.common.DimensionalObject; +import org.hisp.dhis.setting.SettingKey; +import org.hisp.dhis.setting.SystemSettingManager; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; + import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; - -import org.hisp.dhis.common.DimensionalObject; -import org.springframework.transaction.annotation.Transactional; - -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; +import java.util.stream.Collectors; /** * @author Torgeir Lorange Ostby @@ -56,16 +61,27 @@ .initialCapacity( 200 ) .maximumSize( 10000 ) .build(); - + + private static final Map NAME_SETTING_KEY_MAP = Sets.newHashSet( + SettingKey.values() ).stream().collect( Collectors.toMap( SettingKey::getName, s -> s ) ); + private String getCacheKey( String settingName, String username ) { return settingName + DimensionalObject.ITEM_SEP + username; } - + // ------------------------------------------------------------------------- // Dependencies // ------------------------------------------------------------------------- + @Autowired + private SystemSettingManager systemSettingManager; + + public void setSystemSettingManager( SystemSettingManager systemSettingManager ) + { + this.systemSettingManager = systemSettingManager; + } + private CurrentUserService currentUserService; public void setCurrentUserService( CurrentUserService currentUserService ) @@ -95,9 +111,9 @@ public void saveUserSetting( UserSettingKey key, Serializable value, String username ) { UserCredentials credentials = userService.getUserCredentialsByUsername( username ); - + if ( credentials != null ) - { + { saveUserSetting( key, value, credentials.getUserInfo() ); } } @@ -106,10 +122,10 @@ public void saveUserSetting( UserSettingKey key, Serializable value ) { User currentUser = currentUserService.getCurrentUser(); - + saveUserSetting( key, value, currentUser ); } - + @Override public void saveUserSetting( UserSettingKey key, Serializable value, User user ) { @@ -119,7 +135,7 @@ } SETTING_CACHE.invalidate( getCacheKey( key.getName(), user.getUsername() ) ); - + UserSetting userSetting = userSettingStore.getUserSetting( user, key.getName() ); if ( userSetting == null ) @@ -140,10 +156,10 @@ public void deleteUserSetting( UserSetting userSetting ) { SETTING_CACHE.invalidate( getCacheKey( userSetting.getName(), userSetting.getUser().getUsername() ) ); - + userSettingStore.deleteUserSetting( userSetting ); } - + @Override public void deleteUserSetting( UserSettingKey key ) { @@ -152,19 +168,19 @@ if ( currentUser != null ) { UserSetting setting = userSettingStore.getUserSetting( currentUser, key.getName() ); - + if ( setting != null ) { deleteUserSetting( setting ); } } } - + @Override public void deleteUserSetting( UserSettingKey key, User user ) { UserSetting setting = userSettingStore.getUserSetting( user, key.getName() ); - + if ( setting != null ) { deleteUserSetting( setting ); @@ -189,14 +205,24 @@ { return Optional.empty(); } - - String username = user.isPresent() ? user.get().getUsername() : currentUserService.getCurrentUsername(); try { + String username = user.isPresent() ? user.get().getUsername() : currentUserService.getCurrentUsername(); String cacheKey = getCacheKey( key.getName(), username ); - - return SETTING_CACHE.get( cacheKey, () -> getUserSettingOptional( key, username ) ); + Optional result = SETTING_CACHE + .get( cacheKey, () -> getUserSettingOptional( key, username ) ); + + if ( !result.isPresent() && NAME_SETTING_KEY_MAP.containsKey( key.getName() ) ) + { + return Optional + .ofNullable( systemSettingManager.getSystemSetting( NAME_SETTING_KEY_MAP.get( key.getName() ) ) ); + } + else + { + return result; + } + } catch ( ExecutionException ignored ) { @@ -210,14 +236,16 @@ if ( userCredentials == null ) { - return Optional.ofNullable( key.getDefaultValue() ); + return Optional.empty(); } - + UserSetting setting = userSettingStore.getUserSetting( userCredentials.getUserInfo(), key.getName() ); - - return setting != null && setting.hasValue() ? Optional.of( setting.getValue() ) : Optional.ofNullable( key.getDefaultValue() ); + + return setting != null && setting.hasValue() ? + Optional.of( setting.getValue() ) : + Optional.empty(); } - + @Override public List getAllUserSettings() { @@ -225,7 +253,7 @@ return getUserSettings( currentUser ); } - + @Override public List getUserSettings( User user ) { @@ -234,7 +262,15 @@ return new ArrayList<>(); } - return userSettingStore.getAllUserSettings( user ); + List list = userSettingStore.getAllUserSettings( user ); + + return list.stream().map( userSetting -> { + if ( userSetting.getValue() == null ) + return new UserSetting( userSetting.getUser(), userSetting.getName(), + systemSettingManager.getSystemSetting( NAME_SETTING_KEY_MAP.get( userSetting.getName() ) ) ); + else + return userSetting; + } ).collect( Collectors.toList() ); } @Override === modified file 'dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/user/UserSettingServiceTest.java' --- dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/user/UserSettingServiceTest.java 2016-01-04 02:27:49 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/test/java/org/hisp/dhis/user/UserSettingServiceTest.java 2016-02-09 15:26:32 +0000 @@ -29,6 +29,7 @@ */ import org.hisp.dhis.DhisSpringTest; +import org.hisp.dhis.setting.SettingKey; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -64,8 +65,8 @@ @Test public void testSaveGetDeleteUserSetting() { - assertEquals( UserSettingKey.ANALYSIS_DISPLAY_PROPERTY.getDefaultValue(), userSettingService.getUserSetting( UserSettingKey.ANALYSIS_DISPLAY_PROPERTY, userA ) ); - assertEquals( UserSettingKey.STYLE.getDefaultValue(), userSettingService.getUserSetting( UserSettingKey.STYLE, userA ) ); + assertEquals( SettingKey.ANALYSIS_DISPLAY_PROPERTY.getDefaultValue(), userSettingService.getUserSetting( UserSettingKey.ANALYSIS_DISPLAY_PROPERTY, userA ) ); + assertEquals( SettingKey.STYLE.getDefaultValue(), userSettingService.getUserSetting( UserSettingKey.STYLE, userA ) ); userSettingService.saveUserSetting( UserSettingKey.ANALYSIS_DISPLAY_PROPERTY, "shortName", "usernameA" ); userSettingService.saveUserSetting( UserSettingKey.STYLE, "blue", "usernameA" ); @@ -75,13 +76,13 @@ userSettingService.deleteUserSetting( UserSettingKey.ANALYSIS_DISPLAY_PROPERTY, userA ); - assertEquals( UserSettingKey.ANALYSIS_DISPLAY_PROPERTY.getDefaultValue(), userSettingService.getUserSetting( UserSettingKey.ANALYSIS_DISPLAY_PROPERTY, userA ) ); + assertEquals( SettingKey.ANALYSIS_DISPLAY_PROPERTY.getDefaultValue(), userSettingService.getUserSetting( UserSettingKey.ANALYSIS_DISPLAY_PROPERTY, userA ) ); assertEquals( "blue", userSettingService.getUserSetting( UserSettingKey.STYLE, userA ) ); userSettingService.deleteUserSetting( UserSettingKey.STYLE, userA ); - assertEquals( UserSettingKey.ANALYSIS_DISPLAY_PROPERTY.getDefaultValue(), userSettingService.getUserSetting( UserSettingKey.ANALYSIS_DISPLAY_PROPERTY, userA ) ); - assertEquals( UserSettingKey.STYLE.getDefaultValue(), userSettingService.getUserSetting( UserSettingKey.STYLE, userA ) ); + assertEquals( SettingKey.ANALYSIS_DISPLAY_PROPERTY.getDefaultValue(), userSettingService.getUserSetting( UserSettingKey.ANALYSIS_DISPLAY_PROPERTY, userA ) ); + assertEquals( SettingKey.STYLE.getDefaultValue(), userSettingService.getUserSetting( UserSettingKey.STYLE, userA ) ); } @Test