import org.sonar.api.component.Component;
import org.sonar.api.scan.source.Highlightable;
import org.sonar.batch.index.ComponentDataCache;
-import org.sonar.core.source.jdbc.SnapshotDataDto;
+import org.sonar.core.source.SnapshotDataType;
/**
* @since 3.6
@Override
public void done() {
- cache.setStringData(component().key(), SnapshotDataDto.HIGHLIGHT_SYNTAX, builder.build().writeString());
+ cache.setStringData(component().key(), SnapshotDataType.SYNTAX_HIGHLIGHTING.getValue(), builder.build().writeString());
}
}
}
import org.sonar.api.scan.source.Symbol;
import org.sonar.api.scan.source.SymbolPerspective;
import org.sonar.batch.index.ComponentDataCache;
-import org.sonar.core.source.jdbc.SnapshotDataDto;
+import org.sonar.core.source.SnapshotDataType;
public class DefaultSymbolPerspective implements SymbolPerspective {
@Override
public void end() {
- cache.setStringData(component().key(), SnapshotDataDto.SYMBOL, symbolDataRepository.writeString());
+ cache.setStringData(component().key(), SnapshotDataType.SYMBOL_HIGHLIGHTING.getValue(), symbolDataRepository.writeString());
}
@Override
import org.junit.rules.ExpectedException;
import org.sonar.api.component.Component;
import org.sonar.batch.index.ComponentDataCache;
-import org.sonar.core.source.jdbc.SnapshotDataDto;
+import org.sonar.core.source.SnapshotDataType;
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;
+import static org.mockito.Mockito.*;
public class DefaultHighlightableTest {
.highlight(20, 30, "cppd")
.done();
- verify(cache).setStringData("myComponent", SnapshotDataDto.HIGHLIGHT_SYNTAX, "0,10,k;20,30,cppd;");
+ verify(cache).setStringData("myComponent", SnapshotDataType.SYNTAX_HIGHLIGHTING.getValue(), "0,10,k;20,30,cppd;");
}
}
import org.sonar.api.component.Component;
import org.sonar.api.scan.source.Symbol;
import org.sonar.batch.index.ComponentDataCache;
-import org.sonar.core.source.jdbc.SnapshotDataDto;
+import org.sonar.core.source.SnapshotDataType;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.*;
public class DefaultSymbolPerspectiveTest {
symbolPerspective.end();
- verify(cache).setStringData("myComponent", SnapshotDataDto.SYMBOL, "4,8,4,12,70;25,33,25,44,60,108;");
+ verify(cache).setStringData("myComponent", SnapshotDataType.SYMBOL_HIGHLIGHTING.getValue(), "4,8,4,12,70;25,33,25,44,60,108;");
}
}
private static final String SYMBOL_PREFIX = "sym-";
private static final String HIGHLIGHTABLE = "sym";
- private List<TagEntry> openingTagsEntries;
+ private List<OpeningHtmlTag> openingTagsEntries;
private int openingTagsIndex;
private List<Integer> closingTagsOffsets;
private int closingTagsIndex;
String[] rules = syntaxHighlightingRules.split(ENTITY_SEPARATOR);
for (String rule : rules) {
String[] ruleFields = rule.split(FIELD_SEPARATOR);
- insertAndPreserveOrder(new TagEntry(Integer.parseInt(ruleFields[0]), ruleFields[2]), openingTagsEntries);
+ insertAndPreserveOrder(new OpeningHtmlTag(Integer.parseInt(ruleFields[0]), ruleFields[2]), openingTagsEntries);
insertAndPreserveOrder(Integer.parseInt(ruleFields[1]), closingTagsOffsets);
}
}
- List<TagEntry> getOpeningTagsEntries() {
+ List<OpeningHtmlTag> getOpeningTagsEntries() {
return openingTagsEntries;
}
- TagEntry getCurrentOpeningTagEntry() {
+ OpeningHtmlTag getCurrentOpeningTagEntry() {
return openingTagsIndex < openingTagsEntries.size() ? openingTagsEntries.get(openingTagsIndex) : null;
}
}
private void loadSymbolOccurrences(int declarationStartOffset, int symbolLength, String[] symbolOccurrences) {
- for (int i = 0; i < symbolOccurrences.length; i++) {
- int occurrenceStartOffset = Integer.parseInt(symbolOccurrences[i]);
+ for (String symbolOccurrence : symbolOccurrences) {
+ int occurrenceStartOffset = Integer.parseInt(symbolOccurrence);
int occurrenceEndOffset = occurrenceStartOffset + symbolLength;
- insertAndPreserveOrder(new TagEntry(occurrenceStartOffset, SYMBOL_PREFIX + declarationStartOffset + " " + HIGHLIGHTABLE), openingTagsEntries);
+ insertAndPreserveOrder(new OpeningHtmlTag(occurrenceStartOffset, SYMBOL_PREFIX + declarationStartOffset + " " + HIGHLIGHTABLE), openingTagsEntries);
insertAndPreserveOrder(occurrenceEndOffset, closingTagsOffsets);
}
}
- private void insertAndPreserveOrder(TagEntry newEntry, List<TagEntry> orderedEntries) {
+ private void insertAndPreserveOrder(OpeningHtmlTag newEntry, List<OpeningHtmlTag> openingHtmlTags) {
int insertionIndex = 0;
- Iterator<TagEntry> entriesIterator = orderedEntries.iterator();
- while (entriesIterator.hasNext() && entriesIterator.next().getStartOffset() <= newEntry.getStartOffset()) {
+ Iterator<OpeningHtmlTag> tagIterator = openingHtmlTags.iterator();
+ while (tagIterator.hasNext() && tagIterator.next().getStartOffset() <= newEntry.getStartOffset()) {
insertionIndex++;
}
- orderedEntries.add(insertionIndex, newEntry);
+ openingHtmlTags.add(insertionIndex, newEntry);
}
private void insertAndPreserveOrder(int newOffset, List<Integer> orderedOffsets) {
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
import org.sonar.api.ServerComponent;
import org.sonar.core.persistence.MyBatis;
import org.sonar.core.source.jdbc.SnapshotDataDao;
import org.sonar.core.source.jdbc.SnapshotSourceDao;
import java.util.Collection;
+import java.util.List;
/**
* @since 3.6
public Collection<String> getDecoratedSourceAsHtml(long snapshotId) {
- Collection<SnapshotDataDto> snapshotDataEntries = snapshotDataDao.selectSnapshotData(snapshotId);
+ List<String> highlightingDataTypes = Lists.newArrayList(SnapshotDataType.SYNTAX_HIGHLIGHTING.getValue(),
+ SnapshotDataType.SYMBOL_HIGHLIGHTING.getValue());
+
+ Collection<SnapshotDataDto> snapshotDataEntries = snapshotDataDao.selectSnapshotData(snapshotId, highlightingDataTypes);
if (!snapshotDataEntries.isEmpty()) {
String snapshotSource = snapshotSourceDao.selectSnapshotSource(snapshotId);
private void loadSnapshotData(DecorationDataHolder decorationDataHolder, SnapshotDataDto snapshotDataEntry) {
if(!Strings.isNullOrEmpty(snapshotDataEntry.getData())) {
- if (snapshotDataEntry.isSyntaxHighlightingData()) {
+ if (SnapshotDataType.isSyntaxHighlighting(snapshotDataEntry.getDataType())) {
decorationDataHolder.loadSyntaxHighlightingData(snapshotDataEntry.getData());
- } else if (snapshotDataEntry.isSymbolData()) {
+ } else if (SnapshotDataType.isSymbolHighlighting(snapshotDataEntry.getDataType())) {
decorationDataHolder.loadSymbolReferences(snapshotDataEntry.getData());
}
}
--- /dev/null
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2013 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;
+
+class OpeningHtmlTag {
+
+ private final int startOffset;
+ private final String cssClass;
+
+ OpeningHtmlTag(int startOffset, String cssClass) {
+ this.startOffset = startOffset;
+ this.cssClass = cssClass;
+ }
+
+ int getStartOffset() {
+ return startOffset;
+ }
+
+ String getCssClass() {
+ return cssClass;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ OpeningHtmlTag openingHtmlTag = (OpeningHtmlTag) o;
+ if (startOffset != openingHtmlTag.startOffset) {
+ return false;
+ }
+ if (cssClass != null ? !cssClass.equals(openingHtmlTag.cssClass) : openingHtmlTag.cssClass != null) {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = startOffset;
+ result = 31 * result + (cssClass != null ? cssClass.hashCode() : 0);
+ return result;
+ }
+}
--- /dev/null
+/*
+ * SonarQube, open source software quality management tool.
+ * Copyright (C) 2008-2013 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;
+
+public enum SnapshotDataType {
+
+ SYNTAX_HIGHLIGHTING("highlight_syntax"),
+ SYMBOL_HIGHLIGHTING("symbol");
+
+ private SnapshotDataType(String value) {
+ this.value = value;
+ }
+
+ private String value;
+
+ public static boolean isSyntaxHighlighting(String dataType) {
+ return SYNTAX_HIGHLIGHTING.value.equals(dataType);
+ }
+
+ public static boolean isSymbolHighlighting(String dataType) {
+ return SYMBOL_HIGHLIGHTING.value.equals(dataType);
+ }
+
+ public String getValue() {
+ return value;
+ }
+}
+++ /dev/null
-/*
- * SonarQube, open source software quality management tool.
- * Copyright (C) 2008-2013 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;
-
-class TagEntry {
-
- private final int startOffset;
- private final String cssClass;
-
- TagEntry(int startOffset, String cssClass) {
- this.startOffset = startOffset;
- this.cssClass = cssClass;
- }
-
- int getStartOffset() {
- return startOffset;
- }
-
- String getCssClass() {
- return cssClass;
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
- if (o == null || getClass() != o.getClass()) {
- return false;
- }
- TagEntry tagEntry = (TagEntry) o;
- if (startOffset != tagEntry.startOffset) {
- return false;
- }
- if (cssClass != null ? !cssClass.equals(tagEntry.cssClass) : tagEntry.cssClass != null) {
- return false;
- }
- return true;
- }
-
- @Override
- public int hashCode() {
- int result = startOffset;
- result = 31 * result + (cssClass != null ? cssClass.hashCode() : 0);
- return result;
- }
-}
import org.sonar.core.persistence.MyBatis;
import java.util.Collection;
+import java.util.List;
/**
* @since 3.6
this.mybatis = mybatis;
}
- public Collection<SnapshotDataDto> selectSnapshotData(long snapshotId) {
+ public Collection<SnapshotDataDto> selectSnapshotData(long snapshotId, List<String> dataTypes) {
SqlSession session = mybatis.openSession();
try {
SnapshotDataMapper mapper = session.getMapper(SnapshotDataMapper.class);
- return mapper.selectSnapshotData(snapshotId);
+ return mapper.selectSnapshotData(snapshotId, dataTypes);
} finally {
MyBatis.closeQuietly(session);
*/
public class SnapshotDataDto {
- public static final String HIGHLIGHT_SYNTAX = "highlight_syntax";
- public static final String SYMBOL = "symbol";
-
private long id;
private long snapshotId;
private long resourceId;
public void setDataType(String dataType) {
this.dataType = dataType;
}
-
- public boolean isSyntaxHighlightingData() {
- return HIGHLIGHT_SYNTAX.equals(dataType);
- }
-
- public boolean isSymbolData() {
- return SYMBOL.equals(dataType);
- }
}
import org.apache.ibatis.annotations.Param;
import java.util.Collection;
+import java.util.List;
/**
* @since 3.6
void insert(SnapshotDataDto snapshotData);
- Collection<SnapshotDataDto> selectSnapshotData(@Param("sid") long snapshotId);
+ Collection<SnapshotDataDto> selectSnapshotData(@Param("sid") long snapshotId, @Param("dataTypes") List<String> dataTypes);
}
<mapper namespace="org.sonar.core.source.jdbc.SnapshotDataMapper">
- <select id="selectSnapshotData" parameterType="long" resultType="SnapshotData">
+ <select id="selectSnapshotData" parameterType="map" resultType="SnapshotData">
SELECT
- snapshot_id as "snapshotId",
+ snapshot_id AS "snapshotId",
data,
- data_type as "dataType"
+ data_type AS "dataType"
FROM snapshot_data
WHERE snapshot_id = #{sid}
+ AND data_type IN <foreach item="dataType" index="index" collection="dataTypes" open="(" separator="," close=")">#{dataType}</foreach>
</select>
<insert id="insert" parameterType="SnapshotData" useGeneratedKeys="false">
@Test
public void should_extract_lower_bounds_from_serialized_rules() throws Exception {
- List<TagEntry> openingTagsEntries = decorationDataHolder.getOpeningTagsEntries();
+ List<OpeningHtmlTag> openingTagsEntries = decorationDataHolder.getOpeningTagsEntries();
- assertThat(openingTagsEntries.get(0)).isEqualTo(new TagEntry(0, "k"));
- assertThat(openingTagsEntries.get(1)).isEqualTo(new TagEntry(0, "cppd"));
- assertThat(openingTagsEntries.get(2)).isEqualTo(new TagEntry(54, "a"));
- assertThat(openingTagsEntries.get(3)).isEqualTo(new TagEntry(69, "k"));
- assertThat(openingTagsEntries.get(4)).isEqualTo(new TagEntry(80, "sym-80 sym"));
- assertThat(openingTagsEntries.get(5)).isEqualTo(new TagEntry(90, "sym-80 sym"));
- assertThat(openingTagsEntries.get(6)).isEqualTo(new TagEntry(106, "cppd"));
- assertThat(openingTagsEntries.get(7)).isEqualTo(new TagEntry(114, "k"));
- assertThat(openingTagsEntries.get(8)).isEqualTo(new TagEntry(140, "sym-80 sym"));
+ assertThat(openingTagsEntries.get(0)).isEqualTo(new OpeningHtmlTag(0, "k"));
+ assertThat(openingTagsEntries.get(1)).isEqualTo(new OpeningHtmlTag(0, "cppd"));
+ assertThat(openingTagsEntries.get(2)).isEqualTo(new OpeningHtmlTag(54, "a"));
+ assertThat(openingTagsEntries.get(3)).isEqualTo(new OpeningHtmlTag(69, "k"));
+ assertThat(openingTagsEntries.get(4)).isEqualTo(new OpeningHtmlTag(80, "sym-80 sym"));
+ assertThat(openingTagsEntries.get(5)).isEqualTo(new OpeningHtmlTag(90, "sym-80 sym"));
+ assertThat(openingTagsEntries.get(6)).isEqualTo(new OpeningHtmlTag(106, "cppd"));
+ assertThat(openingTagsEntries.get(7)).isEqualTo(new OpeningHtmlTag(114, "k"));
+ assertThat(openingTagsEntries.get(8)).isEqualTo(new OpeningHtmlTag(140, "sym-80 sym"));
}
@Test
package org.sonar.core.source;
+import com.google.common.collect.Lists;
import org.junit.Before;
import org.junit.Test;
import org.sonar.core.persistence.AbstractDaoTestCase;
sourceDecorator.getDecoratedSourceAsHtml(14L);
- verify(snapshotDataDao, times(1)).selectSnapshotData(14L);
+ verify(snapshotDataDao, times(1)).selectSnapshotData(14L, Lists.newArrayList("highlight_syntax", "symbol"));
verify(snapshotSourceDao, times(0)).selectSnapshotSource(14L);
}
}
package org.sonar.core.source.jdbc;
+import com.google.common.collect.Lists;
import org.junit.Before;
import org.junit.Test;
import org.sonar.core.persistence.AbstractDaoTestCase;
@Test
public void should_retrieve_snapshot_data_by_snapshot_id() throws Exception {
- Collection<SnapshotDataDto> data = dao.selectSnapshotData(10L);
+ Collection<SnapshotDataDto> data = dao.selectSnapshotData(10L, Lists.newArrayList("highlight_syntax", "symbol"));
assertThat(data).onProperty("snapshotId").containsOnly(10L, 10L);
assertThat(data).onProperty("dataType").containsOnly("highlight_syntax", "symbol");
dao.insert(dto);
- Collection<SnapshotDataDto> serializedData = dao.selectSnapshotData(11L);
+ Collection<SnapshotDataDto> serializedData = dao.selectSnapshotData(11L, Lists.newArrayList("highlight_syntax"));
assertThat(serializedData).onProperty("snapshotId").containsOnly(11L);
assertThat(serializedData).onProperty("dataType").containsOnly(dataType);