package com.revolsys.record.io; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import com.revolsys.geometry.model.BoundingBox; import com.revolsys.record.schema.RecordStore; public class RecordStoreCache { public static RecordStoreCache getCache(final RecordStore recordStore) { return new RecordStoreCache(recordStore); } private final Map<BoundingBox, List> cachedObejcts = Collections .synchronizedMap(new HashMap<BoundingBox, List>()); private final Map<BoundingBox, RecordStoreQueryTask> loadTasks = new LinkedHashMap<>(); private final RecordStore recordStore; private String typePath; public RecordStoreCache(final RecordStore recordStore) { this.recordStore = recordStore; } private void addBoundingBox(final BoundingBox boundingBox) { synchronized (this.loadTasks) { if (!this.loadTasks.containsKey(boundingBox)) { this.loadTasks.put(boundingBox, new RecordStoreQueryTask(this.recordStore, this.typePath, boundingBox)); } } } public List getObjects(final BoundingBox boundingBox) { final List objects = this.cachedObejcts.get(boundingBox); if (objects == null) { addBoundingBox(boundingBox); } return objects; } public void removeObjects(final BoundingBox boundingBox) { synchronized (this.loadTasks) { final RecordStoreQueryTask task = this.loadTasks.get(boundingBox); if (task != null) { task.cancel(); this.loadTasks.remove(task); } } this.cachedObejcts.remove(boundingBox); } }