package xapi.model;
import xapi.annotation.compile.MagicMethod;
import xapi.inject.X_Inject;
import xapi.model.api.Model;
import xapi.model.api.ModelKey;
import xapi.model.api.ModelManifest;
import xapi.model.api.ModelQuery;
import xapi.model.api.ModelQueryResult;
import xapi.model.service.ModelCache;
import xapi.model.service.ModelService;
import xapi.source.impl.StringCharIterator;
import xapi.util.api.SuccessHandler;
import javax.inject.Provider;
public class X_Model {
private X_Model() {}
private static final Provider<ModelCache> cache = X_Inject.singletonLazy(ModelCache.class);
private static final Provider<ModelService> service = X_Inject.singletonLazy(ModelService.class);
public static ModelCache cache(){
return cache.get();
}
@MagicMethod(doNotVisit=true,
documentation="This magic method generates the model class and all of its dependent models, "
+ "then re-routes to the same provider as X_Inject.instance()")
public static <M extends Model, Generic extends M> M create(final Class<Generic> modelClass) {
return service.get().create(modelClass);
}
@MagicMethod(doNotVisit=true,
documentation="This magic method generates the model class, and returns the internal table name of the modelClass")
public static <M extends Model> String register(final Class<M> modelClass) {
return service.get().register(modelClass);
}
public static <M extends Model> void persist(final M model, final SuccessHandler<M> callback) {
// TODO: return a Promises-like object
service.get().persist(model, callback);
}
public static <M extends Model> void load(final Class<M> modelClass, final ModelKey modelKey, final SuccessHandler<M> callback) {
// TODO: return a Promises-like object
service.get().load(modelClass, modelKey, callback);
}
public static <M extends Model> String serialize(final Class<M> cls, final M model) {
return service.get().serialize(cls, model).toString();
}
public static <M extends Model> M deserialize(final Class<M> cls, final String model) {
return service.get().deserialize(cls, new StringCharIterator(model));
}
public static <M extends Model> String serialize(final ModelManifest manifest, final M model) {
return service.get().serialize(manifest, model).toString();
}
public static <M extends Model> M deserialize(final ModelManifest manifest, final String model) {
return service.get().deserialize(manifest, new StringCharIterator(model));
}
public static ModelService getService() {
return service.get();
}
public static String keyToString(final ModelKey key) {
return service.get().keyToString(key);
}
public static ModelKey keyFromString(final String key) {
return service.get().keyFromString(key);
}
public static ModelKey newKey(final String kind) {
return service.get().newKey("", kind);
}
public static ModelKey newKey(final String namespace, final String kind) {
return service.get().newKey(namespace, kind);
}
public static ModelKey newKey(final String namespace, final String kind, final String id) {
return service.get().newKey(namespace, kind, id);
}
public static <M extends Model> void query(final Class<M> modelClass, final ModelQuery<M> query, final SuccessHandler<ModelQueryResult<M>> callback) {
assert modelClass != null : "A typed query -must- supply a modelClass";
service.get().query(modelClass, query, callback);
}
public static void queryAll(final ModelQuery<Model> query, final SuccessHandler<ModelQueryResult<Model>> callback) {
service.get().query(query, callback);
}
}