=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserSettingService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserSettingService.java 2016-01-04 02:27:49 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/user/UserSettingService.java 2016-03-15 10:04:09 +0000 @@ -30,6 +30,8 @@ import java.io.Serializable; import java.util.List; +import java.util.Map; +import java.util.Set; /** * The main interface for working with user settings. Implementation need to get @@ -128,6 +130,14 @@ * @return all user settings belonging to the current user. */ List getAllUserSettings(); + + /** + * Returns all specified user settings. If any user settings have not been set, + * system settings will be used as a fallback. + * @param names the settings to retrieve + * @return a map of setting names and their values + */ + Map getUserSettingsWithFallbackByUserAsMap( User user, Set names ); /** * Invalidates in-memory caches. === 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-03-14 18:04:21 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/user/DefaultUserSettingService.java 2016-03-15 10:09:43 +0000 @@ -42,12 +42,10 @@ import org.springframework.transaction.support.TransactionTemplate; import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; import java.util.stream.Collectors; /** @@ -232,6 +230,22 @@ } @Override + public Map getUserSettingsWithFallbackByUserAsMap( User user, Set names ) + { + Map result = Sets.newHashSet( getUserSettings(user) ).stream() + .collect( Collectors.toMap( UserSetting::getName, UserSetting::getValue ) ); + + names.forEach( name -> { + if ( !result.containsKey( name ) ) + { + result.put( name, systemSettingManager.getSystemSetting( NAME_SETTING_KEY_MAP.get( name ) ) ); + } + } ); + + return result; + } + + @Override @Transactional public List getUserSettings( User user ) { @@ -263,15 +277,15 @@ try { String username = user.isPresent() ? user.get().getUsername() : currentUserService.getCurrentUsername(); - + String cacheKey = getCacheKey( key.getName(), username ); - + Optional result = SETTING_CACHE. get( cacheKey, () -> getUserSettingOptional( key, username ) ); if ( !result.isPresent() && NAME_SETTING_KEY_MAP.containsKey( key.getName() ) ) { - return Optional.ofNullable( + return Optional.ofNullable( systemSettingManager.getSystemSetting( NAME_SETTING_KEY_MAP.get( key.getName() ) ) ); } else === modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/UserSettingController.java' --- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/UserSettingController.java 2016-03-14 14:46:23 +0000 +++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/UserSettingController.java 2016-03-15 10:09:43 +0000 @@ -29,18 +29,9 @@ */ import com.google.common.collect.Sets; +import org.hisp.dhis.dxf2.webmessage.WebMessageException; import org.hisp.dhis.render.RenderService; - -import org.hisp.dhis.dxf2.webmessage.WebMessageException; -import org.hisp.dhis.setting.SettingKey; -import org.hisp.dhis.setting.SystemSettingManager; -import org.hisp.dhis.user.CurrentUserService; -import org.hisp.dhis.user.User; -import org.hisp.dhis.user.UserCredentials; -import org.hisp.dhis.user.UserService; -import org.hisp.dhis.user.UserSetting; -import org.hisp.dhis.user.UserSettingKey; -import org.hisp.dhis.user.UserSettingService; +import org.hisp.dhis.user.*; import org.hisp.dhis.util.ObjectUtils; import org.hisp.dhis.webapi.service.WebMessageService; import org.hisp.dhis.webapi.utils.ContextUtils; @@ -48,18 +39,15 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; - import java.io.IOException; import java.io.Serializable; -import java.util.*; +import java.util.Map; +import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; /** @@ -69,9 +57,6 @@ @RequestMapping( "/userSettings" ) public class UserSettingController { - private static final Map NAME_SETTING_KEY_MAP = Sets.newHashSet( - SettingKey.values() ).stream().collect( Collectors.toMap( SettingKey::getName, s -> s ) ); - @Autowired private UserSettingService userSettingService; @@ -87,8 +72,8 @@ @Autowired private RenderService renderService; - @Autowired - private SystemSettingManager systemSettingManager; + private static final Set USER_SETTING_NAMES = Sets.newHashSet( + UserSettingKey.values() ).stream().map( UserSettingKey::getName ).collect( Collectors.toSet() ); // ------------------------------------------------------------------------- // Resources @@ -205,25 +190,10 @@ us = currentUserService.getCurrentUser(); } - Map settings = new HashMap<>(); - - // Find fall-back for missing users settings - - userSettingService.getUserSettings( us ).stream().filter( UserSetting::hasValue ) - .forEach( userSetting -> settings.put( userSetting.getName(), userSetting.getValue() ) ); - - // Add missing user settings - - for ( UserSettingKey userSettingKey : UserSettingKey.values() ) - { - if ( !settings.containsKey( userSettingKey.getName() ) ) - { - settings.put( userSettingKey.getName(), - systemSettingManager.getSystemSetting( NAME_SETTING_KEY_MAP.get( userSettingKey.getName() ) ) ); - } - } - - renderService.toJson( response.getOutputStream(), settings ); + Map result = userSettingService + .getUserSettingsWithFallbackByUserAsMap( us, USER_SETTING_NAMES ); + + renderService.toJson( response.getOutputStream(), result ); } @RequestMapping( value = "/{key}", method = RequestMethod.DELETE )