put<T extends IResource> static method
AsyncReply<T?>
put<T extends IResource>(
- String name,
- T resource, [
- IStore? store = null,
- IResource? parent = null,
- TypeTemplate? customTemplate = null,
- int age = 0,
- IPermissionsManager? manager = null,
- Map<
String, dynamic> ? attributes = null,
Implementation
static AsyncReply<T?> put<T extends IResource>(String name, T resource,
[IStore? store = null,
IResource? parent = null,
TypeTemplate? customTemplate = null,
int age = 0,
IPermissionsManager? manager = null,
Map<String, dynamic>? attributes = null]) {
var rt = AsyncReply<T?>();
if (resource.instance != null) {
rt.triggerError(Exception("Resource has a store."));
return rt;
}
// @TODO: Trim left '/' char
// var path = name.trimLeft().split("/");
// if (path.length > 1)
// {
// if (parent != null)
// rt.triggerError(Exception("Parent can't be set when using path in instance name"));
// Warehouse.get<IResource>(path.take(path.length - 1).join("/")).then((value){
// if (value == null)
// rt.triggerError(Exception("Can't find parent"));
// parent = value;
// store = store ?? parent.instance.store;
// var instanceName = path.last;
// if (store == null)
// {
// // assign parent as a store
// if (parent is IStore)
// {
// store = (IStore)parent;
// stores
// List<WeakReference<IResource>> list;
// if (stores.TryGetValue(store, out list))
// lock (((ICollection)list).SyncRoot)
// list.Add(resourceReference);
// //stores[store].Add(resourceReference);
// }
// // assign parent's store as a store
// else if (parent != null)
// {
// store = parent.instance.store;
// List<WeakReference<IResource>> list;
// if (stores.TryGetValue(store, out list))
// lock (((ICollection)list).SyncRoot)
// list.Add(resourceReference);
// //stores[store].Add(resourceReference);
// }
// // assign self as a store (root store)
// else if (resource is IStore)
// {
// store = resource;
// }
// else
// throw new Exception("Can't find a store for the resource.");
// }
// });
// }
resource.instance = new Instance(
resourceCounter++, name, resource, store, customTemplate, age);
if (attributes != null)
resource.instance?.setAttributes(Structure.fromMap(attributes));
if (manager != null) resource.instance?.managers.add(manager);
if (store == parent) parent = null;
if (parent == null) {
if (!(resource is IStore)) store?.instance?.children.add(resource);
} else
parent.instance?.children.add(resource);
var initResource = () {
if (resource.instance == null) return;
_resources[(resource.instance as Instance).id] = resource;
if (_warehouseIsOpen) {
resource.trigger(ResourceTrigger.Initialize).then<dynamic>((value) {
if (resource is IStore)
resource.trigger(ResourceTrigger.Open).then<dynamic>((value) {
rt.trigger(resource);
}).error((ex) {
Warehouse.remove(resource);
rt.triggerError(ex);
});
else
rt.trigger(resource);
}).error((ex) {
Warehouse.remove(resource);
rt.triggerError(ex);
});
}
};
if (resource is IStore) {
_stores.add(resource);
initResource();
} else {
store?.put(resource).then<dynamic>((value) {
if (value)
initResource();
else
rt.trigger(null);
}).error((ex) {
Warehouse.remove(resource);
rt.triggerError(ex);
});
}
// return new name
return rt;
}