package com.bitmonlab.osiris.imports.map.managers.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.xml.bind.Unmarshaller;
import com.bitmonlab.osiris.imports.map.model.osm.Member;
import com.bitmonlab.osiris.imports.map.model.osm.Node;
import com.bitmonlab.osiris.imports.map.model.osm.Relation;
import com.bitmonlab.osiris.imports.map.model.osm.Tag;
import com.bitmonlab.osiris.imports.map.model.osm.Tags;
import com.bitmonlab.osiris.imports.map.model.osm.Way;
public class UnMarshallerListenerGraph extends Unmarshaller.Listener {
//This method only allows two parameters!!!
public void afterUnmarshal(Object target, Object parent) {
Tags obj=null;
if(target instanceof Node){
obj = (Node) target;
checkGraphIndoor(obj);
//System.out.println(((Node)obj).getId());
}else if (target instanceof Way){
obj = (Way) target;
checkGraphIndoor(obj);
//System.out.println(((Way)obj).getId());
}else if (target instanceof Relation){
//System.out.println(((Relation)target).getId());
outerBeforeInner((Relation) target); //Workaround for MongoDB 2.6.x
}
}
private void outerBeforeInner(Relation relation){
List<Member> inners = new ArrayList<Member>();
List<Member> outers = new ArrayList<Member>();
if(relation.getMembers()!=null){
for(Member member : relation.getMembers()){
if(member.getRole().equals("inner")){
inners.add(member);
}else if(member.getRole().equals("outer")){
outers.add(member);
}
}
if(!outers.isEmpty() && !inners.isEmpty()){
relation.getMembers().removeAll(outers);
relation.getMembers().removeAll(inners);
relation.getMembers().addAll(relation.getMembers().size(), outers);
relation.getMembers().addAll(relation.getMembers().size(), inners);
}
}
}
private void checkGraphIndoor(Tags obj){
if( obj!=null ){
if(obj.getTags()!=null){
Map<String, String> tagsMap = new HashMap<String, String>();
for (Tag t: obj.getTags()) {
tagsMap.put(t.getK(), t.getV());
}
String tagLevel = tagsMap.get("level");
String tagHighway = tagsMap.get("highway");
if (tagLevel != null && tagHighway != null){
String tagName = tagsMap.get("name");
if (tagName != null) {
//tagsMap.put("name", tagName + "_level" + tagLevel);
tagsMap.put("name", tagName);
}
obj.setTags(rebuildNodeTagsOSMAndAddTagGraphIndoor(tagsMap));
}else if(tagHighway != null && (tagHighway.equals("elevator") || tagHighway.equals("steps")) ){
obj.setTags(rebuildNodeTagsOSMAndAddTagGraphIndoor(tagsMap));
}
}
}
}
private List<Tag> rebuildNodeTagsOSMAndAddTagGraphIndoor(Map<String, String> tagsMap){
Iterator<Entry<String,String>> iter = tagsMap.entrySet().iterator();
List<Tag> newListTag = new ArrayList<Tag>();
while (iter.hasNext()) {
Entry<String, String> entry = iter.next();
Tag tag = new Tag();
tag.setK(entry.getKey());
tag.setV(entry.getValue());
newListTag.add(tag);
}
Tag tagGraphIndoor = new Tag();
tagGraphIndoor.setK("@graphIndoor");
tagGraphIndoor.setV("true");
newListTag.add(tagGraphIndoor);
return newListTag;
}
}