Update of /cvsroot/magicmap/magicmapserver/src/net/sf/magicmap/server/cache
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12089/src/net/sf/magicmap/server/cache
Added Files:
PositionCache.java
Log Message:
Implementation des Positioning-Caches
--- NEW FILE: PositionCache.java ---
package net.sf.magicmap.server.cache;
import java.util.Collection;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.SortedMap;
import java.util.TreeMap;
import net.sf.magicmap.db.Map;
import net.sf.magicmap.server.dto.PositionDTO;
public class PositionCache extends Hashtable<Map,PositionCacheEntry>{
private static SortedMap timeMap;
// Sigleton Hashtable
private static PositionCache single_positionCache = null;
public static PositionCache getPositionCache(){
if (single_positionCache == null)
single_positionCache = new PositionCache();
return single_positionCache;
}
private PositionCache (){
//TODO: hohle daten aus der Datenbank
}
private void addMapHashtable(Map map) {
this.put(map,new PositionCacheEntry());
}
private boolean existsMapHashtable(Map map){
return this.containsKey(map);
}
private PositionCacheEntry getMapHashtable(Map map){
return this.get(map);
}
public void createOrUpdatePosition(Map map, PositionDTO position){
if(!existsMapHashtable(map))
addMapHashtable(map);
if(getMapHashtable(map).existsPosition(position.getName())){
getMapHashtable(map).removePosition(position.getName());
}
getMapHashtable(map).addPosition(position);
}
public PositionDTO[] getPositionsForMapSince(Map map,Long time){
if(!existsMapHashtable(map))
return new PositionDTO[0];
return getMapHashtable(map).getPositionsSince(time);
}
public PositionDTO getPositionForClientOnMap(Map map, String name){
if(!existsMapHashtable(map))
return null;
return getMapHashtable(map).getPosition(name);
}
}
class PositionCacheEntry {
private Hashtable<String,PositionDTO> positionHash;
private TreeMap<Long ,String> timeMap;
protected PositionCacheEntry (){
positionHash = new Hashtable<String,PositionDTO>(40);
timeMap = new TreeMap<Long ,String>();
}
protected void addPosition(PositionDTO position){
positionHash.put(position.getName(),position);
timeMap.put(position.getLastModified(),position.getName());
}
protected boolean existsPosition(String name){
return positionHash.containsKey(name);
}
protected PositionDTO getPosition(String name){
return positionHash.get(name);
}
protected void removePosition(String name){
timeMap.remove(positionHash.get(name).getLastModified());
positionHash.remove(name);
}
protected PositionDTO[] getPositionsSince(Long time){
Collection<String> newPositions = timeMap.tailMap(time).values();
PositionDTO [] positions = new PositionDTO[newPositions.size()];
Iterator it = newPositions.iterator();
int i = 0;
while(it.hasNext()){
positions[i++] = getPosition((String)it.next());
}
return positions;
}
}
|