package com.yoursway.model.repository;
import java.util.concurrent.ExecutorService;
import com.yoursway.model.timeline.PointInTime;
public class CalculatedModelTracker implements IDependant, DependencyRequestor {
private final Class<?> rootHandleInterface;
private final Object rootHandle;
private final CalculatedModelTrackerMaster master;
private final ICalculatedModelUpdater modelUpdater;
private final ExecutorService executor;
private Resolver previousResolver;
private final ISnapshotStorage storage;
public CalculatedModelTracker(Class<?> rootHandleInterface, Object rootHandle,
CalculatedModelTrackerMaster master, ICalculatedModelUpdater modelUpdater,
ExecutorService executor, final ISnapshotStorage storage) {
this.rootHandleInterface = rootHandleInterface;
this.rootHandle = rootHandle;
this.master = master;
this.modelUpdater = modelUpdater;
this.executor = executor;
this.storage = storage;
this.previousResolver = null;
}
public Class<?> getRootHandleInterface() {
return rootHandleInterface;
}
public Object getRootHandle() {
return rootHandle;
}
public void init(final PointInTime point) {
final Resolver resolver = new Resolver(point, master, this, storage, ModelDelta.EMPTY_DELTA);
ISnapshot initialSnapshot = modelUpdater.buildInitialSnapshot(resolver);
}
public void call(final PointInTime point, final ModelDelta delta) {
if (previousResolver != null) {
storage.disposeResolver(previousResolver);
previousResolver = null;
}
final Resolver resolver = new Resolver(point, master, this, storage, delta);
executor.execute(new Runnable() {
@SuppressWarnings("unchecked")
public void run() {
master.clearDependencies(CalculatedModelTracker.this);
final ModelDelta[] newDelta = new ModelDelta[1];
storage.pushSnapshot(rootHandleInterface, point, new ISnapshotBuilder() {
public ISnapshot buildSnapshot() {
//SnapshotDeltaPair update = modelUpdater.update(resolver);
//newDelta[0] = update.getDelta();
//return update.getSnapshot();
return null;
}
});
if (resolver.inGodMode())
previousResolver = resolver;
else
storage.disposeResolver(resolver);
master.handlesChanged(point, newDelta[0]);
System.out.println("CM.run() ch=" + newDelta[0].getChangedHandles());
}
});
}
public void dependency(IHandle<?> handle) {
if (handle.getModelRootInterface() != rootHandleInterface)
master.addDependency(this, handle);
}
}