package com.revolsys.swing.map.layer;
import java.util.LinkedList;
import com.revolsys.logging.Logs;
import com.revolsys.record.io.RecordStoreConnectionRegistry;
import com.revolsys.swing.parallel.AbstractSwingWorker;
import com.revolsys.swing.parallel.Invoke;
import com.revolsys.swing.parallel.MaxThreadsSwingWorker;
public class LayerInitializer extends AbstractSwingWorker<Void, Void>
implements MaxThreadsSwingWorker {
private static final LinkedList<Layer> LAYERS_CURRENTLY_INITIALIZING = new LinkedList<>();
private static final LinkedList<Layer> LAYERS_TO_INITIALIZE = new LinkedList<>();
public static void initialize(final Layer layer) {
synchronized (LAYERS_TO_INITIALIZE) {
if (!LAYERS_CURRENTLY_INITIALIZING.contains(layer) && !LAYERS_TO_INITIALIZE.contains(layer)
&& !layer.isInitialized()) {
// LAYERS_TO_INITIALIZE.add(layer);
// if (instanceCount < MAX_WORKERS) {
// instanceCount++;
final LayerInitializer initializer = new LayerInitializer(layer);
Invoke.worker(initializer);
}
// }
}
}
private final Layer layer;
private final RecordStoreConnectionRegistry recordStoreRegistry;
public LayerInitializer(final Layer layer) {
super(false);
this.layer = layer;
this.recordStoreRegistry = RecordStoreConnectionRegistry.getForThread();
}
@Override
public int getMaxThreads() {
return 5;
}
@Override
protected Void handleBackground() {
try {
RecordStoreConnectionRegistry.setForThread(this.recordStoreRegistry);
synchronized (LAYERS_TO_INITIALIZE) {
// if (LAYERS_TO_INITIALIZE.isEmpty()) {
// instanceCount--;
// return null;
// } else {
// this.layer = LAYERS_TO_INITIALIZE.removeFirst();
LAYERS_TO_INITIALIZE.remove(this.layer);
LAYERS_CURRENTLY_INITIALIZING.add(this.layer);
// }
}
try {
this.layer.initialize();
} catch (final Throwable e) {
Logs.error(this.layer.getClass(), "Unable to iniaitlize layer: " + this.layer.getName(), e);
} finally {
LAYERS_CURRENTLY_INITIALIZING.remove(this.layer);
}
return null;
} finally {
RecordStoreConnectionRegistry.setForThread(null);
}
}
@Override
public String toString() {
// if (this.layer == null) {
// return "INITIALIZING layers";
// } else {
return "INITIALIZING layer: " + this.layer.getPath();
// }
}
}