Skip to content

Commit 6225802

Browse files
committed
improved index and smarter iterator impl
1 parent c20a1c5 commit 6225802

File tree

1 file changed

+35
-7
lines changed

1 file changed

+35
-7
lines changed

src/main/java/com/gargoylesoftware/css/dom/CSSStyleSheetImpl.java

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
import java.io.ObjectOutputStream;
2020
import java.io.Serializable;
2121
import java.io.StringReader;
22-
import java.util.ArrayDeque;
2322
import java.util.ArrayList;
2423
import java.util.HashMap;
2524
import java.util.Iterator;
25+
import java.util.LinkedList;
2626
import java.util.List;
2727
import java.util.Map;
2828

@@ -377,6 +377,7 @@ public static class CSSStyleSheetRuleIndex {
377377

378378
private MediaList mediaList_ = DEFAULT_MEDIA_LIST;
379379
private final Map<String, List<SelectorEntry>> elementSelectors_ = new HashMap<>();
380+
private final Map<String, List<SelectorEntry>> classSelectors_ = new HashMap<>();
380381
private final List<SelectorEntry> otherSelectors_ = new ArrayList<>();
381382

382383
public void addElementSelector(final String name, final Selector s, final CSSStyleRuleImpl styleRule) {
@@ -389,12 +390,29 @@ public void addElementSelector(final String name, final Selector s, final CSSSty
389390
entries.add(selectorEntry);
390391
}
391392

393+
public void addClassSelector(final String name, final Selector s, final CSSStyleRuleImpl styleRule) {
394+
List<SelectorEntry> entries = classSelectors_.get(name);
395+
if (entries == null) {
396+
entries = new ArrayList<SelectorEntry>();
397+
classSelectors_.put(name, entries);
398+
}
399+
final SelectorEntry selectorEntry = new SelectorEntry(s, styleRule);
400+
entries.add(selectorEntry);
401+
}
402+
392403
public void addOtherSelector(final Selector s, final CSSStyleRuleImpl styleRule) {
393404
final SelectorEntry selectorEntry = new SelectorEntry(s, styleRule);
394405
otherSelectors_.add(selectorEntry);
395406
}
396407

397408
public CSSStyleSheetRuleIndex addMedia(final MediaList mediaList) {
409+
final String media = mediaList.getMediaText();
410+
for (CSSStyleSheetRuleIndex cssStyleSheetRuleIndex : children_) {
411+
if (media.equals(cssStyleSheetRuleIndex.getMediaList().getMediaText())) {
412+
return cssStyleSheetRuleIndex;
413+
}
414+
}
415+
398416
final CSSStyleSheetRuleIndex index = new CSSStyleSheetRuleIndex();
399417
index.mediaList_ = mediaList;
400418

@@ -410,21 +428,31 @@ public List<CSSStyleSheetRuleIndex> getChildren() {
410428
return children_;
411429
}
412430

413-
public Iterator<SelectorEntry> getSelectorEntriesIteratorFor(final String elementName) {
414-
return new SelectorEntriesIterator(this, elementName);
431+
public Iterator<SelectorEntry> getSelectorEntriesIteratorFor(final String elementName, final String[] classes) {
432+
return new SelectorEntriesIterator(this, elementName, classes);
415433
}
416434
}
417435

418436
static final class SelectorEntriesIterator implements Iterator<SelectorEntry> {
419-
private ArrayDeque<Iterator<SelectorEntry>> iterators_;
437+
private LinkedList<Iterator<SelectorEntry>> iterators_;
420438

421-
SelectorEntriesIterator(final CSSStyleSheetRuleIndex index, final String elementName) {
422-
iterators_ = new ArrayDeque<Iterator<SelectorEntry>>();
439+
SelectorEntriesIterator(final CSSStyleSheetRuleIndex index,
440+
final String elementName, final String[] classes) {
441+
iterators_ = new LinkedList<Iterator<SelectorEntry>>();
423442
List<SelectorEntry> sel = index.elementSelectors_.get("*");
424443
if (sel != null && !sel.isEmpty()) {
425444
iterators_.add(sel.iterator());
426445
}
427446

447+
if (classes != null) {
448+
for (String clazz : classes) {
449+
sel = index.classSelectors_.get(clazz);
450+
if (sel != null && !sel.isEmpty()) {
451+
iterators_.add(sel.iterator());
452+
}
453+
454+
}
455+
}
428456
sel = index.elementSelectors_.get(elementName);
429457
if (sel != null && !sel.isEmpty()) {
430458
iterators_.add(sel.iterator());
@@ -446,7 +474,7 @@ public SelectorEntry next() {
446474
return iter.next();
447475
}
448476

449-
iterators_.pop();
477+
iterators_.removeFirst();
450478
return next();
451479
}
452480

0 commit comments

Comments
 (0)