package polly.rx.core.orion;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import polly.rx.core.orion.model.Quadrant;
import polly.rx.core.orion.model.Sector;
import polly.rx.core.orion.model.SectorType;
public class CachedQuadrantProvider extends QuadrantProviderDecorator {
private final Map<String, Quadrant> quadCache;
private final List<Sector> entryPortals;
private final List<Quadrant> allQuadrants;
public CachedQuadrantProvider(QuadrantProvider wrapped) {
super(wrapped);
this.quadCache = Collections.synchronizedMap(new HashMap<String, Quadrant>());
this.allQuadrants = Collections.synchronizedList(new ArrayList<Quadrant>());
this.entryPortals = Collections.synchronizedList(new ArrayList<Sector>());
}
@Override
public synchronized List<? extends Sector> getEntryPortals() {
if (this.entryPortals.isEmpty()) {
this.entryPortals.addAll(super.getEntryPortals());
}
return this.entryPortals;
}
@Override
public synchronized Quadrant getQuadrant(Sector sector) {
return this.getQuadrant(sector.getQuadName());
}
@Override
public synchronized List<? extends Quadrant> getAllQuadrants() {
if (this.allQuadrants.isEmpty()) {
this.allQuadrants.addAll(super.getAllQuadrants());
}
return this.allQuadrants;
}
@Override
public synchronized Quadrant getQuadrant(String name) {
Quadrant cached = this.quadCache.get(name);
if (cached == null) {
cached = super.getQuadrant(name);
this.quadCache.put(name, cached);
}
return cached;
}
@Override
public void quadrantDeleted(QuadrantEvent e) {
this.quadCache.remove(e.getQuadrant().getName());
this.allQuadrants.remove(e.getQuadrant());
this.entryPortals.removeAll(e.getModified());
}
@Override
public void quadrantAdded(QuadrantEvent e) {
this.quadCache.put(e.getQuadrant().getName(), e.getQuadrant());
this.allQuadrants.add(e.getQuadrant());
}
@Override
public void sectorsAdded(QuadrantEvent e) {
for (final Sector sector : e.getModified()) {
if (sector.getType() == SectorType.EINTRITTS_PORTAL) {
this.entryPortals.add(sector);
}
}
}
@Override
public void sectorsUpdated(QuadrantEvent e) {}
}