package com.opensymphony.module.sitemesh.html;
import com.opensymphony.module.sitemesh.SitemeshBuffer;
import com.opensymphony.module.sitemesh.html.util.StringSitemeshBuffer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public final class State {
private TagRule[] rules = new TagRule[16]; // List is too slow, according to profiler
private int ruleCount = 0;
private List listeners = null;
private List textFilters = null; // lazily instantiated to reduce overhead for most cases where it's not needed.
public void addRule(TagRule rule) {
if (ruleCount == rules.length) {
// grow array if necessary
TagRule[] longerArray = new TagRule[rules.length * 2];
System.arraycopy(rules, 0, longerArray, 0, ruleCount);
rules = longerArray;
}
rules[ruleCount++] = rule;
}
public void addTextFilter(TextFilter textFilter) {
if (textFilters == null) {
textFilters = new ArrayList(); // lazy instantiation
}
textFilters.add(textFilter);
}
public boolean shouldProcessTag(String tagName) {
for (int i = ruleCount - 1; i >= 0; i--) { // reverse iteration to so most recently added rule matches
if (rules[i].shouldProcess(tagName)) {
return true;
}
}
return false;
}
public TagRule getRule(String tagName) {
for (int i = ruleCount - 1; i >= 0; i--) { // reverse iteration to so most recently added rule matches
if (rules[i].shouldProcess(tagName)) {
return rules[i];
}
}
return null;
}
public void addListener(StateChangeListener listener) {
if(listeners == null) listeners = new ArrayList();
listeners.add(listener);
}
public void endOfState() {
if(listeners == null) return;
for (Iterator iter = listeners.iterator(); iter.hasNext();) {
StateChangeListener listener = (StateChangeListener) iter.next();
listener.stateFinished();
}
}
public void handleText(Text text, HTMLProcessorContext context) {
if (textFilters != null && !textFilters.isEmpty()) {
String original = text.getContents();
String asString = original;
for (Iterator iterator = textFilters.iterator(); iterator.hasNext();) {
TextFilter textFilter = (TextFilter) iterator.next();
asString = textFilter.filter(asString);
}
if (!original.equals(asString)) {
context.currentBuffer().delete(text.getPosition(), text.getLength());
context.currentBuffer().insert(text.getPosition(), StringSitemeshBuffer.createBufferFragment(asString));
}
}
}
}