package nebula.data.impl;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import nebula.data.Broker;
import nebula.data.BrokerHandler;
import nebula.data.Classificator;
import nebula.data.DataListener;
import nebula.data.DataStore;
import nebula.data.Entity;
import nebula.lang.Type;
import nebula.lang.TypeLoader;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
public class TypeDatastore implements DataStore<Type> {
final TypeLoader typeLoader;
final LoadingCache<String, BrokerHandler<Type>> cachedTypes;
public TypeDatastore(TypeLoader typeLoader) {
this.typeLoader = typeLoader;
this.cachedTypes = CacheBuilder.newBuilder().build(new CacheLoader<String, BrokerHandler<Type>>() {
public BrokerHandler<Type> load(final String path) throws Exception {
return Broker.broke(Type.class, TypeDatastore.this.typeLoader.findType(path));
}
});
this.typeLoader.addListener(dataListener);
}
DataListener<Type> dataListener = new DataListener<Type>() {
@Override
public void onAdd(Type v) {
cachedTypes.put(v.getName(), Broker.broke(Type.class, v));
}
@Override
public void onUpdate(Type oldData, Type newData) {
try {
cachedTypes.get(oldData.getName()).setNewValue(newData);
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
}
@Override
public void onRemove(Type v) {
cachedTypes.invalidate(v.getName());
}
};
public Type get(Object key) {
return typeLoader.findType((String) key);
}
public Type getBroker(Object key) {
try {
return cachedTypes.get((String) key).get();
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
}
@Override
public Classificator<String, Type> getClassificator(String name) {
// TODO Not realized getClassificator(String name)
return null;
}
@Override
public Map<String, Classificator<String, Entity>> getClassificatores() {
// TODO Not realized getClassificatores()
return null;
}
@Override
public long getLastModified() {
return System.currentTimeMillis();
}
@Override
public void add(Type v) {
throw new UnsupportedOperationException();
}
@Override
public void remove(Type v) {
throw new UnsupportedOperationException();
}
@Override
public void flush() {
throw new UnsupportedOperationException();
}
@Override
public void clearChanges() {
throw new UnsupportedOperationException();
}
@Override
public List<Type> listAll() {
return this.listAll();
}
@Override
public Type getType() {
throw new UnsupportedOperationException();
}
}