]> source.dussan.org Git - sonarqube.git/commitdiff
Fix quality flaws
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Wed, 3 Jun 2015 10:40:18 +0000 (12:40 +0200)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Wed, 3 Jun 2015 10:40:24 +0000 (12:40 +0200)
88 files changed:
plugins/sonar-email-notifications-plugin/src/main/java/org/sonar/plugins/emailnotifications/AlertsEmailTemplate.java
server/sonar-server/src/main/java/org/sonar/server/batch/ProjectRepositoryLoader.java
server/sonar-server/src/main/java/org/sonar/server/component/DefaultComponentFinder.java
server/sonar-server/src/main/java/org/sonar/server/component/ws/AppAction.java
server/sonar-server/src/main/java/org/sonar/server/component/ws/EventsWs.java
server/sonar-server/src/main/java/org/sonar/server/component/ws/SearchAction.java
server/sonar-server/src/main/java/org/sonar/server/computation/component/ComponentImpl.java
server/sonar-server/src/main/java/org/sonar/server/computation/source/SymbolsLineReader.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputationSteps.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistComponentsAndSnapshotsStep.java [new file with mode: 0644]
server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistComponentsStep.java [deleted file]
server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistIssuesStep.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistTestsStep.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/PopulateComponentsUuidAndKeyStep.java
server/sonar-server/src/main/java/org/sonar/server/config/ws/PropertiesWs.java
server/sonar-server/src/main/java/org/sonar/server/dashboard/template/ProjectTimeMachineDashboard.java
server/sonar-server/src/main/java/org/sonar/server/db/migrations/v50/ReplaceIssueFiltersProjectKeyByUuid.java
server/sonar-server/src/main/java/org/sonar/server/db/migrations/v51/AddNewCharacteristics.java
server/sonar-server/src/main/java/org/sonar/server/debt/DebtCharacteristicsXMLImporter.java
server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelOperations.java
server/sonar-server/src/main/java/org/sonar/server/debt/DebtModelXMLExporter.java
server/sonar-server/src/main/java/org/sonar/server/debt/DebtRulesXMLImporter.java
server/sonar-server/src/main/java/org/sonar/server/duplication/ws/DuplicationsJsonWriter.java
server/sonar-server/src/main/java/org/sonar/server/es/request/ProxySearchRequestBuilder.java
server/sonar-server/src/main/java/org/sonar/server/issue/CommentAction.java
server/sonar-server/src/main/java/org/sonar/server/issue/InternalRubyIssueService.java
server/sonar-server/src/main/java/org/sonar/server/issue/IssueBulkChangeService.java
server/sonar-server/src/main/java/org/sonar/server/issue/SetSeverityAction.java
server/sonar-server/src/main/java/org/sonar/server/issue/TransitionAction.java
server/sonar-server/src/main/java/org/sonar/server/issue/actionplan/ActionPlanService.java
server/sonar-server/src/main/java/org/sonar/server/issue/actionplan/ActionPlanWs.java
server/sonar-server/src/main/java/org/sonar/server/issue/ws/IssuesWs.java
server/sonar-server/src/main/java/org/sonar/server/issue/ws/SearchAction.java
server/sonar-server/src/main/java/org/sonar/server/measure/MeasureFilterSql.java
server/sonar-server/src/main/java/org/sonar/server/measure/ws/ManualMeasuresWs.java
server/sonar-server/src/main/java/org/sonar/server/metric/ws/CreateAction.java
server/sonar-server/src/main/java/org/sonar/server/metric/ws/MetricsWs.java
server/sonar-server/src/main/java/org/sonar/server/permission/InternalPermissionService.java
server/sonar-server/src/main/java/org/sonar/server/permission/PermissionFinder.java
server/sonar-server/src/main/java/org/sonar/server/permission/ws/PermissionsWs.java
server/sonar-server/src/main/java/org/sonar/server/platform/BackendCleanup.java
server/sonar-server/src/main/java/org/sonar/server/qualitygate/ws/ShowAction.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileBackuper.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileExporters.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfileProjectOperations.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/QProfiles.java
server/sonar-server/src/main/java/org/sonar/server/qualityprofile/ws/ProfilesWs.java
server/sonar-server/src/main/java/org/sonar/server/rule/DeprecatedRulesDefinitionLoader.java
server/sonar-server/src/main/java/org/sonar/server/rule/RegisterRules.java
server/sonar-server/src/main/java/org/sonar/server/rule/RuleOperations.java
server/sonar-server/src/main/java/org/sonar/server/rule/RuleUpdater.java
server/sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java
server/sonar-server/src/main/java/org/sonar/server/source/HtmlTextDecorator.java
server/sonar-server/src/main/java/org/sonar/server/source/db/FileSourceDao.java
server/sonar-server/src/main/java/org/sonar/server/startup/JdbcDriverDeployer.java
server/sonar-server/src/main/java/org/sonar/server/startup/LogServerId.java
server/sonar-server/src/main/java/org/sonar/server/user/GroupMembershipFinder.java
server/sonar-server/src/main/java/org/sonar/server/user/GroupMembershipService.java
server/sonar-server/src/main/java/org/sonar/server/user/index/UserIndexer.java
server/sonar-server/src/main/java/org/sonar/server/user/ws/FavoritesWs.java
server/sonar-server/src/main/java/org/sonar/server/user/ws/UpdateAction.java
server/sonar-server/src/main/java/org/sonar/server/user/ws/UserPropertiesWs.java
server/sonar-server/src/main/java/org/sonar/server/view/index/ViewIndexer.java
server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistComponentsAndSnapshotsStepTest.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistComponentsStepTest.java [deleted file]
sonar-batch-protocol/src/main/java/org/sonar/batch/protocol/output/BatchReportReader.java
sonar-batch/src/main/java/org/sonar/batch/DefaultFileLinesContext.java
sonar-batch/src/main/java/org/sonar/batch/compute/AbstractNewCoverageFileAnalyzer.java
sonar-batch/src/main/java/org/sonar/batch/compute/CountUnresolvedIssuesDecorator.java
sonar-batch/src/main/java/org/sonar/batch/compute/TimeMachineConfigurationPersister.java
sonar-batch/src/main/java/org/sonar/batch/debt/DebtDecorator.java
sonar-batch/src/main/java/org/sonar/batch/debt/DebtModelProvider.java
sonar-batch/src/main/java/org/sonar/batch/debt/IssueChangelogDebtCalculator.java
sonar-batch/src/main/java/org/sonar/batch/debt/NewDebtDecorator.java
sonar-batch/src/main/java/org/sonar/batch/debt/SqaleRatingDecorator.java
sonar-batch/src/main/java/org/sonar/batch/debt/SqaleRatingSettings.java
sonar-batch/src/main/java/org/sonar/batch/issue/ModuleIssues.java
sonar-batch/src/main/java/org/sonar/batch/rule/RulesProvider.java
sonar-core/src/main/java/org/sonar/core/notification/DefaultNotificationManager.java
sonar-core/src/main/java/org/sonar/core/permission/PermissionQuery.java
sonar-core/src/main/java/org/sonar/core/resource/ResourceKeyUpdaterDao.java
sonar-core/src/main/java/org/sonar/core/timemachine/Periods.java
sonar-core/src/main/java/org/sonar/core/user/GroupMembershipQuery.java
sonar-plugin-api/src/main/java/org/sonar/api/issue/internal/FieldDiffs.java
sonar-plugin-api/src/main/java/org/sonar/api/measures/AverageFormula.java
sonar-plugin-api/src/main/java/org/sonar/api/rules/Rule.java
sonar-plugin-api/src/main/java/org/sonar/api/server/rule/RuleParamType.java
sonar-plugin-api/src/main/java/org/sonar/api/utils/Durations.java

index a66444ad83845bf50a112b96371d5bd647de8096..2ea0faf34f2269e28f12ad1ca0ba7db5fb8d2992 100644 (file)
@@ -65,7 +65,7 @@ public class AlertsEmailTemplate extends EmailTemplate {
         .setMessage(messageBody);
   }
 
-  private String generateSubject(String projectName, String alertLevel, boolean isNewAlert) {
+  private static String generateSubject(String projectName, String alertLevel, boolean isNewAlert) {
     StringBuilder subjectBuilder = new StringBuilder();
     if (Metric.Level.OK.toString().equals(alertLevel)) {
       subjectBuilder.append("\"").append(projectName).append("\" is back to green");
index bd699806a7e2157c7dfe9acee5299c82344958f9..5906dd51515f65820cfc74311a26b01a90f081af 100644 (file)
@@ -24,6 +24,12 @@ import com.google.common.base.Function;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
+import java.util.Collections;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import javax.annotation.Nullable;
 import org.sonar.api.resources.Language;
 import org.sonar.api.resources.Languages;
 import org.sonar.api.rule.RuleKey;
@@ -54,14 +60,6 @@ import org.sonar.server.search.QueryContext;
 import org.sonar.server.search.Result;
 import org.sonar.server.user.UserSession;
 
-import javax.annotation.Nullable;
-
-import java.util.Collections;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Maps.newHashMap;
 
@@ -188,7 +186,7 @@ public class ProjectRepositoryLoader {
     }
   }
 
-  private Map<String, String> getPropertiesMap(List<PropertyDto> propertyDtos, boolean hasScanPerm) {
+  private static Map<String, String> getPropertiesMap(List<PropertyDto> propertyDtos, boolean hasScanPerm) {
     Map<String, String> properties = newHashMap();
     for (PropertyDto propertyDto : propertyDtos) {
       String key = propertyDto.getKey();
@@ -292,7 +290,7 @@ public class ProjectRepositoryLoader {
     }
   }
 
-  private void addFileData(DbSession session, ProjectRepositories ref, List<ComponentDto> moduleChildren, List<FilePathWithHashDto> files) {
+  private static void addFileData(DbSession session, ProjectRepositories ref, List<ComponentDto> moduleChildren, List<FilePathWithHashDto> files) {
     Map<String, String> moduleKeysByUuid = newHashMap();
     for (ComponentDto module : moduleChildren) {
       moduleKeysByUuid.put(module.uuid(), module.key());
@@ -320,7 +318,7 @@ public class ProjectRepositoryLoader {
     }
   }
 
-  private Map<String, String> moduleUuidsByKey(ComponentDto module, List<ComponentDto> moduleChildren) {
+  private static Map<String, String> moduleUuidsByKey(ComponentDto module, List<ComponentDto> moduleChildren) {
     Map<String, String> moduleUuidsByKey = newHashMap();
     for (ComponentDto componentDto : moduleChildren) {
       moduleUuidsByKey.put(componentDto.key(), componentDto.uuid());
@@ -328,7 +326,7 @@ public class ProjectRepositoryLoader {
     return moduleUuidsByKey;
   }
 
-  private Map<String, Long> moduleIdsByKey(ComponentDto module, List<ComponentDto> moduleChildren) {
+  private static Map<String, Long> moduleIdsByKey(ComponentDto module, List<ComponentDto> moduleChildren) {
     Map<String, Long> moduleIdsByKey = newHashMap();
     for (ComponentDto componentDto : moduleChildren) {
       moduleIdsByKey.put(componentDto.key(), componentDto.getId());
index 409cbc84208c0fca441f0b8c1f58571bb0ae2912..698c46a57f7abedc989b3b28a6513c9bcbdb6a62 100644 (file)
@@ -22,15 +22,14 @@ package org.sonar.server.component;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
 import org.sonar.api.component.Component;
 import org.sonar.api.utils.Paging;
 import org.sonar.api.utils.log.Logger;
 import org.sonar.api.utils.log.Loggers;
 
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
 import static com.google.common.collect.Lists.newArrayList;
 
 /**
@@ -98,7 +97,7 @@ public class DefaultComponentFinder {
     }
   }
 
-  private Collection<? extends Component> pagedComponents(Collection<? extends Component> components, Paging paging) {
+  private static Collection<? extends Component> pagedComponents(Collection<? extends Component> components, Paging paging) {
     Set<Component> pagedComponents = Sets.newLinkedHashSet();
     int index = 0;
     for (Component component : components) {
index 1609cfd1282dc37127df2b84c1b81f64a1c6b14b..95d920b3a04493b3ffd3695003b6ec412271ef0e 100644 (file)
 
 package org.sonar.server.component.ws;
 
+import java.util.List;
+import java.util.Map;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
 import org.apache.commons.lang.BooleanUtils;
 import org.sonar.api.i18n.I18n;
 import org.sonar.api.measures.CoreMetrics;
@@ -41,12 +45,6 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.user.UserSession;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.util.List;
-import java.util.Map;
-
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Maps.newHashMap;
 
@@ -149,7 +147,7 @@ public class AppAction implements RequestHandler {
     json.prop("fav", isFavourite);
   }
 
-  private void appendPermissions(JsonWriter json, ComponentDto component, UserSession userSession) {
+  private static void appendPermissions(JsonWriter json, ComponentDto component, UserSession userSession) {
     boolean hasBrowsePermission = userSession.hasComponentPermission(UserRole.USER, component.key());
     json.prop("canMarkAsFavourite", userSession.isLoggedIn() && hasBrowsePermission);
     json.prop("canCreateManualIssue", userSession.isLoggedIn() && hasBrowsePermission);
@@ -168,7 +166,7 @@ public class AppAction implements RequestHandler {
     json.endObject();
   }
 
-  private MeasureDto coverageMeasure(Map<String, MeasureDto> measuresByMetricKey) {
+  private static MeasureDto coverageMeasure(Map<String, MeasureDto> measuresByMetricKey) {
     MeasureDto overallCoverage = measuresByMetricKey.get(CoreMetrics.OVERALL_COVERAGE_KEY);
     MeasureDto itCoverage = measuresByMetricKey.get(CoreMetrics.IT_COVERAGE_KEY);
     MeasureDto utCoverage = measuresByMetricKey.get(CoreMetrics.COVERAGE_KEY);
index 8f566aff6d25adab9114536d5c1a5d9ffda73a82..f6e2501c5a15a77d887a1e6aca9894d5a2581bad 100644 (file)
@@ -36,7 +36,7 @@ public class EventsWs implements WebService {
     controller.done();
   }
 
-  private void defineIndexAction(NewController controller) {
+  private static void defineIndexAction(NewController controller) {
     controller.createAction("index")
       .setDescription("Documentation of this web service is available <a href=\"http://redirect.sonarsource.com/doc/old-web-service-api.html\">here</a>")
       .setSince("2.6")
index 1d1256f9af3aa006a4002ce684248aee3029fe50..3b398223e331d772b24b65cfdcdf729ea4de96ba 100644 (file)
@@ -120,7 +120,7 @@ public class SearchAction implements RequestHandler {
     json.close();
   }
 
-  private Set<Long> pagedProjectIds(Collection<Long> projectIds, SearchOptions options) {
+  private static Set<Long> pagedProjectIds(Collection<Long> projectIds, SearchOptions options) {
     Set<Long> results = Sets.newLinkedHashSet();
     int index = 0;
     for (Long projectId : projectIds) {
index c255d9a78c0af6dfc9b25cdbf193b7f639fa5ca5..3e2e8f6a48465a06f351ef6b826f08d5a972ba2d 100644 (file)
@@ -69,6 +69,7 @@ public class ComponentImpl implements Component {
     return ref;
   }
 
+  @Override
   public String getUuid() {
     if (uuid == null) {
       throw new UnsupportedOperationException(String.format("Component uuid of ref '%s' has not be fed yet", getRef()));
@@ -81,6 +82,7 @@ public class ComponentImpl implements Component {
     return this;
   }
 
+  @Override
   public String getKey() {
     if (key == null) {
       throw new UnsupportedOperationException(String.format("Component key of ref '%s' has not be fed yet", getRef()));
index db57bcb52c8c3c23ecfc1186efd6964791891059..ce8bdf2c60931dd85ece6a8238b3305e0ddbbe13 100644 (file)
@@ -20,9 +20,6 @@
 
 package org.sonar.server.computation.source;
 
-import org.sonar.batch.protocol.output.BatchReport;
-import org.sonar.server.source.db.FileSourceDb;
-
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -32,6 +29,8 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import org.sonar.batch.protocol.output.BatchReport;
+import org.sonar.server.source.db.FileSourceDb;
 
 import static com.google.common.collect.Lists.newArrayList;
 
@@ -68,7 +67,7 @@ public class SymbolsLineReader implements LineReader {
     }
   }
 
-  private void appendSymbol(StringBuilder lineSymbol, BatchReport.Range range, int line, int symbolId, String sourceLine) {
+  private static void appendSymbol(StringBuilder lineSymbol, BatchReport.Range range, int line, int symbolId, String sourceLine) {
     if (matchLine(range, line)) {
       String offsets = RangeOffsetHelper.offsetToString(range, line, sourceLine.length());
       if (!offsets.isEmpty()) {
@@ -105,7 +104,7 @@ public class SymbolsLineReader implements LineReader {
     return range.getStartLine() <= line && range.getEndLine() >= line;
   }
 
-  private Map<BatchReport.Symbols.Symbol, Integer> createIdsBySymbolMap(List<BatchReport.Symbols.Symbol> symbols) {
+  private static Map<BatchReport.Symbols.Symbol, Integer> createIdsBySymbolMap(List<BatchReport.Symbols.Symbol> symbols) {
     Map<BatchReport.Symbols.Symbol, Integer> map = new HashMap<>();
     int symbolId = 1;
     for (BatchReport.Symbols.Symbol symbol : symbols) {
index a967fd1052699fd10bac2aed139cf6b497c34031..25190675f4cb37887a1220b8119e9bf1571f1e70 100644 (file)
@@ -52,7 +52,7 @@ public class ComputationSteps {
       QualityProfileEventsStep.class,
 
       // Persist data
-      PersistComponentsStep.class,
+      PersistComponentsAndSnapshotsStep.class,
       PersistNumberOfDaysSinceLastCommitStep.class,
       PersistMeasuresStep.class,
       PersistIssuesStep.class,
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistComponentsAndSnapshotsStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistComponentsAndSnapshotsStep.java
new file mode 100644 (file)
index 0000000..844f00e
--- /dev/null
@@ -0,0 +1,346 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+package org.sonar.server.computation.step;
+
+import com.google.common.collect.Maps;
+import java.util.List;
+import java.util.Map;
+import javax.annotation.Nullable;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang.ObjectUtils;
+import org.apache.commons.lang.StringUtils;
+import org.sonar.api.resources.Qualifiers;
+import org.sonar.api.resources.Scopes;
+import org.sonar.api.utils.System2;
+import org.sonar.batch.protocol.output.BatchReport;
+import org.sonar.core.component.ComponentDto;
+import org.sonar.core.component.SnapshotDto;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.core.util.NonNullInputFunction;
+import org.sonar.server.computation.batch.BatchReportReader;
+import org.sonar.server.computation.component.Component;
+import org.sonar.server.computation.component.DbIdsRepository;
+import org.sonar.server.computation.component.TreeRootHolder;
+import org.sonar.server.db.DbClient;
+
+/**
+ * Persist components and snapshots
+ * Also feed the components cache {@link DbIdsRepository}
+ */
+public class PersistComponentsAndSnapshotsStep implements ComputationStep {
+
+  private final System2 system2;
+  private final DbClient dbClient;
+  private final TreeRootHolder treeRootHolder;
+  private final BatchReportReader reportReader;
+
+  private final DbIdsRepository dbIdsRepositor;
+
+  public PersistComponentsAndSnapshotsStep(System2 system2, DbClient dbClient, TreeRootHolder treeRootHolder, BatchReportReader reportReader, DbIdsRepository dbIdsRepositor) {
+    this.system2 = system2;
+    this.dbClient = dbClient;
+    this.treeRootHolder = treeRootHolder;
+    this.reportReader = reportReader;
+    this.dbIdsRepositor = dbIdsRepositor;
+  }
+
+  @Override
+  public void execute() {
+    DbSession session = dbClient.openSession(false);
+    try {
+      org.sonar.server.computation.component.Component root = treeRootHolder.getRoot();
+      List<ComponentDto> components = dbClient.componentDao().selectComponentsFromProjectKey(session, root.getKey());
+      Map<String, ComponentDto> componentDtosByKey = componentDtosByKey(components);
+      PersisComponentExecutor componentContext = new PersisComponentExecutor(session, componentDtosByKey, reportReader, reportReader.readMetadata().getAnalysisDate());
+
+      componentContext.recursivelyProcessComponent(root, null, null);
+      session.commit();
+    } finally {
+      session.close();
+    }
+  }
+
+  private class PersisComponentExecutor {
+
+    private final BatchReportReader reportReader;
+    private final Map<String, ComponentDto> componentDtosByKey;
+    private final DbSession dbSession;
+    private final long analysisDate;
+
+    private ComponentDto project;
+    private SnapshotDto projectSnapshot;
+
+    public PersisComponentExecutor(DbSession dbSession, Map<String, ComponentDto> componentDtosByKey, BatchReportReader reportReader, long analysisDate) {
+      this.reportReader = reportReader;
+      this.componentDtosByKey = componentDtosByKey;
+      this.dbSession = dbSession;
+      this.analysisDate = analysisDate;
+    }
+
+    private void recursivelyProcessComponent(Component component, @Nullable ComponentDto lastModule, @Nullable SnapshotDto parentSnapshot) {
+      BatchReport.Component reportComponent = reportReader.readComponent(component.getRef());
+
+      switch (component.getType()) {
+        case PROJECT:
+          PersistedComponent persistedProject = processProject(component, reportComponent);
+          this.project = persistedProject.componentDto;
+          this.projectSnapshot = persistedProject.parentSnapshot;
+          processChildren(component, project, persistedProject.parentSnapshot);
+          break;
+        case MODULE:
+          PersistedComponent persistedModule = processModule(component, reportComponent, nonNullLastModule(lastModule), nonNullParentSnapshot(parentSnapshot));
+          processChildren(component, persistedModule.componentDto, persistedModule.parentSnapshot);
+          break;
+        case DIRECTORY:
+          PersistedComponent persistedDirectory = processDirectory(component, reportComponent, nonNullLastModule(lastModule), nonNullParentSnapshot(parentSnapshot));
+          processChildren(component, nonNullLastModule(lastModule), persistedDirectory.parentSnapshot);
+          break;
+        case FILE:
+          processFile(component, reportComponent, nonNullLastModule(lastModule), nonNullParentSnapshot(parentSnapshot));
+          break;
+        default:
+          throw new IllegalStateException(String.format("Unsupported component type '%s'", component.getType()));
+      }
+    }
+
+    private void processChildren(Component component, ComponentDto lastModule, SnapshotDto parentSnapshot) {
+      for (Component child : component.getChildren()) {
+        recursivelyProcessComponent(child, lastModule, parentSnapshot);
+      }
+    }
+
+    private ComponentDto nonNullLastModule(@Nullable ComponentDto lastModule) {
+      return lastModule == null ? project : lastModule;
+    }
+
+    private SnapshotDto nonNullParentSnapshot(@Nullable SnapshotDto parentSnapshot) {
+      return parentSnapshot == null ? projectSnapshot : parentSnapshot;
+    }
+
+    public PersistedComponent processProject(Component project, BatchReport.Component reportComponent) {
+      ComponentDto componentDto = createComponentDto(reportComponent, project);
+
+      componentDto.setScope(Scopes.PROJECT);
+      componentDto.setQualifier(Qualifiers.PROJECT);
+      componentDto.setName(reportComponent.getName());
+      componentDto.setLongName(componentDto.name());
+      if (reportComponent.hasDescription()) {
+        componentDto.setDescription(reportComponent.getDescription());
+      }
+      componentDto.setProjectUuid(componentDto.uuid());
+      componentDto.setModuleUuidPath(ComponentDto.MODULE_UUID_PATH_SEP + componentDto.uuid() + ComponentDto.MODULE_UUID_PATH_SEP);
+
+      ComponentDto projectDto = persistComponent(project.getRef(), componentDto);
+      SnapshotDto snapshotDto = persistSnapshot(projectDto, reportComponent.getVersion(), null);
+
+      addToCache(project, projectDto, snapshotDto);
+
+      return new PersistedComponent(projectDto, snapshotDto);
+    }
+
+    public PersistedComponent processModule(Component module, BatchReport.Component reportComponent, ComponentDto lastModule, SnapshotDto parentSnapshot) {
+      ComponentDto componentDto = createComponentDto(reportComponent, module);
+
+      componentDto.setScope(Scopes.PROJECT);
+      componentDto.setQualifier(Qualifiers.MODULE);
+      componentDto.setName(reportComponent.getName());
+      componentDto.setLongName(componentDto.name());
+      if (reportComponent.hasPath()) {
+        componentDto.setPath(reportComponent.getPath());
+      }
+      if (reportComponent.hasDescription()) {
+        componentDto.setDescription(reportComponent.getDescription());
+      }
+      componentDto.setParentProjectId(project.getId());
+      componentDto.setProjectUuid(lastModule.projectUuid());
+      componentDto.setModuleUuid(lastModule.uuid());
+      componentDto.setModuleUuidPath(lastModule.moduleUuidPath() + componentDto.uuid() + ComponentDto.MODULE_UUID_PATH_SEP);
+
+      ComponentDto moduleDto = persistComponent(module.getRef(), componentDto);
+      SnapshotDto snapshotDto = persistSnapshot(moduleDto, reportComponent.getVersion(), parentSnapshot);
+
+      addToCache(module, moduleDto, snapshotDto);
+      return new PersistedComponent(moduleDto, snapshotDto);
+    }
+
+    public PersistedComponent processDirectory(org.sonar.server.computation.component.Component directory, BatchReport.Component reportComponent,
+      ComponentDto lastModule, SnapshotDto parentSnapshot) {
+      ComponentDto componentDto = createComponentDto(reportComponent, directory);
+
+      componentDto.setScope(Scopes.DIRECTORY);
+      componentDto.setQualifier(Qualifiers.DIRECTORY);
+      componentDto.setName(reportComponent.getPath());
+      componentDto.setLongName(reportComponent.getPath());
+      if (reportComponent.hasPath()) {
+        componentDto.setPath(reportComponent.getPath());
+      }
+
+      componentDto.setParentProjectId(lastModule.getId());
+      componentDto.setProjectUuid(lastModule.projectUuid());
+      componentDto.setModuleUuid(lastModule.uuid());
+      componentDto.setModuleUuidPath(lastModule.moduleUuidPath());
+
+      ComponentDto directoryDto = persistComponent(directory.getRef(), componentDto);
+      SnapshotDto snapshotDto = persistSnapshot(directoryDto, null, parentSnapshot);
+
+      addToCache(directory, directoryDto, snapshotDto);
+      return new PersistedComponent(directoryDto, snapshotDto);
+    }
+
+    public void processFile(org.sonar.server.computation.component.Component file, BatchReport.Component reportComponent,
+      ComponentDto lastModule, SnapshotDto parentSnapshot) {
+      ComponentDto componentDto = createComponentDto(reportComponent, file);
+
+      componentDto.setScope(Scopes.FILE);
+      componentDto.setQualifier(getFileQualifier(reportComponent));
+      componentDto.setName(FilenameUtils.getName(reportComponent.getPath()));
+      componentDto.setLongName(reportComponent.getPath());
+      if (reportComponent.hasPath()) {
+        componentDto.setPath(reportComponent.getPath());
+      }
+      if (reportComponent.hasLanguage()) {
+        componentDto.setLanguage(reportComponent.getLanguage());
+      }
+
+      componentDto.setParentProjectId(lastModule.getId());
+      componentDto.setProjectUuid(lastModule.projectUuid());
+      componentDto.setModuleUuid(lastModule.uuid());
+      componentDto.setModuleUuidPath(lastModule.moduleUuidPath());
+
+      ComponentDto fileDto = persistComponent(file.getRef(), componentDto);
+      SnapshotDto snapshotDto = persistSnapshot(fileDto, null, parentSnapshot);
+
+      addToCache(file, fileDto, snapshotDto);
+    }
+
+    private ComponentDto createComponentDto(BatchReport.Component reportComponent, org.sonar.server.computation.component.Component component) {
+      String componentKey = component.getKey();
+      String componentUuid = component.getUuid();
+
+      ComponentDto componentDto = new ComponentDto();
+      componentDto.setUuid(componentUuid);
+      componentDto.setKey(componentKey);
+      componentDto.setDeprecatedKey(componentKey);
+      componentDto.setEnabled(true);
+      return componentDto;
+    }
+
+    private ComponentDto persistComponent(int componentRef, ComponentDto componentDto) {
+      ComponentDto existingComponent = componentDtosByKey.get(componentDto.getKey());
+      if (existingComponent == null) {
+        dbClient.componentDao().insert(dbSession, componentDto);
+        return componentDto;
+      } else {
+        if (updateComponent(existingComponent, componentDto)) {
+          dbClient.componentDao().update(dbSession, existingComponent);
+        }
+        return existingComponent;
+      }
+    }
+
+    private SnapshotDto persistSnapshot(ComponentDto componentDto, @Nullable String version, @Nullable SnapshotDto parentSnapshot){
+      SnapshotDto snapshotDto = new SnapshotDto();
+//        .setRootProjectId(project.getId())
+//        .setVersion(version)
+//        .setComponentId(componentDto.getId())
+//        .setQualifier(componentDto.qualifier())
+//        .setScope(componentDto.scope())
+//        .setCreatedAt(analysisDate)
+//        .setBuildDate(system2.now());
+//
+//      if (parentSnapshot != null) {
+//        snapshotDto
+//          .setParentId(parentSnapshot.getId())
+//          .setRootId(parentSnapshot.getRootId() == null ? parentSnapshot.getId() : parentSnapshot.getRootId())
+//          .setDepth(parentSnapshot.getDepth() + 1)
+//          .setPath(parentSnapshot.getPath() + parentSnapshot.getId() + ".");
+//      } else {
+//        snapshotDto
+//          .setPath("")
+//          .setDepth(0);
+//      }
+//      dbClient.snapshotDao().insert(dbSession, snapshotDto);
+      return snapshotDto;
+    }
+
+    private void addToCache(Component component, ComponentDto componentDto, SnapshotDto snapshotDto) {
+      dbIdsRepositor.setComponentId(component, componentDto.getId());
+    }
+
+    private boolean updateComponent(ComponentDto existingComponent, ComponentDto newComponent) {
+      boolean isUpdated = false;
+      if (!StringUtils.equals(existingComponent.name(), newComponent.name())) {
+        existingComponent.setName(newComponent.name());
+        isUpdated = true;
+      }
+      if (!StringUtils.equals(existingComponent.description(), newComponent.description())) {
+        existingComponent.setDescription(newComponent.description());
+        isUpdated = true;
+      }
+      if (!StringUtils.equals(existingComponent.path(), newComponent.path())) {
+        existingComponent.setPath(newComponent.path());
+        isUpdated = true;
+      }
+      if (!StringUtils.equals(existingComponent.moduleUuid(), newComponent.moduleUuid())) {
+        existingComponent.setModuleUuid(newComponent.moduleUuid());
+        isUpdated = true;
+      }
+      if (!existingComponent.moduleUuidPath().equals(newComponent.moduleUuidPath())) {
+        existingComponent.setModuleUuidPath(newComponent.moduleUuidPath());
+        isUpdated = true;
+      }
+      if (!ObjectUtils.equals(existingComponent.parentProjectId(), newComponent.parentProjectId())) {
+        existingComponent.setParentProjectId(newComponent.parentProjectId());
+        isUpdated = true;
+      }
+      return isUpdated;
+    }
+
+    private String getFileQualifier(BatchReport.Component reportComponent) {
+      return reportComponent.getIsTest() ? Qualifiers.UNIT_TEST_FILE : Qualifiers.FILE;
+    }
+
+    private class PersistedComponent {
+      private ComponentDto componentDto;
+      private SnapshotDto parentSnapshot;
+
+      public PersistedComponent(ComponentDto componentDto, SnapshotDto parentSnapshot) {
+        this.componentDto = componentDto;
+        this.parentSnapshot = parentSnapshot;
+      }
+    }
+
+  }
+
+  private static Map<String, ComponentDto> componentDtosByKey(List<ComponentDto> components) {
+    return Maps.uniqueIndex(components, new NonNullInputFunction<ComponentDto, String>() {
+      @Override
+      public String doApply(ComponentDto input) {
+        return input.key();
+      }
+    });
+  }
+
+  @Override
+  public String getDescription() {
+    return "Feed components and snapshots";
+  }
+}
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistComponentsStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/PersistComponentsStep.java
deleted file mode 100644 (file)
index 98d0c2d..0000000
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-
-package org.sonar.server.computation.step;
-
-import com.google.common.collect.Maps;
-import java.util.List;
-import java.util.Map;
-import org.apache.commons.io.FilenameUtils;
-import org.apache.commons.lang.ObjectUtils;
-import org.apache.commons.lang.StringUtils;
-import org.sonar.api.resources.Qualifiers;
-import org.sonar.api.resources.Scopes;
-import org.sonar.batch.protocol.output.BatchReport;
-import org.sonar.core.component.ComponentDto;
-import org.sonar.core.persistence.DbSession;
-import org.sonar.core.util.NonNullInputFunction;
-import org.sonar.server.computation.batch.BatchReportReader;
-import org.sonar.server.computation.component.Component;
-import org.sonar.server.computation.component.DbIdsRepository;
-import org.sonar.server.computation.component.TreeRootHolder;
-import org.sonar.server.db.DbClient;
-
-public class PersistComponentsStep implements ComputationStep {
-
-  private final DbClient dbClient;
-  private final DbIdsRepository dbIdsRepository;
-  private final BatchReportReader reportReader;
-  private final TreeRootHolder treeRootHolder;
-
-  public PersistComponentsStep(DbClient dbClient, DbIdsRepository dbIdsRepository, BatchReportReader reportReader, TreeRootHolder treeRootHolder) {
-    this.dbClient = dbClient;
-    this.dbIdsRepository = dbIdsRepository;
-    this.reportReader = reportReader;
-    this.treeRootHolder = treeRootHolder;
-  }
-
-  @Override
-  public void execute() {
-    DbSession session = dbClient.openSession(false);
-    try {
-      Component root = treeRootHolder.getRoot();
-      List<ComponentDto> components = dbClient.componentDao().selectComponentsFromProjectKey(session, root.getKey());
-      Map<String, ComponentDto> componentDtosByKey = componentDtosByKey(components);
-      ComponentContext componentContext = new ComponentContext(session, componentDtosByKey);
-
-      ComponentDto projectDto = processProject(root, reportReader.readComponent(root.getRef()), componentContext);
-      processChildren(componentContext, root, projectDto, projectDto);
-      session.commit();
-    } finally {
-      session.close();
-    }
-  }
-
-  private void recursivelyProcessComponent(ComponentContext componentContext, Component component, ComponentDto parentModule, ComponentDto project) {
-    BatchReport.Component reportComponent = reportReader.readComponent(component.getRef());
-
-    switch (component.getType()) {
-      case MODULE:
-        ComponentDto moduleDto = processModule(component, reportComponent, componentContext, parentModule, project.getId());
-        processChildren(componentContext, component, moduleDto, project);
-        break;
-      case DIRECTORY:
-        processDirectory(component, reportComponent, componentContext, parentModule, project.getId());
-        processChildren(componentContext, component, parentModule, project);
-        break;
-      case FILE:
-        processFile(component, reportComponent, componentContext, parentModule, project.getId());
-        processChildren(componentContext, component, parentModule, project);
-        break;
-      default:
-        throw new IllegalStateException(String.format("Unsupported component type '%s'", component.getType()));
-    }
-  }
-
-  private void processChildren(ComponentContext componentContext, Component component, ComponentDto parentModule, ComponentDto project) {
-    for (Component child : component.getChildren()) {
-      recursivelyProcessComponent(componentContext, child, parentModule, project);
-    }
-  }
-
-  public ComponentDto processProject(Component project, BatchReport.Component reportComponent, ComponentContext componentContext) {
-    ComponentDto componentDto = createComponentDto(project);
-
-    componentDto.setScope(Scopes.PROJECT);
-    componentDto.setQualifier(Qualifiers.PROJECT);
-    componentDto.setName(reportComponent.getName());
-    componentDto.setLongName(componentDto.name());
-    if (reportComponent.hasDescription()) {
-      componentDto.setDescription(reportComponent.getDescription());
-    }
-    componentDto.setProjectUuid(componentDto.uuid());
-    componentDto.setModuleUuidPath(ComponentDto.MODULE_UUID_PATH_SEP + componentDto.uuid() + ComponentDto.MODULE_UUID_PATH_SEP);
-
-    return persistComponent(project, componentDto, componentContext);
-  }
-
-  public ComponentDto processModule(Component module, BatchReport.Component reportComponent, ComponentContext componentContext, ComponentDto lastModule, long projectId) {
-    ComponentDto componentDto = createComponentDto(module);
-
-    componentDto.setScope(Scopes.PROJECT);
-    componentDto.setQualifier(Qualifiers.MODULE);
-    componentDto.setName(reportComponent.getName());
-    componentDto.setLongName(componentDto.name());
-    if (reportComponent.hasPath()) {
-      componentDto.setPath(reportComponent.getPath());
-    }
-    if (reportComponent.hasDescription()) {
-      componentDto.setDescription(reportComponent.getDescription());
-    }
-    componentDto.setParentProjectId(projectId);
-    componentDto.setProjectUuid(lastModule.projectUuid());
-    componentDto.setModuleUuid(lastModule.uuid());
-    componentDto.setModuleUuidPath((lastModule.moduleUuidPath() + componentDto.uuid() + ComponentDto.MODULE_UUID_PATH_SEP));
-
-    return persistComponent(module, componentDto, componentContext);
-  }
-
-  public void processDirectory(Component directory, BatchReport.Component reportComponent, ComponentContext componentContext, ComponentDto lastModule, long projectId) {
-    ComponentDto componentDto = createComponentDto(directory);
-
-    componentDto.setScope(Scopes.DIRECTORY);
-    componentDto.setQualifier(Qualifiers.DIRECTORY);
-    componentDto.setName(reportComponent.getPath());
-    componentDto.setLongName(reportComponent.getPath());
-    if (reportComponent.hasPath()) {
-      componentDto.setPath(reportComponent.getPath());
-    }
-
-    componentDto.setParentProjectId(lastModule.getId());
-    componentDto.setProjectUuid(lastModule.projectUuid());
-    componentDto.setModuleUuid(lastModule.uuid());
-    componentDto.setModuleUuidPath(lastModule.moduleUuidPath());
-
-    persistComponent(directory, componentDto, componentContext);
-  }
-
-  public void processFile(Component file, BatchReport.Component reportComponent, ComponentContext componentContext, ComponentDto lastModule, long projectId) {
-    ComponentDto componentDto = createComponentDto(file);
-
-    componentDto.setScope(Scopes.FILE);
-    componentDto.setQualifier(getFileQualifier(reportComponent));
-    componentDto.setName(FilenameUtils.getName(reportComponent.getPath()));
-    componentDto.setLongName(reportComponent.getPath());
-    if (reportComponent.hasPath()) {
-      componentDto.setPath(reportComponent.getPath());
-    }
-    if (reportComponent.hasLanguage()) {
-      componentDto.setLanguage(reportComponent.getLanguage());
-    }
-
-    componentDto.setParentProjectId(lastModule.getId());
-    componentDto.setProjectUuid(lastModule.projectUuid());
-    componentDto.setModuleUuid(lastModule.uuid());
-    componentDto.setModuleUuidPath(lastModule.moduleUuidPath());
-
-    persistComponent(file, componentDto, componentContext);
-  }
-
-  private ComponentDto createComponentDto(Component component) {
-    String componentKey = component.getKey();
-    String componentUuid = component.getUuid();
-
-    ComponentDto componentDto = new ComponentDto();
-    componentDto.setUuid(componentUuid);
-    componentDto.setKey(componentKey);
-    componentDto.setDeprecatedKey(componentKey);
-    componentDto.setEnabled(true);
-    return componentDto;
-  }
-
-  private ComponentDto persistComponent(Component component, ComponentDto componentDto, ComponentContext componentContext) {
-    ComponentDto existingComponent = componentContext.componentDtosByKey.get(componentDto.getKey());
-    if (existingComponent == null) {
-      dbClient.componentDao().insert(componentContext.dbSession, componentDto);
-      dbIdsRepository.setComponentId(component, componentDto.getId());
-      return componentDto;
-    } else {
-      if (updateComponent(existingComponent, componentDto)) {
-        dbClient.componentDao().update(componentContext.dbSession, existingComponent);
-      }
-      dbIdsRepository.setComponentId(component, existingComponent.getId());
-      return existingComponent;
-    }
-  }
-
-  private static boolean updateComponent(ComponentDto existingComponent, ComponentDto newComponent) {
-    boolean isUpdated = false;
-    if (!StringUtils.equals(existingComponent.name(), newComponent.name())) {
-      existingComponent.setName(newComponent.name());
-      isUpdated = true;
-    }
-    if (!StringUtils.equals(existingComponent.description(), newComponent.description())) {
-      existingComponent.setDescription(newComponent.description());
-      isUpdated = true;
-    }
-    if (!StringUtils.equals(existingComponent.path(), newComponent.path())) {
-      existingComponent.setPath(newComponent.path());
-      isUpdated = true;
-    }
-    if (!StringUtils.equals(existingComponent.moduleUuid(), newComponent.moduleUuid())) {
-      existingComponent.setModuleUuid(newComponent.moduleUuid());
-      isUpdated = true;
-    }
-    if (!existingComponent.moduleUuidPath().equals(newComponent.moduleUuidPath())) {
-      existingComponent.setModuleUuidPath(newComponent.moduleUuidPath());
-      isUpdated = true;
-    }
-    if (!ObjectUtils.equals(existingComponent.parentProjectId(), newComponent.parentProjectId())) {
-      existingComponent.setParentProjectId(newComponent.parentProjectId());
-      isUpdated = true;
-    }
-    return isUpdated;
-  }
-
-  private static String getFileQualifier(BatchReport.Component reportComponent) {
-    return reportComponent.getIsTest() ? Qualifiers.UNIT_TEST_FILE : Qualifiers.FILE;
-  }
-
-  private Map<String, ComponentDto> componentDtosByKey(List<ComponentDto> components) {
-    return Maps.uniqueIndex(components, new NonNullInputFunction<ComponentDto, String>() {
-      @Override
-      public String doApply(ComponentDto input) {
-        return input.key();
-      }
-    });
-  }
-
-  private static class ComponentContext {
-    private final Map<String, ComponentDto> componentDtosByKey;
-    private final DbSession dbSession;
-
-    public ComponentContext(DbSession dbSession, Map<String, ComponentDto> componentDtosByKey) {
-      this.componentDtosByKey = componentDtosByKey;
-      this.dbSession = dbSession;
-    }
-  }
-
-  @Override
-  public String getDescription() {
-    return "Feed components cache";
-  }
-}
index fb9c8287772ad26ae1b735cdf1ff2309239a4dd8..df107b009c2cb3aa60d3bc93bf0a63ee16666526 100644 (file)
@@ -96,7 +96,7 @@ public class PersistIssuesStep implements ComputationStep {
     }
   }
 
-  private void insertChanges(IssueChangeMapper mapper, DefaultIssue issue) {
+  private static void insertChanges(IssueChangeMapper mapper, DefaultIssue issue) {
     for (IssueComment comment : issue.comments()) {
       DefaultIssueComment c = (DefaultIssueComment) comment;
       if (c.isNew()) {
index 6a2beaf529acc88f91e907c361d31f823875930b..6f7a41f34678fc37e697d9a983e63e157dbd18d1 100644 (file)
@@ -160,11 +160,11 @@ public class PersistTestsStep implements ComputationStep {
       BatchReport.Component component) {
       Set<String> unprocessedCoverageDetailNames = new HashSet<>(coveredFilesByName.rowKeySet());
       unprocessedCoverageDetailNames.removeAll(testsByName.keySet());
-      boolean hasUnprocessedCoverageDetails = !unprocessedCoverageDetailNames.isEmpty();
-      if (hasUnprocessedCoverageDetails) {
+      boolean hasUnprocessedCoverage = !unprocessedCoverageDetailNames.isEmpty();
+      if (hasUnprocessedCoverage) {
         LOG.trace("The following test coverages for file '{}' have not been taken into account: {}", component.getPath(), Joiner.on(", ").join(unprocessedCoverageDetailNames));
       }
-      return hasUnprocessedCoverageDetails;
+      return hasUnprocessedCoverage;
     }
 
     private List<FileSourceDb.Test> addCoveredFilesToTests(Multimap<String, FileSourceDb.Test.Builder> testsByName,
index 84d521f6fe3f445f92b37ab4f29fc58fd0c93213..7c17fe3488bc483d68c8cc5c58facc3d783dfc24 100644 (file)
@@ -115,7 +115,7 @@ public class PopulateComponentsUuidAndKeyStep implements ComputationStep {
     feedComponent((ComponentImpl) component, componentKey, componentContext.componentUuidsByKey);
   }
 
-  private void feedComponent(ComponentImpl component, String componentKey, Map<String, String> componentUuidByKey) {
+  private static void feedComponent(ComponentImpl component, String componentKey, Map<String, String> componentUuidByKey) {
     component.setKey(componentKey);
 
     String componentUuid = componentUuidByKey.get(componentKey);
index 40d8a4f3201fdf71248261d454716f2f6fd237b7..d1cfe313845a5a6c7357a7f22fed8706773b4f6a 100644 (file)
@@ -36,7 +36,7 @@ public class PropertiesWs implements WebService {
     controller.done();
   }
 
-  private void defineIndexAction(NewController controller) {
+  private static void defineIndexAction(NewController controller) {
     controller.createAction("index")
       .setDescription("Documentation of this web service is available <a href=\"http://redirect.sonarsource.com/doc/old-web-service-api.html\">here</a>")
       .setSince("2.6")
index f34b456cb94c2eb81d30f03cdf139a987c406dda..13c85036c1d8b9a466e9e86fa12da136abe81321 100644 (file)
@@ -55,7 +55,7 @@ public final class ProjectTimeMachineDashboard extends DashboardTemplate {
     return dashboard;
   }
 
-  private void addFirstColumn(Dashboard dashboard) {
+  private static void addFirstColumn(Dashboard dashboard) {
     Widget timelineWidget = dashboard.addWidget("timeline", 1);
     timelineWidget.setProperty(METRIC1, CoreMetrics.COMPLEXITY_KEY);
     timelineWidget.setProperty(METRIC2, CoreMetrics.TECHNICAL_DEBT_KEY);
@@ -83,7 +83,7 @@ public final class ProjectTimeMachineDashboard extends DashboardTemplate {
     duplicationTimeMachineWidget.setProperty(METRIC4, CoreMetrics.DUPLICATED_FILES_KEY);
   }
 
-  private void addSecondColumn(Dashboard dashboard) {
+  private static void addSecondColumn(Dashboard dashboard) {
     Widget rulesTimeMachineWidget = addTimeMachineWidgetOnSecondColumn(dashboard);
     rulesTimeMachineWidget.setProperty(METRIC1, CoreMetrics.VIOLATIONS_KEY);
     rulesTimeMachineWidget.setProperty(METRIC2, CoreMetrics.BLOCKER_VIOLATIONS_KEY);
@@ -110,15 +110,15 @@ public final class ProjectTimeMachineDashboard extends DashboardTemplate {
     testsTimeMachineWidget.setProperty(METRIC8, CoreMetrics.TEST_EXECUTION_TIME_KEY);
   }
 
-  private Widget addTimeMachineWidgetOnFirstColumn(Dashboard dashboard) {
+  private static Widget addTimeMachineWidgetOnFirstColumn(Dashboard dashboard) {
     return addTimeMachineWidget(dashboard, 1);
   }
 
-  private Widget addTimeMachineWidgetOnSecondColumn(Dashboard dashboard) {
+  private static Widget addTimeMachineWidgetOnSecondColumn(Dashboard dashboard) {
     return addTimeMachineWidget(dashboard, 2);
   }
 
-  private Widget addTimeMachineWidget(Dashboard dashboard, int columnIndex) {
+  private static Widget addTimeMachineWidget(Dashboard dashboard, int columnIndex) {
     Widget widget = dashboard.addWidget("time_machine", columnIndex);
     widget.setProperty("displaySparkLine", "true");
     return widget;
index 0beb52287df1dc004d4de61f4a4fb18eb8b4ecf6..849447578a69d09b46f7501996f0b96cef8ae212 100644 (file)
@@ -25,9 +25,7 @@ import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.Date;
-
 import javax.annotation.Nullable;
-
 import org.apache.commons.dbutils.DbUtils;
 import org.sonar.api.utils.System2;
 import org.sonar.core.persistence.Database;
@@ -103,7 +101,7 @@ public class ReplaceIssueFiltersProjectKeyByUuid extends BaseDataChange {
     return newFields.toString();
   }
 
-  private void append(PreparedStatement pstmt, StringBuilder newFields, @Nullable String projectKey) throws SQLException {
+  private static void append(PreparedStatement pstmt, StringBuilder newFields, @Nullable String projectKey) throws SQLException {
     if (projectKey != null) {
       pstmt.setString(1, projectKey);
       ResultSet rs = null;
index 395ff13cc37b7cbaa77c11af1fdf93c05e838604..6c885e1e5f60ac978eeaf7f45030a8d598df96c2 100644 (file)
  */
 package org.sonar.server.db.migrations.v51;
 
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
 import java.sql.SQLException;
 import java.util.Date;
 import java.util.List;
-
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.sonar.api.utils.MessageException;
@@ -34,9 +34,6 @@ import org.sonar.core.persistence.Database;
 import org.sonar.server.db.migrations.BaseDataChange;
 import org.sonar.server.db.migrations.Select;
 
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-
 /**
  * See http://jira.sonarsource.com/browse/SONAR-6187
  *
@@ -97,7 +94,7 @@ public class AddNewCharacteristics extends BaseDataChange {
    *
    * If the characteristic 'Usability' is already at the right place, nothing will be done.
    */
-  private int moveCharacteristicsDownToBeAbleToInsertUsability(CharacteristicsContext characteristicsContext) throws SQLException {
+  private static int moveCharacteristicsDownToBeAbleToInsertUsability(CharacteristicsContext characteristicsContext) throws SQLException {
     Characteristic security = characteristicsContext.findCharacteristicByKey(SECURITY_KEY);
     Characteristic usability = characteristicsContext.findCharacteristicByKey(USABILITY_KEY);
 
index d48de3632f303341a91bfe55dda6d2f33e8e34f0..34848604a87821049563dd60d3a5fe7708f2370f 100644 (file)
 
 package org.sonar.server.debt;
 
+import java.io.Reader;
+import java.io.StringReader;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
 import org.apache.commons.lang.StringUtils;
 import org.codehaus.stax2.XMLInputFactory2;
 import org.codehaus.staxmate.SMInputFactory;
@@ -30,14 +36,6 @@ import org.sonar.api.server.debt.internal.DefaultDebtCharacteristic;
 import org.sonar.api.server.rule.RulesDefinition;
 import org.sonar.server.debt.DebtModelXMLExporter.DebtModel;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-import javax.xml.stream.XMLInputFactory;
-import javax.xml.stream.XMLStreamException;
-
-import java.io.Reader;
-import java.io.StringReader;
-
 import static org.sonar.server.debt.DebtModelXMLExporter.CHARACTERISTIC;
 import static org.sonar.server.debt.DebtModelXMLExporter.CHARACTERISTIC_KEY;
 import static org.sonar.server.debt.DebtModelXMLExporter.CHARACTERISTIC_NAME;
@@ -74,7 +72,7 @@ public class DebtCharacteristicsXMLImporter {
     return debtModel;
   }
 
-  private SMInputFactory initStax() {
+  private static SMInputFactory initStax() {
     XMLInputFactory xmlFactory = XMLInputFactory2.newInstance();
     xmlFactory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE);
     xmlFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, Boolean.FALSE);
index b9d79cf1ebd8df22a66a6bccdea7531211dbe13a..6156e38e6360144ae3a4d8f60ccb13c9e0627292 100644 (file)
@@ -22,6 +22,10 @@ package org.sonar.server.debt;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
+import java.util.Date;
+import java.util.List;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
 import org.apache.ibatis.session.SqlSession;
 import org.sonar.api.server.ServerSide;
 import org.sonar.api.server.debt.DebtCharacteristic;
@@ -38,12 +42,6 @@ import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.user.UserSession;
 import org.sonar.server.util.Validation;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.util.Date;
-import java.util.List;
-
 @ServerSide
 public class DebtModelOperations {
 
@@ -150,7 +148,7 @@ public class DebtModelOperations {
     }
   }
 
-  private int getOrder(CharacteristicDto characteristicDto) {
+  private static int getOrder(CharacteristicDto characteristicDto) {
     Integer order = characteristicDto.getOrder();
     if (order == null) {
       throw new IllegalArgumentException(String.format("The order of the characteristic '%s' should not be null", characteristicDto.getKey()));
index 428983b2de60199b19bd8df0b969f230dd560b29..be554876a307d8f9dd3223dbf236a2e430b8692d 100644 (file)
@@ -24,14 +24,13 @@ import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Ordering;
-import org.apache.commons.lang.StringEscapeUtils;
-import org.apache.commons.lang.StringUtils;
-import org.sonar.api.server.ServerSide;
-import org.sonar.api.rule.RuleKey;
-import org.sonar.api.server.debt.DebtCharacteristic;
-import org.sonar.api.server.debt.internal.DefaultDebtCharacteristic;
-import org.xml.sax.InputSource;
-
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.Collections;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
 import javax.xml.transform.OutputKeys;
@@ -41,14 +40,13 @@ import javax.xml.transform.TransformerException;
 import javax.xml.transform.sax.SAXSource;
 import javax.xml.transform.sax.SAXTransformerFactory;
 import javax.xml.transform.stream.StreamResult;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.nio.charset.StandardCharsets;
-import java.util.Collections;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.commons.lang.StringUtils;
+import org.sonar.api.rule.RuleKey;
+import org.sonar.api.server.ServerSide;
+import org.sonar.api.server.debt.DebtCharacteristic;
+import org.sonar.api.server.debt.internal.DefaultDebtCharacteristic;
+import org.xml.sax.InputSource;
 
 import static com.google.common.collect.Lists.newArrayList;
 
@@ -147,7 +145,7 @@ public class DebtModelXMLExporter {
     return result;
   }
 
-  private void processProperty(String key, @Nullable String val, String text, StringBuilder xml) {
+  private static void processProperty(String key, @Nullable String val, String text, StringBuilder xml) {
     xml.append("<" + PROPERTY + "><" + PROPERTY_KEY + ">");
     xml.append(StringEscapeUtils.escapeXml(key));
     xml.append("</" + PROPERTY_KEY + ">");
@@ -164,7 +162,7 @@ public class DebtModelXMLExporter {
     xml.append("</" + PROPERTY + ">");
   }
 
-  private String prettyFormatXml(String xml) {
+  private static String prettyFormatXml(String xml) {
     try {
       Transformer serializer = SAXTransformerFactory.newInstance().newTransformer();
       serializer.setOutputProperty(OutputKeys.INDENT, "yes");
@@ -240,7 +238,7 @@ public class DebtModelXMLExporter {
       });
     }
 
-    private List<DebtCharacteristic> sortByOrder(List<DebtCharacteristic> characteristics) {
+    private static List<DebtCharacteristic> sortByOrder(List<DebtCharacteristic> characteristics) {
       Collections.sort(characteristics, new Ordering<DebtCharacteristic>() {
         @Override
         public int compare(@Nullable DebtCharacteristic left, @Nullable DebtCharacteristic right) {
@@ -253,7 +251,7 @@ public class DebtModelXMLExporter {
       return characteristics;
     }
 
-    private List<DebtCharacteristic> sortByName(List<DebtCharacteristic> characteristics) {
+    private static List<DebtCharacteristic> sortByName(List<DebtCharacteristic> characteristics) {
       Collections.sort(characteristics, new Ordering<DebtCharacteristic>() {
         @Override
         public int compare(@Nullable DebtCharacteristic left, @Nullable DebtCharacteristic right) {
index 7b30834dfd92fd544f3472eb5db7f5e9d29becb6..2f119bc0e139da204e31dd77998b9c0a45008477 100644 (file)
@@ -23,28 +23,26 @@ package org.sonar.server.debt;
 import com.google.common.base.Predicate;
 import com.google.common.base.Strings;
 import com.google.common.collect.Iterables;
+import java.io.Reader;
+import java.io.StringReader;
+import java.util.List;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.math.NumberUtils;
 import org.codehaus.stax2.XMLInputFactory2;
 import org.codehaus.staxmate.SMInputFactory;
 import org.codehaus.staxmate.in.SMHierarchicCursor;
 import org.codehaus.staxmate.in.SMInputCursor;
-import org.sonar.api.server.ServerSide;
 import org.sonar.api.rule.RuleKey;
+import org.sonar.api.server.ServerSide;
 import org.sonar.api.server.debt.DebtRemediationFunction;
 import org.sonar.api.utils.Duration;
 import org.sonar.api.utils.ValidationMessages;
 import org.sonar.server.debt.DebtModelXMLExporter.RuleDebt;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-import javax.xml.stream.XMLInputFactory;
-import javax.xml.stream.XMLStreamException;
-
-import java.io.Reader;
-import java.io.StringReader;
-import java.util.List;
-
 import static com.google.common.collect.Lists.newArrayList;
 import static org.sonar.server.debt.DebtModelXMLExporter.CHARACTERISTIC;
 import static org.sonar.server.debt.DebtModelXMLExporter.CHARACTERISTIC_KEY;
@@ -88,7 +86,7 @@ public class DebtRulesXMLImporter {
     return ruleDebts;
   }
 
-  private SMInputFactory initStax() {
+  private static SMInputFactory initStax() {
     XMLInputFactory xmlFactory = XMLInputFactory2.newInstance();
     xmlFactory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE);
     xmlFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, Boolean.FALSE);
@@ -141,7 +139,7 @@ public class DebtRulesXMLImporter {
     return null;
   }
 
-  private Property processProperty(ValidationMessages validationMessages, SMInputCursor cursor) throws XMLStreamException {
+  private static Property processProperty(ValidationMessages validationMessages, SMInputCursor cursor) throws XMLStreamException {
     SMInputCursor c = cursor.childElementCursor();
     String key = null;
     int value = 0;
@@ -183,7 +181,7 @@ public class DebtRulesXMLImporter {
   }
 
   @CheckForNull
-  private RuleDebt createRuleDebt(RuleKey ruleKey, String function, @Nullable String coefficient, @Nullable String offset, ValidationMessages validationMessages) {
+  private static RuleDebt createRuleDebt(RuleKey ruleKey, String function, @Nullable String coefficient, @Nullable String offset, ValidationMessages validationMessages) {
     if ("linear_threshold".equals(function) && coefficient != null) {
       validationMessages.addWarningText(String.format("Linear with threshold function is no longer used, remediation function of '%s' is replaced by linear.", ruleKey));
       return new RuleDebt().setRuleKey(ruleKey).setFunction(DebtRemediationFunction.Type.LINEAR.name()).setCoefficient(coefficient);
index cddf4b3ed6d13728c66e725a584c44b1c433b4cf..e5ddea9269bcc30c27779ee60ae47e4b2f0dc765 100644 (file)
 package org.sonar.server.duplication.ws;
 
 import com.google.common.annotations.VisibleForTesting;
+import java.util.List;
+import java.util.Map;
+import javax.annotation.Nullable;
 import org.sonar.api.server.ServerSide;
 import org.sonar.api.utils.text.JsonWriter;
 import org.sonar.core.component.ComponentDto;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.server.component.db.ComponentDao;
 
-import javax.annotation.Nullable;
-
-import java.util.List;
-import java.util.Map;
-
 import static com.google.common.collect.Maps.newHashMap;
 
 @ServerSide
@@ -65,7 +63,7 @@ public class DuplicationsJsonWriter {
     }
   }
 
-  private void writeDuplication(Map<String, String> refByComponentKey, DuplicationsParser.Duplication duplication, JsonWriter json) {
+  private static void writeDuplication(Map<String, String> refByComponentKey, DuplicationsParser.Duplication duplication, JsonWriter json) {
     String ref = null;
     ComponentDto componentDto = duplication.file();
     if (componentDto != null) {
@@ -104,13 +102,13 @@ public class DuplicationsJsonWriter {
     }
   }
 
-  private void addFile(JsonWriter json, ComponentDto file) {
+  private static void addFile(JsonWriter json, ComponentDto file) {
     json.prop("key", file.key());
     json.prop("uuid", file.uuid());
     json.prop("name", file.longName());
   }
 
-  private void addProject(JsonWriter json, @Nullable ComponentDto project, @Nullable ComponentDto subProject) {
+  private static void addProject(JsonWriter json, @Nullable ComponentDto project, @Nullable ComponentDto subProject) {
     if (project != null) {
       json.prop("project", project.key());
       json.prop("projectUuid", project.uuid());
index 2a000de2ea0915e6b4889926944511c741edd61a..33473039147b10d2c805276604660bd750a0fe30 100644 (file)
@@ -20,6 +20,8 @@
 
 package org.sonar.server.es.request;
 
+import java.io.IOException;
+import java.util.Arrays;
 import org.elasticsearch.action.ListenableActionFuture;
 import org.elasticsearch.action.search.SearchRequestBuilder;
 import org.elasticsearch.action.search.SearchResponse;
@@ -31,9 +33,6 @@ import org.elasticsearch.common.xcontent.XContentFactory;
 import org.sonar.api.utils.log.Profiler;
 import org.sonar.server.es.EsClient;
 
-import java.io.IOException;
-import java.util.Arrays;
-
 public class ProxySearchRequestBuilder extends SearchRequestBuilder {
 
   public ProxySearchRequestBuilder(Client client) {
@@ -82,7 +81,7 @@ public class ProxySearchRequestBuilder extends SearchRequestBuilder {
     return message.toString();
   }
 
-  private String xContentToString(ToXContent toXContent) {
+  private static String xContentToString(ToXContent toXContent) {
     try {
       XContentBuilder builder = XContentFactory.jsonBuilder();
       toXContent.toXContent(builder, ToXContent.EMPTY_PARAMS);
index 1894564147d06f8ff3e677c91a69dcb3b67efc7c..83356b5a1c105722908cfd5fd5789fbd68fb1ff7 100644 (file)
 package org.sonar.server.issue;
 
 import com.google.common.base.Strings;
-import org.sonar.api.server.ServerSide;
+import java.util.Collection;
+import java.util.Map;
 import org.sonar.api.issue.Issue;
 import org.sonar.api.issue.internal.DefaultIssue;
+import org.sonar.api.server.ServerSide;
 import org.sonar.core.issue.IssueUpdater;
 import org.sonar.server.user.UserSession;
 
-import java.util.Collection;
-import java.util.Map;
-
 @ServerSide
 public class CommentAction extends Action {
 
@@ -55,7 +54,7 @@ public class CommentAction extends Action {
     return true;
   }
 
-  private String comment(Map<String, Object> properties) {
+  private static String comment(Map<String, Object> properties) {
     String param = (String) properties.get(COMMENT_PROPERTY);
     if (Strings.isNullOrEmpty(param)) {
       throw new IllegalArgumentException("Missing parameter : '" + COMMENT_PROPERTY + "'");
index 83db935db6aadd8bb5b141094028020c75740be7..69fbceaf448bf643f92adddcd9c596adfb6d7e10 100644 (file)
@@ -26,8 +26,13 @@ import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
 import org.apache.commons.lang.StringUtils;
-import org.sonar.api.server.ServerSide;
 import org.sonar.api.issue.ActionPlan;
 import org.sonar.api.issue.Issue;
 import org.sonar.api.issue.IssueComment;
@@ -36,6 +41,7 @@ import org.sonar.api.issue.internal.DefaultIssue;
 import org.sonar.api.issue.internal.DefaultIssueComment;
 import org.sonar.api.issue.internal.FieldDiffs;
 import org.sonar.api.rule.RuleKey;
+import org.sonar.api.server.ServerSide;
 import org.sonar.api.utils.SonarException;
 import org.sonar.api.web.UserRole;
 import org.sonar.core.issue.ActionPlanStats;
@@ -55,14 +61,6 @@ import org.sonar.server.user.UserSession;
 import org.sonar.server.util.RubyUtils;
 import org.sonar.server.util.Validation;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
 import static com.google.common.collect.Lists.newArrayList;
 
 /**
@@ -385,7 +383,7 @@ public class InternalRubyIssueService {
     }
   }
 
-  private Date checkAndReturnDeadline(String deadLineParam, Result<ActionPlan> result) {
+  private static Date checkAndReturnDeadline(String deadLineParam, Result<ActionPlan> result) {
     Date deadLine = null;
     if (!Strings.isNullOrEmpty(deadLineParam)) {
       try {
@@ -492,7 +490,7 @@ public class InternalRubyIssueService {
     return execute(props);
   }
 
-  private void overrideProps(Map<String, Object> props, Map<String, Object> overrideProps) {
+  private static void overrideProps(Map<String, Object> props, Map<String, Object> overrideProps) {
     for (Map.Entry<String, Object> entry : overrideProps.entrySet()) {
       props.put(entry.getKey(), entry.getValue());
     }
@@ -609,32 +607,32 @@ public class InternalRubyIssueService {
     return issueBulkChangeService.execute(issueBulkChangeQuery, userSession);
   }
 
-  private void checkMandatoryParameter(String value, String paramName, Result result) {
+  private static void checkMandatoryParameter(String value, String paramName, Result result) {
     if (Strings.isNullOrEmpty(value)) {
       result.addError(Result.Message.ofL10n(Validation.CANT_BE_EMPTY_MESSAGE, paramName));
     }
   }
 
-  private void checkMandatorySizeParameter(String value, String paramName, Integer size, Result result) {
+  private static void checkMandatorySizeParameter(String value, String paramName, Integer size, Result result) {
     checkMandatoryParameter(value, paramName, result);
     if (!Strings.isNullOrEmpty(value) && value.length() > size) {
       result.addError(Result.Message.ofL10n(Validation.IS_TOO_LONG_MESSAGE, paramName, size));
     }
   }
 
-  private void checkOptionalSizeParameter(String value, String paramName, Integer size, Result result) {
+  private static void checkOptionalSizeParameter(String value, String paramName, Integer size, Result result) {
     if (!Strings.isNullOrEmpty(value) && value.length() > size) {
       result.addError(Result.Message.ofL10n(Validation.IS_TOO_LONG_MESSAGE, paramName, size));
     }
   }
 
-  private void checkOptionalSizeParameter(String value, String paramName, Integer size) {
+  private static void checkOptionalSizeParameter(String value, String paramName, Integer size) {
     if (!Strings.isNullOrEmpty(value) && value.length() > size) {
       throw new BadRequestException(Validation.IS_TOO_LONG_MESSAGE, paramName, size);
     }
   }
 
-  public int maxPageSize() {
+  public static int maxPageSize() {
     return QueryContext.MAX_LIMIT;
   }
 
index 768a274f59c48f1bc5ba936d51bf75f8c54953bb..29f84cafcca6ef1437ff1478b4f583ace51f0ab3 100644 (file)
@@ -25,10 +25,18 @@ import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
 import org.sonar.api.issue.Issue;
 import org.sonar.api.issue.internal.DefaultIssue;
 import org.sonar.api.issue.internal.IssueChangeContext;
-import org.sonar.core.notification.NotificationManager;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rules.Rule;
 import org.sonar.api.utils.log.Logger;
@@ -36,6 +44,7 @@ import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.component.ComponentDto;
 import org.sonar.core.issue.db.IssueDto;
 import org.sonar.core.issue.db.IssueStorage;
+import org.sonar.core.notification.NotificationManager;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.core.persistence.MyBatis;
 import org.sonar.server.db.DbClient;
@@ -46,17 +55,6 @@ import org.sonar.server.issue.notification.IssueChangeNotification;
 import org.sonar.server.rule.DefaultRuleFinder;
 import org.sonar.server.user.UserSession;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Maps.newHashMap;
 import static com.google.common.collect.Sets.newHashSet;
@@ -167,7 +165,7 @@ public class IssueBulkChangeService {
     return bulkActions;
   }
 
-  private void applyAction(Action action, ActionContext actionContext, IssueBulkChangeQuery issueBulkChangeQuery, IssueBulkChangeResult result) {
+  private static void applyAction(Action action, ActionContext actionContext, IssueBulkChangeQuery issueBulkChangeQuery, IssueBulkChangeResult result) {
     Issue issue = actionContext.issue();
     try {
       if (action.supports(issue) && action.execute(issueBulkChangeQuery.properties(action.key()), actionContext)) {
index 74e252e36a4fab659c5332ff372af0be6a6d97e6..174f943f7cd0d2838d6fd349a68d2e4c807eb4c5 100644 (file)
 
 package org.sonar.server.issue;
 
+import com.google.common.base.Strings;
 import java.util.Collection;
 import java.util.Map;
-
-import org.sonar.api.server.ServerSide;
 import org.sonar.api.issue.Issue;
 import org.sonar.api.issue.condition.Condition;
 import org.sonar.api.issue.condition.IsUnResolved;
 import org.sonar.api.issue.internal.DefaultIssue;
+import org.sonar.api.server.ServerSide;
 import org.sonar.api.web.UserRole;
 import org.sonar.core.issue.IssueUpdater;
 import org.sonar.server.user.UserSession;
 
-import com.google.common.base.Strings;
-
 @ServerSide
 public class SetSeverityAction extends Action {
 
@@ -69,7 +67,7 @@ public class SetSeverityAction extends Action {
     return issueUpdater.setManualSeverity((DefaultIssue) context.issue(), severity(properties), context.issueChangeContext());
   }
 
-  private String severity(Map<String, Object> properties) {
+  private static String severity(Map<String, Object> properties) {
     String param = (String) properties.get("severity");
     if (Strings.isNullOrEmpty(param)) {
       throw new IllegalArgumentException("Missing parameter : 'severity'");
index 19845815146c3db9e861b7b9fd2fbf3ce0d27764..6683c79382dee88a59cb0ee91e38942fc12c4851 100644 (file)
 
 package org.sonar.server.issue;
 
+import com.google.common.base.Predicate;
+import com.google.common.base.Strings;
+import com.google.common.collect.Iterables;
 import java.util.Collection;
 import java.util.Map;
-
 import org.apache.commons.lang.StringUtils;
-import org.sonar.api.server.ServerSide;
 import org.sonar.api.issue.Issue;
 import org.sonar.api.issue.internal.DefaultIssue;
+import org.sonar.api.server.ServerSide;
 import org.sonar.core.issue.workflow.IssueWorkflow;
 import org.sonar.core.issue.workflow.Transition;
 import org.sonar.server.user.UserSession;
 
-import com.google.common.base.Predicate;
-import com.google.common.base.Strings;
-import com.google.common.collect.Iterables;
-
 @ServerSide
 public class TransitionAction extends Action {
 
@@ -77,7 +75,7 @@ public class TransitionAction extends Action {
     }, null) != null;
   }
 
-  private String transition(Map<String, Object> properties) {
+  private static String transition(Map<String, Object> properties) {
     String param = (String) properties.get("transition");
     if (Strings.isNullOrEmpty(param)) {
       throw new IllegalArgumentException("Missing parameter : 'transition'");
index 983350804993f379da382c851bc477923aacc8e3..7d9b925975328733c5b8c15f75362a81ff30f4df 100644 (file)
@@ -22,10 +22,15 @@ package org.sonar.server.issue.actionplan;
 
 import com.google.common.base.Function;
 import com.google.common.collect.Iterables;
-import org.sonar.api.server.ServerSide;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import javax.annotation.CheckForNull;
 import org.sonar.api.issue.ActionPlan;
 import org.sonar.api.issue.internal.DefaultIssue;
 import org.sonar.api.issue.internal.IssueChangeContext;
+import org.sonar.api.server.ServerSide;
 import org.sonar.api.web.UserRole;
 import org.sonar.core.issue.ActionPlanDeadlineComparator;
 import org.sonar.core.issue.ActionPlanStats;
@@ -45,13 +50,6 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.user.UserSession;
 
-import javax.annotation.CheckForNull;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-
 import static com.google.common.collect.Lists.newArrayList;
 
 /**
@@ -205,11 +203,11 @@ public class ActionPlanService {
     return resourceDto;
   }
 
-  private void checkUserCanAccessProject(String projectKey, UserSession userSession) {
+  private static void checkUserCanAccessProject(String projectKey, UserSession userSession) {
     userSession.checkProjectPermission(UserRole.USER, projectKey);
   }
 
-  private void checkUserIsProjectAdministrator(String projectKey, UserSession userSession) {
+  private static void checkUserIsProjectAdministrator(String projectKey, UserSession userSession) {
     userSession.checkProjectPermission(UserRole.ADMIN, projectKey);
   }
 
index c9b8a51d959c392429c63fdc4af2d502d300bf43..95d980508f080e0b6d380e372347a349ac14fc43 100644 (file)
@@ -41,17 +41,17 @@ public class ActionPlanWs implements WebService {
     controller.done();
   }
 
-  private void defineSearchAction(NewController controller) {
+  private static void defineSearchAction(NewController controller) {
     WebService.NewAction action = controller.createAction("search")
       .setDescription("Get a list of action plans. Requires Browse permission on project")
       .setSince("3.6")
       .setHandler(RailsHandler.INSTANCE)
-      .setResponseExample(Resources.getResource(this.getClass(), "example-search.json"));
+      .setResponseExample(Resources.getResource(ActionPlanWs.class, "example-search.json"));
     addProjectParam(action);
     addFormatParam(action);
   }
 
-  private void defineCreateAction(NewController controller) {
+  private static void defineCreateAction(NewController controller) {
     WebService.NewAction action = controller.createAction("create")
       .setDescription("Create an action plan. Requires Administer permission on project")
       .setSince("3.6")
@@ -64,7 +64,7 @@ public class ActionPlanWs implements WebService {
     addFormatParam(action);
   }
 
-  private void defineUpdateAction(NewController controller) {
+  private static void defineUpdateAction(NewController controller) {
     WebService.NewAction action = controller.createAction("update")
       .setDescription("Update an action plan. Requires Administer permission on project")
       .setSince("3.6")
@@ -77,7 +77,7 @@ public class ActionPlanWs implements WebService {
     addFormatParam(action);
   }
 
-  private void defineDeleteAction(NewController controller) {
+  private static void defineDeleteAction(NewController controller) {
     WebService.NewAction action = controller.createAction("delete")
       .setDescription("Delete an action plan. Requires Administer permission on project")
       .setSince("3.6")
@@ -87,7 +87,7 @@ public class ActionPlanWs implements WebService {
     addFormatParam(action);
   }
 
-  private void defineOpenAction(NewController controller) {
+  private static void defineOpenAction(NewController controller) {
     WebService.NewAction action = controller.createAction("open")
       .setDescription("Open an action plan. Requires Administer permission on project")
       .setSince("3.6")
@@ -97,7 +97,7 @@ public class ActionPlanWs implements WebService {
     addFormatParam(action);
   }
 
-  private void defineCloseAction(NewController controller) {
+  private static void defineCloseAction(NewController controller) {
     WebService.NewAction action = controller.createAction("close")
       .setDescription("Close an action plan. Requires Administer permission on project")
       .setSince("3.6")
index 37311ccfdea13fef7ad4eac1b71a8c2f0941e286..8727dde142c4e84df8cababd27da8e06e90a186d 100644 (file)
@@ -75,12 +75,12 @@ public class IssuesWs implements WebService {
     defineBulkChangeAction(controller);
   }
 
-  private void defineChangelogAction(NewController controller) {
+  private static void defineChangelogAction(NewController controller) {
     WebService.NewAction action = controller.createAction(CHANGELOG_ACTION)
       .setDescription("Display changelog of an issue")
       .setSince("4.1")
       .setHandler(RailsHandler.INSTANCE)
-      .setResponseExample(Resources.getResource(this.getClass(), "example-changelog.json"));
+      .setResponseExample(Resources.getResource(IssuesWs.class, "example-changelog.json"));
 
     action.createParam("issue")
       .setDescription("Key of the issue")
@@ -89,7 +89,7 @@ public class IssuesWs implements WebService {
     RailsHandler.addFormatParam(action);
   }
 
-  private void defineAssignAction(NewController controller) {
+  private static void defineAssignAction(NewController controller) {
     WebService.NewAction action = controller.createAction(ASSIGN_ACTION)
       .setDescription("Assign/Unassign an issue. Requires authentication and Browse permission on project")
       .setSince("3.6")
@@ -106,7 +106,7 @@ public class IssuesWs implements WebService {
     RailsHandler.addFormatParam(action);
   }
 
-  private void defineAddCommentAction(NewController controller) {
+  private static void defineAddCommentAction(NewController controller) {
     WebService.NewAction action = controller.createAction(ADD_COMMENT_ACTION)
       .setDescription("Add a comment. Requires authentication and Browse permission on project")
       .setSince("3.6")
@@ -123,7 +123,7 @@ public class IssuesWs implements WebService {
     RailsHandler.addFormatParam(action);
   }
 
-  private void defineDeleteCommentAction(NewController controller) {
+  private static void defineDeleteCommentAction(NewController controller) {
     WebService.NewAction action = controller.createAction(DELETE_COMMENT_ACTION)
       .setDescription("Delete a comment. Requires authentication and Browse permission on project")
       .setSince("3.6")
@@ -136,7 +136,7 @@ public class IssuesWs implements WebService {
       .setExampleValue("392160d3-a4f2-4c52-a565-e4542cfa2096");
   }
 
-  private void defineEditCommentAction(NewController controller) {
+  private static void defineEditCommentAction(NewController controller) {
     WebService.NewAction action = controller.createAction(EDIT_COMMENT_ACTION)
       .setDescription("Edit a comment. Requires authentication and User role on project")
       .setSince("3.6")
@@ -153,7 +153,7 @@ public class IssuesWs implements WebService {
     RailsHandler.addFormatParam(action);
   }
 
-  private void defineSetSeverityAction(NewController controller) {
+  private static void defineSetSeverityAction(NewController controller) {
     WebService.NewAction action = controller.createAction(SET_SEVERITY_ACTION)
       .setDescription("Change severity. Requires authentication and Browse permission on project")
       .setSince("3.6")
@@ -171,7 +171,7 @@ public class IssuesWs implements WebService {
     RailsHandler.addFormatParam(action);
   }
 
-  private void definePlanAction(NewController controller) {
+  private static void definePlanAction(NewController controller) {
     WebService.NewAction action = controller.createAction(PLAN_ACTION)
       .setDescription("Plan/Unplan an issue. Requires authentication and Browse permission on project")
       .setSince("3.6")
@@ -188,7 +188,7 @@ public class IssuesWs implements WebService {
     RailsHandler.addFormatParam(action);
   }
 
-  private void defineDoTransitionAction(NewController controller) {
+  private static void defineDoTransitionAction(NewController controller) {
     WebService.NewAction action = controller.createAction(DO_TRANSITION_ACTION)
       .setDescription("Do workflow transition on an issue. Requires authentication and Browse permission on project")
       .setSince("3.6")
@@ -206,12 +206,12 @@ public class IssuesWs implements WebService {
     RailsHandler.addFormatParam(action);
   }
 
-  private void defineTransitionsAction(NewController controller) {
+  private static void defineTransitionsAction(NewController controller) {
     WebService.NewAction action = controller.createAction(TRANSITIONS_ACTION)
       .setDescription("Get Possible Workflow Transitions for an Issue. Requires Browse permission on project")
       .setSince("3.6")
       .setHandler(RailsHandler.INSTANCE)
-      .setResponseExample(Resources.getResource(this.getClass(), "example-transitions.json"));
+      .setResponseExample(Resources.getResource(IssuesWs.class, "example-transitions.json"));
 
     action.createParam("issue")
       .setDescription("Key of the issue")
@@ -219,7 +219,7 @@ public class IssuesWs implements WebService {
       .setExampleValue("5bccd6e8-f525-43a2-8d76-fcb13dde79ef");
   }
 
-  private void defineCreateAction(NewController controller) {
+  private static void defineCreateAction(NewController controller) {
     WebService.NewAction action = controller.createAction(CREATE_ACTION)
       .setDescription("Create a manual issue. Requires authentication and Browse permission on project")
       .setSince("3.6")
@@ -248,7 +248,7 @@ public class IssuesWs implements WebService {
     RailsHandler.addFormatParam(action);
   }
 
-  private void defineDoActionAction(NewController controller) {
+  private static void defineDoActionAction(NewController controller) {
     WebService.NewAction action = controller.createAction(DO_ACTION_ACTION)
       .setDescription("Do workflow transition on an issue. Requires authentication and Browse permission on project")
       .setSince("3.6")
@@ -265,7 +265,7 @@ public class IssuesWs implements WebService {
     RailsHandler.addFormatParam(action);
   }
 
-  private void defineBulkChangeAction(NewController controller) {
+  private static void defineBulkChangeAction(NewController controller) {
     WebService.NewAction action = controller.createAction(BULK_CHANGE_ACTION)
       .setDescription("Bulk change on issues. Requires authentication and User role on project(s)")
       .setSince("3.7")
index c5ebc6cdf5ac834608ab6f806160c891ce0597d2..691662734201e8e152db0807eee92f85bb4a8864 100644 (file)
@@ -684,7 +684,7 @@ public class SearchAction implements IssuesWsAction {
     json.endArray();
   }
 
-  private void writeUsers(JsonWriter json, Map<String, User> usersByLogin) {
+  private static void writeUsers(JsonWriter json, Map<String, User> usersByLogin) {
     json.name("users").beginArray();
     for (User user : usersByLogin.values()) {
       json.beginObject()
index 15dfb40895dea9bc55fc37136cd6e562c90a2b0e..9a5968cc9650f2299e3fed976445459799fce79f 100644 (file)
@@ -23,16 +23,6 @@ import com.google.common.base.Function;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Ordering;
-import org.apache.commons.dbutils.DbUtils;
-import org.apache.commons.lang.StringEscapeUtils;
-import org.apache.commons.lang.StringUtils;
-import org.sonar.core.component.SnapshotDto;
-import org.sonar.core.persistence.Database;
-import org.sonar.core.persistence.dialect.MsSql;
-import org.sonar.core.persistence.dialect.Oracle;
-
-import javax.annotation.Nullable;
-
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -40,6 +30,14 @@ import java.sql.SQLException;
 import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
+import javax.annotation.Nullable;
+import org.apache.commons.dbutils.DbUtils;
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.commons.lang.StringUtils;
+import org.sonar.core.component.SnapshotDto;
+import org.sonar.core.persistence.Database;
+import org.sonar.core.persistence.dialect.MsSql;
+import org.sonar.core.persistence.dialect.Oracle;
 
 class MeasureFilterSql {
 
@@ -257,7 +255,7 @@ class MeasureFilterSql {
   /**
    * Replace escape percent and underscore by adding a slash just before
    */
-  private String escapePercentAndUnderscrore(String value) {
+  private static String escapePercentAndUnderscrore(String value) {
     return value.replaceAll("%", "\\\\%").replaceAll("_", "\\\\_");
   }
 
index d585104d646b043039e9a0fb416252b48a3b9948..7a5b3e7900d62bf8774b9dcb5a40468aacfc4262 100644 (file)
@@ -36,7 +36,7 @@ public class ManualMeasuresWs implements WebService {
     controller.done();
   }
 
-  private void defineIndexAction(NewController controller) {
+  private static void defineIndexAction(NewController controller) {
     controller.createAction("index")
       .setDescription("Documentation of this web service is available <a href=\"http://redirect.sonarsource.com/doc/old-web-service-api.html\">here</a>")
       .setSince("2.10")
index 59b9054b14e6b851e3857d60b5a34f0881a73874..09c73b50494cd08af0a2f886a1aa17673fcf7409 100644 (file)
@@ -116,7 +116,7 @@ public class CreateAction implements MetricsWsAction {
     }
   }
 
-  private MetricDto newMetricTemplate(Request request) {
+  private static MetricDto newMetricTemplate(Request request) {
     String key = request.mandatoryParam(PARAM_KEY);
     String name = request.mandatoryParam(PARAM_NAME);
     String type = Metric.ValueType.valueOf(request.mandatoryParam(PARAM_TYPE)).name();
index 64360c053c6defa873899ca569b149e591956303..c48cd47d5331f02a43b968d962447bb41bdf694a 100644 (file)
@@ -47,7 +47,7 @@ public class MetricsWs implements WebService {
     controller.done();
   }
 
-  private void defineIndexAction(NewController controller) {
+  private static void defineIndexAction(NewController controller) {
     controller.createAction("index")
       .setDescription("Documentation of this web service is available <a href=\"http://redirect.sonarsource.com/doc/old-web-service-api.html\">here</a>")
       .setSince("2.6")
index 5a7f011a7ba86d4e97c7ae7314c4aebeb87fa9e6..bcfcecbddb8032cfbb58cdc4574b1b26d4a0a7fe 100644 (file)
 
 package org.sonar.server.permission;
 
-import org.sonar.api.server.ServerSide;
+import java.util.List;
+import java.util.Map;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
 import org.sonar.api.security.DefaultGroups;
+import org.sonar.api.server.ServerSide;
 import org.sonar.api.web.UserRole;
 import org.sonar.core.component.ComponentDto;
 import org.sonar.core.permission.GlobalPermissions;
@@ -36,12 +40,6 @@ import org.sonar.server.exceptions.ForbiddenException;
 import org.sonar.server.issue.index.IssueAuthorizationIndexer;
 import org.sonar.server.user.UserSession;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.util.List;
-import java.util.Map;
-
 /**
  * Used by ruby code <pre>Internal.permissions</pre>
  */
@@ -261,7 +259,7 @@ public class InternalPermissionService {
     }
   }
 
-  private Object badRequestIfNullResult(@Nullable Object component, String objectType, String objectKey) {
+  private static Object badRequestIfNullResult(@Nullable Object component, String objectType, String objectKey) {
     if (component == null) {
       throw new BadRequestException(String.format(NOT_FOUND_FORMAT, objectType, objectKey));
     }
index e6d65ddd30026562b2d12effa2e4c1ae0158b0bf..0f380a30dbee7c2c4b42b5fc13f5f7fbc40a5b4b 100644 (file)
@@ -21,9 +21,12 @@ package org.sonar.server.permission;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
+import java.util.Collection;
+import java.util.List;
+import javax.annotation.Nullable;
 import org.apache.commons.lang.StringUtils;
-import org.sonar.api.server.ServerSide;
 import org.sonar.api.security.DefaultGroups;
+import org.sonar.api.server.ServerSide;
 import org.sonar.api.utils.Paging;
 import org.sonar.core.permission.GroupWithPermission;
 import org.sonar.core.permission.GroupWithPermissionDto;
@@ -38,11 +41,6 @@ import org.sonar.core.resource.ResourceDto;
 import org.sonar.core.resource.ResourceQuery;
 import org.sonar.server.exceptions.NotFoundException;
 
-import javax.annotation.Nullable;
-
-import java.util.Collection;
-import java.util.List;
-
 import static com.google.common.collect.Lists.newArrayList;
 
 @ServerSide
@@ -97,7 +95,7 @@ public class PermissionFinder {
     return new UserWithPermissionQueryResult(toUserWithPermissionList(dtos), hasMoreResults);
   }
 
-  private List<UserWithPermission> toUserWithPermissionList(List<UserWithPermissionDto> dtos) {
+  private static List<UserWithPermission> toUserWithPermissionList(List<UserWithPermissionDto> dtos) {
     List<UserWithPermission> users = newArrayList();
     for (UserWithPermissionDto dto : dtos) {
       users.add(dto.toUserWithPermission());
@@ -106,7 +104,7 @@ public class PermissionFinder {
   }
 
   @Nullable
-  private Long componentId(String componentKey) {
+  private Long componentId(@Nullable String componentKey) {
     if (componentKey == null) {
       return null;
     } else {
@@ -135,13 +133,13 @@ public class PermissionFinder {
     return dto.getId();
   }
 
-  private int offset(PermissionQuery query) {
+  private static int offset(PermissionQuery query) {
     int pageSize = query.pageSize();
     int pageIndex = query.pageIndex();
     return (pageIndex - 1) * pageSize;
   }
 
-  private int limit(PermissionQuery query) {
+  private static int limit(PermissionQuery query) {
     // Add one to page size in order to be able to know if there's more results or not
     return query.pageSize() + 1;
   }
@@ -176,7 +174,7 @@ public class PermissionFinder {
     }
   }
 
-  private List<GroupWithPermission> pagedGroups(Collection<GroupWithPermissionDto> dtos, Paging paging) {
+  private static List<GroupWithPermission> pagedGroups(Collection<GroupWithPermissionDto> dtos, Paging paging) {
     List<GroupWithPermission> groups = newArrayList();
     int index = 0;
     for (GroupWithPermissionDto dto : dtos) {
index 4ad77024acfcfeea794dcdc64cf1b6d747c97d9f..1bc071d8dbf02e0ee9eabce1f73ad00b93a3544e 100644 (file)
@@ -41,7 +41,7 @@ public class PermissionsWs implements WebService {
     controller.done();
   }
 
-  private void defineAddAction(NewController controller) {
+  private static void defineAddAction(NewController controller) {
     NewAction action = controller.createAction("add")
       .setDescription("Add a global or a project permission. Requires Administer System permission for global permissions, " +
         "requires Administer permission on project for project permissions")
@@ -65,7 +65,7 @@ public class PermissionsWs implements WebService {
     RailsHandler.addFormatParam(action);
   }
 
-  private void defineRemoveAction(NewController controller) {
+  private static void defineRemoveAction(NewController controller) {
     NewAction action = controller.createAction("remove")
       .setDescription("Remove a global or a project permission. Requires Administer System permission for global permissions, " +
         "requires Administer permission on project for project permissions")
index 01fefe7ee5c588ebac8f4752feb3b0badb059296..ea59dff20afa632745bf8a0a44e9dc29f37ab8dd 100644 (file)
@@ -19,6 +19,8 @@
  */
 package org.sonar.server.platform;
 
+import java.sql.Connection;
+import java.sql.SQLException;
 import org.apache.commons.dbutils.DbUtils;
 import org.elasticsearch.index.query.QueryBuilders;
 import org.sonar.api.server.ServerSide;
@@ -32,9 +34,6 @@ import org.sonar.server.search.IndexDefinition;
 import org.sonar.server.source.index.SourceLineIndexDefinition;
 import org.sonar.server.view.index.ViewIndexDefinition;
 
-import java.sql.Connection;
-import java.sql.SQLException;
-
 @ServerSide
 public class BackendCleanup {
 
@@ -138,7 +137,7 @@ public class BackendCleanup {
     }
   }
 
-  private void deleteWhereResourceIdNotNull(String tableName, Connection connection) {
+  private static void deleteWhereResourceIdNotNull(String tableName, Connection connection) {
     try {
       connection.prepareStatement("DELETE FROM " + tableName + " WHERE resource_id IS NOT NULL").execute();
       // commit is useless on some databases
@@ -148,7 +147,7 @@ public class BackendCleanup {
     }
   }
 
-  private void deleteManualRules(Connection connection) {
+  private static void deleteManualRules(Connection connection) {
     try {
       connection.prepareStatement("DELETE FROM rules WHERE rules.plugin_name='manual'").execute();
       // commit is useless on some databases
index 9b53247017f21d383c3881be25c15428ebad3442..ce575a74b2cd06e6c469f5f2361ea4dae504d876 100644 (file)
@@ -21,6 +21,8 @@
 package org.sonar.server.qualitygate.ws;
 
 import com.google.common.io.Resources;
+import java.util.Collection;
+import javax.annotation.Nullable;
 import org.sonar.api.server.ws.Request;
 import org.sonar.api.server.ws.Response;
 import org.sonar.api.server.ws.WebService;
@@ -30,10 +32,6 @@ import org.sonar.core.qualitygate.db.QualityGateDto;
 import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.qualitygate.QualityGates;
 
-import javax.annotation.Nullable;
-
-import java.util.Collection;
-
 public class ShowAction implements QGateWsAction {
 
   private final QualityGates qualityGates;
@@ -82,7 +80,7 @@ public class ShowAction implements QGateWsAction {
     writer.endObject().close();
   }
 
-  private void checkOneOfIdOrNamePresent(@Nullable Long qGateId, @Nullable String qGateName) {
+  private static void checkOneOfIdOrNamePresent(@Nullable Long qGateId, @Nullable String qGateName) {
     if (qGateId == null && qGateName == null) {
       throw new BadRequestException("Either one of 'id' or 'name' is required.");
     } else if (qGateId != null && qGateName != null) {
index bb6555adf7bd38af8a5a59352a14acb2bacaaca2..e650081860d36072b5c94ff8fc8a6b9f6ced0f6a 100644 (file)
@@ -23,14 +23,25 @@ import com.google.common.base.Joiner;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
+import java.io.Reader;
+import java.io.Writer;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.annotation.Nullable;
+import javax.xml.stream.XMLInputFactory;
+import javax.xml.stream.XMLStreamException;
 import org.apache.commons.lang.ObjectUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.builder.CompareToBuilder;
 import org.codehaus.staxmate.SMInputFactory;
 import org.codehaus.staxmate.in.SMHierarchicCursor;
 import org.codehaus.staxmate.in.SMInputCursor;
-import org.sonar.api.server.ServerSide;
 import org.sonar.api.rule.RuleKey;
+import org.sonar.api.server.ServerSide;
 import org.sonar.api.utils.text.XmlWriter;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.core.qualityprofile.db.QualityProfileDto;
@@ -38,19 +49,6 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.qualityprofile.index.ActiveRuleIndex;
 import org.sonar.server.search.IndexClient;
 
-import javax.annotation.Nullable;
-import javax.xml.stream.XMLInputFactory;
-import javax.xml.stream.XMLStreamException;
-
-import java.io.Reader;
-import java.io.Writer;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
 @ServerSide
 public class QProfileBackuper {
 
@@ -79,7 +77,7 @@ public class QProfileBackuper {
     writeXml(writer, profile, activeRules.iterator());
   }
 
-  private void writeXml(Writer writer, QualityProfileDto profile, Iterator<ActiveRule> activeRules) {
+  private static void writeXml(Writer writer, QualityProfileDto profile, Iterator<ActiveRule> activeRules) {
     XmlWriter xml = XmlWriter.of(writer).declaration();
     xml.begin("profile");
     xml.prop("name", profile.getName());
index da3c19f30331f50a1acc347fcffd74c24d95925e..c6eb4c000385891bb2898c1b4b180debda9eb4a6 100644 (file)
  */
 package org.sonar.server.qualityprofile;
 
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.StringUtils;
-import org.sonar.api.server.ServerSide;
 import org.sonar.api.profiles.ProfileExporter;
 import org.sonar.api.profiles.ProfileImporter;
 import org.sonar.api.profiles.RulesProfile;
@@ -29,24 +39,13 @@ import org.sonar.api.rules.ActiveRuleParam;
 import org.sonar.api.rules.Rule;
 import org.sonar.api.rules.RuleFinder;
 import org.sonar.api.rules.RulePriority;
+import org.sonar.api.server.ServerSide;
 import org.sonar.api.utils.ValidationMessages;
 import org.sonar.core.persistence.DbSession;
 import org.sonar.core.qualityprofile.db.QualityProfileDto;
 import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.exceptions.NotFoundException;
 
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
 @ServerSide
 public class QProfileExporters {
 
@@ -169,7 +168,7 @@ public class QProfileExporters {
     throw new BadRequestException("No such importer : " + importerKey);
   }
 
-  private void processValidationMessages(ValidationMessages messages, QProfileResult result) {
+  private static void processValidationMessages(ValidationMessages messages, QProfileResult result) {
     if (!messages.getErrors().isEmpty()) {
       throw new BadRequestException(messages);
     }
@@ -177,7 +176,7 @@ public class QProfileExporters {
     result.addInfos(messages.getInfos());
   }
 
-  private RuleActivation toRuleActivation(org.sonar.api.rules.ActiveRule activeRule) {
+  private static RuleActivation toRuleActivation(org.sonar.api.rules.ActiveRule activeRule) {
     RuleActivation ruleActivation = new RuleActivation(activeRule.getRule().ruleKey());
     ruleActivation.setSeverity(activeRule.getSeverity().name());
     for (ActiveRuleParam activeRuleParam : activeRule.getActiveRuleParams()) {
index 267b066a80ba275bd3d6a3b489a2442b4ba723fe..10b67a6499fa17b94084e3f802d95b3a8f632ab2 100644 (file)
@@ -122,11 +122,11 @@ public class QProfileProjectOperations {
     return qualityProfile;
   }
 
-  private void checkPermission(UserSession userSession) {
+  private static void checkPermission(UserSession userSession) {
     userSession.checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
   }
 
-  private void checkPermission(UserSession userSession, String projectKey) {
+  private static void checkPermission(UserSession userSession, String projectKey) {
     if (!userSession.hasGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN) && !userSession.hasProjectPermission(UserRole.ADMIN, projectKey)) {
       throw new ForbiddenException("Insufficient privileges");
     }
index e2f65444e5e3de8c0163b1b08281de478683a7a0..3edc390eaa9fa62dd14abf3cde3c6c57955942cb 100644 (file)
 
 package org.sonar.server.qualityprofile;
 
+import com.google.common.base.Strings;
 import java.util.List;
-
 import javax.annotation.CheckForNull;
-
-import org.sonar.api.server.ServerSide;
 import org.sonar.api.component.Component;
+import org.sonar.api.server.ServerSide;
 import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.user.UserSession;
 import org.sonar.server.util.Validation;
 
-import com.google.common.base.Strings;
-
 /**
  * Use {@link org.sonar.server.qualityprofile.QProfileService} instead
  */
@@ -121,7 +118,7 @@ public class QProfiles {
     projectOperations.removeAllProjects(profileKey, userSession);
   }
 
-  private void checkProfileNameParam(String name) {
+  private static void checkProfileNameParam(String name) {
     if (Strings.isNullOrEmpty(name)) {
       throw new BadRequestException("quality_profiles.please_type_profile_name");
     }
index b5ee1953bd566e3da24e96fa238d6c9ecae6c648..af6181455798958a9107f05552b3978a6729cd59 100644 (file)
@@ -44,12 +44,12 @@ public class ProfilesWs implements WebService {
     controller.done();
   }
 
-  private void defineListAction(NewController controller) {
+  private static void defineListAction(NewController controller) {
     WebService.NewAction action = controller.createAction("list")
       .setDescription("Get a list of profiles")
       .setSince("3.3")
       .setHandler(RailsHandler.INSTANCE)
-      .setResponseExample(Resources.getResource(this.getClass(), "example-list.json"));
+      .setResponseExample(Resources.getResource(ProfilesWs.class, "example-list.json"));
 
     action.createParam("language")
       .setDescription("Profile language")
@@ -60,12 +60,12 @@ public class ProfilesWs implements WebService {
     RailsHandler.addJsonOnlyFormatParam(action);
   }
 
-  private void defineIndexAction(NewController controller) {
+  private static void defineIndexAction(NewController controller) {
     WebService.NewAction action = controller.createAction("index")
       .setDescription("Get a profile")
       .setSince("3.3")
       .setHandler(RailsHandler.INSTANCE)
-      .setResponseExample(Resources.getResource(this.getClass(), "example-index.json"));
+      .setResponseExample(Resources.getResource(ProfilesWs.class, "example-index.json"));
 
     action.createParam("language")
       .setDescription("Profile language")
@@ -77,7 +77,7 @@ public class ProfilesWs implements WebService {
     RailsHandler.addFormatParam(action);
   }
 
-  private void defineBackupAction(NewController controller) {
+  private static void defineBackupAction(NewController controller) {
     WebService.NewAction action = controller.createAction("backup")
       .setDescription("Backup a quality profile. Requires Administer Quality Profiles permission")
       .setSince("3.1")
@@ -94,7 +94,7 @@ public class ProfilesWs implements WebService {
     RailsHandler.addFormatParam(action);
   }
 
-  private void defineRestoreAction(NewController controller) {
+  private static void defineRestoreAction(NewController controller) {
     WebService.NewAction action = controller.createAction("restore")
       .setDescription("Restore a quality profile backup. Requires Administer Quality Profiles permission")
       .setSince("3.1")
@@ -107,7 +107,7 @@ public class ProfilesWs implements WebService {
     RailsHandler.addJsonOnlyFormatParam(action);
   }
 
-  private void defineDestroyAction(NewController controller) {
+  private static void defineDestroyAction(NewController controller) {
     WebService.NewAction action = controller.createAction("destroy")
       .setDescription("Delete a quality profile. Requires Administer Quality Profiles permission")
       .setSince("3.3")
@@ -124,7 +124,7 @@ public class ProfilesWs implements WebService {
       .setExampleValue("Sonar way");
   }
 
-  private void defineSetAsDefaultAction(NewController controller) {
+  private static void defineSetAsDefaultAction(NewController controller) {
     WebService.NewAction action = controller.createAction("set_as_default")
       .setDescription("Set a quality profile as Default. Requires Administer Quality Profiles permission")
       .setSince("3.3")
index ca56bdab1780731c229cd94f10af13408d4bf6c2..69bec5d8b1ffa7fe78e43bb7100fdd5ce8d3c6a3 100644 (file)
@@ -21,13 +21,18 @@ package org.sonar.server.rule;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
+import java.io.Reader;
+import java.util.Collection;
+import java.util.List;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
-import org.sonar.api.server.ServerSide;
 import org.sonar.api.rule.RuleKey;
 import org.sonar.api.rule.RuleStatus;
 import org.sonar.api.rules.RuleParam;
 import org.sonar.api.rules.RuleRepository;
+import org.sonar.api.server.ServerSide;
 import org.sonar.api.server.debt.DebtRemediationFunction;
 import org.sonar.api.server.rule.RuleParamType;
 import org.sonar.api.server.rule.RulesDefinition;
@@ -40,13 +45,6 @@ import org.sonar.server.debt.DebtModelXMLExporter;
 import org.sonar.server.debt.DebtModelXMLExporter.RuleDebt;
 import org.sonar.server.debt.DebtRulesXMLImporter;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.io.Reader;
-import java.util.Collection;
-import java.util.List;
-
 import static com.google.common.collect.Lists.newArrayList;
 
 /**
@@ -124,7 +122,7 @@ public class DeprecatedRulesDefinitionLoader {
     }
   }
 
-  private DebtRemediationFunction remediationFunction(DebtRemediationFunction.Type function, @Nullable String coefficient, @Nullable String offset,
+  private static DebtRemediationFunction remediationFunction(DebtRemediationFunction.Type function, @Nullable String coefficient, @Nullable String offset,
     RulesDefinition.DebtRemediationFunctions functions, String repoKey, String ruleKey) {
     if (DebtRemediationFunction.Type.LINEAR.equals(function) && coefficient != null) {
       return functions.linear(coefficient);
index d17ef7ef29bab2d4e1d39607e0c6be039b28412a..ef3a54b65bcef561a1512e33d282ba275afddf10 100644 (file)
@@ -25,6 +25,14 @@ import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
 import org.apache.commons.lang.ObjectUtils;
 import org.apache.commons.lang.StringUtils;
 import org.picocontainer.Startable;
@@ -49,11 +57,6 @@ import org.sonar.server.db.DbClient;
 import org.sonar.server.qualityprofile.RuleActivator;
 import org.sonar.server.startup.RegisterDebtModel;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.util.*;
-
 import static com.google.common.collect.Lists.newArrayList;
 
 /**
@@ -160,7 +163,7 @@ public class RegisterRules implements Startable {
   }
 
   @CheckForNull
-  private CharacteristicDto characteristic(RulesDefinition.Rule ruleDef, @Nullable Integer overridingCharacteristicId, Map<String, CharacteristicDto> allCharacteristics) {
+  private static CharacteristicDto characteristic(RulesDefinition.Rule ruleDef, @Nullable Integer overridingCharacteristicId, Map<String, CharacteristicDto> allCharacteristics) {
     String subCharacteristic = ruleDef.debtSubCharacteristic();
     String repo = ruleDef.repository().key();
     String ruleKey = ruleDef.key();
index f98fe84c8cb9b2939436af098618659a2a4e4ae4..fa4850d76212b9bb3f8b646503baa149987afd60 100644 (file)
 package org.sonar.server.rule;
 
 import com.google.common.base.Strings;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
 import org.apache.commons.lang.builder.EqualsBuilder;
-import org.sonar.api.server.ServerSide;
 import org.sonar.api.rule.RuleKey;
+import org.sonar.api.server.ServerSide;
 import org.sonar.api.server.debt.DebtRemediationFunction;
 import org.sonar.api.server.debt.internal.DefaultDebtRemediationFunction;
 import org.sonar.core.permission.GlobalPermissions;
@@ -36,9 +38,6 @@ import org.sonar.server.exceptions.BadRequestException;
 import org.sonar.server.exceptions.NotFoundException;
 import org.sonar.server.user.UserSession;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
 /**
  * @deprecated to be dropped in 4.4
  */
@@ -151,7 +150,7 @@ public class RuleOperations {
       .isEquals();
   }
 
-  private void checkPermission(UserSession userSession) {
+  private static void checkPermission(UserSession userSession) {
     userSession.checkLoggedIn();
     userSession.checkGlobalPermission(GlobalPermissions.QUALITY_PROFILE_ADMIN);
   }
index 8d469629b0a707ae6b26149ccfbdc894e42567fe..442d452f1d0286fed113031a3505f73f33775c56 100644 (file)
@@ -22,12 +22,16 @@ package org.sonar.server.rule;
 import com.google.common.base.Strings;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.Multimap;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
 import org.apache.commons.lang.ObjectUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.builder.EqualsBuilder;
-import org.sonar.api.server.ServerSide;
 import org.sonar.api.rule.RuleStatus;
 import org.sonar.api.rule.Severity;
+import org.sonar.api.server.ServerSide;
 import org.sonar.api.server.debt.DebtRemediationFunction;
 import org.sonar.api.utils.System2;
 import org.sonar.core.persistence.DbSession;
@@ -39,11 +43,6 @@ import org.sonar.core.technicaldebt.db.CharacteristicDto;
 import org.sonar.server.db.DbClient;
 import org.sonar.server.user.UserSession;
 
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
-
 import static com.google.common.collect.Lists.newArrayList;
 
 @ServerSide
@@ -141,7 +140,7 @@ public class RuleUpdater {
     }
   }
 
-  private void updateName(RuleUpdate update, Context context) {
+  private static void updateName(RuleUpdate update, Context context) {
     String name = update.getName();
     if (Strings.isNullOrEmpty(name)) {
       throw new IllegalArgumentException("The name is missing");
@@ -150,7 +149,7 @@ public class RuleUpdater {
     }
   }
 
-  private void updateDescription(RuleUpdate update, Context context) {
+  private static void updateDescription(RuleUpdate update, Context context) {
     String description = update.getMarkdownDescription();
     if (Strings.isNullOrEmpty(description)) {
       throw new IllegalArgumentException("The description is missing");
@@ -159,7 +158,7 @@ public class RuleUpdater {
     }
   }
 
-  private void updateSeverity(RuleUpdate update, Context context) {
+  private static void updateSeverity(RuleUpdate update, Context context) {
     String severity = update.getSeverity();
     if (Strings.isNullOrEmpty(severity) || !Severity.ALL.contains(severity)) {
       throw new IllegalArgumentException("The severity is invalid");
@@ -168,7 +167,7 @@ public class RuleUpdater {
     }
   }
 
-  private void updateStatus(RuleUpdate update, Context context) {
+  private static void updateStatus(RuleUpdate update, Context context) {
     RuleStatus status = update.getStatus();
     if (status == null) {
       throw new IllegalArgumentException("The status is missing");
@@ -177,7 +176,7 @@ public class RuleUpdater {
     }
   }
 
-  private void updateTags(RuleUpdate update, Context context) {
+  private static void updateTags(RuleUpdate update, Context context) {
     Set<String> tags = update.getTags();
     if (tags == null || tags.isEmpty()) {
       context.rule.setTags(Collections.<String>emptySet());
@@ -186,7 +185,7 @@ public class RuleUpdater {
     }
   }
 
-  private void updateDebtSubCharacteristic(RuleUpdate update, Context context) {
+  private static void updateDebtSubCharacteristic(RuleUpdate update, Context context) {
     if (update.getDebtSubCharacteristicKey() == null) {
       // set to "none"
       Integer id = context.rule.getDefaultSubCharacteristicId() != null ? RuleDto.DISABLED_CHARACTERISTIC_ID : null;
@@ -216,7 +215,7 @@ public class RuleUpdater {
     }
   }
 
-  private void updateDebtRemediationFunction(RuleUpdate update, Context context) {
+  private static void updateDebtRemediationFunction(RuleUpdate update, Context context) {
     Integer subChar = context.rule.getSubCharacteristicId();
     boolean noChar =
       (context.rule.getDefaultSubCharacteristicId() == null && subChar == null) ||
index 3fc1d2c0b8672f1027ed817220bcf96f8c1c160e..8ad8f75fef0c6c5bb55960d72802a59647b49d55 100644 (file)
@@ -23,17 +23,40 @@ import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Multimap;
+import java.io.Serializable;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Queue;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
 import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
 import org.elasticsearch.action.count.CountRequestBuilder;
 import org.elasticsearch.action.count.CountResponse;
-import org.elasticsearch.action.get.*;
+import org.elasticsearch.action.get.GetRequestBuilder;
+import org.elasticsearch.action.get.GetResponse;
+import org.elasticsearch.action.get.MultiGetItemResponse;
+import org.elasticsearch.action.get.MultiGetRequest;
+import org.elasticsearch.action.get.MultiGetRequestBuilder;
+import org.elasticsearch.action.get.MultiGetResponse;
 import org.elasticsearch.action.search.SearchRequestBuilder;
 import org.elasticsearch.action.search.SearchResponse;
 import org.elasticsearch.action.search.SearchScrollRequestBuilder;
 import org.elasticsearch.common.settings.ImmutableSettings;
 import org.elasticsearch.common.settings.Settings;
 import org.elasticsearch.common.unit.TimeValue;
-import org.elasticsearch.index.query.*;
+import org.elasticsearch.index.query.BoolFilterBuilder;
+import org.elasticsearch.index.query.FilterBuilder;
+import org.elasticsearch.index.query.FilterBuilders;
+import org.elasticsearch.index.query.QueryBuilder;
+import org.elasticsearch.index.query.QueryBuilders;
 import org.elasticsearch.search.SearchHit;
 import org.elasticsearch.search.aggregations.Aggregation;
 import org.elasticsearch.search.aggregations.AggregationBuilders;
@@ -49,12 +72,6 @@ import org.sonar.api.utils.log.Loggers;
 import org.sonar.core.persistence.Dto;
 import org.sonar.server.exceptions.NotFoundException;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.io.Serializable;
-import java.util.*;
-
 /**
  * @deprecated replaced by {@link org.sonar.server.es.BaseIndex}
  */
@@ -273,7 +290,7 @@ public abstract class BaseIndex<DOMAIN, DTO extends Dto<KEY>, KEY extends Serial
     }
   }
 
-  private Map mapUuidPathField(IndexField field) {
+  private static Map mapUuidPathField(IndexField field) {
     return ImmutableMap.of(
       "type", "string",
       "index", "analyzed",
index 0a6d74e96eab35b55c8e7ddcffabd94575be0f91..c55cbf8f5f3f52642206a939deca81604ef576d1 100644 (file)
 package org.sonar.server.source;
 
 import com.google.common.io.Closeables;
-import org.sonar.api.utils.log.Loggers;
-
-import javax.annotation.Nullable;
-
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.StringReader;
 import java.util.Collection;
 import java.util.List;
+import javax.annotation.Nullable;
+import org.sonar.api.utils.log.Loggers;
 
 import static com.google.common.collect.Lists.newArrayList;
 
@@ -127,11 +125,11 @@ class HtmlTextDecorator {
     }
   }
 
-  private boolean canAddLine(int currentLine, @Nullable Integer from) {
+  private static boolean canAddLine(int currentLine, @Nullable Integer from) {
     return from == null || currentLine >= from;
   }
 
-  private boolean shouldStop(int currentLine, @Nullable Integer to) {
+  private static boolean shouldStop(int currentLine, @Nullable Integer to) {
     return to != null && to < currentLine;
   }
 
index 7962fa25364e3301070b049fb66c658736d084b2..e17ae11c323b3a6d49127808e9a74d3e09f44a99 100644 (file)
@@ -72,8 +72,9 @@ public class FileSourceDao implements DaoComponent {
     ResultSet rs = null;
     Reader reader = null;
     try {
-      pstmt = connection.prepareStatement("SELECT line_hashes FROM file_sources WHERE file_uuid=? AND data_type = '" + Type.SOURCE +"'");
+      pstmt = connection.prepareStatement("SELECT line_hashes FROM file_sources WHERE file_uuid=? AND data_type=?");
       pstmt.setString(1, fileUuid);
+      pstmt.setString(2, Type.SOURCE);
       rs = pstmt.executeQuery();
       if (rs.next()) {
         reader = rs.getCharacterStream(1);
index 8a38ae75e6aec8faed41ebe1245a66568cdd1962..bf1e09ca32792e3a6c66b88f0fcb917fafbbf921 100644 (file)
  */
 package org.sonar.server.startup;
 
+import java.io.File;
+import java.io.IOException;
+import javax.annotation.Nullable;
 import org.apache.commons.io.FileUtils;
 import org.sonar.api.config.Settings;
 import org.sonar.home.cache.FileHashes;
 import org.sonar.process.ProcessProperties;
 import org.sonar.server.platform.DefaultServerFileSystem;
 
-import javax.annotation.Nullable;
-
-import java.io.File;
-import java.io.IOException;
-
 public class JdbcDriverDeployer {
 
   private final DefaultServerFileSystem fileSystem;
@@ -66,7 +64,7 @@ public class JdbcDriverDeployer {
     }
   }
 
-  private String driverIndexContent(@Nullable File deployedDriver) {
+  private static String driverIndexContent(@Nullable File deployedDriver) {
     if (deployedDriver != null) {
       String hash = new FileHashes().of(deployedDriver);
       return deployedDriver.getName() + "|" + hash;
index 5fcbeb02a3ed2ba36f5a7929f410166611f8b961..8cbfb2bdbbe83d704030d4ec92a6f7576c0a6472 100644 (file)
@@ -61,7 +61,7 @@ public final class LogServerId {
     }
   }
 
-  private void addQuotedValue(PropertyDto property, StringBuilder message) {
+  private static void addQuotedValue(PropertyDto property, StringBuilder message) {
     message.append("\"");
     message.append(property.getValue());
     message.append("\"\n");
index d8e7e988bc1000039fc49a45e50f4275800b060b..4e70fa30931af614c8cee32f54dd770b78a7f66c 100644 (file)
@@ -20,6 +20,7 @@
 
 package org.sonar.server.user;
 
+import java.util.List;
 import org.sonar.api.server.ServerSide;
 import org.sonar.core.user.GroupMembership;
 import org.sonar.core.user.GroupMembershipDao;
@@ -29,8 +30,6 @@ import org.sonar.core.user.UserDao;
 import org.sonar.core.user.UserDto;
 import org.sonar.server.exceptions.NotFoundException;
 
-import java.util.List;
-
 import static com.google.common.collect.Lists.newArrayList;
 
 @ServerSide
@@ -88,7 +87,7 @@ public class GroupMembershipFinder {
     return userDto.getId();
   }
 
-  private List<GroupMembership> toGroupMembership(List<GroupMembershipDto> dtos) {
+  private static List<GroupMembership> toGroupMembership(List<GroupMembershipDto> dtos) {
     List<GroupMembership> groups = newArrayList();
     for (GroupMembershipDto groupMembershipDto : dtos) {
       groups.add(groupMembershipDto.toGroupMembership());
index c5932c8b5c07b37fc2b57b779e2e032650b9f59a..067a659dc5e8e413234620ea157140f345d4f6aa 100644 (file)
 
 package org.sonar.server.user;
 
+import java.util.Map;
 import org.sonar.api.server.ServerSide;
 import org.sonar.core.user.GroupMembershipQuery;
 import org.sonar.server.util.RubyUtils;
 
-import java.util.Map;
-
 /**
  * Used by ruby code <pre>Internal.group_membership</pre>
  */
@@ -55,7 +54,7 @@ public class GroupMembershipService {
     return builder.build();
   }
 
-  private String membership(Map<String, Object> params) {
+  private static String membership(Map<String, Object> params) {
     String selected = (String) params.get("selected");
     if (SELECTED_MEMBERSHIP.equals(selected)) {
       return GroupMembershipQuery.IN;
index 302b522b58cc9e3e5f006e845709ecd405ffd3e5..44532f11e2ea96b032aa118ce4374be69bd10b81 100644 (file)
@@ -20,6 +20,8 @@
 
 package org.sonar.server.user.index;
 
+import java.sql.Connection;
+import java.util.Iterator;
 import org.apache.commons.dbutils.DbUtils;
 import org.elasticsearch.action.update.UpdateRequest;
 import org.sonar.core.persistence.DbSession;
@@ -28,9 +30,6 @@ import org.sonar.server.es.BaseIndexer;
 import org.sonar.server.es.BulkIndexer;
 import org.sonar.server.es.EsClient;
 
-import java.sql.Connection;
-import java.util.Iterator;
-
 public class UserIndexer extends BaseIndexer {
 
   private final DbClient dbClient;
@@ -71,7 +70,7 @@ public class UserIndexer extends BaseIndexer {
     return maxUpdatedAt;
   }
 
-  private UpdateRequest newUpsertRequest(UserDoc user) {
+  private static UpdateRequest newUpsertRequest(UserDoc user) {
     return new UpdateRequest(UserIndexDefinition.INDEX, UserIndexDefinition.TYPE_USER, user.login())
       .doc(user.getFields())
       .upsert(user.getFields());
index 52c3c89639fe01d137ff0527e1deee0d09cf93a7..facfd4ec20f2720e2f38b4e3dc2058594f4069e4 100644 (file)
@@ -36,7 +36,7 @@ public class FavoritesWs implements WebService {
     controller.done();
   }
 
-  private void defineIndexAction(NewController controller) {
+  private static void defineIndexAction(NewController controller) {
     controller.createAction("index")
       .setDescription("Documentation of this web service is available <a href=\"http://redirect.sonarsource.com/doc/old-web-service-api.html\">here</a>")
       .setSince("2.6")
index d3cf1fa69fe43a89c511d34d63020f242c8dbe61..22fa4a1b4ed8e67ca9752cce12497fe198d47fc2 100644 (file)
@@ -105,7 +105,7 @@ public class UpdateAction implements UsersWsAction {
     json.endObject().close();
   }
 
-  private void writeUser(JsonWriter json, UserDoc user) {
+  private static void writeUser(JsonWriter json, UserDoc user) {
     json.name("user").beginObject()
       .prop("login", user.login())
       .prop("name", user.name())
index f4db43de3e92863d503b082ef812cab19deef49f..976f19834e8ca3b0d709f4d8e3bffa30ff355a13 100644 (file)
@@ -36,7 +36,7 @@ public class UserPropertiesWs implements WebService {
     controller.done();
   }
 
-  private void defineIndexAction(NewController controller) {
+  private static void defineIndexAction(NewController controller) {
     controller.createAction("index")
       .setDescription("Documentation of this web service is available <a href=\"http://redirect.sonarsource.com/doc/old-web-service-api.html\">here</a>")
       .setSince("2.6")
index 93944e0cb387d19f9589e715f3a6f5898b4ba4ac..1c12e86c163b3142e17cda55442789141864ff75 100644 (file)
@@ -20,6 +20,8 @@
 
 package org.sonar.server.view.index;
 
+import java.util.List;
+import java.util.Map;
 import org.elasticsearch.action.update.UpdateRequest;
 import org.sonar.core.component.ComponentDto;
 import org.sonar.core.component.UuidWithProjectUuidDto;
@@ -30,9 +32,6 @@ import org.sonar.server.es.BulkIndexer;
 import org.sonar.server.es.EsClient;
 import org.sonar.server.issue.index.IssueIndex;
 
-import java.util.List;
-import java.util.Map;
-
 import static com.google.common.collect.Maps.newHashMap;
 
 public class ViewIndexer extends BaseIndexer {
@@ -121,7 +120,7 @@ public class ViewIndexer extends BaseIndexer {
     }
   }
 
-  private UpdateRequest newUpsertRequest(ViewDoc doc) {
+  private static UpdateRequest newUpsertRequest(ViewDoc doc) {
     return new UpdateRequest(ViewIndexDefinition.INDEX, ViewIndexDefinition.TYPE_VIEW, doc.uuid())
       .doc(doc.getFields())
       .upsert(doc.getFields());
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistComponentsAndSnapshotsStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistComponentsAndSnapshotsStepTest.java
new file mode 100644 (file)
index 0000000..6ff9fce
--- /dev/null
@@ -0,0 +1,745 @@
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2014 SonarSource
+ * mailto:contact AT sonarsource DOT com
+ *
+ * SonarQube is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * SonarQube is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+package org.sonar.server.computation.step;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.sonar.api.utils.System2;
+import org.sonar.batch.protocol.Constants;
+import org.sonar.batch.protocol.output.BatchReport;
+import org.sonar.core.component.ComponentDto;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.core.persistence.DbTester;
+import org.sonar.server.component.ComponentTesting;
+import org.sonar.server.component.db.ComponentDao;
+import org.sonar.server.computation.batch.BatchReportReaderRule;
+import org.sonar.server.computation.batch.TreeRootHolderRule;
+import org.sonar.server.computation.component.Component;
+import org.sonar.server.computation.component.DbIdsRepository;
+import org.sonar.server.computation.component.DumbComponent;
+import org.sonar.server.db.DbClient;
+import org.sonar.test.DbTests;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+
+@Category(DbTests.class)
+public class PersistComponentsAndSnapshotsStepTest extends BaseStepTest {
+
+  private static final String PROJECT_KEY = "PROJECT_KEY";
+
+  @ClassRule
+  public static DbTester dbTester = new DbTester();
+
+  @Rule
+  public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule();
+
+  @Rule
+  public BatchReportReaderRule reportReader = new BatchReportReaderRule();
+
+  System2 system2 = mock(System2.class);
+
+  DbIdsRepository dbIdsRepository;
+
+  DbSession session;
+
+  DbClient dbClient;
+
+  PersistComponentsAndSnapshotsStep sut;
+
+  @Before
+  public void setup() throws Exception {
+    dbTester.truncateTables();
+    session = dbTester.myBatis().openSession(false);
+    dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), new ComponentDao());
+
+    reportReader.setMetadata(BatchReport.Metadata.newBuilder().build());
+
+    dbIdsRepository = new DbIdsRepository();
+    sut = new PersistComponentsAndSnapshotsStep(system2, dbClient, treeRootHolder, reportReader, dbIdsRepository);
+  }
+
+  @Override
+  protected ComputationStep step() {
+    return sut;
+  }
+
+  @After
+  public void tearDown() {
+    session.close();
+  }
+
+  @Test
+  public void persist_components() throws Exception {
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(1)
+      .setType(Constants.ComponentType.PROJECT)
+      .setKey(PROJECT_KEY)
+      .setName("Project")
+      .setDescription("Project description")
+      .addChildRef(2)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(2)
+      .setType(Constants.ComponentType.MODULE)
+      .setKey("MODULE_KEY")
+      .setPath("module")
+      .setName("Module")
+      .setDescription("Module description")
+      .addChildRef(3)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(3)
+      .setType(Constants.ComponentType.DIRECTORY)
+      .setPath("src/main/java/dir")
+      .addChildRef(4)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(4)
+      .setType(Constants.ComponentType.FILE)
+      .setPath("src/main/java/dir/Foo.java")
+      .setLanguage("java")
+      .build());
+
+    Component file = new DumbComponent(Component.Type.FILE, 4, "DEFG", "MODULE_KEY:src/main/java/dir/Foo.java");
+    Component directory = new DumbComponent(Component.Type.DIRECTORY, 3, "CDEF", "MODULE_KEY:src/main/java/dir", file);
+    Component module = new DumbComponent(Component.Type.MODULE, 2, "BCDE", "MODULE_KEY", directory);
+    Component project = new DumbComponent(Component.Type.PROJECT, 1, "ABCD", PROJECT_KEY, module);
+    treeRootHolder.setRoot(project);
+
+    sut.execute();
+
+    assertThat(dbTester.countRowsOfTable("projects")).isEqualTo(4);
+
+    ComponentDto projectDto = dbClient.componentDao().selectNullableByKey(session, PROJECT_KEY);
+    assertThat(projectDto).isNotNull();
+    assertThat(projectDto.name()).isEqualTo("Project");
+    assertThat(projectDto.description()).isEqualTo("Project description");
+    assertThat(projectDto.path()).isNull();
+    assertThat(projectDto.uuid()).isEqualTo("ABCD");
+    assertThat(projectDto.moduleUuid()).isNull();
+    assertThat(projectDto.moduleUuidPath()).isEqualTo("." + projectDto.uuid() + ".");
+    assertThat(projectDto.projectUuid()).isEqualTo(projectDto.uuid());
+    assertThat(projectDto.qualifier()).isEqualTo("TRK");
+    assertThat(projectDto.scope()).isEqualTo("PRJ");
+    assertThat(projectDto.parentProjectId()).isNull();
+
+    ComponentDto moduleDto = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY");
+    assertThat(moduleDto).isNotNull();
+    assertThat(moduleDto.name()).isEqualTo("Module");
+    assertThat(moduleDto.description()).isEqualTo("Module description");
+    assertThat(moduleDto.path()).isEqualTo("module");
+    assertThat(moduleDto.uuid()).isEqualTo("BCDE");
+    assertThat(moduleDto.moduleUuid()).isEqualTo(projectDto.uuid());
+    assertThat(moduleDto.moduleUuidPath()).isEqualTo(projectDto.moduleUuidPath() + moduleDto.uuid() + ".");
+    assertThat(moduleDto.projectUuid()).isEqualTo(projectDto.uuid());
+    assertThat(moduleDto.qualifier()).isEqualTo("BRC");
+    assertThat(moduleDto.scope()).isEqualTo("PRJ");
+    assertThat(moduleDto.parentProjectId()).isEqualTo(projectDto.getId());
+
+    ComponentDto directoryDto = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY:src/main/java/dir");
+    assertThat(directoryDto).isNotNull();
+    assertThat(directoryDto.name()).isEqualTo("src/main/java/dir");
+    assertThat(directoryDto.description()).isNull();
+    assertThat(directoryDto.path()).isEqualTo("src/main/java/dir");
+    assertThat(directoryDto.uuid()).isEqualTo("CDEF");
+    assertThat(directoryDto.moduleUuid()).isEqualTo(moduleDto.uuid());
+    assertThat(directoryDto.moduleUuidPath()).isEqualTo(moduleDto.moduleUuidPath());
+    assertThat(directoryDto.projectUuid()).isEqualTo(projectDto.uuid());
+    assertThat(directoryDto.qualifier()).isEqualTo("DIR");
+    assertThat(directoryDto.scope()).isEqualTo("DIR");
+    assertThat(directoryDto.parentProjectId()).isEqualTo(moduleDto.getId());
+
+    ComponentDto fileDto = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY:src/main/java/dir/Foo.java");
+    assertThat(fileDto).isNotNull();
+    assertThat(fileDto.name()).isEqualTo("Foo.java");
+    assertThat(fileDto.description()).isNull();
+    assertThat(fileDto.path()).isEqualTo("src/main/java/dir/Foo.java");
+    assertThat(fileDto.language()).isEqualTo("java");
+    assertThat(fileDto.uuid()).isEqualTo("DEFG");
+    assertThat(fileDto.moduleUuid()).isEqualTo(moduleDto.uuid());
+    assertThat(fileDto.moduleUuidPath()).isEqualTo(moduleDto.moduleUuidPath());
+    assertThat(fileDto.projectUuid()).isEqualTo(projectDto.uuid());
+    assertThat(fileDto.qualifier()).isEqualTo("FIL");
+    assertThat(fileDto.scope()).isEqualTo("FIL");
+    assertThat(fileDto.parentProjectId()).isEqualTo(moduleDto.getId());
+
+    assertThat(dbIdsRepository.getComponentId(project)).isEqualTo(projectDto.getId());
+    assertThat(dbIdsRepository.getComponentId(module)).isEqualTo(moduleDto.getId());
+    assertThat(dbIdsRepository.getComponentId(directory)).isEqualTo(directoryDto.getId());
+    assertThat(dbIdsRepository.getComponentId(file)).isEqualTo(fileDto.getId());
+  }
+
+  @Test
+  public void persist_file_directly_attached_on_root_directory() throws Exception {
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(1)
+      .setType(Constants.ComponentType.PROJECT)
+      .setKey(PROJECT_KEY)
+      .setName("Project")
+      .addChildRef(2)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(2)
+      .setType(Constants.ComponentType.DIRECTORY)
+      .setPath("/")
+      .addChildRef(3)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(3)
+      .setType(Constants.ComponentType.FILE)
+      .setPath("pom.xml")
+      .build());
+
+    treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", PROJECT_KEY,
+      new DumbComponent(Component.Type.DIRECTORY, 2, "CDEF", PROJECT_KEY + ":/",
+        new DumbComponent(Component.Type.FILE, 3, "DEFG", PROJECT_KEY + ":pom.xml"))));
+
+    sut.execute();
+
+    ComponentDto directory = dbClient.componentDao().selectNullableByKey(session, "PROJECT_KEY:/");
+    assertThat(directory).isNotNull();
+    assertThat(directory.name()).isEqualTo("/");
+    assertThat(directory.path()).isEqualTo("/");
+
+    ComponentDto file = dbClient.componentDao().selectNullableByKey(session, "PROJECT_KEY:pom.xml");
+    assertThat(file).isNotNull();
+    assertThat(file.name()).isEqualTo("pom.xml");
+    assertThat(file.path()).isEqualTo("pom.xml");
+  }
+
+  @Test
+  public void persist_unit_test() throws Exception {
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(1)
+      .setType(Constants.ComponentType.PROJECT)
+      .setKey(PROJECT_KEY)
+      .setName("Project")
+      .addChildRef(2)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(2)
+      .setType(Constants.ComponentType.DIRECTORY)
+      .setPath("src/test/java/dir")
+      .addChildRef(3)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(3)
+      .setType(Constants.ComponentType.FILE)
+      .setPath("src/test/java/dir/FooTest.java")
+      .setIsTest(true)
+      .build());
+
+    treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", PROJECT_KEY,
+      new DumbComponent(Component.Type.DIRECTORY, 2, "CDEF", PROJECT_KEY + ":src/test/java/dir",
+        new DumbComponent(Component.Type.FILE, 3, "DEFG", PROJECT_KEY + ":src/test/java/dir/FooTest.java"))));
+
+    sut.execute();
+
+    ComponentDto file = dbClient.componentDao().selectNullableByKey(session, PROJECT_KEY + ":src/test/java/dir/FooTest.java");
+    assertThat(file).isNotNull();
+    assertThat(file.name()).isEqualTo("FooTest.java");
+    assertThat(file.path()).isEqualTo("src/test/java/dir/FooTest.java");
+    assertThat(file.qualifier()).isEqualTo("UTS");
+    assertThat(file.scope()).isEqualTo("FIL");
+  }
+
+  @Test
+  public void persist_only_new_components() throws Exception {
+    // Project amd module already exists
+    ComponentDto project = ComponentTesting.newProjectDto("ABCD").setKey(PROJECT_KEY).setName("Project");
+    dbClient.componentDao().insert(session, project);
+    ComponentDto module = ComponentTesting.newModuleDto("BCDE", project).setKey("MODULE_KEY").setName("Module");
+    dbClient.componentDao().insert(session, module);
+    session.commit();
+
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(1)
+      .setType(Constants.ComponentType.PROJECT)
+      .setKey(PROJECT_KEY)
+      .setName("Project")
+      .addChildRef(2)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(2)
+      .setType(Constants.ComponentType.MODULE)
+      .setKey("MODULE_KEY")
+      .setName("Module")
+      .addChildRef(3)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(3)
+      .setType(Constants.ComponentType.DIRECTORY)
+      .setPath("src/main/java/dir")
+      .addChildRef(4)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(4)
+      .setType(Constants.ComponentType.FILE)
+      .setPath("src/main/java/dir/Foo.java")
+      .build());
+
+    treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", PROJECT_KEY,
+      new DumbComponent(Component.Type.MODULE, 2, "BCDE", "MODULE_KEY",
+        new DumbComponent(Component.Type.DIRECTORY, 3, "CDEF", "MODULE_KEY:src/main/java/dir",
+          new DumbComponent(Component.Type.FILE, 4, "DEFG", "MODULE_KEY:src/main/java/dir/Foo.java")))));
+
+    sut.execute();
+
+    assertThat(dbTester.countRowsOfTable("projects")).isEqualTo(4);
+
+    ComponentDto projectReloaded = dbClient.componentDao().selectNullableByKey(session, PROJECT_KEY);
+    assertThat(projectReloaded.getId()).isEqualTo(project.getId());
+    assertThat(projectReloaded.uuid()).isEqualTo(project.uuid());
+
+    ComponentDto moduleReloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY");
+    assertThat(moduleReloaded.getId()).isEqualTo(module.getId());
+    assertThat(moduleReloaded.uuid()).isEqualTo(module.uuid());
+    assertThat(moduleReloaded.moduleUuid()).isEqualTo(module.moduleUuid());
+    assertThat(moduleReloaded.moduleUuidPath()).isEqualTo(module.moduleUuidPath());
+    assertThat(moduleReloaded.projectUuid()).isEqualTo(module.projectUuid());
+    assertThat(moduleReloaded.parentProjectId()).isEqualTo(module.parentProjectId());
+
+    ComponentDto directory = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY:src/main/java/dir");
+    assertThat(directory).isNotNull();
+    assertThat(directory.moduleUuid()).isEqualTo(module.uuid());
+    assertThat(directory.moduleUuidPath()).isEqualTo(module.moduleUuidPath());
+    assertThat(directory.projectUuid()).isEqualTo(project.uuid());
+    assertThat(directory.parentProjectId()).isEqualTo(module.getId());
+
+    ComponentDto file = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY:src/main/java/dir/Foo.java");
+    assertThat(file).isNotNull();
+    assertThat(file.moduleUuid()).isEqualTo(module.uuid());
+    assertThat(file.moduleUuidPath()).isEqualTo(module.moduleUuidPath());
+    assertThat(file.projectUuid()).isEqualTo(project.uuid());
+    assertThat(file.parentProjectId()).isEqualTo(module.getId());
+  }
+
+  @Test
+  public void compute_parent_project_id() throws Exception {
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(1)
+      .setType(Constants.ComponentType.PROJECT)
+      .setKey(PROJECT_KEY)
+      .setName("Project")
+      .addChildRef(2)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(2)
+      .setType(Constants.ComponentType.MODULE)
+      .setKey("MODULE_KEY")
+      .setName("Module")
+      .addChildRef(3)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(3)
+      .setType(Constants.ComponentType.MODULE)
+      .setKey("SUB_MODULE_1_KEY")
+      .setName("Sub Module 1")
+      .addChildRef(4)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(4)
+      .setType(Constants.ComponentType.MODULE)
+      .setKey("SUB_MODULE_2_KEY")
+      .setName("Sub Module 2")
+      .addChildRef(5)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(5)
+      .setType(Constants.ComponentType.DIRECTORY)
+      .setPath("src/main/java/dir")
+      .build());
+
+    treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", PROJECT_KEY,
+      new DumbComponent(Component.Type.MODULE, 2, "BCDE", "MODULE_KEY",
+        new DumbComponent(Component.Type.MODULE, 3, "CDEF", "SUB_MODULE_1_KEY",
+          new DumbComponent(Component.Type.MODULE, 4, "DEFG", "SUB_MODULE_2_KEY",
+            new DumbComponent(Component.Type.DIRECTORY, 5, "EFGH", "SUB_MODULE_2_KEY:src/main/java/dir"))))));
+
+    sut.execute();
+
+    assertThat(dbTester.countRowsOfTable("projects")).isEqualTo(5);
+
+    ComponentDto project = dbClient.componentDao().selectNullableByKey(session, PROJECT_KEY);
+    assertThat(project).isNotNull();
+    assertThat(project.parentProjectId()).isNull();
+
+    ComponentDto module = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY");
+    assertThat(module).isNotNull();
+    assertThat(module.parentProjectId()).isEqualTo(project.getId());
+
+    ComponentDto subModule1 = dbClient.componentDao().selectNullableByKey(session, "SUB_MODULE_1_KEY");
+    assertThat(subModule1).isNotNull();
+    assertThat(subModule1.parentProjectId()).isEqualTo(project.getId());
+
+    ComponentDto subModule2 = dbClient.componentDao().selectNullableByKey(session, "SUB_MODULE_2_KEY");
+    assertThat(subModule2).isNotNull();
+    assertThat(subModule2.parentProjectId()).isEqualTo(project.getId());
+
+    ComponentDto directory = dbClient.componentDao().selectNullableByKey(session, "SUB_MODULE_2_KEY:src/main/java/dir");
+    assertThat(directory).isNotNull();
+    assertThat(directory.parentProjectId()).isEqualTo(subModule2.getId());
+  }
+
+  @Test
+  public void persist_multi_modules() throws Exception {
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(1)
+      .setType(Constants.ComponentType.PROJECT)
+      .setKey(PROJECT_KEY)
+      .setName("Project")
+      .addChildRef(2)
+      .addChildRef(4)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(2)
+      .setType(Constants.ComponentType.MODULE)
+      .setKey("MODULE_A")
+      .setName("Module A")
+      .addChildRef(3)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(3)
+      .setType(Constants.ComponentType.MODULE)
+      .setKey("SUB_MODULE_A")
+      .setName("Sub Module A")
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(4)
+      .setType(Constants.ComponentType.MODULE)
+      .setKey("MODULE_B")
+      .setName("Module B")
+      .build());
+
+    treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", PROJECT_KEY,
+      new DumbComponent(Component.Type.MODULE, 2, "BCDE", "MODULE_A",
+        new DumbComponent(Component.Type.MODULE, 3, "DEFG", "SUB_MODULE_A")),
+      new DumbComponent(Component.Type.MODULE, 4, "CDEF", "MODULE_B")));
+
+    sut.execute();
+
+    assertThat(dbTester.countRowsOfTable("projects")).isEqualTo(4);
+
+    ComponentDto project = dbClient.componentDao().selectNullableByKey(session, PROJECT_KEY);
+    assertThat(project).isNotNull();
+    assertThat(project.moduleUuid()).isNull();
+    assertThat(project.moduleUuidPath()).isEqualTo("." + project.uuid() + ".");
+    assertThat(project.parentProjectId()).isNull();
+
+    ComponentDto moduleA = dbClient.componentDao().selectNullableByKey(session, "MODULE_A");
+    assertThat(moduleA).isNotNull();
+    assertThat(moduleA.moduleUuid()).isEqualTo(project.uuid());
+    assertThat(moduleA.moduleUuidPath()).isEqualTo(project.moduleUuidPath() + moduleA.uuid() + ".");
+    assertThat(moduleA.parentProjectId()).isEqualTo(project.getId());
+
+    ComponentDto subModuleA = dbClient.componentDao().selectNullableByKey(session, "SUB_MODULE_A");
+    assertThat(subModuleA).isNotNull();
+    assertThat(subModuleA.moduleUuid()).isEqualTo(moduleA.uuid());
+    assertThat(subModuleA.moduleUuidPath()).isEqualTo(moduleA.moduleUuidPath() + subModuleA.uuid() + ".");
+    assertThat(subModuleA.parentProjectId()).isEqualTo(project.getId());
+
+    ComponentDto moduleB = dbClient.componentDao().selectNullableByKey(session, "MODULE_B");
+    assertThat(moduleB).isNotNull();
+    assertThat(moduleB.moduleUuid()).isEqualTo(project.uuid());
+    assertThat(moduleB.moduleUuidPath()).isEqualTo(project.moduleUuidPath() + moduleB.uuid() + ".");
+    assertThat(moduleB.parentProjectId()).isEqualTo(project.getId());
+  }
+
+  @Test
+  public void nothing_to_persist() throws Exception {
+    ComponentDto project = ComponentTesting.newProjectDto("ABCD").setKey(PROJECT_KEY).setName("Project");
+    dbClient.componentDao().insert(session, project);
+    ComponentDto module = ComponentTesting.newModuleDto("BCDE", project).setKey("MODULE_KEY").setName("Module");
+    dbClient.componentDao().insert(session, module);
+    ComponentDto directory = ComponentTesting.newDirectory(module, "src/main/java/dir").setUuid("CDEF").setKey("MODULE_KEY:src/main/java/dir");
+    ComponentDto file = ComponentTesting.newFileDto(module, "DEFG").setPath("src/main/java/dir/Foo.java").setName("Foo.java").setKey("MODULE_KEY:src/main/java/dir/Foo.java");
+    dbClient.componentDao().insert(session, directory, file);
+    session.commit();
+
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(1)
+      .setType(Constants.ComponentType.PROJECT)
+      .setKey(PROJECT_KEY)
+      .setName("Project")
+      .addChildRef(2)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(2)
+      .setType(Constants.ComponentType.MODULE)
+      .setKey("MODULE_KEY")
+      .setName("Module")
+      .addChildRef(3)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(3)
+      .setType(Constants.ComponentType.DIRECTORY)
+      .setPath("src/main/java/dir")
+      .addChildRef(4)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(4)
+      .setType(Constants.ComponentType.FILE)
+      .setPath("src/main/java/dir/Foo.java")
+      .build());
+
+    treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", PROJECT_KEY,
+      new DumbComponent(Component.Type.MODULE, 2, "BCDE", "MODULE_KEY",
+        new DumbComponent(Component.Type.DIRECTORY, 3, "CDEF", "MODULE_KEY:src/main/java/dir",
+          new DumbComponent(Component.Type.FILE, 4, "DEFG", "MODULE_KEY:src/main/java/dir/Foo.java")))));
+
+    sut.execute();
+
+    assertThat(dbTester.countRowsOfTable("projects")).isEqualTo(4);
+    assertThat(dbClient.componentDao().selectNullableByKey(session, PROJECT_KEY).getId()).isEqualTo(project.getId());
+    assertThat(dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY").getId()).isEqualTo(module.getId());
+    assertThat(dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY:src/main/java/dir").getId()).isEqualTo(directory.getId());
+    assertThat(dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY:src/main/java/dir/Foo.java").getId()).isEqualTo(file.getId());
+
+    ComponentDto projectReloaded = dbClient.componentDao().selectNullableByKey(session, PROJECT_KEY);
+    assertThat(projectReloaded.getId()).isEqualTo(project.getId());
+    assertThat(projectReloaded.uuid()).isEqualTo(project.uuid());
+    assertThat(projectReloaded.moduleUuid()).isEqualTo(project.moduleUuid());
+    assertThat(projectReloaded.moduleUuidPath()).isEqualTo(project.moduleUuidPath());
+    assertThat(projectReloaded.projectUuid()).isEqualTo(project.projectUuid());
+    assertThat(projectReloaded.parentProjectId()).isEqualTo(project.parentProjectId());
+
+    ComponentDto moduleReloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY");
+    assertThat(moduleReloaded.getId()).isEqualTo(module.getId());
+    assertThat(moduleReloaded.uuid()).isEqualTo(module.uuid());
+    assertThat(moduleReloaded.moduleUuid()).isEqualTo(module.moduleUuid());
+    assertThat(moduleReloaded.moduleUuidPath()).isEqualTo(module.moduleUuidPath());
+    assertThat(moduleReloaded.projectUuid()).isEqualTo(module.projectUuid());
+    assertThat(moduleReloaded.parentProjectId()).isEqualTo(module.parentProjectId());
+
+    ComponentDto directoryReloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY:src/main/java/dir");
+    assertThat(directoryReloaded).isNotNull();
+    assertThat(directoryReloaded.uuid()).isEqualTo(directory.uuid());
+    assertThat(directoryReloaded.moduleUuid()).isEqualTo(directory.moduleUuid());
+    assertThat(directoryReloaded.moduleUuidPath()).isEqualTo(directory.moduleUuidPath());
+    assertThat(directoryReloaded.projectUuid()).isEqualTo(directory.projectUuid());
+    assertThat(directoryReloaded.parentProjectId()).isEqualTo(directory.parentProjectId());
+    assertThat(directoryReloaded.name()).isEqualTo(directory.name());
+    assertThat(directoryReloaded.path()).isEqualTo(directory.path());
+
+    ComponentDto fileReloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY:src/main/java/dir/Foo.java");
+    assertThat(fileReloaded).isNotNull();
+    assertThat(fileReloaded.uuid()).isEqualTo(file.uuid());
+    assertThat(fileReloaded.moduleUuid()).isEqualTo(file.moduleUuid());
+    assertThat(fileReloaded.moduleUuidPath()).isEqualTo(file.moduleUuidPath());
+    assertThat(fileReloaded.projectUuid()).isEqualTo(file.projectUuid());
+    assertThat(fileReloaded.parentProjectId()).isEqualTo(file.parentProjectId());
+    assertThat(fileReloaded.name()).isEqualTo(file.name());
+    assertThat(fileReloaded.path()).isEqualTo(file.path());
+  }
+
+  @Test
+  public void update_module_name() throws Exception {
+    ComponentDto project = ComponentTesting.newProjectDto("ABCD").setKey(PROJECT_KEY).setName("Project");
+    dbClient.componentDao().insert(session, project);
+    ComponentDto module = ComponentTesting.newModuleDto("BCDE", project).setKey("MODULE_KEY").setName("Module").setPath("path");
+    dbClient.componentDao().insert(session, module);
+    session.commit();
+
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(1)
+      .setType(Constants.ComponentType.PROJECT)
+      .setKey(PROJECT_KEY)
+      .setName("New project name")
+      .addChildRef(2)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(2)
+      .setType(Constants.ComponentType.MODULE)
+      .setKey("MODULE_KEY")
+      .setName("New module name")
+      .setPath("New path")
+      .build());
+
+    treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", PROJECT_KEY,
+      new DumbComponent(Component.Type.MODULE, 2, "BCDE", "MODULE_KEY")));
+    
+    sut.execute();
+
+    ComponentDto projectReloaded = dbClient.componentDao().selectNullableByKey(session, PROJECT_KEY);
+    assertThat(projectReloaded.name()).isEqualTo("New project name");
+
+    ComponentDto moduleReloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY");
+    assertThat(moduleReloaded.name()).isEqualTo("New module name");
+  }
+
+  @Test
+  public void update_module_description() throws Exception {
+    ComponentDto project = ComponentTesting.newProjectDto("ABCD").setKey(PROJECT_KEY).setName("Project").setDescription("Project description");
+    dbClient.componentDao().insert(session, project);
+    ComponentDto module = ComponentTesting.newModuleDto("BCDE", project).setKey("MODULE_KEY").setName("Module");
+    dbClient.componentDao().insert(session, module);
+    session.commit();
+
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(1)
+      .setType(Constants.ComponentType.PROJECT)
+      .setKey(PROJECT_KEY)
+      .setName("Project")
+      .setDescription("New project description")
+      .addChildRef(2)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(2)
+      .setType(Constants.ComponentType.MODULE)
+      .setKey("MODULE_KEY")
+      .setName("Module")
+      .setDescription("New module description")
+      .build());
+
+    treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", PROJECT_KEY,
+      new DumbComponent(Component.Type.MODULE, 2, "BCDE", "MODULE_KEY")));
+    
+    sut.execute();
+
+    ComponentDto projectReloaded = dbClient.componentDao().selectNullableByKey(session, PROJECT_KEY);
+    assertThat(projectReloaded.description()).isEqualTo("New project description");
+
+    ComponentDto moduleReloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY");
+    assertThat(moduleReloaded.description()).isEqualTo("New module description");
+  }
+
+  @Test
+  public void update_module_path() throws Exception {
+    ComponentDto project = ComponentTesting.newProjectDto("ABCD").setKey(PROJECT_KEY).setName("Project");
+    dbClient.componentDao().insert(session, project);
+    ComponentDto module = ComponentTesting.newModuleDto("BCDE", project).setKey("MODULE_KEY").setName("Module").setPath("path");
+    dbClient.componentDao().insert(session, module);
+    session.commit();
+
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(1)
+      .setType(Constants.ComponentType.PROJECT)
+      .setKey(PROJECT_KEY)
+      .setName("Project")
+      .addChildRef(2)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(2)
+      .setType(Constants.ComponentType.MODULE)
+      .setKey("MODULE_KEY")
+      .setName("Module")
+      .setPath("New path")
+      .build());
+
+    treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", PROJECT_KEY,
+      new DumbComponent(Component.Type.MODULE, 2, "BCDE", "MODULE_KEY")));
+
+    sut.execute();
+
+    ComponentDto moduleReloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY");
+    assertThat(moduleReloaded.path()).isEqualTo("New path");
+  }
+
+  @Test
+  public void update_module_uuid_when_moving_a_module() throws Exception {
+    ComponentDto project = ComponentTesting.newProjectDto("ABCD").setKey(PROJECT_KEY).setName("Project");
+    dbClient.componentDao().insert(session, project);
+    ComponentDto moduleA = ComponentTesting.newModuleDto("EDCB", project).setKey("MODULE_A").setName("Module A");
+    ComponentDto moduleB = ComponentTesting.newModuleDto("BCDE", project).setKey("MODULE_B").setName("Module B");
+    dbClient.componentDao().insert(session, moduleA, moduleB);
+    ComponentDto directory = ComponentTesting.newDirectory(moduleB, "src/main/java/dir").setUuid("CDEF").setKey("MODULE_B:src/main/java/dir");
+    ComponentDto file = ComponentTesting.newFileDto(moduleB, "DEFG").setPath("src/main/java/dir/Foo.java").setName("Foo.java").setKey("MODULE_B:src/main/java/dir/Foo.java");
+    dbClient.componentDao().insert(session, directory, file);
+    session.commit();
+
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(1)
+      .setType(Constants.ComponentType.PROJECT)
+      .setKey(PROJECT_KEY)
+      .setName("Project")
+      .addChildRef(2)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(2)
+      .setType(Constants.ComponentType.MODULE)
+      .setKey("MODULE_A")
+      .setName("Module A")
+      .addChildRef(3)
+      .build());
+    // Module B is now a sub module of module A
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(3)
+      .setType(Constants.ComponentType.MODULE)
+      .setKey("MODULE_B")
+      .setName("Module B")
+      .addChildRef(4)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(4)
+      .setType(Constants.ComponentType.DIRECTORY)
+      .setPath("src/main/java/dir")
+      .addChildRef(5)
+      .build());
+    reportReader.putComponent(BatchReport.Component.newBuilder()
+      .setRef(5)
+      .setType(Constants.ComponentType.FILE)
+      .setPath("src/main/java/dir/Foo.java")
+      .build());
+
+    treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", PROJECT_KEY,
+      new DumbComponent(Component.Type.MODULE, 2, "EDCB", "MODULE_A",
+        new DumbComponent(Component.Type.MODULE, 3, "BCDE", "MODULE_B",
+          new DumbComponent(Component.Type.DIRECTORY, 4, "CDEF", "MODULE_B:src/main/java/dir",
+            new DumbComponent(Component.Type.FILE, 5, "DEFG", "MODULE_B:src/main/java/dir/Foo.java"))))));
+
+    sut.execute();
+
+    assertThat(dbTester.countRowsOfTable("projects")).isEqualTo(5);
+
+    ComponentDto moduleAreloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_A");
+    assertThat(moduleAreloaded).isNotNull();
+
+    ComponentDto moduleBReloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_B");
+    assertThat(moduleBReloaded).isNotNull();
+    assertThat(moduleBReloaded.uuid()).isEqualTo(moduleB.uuid());
+    assertThat(moduleBReloaded.moduleUuid()).isEqualTo(moduleAreloaded.uuid());
+    assertThat(moduleBReloaded.moduleUuidPath()).isEqualTo(moduleAreloaded.moduleUuidPath() + moduleBReloaded.uuid() + ".");
+    assertThat(moduleBReloaded.projectUuid()).isEqualTo(project.uuid());
+    assertThat(moduleBReloaded.parentProjectId()).isEqualTo(project.getId());
+
+    ComponentDto directoryReloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_B:src/main/java/dir");
+    assertThat(directoryReloaded).isNotNull();
+    assertThat(directoryReloaded.uuid()).isEqualTo(directory.uuid());
+    assertThat(directoryReloaded.moduleUuid()).isEqualTo(moduleBReloaded.uuid());
+    assertThat(directoryReloaded.moduleUuidPath()).isEqualTo(moduleBReloaded.moduleUuidPath());
+    assertThat(directoryReloaded.projectUuid()).isEqualTo(project.uuid());
+    assertThat(directoryReloaded.parentProjectId()).isEqualTo(moduleBReloaded.getId());
+
+    ComponentDto fileReloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_B:src/main/java/dir/Foo.java");
+    assertThat(fileReloaded).isNotNull();
+    assertThat(fileReloaded.uuid()).isEqualTo(file.uuid());
+    assertThat(fileReloaded.moduleUuid()).isEqualTo(moduleBReloaded.uuid());
+    assertThat(fileReloaded.moduleUuidPath()).isEqualTo(moduleBReloaded.moduleUuidPath());
+    assertThat(fileReloaded.projectUuid()).isEqualTo(project.uuid());
+    assertThat(fileReloaded.parentProjectId()).isEqualTo(moduleBReloaded.getId());
+  }
+
+}
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistComponentsStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistComponentsStepTest.java
deleted file mode 100644 (file)
index 53ce81e..0000000
+++ /dev/null
@@ -1,772 +0,0 @@
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2014 SonarSource
- * mailto:contact AT sonarsource DOT com
- *
- * SonarQube is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * SonarQube is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-
-package org.sonar.server.computation.step;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.ClassRule;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.sonar.batch.protocol.Constants;
-import org.sonar.batch.protocol.output.BatchReport;
-import org.sonar.core.component.ComponentDto;
-import org.sonar.core.persistence.DbSession;
-import org.sonar.core.persistence.DbTester;
-import org.sonar.server.component.ComponentTesting;
-import org.sonar.server.component.db.ComponentDao;
-import org.sonar.server.computation.batch.BatchReportReaderRule;
-import org.sonar.server.computation.batch.TreeRootHolderRule;
-import org.sonar.server.computation.component.Component;
-import org.sonar.server.computation.component.DbIdsRepository;
-import org.sonar.server.computation.component.DumbComponent;
-import org.sonar.server.db.DbClient;
-import org.sonar.test.DbTests;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-@Category(DbTests.class)
-public class PersistComponentsStepTest extends BaseStepTest {
-
-  private static final String PROJECT_KEY = "PROJECT_KEY";
-
-  @ClassRule
-  public static DbTester dbTester = new DbTester();
-
-  @Rule
-  public BatchReportReaderRule reportReader = new BatchReportReaderRule();
-
-  @Rule
-  public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule();
-
-  DbIdsRepository dbIdsRepository;
-
-  DbSession session;
-  DbClient dbClient;
-
-  PersistComponentsStep sut;
-
-  @Before
-  public void setup() throws Exception {
-    dbTester.truncateTables();
-    session = dbTester.myBatis().openSession(false);
-    dbClient = new DbClient(dbTester.database(), dbTester.myBatis(), new ComponentDao());
-
-    dbIdsRepository = new DbIdsRepository();
-    sut = new PersistComponentsStep(dbClient, dbIdsRepository, reportReader, treeRootHolder);
-  }
-
-  @Override
-  protected ComputationStep step() {
-    return sut;
-  }
-
-  @After
-  public void tearDown() {
-    session.close();
-  }
-
-  @Test
-  public void persist_components() throws Exception {
-    reportReader.setMetadata(BatchReport.Metadata.newBuilder()
-      .setRootComponentRef(1)
-      .build());
-
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(1)
-      .setType(Constants.ComponentType.PROJECT)
-      .setKey(PROJECT_KEY)
-      .setName("Project")
-      .setDescription("Project description")
-      .addChildRef(2)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(2)
-      .setType(Constants.ComponentType.MODULE)
-      .setKey("MODULE_KEY")
-      .setPath("module")
-      .setName("Module")
-      .setDescription("Module description")
-      .addChildRef(3)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(3)
-      .setType(Constants.ComponentType.DIRECTORY)
-      .setPath("src/main/java/dir")
-      .addChildRef(4)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(4)
-      .setType(Constants.ComponentType.FILE)
-      .setPath("src/main/java/dir/Foo.java")
-      .setLanguage("java")
-      .build());
-
-    Component file = new DumbComponent(Component.Type.FILE, 4, "DEFG", "MODULE_KEY:src/main/java/dir/Foo.java");
-    Component directory = new DumbComponent(Component.Type.DIRECTORY, 3, "CDEF", "MODULE_KEY:src/main/java/dir", file);
-    Component module = new DumbComponent(Component.Type.MODULE, 2, "BCDE", "MODULE_KEY", directory);
-    Component project = new DumbComponent(Component.Type.PROJECT, 1, "ABCD", PROJECT_KEY, module);
-    treeRootHolder.setRoot(project);
-
-    sut.execute();
-
-    assertThat(dbTester.countRowsOfTable("projects")).isEqualTo(4);
-
-    ComponentDto projectDto = dbClient.componentDao().selectNullableByKey(session, PROJECT_KEY);
-    assertThat(projectDto).isNotNull();
-    assertThat(projectDto.name()).isEqualTo("Project");
-    assertThat(projectDto.description()).isEqualTo("Project description");
-    assertThat(projectDto.path()).isNull();
-    assertThat(projectDto.uuid()).isEqualTo("ABCD");
-    assertThat(projectDto.moduleUuid()).isNull();
-    assertThat(projectDto.moduleUuidPath()).isEqualTo("." + projectDto.uuid() + ".");
-    assertThat(projectDto.projectUuid()).isEqualTo(projectDto.uuid());
-    assertThat(projectDto.qualifier()).isEqualTo("TRK");
-    assertThat(projectDto.scope()).isEqualTo("PRJ");
-    assertThat(projectDto.parentProjectId()).isNull();
-
-    ComponentDto moduleDto = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY");
-    assertThat(moduleDto).isNotNull();
-    assertThat(moduleDto.name()).isEqualTo("Module");
-    assertThat(moduleDto.description()).isEqualTo("Module description");
-    assertThat(moduleDto.path()).isEqualTo("module");
-    assertThat(moduleDto.uuid()).isEqualTo("BCDE");
-    assertThat(moduleDto.moduleUuid()).isEqualTo(projectDto.uuid());
-    assertThat(moduleDto.moduleUuidPath()).isEqualTo(projectDto.moduleUuidPath() + moduleDto.uuid() + ".");
-    assertThat(moduleDto.projectUuid()).isEqualTo(projectDto.uuid());
-    assertThat(moduleDto.qualifier()).isEqualTo("BRC");
-    assertThat(moduleDto.scope()).isEqualTo("PRJ");
-    assertThat(moduleDto.parentProjectId()).isEqualTo(projectDto.getId());
-
-    ComponentDto directoryDto = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY:src/main/java/dir");
-    assertThat(directoryDto).isNotNull();
-    assertThat(directoryDto.name()).isEqualTo("src/main/java/dir");
-    assertThat(directoryDto.description()).isNull();
-    assertThat(directoryDto.path()).isEqualTo("src/main/java/dir");
-    assertThat(directoryDto.uuid()).isEqualTo("CDEF");
-    assertThat(directoryDto.moduleUuid()).isEqualTo(moduleDto.uuid());
-    assertThat(directoryDto.moduleUuidPath()).isEqualTo(moduleDto.moduleUuidPath());
-    assertThat(directoryDto.projectUuid()).isEqualTo(projectDto.uuid());
-    assertThat(directoryDto.qualifier()).isEqualTo("DIR");
-    assertThat(directoryDto.scope()).isEqualTo("DIR");
-    assertThat(directoryDto.parentProjectId()).isEqualTo(moduleDto.getId());
-
-    ComponentDto fileDto = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY:src/main/java/dir/Foo.java");
-    assertThat(fileDto).isNotNull();
-    assertThat(fileDto.name()).isEqualTo("Foo.java");
-    assertThat(fileDto.description()).isNull();
-    assertThat(fileDto.path()).isEqualTo("src/main/java/dir/Foo.java");
-    assertThat(fileDto.language()).isEqualTo("java");
-    assertThat(fileDto.uuid()).isEqualTo("DEFG");
-    assertThat(fileDto.moduleUuid()).isEqualTo(moduleDto.uuid());
-    assertThat(fileDto.moduleUuidPath()).isEqualTo(moduleDto.moduleUuidPath());
-    assertThat(fileDto.projectUuid()).isEqualTo(projectDto.uuid());
-    assertThat(fileDto.qualifier()).isEqualTo("FIL");
-    assertThat(fileDto.scope()).isEqualTo("FIL");
-    assertThat(fileDto.parentProjectId()).isEqualTo(moduleDto.getId());
-
-    assertThat(dbIdsRepository.getComponentId(project)).isEqualTo(projectDto.getId());
-    assertThat(dbIdsRepository.getComponentId(module)).isEqualTo(moduleDto.getId());
-    assertThat(dbIdsRepository.getComponentId(directory)).isEqualTo(directoryDto.getId());
-    assertThat(dbIdsRepository.getComponentId(file)).isEqualTo(fileDto.getId());
-  }
-
-  @Test
-  public void persist_file_directly_attached_on_root_directory() throws Exception {
-    reportReader.setMetadata(BatchReport.Metadata.newBuilder()
-      .setRootComponentRef(1)
-      .build());
-
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(1)
-      .setType(Constants.ComponentType.PROJECT)
-      .setKey(PROJECT_KEY)
-      .setName("Project")
-      .addChildRef(2)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(2)
-      .setType(Constants.ComponentType.DIRECTORY)
-      .setPath("/")
-      .addChildRef(3)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(3)
-      .setType(Constants.ComponentType.FILE)
-      .setPath("pom.xml")
-      .build());
-
-    treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", PROJECT_KEY,
-      new DumbComponent(Component.Type.DIRECTORY, 2, "CDEF", PROJECT_KEY + ":/",
-        new DumbComponent(Component.Type.FILE, 3, "DEFG", PROJECT_KEY + ":pom.xml"))));
-    sut.execute();
-
-    ComponentDto directory = dbClient.componentDao().selectNullableByKey(session, "PROJECT_KEY:/");
-    assertThat(directory).isNotNull();
-    assertThat(directory.name()).isEqualTo("/");
-    assertThat(directory.path()).isEqualTo("/");
-
-    ComponentDto file = dbClient.componentDao().selectNullableByKey(session, "PROJECT_KEY:pom.xml");
-    assertThat(file).isNotNull();
-    assertThat(file.name()).isEqualTo("pom.xml");
-    assertThat(file.path()).isEqualTo("pom.xml");
-  }
-
-  @Test
-  public void persist_unit_test() throws Exception {
-    reportReader.setMetadata(BatchReport.Metadata.newBuilder()
-      .setRootComponentRef(1)
-      .build());
-
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(1)
-      .setType(Constants.ComponentType.PROJECT)
-      .setKey(PROJECT_KEY)
-      .setName("Project")
-      .addChildRef(2)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(2)
-      .setType(Constants.ComponentType.DIRECTORY)
-      .setPath("src/test/java/dir")
-      .addChildRef(3)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(3)
-      .setType(Constants.ComponentType.FILE)
-      .setPath("src/test/java/dir/FooTest.java")
-      .setIsTest(true)
-      .build());
-
-    treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", PROJECT_KEY,
-      new DumbComponent(Component.Type.DIRECTORY, 2, "CDEF", PROJECT_KEY + ":src/test/java/dir",
-        new DumbComponent(Component.Type.FILE, 3, "DEFG", PROJECT_KEY + ":src/test/java/dir/FooTest.java"))));
-    sut.execute();
-
-    ComponentDto file = dbClient.componentDao().selectNullableByKey(session, PROJECT_KEY + ":src/test/java/dir/FooTest.java");
-    assertThat(file).isNotNull();
-    assertThat(file.name()).isEqualTo("FooTest.java");
-    assertThat(file.path()).isEqualTo("src/test/java/dir/FooTest.java");
-    assertThat(file.qualifier()).isEqualTo("UTS");
-    assertThat(file.scope()).isEqualTo("FIL");
-  }
-
-  @Test
-  public void persist_only_new_components() throws Exception {
-    // Project amd module already exists
-    ComponentDto project = ComponentTesting.newProjectDto("ABCD").setKey(PROJECT_KEY).setName("Project");
-    dbClient.componentDao().insert(session, project);
-    ComponentDto module = ComponentTesting.newModuleDto("BCDE", project).setKey("MODULE_KEY").setName("Module");
-    dbClient.componentDao().insert(session, module);
-    session.commit();
-
-    reportReader.setMetadata(BatchReport.Metadata.newBuilder()
-      .setRootComponentRef(1)
-      .build());
-
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(1)
-      .setType(Constants.ComponentType.PROJECT)
-      .setKey(PROJECT_KEY)
-      .setName("Project")
-      .addChildRef(2)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(2)
-      .setType(Constants.ComponentType.MODULE)
-      .setKey("MODULE_KEY")
-      .setName("Module")
-      .addChildRef(3)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(3)
-      .setType(Constants.ComponentType.DIRECTORY)
-      .setPath("src/main/java/dir")
-      .addChildRef(4)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(4)
-      .setType(Constants.ComponentType.FILE)
-      .setPath("src/main/java/dir/Foo.java")
-      .build());
-
-    treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", PROJECT_KEY,
-      new DumbComponent(Component.Type.MODULE, 2, "BCDE", "MODULE_KEY",
-        new DumbComponent(Component.Type.DIRECTORY, 3, "CDEF", "MODULE_KEY:src/main/java/dir",
-          new DumbComponent(Component.Type.FILE, 4, "DEFG", "MODULE_KEY:src/main/java/dir/Foo.java")))));
-    sut.execute();
-
-    assertThat(dbTester.countRowsOfTable("projects")).isEqualTo(4);
-
-    ComponentDto projectReloaded = dbClient.componentDao().selectNullableByKey(session, PROJECT_KEY);
-    assertThat(projectReloaded.getId()).isEqualTo(project.getId());
-    assertThat(projectReloaded.uuid()).isEqualTo(project.uuid());
-
-    ComponentDto moduleReloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY");
-    assertThat(moduleReloaded.getId()).isEqualTo(module.getId());
-    assertThat(moduleReloaded.uuid()).isEqualTo(module.uuid());
-    assertThat(moduleReloaded.moduleUuid()).isEqualTo(module.moduleUuid());
-    assertThat(moduleReloaded.moduleUuidPath()).isEqualTo(module.moduleUuidPath());
-    assertThat(moduleReloaded.projectUuid()).isEqualTo(module.projectUuid());
-    assertThat(moduleReloaded.parentProjectId()).isEqualTo(module.parentProjectId());
-
-    ComponentDto directory = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY:src/main/java/dir");
-    assertThat(directory).isNotNull();
-    assertThat(directory.moduleUuid()).isEqualTo(module.uuid());
-    assertThat(directory.moduleUuidPath()).isEqualTo(module.moduleUuidPath());
-    assertThat(directory.projectUuid()).isEqualTo(project.uuid());
-    assertThat(directory.parentProjectId()).isEqualTo(module.getId());
-
-    ComponentDto file = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY:src/main/java/dir/Foo.java");
-    assertThat(file).isNotNull();
-    assertThat(file.moduleUuid()).isEqualTo(module.uuid());
-    assertThat(file.moduleUuidPath()).isEqualTo(module.moduleUuidPath());
-    assertThat(file.projectUuid()).isEqualTo(project.uuid());
-    assertThat(file.parentProjectId()).isEqualTo(module.getId());
-  }
-
-  @Test
-  public void compute_parent_project_id() throws Exception {
-    reportReader.setMetadata(BatchReport.Metadata.newBuilder()
-      .setRootComponentRef(1)
-      .build());
-
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(1)
-      .setType(Constants.ComponentType.PROJECT)
-      .setKey(PROJECT_KEY)
-      .setName("Project")
-      .addChildRef(2)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(2)
-      .setType(Constants.ComponentType.MODULE)
-      .setKey("MODULE_KEY")
-      .setName("Module")
-      .addChildRef(3)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(3)
-      .setType(Constants.ComponentType.MODULE)
-      .setKey("SUB_MODULE_1_KEY")
-      .setName("Sub Module 1")
-      .addChildRef(4)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(4)
-      .setType(Constants.ComponentType.MODULE)
-      .setKey("SUB_MODULE_2_KEY")
-      .setName("Sub Module 2")
-      .addChildRef(5)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(5)
-      .setType(Constants.ComponentType.DIRECTORY)
-      .setPath("src/main/java/dir")
-      .build());
-
-    treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", PROJECT_KEY,
-      new DumbComponent(Component.Type.MODULE, 2, "BCDE", "MODULE_KEY",
-        new DumbComponent(Component.Type.MODULE, 3, "CDEF", "SUB_MODULE_1_KEY",
-          new DumbComponent(Component.Type.MODULE, 4, "DEFG", "SUB_MODULE_2_KEY",
-            new DumbComponent(Component.Type.DIRECTORY, 5, "EFGH", "SUB_MODULE_2_KEY:src/main/java/dir"))))));
-    sut.execute();
-
-    assertThat(dbTester.countRowsOfTable("projects")).isEqualTo(5);
-
-    ComponentDto project = dbClient.componentDao().selectNullableByKey(session, PROJECT_KEY);
-    assertThat(project).isNotNull();
-    assertThat(project.parentProjectId()).isNull();
-
-    ComponentDto module = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY");
-    assertThat(module).isNotNull();
-    assertThat(module.parentProjectId()).isEqualTo(project.getId());
-
-    ComponentDto subModule1 = dbClient.componentDao().selectNullableByKey(session, "SUB_MODULE_1_KEY");
-    assertThat(subModule1).isNotNull();
-    assertThat(subModule1.parentProjectId()).isEqualTo(project.getId());
-
-    ComponentDto subModule2 = dbClient.componentDao().selectNullableByKey(session, "SUB_MODULE_2_KEY");
-    assertThat(subModule2).isNotNull();
-    assertThat(subModule2.parentProjectId()).isEqualTo(project.getId());
-
-    ComponentDto directory = dbClient.componentDao().selectNullableByKey(session, "SUB_MODULE_2_KEY:src/main/java/dir");
-    assertThat(directory).isNotNull();
-    assertThat(directory.parentProjectId()).isEqualTo(subModule2.getId());
-  }
-
-  @Test
-  public void persist_multi_modules() throws Exception {
-    reportReader.setMetadata(BatchReport.Metadata.newBuilder()
-      .setRootComponentRef(1)
-      .build());
-
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(1)
-      .setType(Constants.ComponentType.PROJECT)
-      .setKey(PROJECT_KEY)
-      .setName("Project")
-      .addChildRef(2)
-      .addChildRef(4)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(2)
-      .setType(Constants.ComponentType.MODULE)
-      .setKey("MODULE_A")
-      .setName("Module A")
-      .addChildRef(3)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(3)
-      .setType(Constants.ComponentType.MODULE)
-      .setKey("SUB_MODULE_A")
-      .setName("Sub Module A")
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(4)
-      .setType(Constants.ComponentType.MODULE)
-      .setKey("MODULE_B")
-      .setName("Module B")
-      .build());
-
-    treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", PROJECT_KEY,
-      new DumbComponent(Component.Type.MODULE, 2, "BCDE", "MODULE_A",
-        new DumbComponent(Component.Type.MODULE, 3, "DEFG", "SUB_MODULE_A")),
-      new DumbComponent(Component.Type.MODULE, 4, "CDEF", "MODULE_B")));
-    sut.execute();
-
-    assertThat(dbTester.countRowsOfTable("projects")).isEqualTo(4);
-
-    ComponentDto project = dbClient.componentDao().selectNullableByKey(session, PROJECT_KEY);
-    assertThat(project).isNotNull();
-    assertThat(project.moduleUuid()).isNull();
-    assertThat(project.moduleUuidPath()).isEqualTo("." + project.uuid() + ".");
-    assertThat(project.parentProjectId()).isNull();
-
-    ComponentDto moduleA = dbClient.componentDao().selectNullableByKey(session, "MODULE_A");
-    assertThat(moduleA).isNotNull();
-    assertThat(moduleA.moduleUuid()).isEqualTo(project.uuid());
-    assertThat(moduleA.moduleUuidPath()).isEqualTo(project.moduleUuidPath() + moduleA.uuid() + ".");
-    assertThat(moduleA.parentProjectId()).isEqualTo(project.getId());
-
-    ComponentDto subModuleA = dbClient.componentDao().selectNullableByKey(session, "SUB_MODULE_A");
-    assertThat(subModuleA).isNotNull();
-    assertThat(subModuleA.moduleUuid()).isEqualTo(moduleA.uuid());
-    assertThat(subModuleA.moduleUuidPath()).isEqualTo(moduleA.moduleUuidPath() + subModuleA.uuid() + ".");
-    assertThat(subModuleA.parentProjectId()).isEqualTo(project.getId());
-
-    ComponentDto moduleB = dbClient.componentDao().selectNullableByKey(session, "MODULE_B");
-    assertThat(moduleB).isNotNull();
-    assertThat(moduleB.moduleUuid()).isEqualTo(project.uuid());
-    assertThat(moduleB.moduleUuidPath()).isEqualTo(project.moduleUuidPath() + moduleB.uuid() + ".");
-    assertThat(moduleB.parentProjectId()).isEqualTo(project.getId());
-  }
-
-  @Test
-  public void nothing_to_persist() throws Exception {
-    ComponentDto project = ComponentTesting.newProjectDto("ABCD").setKey(PROJECT_KEY).setName("Project");
-    dbClient.componentDao().insert(session, project);
-    ComponentDto module = ComponentTesting.newModuleDto("BCDE", project).setKey("MODULE_KEY").setName("Module");
-    dbClient.componentDao().insert(session, module);
-    ComponentDto directory = ComponentTesting.newDirectory(module, "src/main/java/dir").setUuid("CDEF").setKey("MODULE_KEY:src/main/java/dir");
-    ComponentDto file = ComponentTesting.newFileDto(module, "DEFG").setPath("src/main/java/dir/Foo.java").setName("Foo.java").setKey("MODULE_KEY:src/main/java/dir/Foo.java");
-    dbClient.componentDao().insert(session, directory, file);
-    session.commit();
-
-    reportReader.setMetadata(BatchReport.Metadata.newBuilder()
-      .setRootComponentRef(1)
-      .build());
-
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(1)
-      .setType(Constants.ComponentType.PROJECT)
-      .setKey(PROJECT_KEY)
-      .setName("Project")
-      .addChildRef(2)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(2)
-      .setType(Constants.ComponentType.MODULE)
-      .setKey("MODULE_KEY")
-      .setName("Module")
-      .addChildRef(3)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(3)
-      .setType(Constants.ComponentType.DIRECTORY)
-      .setPath("src/main/java/dir")
-      .addChildRef(4)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(4)
-      .setType(Constants.ComponentType.FILE)
-      .setPath("src/main/java/dir/Foo.java")
-      .build());
-
-    treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", PROJECT_KEY,
-      new DumbComponent(Component.Type.MODULE, 2, "BCDE", "MODULE_KEY",
-        new DumbComponent(Component.Type.DIRECTORY, 3, "CDEF", "MODULE_KEY:src/main/java/dir",
-          new DumbComponent(Component.Type.FILE, 4, "DEFG", "MODULE_KEY:src/main/java/dir/Foo.java")))));
-    sut.execute();
-
-    assertThat(dbTester.countRowsOfTable("projects")).isEqualTo(4);
-    assertThat(dbClient.componentDao().selectNullableByKey(session, PROJECT_KEY).getId()).isEqualTo(project.getId());
-    assertThat(dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY").getId()).isEqualTo(module.getId());
-    assertThat(dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY:src/main/java/dir").getId()).isEqualTo(directory.getId());
-    assertThat(dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY:src/main/java/dir/Foo.java").getId()).isEqualTo(file.getId());
-
-    ComponentDto projectReloaded = dbClient.componentDao().selectNullableByKey(session, PROJECT_KEY);
-    assertThat(projectReloaded.getId()).isEqualTo(project.getId());
-    assertThat(projectReloaded.uuid()).isEqualTo(project.uuid());
-    assertThat(projectReloaded.moduleUuid()).isEqualTo(project.moduleUuid());
-    assertThat(projectReloaded.moduleUuidPath()).isEqualTo(project.moduleUuidPath());
-    assertThat(projectReloaded.projectUuid()).isEqualTo(project.projectUuid());
-    assertThat(projectReloaded.parentProjectId()).isEqualTo(project.parentProjectId());
-
-    ComponentDto moduleReloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY");
-    assertThat(moduleReloaded.getId()).isEqualTo(module.getId());
-    assertThat(moduleReloaded.uuid()).isEqualTo(module.uuid());
-    assertThat(moduleReloaded.moduleUuid()).isEqualTo(module.moduleUuid());
-    assertThat(moduleReloaded.moduleUuidPath()).isEqualTo(module.moduleUuidPath());
-    assertThat(moduleReloaded.projectUuid()).isEqualTo(module.projectUuid());
-    assertThat(moduleReloaded.parentProjectId()).isEqualTo(module.parentProjectId());
-
-    ComponentDto directoryReloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY:src/main/java/dir");
-    assertThat(directoryReloaded).isNotNull();
-    assertThat(directoryReloaded.uuid()).isEqualTo(directory.uuid());
-    assertThat(directoryReloaded.moduleUuid()).isEqualTo(directory.moduleUuid());
-    assertThat(directoryReloaded.moduleUuidPath()).isEqualTo(directory.moduleUuidPath());
-    assertThat(directoryReloaded.projectUuid()).isEqualTo(directory.projectUuid());
-    assertThat(directoryReloaded.parentProjectId()).isEqualTo(directory.parentProjectId());
-    assertThat(directoryReloaded.name()).isEqualTo(directory.name());
-    assertThat(directoryReloaded.path()).isEqualTo(directory.path());
-
-    ComponentDto fileReloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY:src/main/java/dir/Foo.java");
-    assertThat(fileReloaded).isNotNull();
-    assertThat(fileReloaded.uuid()).isEqualTo(file.uuid());
-    assertThat(fileReloaded.moduleUuid()).isEqualTo(file.moduleUuid());
-    assertThat(fileReloaded.moduleUuidPath()).isEqualTo(file.moduleUuidPath());
-    assertThat(fileReloaded.projectUuid()).isEqualTo(file.projectUuid());
-    assertThat(fileReloaded.parentProjectId()).isEqualTo(file.parentProjectId());
-    assertThat(fileReloaded.name()).isEqualTo(file.name());
-    assertThat(fileReloaded.path()).isEqualTo(file.path());
-  }
-
-  @Test
-  public void update_module_name() throws Exception {
-    ComponentDto project = ComponentTesting.newProjectDto("ABCD").setKey(PROJECT_KEY).setName("Project");
-    dbClient.componentDao().insert(session, project);
-    ComponentDto module = ComponentTesting.newModuleDto("BCDE", project).setKey("MODULE_KEY").setName("Module").setPath("path");
-    dbClient.componentDao().insert(session, module);
-    session.commit();
-
-    reportReader.setMetadata(BatchReport.Metadata.newBuilder()
-      .setRootComponentRef(1)
-      .build());
-
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(1)
-      .setType(Constants.ComponentType.PROJECT)
-      .setKey(PROJECT_KEY)
-      .setName("New project name")
-      .addChildRef(2)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(2)
-      .setType(Constants.ComponentType.MODULE)
-      .setKey("MODULE_KEY")
-      .setName("New module name")
-      .setPath("New path")
-      .build());
-
-    treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", PROJECT_KEY,
-      new DumbComponent(Component.Type.MODULE, 2, "BCDE", "MODULE_KEY")));
-    sut.execute();
-
-    ComponentDto projectReloaded = dbClient.componentDao().selectNullableByKey(session, PROJECT_KEY);
-    assertThat(projectReloaded.name()).isEqualTo("New project name");
-
-    ComponentDto moduleReloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY");
-    assertThat(moduleReloaded.name()).isEqualTo("New module name");
-  }
-
-  @Test
-  public void update_module_description() throws Exception {
-    ComponentDto project = ComponentTesting.newProjectDto("ABCD").setKey(PROJECT_KEY).setName("Project").setDescription("Project description");
-    dbClient.componentDao().insert(session, project);
-    ComponentDto module = ComponentTesting.newModuleDto("BCDE", project).setKey("MODULE_KEY").setName("Module");
-    dbClient.componentDao().insert(session, module);
-    session.commit();
-
-    reportReader.setMetadata(BatchReport.Metadata.newBuilder()
-      .setRootComponentRef(1)
-      .build());
-
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(1)
-      .setType(Constants.ComponentType.PROJECT)
-      .setKey(PROJECT_KEY)
-      .setName("Project")
-      .setDescription("New project description")
-      .addChildRef(2)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(2)
-      .setType(Constants.ComponentType.MODULE)
-      .setKey("MODULE_KEY")
-      .setName("Module")
-      .setDescription("New module description")
-      .build());
-
-    treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", PROJECT_KEY,
-      new DumbComponent(Component.Type.MODULE, 2, "BCDE", "MODULE_KEY")));
-    sut.execute();
-
-    ComponentDto projectReloaded = dbClient.componentDao().selectNullableByKey(session, PROJECT_KEY);
-    assertThat(projectReloaded.description()).isEqualTo("New project description");
-
-    ComponentDto moduleReloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY");
-    assertThat(moduleReloaded.description()).isEqualTo("New module description");
-  }
-
-  @Test
-  public void update_module_path() throws Exception {
-    ComponentDto project = ComponentTesting.newProjectDto("ABCD").setKey(PROJECT_KEY).setName("Project");
-    dbClient.componentDao().insert(session, project);
-    ComponentDto module = ComponentTesting.newModuleDto("BCDE", project).setKey("MODULE_KEY").setName("Module").setPath("path");
-    dbClient.componentDao().insert(session, module);
-    session.commit();
-
-    reportReader.setMetadata(BatchReport.Metadata.newBuilder()
-      .setRootComponentRef(1)
-      .build());
-
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(1)
-      .setType(Constants.ComponentType.PROJECT)
-      .setKey(PROJECT_KEY)
-      .setName("Project")
-      .addChildRef(2)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(2)
-      .setType(Constants.ComponentType.MODULE)
-      .setKey("MODULE_KEY")
-      .setName("Module")
-      .setPath("New path")
-      .build());
-
-    treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", PROJECT_KEY,
-      new DumbComponent(Component.Type.MODULE, 2, "BCDE", "MODULE_KEY")));
-    sut.execute();
-
-    ComponentDto moduleReloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_KEY");
-    assertThat(moduleReloaded.path()).isEqualTo("New path");
-  }
-
-  @Test
-  public void update_module_uuid_when_moving_a_module() throws Exception {
-    ComponentDto project = ComponentTesting.newProjectDto("ABCD").setKey(PROJECT_KEY).setName("Project");
-    dbClient.componentDao().insert(session, project);
-    ComponentDto moduleA = ComponentTesting.newModuleDto("EDCB", project).setKey("MODULE_A").setName("Module A");
-    ComponentDto moduleB = ComponentTesting.newModuleDto("BCDE", project).setKey("MODULE_B").setName("Module B");
-    dbClient.componentDao().insert(session, moduleA, moduleB);
-    ComponentDto directory = ComponentTesting.newDirectory(moduleB, "src/main/java/dir").setUuid("CDEF").setKey("MODULE_B:src/main/java/dir");
-    ComponentDto file = ComponentTesting.newFileDto(moduleB, "DEFG").setPath("src/main/java/dir/Foo.java").setName("Foo.java").setKey("MODULE_B:src/main/java/dir/Foo.java");
-    dbClient.componentDao().insert(session, directory, file);
-    session.commit();
-
-    reportReader.setMetadata(BatchReport.Metadata.newBuilder()
-      .setRootComponentRef(1)
-      .build());
-
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(1)
-      .setType(Constants.ComponentType.PROJECT)
-      .setKey(PROJECT_KEY)
-      .setName("Project")
-      .addChildRef(2)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(2)
-      .setType(Constants.ComponentType.MODULE)
-      .setKey("MODULE_A")
-      .setName("Module A")
-      .addChildRef(3)
-      .build());
-    // Module B is now a sub module of module A
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(3)
-      .setType(Constants.ComponentType.MODULE)
-      .setKey("MODULE_B")
-      .setName("Module B")
-      .addChildRef(4)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(4)
-      .setType(Constants.ComponentType.DIRECTORY)
-      .setPath("src/main/java/dir")
-      .addChildRef(5)
-      .build());
-    reportReader.putComponent(BatchReport.Component.newBuilder()
-      .setRef(5)
-      .setType(Constants.ComponentType.FILE)
-      .setPath("src/main/java/dir/Foo.java")
-      .build());
-
-    treeRootHolder.setRoot(new DumbComponent(Component.Type.PROJECT, 1, "ABCD", PROJECT_KEY,
-      new DumbComponent(Component.Type.MODULE, 2, "EDCB", "MODULE_A",
-        new DumbComponent(Component.Type.MODULE, 3, "BCDE", "MODULE_B",
-          new DumbComponent(Component.Type.DIRECTORY, 4, "CDEF", "MODULE_B:src/main/java/dir",
-            new DumbComponent(Component.Type.FILE, 5, "DEFG", "MODULE_B:src/main/java/dir/Foo.java"))))));
-    sut.execute();
-
-    assertThat(dbTester.countRowsOfTable("projects")).isEqualTo(5);
-
-    ComponentDto moduleAreloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_A");
-    assertThat(moduleAreloaded).isNotNull();
-
-    ComponentDto moduleBReloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_B");
-    assertThat(moduleBReloaded).isNotNull();
-    assertThat(moduleBReloaded.uuid()).isEqualTo(moduleB.uuid());
-    assertThat(moduleBReloaded.moduleUuid()).isEqualTo(moduleAreloaded.uuid());
-    assertThat(moduleBReloaded.moduleUuidPath()).isEqualTo(moduleAreloaded.moduleUuidPath() + moduleBReloaded.uuid() + ".");
-    assertThat(moduleBReloaded.projectUuid()).isEqualTo(project.uuid());
-    assertThat(moduleBReloaded.parentProjectId()).isEqualTo(project.getId());
-
-    ComponentDto directoryReloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_B:src/main/java/dir");
-    assertThat(directoryReloaded).isNotNull();
-    assertThat(directoryReloaded.uuid()).isEqualTo(directory.uuid());
-    assertThat(directoryReloaded.moduleUuid()).isEqualTo(moduleBReloaded.uuid());
-    assertThat(directoryReloaded.moduleUuidPath()).isEqualTo(moduleBReloaded.moduleUuidPath());
-    assertThat(directoryReloaded.projectUuid()).isEqualTo(project.uuid());
-    assertThat(directoryReloaded.parentProjectId()).isEqualTo(moduleBReloaded.getId());
-
-    ComponentDto fileReloaded = dbClient.componentDao().selectNullableByKey(session, "MODULE_B:src/main/java/dir/Foo.java");
-    assertThat(fileReloaded).isNotNull();
-    assertThat(fileReloaded.uuid()).isEqualTo(file.uuid());
-    assertThat(fileReloaded.moduleUuid()).isEqualTo(moduleBReloaded.uuid());
-    assertThat(fileReloaded.moduleUuidPath()).isEqualTo(moduleBReloaded.moduleUuidPath());
-    assertThat(fileReloaded.projectUuid()).isEqualTo(project.uuid());
-    assertThat(fileReloaded.parentProjectId()).isEqualTo(moduleBReloaded.getId());
-  }
-
-}
index c41ce0800656e61d1c1d6c07affc96be98435332..14455532309ffda5cdc7ef1bb373234ca9d42963 100644 (file)
  */
 package org.sonar.batch.protocol.output;
 
-import org.sonar.batch.protocol.ProtobufUtil;
-import org.sonar.batch.protocol.output.BatchReport.Issues;
-
-import javax.annotation.CheckForNull;
-
 import java.io.File;
 import java.util.Collections;
 import java.util.List;
+import javax.annotation.CheckForNull;
+import org.sonar.batch.protocol.ProtobufUtil;
+import org.sonar.batch.protocol.output.BatchReport.Issues;
 
 public class BatchReportReader {
 
@@ -161,7 +159,7 @@ public class BatchReportReader {
     return null;
   }
 
-  private boolean doesFileExists(File file) {
+  private static boolean doesFileExists(File file) {
     return file.exists() && file.isFile();
   }
 }
index 9118dc3450e5c8a29f3d7eb843b22b9fcbc6cc62..d10f6ba5fab9fc55d4e482f6bbb59e13aa5352a8 100644 (file)
@@ -23,6 +23,7 @@ import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
+import java.util.Map;
 import org.sonar.api.batch.SonarIndex;
 import org.sonar.api.measures.FileLinesContext;
 import org.sonar.api.measures.Measure;
@@ -33,8 +34,6 @@ import org.sonar.api.resources.ResourceUtils;
 import org.sonar.api.utils.KeyValueFormat;
 import org.sonar.api.utils.KeyValueFormat.Converter;
 
-import java.util.Map;
-
 public class DefaultFileLinesContext implements FileLinesContext {
 
   private final SonarIndex index;
@@ -143,7 +142,7 @@ public class DefaultFileLinesContext implements FileLinesContext {
    * @see #loadData(String, Converter)
    * @see #save()
    */
-  private boolean shouldSave(Map<Integer, Object> lines) {
+  private static boolean shouldSave(Map<Integer, Object> lines) {
     return !(lines instanceof ImmutableMap);
   }
 
index 446c0820244c42477291df94ba310176f8ed9874..6f17ffc03418d393c0f9d44ec8503e814b9f875f 100644 (file)
@@ -175,7 +175,7 @@ public abstract class AbstractNewCoverageFileAnalyzer implements Decorator {
     context.saveMeasure(newUncoveredConditions);
   }
 
-  private Map<Integer, Integer> parseCountByLine(@Nullable Measure measure) {
+  private static Map<Integer, Integer> parseCountByLine(@Nullable Measure measure) {
     if (measure != null && measure.hasData()) {
       return KeyValueFormat.parseIntInt(measure.getData());
     }
index cd57819911a139460e1ae7cbe767ccb6f99ea16f..53dd6a49d51571a3afe774fda1b24818d067d33a 100644 (file)
@@ -146,7 +146,7 @@ public class CountUnresolvedIssuesDecorator implements Decorator {
     }
   }
 
-  private void saveTotalIssues(DecoratorContext context, Collection<Issue> issues) {
+  private static void saveTotalIssues(DecoratorContext context, Collection<Issue> issues) {
     if (context.getMeasure(CoreMetrics.VIOLATIONS) == null) {
       Collection<Measure> childrenIssues = context.getChildrenMeasures(CoreMetrics.VIOLATIONS);
       Double sum = MeasureUtils.sum(true, childrenIssues);
@@ -161,7 +161,7 @@ public class CountUnresolvedIssuesDecorator implements Decorator {
     }
   }
 
-  private void saveIssuesForSeverity(DecoratorContext context, RulePriority ruleSeverity, Multiset<RulePriority> severitiesBag) {
+  private static void saveIssuesForSeverity(DecoratorContext context, RulePriority ruleSeverity, Multiset<RulePriority> severitiesBag) {
     Metric metric = SeverityUtils.severityToIssueMetric(ruleSeverity);
     if (context.getMeasure(metric) == null) {
       Collection<Measure> children = context.getChildrenMeasures(MeasuresFilters.metric(metric));
@@ -248,11 +248,11 @@ public class CountUnresolvedIssuesDecorator implements Decorator {
     context.saveMeasure(measure);
   }
 
-  private void saveMeasure(DecoratorContext context, Metric metric, int value) {
+  private static void saveMeasure(DecoratorContext context, Metric metric, int value) {
     context.saveMeasure(metric, (double) (value + sumChildren(context, metric)));
   }
 
-  private int sumChildren(DecoratorContext context, Metric metric) {
+  private static int sumChildren(DecoratorContext context, Metric metric) {
     int sum = 0;
     if (!ResourceUtils.isFile(context.getResource())) {
       sum = MeasureUtils.sum(true, context.getChildrenMeasures(metric)).intValue();
@@ -260,7 +260,7 @@ public class CountUnresolvedIssuesDecorator implements Decorator {
     return sum;
   }
 
-  private Multiset<RuleKey> initRules(Map<RulePriority, Multiset<RuleKey>> rulesPerSeverity, RulePriority severity) {
+  private static Multiset<RuleKey> initRules(Map<RulePriority, Multiset<RuleKey>> rulesPerSeverity, RulePriority severity) {
     Multiset<RuleKey> rulesBag = rulesPerSeverity.get(severity);
     if (rulesBag == null) {
       rulesBag = HashMultiset.create();
@@ -289,11 +289,11 @@ public class CountUnresolvedIssuesDecorator implements Decorator {
     return count;
   }
 
-  private boolean isAfter(Issue issue, @Nullable Date date) {
+  private static boolean isAfter(Issue issue, @Nullable Date date) {
     return date == null || (issue.creationDate() != null && DateUtils.truncatedCompareTo(issue.creationDate(), date, Calendar.SECOND) > 0);
   }
 
-  private boolean shouldSaveNewMetrics(DecoratorContext context) {
+  private static boolean shouldSaveNewMetrics(DecoratorContext context) {
     return context.getMeasure(CoreMetrics.NEW_VIOLATIONS) == null;
   }
 
index 1255c64a35f0c287db8df234ef94c2b67310c8fc..68b5e1a8330c7747b0c422996d31eb5532acca48 100644 (file)
@@ -74,7 +74,7 @@ public final class TimeMachineConfigurationPersister implements Decorator {
     return true;
   }
 
-  private void updatePeriodParams(Snapshot snapshot, PastSnapshot pastSnapshot) {
+  private static void updatePeriodParams(Snapshot snapshot, PastSnapshot pastSnapshot) {
     int periodIndex = pastSnapshot.getIndex();
     snapshot.setPeriodMode(periodIndex, pastSnapshot.getMode());
     snapshot.setPeriodModeParameter(periodIndex, pastSnapshot.getModeParameter());
index c2f4c97b9a6cdc81ba3146a8a7660c67d55c5cef..237f27bae6776ae96ddde7f602db10645e7f25e9 100644 (file)
 package org.sonar.batch.debt;
 
 import com.google.common.annotations.VisibleForTesting;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
 import org.sonar.api.batch.Decorator;
 import org.sonar.api.batch.DecoratorBarriers;
 import org.sonar.api.batch.DecoratorContext;
@@ -47,14 +53,6 @@ import org.sonar.api.rules.RuleFinder;
 import org.sonar.api.technicaldebt.batch.Characteristic;
 import org.sonar.api.technicaldebt.batch.TechnicalDebtModel;
 
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
 import static com.google.common.collect.Lists.newArrayList;
 import static com.google.common.collect.Maps.newHashMap;
 
@@ -182,7 +180,7 @@ public final class DebtDecorator implements Decorator {
     }
   }
 
-  private void saveMeasure(DecoratorContext context, Measure measure, Double value, boolean inMemory) {
+  private static void saveMeasure(DecoratorContext context, Measure measure, Double value, boolean inMemory) {
     measure.setValue(value);
     if (inMemory) {
       measure.setPersistenceMode(PersistenceMode.MEMORY);
index 7ce8c610ba5f8e9644a0b6351a1aec8775bca757..dc95f8e86790c73c8ccbdf021edf34a727f36e94 100644 (file)
@@ -22,6 +22,8 @@ package org.sonar.batch.debt;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
+import java.util.List;
+import javax.annotation.Nullable;
 import org.picocontainer.injectors.ProviderAdapter;
 import org.sonar.api.batch.debt.DebtCharacteristic;
 import org.sonar.api.batch.debt.DebtModel;
@@ -32,9 +34,6 @@ import org.sonar.api.utils.log.Profiler;
 import org.sonar.core.technicaldebt.db.CharacteristicDao;
 import org.sonar.core.technicaldebt.db.CharacteristicDto;
 
-import javax.annotation.Nullable;
-import java.util.List;
-
 public class DebtModelProvider extends ProviderAdapter {
 
   private DebtModel model;
@@ -48,7 +47,7 @@ public class DebtModelProvider extends ProviderAdapter {
     return model;
   }
 
-  private DebtModel load(CharacteristicDao dao) {
+  private static DebtModel load(CharacteristicDao dao) {
     DefaultDebtModel debtModel = new DefaultDebtModel();
 
     List<CharacteristicDto> allCharacteristics = dao.selectEnabledCharacteristics();
index 9d6e0fca14ceaf79163ab1382a2e4271666cdfdd..fb882a7a0eb9bc94eecb37cfdc2b0166ee695517 100644 (file)
@@ -22,16 +22,6 @@ package org.sonar.batch.debt;
 
 import com.google.common.base.Function;
 import com.google.common.collect.Ordering;
-import org.apache.commons.lang.time.DateUtils;
-import org.sonar.api.batch.BatchSide;
-import org.sonar.api.issue.Issue;
-import org.sonar.api.issue.internal.DefaultIssue;
-import org.sonar.api.issue.internal.FieldDiffs;
-import org.sonar.core.issue.IssueUpdater;
-
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
 import java.util.Calendar;
 import java.util.Collection;
 import java.util.Collections;
@@ -39,6 +29,14 @@ import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
+import org.apache.commons.lang.time.DateUtils;
+import org.sonar.api.batch.BatchSide;
+import org.sonar.api.issue.Issue;
+import org.sonar.api.issue.internal.DefaultIssue;
+import org.sonar.api.issue.internal.FieldDiffs;
+import org.sonar.core.issue.IssueUpdater;
 
 import static com.google.common.collect.Lists.newArrayList;
 
@@ -82,7 +80,7 @@ public class IssueChangelogDebtCalculator {
    * SONAR-5059
    */
   @CheckForNull
-  private Long subtractNeverNegative(@Nullable Long value, Long with) {
+  private static Long subtractNeverNegative(@Nullable Long value, @Nullable Long with) {
     Long result = (value != null ? value : 0) - (with != null ? with : 0);
     return result > 0 ? result : null;
   }
@@ -103,7 +101,7 @@ public class IssueChangelogDebtCalculator {
     return Collections.emptyList();
   }
 
-  private List<FieldDiffs> changesOnField(Collection<FieldDiffs> fieldDiffs) {
+  private static List<FieldDiffs> changesOnField(Collection<FieldDiffs> fieldDiffs) {
     List<FieldDiffs> diffs = newArrayList();
     for (FieldDiffs fieldDiff : fieldDiffs) {
       if (fieldDiff.diffs().containsKey(IssueUpdater.TECHNICAL_DEBT)) {
@@ -114,7 +112,7 @@ public class IssueChangelogDebtCalculator {
   }
 
   @CheckForNull
-  private Long newValue(FieldDiffs fieldDiffs) {
+  private static Long newValue(FieldDiffs fieldDiffs) {
     for (Map.Entry<String, FieldDiffs.Diff> entry : fieldDiffs.diffs().entrySet()) {
       if (entry.getKey().equals(IssueUpdater.TECHNICAL_DEBT)) {
         return entry.getValue().newValueLong();
@@ -124,7 +122,7 @@ public class IssueChangelogDebtCalculator {
   }
 
   @CheckForNull
-  private Long oldValue(FieldDiffs fieldDiffs) {
+  private static Long oldValue(FieldDiffs fieldDiffs) {
     for (Map.Entry<String, FieldDiffs.Diff> entry : fieldDiffs.diffs().entrySet()) {
       if (entry.getKey().equals(IssueUpdater.TECHNICAL_DEBT)) {
         return entry.getValue().oldValueLong();
@@ -133,11 +131,11 @@ public class IssueChangelogDebtCalculator {
     return null;
   }
 
-  private boolean isAfter(@Nullable Date currentDate, @Nullable Date pastDate) {
+  private static boolean isAfter(@Nullable Date currentDate, @Nullable Date pastDate) {
     return pastDate == null || (currentDate != null && DateUtils.truncatedCompareTo(currentDate, pastDate, Calendar.SECOND) > 0);
   }
 
-  private boolean isLesserOrEqual(@Nullable Date currentDate, @Nullable Date pastDate) {
+  private static boolean isLesserOrEqual(@Nullable Date currentDate, @Nullable Date pastDate) {
     return (currentDate != null) && (pastDate == null || (DateUtils.truncatedCompareTo(currentDate, pastDate, Calendar.SECOND) <= 0));
   }
 
index 9909fc474764642a07a5b397e89490c87d5b93f4..c334520aa796a85b10a537ba6710a5a839e81d56 100644 (file)
 package org.sonar.batch.debt;
 
 import com.google.common.collect.ImmutableList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import javax.annotation.Nullable;
 import org.sonar.api.batch.Decorator;
 import org.sonar.api.batch.DecoratorBarriers;
 import org.sonar.api.batch.DecoratorContext;
@@ -39,12 +43,6 @@ import org.sonar.api.resources.Resource;
 import org.sonar.batch.components.Period;
 import org.sonar.batch.components.TimeMachineConfiguration;
 
-import javax.annotation.Nullable;
-
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-
 import static com.google.common.collect.Lists.newArrayList;
 
 /**
@@ -109,7 +107,7 @@ public final class NewDebtDecorator implements Decorator {
     return result;
   }
 
-  private boolean shouldSaveNewMetrics(DecoratorContext context) {
+  private static boolean shouldSaveNewMetrics(DecoratorContext context) {
     return context.getMeasure(CoreMetrics.NEW_TECHNICAL_DEBT) == null;
   }
 
index 666ec9b633fcef4d773266db1e43e43207534283..38dc3bd658d076305ccb10fc1119fea3709f7e73 100644 (file)
@@ -22,6 +22,10 @@ package org.sonar.batch.debt;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Lists;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import javax.annotation.Nullable;
 import org.sonar.api.batch.Decorator;
 import org.sonar.api.batch.DecoratorContext;
 import org.sonar.api.batch.DependedUpon;
@@ -35,12 +39,6 @@ import org.sonar.api.resources.Project;
 import org.sonar.api.resources.Resource;
 import org.sonar.api.resources.ResourceUtils;
 
-import javax.annotation.Nullable;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
 /**
  * Decorator that computes Sqale Rating metric
  */
@@ -95,7 +93,7 @@ public class SqaleRatingDecorator implements Decorator {
     }
   }
 
-  private Measure createRatingMeasure(int rating) {
+  private static Measure createRatingMeasure(int rating) {
     return new Measure(CoreMetrics.SQALE_RATING).setIntValue(rating).setData(toRatingLetter(rating));
   }
 
@@ -132,7 +130,7 @@ public class SqaleRatingDecorator implements Decorator {
     return sum;
   }
 
-  private long getMeasureValue(DecoratorContext context, Metric metric) {
+  private static long getMeasureValue(DecoratorContext context, Metric metric) {
     Measure measure = context.getMeasure(metric);
     if (measure != null) {
       return measure.getValue().longValue();
index bb186b177fc6f5e9fb03df8e03f7ec9e19a4e6b4..ca80f62a96ba428abdfc74e379198b78f132a65b 100644 (file)
 
 package org.sonar.batch.debt;
 
-import org.sonar.api.batch.BatchSide;
+import javax.annotation.Nullable;
 import org.sonar.api.CoreProperties;
+import org.sonar.api.batch.BatchSide;
 import org.sonar.api.config.Settings;
 import org.sonar.api.measures.Metric;
 
-import javax.annotation.Nullable;
-
 @BatchSide
 public class SqaleRatingSettings {
 
@@ -76,7 +75,7 @@ public class SqaleRatingSettings {
     return getMetricForKey(settings.getString(CoreProperties.SIZE_METRIC), metrics);
   }
 
-  private Metric getMetricForKey(String sizeMetricKey, Metric[] metrics) {
+  private static Metric getMetricForKey(String sizeMetricKey, Metric[] metrics) {
     for (Metric metric : metrics) {
       if (metric.getKey().equals(sizeMetricKey)) {
         return metric;
index f17b42c18dbcba2f749882c00c63d15cb48c492f..2586d4f898ad1e066e8e555aa5b907bdda718408 100644 (file)
@@ -21,6 +21,7 @@ package org.sonar.batch.issue;
 
 import com.google.common.base.Objects;
 import com.google.common.base.Strings;
+import javax.annotation.Nullable;
 import org.sonar.api.batch.debt.DebtRemediationFunction;
 import org.sonar.api.batch.rule.ActiveRule;
 import org.sonar.api.batch.rule.ActiveRules;
@@ -35,8 +36,6 @@ import org.sonar.api.utils.Duration;
 import org.sonar.api.utils.MessageException;
 import org.sonar.core.issue.DefaultIssueBuilder;
 
-import javax.annotation.Nullable;
-
 /**
  * Initialize the issues raised during scan.
  */
@@ -98,7 +97,7 @@ public class ModuleIssues {
     return false;
   }
 
-  private void validateRule(DefaultIssue issue, Rule rule) {
+  private static void validateRule(DefaultIssue issue, @Nullable Rule rule) {
     RuleKey ruleKey = issue.ruleKey();
     if (rule == null) {
       throw MessageException.of(String.format("The rule '%s' does not exist.", ruleKey));
index c886d93bf51c6214ab02d6bb64a10df8328a7f3d..9a8af6d87efb55e799d45af6bb9166c01730f618 100644 (file)
@@ -22,6 +22,8 @@ package org.sonar.batch.rule;
 
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ListMultimap;
+import java.util.List;
+import javax.annotation.Nullable;
 import org.picocontainer.injectors.ProviderAdapter;
 import org.sonar.api.batch.debt.DebtCharacteristic;
 import org.sonar.api.batch.debt.DebtModel;
@@ -38,9 +40,6 @@ import org.sonar.core.rule.RuleDao;
 import org.sonar.core.rule.RuleDto;
 import org.sonar.core.rule.RuleParamDto;
 
-import javax.annotation.Nullable;
-import java.util.List;
-
 /**
  * Loads all enabled and non manual rules
  */
@@ -88,7 +87,7 @@ public class RulesProvider extends ProviderAdapter {
     return rulesBuilder.build();
   }
 
-  private DebtCharacteristic effectiveCharacteristic(RuleDto ruleDto, RuleKey ruleKey, DefaultDebtModel debtModel) {
+  private static DebtCharacteristic effectiveCharacteristic(RuleDto ruleDto, RuleKey ruleKey, DefaultDebtModel debtModel) {
     Integer subCharacteristicId = ruleDto.getSubCharacteristicId();
     Integer defaultSubCharacteristicId = ruleDto.getDefaultSubCharacteristicId();
     Integer effectiveSubCharacteristicId = subCharacteristicId != null ? subCharacteristicId : defaultSubCharacteristicId;
@@ -121,7 +120,7 @@ public class RulesProvider extends ProviderAdapter {
    * Return true is the characteristic has not been overridden and a default characteristic is existing or
    * if the characteristic has been overridden but is not disabled
    */
-  private boolean hasCharacteristic(RuleDto ruleDto) {
+  private static boolean hasCharacteristic(RuleDto ruleDto) {
     Integer subCharacteristicId = ruleDto.getSubCharacteristicId();
     return (subCharacteristicId == null && ruleDto.getDefaultSubCharacteristicId() != null) ||
       (subCharacteristicId != null && !RuleDto.DISABLED_CHARACTERISTIC_ID.equals(subCharacteristicId));
index 99dbf58c3e228e172dfed07fecdede62a81dc819..6857590eddafcc9c7ca0d4bb5cb3001f2fa5d6ea 100644 (file)
@@ -25,6 +25,11 @@ import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.SetMultimap;
+import java.io.IOException;
+import java.io.InvalidClassException;
+import java.util.Arrays;
+import java.util.List;
+import javax.annotation.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.sonar.api.batch.RequiresDB;
@@ -35,13 +40,6 @@ import org.sonar.core.notification.db.NotificationQueueDao;
 import org.sonar.core.notification.db.NotificationQueueDto;
 import org.sonar.core.properties.PropertiesDao;
 
-import javax.annotation.Nullable;
-
-import java.io.IOException;
-import java.io.InvalidClassException;
-import java.util.Arrays;
-import java.util.List;
-
 /**
  * @since 2.10
  */
@@ -175,7 +173,7 @@ public class DefaultNotificationManager implements NotificationManager {
     return Arrays.asList(notificationChannels);
   }
 
-  private void addUsersToRecipientListForChannel(List<String> users, SetMultimap<String, NotificationChannel> recipients, NotificationChannel channel) {
+  private static void addUsersToRecipientListForChannel(List<String> users, SetMultimap<String, NotificationChannel> recipients, NotificationChannel channel) {
     for (String username : users) {
       recipients.put(username, channel);
     }
index 003469b15508f38419d3df85e0c8377537f57187..3f651d3f5281b885f1635e56c89cb4a600b59f7c 100644 (file)
@@ -22,12 +22,10 @@ package org.sonar.core.permission;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
-import org.apache.commons.lang.StringUtils;
-
+import java.util.Set;
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
-
-import java.util.Set;
+import org.apache.commons.lang.StringUtils;
 
 /**
  * Query used to get users and groups from a permission
@@ -70,7 +68,7 @@ public class PermissionQuery {
     this.pageIndex = builder.pageIndex;
   }
 
-  private String searchToSql(@Nullable String s) {
+  private static String searchToSql(@Nullable String s) {
     String sql = null;
     if (s != null) {
       sql = StringUtils.replace(StringUtils.upperCase(s), "%", "/%");
index 37d41bac024e5a5575b9d8299ab109e33261c19b..34aa6008dee8458173dc48fb121822746cf41b6b 100644 (file)
@@ -22,15 +22,14 @@ package org.sonar.core.resource;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
-import org.apache.commons.lang.StringUtils;
-import org.apache.ibatis.session.SqlSession;
-import org.sonar.core.persistence.DbSession;
-import org.sonar.core.persistence.MyBatis;
-
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import org.apache.commons.lang.StringUtils;
+import org.apache.ibatis.session.SqlSession;
+import org.sonar.core.persistence.DbSession;
+import org.sonar.core.persistence.MyBatis;
 
 /**
  * Class used to rename the key of a project and its resources.
@@ -117,11 +116,11 @@ public class ResourceKeyUpdaterDao {
     }
   }
 
-  private String computeNewKey(ResourceDto resource, String stringToReplace, String replacementString) {
+  private static String computeNewKey(ResourceDto resource, String stringToReplace, String replacementString) {
     return resource.getKey().replaceAll(stringToReplace, replacementString);
   }
 
-  private void runBatchUpdateForAllResources(Collection<ResourceDto> resources, String oldKey, String newKey, ResourceKeyUpdaterMapper mapper) {
+  private static void runBatchUpdateForAllResources(Collection<ResourceDto> resources, String oldKey, String newKey, ResourceKeyUpdaterMapper mapper) {
     for (ResourceDto resource : resources) {
       String resourceKey = resource.getKey();
       resource.setKey(newKey + resourceKey.substring(oldKey.length(), resourceKey.length()));
index cc7bb97cf8b39f0470301ed816a9950028ec3827..09214a071deb39af56f48a6ec3afe9a7375f25a0 100644 (file)
  */
 package org.sonar.core.timemachine;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
 import org.apache.commons.lang.StringUtils;
-import org.sonar.api.batch.BatchSide;
 import org.sonar.api.CoreProperties;
-import org.sonar.api.server.ServerSide;
+import org.sonar.api.batch.BatchSide;
 import org.sonar.api.batch.RequiresDB;
 import org.sonar.api.config.Settings;
 import org.sonar.api.database.model.Snapshot;
 import org.sonar.api.i18n.I18n;
-
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Locale;
+import org.sonar.api.server.ServerSide;
 
 import static org.sonar.api.utils.DateUtils.longToDate;
 
@@ -133,7 +131,7 @@ public class Periods {
   }
 
   @CheckForNull
-  private String convertDate(Date date) {
+  private static String convertDate(Date date) {
     if (date != null) {
       SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy MMM dd");
       return dateFormat.format(date);
@@ -141,7 +139,7 @@ public class Periods {
     return null;
   }
 
-  private Locale getLocale() {
+  private static Locale getLocale() {
     return Locale.ENGLISH;
   }
 
@@ -168,7 +166,7 @@ public class Periods {
       }
     }
 
-    private Integer findByDays(String property) {
+    private static Integer findByDays(String property) {
       try {
         return Integer.parseInt(property);
       } catch (NumberFormatException e) {
@@ -176,7 +174,7 @@ public class Periods {
       }
     }
 
-    private Date findByDate(String property) {
+    private static Date findByDate(String property) {
       SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
       try {
         return format.parse(property);
index 1fae7519f9dd2914e7f260f15a735593d94cdbf0..75f1fdb44b038d92e4dd4f7ddbe23a9b8ee8c4c7 100644 (file)
@@ -64,7 +64,7 @@ public class GroupMembershipQuery {
     this.pageIndex = builder.pageIndex;
   }
 
-  private String groupSearchToSql(@Nullable String s) {
+  private static String groupSearchToSql(@Nullable String s) {
     String sql = null;
     if (s != null) {
       sql = StringUtils.replace(StringUtils.upperCase(s), "%", "/%");
index faa300d25902aa511978eba2824f976be65bb534..b8b6eaefc2a3823b986a66b32e06c63da76a8f7e 100644 (file)
@@ -22,13 +22,11 @@ package org.sonar.api.issue.internal;
 import com.google.common.base.Splitter;
 import com.google.common.base.Strings;
 import com.google.common.collect.Maps;
-
-import javax.annotation.CheckForNull;
-import javax.annotation.Nullable;
-
 import java.io.Serializable;
 import java.util.Date;
 import java.util.Map;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
 
 /**
  * PLUGINS MUST NOT USE THIS CLASS, EXCEPT FOR UNIT TESTING.
@@ -168,7 +166,7 @@ public class FieldDiffs implements Serializable {
     }
 
     @CheckForNull
-    private Long toLong(Serializable value) {
+    private static Long toLong(@Nullable Serializable value) {
       if (value != null && !"".equals(value)) {
         try {
           return Long.valueOf((String) value);
index 64283bfdce11117bcd58b291284b89da6e49a8c9..976508710d6220f658ff9f89040b0045dcbce57f 100644 (file)
@@ -20,9 +20,8 @@
 
 package org.sonar.api.measures;
 
-import org.sonar.api.resources.ResourceUtils;
-
 import java.util.List;
+import org.sonar.api.resources.ResourceUtils;
 
 import static com.google.common.collect.Lists.newArrayList;
 
@@ -130,7 +129,7 @@ public class AverageFormula implements Formula {
     return result;
   }
 
-  private boolean shouldDecorateResource(FormulaData data, FormulaContext context) {
+  private static boolean shouldDecorateResource(FormulaData data, FormulaContext context) {
     return !MeasureUtils.hasValue(data.getMeasure(context.getTargetMetric()));
   }
 }
index 0014f8df527cd5f506e8b6e921a581f569e83e65..d0489dd9a65985e0170a35806947f0877c7c326c 100644 (file)
@@ -22,16 +22,10 @@ package org.sonar.api.rules;
 
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableSet;
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.apache.commons.lang.builder.HashCodeBuilder;
-import org.apache.commons.lang.builder.ToStringBuilder;
-import org.apache.commons.lang.builder.ToStringStyle;
-import org.sonar.api.database.DatabaseProperties;
-import org.sonar.api.rule.RuleKey;
-import org.sonar.api.utils.SonarException;
-import org.sonar.check.Cardinality;
-
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
 import javax.persistence.Column;
@@ -48,11 +42,15 @@ import javax.persistence.Table;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 import javax.persistence.Transient;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.commons.lang.builder.ToStringBuilder;
+import org.apache.commons.lang.builder.ToStringStyle;
+import org.sonar.api.database.DatabaseProperties;
+import org.sonar.api.rule.RuleKey;
+import org.sonar.api.utils.SonarException;
+import org.sonar.check.Cardinality;
 
 @Entity
 @Table(name = "rules")
@@ -560,7 +558,7 @@ public class Rule {
   }
 
   @CheckForNull
-  private String removeNewLineCharacters(@Nullable String text) {
+  private static String removeNewLineCharacters(@Nullable String text) {
     String removedCRLF = StringUtils.remove(text, "\n");
     removedCRLF = StringUtils.remove(removedCRLF, "\r");
     removedCRLF = StringUtils.remove(removedCRLF, "\n\r");
index cc8c3b7b897a2b0afbee62d81fd5e293f3c71ceb..1d2abe1cdf313f7d6865624e2318b5b197325d69 100644 (file)
  */
 package org.sonar.api.server.rule;
 
+import java.util.List;
 import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.commons.lang.StringUtils;
 import org.sonar.api.PropertyType;
 
-import java.util.List;
-
 import static com.google.common.collect.Lists.newArrayList;
 
 /**
@@ -75,7 +74,7 @@ public final class RuleParamType {
     this.multiple = multiple;
   }
 
-  private String valuesToCsv(String... values) {
+  private static String valuesToCsv(String... values) {
     StringBuilder sb = new StringBuilder();
     for (String value : values) {
       sb.append(StringEscapeUtils.escapeCsv(value));
index 6f0eccafb456a578daad7850679091268b2c5541..4f88279c6d5c0720991f17f1496a271cccfea24e 100644 (file)
 
 package org.sonar.api.utils;
 
+import java.util.Locale;
+import javax.annotation.CheckForNull;
 import org.sonar.api.CoreProperties;
 import org.sonar.api.batch.BatchSide;
 import org.sonar.api.config.Settings;
 import org.sonar.api.i18n.I18n;
 import org.sonar.api.server.ServerSide;
 
-import javax.annotation.CheckForNull;
-
-import java.util.Locale;
-
 /**
  * Used through ruby code <pre>Internal.durations</pre>
  *
@@ -133,15 +131,15 @@ public class Durations {
     return i18n.message(locale, key, null, parameter);
   }
 
-  private boolean displayHours(int days, int hours) {
+  private static boolean displayHours(int days, int hours) {
     return hours > 0 && days < 10;
   }
 
-  private boolean displayMinutes(int days, int hours, int minutes) {
+  private static boolean displayMinutes(int days, int hours, int minutes) {
     return minutes > 0 && hours < 10 && days == 0;
   }
 
-  private void addSpaceIfNeeded(StringBuilder message) {
+  private static void addSpaceIfNeeded(StringBuilder message) {
     if (message.length() > 0) {
       message.append(" ");
     }