move RuleBuilder xml part to XmlThemeBuilder

This commit is contained in:
Hannes Janetzek 2014-03-31 15:01:13 +02:00
parent 191e94c670
commit f5645cf292
2 changed files with 65 additions and 72 deletions

View File

@ -40,6 +40,8 @@ import org.oscim.renderer.atlas.TextureRegion;
import org.oscim.renderer.elements.TextureItem; import org.oscim.renderer.elements.TextureItem;
import org.oscim.theme.IRenderTheme.ThemeException; import org.oscim.theme.IRenderTheme.ThemeException;
import org.oscim.theme.rule.Rule; import org.oscim.theme.rule.Rule;
import org.oscim.theme.rule.Rule.Closed;
import org.oscim.theme.rule.Rule.Selector;
import org.oscim.theme.rule.RuleBuilder; import org.oscim.theme.rule.RuleBuilder;
import org.oscim.theme.styles.AreaStyle; import org.oscim.theme.styles.AreaStyle;
import org.oscim.theme.styles.AreaStyle.AreaBuilder; import org.oscim.theme.styles.AreaStyle.AreaBuilder;
@ -199,7 +201,7 @@ public class XmlThemeBuilder extends DefaultHandler {
} else if (ELEMENT_NAME_MATCH.equals(localName)) { } else if (ELEMENT_NAME_MATCH.equals(localName)) {
checkState(localName, Element.RULE); checkState(localName, Element.RULE);
RuleBuilder rule = RuleBuilder.create(localName, attributes, mRuleStack); RuleBuilder rule = createRule(localName, attributes, mRuleStack);
if (!mRuleStack.empty()) { if (!mRuleStack.empty()) {
mCurrentRule.addSubRule(rule); mCurrentRule.addSubRule(rule);
} }
@ -292,6 +294,67 @@ public class XmlThemeBuilder extends DefaultHandler {
} }
} }
private RuleBuilder createRule(String localName, Attributes attributes,
Stack<RuleBuilder> ruleStack) {
int element = Rule.Element.ANY;
int closed = Closed.ANY;
String keys = null;
String values = null;
byte zoomMin = 0;
byte zoomMax = Byte.MAX_VALUE;
int selector = 0;
for (int i = 0; i < attributes.getLength(); ++i) {
String name = attributes.getLocalName(i);
String value = attributes.getValue(i);
if ("e".equals(name)) {
String val = value.toUpperCase();
if ("WAY".equals(val))
element = Rule.Element.WAY;
else if ("NODE".equals(val))
element = Rule.Element.NODE;
} else if ("k".equals(name)) {
keys = value;
} else if ("v".equals(name)) {
values = value;
} else if ("closed".equals(name)) {
String val = value.toUpperCase();
if ("YES".equals(val))
closed = Closed.YES;
else if ("NO".equals(val))
closed = Closed.NO;
} else if ("zoom-min".equals(name)) {
zoomMin = Byte.parseByte(value);
} else if ("zoom-max".equals(name)) {
zoomMax = Byte.parseByte(value);
} else if ("select".equals(name)) {
if ("first".equals(value))
selector |= Selector.FIRST;
if ("when-matched".equals(value))
selector |= Selector.WHEN_MATCHED;
} else {
XmlThemeBuilder.logUnknownAttribute(localName, name, value, i);
}
}
if (closed == Closed.YES)
element = Rule.Element.POLY;
else if (closed == Closed.NO)
element = Rule.Element.LINE;
XmlThemeBuilder.validateNonNegative("zoom-min", zoomMin);
XmlThemeBuilder.validateNonNegative("zoom-max", zoomMax);
if (zoomMin > zoomMax)
throw new ThemeException("zoom-min must be less or equal zoom-max: " + zoomMin);
RuleBuilder b = RuleBuilder.create(ruleStack, keys, values);
b.setZoom(zoomMin, zoomMax);
b.element(element);
b.select(selector);
return b;
}
private TextureRegion getAtlasRegion(String src) { private TextureRegion getAtlasRegion(String src) {
if (mTextureAtlas == null) if (mTextureAtlas == null)
return null; return null;

View File

@ -4,8 +4,6 @@ import java.util.ArrayList;
import java.util.Stack; import java.util.Stack;
import org.oscim.theme.IRenderTheme.ThemeException; import org.oscim.theme.IRenderTheme.ThemeException;
import org.oscim.theme.XmlThemeBuilder;
import org.oscim.theme.rule.Rule.Closed;
import org.oscim.theme.rule.Rule.Element; import org.oscim.theme.rule.Rule.Element;
import org.oscim.theme.rule.Rule.NegativeRule; import org.oscim.theme.rule.Rule.NegativeRule;
import org.oscim.theme.rule.Rule.PositiveRuleK; import org.oscim.theme.rule.Rule.PositiveRuleK;
@ -16,7 +14,6 @@ import org.oscim.theme.styles.RenderStyle;
import org.oscim.theme.styles.RenderStyle.StyleBuilder; import org.oscim.theme.styles.RenderStyle.StyleBuilder;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.xml.sax.Attributes;
public class RuleBuilder { public class RuleBuilder {
final static Logger log = LoggerFactory.getLogger(RuleBuilder.class); final static Logger log = LoggerFactory.getLogger(RuleBuilder.class);
@ -43,10 +40,8 @@ public class RuleBuilder {
private static final String STRING_NEGATION = "~"; private static final String STRING_NEGATION = "~";
private static final String STRING_EXCLUSIVE = "-"; private static final String STRING_EXCLUSIVE = "-";
private static final String SEPARATOR = "\\|"; private static final String SEPARATOR = "\\|";
//private static final String STRING_WILDCARD = "*";
private static final int SELECT_FIRST = 1 << 0; //private static final String STRING_WILDCARD = "*";
private static final int SELECT_WHEN_MATCHED = 1 << 1;
public RuleBuilder(RuleType type, int element, int zoom, int selector, public RuleBuilder(RuleType type, int element, int zoom, int selector,
String[] keys, String[] values) { String[] keys, String[] values) {
@ -108,71 +103,6 @@ public class RuleBuilder {
return new RuleBuilder(type, keyList, valueList); return new RuleBuilder(type, keyList, valueList);
} }
private static void validate(byte zoomMin, byte zoomMax) {
XmlThemeBuilder.validateNonNegative("zoom-min", zoomMin);
XmlThemeBuilder.validateNonNegative("zoom-max", zoomMax);
if (zoomMin > zoomMax)
throw new ThemeException("zoom-min must be less or equal zoom-max: " + zoomMin);
}
public static RuleBuilder create(String elementName, Attributes attributes,
Stack<RuleBuilder> ruleStack) {
int element = Element.ANY;
int closed = Closed.ANY;
String keys = null;
String values = null;
byte zoomMin = 0;
byte zoomMax = Byte.MAX_VALUE;
int selector = 0;
for (int i = 0; i < attributes.getLength(); ++i) {
String name = attributes.getLocalName(i);
String value = attributes.getValue(i);
if ("e".equals(name)) {
String val = value.toUpperCase();
if ("WAY".equals(val))
element = Element.WAY;
else if ("NODE".equals(val))
element = Element.NODE;
} else if ("k".equals(name)) {
keys = value;
} else if ("v".equals(name)) {
values = value;
} else if ("closed".equals(name)) {
String val = value.toUpperCase();
if ("YES".equals(val))
closed = Closed.YES;
else if ("NO".equals(val))
closed = Closed.NO;
} else if ("zoom-min".equals(name)) {
zoomMin = Byte.parseByte(value);
} else if ("zoom-max".equals(name)) {
zoomMax = Byte.parseByte(value);
} else if ("select".equals(name)) {
if ("first".equals(value))
selector |= SELECT_FIRST;
if ("when-matched".equals(value))
selector |= SELECT_WHEN_MATCHED;
} else {
XmlThemeBuilder.logUnknownAttribute(elementName, name, value, i);
}
}
if (closed == Closed.YES)
element = Element.POLY;
else if (closed == Closed.NO)
element = Element.LINE;
validate(zoomMin, zoomMax);
RuleBuilder b = create(ruleStack, keys, values);
b.setZoom(zoomMin, zoomMax);
b.element = element;
b.selector = selector;
return b;
}
public RuleBuilder setZoom(byte zoomMin, byte zoomMax) { public RuleBuilder setZoom(byte zoomMin, byte zoomMax) {
// zoom-level bitmask // zoom-level bitmask
zoom = 0; zoom = 0;