From 541311a3efbbaf357c4989379b42de573be60b2a Mon Sep 17 00:00:00 2001 From: Julien HENRY Date: Mon, 2 Sep 2013 18:02:35 +0200 Subject: [PATCH] SONAR-4602 Invalidate dryRun cache when changing settings --- .../persistence/DryRunDatabaseFactory.java | 11 ++- .../java/org/sonar/core/user/UserDao.java | 13 +++ .../java/org/sonar/core/user/UserMapper.java | 13 +++ .../org/sonar/core/user/UserMapper.xml | 6 ++ .../java/org/sonar/core/user/UserDaoTest.java | 8 +- .../config/GlobalPropertyChangeHandler.java | 11 ++- .../api/config/SettingsChangeHandler.java | 84 +++++++++++++++++++ .../configuration/PropertiesBackup.java | 5 +- .../server/platform/DryRunCacheListener.java | 46 ++++++++++ .../org/sonar/server/platform/Platform.java | 61 ++++++++++++-- .../platform/SettingsChangeNotifier.java | 34 ++++++-- .../server/startup/CleanDryRunCache.java | 59 +++++++++++++ .../java/org/sonar/server/ui/JRubyFacade.java | 34 ++++++-- .../webapp/WEB-INF/app/models/property.rb | 2 +- .../platform/SettingsChangeNotifierTest.java | 20 +++-- 15 files changed, 366 insertions(+), 41 deletions(-) create mode 100644 sonar-plugin-api/src/main/java/org/sonar/api/config/SettingsChangeHandler.java create mode 100644 sonar-server/src/main/java/org/sonar/server/platform/DryRunCacheListener.java create mode 100644 sonar-server/src/main/java/org/sonar/server/startup/CleanDryRunCache.java diff --git a/sonar-core/src/main/java/org/sonar/core/persistence/DryRunDatabaseFactory.java b/sonar-core/src/main/java/org/sonar/core/persistence/DryRunDatabaseFactory.java index b7ca73a233a..8134c3d278e 100644 --- a/sonar-core/src/main/java/org/sonar/core/persistence/DryRunDatabaseFactory.java +++ b/sonar-core/src/main/java/org/sonar/core/persistence/DryRunDatabaseFactory.java @@ -44,7 +44,8 @@ import java.util.SortedSet; import java.util.TreeSet; public class DryRunDatabaseFactory implements ServerComponent { - private static final String SONAR_DRY_RUN_CACHE_LAST_UPDATE = "sonar.dryRun.cache.lastUpdate"; + public static final String SONAR_DRY_RUN_CACHE_KEY_PREFIX = "sonar.dryRun.cache."; + public static final String SONAR_DRY_RUN_CACHE_LAST_UPDATE_KEY = SONAR_DRY_RUN_CACHE_KEY_PREFIX + "lastUpdate"; private static final Logger LOG = LoggerFactory.getLogger(DryRunDatabaseFactory.class); private static final String DIALECT = "h2"; private static final String DRIVER = "org.h2.Driver"; @@ -59,6 +60,10 @@ public class DryRunDatabaseFactory implements ServerComponent { private final Settings settings; private final ResourceDao resourceDao; + public static String getCacheLastUpdateKey(Long rootProjectId) { + return SONAR_DRY_RUN_CACHE_KEY_PREFIX + rootProjectId + ".lastUpdate"; + } + public DryRunDatabaseFactory(Database database, ServerFileSystem serverFileSystem, Settings settings, ResourceDao resourceDao) { this.database = database; this.serverFileSystem = serverFileSystem; @@ -100,14 +105,14 @@ public class DryRunDatabaseFactory implements ServerComponent { } private boolean isValid(@Nullable Long projectId, long lastTimestampInCache) { - long globalTimestamp = settings.getLong(SONAR_DRY_RUN_CACHE_LAST_UPDATE); + long globalTimestamp = settings.getLong(SONAR_DRY_RUN_CACHE_LAST_UPDATE_KEY); if (globalTimestamp > lastTimestampInCache) { return false; } if (projectId != null) { // For modules look for root project last modification timestamp Long rootId = resourceDao.getRootProjectByComponentId(projectId).getId(); - long projectTimestamp = settings.getLong("sonar.dryRun.cache." + rootId + ".lastUpdate"); + long projectTimestamp = settings.getLong(getCacheLastUpdateKey(rootId)); if (projectTimestamp > lastTimestampInCache) { return false; } diff --git a/sonar-core/src/main/java/org/sonar/core/user/UserDao.java b/sonar-core/src/main/java/org/sonar/core/user/UserDao.java index a23f34426ba..a3c21ea51d9 100644 --- a/sonar-core/src/main/java/org/sonar/core/user/UserDao.java +++ b/sonar-core/src/main/java/org/sonar/core/user/UserDao.java @@ -41,6 +41,19 @@ public class UserDao implements BatchComponent, ServerComponent { this.mybatis = mybatis; } + public UserDto getUser(long userId) { + SqlSession session = mybatis.openSession(); + try { + return getUser(userId, session); + } finally { + MyBatis.closeQuietly(session); + } + } + + public UserDto getUser(long userId, SqlSession session) { + return session.getMapper(UserMapper.class).selectUser(userId); + } + /** * Search for user by login. Disabled users are ignored. * diff --git a/sonar-core/src/main/java/org/sonar/core/user/UserMapper.java b/sonar-core/src/main/java/org/sonar/core/user/UserMapper.java index 8678b52d363..b8d0a9b8459 100644 --- a/sonar-core/src/main/java/org/sonar/core/user/UserMapper.java +++ b/sonar-core/src/main/java/org/sonar/core/user/UserMapper.java @@ -23,10 +23,14 @@ import org.apache.ibatis.annotations.Param; import org.sonar.api.user.UserQuery; import javax.annotation.CheckForNull; + import java.util.List; public interface UserMapper { + @CheckForNull + UserDto selectUser(long userId); + /** * Select user by login. Note that disabled users are ignored. */ @@ -41,13 +45,22 @@ public interface UserMapper { GroupDto selectGroupByName(String name); void removeUserFromGroups(long userId); + void deleteUserActiveDashboards(long userId); + void deleteUserDashboards(long userId); + void deleteUserIssueFilters(String login); + void deleteUserIssueFilterFavourites(String login); + void deleteUserMeasureFilters(long userId); + void deleteUserMeasureFilterFavourites(long userId); + void deleteUserProperties(long userId); + void deleteUserRoles(long userId); + void deactivateUser(long userId); } diff --git a/sonar-core/src/main/resources/org/sonar/core/user/UserMapper.xml b/sonar-core/src/main/resources/org/sonar/core/user/UserMapper.xml index 4b3a0ad0599..996b3f3710f 100644 --- a/sonar-core/src/main/resources/org/sonar/core/user/UserMapper.xml +++ b/sonar-core/src/main/resources/org/sonar/core/user/UserMapper.xml @@ -13,6 +13,12 @@ u.active as "active" + +