aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Baptiste Vilain <jean-baptiste.vilain@sonarsource.com>2013-04-18 12:04:52 +0200
committerJean-Baptiste Vilain <jean-baptiste.vilain@sonarsource.com>2013-04-18 12:04:52 +0200
commit94349f41592bff75c61bcef150fcc6a160328ca3 (patch)
treea7152fec4c6286fa208e3a112af6a52b30696928
parent46ccee9163fa252b757a09078e79012b1bf07d5e (diff)
downloadsonarqube-94349f41592bff75c61bcef150fcc6a160328ca3.tar.gz
sonarqube-94349f41592bff75c61bcef150fcc6a160328ca3.zip
SONAR-3893 Further memory usage optimization
-rw-r--r--sonar-core/src/main/java/org/sonar/core/source/DecorationDataHolder.java46
-rw-r--r--sonar-core/src/main/java/org/sonar/core/source/HtmlTextDecorator.java10
-rw-r--r--sonar-core/src/test/java/org/sonar/core/source/DecorationDataHolderTest.java42
3 files changed, 59 insertions, 39 deletions
diff --git a/sonar-core/src/main/java/org/sonar/core/source/DecorationDataHolder.java b/sonar-core/src/main/java/org/sonar/core/source/DecorationDataHolder.java
index 41e70dd6bb2..f9a888c87a2 100644
--- a/sonar-core/src/main/java/org/sonar/core/source/DecorationDataHolder.java
+++ b/sonar-core/src/main/java/org/sonar/core/source/DecorationDataHolder.java
@@ -31,12 +31,14 @@ public class DecorationDataHolder {
private static final String SYMBOL_PREFIX = "symbol-";
private static final String HIGHLIGHTABLE = "highlightable";
- private LinkedList<TagEntry> tagEntriesStack;
- private LinkedList<Integer> closingTagsStack;
+ private List<TagEntry> openingTagsEntries;
+ private int openingTagsIndex;
+ private List<Integer> closingTagsOffsets;
+ private int closingTagsIndex;
public DecorationDataHolder() {
- tagEntriesStack = Lists.newLinkedList();
- closingTagsStack = Lists.newLinkedList();
+ openingTagsEntries = Lists.newArrayList();
+ closingTagsOffsets = Lists.newArrayList();
}
public void loadSymbolReferences(String symbolsReferences) {
@@ -55,29 +57,45 @@ public class DecorationDataHolder {
String[] rules = syntaxHighlightingRules.split(ENTITY_SEPARATOR);
for (int i = 0; i < rules.length; i++) {
String[] ruleFields = rules[i].split(FIELD_SEPARATOR);
- insertAndPreserveOrder(new TagEntry(Integer.parseInt(ruleFields[0]), ruleFields[2]), tagEntriesStack);
- insertAndPreserveOrder(Integer.parseInt(ruleFields[1]), closingTagsStack);
+ insertAndPreserveOrder(new TagEntry(Integer.parseInt(ruleFields[0]), ruleFields[2]), openingTagsEntries);
+ insertAndPreserveOrder(Integer.parseInt(ruleFields[1]), closingTagsOffsets);
}
}
- public Deque<TagEntry> getTagEntriesStack() {
- return tagEntriesStack;
+ public List<TagEntry> getOpeningTagsEntries() {
+ return openingTagsEntries;
}
- public Deque<Integer> getClosingTagsStack() {
- return closingTagsStack;
+ public TagEntry getCurrentOpeningTagEntry() {
+ return openingTagsIndex < openingTagsEntries.size() ? openingTagsEntries.get(openingTagsIndex) : null;
+ }
+
+ public void nextOpeningTagEntry() {
+ openingTagsIndex++;
+ }
+
+ public List<Integer> getClosingTagsOffsets() {
+ return closingTagsOffsets;
+ }
+
+ public int getCurrentClosingTagOffset() {
+ return closingTagsIndex < closingTagsOffsets.size() ? closingTagsOffsets.get(closingTagsIndex) : -1;
+ }
+
+ public void nextClosingTagOffset() {
+ closingTagsIndex++;
}
private void loadSymbolOccurrences(int declarationStartOffset, int symbolLength, String[] symbolOccurrences) {
for (int i = 0; i < symbolOccurrences.length; i++) {
int occurrenceStartOffset = Integer.parseInt(symbolOccurrences[i]);
int occurrenceEndOffset = occurrenceStartOffset + symbolLength;
- insertAndPreserveOrder(new TagEntry(occurrenceStartOffset, SYMBOL_PREFIX + declarationStartOffset + " " + HIGHLIGHTABLE), tagEntriesStack);
- insertAndPreserveOrder(occurrenceEndOffset, closingTagsStack);
+ insertAndPreserveOrder(new TagEntry(occurrenceStartOffset, SYMBOL_PREFIX + declarationStartOffset + " " + HIGHLIGHTABLE), openingTagsEntries);
+ insertAndPreserveOrder(occurrenceEndOffset, closingTagsOffsets);
}
}
- private void insertAndPreserveOrder(TagEntry newEntry, LinkedList<TagEntry> orderedEntries) {
+ private void insertAndPreserveOrder(TagEntry newEntry, List<TagEntry> orderedEntries) {
int insertionIndex = 0;
Iterator<TagEntry> entriesIterator = orderedEntries.iterator();
while(entriesIterator.hasNext() && entriesIterator.next().getStartOffset() <= newEntry.getStartOffset()) {
@@ -86,7 +104,7 @@ public class DecorationDataHolder {
orderedEntries.add(insertionIndex, newEntry);
}
- private void insertAndPreserveOrder(int newOffset, LinkedList<Integer> orderedOffsets) {
+ private void insertAndPreserveOrder(int newOffset, List<Integer> orderedOffsets) {
int insertionIndex = 0;
Iterator<Integer> entriesIterator = orderedOffsets.iterator();
while(entriesIterator.hasNext() && entriesIterator.next() <= newOffset) {
diff --git a/sonar-core/src/main/java/org/sonar/core/source/HtmlTextDecorator.java b/sonar-core/src/main/java/org/sonar/core/source/HtmlTextDecorator.java
index 2dffdb69373..3a4c481fccf 100644
--- a/sonar-core/src/main/java/org/sonar/core/source/HtmlTextDecorator.java
+++ b/sonar-core/src/main/java/org/sonar/core/source/HtmlTextDecorator.java
@@ -120,17 +120,19 @@ public class HtmlTextDecorator {
private int getNumberOfTagsToClose(int currentIndex, DecorationDataHolder dataHolder) {
int numberOfTagsToClose = 0;
- while(!dataHolder.getClosingTagsStack().isEmpty() && dataHolder.getClosingTagsStack().peek() == currentIndex) {
- dataHolder.getClosingTagsStack().pop();
+
+ while(currentIndex == dataHolder.getCurrentClosingTagOffset()) {
numberOfTagsToClose++;
+ dataHolder.nextClosingTagOffset();
}
return numberOfTagsToClose;
}
private Collection<String> getTagsToOpen(int currentIndex, DecorationDataHolder dataHolder) {
Collection<String> tagsToOpen = Lists.newArrayList();
- while(!dataHolder.getTagEntriesStack().isEmpty() && dataHolder.getTagEntriesStack().peek().getStartOffset() == currentIndex) {
- tagsToOpen.add(dataHolder.getTagEntriesStack().pop().getCssClass());
+ while(dataHolder.getCurrentOpeningTagEntry() != null && currentIndex == dataHolder.getCurrentOpeningTagEntry().getStartOffset()) {
+ tagsToOpen.add(dataHolder.getCurrentOpeningTagEntry().getCssClass());
+ dataHolder.nextOpeningTagEntry();
}
return tagsToOpen;
}
diff --git a/sonar-core/src/test/java/org/sonar/core/source/DecorationDataHolderTest.java b/sonar-core/src/test/java/org/sonar/core/source/DecorationDataHolderTest.java
index 7e72f703064..cfb392d04fe 100644
--- a/sonar-core/src/test/java/org/sonar/core/source/DecorationDataHolderTest.java
+++ b/sonar-core/src/test/java/org/sonar/core/source/DecorationDataHolderTest.java
@@ -23,7 +23,7 @@ package org.sonar.core.source;
import org.junit.Before;
import org.junit.Test;
-import java.util.Deque;
+import java.util.List;
import static org.fest.assertions.Assertions.assertThat;
@@ -44,32 +44,32 @@ public class DecorationDataHolderTest {
@Test
public void should_extract_lower_bounds_from_serialized_rules() throws Exception {
- Deque<TagEntry> tagEntries = decorationDataHolder.getTagEntriesStack();
+ List<TagEntry> openingTagsEntries = decorationDataHolder.getOpeningTagsEntries();
- assertThat(tagEntries.pop()).isEqualTo(new TagEntry(0, "k"));
- assertThat(tagEntries.pop()).isEqualTo(new TagEntry(0, "cppd"));
- assertThat(tagEntries.pop()).isEqualTo(new TagEntry(54, "a"));
- assertThat(tagEntries.pop()).isEqualTo(new TagEntry(69, "k"));
- assertThat(tagEntries.pop()).isEqualTo(new TagEntry(80, "symbol-80 highlightable"));
- assertThat(tagEntries.pop()).isEqualTo(new TagEntry(90, "symbol-80 highlightable"));
- assertThat(tagEntries.pop()).isEqualTo(new TagEntry(106, "cppd"));
- assertThat(tagEntries.pop()).isEqualTo(new TagEntry(114, "k"));
- assertThat(tagEntries.pop()).isEqualTo(new TagEntry(140, "symbol-80 highlightable"));
+ 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, "symbol-80 highlightable"));
+ assertThat(openingTagsEntries.get(5)).isEqualTo(new TagEntry(90, "symbol-80 highlightable"));
+ 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, "symbol-80 highlightable"));
}
@Test
public void should_extract_upper_bounds_from_serialized_rules() throws Exception {
- Deque<Integer> upperBoundsDefinition = decorationDataHolder.getClosingTagsStack();
+ List<Integer> offsets = decorationDataHolder.getClosingTagsOffsets();
- assertThat(upperBoundsDefinition.pop()).isEqualTo(8);
- assertThat(upperBoundsDefinition.pop()).isEqualTo(52);
- assertThat(upperBoundsDefinition.pop()).isEqualTo(67);
- assertThat(upperBoundsDefinition.pop()).isEqualTo(75);
- assertThat(upperBoundsDefinition.pop()).isEqualTo(85);
- assertThat(upperBoundsDefinition.pop()).isEqualTo(95);
- assertThat(upperBoundsDefinition.pop()).isEqualTo(130);
- assertThat(upperBoundsDefinition.pop()).isEqualTo(130);
- assertThat(upperBoundsDefinition.pop()).isEqualTo(145);
+ assertThat(offsets.get(0)).isEqualTo(8);
+ assertThat(offsets.get(1)).isEqualTo(52);
+ assertThat(offsets.get(2)).isEqualTo(67);
+ assertThat(offsets.get(3)).isEqualTo(75);
+ assertThat(offsets.get(4)).isEqualTo(85);
+ assertThat(offsets.get(5)).isEqualTo(95);
+ assertThat(offsets.get(6)).isEqualTo(130);
+ assertThat(offsets.get(7)).isEqualTo(130);
+ assertThat(offsets.get(8)).isEqualTo(145);
}
}