put<T extends IResource> static method

AsyncReply<T?> put<T extends IResource>(
  1. String name,
  2. T resource, [
  3. IStore? store = null,
  4. IResource? parent = null,
  5. TypeTemplate? customTemplate = null,
  6. int age = 0,
  7. IPermissionsManager? manager = null,
  8. Map<String, dynamic>? attributes = null,
])
Put a resource in the warehouse. Resource instance. Resource name. IStore that manages the resource. Can be null if the resource is a store. Parent resource. if not presented the store becomes the parent for the resource.

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;
}