diff options
author | Jean-Baptiste Vilain <jean-baptiste.vilain@sonarsource.com> | 2013-04-18 12:04:52 +0200 |
---|---|---|
committer | Jean-Baptiste Vilain <jean-baptiste.vilain@sonarsource.com> | 2013-04-18 12:04:52 +0200 |
commit | 94349f41592bff75c61bcef150fcc6a160328ca3 (patch) | |
tree | a7152fec4c6286fa208e3a112af6a52b30696928 | |
parent | 46ccee9163fa252b757a09078e79012b1bf07d5e (diff) | |
download | sonarqube-94349f41592bff75c61bcef150fcc6a160328ca3.tar.gz sonarqube-94349f41592bff75c61bcef150fcc6a160328ca3.zip |
SONAR-3893 Further memory usage optimization
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); } } |