diff --git a/Libraries/Esiur/Net/DataLink/PacketFilter.cs b/Libraries/Esiur/Net/DataLink/PacketFilter.cs index 3972642..160f49b 100644 --- a/Libraries/Esiur/Net/DataLink/PacketFilter.cs +++ b/Libraries/Esiur/Net/DataLink/PacketFilter.cs @@ -42,9 +42,9 @@ public abstract class PacketFilter : IResource } public event DestroyedEvent OnDestroy; - - public abstract AsyncReply Handle(ResourceOperation trigger); + + public abstract AsyncReply Handle(ResourceOperation operation, IResourceContext context = null); public abstract bool Execute(Packet packet); diff --git a/Libraries/Esiur/Net/DataLink/PacketServer.cs b/Libraries/Esiur/Net/DataLink/PacketServer.cs index 89b8344..25f3e7f 100644 --- a/Libraries/Esiur/Net/DataLink/PacketServer.cs +++ b/Libraries/Esiur/Net/DataLink/PacketServer.cs @@ -67,9 +67,9 @@ public class PacketServer : IResource OnDestroy?.Invoke(this); } - public AsyncReply Trigger(ResourceOperation trigger) + public AsyncReply Handle(ResourceOperation operation, IResourceContext context = null) { - if (trigger == ResourceOperation.Initialize) + if (operation == ResourceOperation.Initialize) { foreach (var src in sources) { @@ -77,12 +77,12 @@ public class PacketServer : IResource src.Open(); } } - else if (trigger == ResourceOperation.Terminate) + else if (operation == ResourceOperation.Terminate) { foreach (var src in sources) src.Close(); } - else if (trigger == ResourceOperation.SystemReload) + else if (operation == ResourceOperation.SystemReloading) { foreach (var src in sources) { diff --git a/Libraries/Esiur/Net/DataLink/PacketSource.cs b/Libraries/Esiur/Net/DataLink/PacketSource.cs index 3ed6a70..e1b4dc5 100644 --- a/Libraries/Esiur/Net/DataLink/PacketSource.cs +++ b/Libraries/Esiur/Net/DataLink/PacketSource.cs @@ -43,9 +43,7 @@ public abstract class PacketSource : IResource set; } - - public abstract AsyncReply Trigger(ResourceOperation trigger); - + public abstract AsyncReply Handle(ResourceOperation operation, IResourceContext context = null); public abstract bool RawMode { diff --git a/Libraries/Esiur/Net/Http/EpOverHttp.cs b/Libraries/Esiur/Net/Http/EpOverHttp.cs index f82f7a7..423813a 100644 --- a/Libraries/Esiur/Net/Http/EpOverHttp.cs +++ b/Libraries/Esiur/Net/Http/EpOverHttp.cs @@ -9,7 +9,7 @@ using System.Text; namespace Esiur.Net.Http; public class EpOverHttp : HttpFilter { - [Attribute] + //[Attribute] EntryPoint EntryPoint { get; set; } public override AsyncReply Execute(HttpConnection sender) @@ -30,7 +30,7 @@ public class EpOverHttp : HttpFilter return new AsyncReply(true); } - public override AsyncReply Trigger(ResourceOperation trigger) + public override AsyncReply Handle(ResourceOperation operation, IResourceContext context = null) { return new AsyncReply(true); } diff --git a/Libraries/Esiur/Net/Http/EpOvwerWebsocket.cs b/Libraries/Esiur/Net/Http/EpOvwerWebsocket.cs index 573d63b..8c895ef 100644 --- a/Libraries/Esiur/Net/Http/EpOvwerWebsocket.cs +++ b/Libraries/Esiur/Net/Http/EpOvwerWebsocket.cs @@ -33,9 +33,10 @@ using Esiur.Core; using Esiur.Protocol; namespace Esiur.Net.Http; + public class EpOvwerWebsocket : HttpFilter { - [Attribute] + //[Attribute] public EpServer Server { get; @@ -72,7 +73,7 @@ public class EpOvwerWebsocket : HttpFilter } - public override AsyncReply Trigger(ResourceOperation trigger) + public override AsyncReply Handle(ResourceOperation operation, IResourceContext context = null) { return new AsyncReply(true); } diff --git a/Libraries/Esiur/Net/Http/HttpFilter.cs b/Libraries/Esiur/Net/Http/HttpFilter.cs index d87ec58..72fa4ac 100644 --- a/Libraries/Esiur/Net/Http/HttpFilter.cs +++ b/Libraries/Esiur/Net/Http/HttpFilter.cs @@ -46,7 +46,7 @@ public abstract class HttpFilter : IResource } public event DestroyedEvent OnDestroy; - public abstract AsyncReply Trigger(ResourceOperation trigger); + public abstract AsyncReply Handle(ResourceOperation operation, IResourceContext context = null); /* public virtual void SessionModified(HTTPSession session, string key, object oldValue, object newValue) diff --git a/Libraries/Esiur/Net/Http/HttpServer.cs b/Libraries/Esiur/Net/Http/HttpServer.cs index b77ce35..b85f7c1 100644 --- a/Libraries/Esiur/Net/Http/HttpServer.cs +++ b/Libraries/Esiur/Net/Http/HttpServer.cs @@ -139,14 +139,14 @@ public class HttpServer : NetworkServer, IResource set; } - [Attribute] + //[Attribute] public virtual string IP { get; set; } - [Attribute] + //[Attribute] public virtual ushort Port { get; @@ -154,21 +154,21 @@ public class HttpServer : NetworkServer, IResource } - [Attribute] + //[Attribute] public virtual uint MaxPost { get; set; } - [Attribute] + //[Attribute] public virtual bool SSL { get; set; } - [Attribute] + //[Attribute] public virtual string Certificate { get; @@ -291,10 +291,10 @@ public class HttpServer : NetworkServer, IResource */ - public async AsyncReply Trigger(ResourceOperation trigger) + public async AsyncReply Handle(ResourceOperation operation, IResourceContext context = null) { - if (trigger == ResourceOperation.Initialize) + if (operation == ResourceOperation.Initialize) { //var ip = (IPAddress)Instance.Attributes["ip"]; //var port = (int)Instance.Attributes["port"]; @@ -318,16 +318,16 @@ public class HttpServer : NetworkServer, IResource Start(listener); } - else if (trigger == ResourceOperation.Terminate) + else if (operation == ResourceOperation.Terminate) { Stop(); } - else if (trigger == ResourceOperation.SystemReload) + else if (operation == ResourceOperation.SystemReloading) { - await Trigger(ResourceOperation.Terminate); - await Trigger(ResourceOperation.Initialize); + await Handle(ResourceOperation.Terminate); + await Handle(ResourceOperation.Initialize); } - else if (trigger == ResourceOperation.SystemInitialized) + else if (operation == ResourceOperation.SystemReady) { filters = await Instance.Children(); } diff --git a/Libraries/Esiur/Net/NetworkServer.cs b/Libraries/Esiur/Net/NetworkServer.cs index dead829..b352882 100644 --- a/Libraries/Esiur/Net/NetworkServer.cs +++ b/Libraries/Esiur/Net/NetworkServer.cs @@ -136,7 +136,7 @@ public abstract class NetworkServer : IDestructible where TConnecti } - [Attribute] + //[Attribute] public uint Timeout { get; @@ -144,7 +144,7 @@ public abstract class NetworkServer : IDestructible where TConnecti } - [Attribute] + //[Attribute] public uint Clock { get; diff --git a/Libraries/Esiur/Net/Tcp/TcpFilter.cs b/Libraries/Esiur/Net/Tcp/TcpFilter.cs index 011518b..041626c 100644 --- a/Libraries/Esiur/Net/Tcp/TcpFilter.cs +++ b/Libraries/Esiur/Net/Tcp/TcpFilter.cs @@ -46,7 +46,7 @@ public abstract class TcpFilter : IResource public event DestroyedEvent OnDestroy; - public abstract AsyncReply Trigger(ResourceOperation trigger); + public abstract AsyncReply Handle(ResourceOperation operation, IResourceContext context = null); public virtual bool Connected(TcpConnection sender) { diff --git a/Libraries/Esiur/Net/Tcp/TcpServer.cs b/Libraries/Esiur/Net/Tcp/TcpServer.cs index 8639b8f..93ecd51 100644 --- a/Libraries/Esiur/Net/Tcp/TcpServer.cs +++ b/Libraries/Esiur/Net/Tcp/TcpServer.cs @@ -38,13 +38,13 @@ namespace Esiur.Net.Tcp; public class TcpServer : NetworkServer, IResource { - [Attribute] + //[Attribute] public string IP { get; set; } - [Attribute] + //[Attribute] public ushort Port { get; @@ -66,9 +66,9 @@ public class TcpServer : NetworkServer, IResource TcpFilter[] filters = null; - public AsyncReply Trigger(ResourceOperation trigger) + public AsyncReply Handle(ResourceOperation operation, IResourceContext context = null) { - if (trigger == ResourceOperation.Initialize) + if (operation == ResourceOperation.Initialize) { TcpSocket listener; @@ -82,16 +82,16 @@ public class TcpServer : NetworkServer, IResource } - else if (trigger == ResourceOperation.Terminate) + else if (operation == ResourceOperation.Terminate) { Stop(); } - else if (trigger == ResourceOperation.SystemReload) + else if (operation == ResourceOperation.SystemReloading) { - Trigger(ResourceOperation.Terminate); - Trigger(ResourceOperation.Initialize); + Handle(ResourceOperation.Terminate); + Handle(ResourceOperation.Initialize); } - else if (trigger == ResourceOperation.SystemInitialized) + else if (operation == ResourceOperation.SystemReady) { Instance.Children().Then(x => filters = x); } diff --git a/Libraries/Esiur/Net/Udp/UdpFilter.cs b/Libraries/Esiur/Net/Udp/UdpFilter.cs index d8c0e14..5f3313d 100644 --- a/Libraries/Esiur/Net/Udp/UdpFilter.cs +++ b/Libraries/Esiur/Net/Udp/UdpFilter.cs @@ -47,7 +47,8 @@ public abstract class UdpFilter : IResource public event DestroyedEvent OnDestroy; - public abstract AsyncReply Trigger(ResourceOperation trigger); + public abstract AsyncReply Handle(ResourceOperation operation, IResourceContext context = null); + public abstract bool Execute(byte[] data, IPEndPoint sender); diff --git a/Libraries/Esiur/Net/Udp/UdpServer.cs b/Libraries/Esiur/Net/Udp/UdpServer.cs index b0b301f..bcf4252 100644 --- a/Libraries/Esiur/Net/Udp/UdpServer.cs +++ b/Libraries/Esiur/Net/Udp/UdpServer.cs @@ -55,14 +55,14 @@ public class UdpServer : IResource set; } - [Attribute] + //[Attribute] string IP { get; set; } - [Attribute] + //[Attribute] ushort Port { get; @@ -177,9 +177,9 @@ public class UdpServer : IResource OnDestroy?.Invoke(this); } - async AsyncReply IResource.Trigger(ResourceOperation trigger) + public async AsyncReply Handle(ResourceOperation operation, IResourceContext context = null) { - if (trigger == ResourceOperation.Initialize) + if (operation == ResourceOperation.Initialize) { var address = IP == null ? IPAddress.Any : IPAddress.Parse(IP); @@ -188,12 +188,12 @@ public class UdpServer : IResource receiver = new Thread(Receiving); receiver.Start(); } - else if (trigger == ResourceOperation.Terminate) + else if (operation == ResourceOperation.Terminate) { if (receiver != null) receiver.Abort(); } - else if (trigger == ResourceOperation.SystemInitialized) + else if (operation == ResourceOperation.SystemReady) { filters = await Instance.Children(); } diff --git a/Libraries/Esiur/Protocol/EpConnection.cs b/Libraries/Esiur/Protocol/EpConnection.cs index 5d1ba38..5f68a00 100644 --- a/Libraries/Esiur/Protocol/EpConnection.cs +++ b/Libraries/Esiur/Protocol/EpConnection.cs @@ -145,30 +145,28 @@ public partial class EpConnection : NetworkConnection, IStore // Attributes - [Attribute] + //[Attribute] public uint KeepAliveTime { get; set; } = 10; - [Attribute] + //[Attribute] public ExceptionLevel ExceptionLevel { get; set; } = ExceptionLevel.Code | ExceptionLevel.Message | ExceptionLevel.Source | ExceptionLevel.Trace; + + //[Attribute] - //public Func> Authenticator { get; set; } - - - [Attribute] public bool AutoReconnect { get; set; } = false; - [Attribute] + //[Attribute] public uint ReconnectInterval { get; set; } = 5; //[Attribute] //public string Username { get; set; } - [Attribute] + //[Attribute] public bool UseWebSocket { get; set; } - [Attribute] + //[Attribute] public bool SecureWebSocket { get; set; } //[Attribute] @@ -1694,25 +1692,55 @@ public partial class EpConnection : NetworkConnection, IStore /// /// Resource trigger. /// - public AsyncReply Trigger(ResourceOperation trigger) + public AsyncReply Handle(ResourceOperation trigger, IResourceContext context = null) { - _authPacket = new EpAuthPacket(Instance.Warehouse); - _packet = new EpPacket(Instance.Warehouse); - if (trigger == ResourceOperation.Open) + if (trigger == ResourceOperation.Initialize) + { + _authPacket = new EpAuthPacket(Instance.Warehouse); + _packet = new EpPacket(Instance.Warehouse); + + + } + else if (trigger == ResourceOperation.Open) { // @TODO: Need a better way to check for initiator or responder if (this.Server != null) return new AsyncReply(true); + var host = Instance.Name.Split(':'); var address = host[0]; var port = host.Length > 1 ? ushort.Parse(host[1]) : (ushort)10518; // assign domain from hostname if not provided - if (_remoteDomain == null) + + + if (context is EpConnectionContext epContext) + { + var provider = Instance.Warehouse.GetAuthenticationProvider(epContext.AuthenticationProtocol); + + _remoteDomain = epContext.Domain ?? address; + + Session.AuthenticationHandler = provider.CreateAuthenticationHandler(new AuthenticationContext(){ + Direction = AuthenticationDirection.Initiator, + Domain = _remoteDomain, + HostName = address, + InitiatorIdentity = epContext.Identity, + Mode = epContext.AuthenticationMode, + }); + + Session.LocalIdentity = epContext.Identity; + ReconnectInterval = epContext.ReconnectInterval; + ExceptionLevel = epContext.ExceptionLevel; + UseWebSocket = epContext.UseWebSocket; + SecureWebSocket = epContext.SecureWebSocket; + _remoteDomain = epContext.Domain; + AutoReconnect = epContext.AutoReconnect; + } + else if (_remoteDomain == null) _remoteDomain = address; return Connect(null, address, port, _remoteDomain); diff --git a/Libraries/Esiur/Protocol/EpConnectionContext.cs b/Libraries/Esiur/Protocol/EpConnectionContext.cs index 7937a39..c4c4d5c 100644 --- a/Libraries/Esiur/Protocol/EpConnectionContext.cs +++ b/Libraries/Esiur/Protocol/EpConnectionContext.cs @@ -2,6 +2,7 @@ using Esiur.Data; using Esiur.Net.Packets; using Esiur.Resource; +using Esiur.Security.Authority; using Esiur.Security.Membership; using Esiur.Security.Permissions; using System; @@ -10,24 +11,24 @@ using System.Text; namespace Esiur.Protocol; -public class EpConnectionContext : ResourceContext +public class EpConnectionContext : IResourceContext { - public EpConnectionContext() - : base(0, new Map(), null, null) - { + //public EpConnectionContext() + // : base(0, new Map(), null, null) + //{ - } + //} - public override void Build() - { - Attributes["AutoConnect"] = AutoReconnect; - Attributes["ReconnectInterval"] = ReconnectInterval; - Attributes["UseWebSocket"] = UseWebSocket; - Attributes["SecureWebSocket"] = SecureWebSocket; - Attributes["Domain"] = SecureWebSocket; - Attributes["AuthenticationProtocol"] = SecureWebSocket; - Attributes["Identity"] = SecureWebSocket; - } + //public override void Build() + //{ + // Attributes["AutoConnect"] = AutoReconnect; + // Attributes["ReconnectInterval"] = ReconnectInterval; + // Attributes["UseWebSocket"] = UseWebSocket; + // Attributes["SecureWebSocket"] = SecureWebSocket; + // Attributes["Domain"] = SecureWebSocket; + // Attributes["AuthenticationProtocol"] = SecureWebSocket; + // Attributes["Identity"] = SecureWebSocket; + //} public ExceptionLevel ExceptionLevel { get; set; } = ExceptionLevel.Code | ExceptionLevel.Message | ExceptionLevel.Source | ExceptionLevel.Trace; @@ -35,8 +36,9 @@ public class EpConnectionContext : ResourceContext //public Func> Authenticator { get; set; } //public Func> Authenticator { get; set; } + public AuthenticationMode AuthenticationMode { get; set; } = AuthenticationMode.None; public string Identity { get; set; } - public string AuthenticationProtocol { get; set; } + public string AuthenticationProtocol { get; set; } = "hash"; public bool AutoReconnect { get; set; } = false; @@ -55,4 +57,10 @@ public class EpConnectionContext : ResourceContext //public ulong TokenIndex { get; set; } public string Domain { get; set; } + + public Map Attributes { get; set; } + + public Map Properties { get; set; } + + public ulong Age { get; } } diff --git a/Libraries/Esiur/Protocol/EpResource.cs b/Libraries/Esiur/Protocol/EpResource.cs index ad4cfa1..c45e168 100644 --- a/Libraries/Esiur/Protocol/EpResource.cs +++ b/Libraries/Esiur/Protocol/EpResource.cs @@ -475,10 +475,10 @@ public class EpResource : DynamicObject, IResource, INotifyPropertyChanged, IDyn /// /// /// - public AsyncReply Handle(ResourceOperation trigger) + public AsyncReply Handle(ResourceOperation operation, IResourceContext context = null) { - if (trigger == ResourceOperation.Initialize) + if (operation == ResourceOperation.Initialize) { this.Instance.PropertyModified += (x) => this.PropertyChanged?.Invoke(this, new ResourcePropertyChangedEventArgs(x.Name)); diff --git a/Libraries/Esiur/Protocol/EpServer.cs b/Libraries/Esiur/Protocol/EpServer.cs index 1119995..a38643a 100644 --- a/Libraries/Esiur/Protocol/EpServer.cs +++ b/Libraries/Esiur/Protocol/EpServer.cs @@ -46,17 +46,17 @@ public class EpServer : NetworkServer, IResource { - [Attribute] + //[Attribute] public string IP { get; set; } - [Attribute] + //[Attribute] public string[] AllowedAuthenticationProviders { get; set; } - [Attribute] + //[Attribute] public bool AllowUnauthorizedAccess { get; set; } //IMembership membership; @@ -88,14 +88,14 @@ public class EpServer : NetworkServer, IResource // connection.ProcessAuthorization(indication.Results); //} - [Attribute] + //[Attribute] public EntryPoint EntryPoint { get; set; } - [Attribute] + //[Attribute] public ushort Port { get; @@ -103,7 +103,7 @@ public class EpServer : NetworkServer, IResource } = 10518; - [Attribute] + //[Attribute] public ExceptionLevel ExceptionLevel { get; set; } = ExceptionLevel.Code | ExceptionLevel.Source @@ -124,9 +124,10 @@ public class EpServer : NetworkServer, IResource } - public AsyncReply Trigger(ResourceOperation trigger) + public AsyncReply Handle(ResourceOperation operation, IResourceContext context = null) + { - if (trigger == ResourceOperation.Initialize) + if (operation == ResourceOperation.Initialize) { TcpSocket listener; @@ -137,14 +138,14 @@ public class EpServer : NetworkServer, IResource Start(listener); } - else if (trigger == ResourceOperation.Terminate) + else if (operation == ResourceOperation.Terminate) { Stop(); } - else if (trigger == ResourceOperation.SystemReload) + else if (operation == ResourceOperation.SystemReloading) { - Trigger(ResourceOperation.Terminate); - Trigger(ResourceOperation.Initialize); + Handle(ResourceOperation.Terminate); + Handle(ResourceOperation.Initialize); } return new AsyncReply(true); diff --git a/Libraries/Esiur/Proxy/ResourceGenerator.cs b/Libraries/Esiur/Proxy/ResourceGenerator.cs index 5803d32..77dbd95 100644 --- a/Libraries/Esiur/Proxy/ResourceGenerator.cs +++ b/Libraries/Esiur/Proxy/ResourceGenerator.cs @@ -111,9 +111,9 @@ namespace Esiur.Proxy code.AppendLine("public virtual event DestroyedEvent? OnDestroy;"); code.AppendLine("public virtual void Destroy() { OnDestroy?.Invoke(this); }"); - if (!ci.HasTrigger) + if (!ci.HasHandle) { - code.AppendLine("public virtual AsyncReply Trigger(ResourceTrigger trigger) => new AsyncReply(true);"); + code.AppendLine("public virtual AsyncReply Handle(ResourceOperation operation, IResourceContext context = null) => new AsyncReply(true);"); } } @@ -181,11 +181,13 @@ namespace Esiur.Proxy ResourceClassInfo? classInfo = null; if (hasResource) { - bool hasTrigger = cds.Members + bool hasHandle = cds.Members .OfType() .Select(m => ctx.SemanticModel.GetDeclaredSymbol(m) as IMethodSymbol) .Where(s => s is not null) - .Any(s => s!.Name == "Trigger" && s.Parameters.Length == 1 && s.Parameters[0].Type.ToDisplayString() == "Esiur.Resource.ResourceTrigger"); + .Any(s => s!.Name == "Handle" && s.Parameters.Length == 2 + && s.Parameters[0].Type.ToDisplayString() == "Esiur.Resource.ResourceOperation" + && s.Parameters[1].Type.ToDisplayString() == "Esiur.Resource.IResourceContext"); var exportedFields = cds.Members .OfType() @@ -208,7 +210,7 @@ namespace Esiur.Proxy cls, exportedFields, hasInterface, - hasTrigger + hasHandle ); } @@ -228,7 +230,7 @@ namespace Esiur.Proxy { Fields = mergedFields, HasInterface = existing.HasInterface || item.HasInterface, - HasTrigger = existing.HasTrigger || item.HasTrigger + HasHandle = existing.HasHandle || item.HasHandle }; } else @@ -337,7 +339,7 @@ namespace Esiur.Proxy public ResourceClassInfo(string key, string name , ClassDeclarationSyntax classDeclaration, - ITypeSymbol classSymbol, List fileds, bool hasInterface, bool hasTrigger) + ITypeSymbol classSymbol, List fileds, bool hasInterface, bool hasHandle) { Key = key; Name = name; @@ -345,7 +347,7 @@ namespace Esiur.Proxy ClassSymbol = classSymbol; Fields = fileds; HasInterface = hasInterface; - HasTrigger = hasTrigger; + HasHandle = hasHandle; } public string Key; @@ -354,7 +356,7 @@ namespace Esiur.Proxy public ITypeSymbol ClassSymbol; public List Fields; public bool HasInterface; - public bool HasTrigger; + public bool HasHandle; } } } \ No newline at end of file diff --git a/Libraries/Esiur/Proxy/TypeDefGenerator.cs b/Libraries/Esiur/Proxy/TypeDefGenerator.cs index e8ceb62..baf2f9a 100644 --- a/Libraries/Esiur/Proxy/TypeDefGenerator.cs +++ b/Libraries/Esiur/Proxy/TypeDefGenerator.cs @@ -218,10 +218,14 @@ public static class TypeDefGenerator throw new Exception("Invalid EP URL"); var path = urlRegex.Split(url); - var con = Warehouse.Default.Get(path[1] + "://" + path[2], new ResourceContext(0, - new Map { ["username"] = username, ["password"] = password }, null, null) - // !string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password) ? new { Username = username, Password = password } : null - ).Wait(20000); + var con = Warehouse.Default.Get(path[1] + "://" + path[2], new EpConnectionContext() + { + Identity = username + }).Wait(10000); + + //ResourceContext(0, + // new Map { ["username"] = username, ["password"] = password }, null, null) + // ).Wait(20000); if (con == null) throw new Exception("Can't connect to server"); diff --git a/Libraries/Esiur/Resource/IResource.cs b/Libraries/Esiur/Resource/IResource.cs index 5b10c22..d562ec3 100644 --- a/Libraries/Esiur/Resource/IResource.cs +++ b/Libraries/Esiur/Resource/IResource.cs @@ -35,8 +35,7 @@ public delegate bool QueryFilter(T value); public interface IResource : IDestructible { - AsyncReply Handle(ResourceOperation trigger); - AsyncReply Initialize(ResourceContext resourceContext); + AsyncReply Handle(ResourceOperation operation, IResourceContext? context = null); [NotMapped] [JsonIgnore] diff --git a/Libraries/Esiur/Resource/IResourceContext.cs b/Libraries/Esiur/Resource/IResourceContext.cs new file mode 100644 index 0000000..b730bff --- /dev/null +++ b/Libraries/Esiur/Resource/IResourceContext.cs @@ -0,0 +1,15 @@ +using Esiur.Data; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Esiur.Resource +{ + public interface IResourceContext + { + public Map Attributes { get; } + public Map Properties { get; } + public ulong Age { get; } + + } +} diff --git a/Libraries/Esiur/Resource/Resource.cs b/Libraries/Esiur/Resource/Resource.cs index 66338b6..c5e229c 100644 --- a/Libraries/Esiur/Resource/Resource.cs +++ b/Libraries/Esiur/Resource/Resource.cs @@ -38,9 +38,9 @@ public class Resource : IResource OnDestroy?.Invoke(this); } - public virtual AsyncReply Trigger(ResourceOperation trigger) + public virtual AsyncReply Handle(ResourceOperation operation, IResourceContext context = null) { - if (trigger == ResourceOperation.Initialize) + if (operation == ResourceOperation.Initialize) return new AsyncReply(this.Create()); else return new AsyncReply(true); diff --git a/Libraries/Esiur/Resource/ResourceContext.cs b/Libraries/Esiur/Resource/ResourceContext.cs index 2e69373..0326f5e 100644 --- a/Libraries/Esiur/Resource/ResourceContext.cs +++ b/Libraries/Esiur/Resource/ResourceContext.cs @@ -8,13 +8,13 @@ using System.Text; namespace Esiur.Resource { - public class ResourceContext + public class ResourceContext:IResourceContext { public ulong Age { get; } public Map Attributes { get; } public Map Properties { get; } public IPermissionsManager PermissionsManager { get; } - + public ResourceContext(ulong age, Map attributes, Map properties, IPermissionsManager permissionsManager) { Age = age; @@ -23,9 +23,9 @@ namespace Esiur.Resource PermissionsManager = permissionsManager; } - public virtual void Build() - { - // update the context based on the current state of the resource and its environment - } + //public virtual void Build() + //{ + // // update the context based on the current state of the resource and its environment + //} } } diff --git a/Libraries/Esiur/Resource/StoreGeneric.cs b/Libraries/Esiur/Resource/StoreGeneric.cs index 584d99c..f18fe31 100644 --- a/Libraries/Esiur/Resource/StoreGeneric.cs +++ b/Libraries/Esiur/Resource/StoreGeneric.cs @@ -35,10 +35,12 @@ public abstract class Store : IStore where T : IResource public abstract bool Record(IResource resource, string propertyName, object value, ulong? age, DateTime? dateTime); - - - - public abstract AsyncReply Trigger(ResourceOperation trigger); + + + + + public abstract AsyncReply Handle(ResourceOperation operation, IResourceContext context = null); + //public async AsyncReply New(string name = null, object attributes = null, object properties = null) //{ diff --git a/Libraries/Esiur/Resource/Warehouse.cs b/Libraries/Esiur/Resource/Warehouse.cs index 282f752..c7bce57 100644 --- a/Libraries/Esiur/Resource/Warehouse.cs +++ b/Libraries/Esiur/Resource/Warehouse.cs @@ -92,7 +92,7 @@ public class Warehouse public event StoreEvent StoreConnected; public event StoreEvent StoreDisconnected; - public delegate AsyncReply ProtocolInstance(string name, ResourceContext resourceContext); + public delegate AsyncReply ProtocolInstance(string name, IResourceContext resourceContext); public KeyList Protocols { get; } = new KeyList(); @@ -226,7 +226,7 @@ public class Warehouse //IResource r; //if (rk.Value.TryGetTarget(out r)) //{ - var rt = await r.Trigger(ResourceOperation.Initialize); + var rt = await r.Handle(ResourceOperation.Initialize); //if (!rt) // return false; @@ -239,7 +239,7 @@ public class Warehouse foreach (var r in resSnap) { - var rt = await r.Trigger(ResourceOperation.SystemInitialized); + var rt = await r.Handle(ResourceOperation.SystemReady); if (!rt) { Global.Log("Warehouse", LogType.Warning, $"Resource failed at SystemInitialized {r.Instance.Name} [{r.Instance.Definition.Name}]"); @@ -267,13 +267,13 @@ public class Warehouse if (resource.TryGetTarget(out r)) { if (!(r is IStore)) - bag.Add(r.Trigger(ResourceOperation.Terminate)); + bag.Add(r.Handle(ResourceOperation.Terminate)); } } foreach (var store in _stores) - bag.Add(store.Key.Trigger(ResourceOperation.Terminate)); + bag.Add(store.Key.Handle(ResourceOperation.Terminate)); foreach (var resource in _resources.Values) @@ -282,13 +282,13 @@ public class Warehouse if (resource.TryGetTarget(out r)) { if (!(r is IStore)) - bag.Add(r.Trigger(ResourceOperation.SystemTerminated)); + bag.Add(r.Handle(ResourceOperation.SystemTerminated)); } } foreach (var store in _stores) - bag.Add(store.Key.Trigger(ResourceOperation.SystemTerminated)); + bag.Add(store.Key.Handle(ResourceOperation.SystemTerminated)); bag.Seal(); @@ -337,7 +337,7 @@ public class Warehouse /// /// /// Resource instance. - public async AsyncReply Get(string path, ResourceContext resourceContext = null) + public async AsyncReply Get(string path, IResourceContext resourceContext = null) where T : IResource { @@ -385,7 +385,7 @@ public class Warehouse /// Resource instance. /// 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. - public async AsyncReply Put(string path, T resource, ResourceContext resourceContext = null) where T : IResource + public async AsyncReply Put(string path, T resource, IResourceContext resourceContext = null) where T : IResource { if (resource.Instance != null) throw new Exception("Resource already initialized."); @@ -448,9 +448,9 @@ public class Warehouse if (_warehouseIsOpen) { - await resource.Handle(ResourceOperation.Initialize); + await resource.Handle(ResourceOperation.Initialize, resourceContext); if (resource is IStore) - await resource.Handle(ResourceOperation.Open); + await resource.Handle(ResourceOperation.Open, resourceContext); } if (resource is IStore) @@ -551,13 +551,13 @@ public class Warehouse return res; } - public async AsyncReply New(Type type, string path, ResourceContext resourceContext) + public async AsyncReply New(Type type, string path, IResourceContext resourceContext) { var res = Create(type, resourceContext?.Properties); return await Put(path, res, resourceContext); } - public async AsyncReply New(string path, ResourceContext resourceContext = null) + public async AsyncReply New(string path, IResourceContext resourceContext = null) where T : IResource { return (T)(await New(typeof(T), path, resourceContext)); diff --git a/Libraries/Esiur/Stores/MemoryStore.cs b/Libraries/Esiur/Stores/MemoryStore.cs index 9b4a570..554845c 100644 --- a/Libraries/Esiur/Stores/MemoryStore.cs +++ b/Libraries/Esiur/Stores/MemoryStore.cs @@ -67,9 +67,8 @@ public class MemoryStore : IStore return new AsyncReply(true); } - - public AsyncReply Trigger(ResourceOperation trigger) - { + public AsyncReply Handle(ResourceOperation operation, IResourceContext context = null) + { return new AsyncReply(true); } diff --git a/Libraries/Esiur/Stores/TemporaryStore.cs b/Libraries/Esiur/Stores/TemporaryStore.cs index 166b3d2..7a5aa2b 100644 --- a/Libraries/Esiur/Stores/TemporaryStore.cs +++ b/Libraries/Esiur/Stores/TemporaryStore.cs @@ -59,7 +59,7 @@ public class TemporaryStore : IStore return new AsyncReply(null); } - public AsyncReply Trigger(ResourceOperation trigger) + public AsyncReply Handle(ResourceOperation operation, IResourceContext context = null) { return new AsyncReply(true); } diff --git a/Stores/Esiur.Stores.EntityCore/EntityStore.cs b/Stores/Esiur.Stores.EntityCore/EntityStore.cs index 6fc7574..ad2fb8c 100644 --- a/Stores/Esiur.Stores.EntityCore/EntityStore.cs +++ b/Stores/Esiur.Stores.EntityCore/EntityStore.cs @@ -54,7 +54,7 @@ public class EntityStore : IStore Dictionary TypesByName = new Dictionary(); internal Dictionary TypesByType = new Dictionary(); - [Attribute] + //[Attribute] public Func Getter { get; set; } @@ -223,9 +223,9 @@ public class EntityStore : IStore internal DbContextOptions Options { get; set; } - public AsyncReply Trigger(ResourceOperation trigger) + public AsyncReply Handle(ResourceOperation operation, IResourceContext? context = null) { - if (trigger == ResourceOperation.Initialize)// SystemInitialized && DbContext != null) + if (operation == ResourceOperation.Initialize)// SystemInitialized && DbContext != null) { if (Getter == null) diff --git a/Stores/Esiur.Stores.MongoDB/MongoDBStore.cs b/Stores/Esiur.Stores.MongoDB/MongoDBStore.cs index 6587cc1..b1b14de 100644 --- a/Stores/Esiur.Stores.MongoDB/MongoDBStore.cs +++ b/Stores/Esiur.Stores.MongoDB/MongoDBStore.cs @@ -110,7 +110,7 @@ public class MongoDBStore : IStore } [Export] - public AsyncReply Remove(IResource resource) + public AsyncReply Remove(IResource resource) { var objectId = resource.Instance.Variables["objectId"].ToString(); var filter = Builders.Filter.Eq("_id", new BsonObjectId(new ObjectId(objectId))); @@ -515,16 +515,16 @@ public class MongoDBStore : IStore throw new NotImplementedException(); } - [Attribute] + //[Attribute] public string Connection { get; set; } - [Attribute] + //[Attribute] public string Collection { get; set; } - [Attribute] + //[Attribute] public string Database { get; set; } - public AsyncReply Trigger(ResourceOperation trigger) - { - if (trigger == ResourceOperation.Initialize) + public AsyncReply Handle(ResourceOperation operation, IResourceContext context = null) + { + if (operation == ResourceOperation.Initialize) { var collectionName = Collection ?? "resources"; @@ -574,7 +574,7 @@ public class MongoDBStore : IStore return new AsyncReply(true); } - else if (trigger == ResourceOperation.Terminate) + else if (operation == ResourceOperation.Terminate) { // save all resources foreach (var resource in resources.Values) @@ -855,7 +855,7 @@ public class MongoDBStore : IStore } } - + public AsyncReply AddChild(IResource resource, IResource child) { @@ -887,9 +887,9 @@ public class MongoDBStore : IStore throw new NotImplementedException(); } - - + + public AsyncReply Move(IResource resource, string newPath) { throw new NotImplementedException(); diff --git a/Tests/Features/Functional/Program.cs b/Tests/Features/Functional/Program.cs index 6ed32d0..b71b0f4 100644 --- a/Tests/Features/Functional/Program.cs +++ b/Tests/Features/Functional/Program.cs @@ -218,7 +218,7 @@ class Program var auth = new ClientAuthenticationProvider(); wh.RegisterAuthenticationProvider(auth); - var con = await new Warehouse().Get("EP://localhost", new EpConnectionContext + var con = await wh.Get("EP://localhost", new EpConnectionContext { AutoReconnect = true, Identity = "tester",