diff options
author | Julien HENRY <julien.henry@sonarsource.com> | 2014-12-02 17:33:57 +0100 |
---|---|---|
committer | Julien HENRY <julien.henry@sonarsource.com> | 2014-12-02 17:34:39 +0100 |
commit | 762cd8422271127f2f61ef9a8b588be2e8406a47 (patch) | |
tree | dec7cf1ba18e7998f78f2afe79239a37a8923413 | |
parent | 0c026d37f54d36956940094f8ee8f39dfed6c56d (diff) | |
download | sonarqube-762cd8422271127f2f61ef9a8b588be2e8406a47.tar.gz sonarqube-762cd8422271127f2f61ef9a8b588be2e8406a47.zip |
SONAR-5869 Remove SnapshotSourceDto and all related code. Remove colorizer stuff on server side.
41 files changed, 398 insertions, 1415 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java b/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java index bb17c1796ea..922cdc96ae0 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java +++ b/server/sonar-server/src/main/java/org/sonar/server/platform/ServerComponents.java @@ -53,7 +53,13 @@ import org.sonar.core.measure.db.MeasureFilterDao; import org.sonar.core.metric.DefaultMetricFinder; import org.sonar.core.notification.DefaultNotificationManager; import org.sonar.core.permission.PermissionFacade; -import org.sonar.core.persistence.*; +import org.sonar.core.persistence.DaoUtils; +import org.sonar.core.persistence.DatabaseVersion; +import org.sonar.core.persistence.DefaultDatabase; +import org.sonar.core.persistence.MyBatis; +import org.sonar.core.persistence.PreviewDatabaseFactory; +import org.sonar.core.persistence.SemaphoreUpdater; +import org.sonar.core.persistence.SemaphoresImpl; import org.sonar.core.preview.PreviewCache; import org.sonar.core.profiling.Profiling; import org.sonar.core.purge.PurgeProfiler; @@ -79,7 +85,11 @@ import org.sonar.server.activity.index.ActivityNormalizer; import org.sonar.server.activity.ws.ActivitiesWebService; import org.sonar.server.activity.ws.ActivityMapping; import org.sonar.server.authentication.ws.AuthenticationWs; -import org.sonar.server.batch.*; +import org.sonar.server.batch.BatchIndex; +import org.sonar.server.batch.BatchWs; +import org.sonar.server.batch.GlobalReferentialsAction; +import org.sonar.server.batch.ProjectReferentialsAction; +import org.sonar.server.batch.UploadReportAction; import org.sonar.server.charts.ChartFactory; import org.sonar.server.component.ComponentCleanerService; import org.sonar.server.component.ComponentService; @@ -87,10 +97,30 @@ import org.sonar.server.component.DefaultComponentFinder; import org.sonar.server.component.DefaultRubyComponentService; import org.sonar.server.component.db.ComponentDao; import org.sonar.server.component.db.SnapshotDao; -import org.sonar.server.component.ws.*; -import org.sonar.server.computation.*; +import org.sonar.server.component.ws.ComponentAppAction; +import org.sonar.server.component.ws.ComponentsWs; +import org.sonar.server.component.ws.EventsWs; +import org.sonar.server.component.ws.ProjectsWs; +import org.sonar.server.component.ws.ResourcesWs; +import org.sonar.server.computation.AnalysisReportQueue; +import org.sonar.server.computation.AnalysisReportTaskCleaner; +import org.sonar.server.computation.AnalysisReportTaskLauncher; +import org.sonar.server.computation.ComponentIndexationInDatabaseStep; +import org.sonar.server.computation.ComputationService; +import org.sonar.server.computation.ComputationStepRegistry; +import org.sonar.server.computation.DataCleanerStep; +import org.sonar.server.computation.DigestAnalysisReportStep; +import org.sonar.server.computation.IndexProjectIssuesStep; +import org.sonar.server.computation.InvalidatePreviewCacheStep; +import org.sonar.server.computation.SwitchSnapshotStep; +import org.sonar.server.computation.SynchronizeProjectPermissionsStep; import org.sonar.server.computation.db.AnalysisReportDao; -import org.sonar.server.computation.ws.*; +import org.sonar.server.computation.ws.ActiveAnalysisReportsAction; +import org.sonar.server.computation.ws.AnalysisReportHistorySearchAction; +import org.sonar.server.computation.ws.AnalysisReportWebService; +import org.sonar.server.computation.ws.ExperimentalAnalysisReportAction; +import org.sonar.server.computation.ws.ExperimentalAnalysisReportWebService; +import org.sonar.server.computation.ws.IsAnalysisReportQueueEmptyAction; import org.sonar.server.config.ws.PropertiesWs; import org.sonar.server.dashboard.db.DashboardDao; import org.sonar.server.dashboard.db.WidgetDao; @@ -102,13 +132,35 @@ import org.sonar.server.db.DbClient; import org.sonar.server.db.EmbeddedDatabaseFactory; import org.sonar.server.db.migrations.DatabaseMigrations; import org.sonar.server.db.migrations.DatabaseMigrator; -import org.sonar.server.debt.*; +import org.sonar.server.debt.DebtCharacteristicsXMLImporter; +import org.sonar.server.debt.DebtModelBackup; +import org.sonar.server.debt.DebtModelLookup; +import org.sonar.server.debt.DebtModelOperations; +import org.sonar.server.debt.DebtModelPluginRepository; +import org.sonar.server.debt.DebtModelService; +import org.sonar.server.debt.DebtModelXMLExporter; +import org.sonar.server.debt.DebtRulesXMLImporter; import org.sonar.server.design.FileDesignWidget; import org.sonar.server.duplication.ws.DuplicationsJsonWriter; import org.sonar.server.duplication.ws.DuplicationsParser; import org.sonar.server.duplication.ws.DuplicationsWs; -import org.sonar.server.es.*; -import org.sonar.server.issue.*; +import org.sonar.server.es.EsClient; +import org.sonar.server.es.IndexCreator; +import org.sonar.server.es.IndexRegistry; +import org.sonar.server.issue.ActionService; +import org.sonar.server.issue.AssignAction; +import org.sonar.server.issue.CommentAction; +import org.sonar.server.issue.InternalRubyIssueService; +import org.sonar.server.issue.IssueBulkChangeService; +import org.sonar.server.issue.IssueChangelogFormatter; +import org.sonar.server.issue.IssueChangelogService; +import org.sonar.server.issue.IssueCommentService; +import org.sonar.server.issue.IssueQueryService; +import org.sonar.server.issue.IssueService; +import org.sonar.server.issue.PlanAction; +import org.sonar.server.issue.ServerIssueStorage; +import org.sonar.server.issue.SetSeverityAction; +import org.sonar.server.issue.TransitionAction; import org.sonar.server.issue.actionplan.ActionPlanService; import org.sonar.server.issue.actionplan.ActionPlanWs; import org.sonar.server.issue.db.IssueDao; @@ -141,32 +193,117 @@ import org.sonar.server.platform.ws.L10nWs; import org.sonar.server.platform.ws.RestartHandler; import org.sonar.server.platform.ws.ServerWs; import org.sonar.server.platform.ws.SystemWs; -import org.sonar.server.plugins.*; +import org.sonar.server.plugins.InstalledPluginReferentialFactory; +import org.sonar.server.plugins.PluginDownloader; +import org.sonar.server.plugins.ServerExtensionInstaller; +import org.sonar.server.plugins.ServerPluginJarInstaller; +import org.sonar.server.plugins.ServerPluginJarsInstaller; +import org.sonar.server.plugins.ServerPluginRepository; +import org.sonar.server.plugins.UpdateCenterClient; +import org.sonar.server.plugins.UpdateCenterMatrixFactory; import org.sonar.server.properties.ProjectSettingsFactory; import org.sonar.server.qualitygate.QgateProjectFinder; import org.sonar.server.qualitygate.QualityGates; import org.sonar.server.qualitygate.RegisterQualityGates; -import org.sonar.server.qualitygate.ws.*; -import org.sonar.server.qualityprofile.*; +import org.sonar.server.qualitygate.ws.QGatesAppAction; +import org.sonar.server.qualitygate.ws.QGatesCopyAction; +import org.sonar.server.qualitygate.ws.QGatesCreateAction; +import org.sonar.server.qualitygate.ws.QGatesCreateConditionAction; +import org.sonar.server.qualitygate.ws.QGatesDeleteConditionAction; +import org.sonar.server.qualitygate.ws.QGatesDeselectAction; +import org.sonar.server.qualitygate.ws.QGatesDestroyAction; +import org.sonar.server.qualitygate.ws.QGatesListAction; +import org.sonar.server.qualitygate.ws.QGatesRenameAction; +import org.sonar.server.qualitygate.ws.QGatesSearchAction; +import org.sonar.server.qualitygate.ws.QGatesSelectAction; +import org.sonar.server.qualitygate.ws.QGatesSetAsDefaultAction; +import org.sonar.server.qualitygate.ws.QGatesShowAction; +import org.sonar.server.qualitygate.ws.QGatesUnsetDefaultAction; +import org.sonar.server.qualitygate.ws.QGatesUpdateConditionAction; +import org.sonar.server.qualitygate.ws.QGatesWs; +import org.sonar.server.qualityprofile.BuiltInProfiles; +import org.sonar.server.qualityprofile.QProfileBackuper; +import org.sonar.server.qualityprofile.QProfileCopier; +import org.sonar.server.qualityprofile.QProfileExporters; +import org.sonar.server.qualityprofile.QProfileFactory; +import org.sonar.server.qualityprofile.QProfileLoader; +import org.sonar.server.qualityprofile.QProfileLookup; +import org.sonar.server.qualityprofile.QProfileProjectLookup; +import org.sonar.server.qualityprofile.QProfileProjectOperations; +import org.sonar.server.qualityprofile.QProfileReset; +import org.sonar.server.qualityprofile.QProfileService; +import org.sonar.server.qualityprofile.QProfiles; +import org.sonar.server.qualityprofile.RegisterQualityProfiles; +import org.sonar.server.qualityprofile.RuleActivator; +import org.sonar.server.qualityprofile.RuleActivatorContextFactory; import org.sonar.server.qualityprofile.db.ActiveRuleDao; import org.sonar.server.qualityprofile.index.ActiveRuleIndex; import org.sonar.server.qualityprofile.index.ActiveRuleNormalizer; -import org.sonar.server.qualityprofile.ws.*; -import org.sonar.server.rule.*; +import org.sonar.server.qualityprofile.ws.BulkRuleActivationActions; +import org.sonar.server.qualityprofile.ws.ProfilesWs; +import org.sonar.server.qualityprofile.ws.QProfileRestoreBuiltInAction; +import org.sonar.server.qualityprofile.ws.QProfilesWs; +import org.sonar.server.qualityprofile.ws.RuleActivationActions; +import org.sonar.server.rule.DefaultRuleFinder; +import org.sonar.server.rule.DeprecatedRulesDefinitionLoader; +import org.sonar.server.rule.RegisterRules; +import org.sonar.server.rule.RubyRuleService; +import org.sonar.server.rule.RuleCreator; +import org.sonar.server.rule.RuleDefinitionsLoader; +import org.sonar.server.rule.RuleDeleter; +import org.sonar.server.rule.RuleOperations; +import org.sonar.server.rule.RuleRepositories; +import org.sonar.server.rule.RuleService; +import org.sonar.server.rule.RuleUpdater; import org.sonar.server.rule.db.RuleDao; import org.sonar.server.rule.index.RuleIndex; import org.sonar.server.rule.index.RuleNormalizer; -import org.sonar.server.rule.ws.*; -import org.sonar.server.search.*; -import org.sonar.server.source.*; +import org.sonar.server.rule.ws.ActiveRuleCompleter; +import org.sonar.server.rule.ws.AppAction; +import org.sonar.server.rule.ws.DeleteAction; +import org.sonar.server.rule.ws.RuleMapping; +import org.sonar.server.rule.ws.RulesWebService; +import org.sonar.server.rule.ws.SearchAction; +import org.sonar.server.rule.ws.TagsAction; +import org.sonar.server.rule.ws.UpdateAction; +import org.sonar.server.search.IndexClient; +import org.sonar.server.search.IndexQueue; +import org.sonar.server.search.IndexSynchronizer; +import org.sonar.server.search.SearchClient; +import org.sonar.server.search.SearchHealth; +import org.sonar.server.source.HtmlSourceDecorator; +import org.sonar.server.source.IndexSourceLinesStep; +import org.sonar.server.source.SourceService; import org.sonar.server.source.index.SourceLineIndex; import org.sonar.server.source.index.SourceLineIndexDefinition; import org.sonar.server.source.index.SourceLineIndexer; -import org.sonar.server.source.ws.*; +import org.sonar.server.source.ws.HashAction; +import org.sonar.server.source.ws.LinesAction; +import org.sonar.server.source.ws.RawAction; +import org.sonar.server.source.ws.ScmAction; +import org.sonar.server.source.ws.ScmWriter; import org.sonar.server.source.ws.ShowAction; -import org.sonar.server.startup.*; +import org.sonar.server.source.ws.SourcesWs; +import org.sonar.server.startup.CleanPreviewAnalysisCache; +import org.sonar.server.startup.CopyRequirementsFromCharacteristicsToRules; +import org.sonar.server.startup.GeneratePluginIndex; +import org.sonar.server.startup.JdbcDriverDeployer; +import org.sonar.server.startup.LogServerId; +import org.sonar.server.startup.RegisterDashboards; +import org.sonar.server.startup.RegisterDebtModel; +import org.sonar.server.startup.RegisterMetrics; +import org.sonar.server.startup.RegisterNewMeasureFilters; +import org.sonar.server.startup.RegisterPermissionTemplates; +import org.sonar.server.startup.RegisterServletFilters; +import org.sonar.server.startup.RenameDeprecatedPropertyKeys; +import org.sonar.server.startup.ServerMetadataPersister; import org.sonar.server.test.CoverageService; -import org.sonar.server.test.ws.*; +import org.sonar.server.test.ws.CoverageShowAction; +import org.sonar.server.test.ws.CoverageWs; +import org.sonar.server.test.ws.TestsCoveredFilesAction; +import org.sonar.server.test.ws.TestsShowAction; +import org.sonar.server.test.ws.TestsTestCasesAction; +import org.sonar.server.test.ws.TestsWs; import org.sonar.server.text.MacroInterpreter; import org.sonar.server.text.RubyTextService; import org.sonar.server.ui.JRubyI18n; @@ -174,12 +311,23 @@ import org.sonar.server.ui.JRubyProfiling; import org.sonar.server.ui.PageDecorations; import org.sonar.server.ui.Views; import org.sonar.server.updatecenter.ws.UpdateCenterWs; -import org.sonar.server.user.*; +import org.sonar.server.user.DefaultUserService; +import org.sonar.server.user.DoPrivileged; +import org.sonar.server.user.GroupMembershipFinder; +import org.sonar.server.user.GroupMembershipService; +import org.sonar.server.user.NewUserNotifier; +import org.sonar.server.user.SecurityRealmFactory; import org.sonar.server.user.db.GroupDao; import org.sonar.server.user.ws.FavoritesWs; import org.sonar.server.user.ws.UserPropertiesWs; import org.sonar.server.user.ws.UsersWs; -import org.sonar.server.util.*; +import org.sonar.server.util.BooleanTypeValidation; +import org.sonar.server.util.FloatTypeValidation; +import org.sonar.server.util.IntegerTypeValidation; +import org.sonar.server.util.StringListTypeValidation; +import org.sonar.server.util.StringTypeValidation; +import org.sonar.server.util.TextTypeValidation; +import org.sonar.server.util.TypeValidations; import org.sonar.server.ws.ListingWs; import org.sonar.server.ws.WebServiceEngine; @@ -326,7 +474,6 @@ class ServerComponents { pico.addSingleton(ChartFactory.class); pico.addSingleton(Languages.class); pico.addSingleton(Views.class); - pico.addSingleton(CodeColorizers.class); pico.addSingleton(ResourceTypes.class); pico.addSingleton(SettingsChangeNotifier.class); pico.addSingleton(PageDecorations.class); @@ -538,7 +685,6 @@ class ServerComponents { // source pico.addSingleton(HtmlSourceDecorator.class); - pico.addSingleton(DeprecatedSourceDecorator.class); pico.addSingleton(SourceService.class); pico.addSingleton(SourcesWs.class); pico.addSingleton(ShowAction.class); diff --git a/server/sonar-server/src/main/java/org/sonar/server/source/CodeColorizers.java b/server/sonar-server/src/main/java/org/sonar/server/source/CodeColorizers.java deleted file mode 100644 index 99b7942ad7d..00000000000 --- a/server/sonar-server/src/main/java/org/sonar/server/source/CodeColorizers.java +++ /dev/null @@ -1,70 +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.source; - -import com.google.common.collect.Lists; -import org.apache.commons.lang.StringUtils; -import org.slf4j.LoggerFactory; -import org.sonar.api.ServerExtension; -import org.sonar.api.web.CodeColorizerFormat; -import org.sonar.colorizer.CodeColorizer; -import org.sonar.colorizer.HtmlOptions; -import org.sonar.colorizer.Tokenizer; - -import java.io.StringReader; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Central point for sonar-colorizer extensions - */ -public class CodeColorizers implements ServerExtension { - - private final Map<String, CodeColorizerFormat> byLang; - - public CodeColorizers(List<CodeColorizerFormat> formats) { - byLang = new HashMap<String, CodeColorizerFormat>(); - for (CodeColorizerFormat format : formats) { - byLang.put(format.getLanguageKey(), format); - } - - LoggerFactory.getLogger(getClass()).info("Code colorizer, supported languages: " + StringUtils.join(byLang.keySet(), ",")); - } - - /** - * Used when no plugin is defining some CodeColorizerFormat - */ - public CodeColorizers() { - this(Lists.<CodeColorizerFormat>newArrayList()); - } - - public String toHtml(String code, String language) { - CodeColorizerFormat format = byLang.get(language); - List<Tokenizer> tokenizers; - if (format == null) { - tokenizers = Collections.emptyList(); - } else { - tokenizers = format.getTokenizers(); - } - return new CodeColorizer(tokenizers).toHtml(new StringReader(code), HtmlOptions.ONLY_SYNTAX); - } -} diff --git a/server/sonar-server/src/main/java/org/sonar/server/source/DeprecatedSourceDecorator.java b/server/sonar-server/src/main/java/org/sonar/server/source/DeprecatedSourceDecorator.java deleted file mode 100644 index 30a1b416862..00000000000 --- a/server/sonar-server/src/main/java/org/sonar/server/source/DeprecatedSourceDecorator.java +++ /dev/null @@ -1,95 +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.source; - -import com.google.common.base.Splitter; -import org.sonar.api.ServerComponent; -import org.sonar.core.persistence.DbSession; -import org.sonar.core.persistence.MyBatis; -import org.sonar.core.resource.ResourceDao; -import org.sonar.core.resource.ResourceDto; -import org.sonar.core.resource.ResourceQuery; -import org.sonar.core.source.db.SnapshotSourceDao; -import org.sonar.server.exceptions.NotFoundException; - -import javax.annotation.CheckForNull; -import javax.annotation.Nullable; - -import java.util.List; - -import static com.google.common.collect.Lists.newArrayList; - -/** - * When a plugin do not use the new API to add syntax highlighting on source code, this class is called to add html info on source code - */ -public class DeprecatedSourceDecorator implements ServerComponent { - - private final MyBatis mybatis; - private final ResourceDao resourceDao; - private final CodeColorizers codeColorizers; - private final SnapshotSourceDao snapshotSourceDao; - - public DeprecatedSourceDecorator(MyBatis mybatis, ResourceDao resourceDao, CodeColorizers codeColorizers, SnapshotSourceDao snapshotSourceDao) { - this.mybatis = mybatis; - this.resourceDao = resourceDao; - this.codeColorizers = codeColorizers; - this.snapshotSourceDao = snapshotSourceDao; - } - - @CheckForNull - public List<String> getSourceAsHtml(String componentKey) { - return getSourceAsHtml(componentKey, null, null); - } - - @CheckForNull - public List<String> getSourceAsHtml(String componentKey, @Nullable Integer from, @Nullable Integer to) { - DbSession session = mybatis.openSession(false); - try { - ResourceDto component = resourceDao.getResource(ResourceQuery.create().setKey(componentKey), session); - if (component == null) { - throw new NotFoundException("The component '" + componentKey + "' does not exists."); - } - String source = snapshotSourceDao.selectSnapshotSourceByComponentKey(componentKey, session); - if (source != null) { - return splitSourceByLine(source, component.getLanguage(), from, to); - } else { - return null; - } - } finally { - MyBatis.closeQuietly(session); - } - } - - private List<String> splitSourceByLine(String source, String language, @Nullable Integer from, @Nullable Integer to) { - String htmlSource = codeColorizers.toHtml(source, language); - List<String> splitSource = newArrayList(Splitter.onPattern("\r?\n|\r").split(htmlSource)); - List<String> result = newArrayList(); - for (int i = 0; i < splitSource.size(); i++) { - int currentLine = i + 1; - if (to != null && to < currentLine) { - break; - } else if (from == null || currentLine >= from) { - result.add(splitSource.get(currentLine - 1)); - } - } - return result; - } -} diff --git a/server/sonar-server/src/main/java/org/sonar/server/source/HtmlSourceDecorator.java b/server/sonar-server/src/main/java/org/sonar/server/source/HtmlSourceDecorator.java index 01ee890f8a1..6eafe835590 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/source/HtmlSourceDecorator.java +++ b/server/sonar-server/src/main/java/org/sonar/server/source/HtmlSourceDecorator.java @@ -21,13 +21,9 @@ package org.sonar.server.source; import com.google.common.base.Strings; import com.google.common.collect.Lists; -import org.apache.ibatis.session.SqlSession; import org.sonar.api.ServerComponent; -import org.sonar.core.persistence.MyBatis; import org.sonar.core.source.SnapshotDataTypes; -import org.sonar.core.source.db.SnapshotDataDao; import org.sonar.core.source.db.SnapshotDataDto; -import org.sonar.core.source.db.SnapshotSourceDao; import javax.annotation.CheckForNull; import javax.annotation.Nullable; @@ -39,44 +35,6 @@ public class HtmlSourceDecorator implements ServerComponent { private static final String SINGLE_LINE_SYMBOLS = "single_line_symbols"; - private final MyBatis mybatis; - - private final SnapshotSourceDao snapshotSourceDao; - private final SnapshotDataDao snapshotDataDao; - - public HtmlSourceDecorator(MyBatis mybatis, SnapshotSourceDao snapshotSourceDao, SnapshotDataDao snapshotDataDao) { - this.mybatis = mybatis; - this.snapshotSourceDao = snapshotSourceDao; - this.snapshotDataDao = snapshotDataDao; - } - - @CheckForNull - public List<String> getDecoratedSourceAsHtml(String componentKey, @Nullable Integer from, @Nullable Integer to) { - SqlSession session = mybatis.openSession(false); - try { - Collection<SnapshotDataDto> snapshotDataEntries = snapshotDataDao.selectSnapshotDataByComponentKey(componentKey, highlightingDataTypes(), session); - if (!snapshotDataEntries.isEmpty()) { - String snapshotSource = snapshotSourceDao.selectSnapshotSourceByComponentKey(componentKey, session); - return decorate(snapshotSource, snapshotDataEntries, from, to); - } - return null; - } finally { - MyBatis.closeQuietly(session); - } - } - - @CheckForNull - public List<String> getDecoratedSourceAsHtml(long snapshotId) { - Collection<SnapshotDataDto> snapshotDataEntries = snapshotDataDao.selectSnapshotData(snapshotId, highlightingDataTypes()); - if (!snapshotDataEntries.isEmpty()) { - String snapshotSource = snapshotSourceDao.selectSnapshotSource(snapshotId); - if (snapshotSource != null) { - return decorate(snapshotSource, snapshotDataEntries, null, null); - } - } - return null; - } - @CheckForNull public String getDecoratedSourceAsHtml(@Nullable String sourceLine, @Nullable String highlighting, @Nullable String symbols) { Collection<SnapshotDataDto> snapshotDataEntries = Lists.newArrayList(); @@ -118,11 +76,6 @@ public class HtmlSourceDecorator implements ServerComponent { return null; } - private List<String> highlightingDataTypes() { - return Lists.newArrayList(SnapshotDataTypes.SYNTAX_HIGHLIGHTING, - SnapshotDataTypes.SYMBOL_HIGHLIGHTING); - } - private void loadSnapshotData(DecorationDataHolder dataHolder, SnapshotDataDto entry) { if (!Strings.isNullOrEmpty(entry.getData())) { if (SnapshotDataTypes.SYNTAX_HIGHLIGHTING.equals(entry.getDataType())) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/source/SourceService.java b/server/sonar-server/src/main/java/org/sonar/server/source/SourceService.java index d86f24b683b..4b4add00ce5 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/source/SourceService.java +++ b/server/sonar-server/src/main/java/org/sonar/server/source/SourceService.java @@ -20,7 +20,7 @@ package org.sonar.server.source; -import com.google.common.base.Splitter; +import org.apache.commons.lang.ObjectUtils; import org.elasticsearch.common.collect.Lists; import org.sonar.api.ServerComponent; import org.sonar.api.measures.CoreMetrics; @@ -29,7 +29,6 @@ import org.sonar.core.measure.db.MeasureDto; import org.sonar.core.measure.db.MeasureKey; import org.sonar.core.persistence.DbSession; import org.sonar.core.persistence.MyBatis; -import org.sonar.core.source.db.SnapshotSourceDao; import org.sonar.server.db.DbClient; import org.sonar.server.source.index.SourceLineDoc; import org.sonar.server.source.index.SourceLineIndex; @@ -40,66 +39,40 @@ import javax.annotation.Nullable; import java.util.List; -import static com.google.common.collect.Lists.newArrayList; - public class SourceService implements ServerComponent { private final DbClient dbClient; private final HtmlSourceDecorator sourceDecorator; - private final SnapshotSourceDao snapshotSourceDao; private final SourceLineIndex sourceLineIndex; - /** - * Old service to colorize code - */ - private final DeprecatedSourceDecorator deprecatedSourceDecorator; - - public SourceService(DbClient dbClient, HtmlSourceDecorator sourceDecorator, SnapshotSourceDao snapshotSourceDao, DeprecatedSourceDecorator deprecatedSourceDecorator, - SourceLineIndex sourceLineIndex) { + public SourceService(DbClient dbClient, HtmlSourceDecorator sourceDecorator, SourceLineIndex sourceLineIndex) { this.dbClient = dbClient; this.sourceDecorator = sourceDecorator; - this.snapshotSourceDao = snapshotSourceDao; - this.deprecatedSourceDecorator = deprecatedSourceDecorator; this.sourceLineIndex = sourceLineIndex; } - @CheckForNull - public List<String> getLinesAsHtml(String fileKey) { - return getLinesAsHtml(fileKey, null, null); - } - - @CheckForNull - public List<String> getLinesAsHtml(String fileKey, @Nullable Integer from, @Nullable Integer to) { - checkPermission(fileKey); - - List<String> decoratedSource = sourceDecorator.getDecoratedSourceAsHtml(fileKey, from, to); - if (decoratedSource != null) { - return decoratedSource; - } - return deprecatedSourceDecorator.getSourceAsHtml(fileKey, from, to); - } - /** - * Raw lines of source file. Returns <code>null</code> if the file does not exist + * Raw lines of source file. */ - @CheckForNull - public List<String> getLinesAsTxt(DbSession session, String fileKey) { - checkPermission(fileKey); - - String source = snapshotSourceDao.selectSnapshotSourceByComponentKey(fileKey, session); - if (source != null) { - return newArrayList(Splitter.onPattern("\r?\n|\r").split(source)); + public List<String> getLinesAsTxt(String fileUuid, @Nullable Integer fromParam, @Nullable Integer toParam) { + int from = (Integer) ObjectUtils.defaultIfNull(fromParam, 1); + int to = (Integer) ObjectUtils.defaultIfNull(toParam, Integer.MAX_VALUE); + List<String> lines = Lists.newArrayList(); + for (SourceLineDoc lineDoc : sourceLineIndex.getLines(fileUuid, from, to)) { + lines.add(lineDoc.source()); } - return null; + return lines; } /** - * Raw lines of source file. + * Decorated lines of source file. */ - public List<String> getLinesAsTxt(String fileUuid) { + public List<String> getLinesAsHtml(String fileUuid, @Nullable Integer fromParam, @Nullable Integer toParam) { + int from = (Integer) ObjectUtils.defaultIfNull(fromParam, 1); + int to = (Integer) ObjectUtils.defaultIfNull(toParam, Integer.MAX_VALUE); List<String> lines = Lists.newArrayList(); - for (SourceLineDoc lineDoc: sourceLineIndex.getLines(fileUuid, 1, Integer.MAX_VALUE)) { - lines.add(lineDoc.source()); + for (SourceLineDoc lineDoc : sourceLineIndex.getLines(fileUuid, from, to)) { + lines.add(sourceDecorator.getDecoratedSourceAsHtml(lineDoc.source(), lineDoc.highlighting(), lineDoc.symbols())); } return lines; } diff --git a/server/sonar-server/src/main/java/org/sonar/server/source/index/SourceLineDoc.java b/server/sonar-server/src/main/java/org/sonar/server/source/index/SourceLineDoc.java index 5c9c1123fb5..18cdfcbf0b4 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/source/index/SourceLineDoc.java +++ b/server/sonar-server/src/main/java/org/sonar/server/source/index/SourceLineDoc.java @@ -29,6 +29,7 @@ import javax.annotation.Nullable; import java.util.Collection; import java.util.Date; +import java.util.HashMap; import java.util.Map; public class SourceLineDoc extends BaseDoc { @@ -37,28 +38,36 @@ public class SourceLineDoc extends BaseDoc { super(fields); } + // For testing purpose + public SourceLineDoc() { + this(new HashMap<String, Object>()); + } + public String projectUuid() { return getField(SourceLineIndexDefinition.FIELD_PROJECT_UUID); } - public void setProjectUuid(String projectUuid) { + public SourceLineDoc setProjectUuid(String projectUuid) { setField(SourceLineIndexDefinition.FIELD_PROJECT_UUID, projectUuid); + return this; } public String fileUuid() { return getField(SourceLineIndexDefinition.FIELD_FILE_UUID); } - public void setFileUuid(String fileUuid) { + public SourceLineDoc setFileUuid(String fileUuid) { setField(SourceLineIndexDefinition.FIELD_FILE_UUID, fileUuid); + return this; } public int line() { - return ((Number)getField(SourceLineIndexDefinition.FIELD_LINE)).intValue(); + return ((Number) getField(SourceLineIndexDefinition.FIELD_LINE)).intValue(); } - public void setLine(int line) { + public SourceLineDoc setLine(int line) { setField(SourceLineIndexDefinition.FIELD_LINE, line); + return this; } @CheckForNull @@ -66,8 +75,9 @@ public class SourceLineDoc extends BaseDoc { return getNullableField(SourceLineIndexDefinition.FIELD_SCM_REVISION); } - public void setScmRevision(String scmRevision) { + public SourceLineDoc setScmRevision(String scmRevision) { setField(SourceLineIndexDefinition.FIELD_SCM_REVISION, scmRevision); + return this; } @CheckForNull @@ -75,8 +85,9 @@ public class SourceLineDoc extends BaseDoc { return getNullableField(SourceLineIndexDefinition.FIELD_SCM_AUTHOR); } - public void setScmAuthor(String scmAuthor) { + public SourceLineDoc setScmAuthor(String scmAuthor) { setField(SourceLineIndexDefinition.FIELD_SCM_AUTHOR, scmAuthor); + return this; } @CheckForNull @@ -84,8 +95,9 @@ public class SourceLineDoc extends BaseDoc { return IndexUtils.parseDateTime(this.<String>getNullableField(SourceLineIndexDefinition.FIELD_SCM_DATE)); } - public void setScmDate(@Nullable Date scmDate) { + public SourceLineDoc setScmDate(@Nullable Date scmDate) { setField(SourceLineIndexDefinition.FIELD_SCM_DATE, scmDate); + return this; } @CheckForNull @@ -93,24 +105,27 @@ public class SourceLineDoc extends BaseDoc { return getNullableField(SourceLineIndexDefinition.FIELD_HIGHLIGHTING); } - public void setHighlighting(String s) { + public SourceLineDoc setHighlighting(String s) { setField(SourceLineIndexDefinition.FIELD_HIGHLIGHTING, s); + return this; } public String source() { return getField(SourceLineIndexDefinition.FIELD_SOURCE); } - public void setSource(String source) { + public SourceLineDoc setSource(String source) { setField(SourceLineIndexDefinition.FIELD_SOURCE, source); + return this; } public Date updateDate() { return getFieldAsDate(BaseNormalizer.UPDATED_AT_FIELD); } - public void setUpdateDate(Date updatedAt) { + public SourceLineDoc setUpdateDate(Date updatedAt) { setField(BaseNormalizer.UPDATED_AT_FIELD, updatedAt); + return this; } public String key() { @@ -123,8 +138,9 @@ public class SourceLineDoc extends BaseDoc { return lineHits == null ? null : lineHits.intValue(); } - public void setUtLineHits(@Nullable Integer lineHits) { + public SourceLineDoc setUtLineHits(@Nullable Integer lineHits) { setField(SourceLineIndexDefinition.FIELD_UT_LINE_HITS, lineHits); + return this; } @CheckForNull @@ -133,8 +149,9 @@ public class SourceLineDoc extends BaseDoc { return conditions == null ? null : conditions.intValue(); } - public void setUtConditions(@Nullable Integer conditions) { + public SourceLineDoc setUtConditions(@Nullable Integer conditions) { setField(SourceLineIndexDefinition.FIELD_UT_CONDITIONS, conditions); + return this; } @CheckForNull @@ -143,8 +160,9 @@ public class SourceLineDoc extends BaseDoc { return coveredConditions == null ? null : coveredConditions.intValue(); } - public void setUtCoveredConditions(@Nullable Integer coveredConditions) { + public SourceLineDoc setUtCoveredConditions(@Nullable Integer coveredConditions) { setField(SourceLineIndexDefinition.FIELD_UT_COVERED_CONDITIONS, coveredConditions); + return this; } @CheckForNull @@ -153,8 +171,9 @@ public class SourceLineDoc extends BaseDoc { return lineHits == null ? null : lineHits.intValue(); } - public void setItLineHits(@Nullable Integer lineHits) { + public SourceLineDoc setItLineHits(@Nullable Integer lineHits) { setField(SourceLineIndexDefinition.FIELD_IT_LINE_HITS, lineHits); + return this; } @CheckForNull @@ -163,18 +182,20 @@ public class SourceLineDoc extends BaseDoc { return conditions == null ? null : conditions.intValue(); } - public void setItConditions(@Nullable Integer conditions) { + public SourceLineDoc setItConditions(@Nullable Integer conditions) { setField(SourceLineIndexDefinition.FIELD_IT_CONDITIONS, conditions); + return this; } @CheckForNull public Integer itCoveredConditions() { - Number coveredConditions = (Number)getNullableField(SourceLineIndexDefinition.FIELD_IT_COVERED_CONDITIONS); + Number coveredConditions = (Number) getNullableField(SourceLineIndexDefinition.FIELD_IT_COVERED_CONDITIONS); return coveredConditions == null ? null : coveredConditions.intValue(); } - public void setItCoveredConditions(@Nullable Integer coveredConditions) { + public SourceLineDoc setItCoveredConditions(@Nullable Integer coveredConditions) { setField(SourceLineIndexDefinition.FIELD_IT_COVERED_CONDITIONS, coveredConditions); + return this; } @CheckForNull @@ -183,8 +204,9 @@ public class SourceLineDoc extends BaseDoc { return lineHits == null ? null : lineHits.intValue(); } - public void setOverallLineHits(@Nullable Integer lineHits) { + public SourceLineDoc setOverallLineHits(@Nullable Integer lineHits) { setField(SourceLineIndexDefinition.FIELD_OVERALL_LINE_HITS, lineHits); + return this; } @CheckForNull @@ -193,8 +215,9 @@ public class SourceLineDoc extends BaseDoc { return conditions == null ? null : conditions.intValue(); } - public void setOverallConditions(@Nullable Integer conditions) { + public SourceLineDoc setOverallConditions(@Nullable Integer conditions) { setField(SourceLineIndexDefinition.FIELD_OVERALL_CONDITIONS, conditions); + return this; } @CheckForNull @@ -203,8 +226,9 @@ public class SourceLineDoc extends BaseDoc { return coveredConditions == null ? null : coveredConditions.intValue(); } - public void setOverallCoveredConditions(@Nullable Integer coveredConditions) { + public SourceLineDoc setOverallCoveredConditions(@Nullable Integer coveredConditions) { setField(SourceLineIndexDefinition.FIELD_OVERALL_COVERED_CONDITIONS, coveredConditions); + return this; } @CheckForNull @@ -212,8 +236,9 @@ public class SourceLineDoc extends BaseDoc { return getNullableField(SourceLineIndexDefinition.FIELD_SYMBOLS); } - public void setSymbols(@Nullable String s) { + public SourceLineDoc setSymbols(@Nullable String s) { setField(SourceLineIndexDefinition.FIELD_SYMBOLS, s); + return this; } public Collection<Integer> duplications() { @@ -221,7 +246,8 @@ public class SourceLineDoc extends BaseDoc { return duplications == null ? ImmutableList.<Integer>of() : duplications; } - public void setDuplications(@Nullable Collection<Integer> dups) { + public SourceLineDoc setDuplications(@Nullable Collection<Integer> dups) { setField(SourceLineIndexDefinition.FIELD_DUPLICATIONS, dups == null ? ImmutableList.<Integer>of() : dups); + return this; } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/source/ws/RawAction.java b/server/sonar-server/src/main/java/org/sonar/server/source/ws/RawAction.java index 17eb32ac7af..b6fbb24a965 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/source/ws/RawAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/source/ws/RawAction.java @@ -27,9 +27,9 @@ import org.sonar.api.server.ws.Request; import org.sonar.api.server.ws.RequestHandler; import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; +import org.sonar.core.component.ComponentDto; import org.sonar.core.persistence.DbSession; import org.sonar.server.db.DbClient; -import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.source.SourceService; import java.io.IOException; @@ -64,11 +64,8 @@ public class RawAction implements RequestHandler { String fileKey = request.mandatoryParam("key"); DbSession session = dbClient.openSession(false); try { - dbClient.componentDao().getByKey(session, fileKey); - List<String> lines = sourceService.getLinesAsTxt(session, fileKey); - if (lines == null) { - throw new NotFoundException("File '" + fileKey + "' does not exist"); - } + ComponentDto componentDto = dbClient.componentDao().getByKey(session, fileKey); + List<String> lines = sourceService.getLinesAsTxt(componentDto.uuid(), null, null); IOUtils.writeLines(lines, "\n", response.stream().output(), Charsets.UTF_8); } catch (IOException e) { throw new IllegalStateException("Fail to write raw source of file " + fileKey, e); diff --git a/server/sonar-server/src/main/java/org/sonar/server/source/ws/ShowAction.java b/server/sonar-server/src/main/java/org/sonar/server/source/ws/ShowAction.java index 7243a42010a..962f6dfab02 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/source/ws/ShowAction.java +++ b/server/sonar-server/src/main/java/org/sonar/server/source/ws/ShowAction.java @@ -26,6 +26,9 @@ import org.sonar.api.server.ws.RequestHandler; import org.sonar.api.server.ws.Response; import org.sonar.api.server.ws.WebService; import org.sonar.api.utils.text.JsonWriter; +import org.sonar.core.component.ComponentDto; +import org.sonar.core.persistence.DbSession; +import org.sonar.server.db.DbClient; import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.source.SourceService; @@ -34,9 +37,11 @@ import java.util.List; public class ShowAction implements RequestHandler { private final SourceService sourceService; + private final DbClient dbClient; - public ShowAction(SourceService sourceService) { + public ShowAction(SourceService sourceService, DbClient dbClient) { this.sourceService = sourceService; + this.dbClient = dbClient; } void define(WebService.NewController controller) { @@ -75,15 +80,22 @@ public class ShowAction implements RequestHandler { int from = Math.max(request.mandatoryParamAsInt("from"), 1); int to = (Integer) ObjectUtils.defaultIfNull(request.paramAsInt("to"), Integer.MAX_VALUE); - List<String> sourceHtml = sourceService.getLinesAsHtml(fileKey, from, to); - if (sourceHtml == null) { - throw new NotFoundException("File '" + fileKey + "' has no sources"); - } + DbSession session = dbClient.openSession(false); + try { + ComponentDto componentDto = dbClient.componentDao().getByKey(session, fileKey); + List<String> linesHtml = sourceService.getLinesAsHtml(componentDto.uuid(), from, to); + if (linesHtml == null) { + throw new NotFoundException("File '" + fileKey + "' does not exist"); + } + + JsonWriter json = response.newJsonWriter().beginObject(); + writeSource(linesHtml, from, json); - JsonWriter json = response.newJsonWriter().beginObject(); - writeSource(sourceHtml, from, json); + json.endObject().close(); + } finally { + session.close(); + } - json.endObject().close(); } private void writeSource(List<String> lines, int from, JsonWriter json) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/text/RubyTextService.java b/server/sonar-server/src/main/java/org/sonar/server/text/RubyTextService.java index 7d04ecea691..18d2db48069 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/text/RubyTextService.java +++ b/server/sonar-server/src/main/java/org/sonar/server/text/RubyTextService.java @@ -21,9 +21,6 @@ package org.sonar.server.text; import org.sonar.api.ServerComponent; import org.sonar.markdown.Markdown; -import org.sonar.server.source.HtmlSourceDecorator; - -import java.util.List; /** * @since 3.6 @@ -31,11 +28,9 @@ import java.util.List; public class RubyTextService implements ServerComponent { private final MacroInterpreter macroInterpreter; - private final HtmlSourceDecorator sourceDecorator; - public RubyTextService(MacroInterpreter macroInterpreter, HtmlSourceDecorator sourceDecorator) { + public RubyTextService(MacroInterpreter macroInterpreter) { this.macroInterpreter = macroInterpreter; - this.sourceDecorator = sourceDecorator; } // TODO add ruby example @@ -47,9 +42,4 @@ public class RubyTextService implements ServerComponent { public String markdownToHtml(String markdown) { return Markdown.convertToHtml(markdown); } - - // TODO add ruby example - public List<String> highlightedSourceLines(long snapshotId) { - return sourceDecorator.getDecoratedSourceAsHtml(snapshotId); - } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java b/server/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java index 6baabe0e347..61e8e691b94 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java +++ b/server/sonar-server/src/main/java/org/sonar/server/ui/JRubyFacade.java @@ -30,7 +30,11 @@ import org.sonar.api.platform.PluginRepository; import org.sonar.api.resources.Language; import org.sonar.api.resources.ResourceType; import org.sonar.api.resources.ResourceTypes; -import org.sonar.api.web.*; +import org.sonar.api.web.Footer; +import org.sonar.api.web.NavigationSection; +import org.sonar.api.web.Page; +import org.sonar.api.web.RubyRailsWebservice; +import org.sonar.api.web.Widget; import org.sonar.core.persistence.Database; import org.sonar.core.preview.PreviewCache; import org.sonar.core.resource.ResourceIndexerDao; @@ -44,9 +48,12 @@ import org.sonar.server.platform.Platform; import org.sonar.server.platform.ServerIdGenerator; import org.sonar.server.platform.ServerSettings; import org.sonar.server.platform.SettingsChangeNotifier; -import org.sonar.server.plugins.*; +import org.sonar.server.plugins.InstalledPluginReferentialFactory; +import org.sonar.server.plugins.PluginDownloader; +import org.sonar.server.plugins.ServerPluginJarsInstaller; +import org.sonar.server.plugins.ServerPluginRepository; +import org.sonar.server.plugins.UpdateCenterMatrixFactory; import org.sonar.server.rule.RuleRepositories; -import org.sonar.server.source.CodeColorizers; import org.sonar.server.user.NewUserNotifier; import org.sonar.updatecenter.common.PluginReferential; import org.sonar.updatecenter.common.UpdateCenter; @@ -176,16 +183,6 @@ public final class JRubyFacade { return get(PluginRepository.class).getMetadata(); } - // SYNTAX HIGHLIGHTING ------------------------------------------------------ - public String colorizeCode(String code, String language) { - try { - return get(CodeColorizers.class).toHtml(code, language); - } catch (Exception e) { - LoggerFactory.getLogger(getClass()).error("Can not highlight the code, language= " + language, e); - return code; - } - } - public List<ViewProxy<Widget>> getWidgets(String resourceScope, String resourceQualifier, String resourceLanguage, Object[] availableMeasures) { return get(Views.class).getWidgets(resourceScope, resourceQualifier, resourceLanguage, (String[]) availableMeasures); } diff --git a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java index 4b92db9fe77..578c3a17ccf 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/issue/ws/SearchActionMediumTest.java @@ -32,13 +32,14 @@ import org.sonar.api.utils.DateUtils; import org.sonar.api.utils.KeyValueFormat; import org.sonar.api.web.UserRole; import org.sonar.core.component.ComponentDto; -import org.sonar.core.component.SnapshotDto; -import org.sonar.core.issue.db.*; +import org.sonar.core.issue.db.ActionPlanDao; +import org.sonar.core.issue.db.ActionPlanDto; +import org.sonar.core.issue.db.IssueChangeDao; +import org.sonar.core.issue.db.IssueChangeDto; +import org.sonar.core.issue.db.IssueDto; import org.sonar.core.permission.GlobalPermissions; import org.sonar.core.persistence.DbSession; import org.sonar.core.rule.RuleDto; -import org.sonar.core.source.db.SnapshotSourceDao; -import org.sonar.core.source.db.SnapshotSourceDto; import org.sonar.core.user.UserDto; import org.sonar.server.component.ComponentTesting; import org.sonar.server.component.SnapshotTesting; @@ -100,25 +101,11 @@ public class SearchActionMediumTest { .setKey("MyComponent") .setParentProjectId(project.getId()); db.componentDao().insert(session, file); - SnapshotDto snapshot = db.snapshotDao().insert(session, SnapshotTesting.createForComponent(file, project)); - SnapshotSourceDto snapshotSource = new SnapshotSourceDto().setSnapshotId(snapshot.getId()).setData("First Line\n" - + "Second Line\n" - + "Third Line\n" - + "Fourth Line\n" - + "Fifth Line\n"); - tester.get(SnapshotSourceDao.class).insert(snapshotSource); otherFile = ComponentTesting.newFileDto(project).setUuid("FEDC") .setKey("OtherComponent") .setParentProjectId(project.getId()); db.componentDao().insert(session, otherFile); - snapshot = db.snapshotDao().insert(session, SnapshotTesting.createForComponent(otherFile, project)); - snapshotSource = new SnapshotSourceDto().setSnapshotId(snapshot.getId()).setData("First Line\n" - + "Second Line\n" - + "Third Line\n" - + "Fourth Line\n" - + "Fifth Line\n"); - tester.get(SnapshotSourceDao.class).insert(snapshotSource); UserDto john = new UserDto().setLogin("john").setName("John").setEmail("john@email.com"); db.userDao().insert(session, john); @@ -384,9 +371,9 @@ public class SearchActionMediumTest { session.commit(); WsTester.Result result = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION) - .setParam(IssueFilterParameters.COMPONENTS, file.getKey()) - .setParam(IssueFilterParameters.IGNORE_PAGING, "true") - .execute(); + .setParam(IssueFilterParameters.COMPONENTS, file.getKey()) + .setParam(IssueFilterParameters.IGNORE_PAGING, "true") + .execute(); result.assertJson(this.getClass(), "ignore_paging_with_one_component.json", false); } @@ -399,9 +386,9 @@ public class SearchActionMediumTest { session.commit(); WsTester.Result result = wsTester.newGetRequest(IssuesWs.API_ENDPOINT, SearchAction.SEARCH_ACTION) - .setParam(IssueFilterParameters.COMPONENTS, file.getKey() + "," + otherFile.getKey()) - .setParam(IssueFilterParameters.IGNORE_PAGING, "true") - .execute(); + .setParam(IssueFilterParameters.COMPONENTS, file.getKey() + "," + otherFile.getKey()) + .setParam(IssueFilterParameters.IGNORE_PAGING, "true") + .execute(); result.assertJson(this.getClass(), "apply_paging_with_multiple_components.json", false); } @@ -417,7 +404,6 @@ public class SearchActionMediumTest { result.assertJson(this.getClass(), "apply_paging_with_one_component.json", false); } - @Test public void components_contains_sub_projects() throws Exception { ComponentDto project = ComponentTesting.newProjectDto().setKey("ProjectHavingModule"); diff --git a/server/sonar-server/src/test/java/org/sonar/server/source/CodeColorizersTest.java b/server/sonar-server/src/test/java/org/sonar/server/source/CodeColorizersTest.java deleted file mode 100644 index 44e1ae0a246..00000000000 --- a/server/sonar-server/src/test/java/org/sonar/server/source/CodeColorizersTest.java +++ /dev/null @@ -1,64 +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.source; - -import org.junit.Test; -import org.sonar.api.web.CodeColorizerFormat; -import org.sonar.colorizer.LiteralTokenizer; -import org.sonar.colorizer.Tokenizer; - -import java.util.Arrays; -import java.util.List; - -import static org.fest.assertions.Assertions.assertThat; - -public class CodeColorizersTest { - @Test - public void colorize_source_code() throws Exception { - CodeColorizerFormat format = new LiteralFormat("java"); - CodeColorizers colorizers = new CodeColorizers(Arrays.asList(format)); - - String html = colorizers.toHtml("String s = \"foo\";", "java"); - assertThat(html).isEqualTo("String s = <span class=\"s\">\"foo\"</span>;"); - } - - @Test - public void do_not_fail_if_unsupported_language() throws Exception { - CodeColorizerFormat format = new LiteralFormat("java"); - CodeColorizers colorizers = new CodeColorizers(Arrays.asList(format)); - - String html = colorizers.toHtml("String s = \"foo\";", "groovy"); - assertThat(html).isEqualTo("String s = \"foo\";"); - } - - /** - * Highlights only litterals - */ - static class LiteralFormat extends CodeColorizerFormat { - LiteralFormat(String languageKey) { - super(languageKey); - } - - @Override - public List<Tokenizer> getTokenizers() { - return Arrays.<Tokenizer>asList(new LiteralTokenizer("<span class=\"s\">", "</span>")); - } - } -} diff --git a/server/sonar-server/src/test/java/org/sonar/server/source/DeprecatedSourceDecoratorTest.java b/server/sonar-server/src/test/java/org/sonar/server/source/DeprecatedSourceDecoratorTest.java deleted file mode 100644 index fb87aace956..00000000000 --- a/server/sonar-server/src/test/java/org/sonar/server/source/DeprecatedSourceDecoratorTest.java +++ /dev/null @@ -1,146 +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.source; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; -import org.sonar.core.persistence.DbSession; -import org.sonar.core.persistence.MyBatis; -import org.sonar.core.resource.ResourceDao; -import org.sonar.core.resource.ResourceDto; -import org.sonar.core.resource.ResourceQuery; -import org.sonar.core.source.db.SnapshotSourceDao; -import org.sonar.server.exceptions.NotFoundException; - -import java.util.List; - -import static org.fest.assertions.Assertions.assertThat; -import static org.fest.assertions.Fail.fail; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.when; - -@RunWith(MockitoJUnitRunner.class) -public class DeprecatedSourceDecoratorTest { - - @Mock - MyBatis mybatis; - - @Mock - DbSession session; - - @Mock - ResourceDao resourceDao; - - @Mock - CodeColorizers codeColorizers; - - @Mock - SnapshotSourceDao snapshotSourceDao; - - DeprecatedSourceDecorator sourceDecorator; - - @Before - public void setUp() throws Exception { - when(mybatis.openSession(false)).thenReturn(session); - sourceDecorator = new DeprecatedSourceDecorator(mybatis, resourceDao, codeColorizers, snapshotSourceDao); - } - - @Test - public void get_source_as_html() throws Exception { - String componentKey = "org.sonar.sample:Sample"; - String source = "line 1\nline 2\nline 3\n"; - String htmlSource = "<span>line 1</span>\n<span>line 2</span>\n"; - - when(resourceDao.getResource(any(ResourceQuery.class), eq(session))).thenReturn(new ResourceDto().setKey(componentKey).setLanguage("java")); - when(snapshotSourceDao.selectSnapshotSourceByComponentKey(componentKey, session)).thenReturn(source); - when(codeColorizers.toHtml(source, "java")).thenReturn(htmlSource); - - List<String> result = sourceDecorator.getSourceAsHtml(componentKey); - assertThat(result).containsExactly("<span>line 1</span>", "<span>line 2</span>", ""); - } - - @Test - public void return_null_if_no_source_code_on_component() throws Exception { - String componentKey = "org.sonar.sample:Sample"; - when(resourceDao.getResource(any(ResourceQuery.class), eq(session))).thenReturn(new ResourceDto().setKey(componentKey).setLanguage("java")); - when(snapshotSourceDao.selectSnapshotSourceByComponentKey(componentKey, session)).thenReturn(null); - - assertThat(sourceDecorator.getSourceAsHtml(componentKey)).isNull(); - } - - @Test - public void fail_to_get_source_as_html_on_unknown_component() throws Exception { - String componentKey = "org.sonar.sample:Sample"; - when(resourceDao.getResource(any(ResourceQuery.class), eq(session))).thenReturn(null); - try { - sourceDecorator.getSourceAsHtml(componentKey); - fail(); - } catch (Exception e) { - assertThat(e).isInstanceOf(NotFoundException.class); - } - } - - @Test - public void get_source_as_html_with_from_and_to_params() throws Exception { - String componentKey = "org.sonar.sample:Sample"; - String source = "line 1\nline 2\nline 3\n"; - String htmlSource = "<span>line 1</span>\n<span>line 2</span>\n<span>line 3</span>\n"; - - when(resourceDao.getResource(any(ResourceQuery.class), eq(session))).thenReturn(new ResourceDto().setKey(componentKey).setLanguage("java")); - when(snapshotSourceDao.selectSnapshotSourceByComponentKey(componentKey, session)).thenReturn(source); - when(codeColorizers.toHtml(source, "java")).thenReturn(htmlSource); - - List<String> result = sourceDecorator.getSourceAsHtml(componentKey, 2, 3); - assertThat(result).containsExactly("<span>line 2</span>", "<span>line 3</span>"); - } - - @Test - public void get_source_as_html_with_from_param() throws Exception { - String componentKey = "org.sonar.sample:Sample"; - String source = "line 1\nline 2\nline 3\n"; - String htmlSource = "<span>line 1</span>\n<span>line 2</span>\n<span>line 3</span>\n"; - - when(resourceDao.getResource(any(ResourceQuery.class), eq(session))).thenReturn(new ResourceDto().setKey(componentKey).setLanguage("java")); - when(snapshotSourceDao.selectSnapshotSourceByComponentKey(componentKey, session)).thenReturn(source); - when(codeColorizers.toHtml(source, "java")).thenReturn(htmlSource); - - List<String> result = sourceDecorator.getSourceAsHtml(componentKey, 2, null); - assertThat(result).containsExactly("<span>line 2</span>", "<span>line 3</span>", ""); - } - - @Test - public void get_source_as_html_with_to_param() throws Exception { - String componentKey = "org.sonar.sample:Sample"; - String source = "line 1\nline 2\nline 3\n"; - String htmlSource = "<span>line 1</span>\n<span>line 2</span>\n<span>line 3</span>\n"; - - when(resourceDao.getResource(any(ResourceQuery.class), eq(session))).thenReturn(new ResourceDto().setKey(componentKey).setLanguage("java")); - when(snapshotSourceDao.selectSnapshotSourceByComponentKey(componentKey, session)).thenReturn(source); - when(codeColorizers.toHtml(source, "java")).thenReturn(htmlSource); - - List<String> result = sourceDecorator.getSourceAsHtml(componentKey, null, 3); - assertThat(result).containsExactly("<span>line 1</span>", "<span>line 2</span>", "<span>line 3</span>"); - } -} diff --git a/server/sonar-server/src/test/java/org/sonar/server/source/HtmlSourceDecoratorTest.java b/server/sonar-server/src/test/java/org/sonar/server/source/HtmlSourceDecoratorTest.java index b7534b7149f..b1c17c20059 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/source/HtmlSourceDecoratorTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/source/HtmlSourceDecoratorTest.java @@ -20,165 +20,18 @@ package org.sonar.server.source; -import com.google.common.collect.Lists; -import org.apache.ibatis.session.SqlSession; import org.junit.Before; import org.junit.Test; -import org.sonar.core.persistence.AbstractDaoTestCase; -import org.sonar.core.persistence.MyBatis; -import org.sonar.core.source.db.SnapshotDataDao; -import org.sonar.core.source.db.SnapshotSourceDao; - -import java.util.List; import static org.fest.assertions.Assertions.assertThat; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -public class HtmlSourceDecoratorTest extends AbstractDaoTestCase { +public class HtmlSourceDecoratorTest { HtmlSourceDecorator sourceDecorator; @Before public void setUpDatasets() { - setupData("shared"); - - SnapshotSourceDao snapshotSourceDao = new SnapshotSourceDao(getMyBatis()); - SnapshotDataDao snapshotDataDao = new SnapshotDataDao(getMyBatis()); - sourceDecorator = new HtmlSourceDecorator(getMyBatis(), snapshotSourceDao, snapshotDataDao); - } - - @Test - public void highlight_syntax_with_html() throws Exception { - List<String> decoratedSource = sourceDecorator.getDecoratedSourceAsHtml(11L); - - assertThat(decoratedSource).containsExactly( - "<span class=\"cppd\">/*</span>", - "<span class=\"cppd\"> * Header</span>", - "<span class=\"cppd\"> */</span>", - "", - "<span class=\"k\">public </span><span class=\"k\">class </span>HelloWorld {", - "}" - ); - } - - @Test - public void highlight_syntax_with_html_from_component() throws Exception { - List<String> decoratedSource = sourceDecorator.getDecoratedSourceAsHtml("org.apache.struts:struts:Dispatcher", (Integer) null, (Integer) null); - - assertThat(decoratedSource).containsExactly( - "<span class=\"cppd\">/*</span>", - "<span class=\"cppd\"> * Header</span>", - "<span class=\"cppd\"> */</span>", - "", - "<span class=\"k\">public </span><span class=\"k\">class </span>HelloWorld {", - "}" - ); - } - - @Test - public void highlight_syntax_with_html_from_component_on_given_lines() throws Exception { - assertThat(sourceDecorator.getDecoratedSourceAsHtml("org.apache.struts:struts:Dispatcher", null, 2)).hasSize(2); - assertThat(sourceDecorator.getDecoratedSourceAsHtml("org.apache.struts:struts:Dispatcher", 2, null)).hasSize(5); - assertThat(sourceDecorator.getDecoratedSourceAsHtml("org.apache.struts:struts:Dispatcher", 1, 2)).hasSize(2); - } - - @Test - public void mark_symbols_with_html() throws Exception { - List<String> decoratedSource = sourceDecorator.getDecoratedSourceAsHtml(12L); - - assertThat(decoratedSource).containsExactly( - "/*", - " * Header", - " */", - "", - "public class <span class=\"sym-31 sym\">HelloWorld</span> {", - "}" - ); - } - - @Test - public void mark_symbols_with_html_from_component() throws Exception { - List<String> decoratedSource = sourceDecorator.getDecoratedSourceAsHtml("org.apache.struts:struts:VelocityManager", (Integer) null, (Integer) null); - - assertThat(decoratedSource).containsExactly( - "/*", - " * Header", - " */", - "", - "public class <span class=\"sym-31 sym\">HelloWorld</span> {", - "}" - ); - } - - @Test - public void decorate_source_with_multiple_decoration_strategies() throws Exception { - List<String> decoratedSource = sourceDecorator.getDecoratedSourceAsHtml(13L); - - assertThat(decoratedSource).containsExactly( - "<span class=\"cppd\">/*</span>", - "<span class=\"cppd\"> * Header</span>", - "<span class=\"cppd\"> */</span>", - "", - "<span class=\"k\">public </span><span class=\"k\">class </span><span class=\"sym-31 sym\">HelloWorld</span> {", - " <span class=\"k\">public</span> <span class=\"k\">void</span> <span class=\"sym-58 sym\">foo</span>() {", - " }", - " <span class=\"k\">public</span> <span class=\"k\">void</span> <span class=\"sym-84 sym\">bar</span>() {", - " <span class=\"sym-58 sym\">foo</span>();", - " }", - "}" - ); - } - - @Test - public void decorate_source_with_multiple_decoration_strategies_from_component() throws Exception { - List<String> decoratedSource = sourceDecorator.getDecoratedSourceAsHtml("org.apache.struts:struts:DebuggingInterceptor", (Integer) null, (Integer) null); - - assertThat(decoratedSource).containsExactly( - "<span class=\"cppd\">/*</span>", - "<span class=\"cppd\"> * Header</span>", - "<span class=\"cppd\"> */</span>", - "", - "<span class=\"k\">public </span><span class=\"k\">class </span><span class=\"sym-31 sym\">HelloWorld</span> {", - " <span class=\"k\">public</span> <span class=\"k\">void</span> <span class=\"sym-58 sym\">foo</span>() {", - " }", - " <span class=\"k\">public</span> <span class=\"k\">void</span> <span class=\"sym-84 sym\">bar</span>() {", - " <span class=\"sym-58 sym\">foo</span>();", - " }", - "}" - ); - } - - @Test - public void should_not_query_sources_if_no_snapshot_data() throws Exception { - SnapshotSourceDao snapshotSourceDao = mock(SnapshotSourceDao.class); - SnapshotDataDao snapshotDataDao = mock(SnapshotDataDao.class); - - HtmlSourceDecorator sourceDecorator = new HtmlSourceDecorator(mock(MyBatis.class), snapshotSourceDao, snapshotDataDao); - - sourceDecorator.getDecoratedSourceAsHtml(14L); - - verify(snapshotDataDao, times(1)).selectSnapshotData(14L, Lists.newArrayList("highlight_syntax", "symbol")); - verify(snapshotSourceDao, times(0)).selectSnapshotSource(14L); - } - - @Test - public void should_not_query_sources_if_no_snapshot_data_from_component() throws Exception { - SnapshotSourceDao snapshotSourceDao = mock(SnapshotSourceDao.class); - SnapshotDataDao snapshotDataDao = mock(SnapshotDataDao.class); - - HtmlSourceDecorator sourceDecorator = new HtmlSourceDecorator(mock(MyBatis.class), snapshotSourceDao, snapshotDataDao); - - sourceDecorator.getDecoratedSourceAsHtml("org.apache.struts:struts:DebuggingInterceptor", (Integer) null, (Integer) null); - - verify(snapshotDataDao, times(1)).selectSnapshotDataByComponentKey(eq("org.apache.struts:struts:DebuggingInterceptor"), eq(Lists.newArrayList("highlight_syntax", "symbol")), - any(SqlSession.class)); - verify(snapshotSourceDao, times(0)).selectSnapshotSourceByComponentKey(eq("org.apache.struts:struts:DebuggingInterceptor"), - any(SqlSession.class)); + sourceDecorator = new HtmlSourceDecorator(); } @Test @@ -186,7 +39,8 @@ public class HtmlSourceDecoratorTest extends AbstractDaoTestCase { String sourceLine = "package org.polop;"; String highlighting = "0,7,k"; String symbols = "8,17,42"; - assertThat(sourceDecorator.getDecoratedSourceAsHtml(sourceLine, highlighting, symbols)).isEqualTo("<span class=\"k\">package</span> <span class=\"sym-42 sym\">org.polop</span>;"); + assertThat(sourceDecorator.getDecoratedSourceAsHtml(sourceLine, highlighting, symbols)).isEqualTo( + "<span class=\"k\">package</span> <span class=\"sym-42 sym\">org.polop</span>;"); } @Test @@ -223,4 +77,3 @@ public class HtmlSourceDecoratorTest extends AbstractDaoTestCase { } } - diff --git a/server/sonar-server/src/test/java/org/sonar/server/source/SourceServiceTest.java b/server/sonar-server/src/test/java/org/sonar/server/source/SourceServiceTest.java index 6e828d3ea1c..aac22010b27 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/source/SourceServiceTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/source/SourceServiceTest.java @@ -29,19 +29,19 @@ import org.sonar.api.measures.CoreMetrics; import org.sonar.api.web.UserRole; import org.sonar.core.measure.db.MeasureKey; import org.sonar.core.persistence.DbSession; -import org.sonar.core.source.db.SnapshotSourceDao; import org.sonar.server.db.DbClient; import org.sonar.server.exceptions.ForbiddenException; import org.sonar.server.measure.persistence.MeasureDao; +import org.sonar.server.source.index.SourceLineDoc; import org.sonar.server.source.index.SourceLineIndex; import org.sonar.server.user.MockUserSession; +import java.util.Arrays; import java.util.List; import static org.fest.assertions.Assertions.assertThat; import static org.fest.assertions.Fail.fail; import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -58,70 +58,60 @@ public class SourceServiceTest { HtmlSourceDecorator sourceDecorator; @Mock - SnapshotSourceDao snapshotSourceDao; - - @Mock - DeprecatedSourceDecorator deprecatedSourceDecorator; - - @Mock MeasureDao measureDao; @Mock SourceLineIndex sourceLineIndex; static final String PROJECT_KEY = "org.sonar.sample"; - static final String COMPONENT_KEY = "org.sonar.sample:Sample"; + static final String COMPONENT_UUID = "abc123"; SourceService service; - @Before public void setUp() throws Exception { DbClient dbClient = mock(DbClient.class); when(dbClient.openSession(false)).thenReturn(session); when(dbClient.measureDao()).thenReturn(measureDao); - service = new SourceService(dbClient, sourceDecorator, snapshotSourceDao, deprecatedSourceDecorator, sourceLineIndex); + service = new SourceService(dbClient, sourceDecorator, sourceLineIndex); } @Test public void get_html_lines() throws Exception { - MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, PROJECT_KEY, COMPONENT_KEY); + MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, PROJECT_KEY, COMPONENT_UUID); + when(sourceLineIndex.getLines(COMPONENT_UUID, 1, Integer.MAX_VALUE)).thenReturn( + Arrays.asList(new SourceLineDoc().setSource("source").setHighlighting("highlight").setSymbols("symbols"))); - service.getLinesAsHtml(COMPONENT_KEY); + service.getLinesAsHtml(COMPONENT_UUID, null, null); - verify(sourceDecorator).getDecoratedSourceAsHtml(COMPONENT_KEY, (Integer) null, (Integer) null); + verify(sourceDecorator).getDecoratedSourceAsHtml("source", "highlight", "symbols"); } @Test public void get_block_of_lines() throws Exception { - MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, PROJECT_KEY, COMPONENT_KEY); - - service.getLinesAsHtml(COMPONENT_KEY, 1, 2); + MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, PROJECT_KEY, COMPONENT_UUID); - verify(sourceDecorator).getDecoratedSourceAsHtml(COMPONENT_KEY, 1, 2); - } + when(sourceLineIndex.getLines(COMPONENT_UUID, 1, Integer.MAX_VALUE)).thenReturn( + Arrays.asList(new SourceLineDoc().setSource("source").setHighlighting("highlight").setSymbols("symbols"), + new SourceLineDoc().setSource("source2").setHighlighting("highlight2").setSymbols("symbols2"))); - @Test - public void get_lines_from_deprecated_source_decorator_when_no_data_from_new_decorator() throws Exception { - MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, PROJECT_KEY, COMPONENT_KEY); - when(sourceDecorator.getDecoratedSourceAsHtml(eq(COMPONENT_KEY), anyInt(), anyInt())).thenReturn(null); + service.getLinesAsHtml(COMPONENT_UUID, null, null); - service.getLinesAsHtml(COMPONENT_KEY, 1, 2); - - verify(deprecatedSourceDecorator).getSourceAsHtml(COMPONENT_KEY, 1, 2); + verify(sourceDecorator).getDecoratedSourceAsHtml("source", "highlight", "symbols"); + verify(sourceDecorator).getDecoratedSourceAsHtml("source2", "highlight2", "symbols2"); } @Test public void get_scm_author_data() throws Exception { - service.getScmAuthorData(COMPONENT_KEY); - verify(measureDao).getNullableByKey(session, MeasureKey.of(COMPONENT_KEY, CoreMetrics.SCM_AUTHORS_BY_LINE_KEY)); + service.getScmAuthorData(COMPONENT_UUID); + verify(measureDao).getNullableByKey(session, MeasureKey.of(COMPONENT_UUID, CoreMetrics.SCM_AUTHORS_BY_LINE_KEY)); } @Test public void fail_to_get_scm_author_data_if_no_permission() throws Exception { MockUserSession.set().setLogin("johh"); try { - service.getScmAuthorData(COMPONENT_KEY); + service.getScmAuthorData(COMPONENT_UUID); fail(); } catch (Exception e) { assertThat(e).isInstanceOf(ForbiddenException.class); @@ -131,43 +121,35 @@ public class SourceServiceTest { @Test public void not_get_scm_author_data_if_no_data() throws Exception { - MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, PROJECT_KEY, COMPONENT_KEY); + MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, PROJECT_KEY, COMPONENT_UUID); when(measureDao.getNullableByKey(eq(session), any(MeasureKey.class))).thenReturn(null); - assertThat(service.getScmAuthorData(COMPONENT_KEY)).isNull(); + assertThat(service.getScmAuthorData(COMPONENT_UUID)).isNull(); } @Test public void get_scm_date_data() throws Exception { - MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, PROJECT_KEY, COMPONENT_KEY); - service.getScmDateData(COMPONENT_KEY); - verify(measureDao).getNullableByKey(session, MeasureKey.of(COMPONENT_KEY, CoreMetrics.SCM_LAST_COMMIT_DATETIMES_BY_LINE_KEY)); + MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, PROJECT_KEY, COMPONENT_UUID); + service.getScmDateData(COMPONENT_UUID); + verify(measureDao).getNullableByKey(session, MeasureKey.of(COMPONENT_UUID, CoreMetrics.SCM_LAST_COMMIT_DATETIMES_BY_LINE_KEY)); } @Test public void not_get_scm_date_data_if_no_data() throws Exception { - MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, PROJECT_KEY, COMPONENT_KEY); + MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, PROJECT_KEY, COMPONENT_UUID); when(measureDao.getNullableByKey(eq(session), any(MeasureKey.class))).thenReturn(null); - assertThat(service.getScmDateData(COMPONENT_KEY)).isNull(); + assertThat(service.getScmDateData(COMPONENT_UUID)).isNull(); } @Test public void getLinesAsTxt() throws Exception { - MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, PROJECT_KEY, COMPONENT_KEY); - - when(snapshotSourceDao.selectSnapshotSourceByComponentKey(COMPONENT_KEY, session)).thenReturn("line1\nline2"); + MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, PROJECT_KEY, COMPONENT_UUID); + when(sourceLineIndex.getLines(COMPONENT_UUID, 1, Integer.MAX_VALUE)).thenReturn( + Arrays.asList( + new SourceLineDoc().setSource("line1"), + new SourceLineDoc().setSource("line2"))); - List<String> result = service.getLinesAsTxt(session, COMPONENT_KEY); + List<String> result = service.getLinesAsTxt(COMPONENT_UUID, null, null); assertThat(result).contains("line1", "line2"); } - @Test - public void getLinesAsTxt_returns_null_when_no_sources() throws Exception { - MockUserSession.set().addComponentPermission(UserRole.CODEVIEWER, PROJECT_KEY, COMPONENT_KEY); - - when(snapshotSourceDao.selectSnapshotSourceByComponentKey(COMPONENT_KEY, session)).thenReturn(null); - - List<String> result = service.getLinesAsTxt(session, COMPONENT_KEY); - assertThat(result).isNull(); - } - } diff --git a/server/sonar-server/src/test/java/org/sonar/server/source/ws/RawActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/source/ws/RawActionTest.java index 7ba87deb552..9eb4d918baa 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/source/ws/RawActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/source/ws/RawActionTest.java @@ -30,13 +30,11 @@ import org.sonar.core.persistence.DbSession; import org.sonar.server.component.ComponentTesting; import org.sonar.server.component.db.ComponentDao; import org.sonar.server.db.DbClient; -import org.sonar.server.exceptions.NotFoundException; import org.sonar.server.source.SourceService; import org.sonar.server.ws.WsTester; import static com.google.common.collect.Lists.newArrayList; import static org.fest.assertions.Assertions.assertThat; -import static org.fest.assertions.Fail.fail; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -73,7 +71,7 @@ public class RawActionTest { String fileKey = "src/Foo.java"; when(componentDao.getByKey(session, fileKey)).thenReturn(file); - when(sourceService.getLinesAsTxt(session, fileKey)).thenReturn(newArrayList( + when(sourceService.getLinesAsTxt(file.uuid(), null, null)).thenReturn(newArrayList( "public class HelloWorld {", "}" )); @@ -82,19 +80,4 @@ public class RawActionTest { String result = request.execute().outputAsString(); assertThat(result).isEqualTo("public class HelloWorld {\n}\n"); } - - @Test - public void fail_to_get_txt_when_no_source() throws Exception { - String fileKey = "src/Foo.java"; - when(componentDao.getByKey(session, fileKey)).thenReturn(file); - when(sourceService.getLinesAsTxt(session, fileKey)).thenReturn(null); - - WsTester.TestRequest request = tester.newGetRequest("api/sources", "raw").setParam("key", fileKey); - try { - request.execute(); - fail(); - } catch (Exception e) { - assertThat(e).isInstanceOf(NotFoundException.class).hasMessage("File 'src/Foo.java' does not exist"); - } - } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/source/ws/ShowActionTest.java b/server/sonar-server/src/test/java/org/sonar/server/source/ws/ShowActionTest.java index 904fc967df2..379c0c2b668 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/source/ws/ShowActionTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/source/ws/ShowActionTest.java @@ -21,70 +21,78 @@ package org.sonar.server.source.ws; import org.junit.Before; import org.junit.Test; -import org.sonar.server.exceptions.NotFoundException; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.sonar.core.component.ComponentDto; +import org.sonar.core.persistence.DbSession; +import org.sonar.server.component.ComponentTesting; +import org.sonar.server.component.db.ComponentDao; +import org.sonar.server.db.DbClient; import org.sonar.server.source.SourceService; import org.sonar.server.ws.WsTester; import static com.google.common.collect.Lists.newArrayList; -import static org.fest.assertions.Assertions.assertThat; -import static org.fest.assertions.Fail.fail; import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +@RunWith(MockitoJUnitRunner.class) public class ShowActionTest { SourceService sourceService = mock(SourceService.class); WsTester tester; + @Mock + DbClient dbClient; + + @Mock + DbSession session; + + @Mock + ComponentDao componentDao; + + ComponentDto project = ComponentTesting.newProjectDto(); + ComponentDto file = ComponentTesting.newFileDto(project); + @Before public void setUp() throws Exception { - tester = new WsTester(new SourcesWs(new ShowAction(sourceService), mock(RawAction.class), new ScmAction(sourceService, mock(ScmWriter.class)), mock(LinesAction.class), + when(dbClient.componentDao()).thenReturn(componentDao); + when(dbClient.openSession(false)).thenReturn(session); + tester = new WsTester(new SourcesWs(new ShowAction(sourceService, dbClient), mock(RawAction.class), new ScmAction(sourceService, mock(ScmWriter.class)), + mock(LinesAction.class), mock(HashAction.class))); } @Test public void show_source() throws Exception { - String componentKey = "src/Foo.java"; - when(sourceService.getLinesAsHtml(eq(componentKey), anyInt(), anyInt())).thenReturn(newArrayList( + String fileKey = "src/Foo.java"; + when(componentDao.getByKey(session, fileKey)).thenReturn(file); + when(sourceService.getLinesAsHtml(eq(file.uuid()), anyInt(), anyInt())).thenReturn(newArrayList( "/*", " * Header", " */", "", "public class <span class=\"sym-31 sym\">HelloWorld</span> {", "}" - )); + )); - WsTester.TestRequest request = tester.newGetRequest("api/sources", "show").setParam("key", componentKey); + WsTester.TestRequest request = tester.newGetRequest("api/sources", "show").setParam("key", fileKey); request.execute().assertJson(getClass(), "show_source.json"); } @Test - public void fail_to_show_source_if_no_source_found() throws Exception { - String componentKey = "src/Foo.java"; - when(sourceService.getLinesAsHtml(anyString(), anyInt(), anyInt())).thenReturn(null); - - try { - WsTester.TestRequest request = tester.newGetRequest("api/sources", "show").setParam("key", componentKey); - request.execute(); - fail(); - } catch (Exception e) { - assertThat(e).isInstanceOf(NotFoundException.class); - } - } - - @Test public void show_source_with_from_and_to_params() throws Exception { String fileKey = "src/Foo.java"; - when(sourceService.getLinesAsHtml(fileKey, 3, 5)).thenReturn(newArrayList( + when(componentDao.getByKey(session, fileKey)).thenReturn(file); + when(sourceService.getLinesAsHtml(file.uuid(), 3, 5)).thenReturn(newArrayList( " */", "", "public class <span class=\"sym-31 sym\">HelloWorld</span> {" - )); + )); WsTester.TestRequest request = tester .newGetRequest("api/sources", "show") .setParam("key", fileKey) @@ -96,18 +104,19 @@ public class ShowActionTest { @Test public void show_source_accept_from_less_than_one() throws Exception { String fileKey = "src/Foo.java"; - when(sourceService.getLinesAsHtml(fileKey, 1, 5)).thenReturn(newArrayList( + when(componentDao.getByKey(session, fileKey)).thenReturn(file); + when(sourceService.getLinesAsHtml(file.uuid(), 1, 5)).thenReturn(newArrayList( " */", "", "public class <span class=\"sym-31 sym\">HelloWorld</span> {" - )); + )); WsTester.TestRequest request = tester .newGetRequest("api/sources", "show") .setParam("key", fileKey) .setParam("from", "0") .setParam("to", "5"); request.execute(); - verify(sourceService).getLinesAsHtml(fileKey, 1, 5); + verify(sourceService).getLinesAsHtml(file.uuid(), 1, 5); } } diff --git a/server/sonar-server/src/test/java/org/sonar/server/source/ws/SourcesWsTest.java b/server/sonar-server/src/test/java/org/sonar/server/source/ws/SourcesWsTest.java index cb2d10387b4..b562d89d504 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/source/ws/SourcesWsTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/source/ws/SourcesWsTest.java @@ -34,7 +34,7 @@ import static org.mockito.Mockito.mock; public class SourcesWsTest { - ShowAction showAction = new ShowAction(mock(SourceService.class)); + ShowAction showAction = new ShowAction(mock(SourceService.class), mock(DbClient.class)); RawAction rawAction = new RawAction(mock(DbClient.class), mock(SourceService.class)); ScmAction scmAction = new ScmAction(mock(SourceService.class), new ScmWriter()); LinesAction linesAction = new LinesAction(mock(SourceLineIndex.class), mock(HtmlSourceDecorator.class)); diff --git a/server/sonar-server/src/test/java/org/sonar/server/text/RubyTextServiceTest.java b/server/sonar-server/src/test/java/org/sonar/server/text/RubyTextServiceTest.java index 534e0db4a03..1ccdd6a1709 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/text/RubyTextServiceTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/text/RubyTextServiceTest.java @@ -20,22 +20,21 @@ package org.sonar.server.text; import org.junit.Test; -import org.sonar.server.source.HtmlSourceDecorator; import static org.fest.assertions.Assertions.assertThat; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; public class RubyTextServiceTest { MacroInterpreter macroInterpreter = mock(MacroInterpreter.class); - HtmlSourceDecorator sourceDecorator = mock(HtmlSourceDecorator.class); - RubyTextService text = new RubyTextService(macroInterpreter, sourceDecorator); + RubyTextService text = new RubyTextService(macroInterpreter); @Test public void interpretMacros() throws Exception { text.interpretMacros("text with macros"); verify(macroInterpreter, times(1)).interpret("text with macros"); - verifyZeroInteractions(sourceDecorator); } @Test @@ -49,11 +48,4 @@ public class RubyTextServiceTest { String html = text.markdownToHtml("a > b"); assertThat(html).isEqualTo("a > b"); } - - @Test - public void highlightedSourceLines() throws Exception { - text.highlightedSourceLines(123L); - verify(sourceDecorator, times(1)).getDecoratedSourceAsHtml(123L); - verifyZeroInteractions(macroInterpreter); - } } diff --git a/server/sonar-server/src/test/resources/org/sonar/server/source/HtmlSourceDecoratorTest/shared.xml b/server/sonar-server/src/test/resources/org/sonar/server/source/HtmlSourceDecoratorTest/shared.xml deleted file mode 100644 index 7ee99827284..00000000000 --- a/server/sonar-server/src/test/resources/org/sonar/server/source/HtmlSourceDecoratorTest/shared.xml +++ /dev/null @@ -1,20 +0,0 @@ -<dataset> - - <projects id="1" kee="org.apache.struts:struts:Dispatcher" enabled="[true]" uuid="ABCD"/> - <projects id="2" kee="org.apache.struts:struts:VelocityManager" enabled="[true]" uuid="BCDE"/> - <projects id="3" kee="org.apache.struts:struts:DebuggingInterceptor" enabled="[true]" uuid="CDEF"/> - - <snapshots id="11" project_id="1" islast="[true]" /> - <snapshots id="12" project_id="2" islast="[true]" /> - <snapshots id="13" project_id="3" islast="[true]" /> - <snapshots id="14" project_id="3" islast="[true]" /> - - <snapshot_data id="101" resource_id="1" snapshot_id="11" snapshot_data="0,16,cppd;18,25,k;25,31,k;" data_type="highlight_syntax" /> - <snapshot_data id="102" resource_id="2" snapshot_id="12" snapshot_data="31,41,31;" data_type="symbol" /> - <snapshot_data id="103" resource_id="3" snapshot_id="13" snapshot_data="0,16,cppd;18,25,k;25,31,k;46,52,k;53,57,k;72,78,k;79,83,k;" data_type="highlight_syntax" /> - <snapshot_data id="104" resource_id="3" snapshot_id="13" snapshot_data="31,41,31;58,61,58,96;84,87,84;" data_type="symbol" /> - - <snapshot_sources id="101" snapshot_id="11" data="/* * Header */ public class HelloWorld { }" /> - <snapshot_sources id="102" snapshot_id="12" data="/* * Header */ public class HelloWorld { }" /> - <snapshot_sources id="103" snapshot_id="13" data="/* * Header */ public class HelloWorld { public void foo() { } public void bar() { foo(); } }" /> -</dataset> diff --git a/sonar-batch/src/main/java/org/sonar/batch/index/DefaultIndex.java b/sonar-batch/src/main/java/org/sonar/batch/index/DefaultIndex.java index b1235f09964..a3133af5c25 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/index/DefaultIndex.java +++ b/sonar-batch/src/main/java/org/sonar/batch/index/DefaultIndex.java @@ -22,6 +22,7 @@ package org.sonar.batch.index; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import org.apache.commons.io.FileUtils; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; @@ -60,6 +61,7 @@ import org.sonar.core.component.ScanGraph; import javax.annotation.CheckForNull; import javax.annotation.Nullable; +import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -475,8 +477,19 @@ public class DefaultIndex extends SonarIndex { } @Override - public String getSource(Resource resource) { - return persistence.getSource(resource); + public String getSource(Resource reference) { + Resource resource = getResource(reference); + if (resource instanceof File) { + File file = (File) resource; + Project module = (Project) file.getParent().getParent(); + ProjectDefinition def = projectTree.getProjectDefinition(module); + try { + return FileUtils.readFileToString(new java.io.File(def.getBaseDir(), file.getPath())); + } catch (IOException e) { + throw new IllegalStateException("Unable to read file content " + reference, e); + } + } + return null; } /** diff --git a/sonar-batch/src/main/java/org/sonar/batch/index/DefaultPersistenceManager.java b/sonar-batch/src/main/java/org/sonar/batch/index/DefaultPersistenceManager.java index e13b34235ae..79a09a7d6f4 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/index/DefaultPersistenceManager.java +++ b/sonar-batch/src/main/java/org/sonar/batch/index/DefaultPersistenceManager.java @@ -67,11 +67,6 @@ public final class DefaultPersistenceManager implements PersistenceManager { } @Override - public String getSource(Resource resource) { - return sourcePersister.getSource(resource); - } - - @Override public void saveDependency(Project project, Dependency dependency, Dependency parentDependency) { if (ResourceUtils.isPersistable(dependency.getFrom()) && ResourceUtils.isPersistable(dependency.getTo())) { dependencyPersister.saveDependency(project, dependency, parentDependency); diff --git a/sonar-batch/src/main/java/org/sonar/batch/index/PersistenceManager.java b/sonar-batch/src/main/java/org/sonar/batch/index/PersistenceManager.java index bcf8c6cf565..2e5de75acb1 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/index/PersistenceManager.java +++ b/sonar-batch/src/main/java/org/sonar/batch/index/PersistenceManager.java @@ -37,8 +37,6 @@ public interface PersistenceManager { Snapshot saveResource(Project project, Resource resource, @Nullable Resource parent); - String getSource(Resource resource); - void saveDependency(Project project, Dependency dependency, Dependency parentDependency); void saveLink(Project project, ProjectLink link); diff --git a/sonar-batch/src/main/java/org/sonar/batch/index/SourcePersister.java b/sonar-batch/src/main/java/org/sonar/batch/index/SourcePersister.java index edd0c01da3f..f10ea9d4a55 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/index/SourcePersister.java +++ b/sonar-batch/src/main/java/org/sonar/batch/index/SourcePersister.java @@ -32,10 +32,8 @@ import org.sonar.api.batch.fs.internal.DefaultInputFile; import org.sonar.api.batch.sensor.duplication.DuplicationGroup; import org.sonar.api.batch.sensor.duplication.DuplicationGroup.Block; import org.sonar.api.batch.sensor.symbol.Symbol; -import org.sonar.api.database.model.Snapshot; import org.sonar.api.measures.CoreMetrics; import org.sonar.api.measures.Measure; -import org.sonar.api.resources.Resource; import org.sonar.api.utils.KeyValueFormat; import org.sonar.api.utils.System2; import org.sonar.api.utils.text.CsvWriter; @@ -52,8 +50,6 @@ import org.sonar.core.persistence.MyBatis; import org.sonar.core.source.SnapshotDataTypes; import org.sonar.core.source.db.FileSourceDto; import org.sonar.core.source.db.FileSourceMapper; -import org.sonar.core.source.db.SnapshotSourceDao; -import org.sonar.core.source.db.SnapshotSourceDto; import javax.annotation.CheckForNull; import javax.annotation.Nullable; @@ -74,7 +70,6 @@ public class SourcePersister implements ScanPersister { private static final String BOM = "\uFEFF"; private final ResourcePersister resourcePersister; - private final SnapshotSourceDao sourceDao; private final InputPathCache inputPathCache; private final MyBatis mybatis; private final MeasureCache measureCache; @@ -85,11 +80,10 @@ public class SourcePersister implements ScanPersister { private CodeColorizers codeColorizers; private DuplicationCache duplicationCache; - public SourcePersister(ResourcePersister resourcePersister, SnapshotSourceDao sourceDao, InputPathCache inputPathCache, + public SourcePersister(ResourcePersister resourcePersister, InputPathCache inputPathCache, MyBatis mybatis, MeasureCache measureCache, ComponentDataCache componentDataCache, ProjectTree projectTree, System2 system2, ResourceCache resourceCache, CodeColorizers codeColorizers, DuplicationCache duplicationCache) { this.resourcePersister = resourcePersister; - this.sourceDao = sourceDao; this.inputPathCache = inputPathCache; this.mybatis = mybatis; this.measureCache = measureCache; @@ -101,24 +95,6 @@ public class SourcePersister implements ScanPersister { this.duplicationCache = duplicationCache; } - public void saveSource(Resource resource, String source, Date updatedAt) { - Snapshot snapshot = resourcePersister.getSnapshotOrFail(resource); - SnapshotSourceDto dto = new SnapshotSourceDto(); - dto.setSnapshotId(snapshot.getId().longValue()); - dto.setData(source); - dto.setUpdatedAt(updatedAt); - sourceDao.insert(dto); - } - - @CheckForNull - public String getSource(Resource resource) { - Snapshot snapshot = resourcePersister.getSnapshot(resource); - if (snapshot != null && snapshot.getId() != null) { - return sourceDao.selectSnapshotSource(snapshot.getId()); - } - return null; - } - @Override public void persist() { // Don't use batch insert for file_sources since keeping all data in memory can produce OOM for big files diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/ComponentIndexer.java b/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/ComponentIndexer.java index a148c03d190..6e2d5769a29 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/ComponentIndexer.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/filesystem/ComponentIndexer.java @@ -19,28 +19,18 @@ */ package org.sonar.batch.scan.filesystem; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.CharMatcher; -import com.google.common.io.Files; import org.sonar.api.BatchComponent; import org.sonar.api.batch.SonarIndex; import org.sonar.api.batch.fs.FileSystem; import org.sonar.api.batch.fs.InputFile; -import org.sonar.api.batch.fs.InputFile.Status; import org.sonar.api.batch.fs.internal.DeprecatedDefaultInputFile; import org.sonar.api.resources.File; import org.sonar.api.resources.Languages; import org.sonar.api.resources.Project; import org.sonar.api.resources.Resource; -import org.sonar.api.utils.SonarException; import org.sonar.batch.index.ResourceKeyMigration; -import org.sonar.batch.index.SnapshotCache; -import org.sonar.batch.index.SourcePersister; -import org.sonar.batch.protocol.input.ProjectReferentials; import org.sonar.batch.util.DeprecatedKeyUtils; -import java.util.Date; - /** * Index all files/directories of the module in SQ database and importing source code. * @@ -52,19 +42,12 @@ public class ComponentIndexer implements BatchComponent { private final SonarIndex sonarIndex; private final ResourceKeyMigration migration; private final Project module; - private final SourcePersister sourcePersister; - private final ProjectReferentials projectReferentials; - private final Date projectAnalysisDate; - public ComponentIndexer(Project module, Languages languages, SonarIndex sonarIndex, ResourceKeyMigration migration, SourcePersister sourcePersister, - ProjectReferentials projectReferentials, SnapshotCache snapshotCache) { + public ComponentIndexer(Project module, Languages languages, SonarIndex sonarIndex, ResourceKeyMigration migration) { this.module = module; this.languages = languages; this.sonarIndex = sonarIndex; this.migration = migration; - this.sourcePersister = sourcePersister; - this.projectReferentials = projectReferentials; - this.projectAnalysisDate = snapshotCache.get(module.getEffectiveKey()).getBuildDate(); } public void execute(FileSystem fs) { @@ -84,28 +67,7 @@ public class ComponentIndexer implements BatchComponent { sonarFile.setDeprecatedKey(pathFromSourceDir); } sonarIndex.index(sonarFile); - - importSources(fs, inputFile, sonarFile); } } - @VisibleForTesting - void importSources(FileSystem fs, InputFile inputFile, Resource sonarFile) { - try { - // TODO this part deserves optimization. - // We should try to remove BOM and count lines in a single pass - String source = Files.toString(inputFile.file(), fs.encoding()); - // SONAR-3860 Remove BOM character from source - source = CharMatcher.anyOf("\uFEFF").removeFrom(source); - if (inputFile.status() == Status.SAME) { - sourcePersister.saveSource(sonarFile, source, projectReferentials.lastAnalysisDate()); - } else { - sourcePersister.saveSource(sonarFile, source, this.projectAnalysisDate); - } - - } catch (Exception e) { - throw new SonarException("Unable to read and import the source file : '" + inputFile.absolutePath() + "' with the charset : '" - + fs.encoding() + "'.", e); - } - } } diff --git a/sonar-batch/src/test/java/org/sonar/batch/index/SourcePersisterTest.java b/sonar-batch/src/test/java/org/sonar/batch/index/SourcePersisterTest.java index 52a6a9b2414..2d771d166f6 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/index/SourcePersisterTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/index/SourcePersisterTest.java @@ -49,7 +49,6 @@ import org.sonar.core.persistence.AbstractDaoTestCase; import org.sonar.core.source.SnapshotDataTypes; import org.sonar.core.source.db.FileSourceDao; import org.sonar.core.source.db.FileSourceDto; -import org.sonar.core.source.db.SnapshotSourceDao; import java.io.IOException; import java.util.Arrays; @@ -94,7 +93,7 @@ public class SourcePersisterTest extends AbstractDaoTestCase { when(measureCache.byMetric(anyString(), anyString())).thenReturn(Collections.<org.sonar.api.measures.Measure>emptyList()); componentDataCache = mock(ComponentDataCache.class); duplicationCache = mock(DuplicationCache.class); - sourcePersister = new SourcePersister(resourcePersister, new SnapshotSourceDao(getMyBatis()), inputPathCache, + sourcePersister = new SourcePersister(resourcePersister, inputPathCache, getMyBatis(), measureCache, componentDataCache, projectTree, system2, resourceCache, mock(CodeColorizers.class), duplicationCache); Project project = new Project(PROJECT_KEY); @@ -104,13 +103,6 @@ public class SourcePersisterTest extends AbstractDaoTestCase { } @Test - public void shouldSaveSource() { - setupData("shouldSaveSource"); - sourcePersister.saveSource(new File("org/foo/Bar.java"), "this is the file content", DateUtils.parseDateTime("2014-10-31T16:44:02+0100")); - checkTables("shouldSaveSource", "snapshot_sources"); - } - - @Test public void testPersistDontTouchUnchanged() throws Exception { setupData("file_sources"); when(system2.newDate()).thenReturn(DateUtils.parseDateTime("2014-10-29T16:44:02+0100")); diff --git a/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/ComponentIndexerTest.java b/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/ComponentIndexerTest.java index 127d344250e..b5e858e2873 100644 --- a/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/ComponentIndexerTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/scan/filesystem/ComponentIndexerTest.java @@ -19,39 +19,28 @@ */ package org.sonar.batch.scan.filesystem; -import com.google.common.base.Charsets; import org.apache.commons.io.FileUtils; -import org.apache.commons.lang.CharEncoding; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.mockito.ArgumentMatcher; -import org.mockito.exceptions.verification.junit.ArgumentsAreDifferent; import org.sonar.api.batch.SonarIndex; import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.fs.internal.DefaultFileSystem; import org.sonar.api.batch.fs.internal.DefaultInputFile; import org.sonar.api.batch.fs.internal.DeprecatedDefaultInputFile; -import org.sonar.api.database.model.Snapshot; import org.sonar.api.resources.AbstractLanguage; import org.sonar.api.resources.Java; import org.sonar.api.resources.Languages; import org.sonar.api.resources.Project; import org.sonar.api.resources.Qualifiers; -import org.sonar.api.resources.Resource; import org.sonar.batch.index.ResourceKeyMigration; -import org.sonar.batch.index.SnapshotCache; -import org.sonar.batch.index.SourcePersister; -import org.sonar.batch.protocol.input.ProjectReferentials; import java.io.File; import java.io.IOException; -import java.nio.charset.Charset; -import java.util.Date; import static org.mockito.Matchers.argThat; -import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -59,21 +48,16 @@ public class ComponentIndexerTest { @Rule public TemporaryFolder temp = new TemporaryFolder(); - File baseDir; - DefaultFileSystem fs = new DefaultFileSystem(); - SonarIndex sonarIndex; - AbstractLanguage cobolLanguage; - Project project; - - String aClaess; - String explicacao; - private SourcePersister sourcePersister; + private File baseDir; + private DefaultFileSystem fs = new DefaultFileSystem(); + private SonarIndex sonarIndex; + private AbstractLanguage cobolLanguage; + private Project project; @Before public void prepare() throws IOException { baseDir = temp.newFolder(); sonarIndex = mock(SonarIndex.class); - sourcePersister = mock(SourcePersister.class); project = new Project("myProject"); cobolLanguage = new AbstractLanguage("cobol") { @Override @@ -81,9 +65,6 @@ public class ComponentIndexerTest { return new String[] {"cbl"}; } }; - - aClaess = new String(new byte[] {65, 67, 108, 97, -61, -88, 115, 115, 40, 41}, CharEncoding.UTF_8); - explicacao = new String(new byte[] {101, 120, 112, 108, 105, 99, 97, -61, -89, -61, -93, 111, 40, 41}, CharEncoding.UTF_8); } @Test @@ -109,11 +90,7 @@ public class ComponentIndexerTest { } private ComponentIndexer createIndexer(Languages languages) { - SnapshotCache snapshotCache = new SnapshotCache(); - snapshotCache.put("myProject", mock(Snapshot.class)); - ComponentIndexer indexer = new ComponentIndexer(project, languages, sonarIndex, mock(ResourceKeyMigration.class), sourcePersister, new ProjectReferentials(), - snapshotCache); - return indexer; + return new ComponentIndexer(project, languages, sonarIndex, mock(ResourceKeyMigration.class)); } @Test @@ -131,90 +108,6 @@ public class ComponentIndexerTest { verify(sonarIndex).index(org.sonar.api.resources.File.create("/src/test/foo/bar/FooTest.cbl", "foo/bar/FooTest.cbl", cobolLanguage, true)); } - @Test - public void shouldImportSource() throws IOException { - fs.add(newInputFile("src/main/java/foo/bar/Foo.java", "sample code", "foo/bar/Foo.java", "java", false)); - Languages languages = new Languages(Java.INSTANCE); - ComponentIndexer indexer = createIndexer(languages); - indexer.execute(fs); - - Resource sonarFile = org.sonar.api.resources.File.create("src/main/java/foo/bar/Foo.java", "foo/bar/Foo.java", Java.INSTANCE, false); - verify(sonarIndex).index(sonarFile); - verify(sourcePersister).saveSource(sonarFile, "sample code", null); - } - - @Test - public void should_use_mac_roman_charset_for_reading_source_files() throws Exception { - String encoding = "MacRoman"; - String testFile = "MacRomanEncoding.java"; - fileEncodingTest(encoding, testFile); - } - - @Test - public void should_use_CP1252_charset_for_reading_source_files() throws Exception { - String encoding = "CP1252"; - String testFile = "CP1252Encoding.java"; - fileEncodingTest(encoding, testFile); - } - - @Test(expected = ArgumentsAreDifferent.class) - public void should_fail_with_wrong_charset_for_reading_source_files() throws Exception { - String encoding = CharEncoding.UTF_8; - String testFile = "CP1252Encoding.java"; - fileEncodingTest(encoding, testFile); - } - - @Test - public void remove_byte_order_mark_character() throws Exception { - File javaFile1 = new File(baseDir, "src/main/java/foo/bar/Foo.java"); - FileUtils.write(javaFile1, "\uFEFFpublic class Test", Charsets.UTF_8); - fs.add(new DeprecatedDefaultInputFile("foo", "src/main/java/foo/bar/Foo.java") - .setPathRelativeToSourceDir("foo/bar/Foo.java") - .setFile(javaFile1) - .setLanguage("java")); - Languages languages = new Languages(Java.INSTANCE); - ComponentIndexer indexer = createIndexer(languages); - indexer.execute(fs); - - Resource sonarFile = org.sonar.api.resources.File.create("src/main/java/foo/bar/Foo.java", "foo/bar/Foo.java", Java.INSTANCE, false); - - verify(sourcePersister).saveSource(eq(sonarFile), argThat(new ArgumentMatcher<String>() { - @Override - public boolean matches(Object arg0) { - String source = (String) arg0; - return !source.contains("\uFEFF"); - } - }), (Date) eq(null)); - } - - private void fileEncodingTest(String encoding, String testFile) throws Exception { - fs.setEncoding(Charset.forName(encoding)); - - File javaFile1 = new File(baseDir, "src/main/java/foo/bar/Foo.java"); - FileUtils.copyFile(getFile(testFile), javaFile1); - fs.add(new DeprecatedDefaultInputFile("foo", "src/main/java/foo/bar/Foo.java") - .setPathRelativeToSourceDir("foo/bar/Foo.java") - .setFile(javaFile1) - .setLanguage("java")); - Languages languages = new Languages(Java.INSTANCE); - ComponentIndexer indexer = createIndexer(languages); - indexer.execute(fs); - - Resource sonarFile = org.sonar.api.resources.File.create("/src/main/java/foo/bar/Foo.java", "foo/bar/Foo.java", Java.INSTANCE, false); - - verify(sourcePersister).saveSource(eq(sonarFile), argThat(new ArgumentMatcher<String>() { - @Override - public boolean matches(Object arg0) { - String source = (String) arg0; - return source.contains(aClaess) && source.contains(explicacao); - } - }), (Date) eq(null)); - } - - private File getFile(String testFile) { - return new File("test-resources/org/sonar/batch/phases/ComponentIndexerTest/encoding/" + testFile); - } - private DefaultInputFile newInputFile(String path, String content, String sourceRelativePath, String languageKey, boolean unitTest) throws IOException { File file = new File(baseDir, path); FileUtils.write(file, content); diff --git a/sonar-batch/test-resources/org/sonar/batch/phases/ComponentIndexerTest/encoding/CP1252Encoding.java b/sonar-batch/test-resources/org/sonar/batch/phases/ComponentIndexerTest/encoding/CP1252Encoding.java deleted file mode 100644 index 5f80ef59765..00000000000 --- a/sonar-batch/test-resources/org/sonar/batch/phases/ComponentIndexerTest/encoding/CP1252Encoding.java +++ /dev/null @@ -1,13 +0,0 @@ -public class Car { - - public AClaèss() { - } - - public int explicação() { - return 1; - } - - public String getS() { - return ""; - } -} diff --git a/sonar-batch/test-resources/org/sonar/batch/phases/ComponentIndexerTest/encoding/MacRomanEncoding.java b/sonar-batch/test-resources/org/sonar/batch/phases/ComponentIndexerTest/encoding/MacRomanEncoding.java deleted file mode 100644 index 30e52000eaf..00000000000 --- a/sonar-batch/test-resources/org/sonar/batch/phases/ComponentIndexerTest/encoding/MacRomanEncoding.java +++ /dev/null @@ -1,13 +0,0 @@ -public class Car { - - public AClass() { - } - - public int explica‹o() { - return 1; - } - - public String getS() { - return ""; - } -} diff --git a/sonar-core/src/main/java/org/sonar/core/persistence/DaoUtils.java b/sonar-core/src/main/java/org/sonar/core/persistence/DaoUtils.java index a6dd902d982..b7436623a00 100644 --- a/sonar-core/src/main/java/org/sonar/core/persistence/DaoUtils.java +++ b/sonar-core/src/main/java/org/sonar/core/persistence/DaoUtils.java @@ -24,7 +24,12 @@ import org.sonar.core.dashboard.ActiveDashboardDao; import org.sonar.core.dashboard.DashboardDao; import org.sonar.core.duplication.DuplicationDao; import org.sonar.core.graph.jdbc.GraphDao; -import org.sonar.core.issue.db.*; +import org.sonar.core.issue.db.ActionPlanDao; +import org.sonar.core.issue.db.ActionPlanStatsDao; +import org.sonar.core.issue.db.IssueChangeDao; +import org.sonar.core.issue.db.IssueDao; +import org.sonar.core.issue.db.IssueFilterDao; +import org.sonar.core.issue.db.IssueFilterFavouriteDao; import org.sonar.core.notification.db.NotificationQueueDao; import org.sonar.core.permission.PermissionDao; import org.sonar.core.permission.PermissionTemplateDao; @@ -38,10 +43,13 @@ import org.sonar.core.resource.ResourceKeyUpdaterDao; import org.sonar.core.rule.RuleDao; import org.sonar.core.source.db.FileSourceDao; import org.sonar.core.source.db.SnapshotDataDao; -import org.sonar.core.source.db.SnapshotSourceDao; import org.sonar.core.technicaldebt.db.CharacteristicDao; import org.sonar.core.template.LoadedTemplateDao; -import org.sonar.core.user.*; +import org.sonar.core.user.AuthorDao; +import org.sonar.core.user.AuthorizationDao; +import org.sonar.core.user.GroupMembershipDao; +import org.sonar.core.user.RoleDao; +import org.sonar.core.user.UserDao; import java.util.List; @@ -84,8 +92,7 @@ public final class DaoUtils { RuleDao.class, SemaphoreDao.class, SnapshotDataDao.class, - SnapshotSourceDao.class, UserDao.class - ); + ); } } diff --git a/sonar-core/src/main/java/org/sonar/core/persistence/MyBatis.java b/sonar-core/src/main/java/org/sonar/core/persistence/MyBatis.java index 43d1f26cefc..7785eba83c8 100644 --- a/sonar-core/src/main/java/org/sonar/core/persistence/MyBatis.java +++ b/sonar-core/src/main/java/org/sonar/core/persistence/MyBatis.java @@ -73,7 +73,6 @@ import org.sonar.core.rule.RuleParamDto; import org.sonar.core.source.db.FileSourceMapper; import org.sonar.core.source.db.SnapshotDataDto; import org.sonar.core.source.db.SnapshotDataMapper; -import org.sonar.core.source.db.SnapshotSourceMapper; import org.sonar.core.technicaldebt.db.CharacteristicDto; import org.sonar.core.technicaldebt.db.CharacteristicMapper; import org.sonar.core.technicaldebt.db.RequirementMigrationDto; @@ -193,7 +192,7 @@ public class MyBatis implements BatchComponent, ServerComponent { LoadedTemplateMapper.class, MeasureFilterMapper.class, Migration44Mapper.class, PermissionTemplateMapper.class, PropertiesMapper.class, PurgeMapper.class, ResourceKeyUpdaterMapper.class, ResourceIndexerMapper.class, ResourceSnapshotMapper.class, RoleMapper.class, RuleMapper.class, SchemaMigrationMapper.class, SemaphoreMapper.class, UserMapper.class, GroupMapper.class, WidgetMapper.class, WidgetPropertyMapper.class, - org.sonar.api.database.model.MeasureMapper.class, SnapshotDataMapper.class, SnapshotSourceMapper.class, FileSourceMapper.class, ActionPlanMapper.class, + org.sonar.api.database.model.MeasureMapper.class, SnapshotDataMapper.class, FileSourceMapper.class, ActionPlanMapper.class, ActionPlanStatsMapper.class, NotificationQueueMapper.class, CharacteristicMapper.class, GroupMembershipMapper.class, QualityProfileMapper.class, ActiveRuleMapper.class, diff --git a/sonar-core/src/main/java/org/sonar/core/source/db/SnapshotSourceDao.java b/sonar-core/src/main/java/org/sonar/core/source/db/SnapshotSourceDao.java deleted file mode 100644 index 3b28c5c5806..00000000000 --- a/sonar-core/src/main/java/org/sonar/core/source/db/SnapshotSourceDao.java +++ /dev/null @@ -1,80 +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.core.source.db; - -import org.apache.ibatis.session.SqlSession; -import org.sonar.api.BatchComponent; -import org.sonar.api.ServerComponent; -import org.sonar.core.persistence.MyBatis; - -import javax.annotation.CheckForNull; - -/** - * @since 3.6 - */ -public class SnapshotSourceDao implements BatchComponent, ServerComponent { - - private final MyBatis mybatis; - - public SnapshotSourceDao(MyBatis myBatis) { - this.mybatis = myBatis; - } - - @CheckForNull - public String selectSnapshotSource(long snapshotId) { - SqlSession session = mybatis.openSession(false); - - try { - SnapshotSourceMapper mapper = session.getMapper(SnapshotSourceMapper.class); - return mapper.selectSnapshotSource(snapshotId); - - } finally { - MyBatis.closeQuietly(session); - } - } - - @CheckForNull - public String selectSnapshotSourceByComponentKey(String componentKey, SqlSession session) { - SnapshotSourceMapper mapper = session.getMapper(SnapshotSourceMapper.class); - return mapper.selectSnapshotSourceByComponentKey(componentKey); - } - - @CheckForNull - public String selectSnapshotSourceByComponentKey(String componentKey) { - SqlSession session = mybatis.openSession(false); - try { - return selectSnapshotSourceByComponentKey(componentKey, session); - } finally { - MyBatis.closeQuietly(session); - } - } - - public void insert(SnapshotSourceDto dto) { - SqlSession session = mybatis.openSession(false); - try { - session.getMapper(SnapshotSourceMapper.class).insert(dto); - session.commit(); - } finally { - MyBatis.closeQuietly(session); - } - } - -} diff --git a/sonar-core/src/main/java/org/sonar/core/source/db/SnapshotSourceDto.java b/sonar-core/src/main/java/org/sonar/core/source/db/SnapshotSourceDto.java deleted file mode 100644 index 2c99551f63a..00000000000 --- a/sonar-core/src/main/java/org/sonar/core/source/db/SnapshotSourceDto.java +++ /dev/null @@ -1,65 +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.core.source.db; - -import java.util.Date; - -public class SnapshotSourceDto { - private Long id; - private Long snapshotId; - private String data; - private Date updatedAt; - - public Long getId() { - return id; - } - - public SnapshotSourceDto setId(Long id) { - this.id = id; - return this; - } - - public Long getSnapshotId() { - return snapshotId; - } - - public SnapshotSourceDto setSnapshotId(Long snapshotId) { - this.snapshotId = snapshotId; - return this; - } - - public String getData() { - return data; - } - - public SnapshotSourceDto setData(String data) { - this.data = data; - return this; - } - - public Date getUpdatedAt() { - return updatedAt; - } - - public SnapshotSourceDto setUpdatedAt(Date updatedAt) { - this.updatedAt = updatedAt; - return this; - } -} diff --git a/sonar-core/src/main/java/org/sonar/core/source/db/SnapshotSourceMapper.java b/sonar-core/src/main/java/org/sonar/core/source/db/SnapshotSourceMapper.java deleted file mode 100644 index 565c1d09e45..00000000000 --- a/sonar-core/src/main/java/org/sonar/core/source/db/SnapshotSourceMapper.java +++ /dev/null @@ -1,37 +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.core.source.db; - -import javax.annotation.CheckForNull; - -/** - * @since 3.6 - */ -public interface SnapshotSourceMapper { - - @CheckForNull - String selectSnapshotSource(long snapshotId); - - @CheckForNull - String selectSnapshotSourceByComponentKey(String componentKey); - - void insert(SnapshotSourceDto dto); -} diff --git a/sonar-core/src/main/resources/org/sonar/core/source/db/SnapshotSourceMapper.xml b/sonar-core/src/main/resources/org/sonar/core/source/db/SnapshotSourceMapper.xml deleted file mode 100644 index a6c30aa35a6..00000000000 --- a/sonar-core/src/main/resources/org/sonar/core/source/db/SnapshotSourceMapper.xml +++ /dev/null @@ -1,27 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> - -<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - -<mapper namespace="org.sonar.core.source.db.SnapshotSourceMapper"> - - <select id="selectSnapshotSource" parameterType="long" resultType="string"> - SELECT data - FROM snapshot_sources - WHERE snapshot_id = #{sid} - </select> - - <select id="selectSnapshotSourceByComponentKey" parameterType="String" resultType="string"> - SELECT data - FROM snapshot_sources source - INNER JOIN snapshots s ON s.id=source.snapshot_id and s.islast=${_true} - INNER JOIN projects p ON p.id=s.project_id and p.enabled=${_true} - WHERE p.kee = #{componentKey} - </select> - - <insert id="insert" parameterType="org.sonar.core.source.db.SnapshotSourceDto" useGeneratedKeys="false"> - insert into snapshot_sources (snapshot_id, data, updated_at) - values (#{snapshotId}, #{data}, #{updatedAt}) - </insert> - -</mapper> - diff --git a/sonar-core/src/test/java/org/sonar/core/source/db/SnapshotSourceDaoTest.java b/sonar-core/src/test/java/org/sonar/core/source/db/SnapshotSourceDaoTest.java deleted file mode 100644 index 2d3dd1c13e9..00000000000 --- a/sonar-core/src/test/java/org/sonar/core/source/db/SnapshotSourceDaoTest.java +++ /dev/null @@ -1,61 +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.core.source.db; - -import org.junit.Before; -import org.junit.Test; -import org.sonar.api.utils.DateUtils; -import org.sonar.core.persistence.AbstractDaoTestCase; - -import static org.fest.assertions.Assertions.assertThat; - -public class SnapshotSourceDaoTest extends AbstractDaoTestCase { - - private SnapshotSourceDao dao; - - @Before - public void setUpTestData() { - dao = new SnapshotSourceDao(getMyBatis()); - setupData("shared"); - } - - @Test - public void select_snapshot_source() throws Exception { - String snapshotSource = dao.selectSnapshotSource(11L); - - assertThat(snapshotSource).isEqualTo("public class Foo {public Foo(){}}"); - } - - @Test - public void select_snapshot_source_by_component_key() throws Exception { - String snapshotSource = dao.selectSnapshotSourceByComponentKey("org.apache.struts:struts:Dispatcher"); - - assertThat(snapshotSource).isEqualTo("public class Foo {public Foo(){}}"); - } - - @Test - public void insert() throws Exception { - dao.insert(new SnapshotSourceDto().setData("bar").setSnapshotId(11L).setUpdatedAt(DateUtils.parseDateTime("2014-10-31T16:44:02+0100"))); - - checkTable("insert", "snapshot_sources"); - } - -} diff --git a/sonar-core/src/test/java/org/sonar/core/source/db/SnapshotSourceDtoTest.java b/sonar-core/src/test/java/org/sonar/core/source/db/SnapshotSourceDtoTest.java deleted file mode 100644 index 6f11516b0b7..00000000000 --- a/sonar-core/src/test/java/org/sonar/core/source/db/SnapshotSourceDtoTest.java +++ /dev/null @@ -1,40 +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.core.source.db; - -import org.junit.Test; - -import static org.fest.assertions.Assertions.assertThat; - -public class SnapshotSourceDtoTest { - - @Test - public void test_setters_and_getters() throws Exception { - SnapshotSourceDto dto = new SnapshotSourceDto() - .setId(1L) - .setSnapshotId(10L) - .setData("data"); - - assertThat(dto.getId()).isEqualTo(1L); - assertThat(dto.getSnapshotId()).isEqualTo(10L); - assertThat(dto.getData()).isEqualTo("data"); - } -} diff --git a/sonar-core/src/test/resources/org/sonar/core/source/db/SnapshotSourceDaoTest/insert-result.xml b/sonar-core/src/test/resources/org/sonar/core/source/db/SnapshotSourceDaoTest/insert-result.xml deleted file mode 100644 index 75c9e826be3..00000000000 --- a/sonar-core/src/test/resources/org/sonar/core/source/db/SnapshotSourceDaoTest/insert-result.xml +++ /dev/null @@ -1,12 +0,0 @@ -<dataset> - - <projects id="1" kee="org.apache.struts:struts:Dispatcher" enabled="[true]"/> - - <snapshots id="10" project_id="1" islast="[false]"/> - <snapshots id="11" project_id="1" islast="[true]"/> - - <snapshot_sources id="101" snapshot_id="11" data="public class Foo {public Foo(){}}" updated_at="2014-10-30 16:44:02.000"/> - - <snapshot_sources id="102" snapshot_id="11" data="bar" updated_at="2014-10-31 16:44:02.000"/> - -</dataset> diff --git a/sonar-core/src/test/resources/org/sonar/core/source/db/SnapshotSourceDaoTest/shared.xml b/sonar-core/src/test/resources/org/sonar/core/source/db/SnapshotSourceDaoTest/shared.xml deleted file mode 100644 index 850127d7cfb..00000000000 --- a/sonar-core/src/test/resources/org/sonar/core/source/db/SnapshotSourceDaoTest/shared.xml +++ /dev/null @@ -1,10 +0,0 @@ -<dataset> - - <projects id="1" kee="org.apache.struts:struts:Dispatcher" enabled="[true]"/> - - <snapshots id="10" project_id="1" islast="[false]" /> - <snapshots id="11" project_id="1" islast="[true]" /> - - <snapshot_sources id="101" snapshot_id="11" data="public class Foo {public Foo(){}}" updated_at="2014-10-30 16:44:02.000" /> - -</dataset> diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/batch/SonarIndex.java b/sonar-plugin-api/src/main/java/org/sonar/api/batch/SonarIndex.java index d230420b20e..54db782b805 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/batch/SonarIndex.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/batch/SonarIndex.java @@ -19,6 +19,7 @@ */ package org.sonar.api.batch; +import org.sonar.api.batch.fs.InputFile; import org.sonar.api.batch.sensor.SensorContext; import org.sonar.api.design.Dependency; import org.sonar.api.measures.Measure; @@ -97,7 +98,9 @@ public abstract class SonarIndex implements DirectedGraphAccessor<Resource, Depe * @return source code associated with a specified resource, <code>null</code> if not available * (for example if resource is not a file) * @since 2.9 + * @deprecated since 5.0 sources are no more stored in SQ as a single blob. Use {@link InputFile#file()} to read file content from disk. */ + @Deprecated @CheckForNull public abstract String getSource(Resource resource); diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/web/CodeColorizerFormat.java b/sonar-plugin-api/src/main/java/org/sonar/api/web/CodeColorizerFormat.java index 2eae8dd5b59..dc88d432337 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/web/CodeColorizerFormat.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/web/CodeColorizerFormat.java @@ -20,7 +20,6 @@ package org.sonar.api.web; import com.google.common.base.Objects; -import org.sonar.api.ServerExtension; import org.sonar.api.source.Highlightable; import org.sonar.api.task.TaskExtension; import org.sonar.colorizer.Tokenizer; @@ -34,7 +33,7 @@ import java.util.List; * @deprecated since 4.5.2 use {@link Highlightable} API */ @Deprecated -public abstract class CodeColorizerFormat implements ServerExtension, TaskExtension { +public abstract class CodeColorizerFormat implements TaskExtension { private String languageKey; |