diff options
author | Jean-Baptiste Vilain <jean-baptiste.vilain@sonarsource.com> | 2013-04-11 16:24:52 +0200 |
---|---|---|
committer | Jean-Baptiste Vilain <jean-baptiste.vilain@sonarsource.com> | 2013-04-11 16:24:52 +0200 |
commit | fa79db824d284f92ff2cb65c9dc7d3029f3a36fa (patch) | |
tree | 82bd938d692d0b81b80eec754fdd0bb1e53df237 | |
parent | 619d71c598da3903dd8c7516a0ca170689a18fc9 (diff) | |
download | sonarqube-fa79db824d284f92ff2cb65c9dc7d3029f3a36fa.tar.gz sonarqube-fa79db824d284f92ff2cb65c9dc7d3029f3a36fa.zip |
(SONAR-3893) Improve the highlighter API to not depend on sonar-channel and allow to work on multi-line tokens - Added highlighting caching and persistence
17 files changed, 248 insertions, 72 deletions
diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/ModuleScanContainer.java b/sonar-batch/src/main/java/org/sonar/batch/scan/ModuleScanContainer.java index 004b22f11cd..855e40be342 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/ModuleScanContainer.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/ModuleScanContainer.java @@ -57,11 +57,7 @@ import org.sonar.batch.scan.filesystem.LanguageFilters; import org.sonar.batch.scan.filesystem.ModuleFileSystemProvider; import org.sonar.core.component.ScanPerspectives; import org.sonar.batch.issue.ScanIssuableFactory; -import org.sonar.core.source.HighlightableBuilder; -import org.sonar.core.test.TestPlanBuilder; -import org.sonar.core.test.TestPlanPerspectiveLoader; -import org.sonar.core.test.TestableBuilder; -import org.sonar.core.test.TestablePerspectiveLoader; +import org.sonar.batch.scan.source.HighlightableBuilder; public class ModuleScanContainer extends ComponentContainer { private static final Logger LOG = LoggerFactory.getLogger(ModuleScanContainer.class); diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java b/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java index 6a713c09fe3..d26352c878f 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/ProjectScanContainer.java @@ -38,6 +38,8 @@ import org.sonar.batch.issue.IssuePersister; import org.sonar.batch.phases.GraphPersister; import org.sonar.batch.scan.maven.FakeMavenPluginExecutor; import org.sonar.batch.scan.maven.MavenPluginExecutor; +import org.sonar.batch.scan.source.SyntaxHighlightingCache; +import org.sonar.batch.scan.source.SyntaxHighlightingPersister; import org.sonar.core.component.ScanGraph; import org.sonar.core.notification.DefaultNotificationManager; import org.sonar.core.test.TestPlanBuilder; @@ -86,7 +88,11 @@ public class ProjectScanContainer extends ComponentContainer { TestPlanBuilder.class, TestableBuilder.class, ScanGraph.create(), - GraphPersister.class); + GraphPersister.class, + + SyntaxHighlightingCache.class, + SyntaxHighlightingPersister.class + ); } private void fixMavenExecutor() { diff --git a/sonar-core/src/main/java/org/sonar/core/source/DefaultHighlightable.java b/sonar-batch/src/main/java/org/sonar/batch/scan/source/DefaultHighlightable.java index 83e3dbf8453..3327bdea837 100644 --- a/sonar-core/src/main/java/org/sonar/core/source/DefaultHighlightable.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/source/DefaultHighlightable.java @@ -17,7 +17,7 @@ * License along with Sonar; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 */ -package org.sonar.core.source; +package org.sonar.batch.scan.source; import org.sonar.api.component.Component; import org.sonar.api.scan.source.Highlightable; @@ -27,10 +27,19 @@ import org.sonar.api.scan.source.Highlightable; */ public class DefaultHighlightable implements Highlightable { + private final Component component; + private final SyntaxHighlightingCache syntaxHighlightingCache; private final SyntaxHighlightingRuleSet.Builder highlightingRulesBuilder; - public DefaultHighlightable() { - highlightingRulesBuilder = SyntaxHighlightingRuleSet.builder(); + public DefaultHighlightable(Component component, SyntaxHighlightingCache syntaxHighlightingCache) { + this.component = component; + this.syntaxHighlightingCache = syntaxHighlightingCache; + this.highlightingRulesBuilder = SyntaxHighlightingRuleSet.builder(); + } + + @Override + public SyntaxHighlighter createHighlighter() { + return new DefaultSyntaxHighlighter(); } @Override @@ -40,10 +49,25 @@ public class DefaultHighlightable implements Highlightable { @Override public Component component() { - throw new UnsupportedOperationException("Unexpected call to component API"); + return component; } public SyntaxHighlightingRuleSet getHighlightingRules() { return highlightingRulesBuilder.build(); } + + private class DefaultSyntaxHighlighter implements SyntaxHighlighter { + + @Override + public SyntaxHighlighter highlightText(int startOffset, int endOffset, String typeOfText) { + highlightingRulesBuilder.registerHighlightingRule(startOffset, endOffset, typeOfText); + return this; + } + + @Override + public void applyHighlighting() { + String serializedHighlightingRules = highlightingRulesBuilder.build().serializeAsString(); + syntaxHighlightingCache.registerSourceHighlighting(component().key(), serializedHighlightingRules); + } + } } diff --git a/sonar-core/src/main/java/org/sonar/core/source/HighlightableBuilder.java b/sonar-batch/src/main/java/org/sonar/batch/scan/source/HighlightableBuilder.java index 542468d0263..a25c39d114f 100644 --- a/sonar-core/src/main/java/org/sonar/core/source/HighlightableBuilder.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/source/HighlightableBuilder.java @@ -17,7 +17,7 @@ * License along with Sonar; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 */ -package org.sonar.core.source; +package org.sonar.batch.scan.source; import org.sonar.api.component.Component; import org.sonar.api.scan.source.Highlightable; @@ -28,12 +28,15 @@ import org.sonar.core.component.PerspectiveBuilder; */ public class HighlightableBuilder extends PerspectiveBuilder<Highlightable> { - public HighlightableBuilder() { + private final SyntaxHighlightingCache syntaxHighlightingCache; + + public HighlightableBuilder(SyntaxHighlightingCache syntaxHighlightingCache) { super(Highlightable.class); + this.syntaxHighlightingCache = syntaxHighlightingCache; } @Override protected Highlightable loadPerspective(Class<Highlightable> perspectiveClass, Component component) { - return new DefaultHighlightable(); + return new DefaultHighlightable(component, syntaxHighlightingCache); } } diff --git a/sonar-batch/src/main/java/org/sonar/batch/source/SyntaxPersister.java b/sonar-batch/src/main/java/org/sonar/batch/scan/source/SyntaxHighlightingCache.java index 8eeb3cb1618..d2e90f20b91 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/source/SyntaxPersister.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/source/SyntaxHighlightingCache.java @@ -17,20 +17,27 @@ * License along with Sonar; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 */ -package org.sonar.batch.source; -import org.sonar.batch.index.ScanPersister; -import org.sonar.batch.index.SnapshotCache; +package org.sonar.batch.scan.source; -public class SyntaxPersister implements ScanPersister { - private final SnapshotCache snapshots; +import com.google.common.collect.Maps; +import org.sonar.api.BatchComponent; - public SyntaxPersister(SnapshotCache snapshots) { - this.snapshots = snapshots; +import java.util.Map; + +public class SyntaxHighlightingCache implements BatchComponent { + + private final Map<String, String> highlightingCache; + + public SyntaxHighlightingCache() { + highlightingCache = Maps.newHashMap(); } - @Override - public void persist() { + public void registerSourceHighlighting(String componentKey, String serializedHighlightingRules) { + highlightingCache.put(componentKey, serializedHighlightingRules); + } + public Map<String, String> getHighlightingRulesByComponent() { + return highlightingCache; } } diff --git a/sonar-batch/src/main/java/org/sonar/batch/scan/source/SyntaxHighlightingPersister.java b/sonar-batch/src/main/java/org/sonar/batch/scan/source/SyntaxHighlightingPersister.java index 5275877d581..fd3d016e339 100644 --- a/sonar-batch/src/main/java/org/sonar/batch/scan/source/SyntaxHighlightingPersister.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/source/SyntaxHighlightingPersister.java @@ -20,22 +20,44 @@ package org.sonar.batch.scan.source; +import org.sonar.api.database.model.Snapshot; import org.sonar.batch.index.ScanPersister; +import org.sonar.batch.index.SnapshotCache; import org.sonar.core.source.jdbc.SnapshotDataDao; +import org.sonar.core.source.jdbc.SnapshotDataDto; + +import java.util.Map; public class SyntaxHighlightingPersister implements ScanPersister { + public static final String DATA_TYPE = "highlight_syntax"; + private final SnapshotDataDao snapshotDataDao; + private final SyntaxHighlightingCache highlightingCache; + private final SnapshotCache snapshots; - public SyntaxHighlightingPersister(SnapshotDataDao snapshotDataDao) { + public SyntaxHighlightingPersister(SnapshotDataDao snapshotDataDao, SyntaxHighlightingCache highlightingCache, SnapshotCache snapshots) { this.snapshotDataDao = snapshotDataDao; + this.highlightingCache = highlightingCache; + this.snapshots = snapshots; } @Override public void persist() { + Map<String, String> highlightingRules = highlightingCache.getHighlightingRulesByComponent(); + + for (String component : highlightingRules.keySet()) { + Snapshot snapshotForComponent = snapshots.get(component); + SnapshotDataDto snapshotDataDto = new SnapshotDataDto(); + snapshotDataDto.setSnapshotId(snapshotForComponent.getId()); + snapshotDataDto.setResourceId(snapshotForComponent.getResourceId()); + snapshotDataDto.setDataType(DATA_TYPE); + snapshotDataDto.setData(highlightingRules.get(component)); + snapshotDataDao.insert(snapshotDataDto); + } } } diff --git a/sonar-core/src/main/java/org/sonar/core/source/SyntaxHighlightingRule.java b/sonar-batch/src/main/java/org/sonar/batch/scan/source/SyntaxHighlightingRule.java index 462b1e445de..90ab73485d9 100644 --- a/sonar-core/src/main/java/org/sonar/core/source/SyntaxHighlightingRule.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/source/SyntaxHighlightingRule.java @@ -17,7 +17,7 @@ * License along with Sonar; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 */ -package org.sonar.core.source; +package org.sonar.batch.scan.source; /** * @since 3.6 diff --git a/sonar-core/src/main/java/org/sonar/core/source/SyntaxHighlightingRuleSet.java b/sonar-batch/src/main/java/org/sonar/batch/scan/source/SyntaxHighlightingRuleSet.java index b83c1b1b711..6de5677588d 100644 --- a/sonar-core/src/main/java/org/sonar/core/source/SyntaxHighlightingRuleSet.java +++ b/sonar-batch/src/main/java/org/sonar/batch/scan/source/SyntaxHighlightingRuleSet.java @@ -17,7 +17,7 @@ * License along with Sonar; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 */ -package org.sonar.core.source; +package org.sonar.batch.scan.source; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Predicate; diff --git a/sonar-core/src/test/java/org/sonar/core/source/DefaultHighlightableTest.java b/sonar-batch/src/test/java/org/sonar/batch/scan/source/DefaultHighlightableTest.java index 50b9795aa66..c3c18da4962 100644 --- a/sonar-core/src/test/java/org/sonar/core/source/DefaultHighlightableTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/scan/source/DefaultHighlightableTest.java @@ -17,13 +17,17 @@ * License along with Sonar; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 */ -package org.sonar.core.source; +package org.sonar.batch.scan.source; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; +import org.sonar.api.component.Component; import static org.fest.assertions.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; public class DefaultHighlightableTest { @@ -33,18 +37,36 @@ public class DefaultHighlightableTest { @Test public void should_register_highlighting_rule() throws Exception { - DefaultHighlightable highlightable = new DefaultHighlightable(); + DefaultHighlightable highlightable = new DefaultHighlightable(null, null); highlightable.highlightText(1, 10, "k"); assertThat(highlightable.getHighlightingRules().getSyntaxHighlightingRuleSet()).hasSize(1); } + + @Test + public void should_store_highlighting_rules() throws Exception { + + DefaultHighlightable highlightablePerspective = new DefaultHighlightable(null, null); + highlightablePerspective.createHighlighter().highlightText(0, 10, "k").highlightText(20, 30, "cppd"); + + assertThat(highlightablePerspective.getHighlightingRules().getSyntaxHighlightingRuleSet()).hasSize(2); + } + @Test - public void should_reject_any_call_to_component() throws Exception { + public void should_apply_registered_highlighting() throws Exception { + + Component component = mock(Component.class); + when(component.key()).thenReturn("myComponent"); + + SyntaxHighlightingCache highlightingCache = mock(SyntaxHighlightingCache.class); - throwable.expect(UnsupportedOperationException.class); + DefaultHighlightable highlightablePerspective = new DefaultHighlightable(component, highlightingCache); + highlightablePerspective.createHighlighter() + .highlightText(0, 10, "k") + .highlightText(20, 30, "cppd") + .applyHighlighting(); - DefaultHighlightable highlightable = new DefaultHighlightable(); - highlightable.component(); + verify(highlightingCache).registerSourceHighlighting("myComponent", "0,10,k;20,30,cppd;"); } } diff --git a/sonar-core/src/test/java/org/sonar/core/source/HighlightableBuilderTest.java b/sonar-batch/src/test/java/org/sonar/batch/scan/source/HighlightableBuilderTest.java index 427feb7ce9e..95fccc235dc 100644 --- a/sonar-core/src/test/java/org/sonar/core/source/HighlightableBuilderTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/scan/source/HighlightableBuilderTest.java @@ -17,7 +17,7 @@ * License along with Sonar; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 */ -package org.sonar.core.source; +package org.sonar.batch.scan.source; import org.junit.Test; import org.sonar.api.component.Component; @@ -32,8 +32,9 @@ public class HighlightableBuilderTest { public void should_load_default_perspective() throws Exception { Component mockComponent = mock(Component.class); + SyntaxHighlightingCache highlightingCache = mock(SyntaxHighlightingCache.class); - HighlightableBuilder builder = new HighlightableBuilder(); + HighlightableBuilder builder = new HighlightableBuilder(highlightingCache); Highlightable perspective = builder.loadPerspective(Highlightable.class, mockComponent); assertThat(perspective).isInstanceOf(DefaultHighlightable.class); diff --git a/sonar-batch/src/test/java/org/sonar/batch/scan/source/SyntaxHighlightingPersisterTest.java b/sonar-batch/src/test/java/org/sonar/batch/scan/source/SyntaxHighlightingPersisterTest.java new file mode 100644 index 00000000000..fb8816aef6f --- /dev/null +++ b/sonar-batch/src/test/java/org/sonar/batch/scan/source/SyntaxHighlightingPersisterTest.java @@ -0,0 +1,89 @@ +/* + * Sonar, open source software quality management tool. + * Copyright (C) 2008-2012 SonarSource + * mailto:contact AT sonarsource DOT com + * + * Sonar 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. + * + * Sonar 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 Sonar; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 + */ + +package org.sonar.batch.scan.source; + +import com.google.common.collect.Maps; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentMatcher; +import org.mockito.InOrder; +import org.sonar.api.database.model.Snapshot; +import org.sonar.batch.index.SnapshotCache; +import org.sonar.core.source.jdbc.SnapshotDataDao; +import org.sonar.core.source.jdbc.SnapshotDataDto; + +import java.util.Map; + +import static org.mockito.Mockito.*; + +public class SyntaxHighlightingPersisterTest { + + private SnapshotCache snapshots; + private SyntaxHighlightingCache highlightingCache; + private SnapshotDataDao snapshotDataDao; + + @Before + public void setUpInjectedObjects() { + snapshots = mock(SnapshotCache.class); + highlightingCache = mock(SyntaxHighlightingCache.class); + snapshotDataDao = mock(SnapshotDataDao.class); + } + + @Test + public void should_persist_components_highlighting() throws Exception { + + Snapshot snapshotComponent1 = mock(Snapshot.class); + when(snapshotComponent1.getId()).thenReturn(1); + when(snapshotComponent1.getResourceId()).thenReturn(1); + + Snapshot snapshotComponent2 = mock(Snapshot.class); + when(snapshotComponent2.getId()).thenReturn(2); + when(snapshotComponent2.getResourceId()).thenReturn(2); + + Map<String, String> highlightingRules = Maps.newHashMap(); + highlightingRules.put("component1", "0,10,k;2,4,k;15,25,cppd;"); + highlightingRules.put("component2", "0,5,cppd;15,25,k;"); + + when(highlightingCache.getHighlightingRulesByComponent()).thenReturn(highlightingRules); + + when(snapshots.get("component1")).thenReturn(snapshotComponent1); + when(snapshots.get("component2")).thenReturn(snapshotComponent2); + + SyntaxHighlightingPersister persister = new SyntaxHighlightingPersister(snapshotDataDao, highlightingCache, snapshots); + persister.persist(); + + InOrder orderedMock = inOrder(snapshotDataDao); + + orderedMock.verify(snapshotDataDao).insert(argThat(new ArgumentMatcher<SnapshotDataDto>() { + @Override + public boolean matches(Object o) { + return ((SnapshotDataDto)o).getSnapshotId() == 1; + } + })); + + orderedMock.verify(snapshotDataDao).insert(argThat(new ArgumentMatcher<SnapshotDataDto>() { + @Override + public boolean matches(Object o) { + return ((SnapshotDataDto)o).getSnapshotId() == 2; + } + })); + } +} diff --git a/sonar-core/src/test/java/org/sonar/core/source/SyntaxHighlightingRuleSetTest.java b/sonar-batch/src/test/java/org/sonar/batch/scan/source/SyntaxHighlightingRuleSetTest.java index cbcb717411d..e6cddd2db4c 100644 --- a/sonar-core/src/test/java/org/sonar/core/source/SyntaxHighlightingRuleSetTest.java +++ b/sonar-batch/src/test/java/org/sonar/batch/scan/source/SyntaxHighlightingRuleSetTest.java @@ -17,7 +17,7 @@ * License along with Sonar; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 */ -package org.sonar.core.source; +package org.sonar.batch.scan.source; import org.junit.Before; diff --git a/sonar-batch/src/test/java/org/sonar/batch/source/SyntaxPersisterTest.java b/sonar-batch/src/test/java/org/sonar/batch/source/SyntaxPersisterTest.java deleted file mode 100644 index 2a333505336..00000000000 --- a/sonar-batch/src/test/java/org/sonar/batch/source/SyntaxPersisterTest.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Sonar, open source software quality management tool. - * Copyright (C) 2008-2012 SonarSource - * mailto:contact AT sonarsource DOT com - * - * Sonar 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. - * - * Sonar 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 Sonar; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02 - */ -package org.sonar.batch.source; - -import org.junit.Test; -import org.sonar.batch.index.SnapshotCache; - -import static org.mockito.Mockito.mock; - -public class SyntaxPersisterTest { - - SnapshotCache snapshots = mock(SnapshotCache.class); - - @Test - public void should_persist() throws Exception { - SyntaxPersister persister = new SyntaxPersister(snapshots); - persister.persist(); - // TODO - } -} 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 3aa799ddae0..8cc38c58d83 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 @@ -34,6 +34,7 @@ import org.sonar.core.resource.ResourceKeyUpdaterDao; import org.sonar.core.review.ReviewCommentDao; import org.sonar.core.review.ReviewDao; import org.sonar.core.rule.RuleDao; +import org.sonar.core.source.jdbc.SnapshotDataDao; import org.sonar.core.template.LoadedTemplateDao; import org.sonar.core.user.AuthorDao; import org.sonar.core.user.UserDao; @@ -65,6 +66,7 @@ public final class DaoUtils { ReviewDao.class, RuleDao.class, SemaphoreDao.class, + SnapshotDataDao.class, UserDao.class ); } diff --git a/sonar-core/src/main/java/org/sonar/core/source/jdbc/SnapshotDataDao.java b/sonar-core/src/main/java/org/sonar/core/source/jdbc/SnapshotDataDao.java index de8512aedbd..45c2649758b 100644 --- a/sonar-core/src/main/java/org/sonar/core/source/jdbc/SnapshotDataDao.java +++ b/sonar-core/src/main/java/org/sonar/core/source/jdbc/SnapshotDataDao.java @@ -21,12 +21,14 @@ package org.sonar.core.source.jdbc; import org.apache.ibatis.session.SqlSession; +import org.sonar.api.BatchComponent; +import org.sonar.api.ServerComponent; import org.sonar.core.persistence.MyBatis; /** * @since 3.6 */ -public class SnapshotDataDao { +public class SnapshotDataDao implements BatchComponent, ServerComponent { private final MyBatis mybatis; diff --git a/sonar-core/src/main/java/org/sonar/core/source/jdbc/SnapshotDataDto.java b/sonar-core/src/main/java/org/sonar/core/source/jdbc/SnapshotDataDto.java index 847ac49e1b5..7a8669eed10 100644 --- a/sonar-core/src/main/java/org/sonar/core/source/jdbc/SnapshotDataDto.java +++ b/sonar-core/src/main/java/org/sonar/core/source/jdbc/SnapshotDataDto.java @@ -70,4 +70,30 @@ public class SnapshotDataDto { public void setDataType(String dataType) { this.dataType = dataType; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + SnapshotDataDto that = (SnapshotDataDto) o; + + if (id != that.id) return false; + if (resourceId != that.resourceId) return false; + if (snapshotId != that.snapshotId) return false; + if (data != null ? !data.equals(that.data) : that.data != null) return false; + if (dataType != null ? !dataType.equals(that.dataType) : that.dataType != null) return false; + + return true; + } + + @Override + public int hashCode() { + int result = (int) (id ^ (id >>> 32)); + result = 31 * result + (int) (snapshotId ^ (snapshotId >>> 32)); + result = 31 * result + (int) (resourceId ^ (resourceId >>> 32)); + result = 31 * result + (data != null ? data.hashCode() : 0); + result = 31 * result + (dataType != null ? dataType.hashCode() : 0); + return result; + } } diff --git a/sonar-plugin-api/src/main/java/org/sonar/api/scan/source/Highlightable.java b/sonar-plugin-api/src/main/java/org/sonar/api/scan/source/Highlightable.java index ae3fecf7aa5..bcf64e54cd0 100644 --- a/sonar-plugin-api/src/main/java/org/sonar/api/scan/source/Highlightable.java +++ b/sonar-plugin-api/src/main/java/org/sonar/api/scan/source/Highlightable.java @@ -26,5 +26,18 @@ import org.sonar.api.component.Perspective; */ public interface Highlightable extends Perspective { + interface SyntaxHighlighter { + + SyntaxHighlighter highlightText(int startOffset, int endOffset, String typeOfText); + + void applyHighlighting(); + } + + SyntaxHighlighter createHighlighter(); + + /* + * @deprecated in favor of the provided builder-based api + */ + @Deprecated void highlightText(int startOffset, int endOffset, String typeOfText); } |