From b70dfdca6c5c4dfd96869526a4efd1fd7f7eaab4 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Mon, 28 Apr 2014 10:48:58 +0200 Subject: [PATCH] SONAR-4764 Fix issue on MySQL where profiles are empty because hibernate do not see new rules --- .../startup/RegisterQualityProfiles.java | 45 +++++++++++-------- .../startup/RegisterQualityProfilesTest.java | 8 +++- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/sonar-server/src/main/java/org/sonar/server/startup/RegisterQualityProfiles.java b/sonar-server/src/main/java/org/sonar/server/startup/RegisterQualityProfiles.java index 1b76f943c65..fb749814fa9 100644 --- a/sonar-server/src/main/java/org/sonar/server/startup/RegisterQualityProfiles.java +++ b/sonar-server/src/main/java/org/sonar/server/startup/RegisterQualityProfiles.java @@ -36,6 +36,7 @@ import org.sonar.api.utils.ValidationMessages; import org.sonar.core.persistence.MyBatis; import org.sonar.core.template.LoadedTemplateDao; import org.sonar.core.template.LoadedTemplateDto; +import org.sonar.jpa.session.DatabaseSessionFactory; import org.sonar.server.platform.PersistentSettings; import org.sonar.server.qualityprofile.*; import org.sonar.server.rule.RegisterRules; @@ -57,29 +58,33 @@ public class RegisterQualityProfiles { private final ESActiveRule esActiveRule; private final PersistentSettings settings; private final List definitions; + private final DatabaseSessionFactory sessionFactory; private final MyBatis myBatis; - public RegisterQualityProfiles(MyBatis myBatis, - PersistentSettings settings, - ESActiveRule esActiveRule, - LoadedTemplateDao loadedTemplateDao, - QProfileBackup qProfileBackup, - QProfileOperations qProfileOperations, - QProfileLookup qProfileLookup, - RegisterRules registerRulesBefore) { - this(myBatis, settings, esActiveRule, loadedTemplateDao, qProfileBackup, qProfileOperations, qProfileLookup, registerRulesBefore, + public RegisterQualityProfiles(DatabaseSessionFactory sessionFactory, + MyBatis myBatis, + PersistentSettings settings, + ESActiveRule esActiveRule, + LoadedTemplateDao loadedTemplateDao, + QProfileBackup qProfileBackup, + QProfileOperations qProfileOperations, + QProfileLookup qProfileLookup, + RegisterRules registerRulesBefore) { + this(sessionFactory, myBatis, settings, esActiveRule, loadedTemplateDao, qProfileBackup, qProfileOperations, qProfileLookup, registerRulesBefore, Collections.emptyList()); } - public RegisterQualityProfiles(MyBatis myBatis, - PersistentSettings settings, - ESActiveRule esActiveRule, - LoadedTemplateDao loadedTemplateDao, - QProfileBackup qProfileBackup, - QProfileOperations qProfileOperations, - QProfileLookup qProfileLookup, - RegisterRules registerRulesBefore, - List definitions) { + public RegisterQualityProfiles(DatabaseSessionFactory sessionFactory, + MyBatis myBatis, + PersistentSettings settings, + ESActiveRule esActiveRule, + LoadedTemplateDao loadedTemplateDao, + QProfileBackup qProfileBackup, + QProfileOperations qProfileOperations, + QProfileLookup qProfileLookup, + RegisterRules registerRulesBefore, + List definitions) { + this.sessionFactory = sessionFactory; this.myBatis = myBatis; this.settings = settings; this.esActiveRule = esActiveRule; @@ -93,6 +98,10 @@ public class RegisterQualityProfiles { public void start() { TimeProfiler profiler = new TimeProfiler(LOGGER).start("Register Quality Profiles"); + // Hibernate session can contain an invalid cache of rules. + // As long ProfileDefinition API will be used, then we'll have to use this commit as Hibernate is used by plugin to load rules when creating their profiles. + sessionFactory.getSession().commit(); + SqlSession session = myBatis.openSession(); try { ListMultimap profilesByLanguage = profilesByLanguage(); diff --git a/sonar-server/src/test/java/org/sonar/server/startup/RegisterQualityProfilesTest.java b/sonar-server/src/test/java/org/sonar/server/startup/RegisterQualityProfilesTest.java index 41665aff4a0..17ce3f6faf2 100644 --- a/sonar-server/src/test/java/org/sonar/server/startup/RegisterQualityProfilesTest.java +++ b/sonar-server/src/test/java/org/sonar/server/startup/RegisterQualityProfilesTest.java @@ -27,6 +27,7 @@ import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import org.sonar.api.database.DatabaseSession; import org.sonar.api.profiles.ProfileDefinition; import org.sonar.api.profiles.RulesProfile; import org.sonar.api.utils.SonarException; @@ -35,6 +36,7 @@ import org.sonar.core.persistence.MyBatis; import org.sonar.core.qualityprofile.db.QualityProfileDao; import org.sonar.core.template.LoadedTemplateDao; import org.sonar.core.template.LoadedTemplateDto; +import org.sonar.jpa.session.DatabaseSessionFactory; import org.sonar.server.platform.PersistentSettings; import org.sonar.server.qualityprofile.*; import org.sonar.server.user.UserSession; @@ -75,6 +77,9 @@ public class RegisterQualityProfilesTest { @Mock SqlSession session; + @Mock + DatabaseSessionFactory sessionFactory; + @Mock PersistentSettings settings; @@ -85,9 +90,10 @@ public class RegisterQualityProfilesTest { @Before public void setUp() throws Exception { when(myBatis.openSession()).thenReturn(session); + when(sessionFactory.getSession()).thenReturn(mock(DatabaseSession.class)); definitions = newArrayList(); - registerQualityProfiles = new RegisterQualityProfiles(myBatis, settings, esActiveRule, loadedTemplateDao, qProfileBackup, qProfileOperations, qProfileLookup, null, definitions); + registerQualityProfiles = new RegisterQualityProfiles(sessionFactory, myBatis, settings, esActiveRule, loadedTemplateDao, qProfileBackup, qProfileOperations, qProfileLookup, null, definitions); } @Test -- 2.39.5