move RuleBuilder xml part to XmlThemeBuilder
This commit is contained in:
parent
191e94c670
commit
f5645cf292
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user