final Query q2 = session
.createQuery("from net.sf.myway.map.db.MapNode node where node.latitude.val=:lat and node.longitude.val = :lon");
q1.setParameter("key", system);
final Map<String, MapNode> cache = new HashMap<String, MapNode>();
for (final MapNode mapNode : nodes) {
MapNode old = null;
// Schritt 1: Suche die externe Referenz
q1.setParameter("val", mapNode.getExtRef().get(system));
List<MapNode> l = q1.list();
if (l.isEmpty()) { // nicht gefunden
// Schritt 2: Suche Node mit den Koordinaten
q2.setParameter("lat", mapNode.getLatitude().getVal());
q2.setParameter("lon", mapNode.getLongitude().getVal());
l = q2.list();
if (!l.isEmpty()) // immer noch nicht gefunden
old = l.iterator().next();
}
else
old = l.iterator().next();
// Schritt 3: Anlegen oder aktualisieren
if (old == null)
session.persist(mapNode);
else {
if (mapNode.getTimestamp().after(old.getTimestamp())) {
old.setTimestamp(mapNode.getTimestamp());
old.setLatitude(mapNode.getLatitude());
old.setLongitude(mapNode.getLongitude());
old.setUser(mapNode.getUser());
old.setTags(mapNode.getTags());
old.addExtRef(system, mapNode.getExtRef(system));
}
cache.put(old.getExtRef(system), old);
}
trans.commit();
}
return cache;
}