Skip to content

Commit

Permalink
Support multiple propagation per entity
Browse files Browse the repository at this point in the history
  • Loading branch information
vshcherb committed Oct 9, 2024
1 parent 01efcbc commit 1a9affb
Showing 1 changed file with 63 additions and 53 deletions.
116 changes: 63 additions & 53 deletions OsmAnd-java/src/main/java/net/osmand/osm/MapRenderingTypes.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public Map<String, MapRulType> getEncodingRuleTypes(){


protected void checkIfInitNeeded() {
if(types == null) {
if (types == null) {
types = new LinkedHashMap<String, MapRulType>();
typeList.clear();
nameRuleType = MapRulType.createText("name");
Expand Down Expand Up @@ -231,13 +231,16 @@ protected void init(){
int tok;
parser.setInput(is, "UTF-8");
MapRulType parentCategory = null;
MapRulType parentType = null;
while ((tok = parser.next()) != XmlPullParser.END_DOCUMENT) {
if (tok == XmlPullParser.START_TAG) {
String name = parser.getName();
if (name.equals("category")) { //$NON-NLS-1$
parentCategory = parseCategoryFromXml(parser);
} else if (name.equals("type")) {
parseAndRegisterTypeFromXML(parser, parentCategory);
parentType = parseAndRegisterTypeFromXML(parser, parentCategory);
} else if (name.equals("propagate")) {
parsePropagate(parser, parentType);
} else if (name.equals("routing_type")) {
parseRouteTagFromXML(parser);
} else if (name.equals("entity_convert")) {
Expand Down Expand Up @@ -265,8 +268,38 @@ protected void init(){
protected abstract void parseEntityConvertXML(XmlPullParser parser);

protected abstract void parseRouteTagFromXML(XmlPullParser parser);

protected abstract void parsePropagate(XmlPullParser parser, MapRulType parentType);

protected abstract void parseAndRegisterTypeFromXML(XmlPullParser parser, MapRulType parentCategory) ;
protected abstract MapRulType parseAndRegisterTypeFromXML(XmlPullParser parser, MapRulType parentCategory) ;

protected PropagateToNode parsePropagateType(XmlPullParser parser) {
String propagateToNodes = parser.getAttributeValue("", "propagateToNodes");
if (propagateToNodes != null) {
PropagateToNode rtype = new PropagateToNode();
if ("true".equals(propagateToNodes) || "yes".equals(propagateToNodes) || "all".equals(propagateToNodes)) {
rtype.propagateToNodes = PropagateToNodesType.ALL;
} else if ("start".equals(propagateToNodes)) {
rtype.propagateToNodes = PropagateToNodesType.START;
} else if ("end".equals(propagateToNodes)) {
rtype.propagateToNodes = PropagateToNodesType.END;
} else if ("center".equals(propagateToNodes)) {
rtype.propagateToNodes = PropagateToNodesType.CENTER;
} else if ("border".equals(propagateToNodes) || "borderin".equals(propagateToNodes)) {
rtype.propagateToNodes = PropagateToNodesType.BORDERIN;
} else if ("borderout".equals(propagateToNodes)) {
rtype.propagateToNodes = PropagateToNodesType.BORDEROUT;
}
String propagateToNodesPrefix = parser.getAttributeValue("", "propagateToNodesPrefix");
if (propagateToNodesPrefix != null) {
rtype.propagateToNodesPrefix = propagateToNodesPrefix;
}
rtype.propagateIf = parseMultiTagValue(parser, "propagateIf");
return rtype;
}
return null;

}

protected MapRulType parseBaseRuleType(XmlPullParser parser, MapRulType parentCategory, String tag) {
String value = lc(parser.getAttributeValue("", "value"));
Expand All @@ -284,27 +317,10 @@ protected MapRulType parseBaseRuleType(XmlPullParser parser, MapRulType parentCa
"yes".equals(parser.getAttributeValue("", "map")) || parser.getAttributeValue("", "map") == null;
rtype.poi = "true".equals(parser.getAttributeValue("", "poi")) ||
"yes".equals(parser.getAttributeValue("", "poi")) || parser.getAttributeValue("", "poi") == null;
String propagateToNodes = parser.getAttributeValue("", "propagateToNodes");
if (propagateToNodes != null) {
if ("true".equals(propagateToNodes) || "yes".equals(propagateToNodes) || "all".equals(propagateToNodes)) {
rtype.propagateToNodes = MapRulType.PropagateToNodesType.ALL;
} else if ("start".equals(propagateToNodes)) {
rtype.propagateToNodes = MapRulType.PropagateToNodesType.START;
} else if ("end".equals(propagateToNodes)) {
rtype.propagateToNodes = MapRulType.PropagateToNodesType.END;
} else if ("center".equals(propagateToNodes)) {
rtype.propagateToNodes = MapRulType.PropagateToNodesType.CENTER;
} else if ("border".equals(propagateToNodes) || "borderin".equals(propagateToNodes)) {
rtype.propagateToNodes = MapRulType.PropagateToNodesType.BORDERIN;
} else if ("borderout".equals(propagateToNodes)) {
rtype.propagateToNodes = MapRulType.PropagateToNodesType.BORDEROUT;
}
}
String propagateToNodesPrefix = parser.getAttributeValue("", "propagateToNodesPrefix");
if (propagateToNodesPrefix != null) {
rtype.propagateToNodesPrefix = propagateToNodesPrefix;
PropagateToNode ptype = parsePropagateType(parser);
if (ptype != null) {
rtype.propagateToNodes.add(ptype);
}
rtype.propagateIf = parseMultiTagValue(parser, "propagateIf");

String order = parser.getAttributeValue("", "order");
if(!Algorithms.isEmpty(order)) {
Expand Down Expand Up @@ -389,6 +405,7 @@ protected MapRulType parseBaseRuleType(XmlPullParser parser, MapRulType parentCa

}


private void putNameTags(String namesList, Map<String, String> names, String namePrefix) {
if (namesList != null) {
String[] nameSplit = namesList.split(",");
Expand Down Expand Up @@ -547,6 +564,25 @@ public boolean equals(Object obj) {

}

public enum PropagateToNodesType {
ALL,
START,
END,
CENTER,
BORDERIN,
BORDEROUT;

public boolean isBorder() {
return this == PropagateToNodesType.BORDERIN || this == PropagateToNodesType.BORDEROUT;
}
}

public static class PropagateToNode {
public PropagateToNodesType propagateToNodes;
public String propagateToNodesPrefix;
public Map<String, String> propagateIf;
}

public static class MapRulType {
// relation part
protected Map<String, String> relationNames;
Expand All @@ -555,9 +591,7 @@ public static class MapRulType {
protected String relationGroupPrefix;
protected Map<String, String> relationGroupNameTags;
protected Map<String, String> relationGroupAdditionalTags;
protected PropagateToNodesType propagateToNodes = PropagateToNodesType.NONE;
protected String propagateToNodesPrefix;
protected Map<String, String> propagateIf;
protected List<PropagateToNode> propagateToNodes = new ArrayList<>();

protected TagValuePattern tagValuePattern;
protected boolean additional;
Expand Down Expand Up @@ -743,35 +777,11 @@ public boolean equals(Object obj) {
return true;
}

public boolean isPropagateToNodes() {
return propagateToNodes != PropagateToNodesType.NONE;
}

public PropagateToNodesType getPropagateToNodesType() {
public List<PropagateToNode> getPropagateToNodes() {
return propagateToNodes;
}

public String getPropagateToNodesPrefix() {
return propagateToNodesPrefix;
}

public Map<String, String> getPropagateIf() {
return propagateIf;
}

public enum PropagateToNodesType {
NONE,
ALL,
START,
END,
CENTER,
BORDERIN,
BORDEROUT;

public boolean isBorder() {
return this == PropagateToNodesType.BORDERIN || this == PropagateToNodesType.BORDEROUT;
}
}



}

Expand Down

0 comments on commit 1a9affb

Please sign in to comment.