/// <summary> /// Create the test graph container /// </summary> /// <param name="logger">The logger to use</param> /// <param name="globals">Global meta</param> /// <returns>The new test graph container</returns> public override TestDocument.TestGraphContainer CreateTestGraph(Utils.Logger logger, MetaDictionary globals) { NetGraphFactory factory = _document.Factory; ClientEndpointFactory[] clients = factory.GetNodes <ClientEndpointFactory>(); ServerEndpointFactory[] servers = factory.GetNodes <ServerEndpointFactory>(); if ((clients.Length == 0) || (servers.Length == 0)) { throw new ArgumentException("Graph must have a one client and one server endpoint to perform a test"); } Guid inputNode = _clientToServer ? clients[0].Id : servers[0].Id; Guid outputNode = _clientToServer ? servers[0].Id : clients[0].Id; NetGraph graph = factory.Create(logger, null, globals, new MetaDictionary(), new PropertyBag("Connection")); return(new TestDocument.TestGraphContainer(graph, graph.Nodes[inputNode], graph.Nodes[outputNode])); }
/// <summary> /// Constructor /// </summary> /// <param name="name">Name of the factory</param> /// <param name="factory">Factory</param> /// <param name="direction">Direction of graph</param> /// <param name="containerGraph">The parent graph</param> /// <param name="logger">The logger to use</param> /// <param name="stateDictionary">Forwarded state dictionary</param> /// <param name="linked">If true then we are creating a linked master node</param> public NetGraphContainerNode(string name, NetGraphFactory factory, GraphDirection direction, NetGraph containerGraph, Logger logger, Dictionary<string, object> stateDictionary, bool linked) { var clients = factory.GetNodes<ClientEndpointFactory>(); var servers = factory.GetNodes<ServerEndpointFactory>(); if ((clients.Length > 0) && (servers.Length > 0)) { Guid outputNode = direction == GraphDirection.ClientToServer ? servers[0].Id : clients[0].Id; Guid inputNode = direction == GraphDirection.ClientToServer ? clients[0].Id : servers[0].Id; if (linked) { _graph = factory.Create(name, logger, containerGraph, containerGraph.GlobalMeta, containerGraph.Meta, containerGraph.ConnectionProperties); } else { _graph = factory.CreateFiltered(name, logger, containerGraph, containerGraph.GlobalMeta, containerGraph.Meta, inputNode, containerGraph.ConnectionProperties, stateDictionary); } _graph.BindEndpoint(outputNode, new EventDataAdapter(this)); _inputNode = (PipelineEndpoint)_graph.Nodes[inputNode]; _inputNode.Hidden = true; _outputNode = (PipelineEndpoint)_graph.Nodes[outputNode]; _outputNode.Hidden = true; } else { throw new ArgumentException(CANAPE.Properties.Resources.NetGraphContainerNode_InvalidGraph); } }
/// <summary> /// Constructor /// </summary> /// <param name="name">Name of the factory</param> /// <param name="factory">Factory</param> /// <param name="direction">Direction of graph</param> /// <param name="containerGraph">The parent graph</param> /// <param name="logger">The logger to use</param> /// <param name="stateDictionary">Forwarded state dictionary</param> /// <param name="linked">If true then we are creating a linked master node</param> public NetGraphContainerNode(string name, NetGraphFactory factory, GraphDirection direction, NetGraph containerGraph, Logger logger, Dictionary <string, object> stateDictionary, bool linked) { var clients = factory.GetNodes <ClientEndpointFactory>(); var servers = factory.GetNodes <ServerEndpointFactory>(); if ((clients.Length > 0) && (servers.Length > 0)) { Guid outputNode = direction == GraphDirection.ClientToServer ? servers[0].Id : clients[0].Id; Guid inputNode = direction == GraphDirection.ClientToServer ? clients[0].Id : servers[0].Id; if (linked) { _graph = factory.Create(name, logger, containerGraph, containerGraph.GlobalMeta, containerGraph.Meta, containerGraph.ConnectionProperties); } else { _graph = factory.CreateFiltered(name, logger, containerGraph, containerGraph.GlobalMeta, containerGraph.Meta, inputNode, containerGraph.ConnectionProperties, stateDictionary); } _graph.BindEndpoint(outputNode, new EventDataAdapter(this)); _inputNode = (PipelineEndpoint)_graph.Nodes[inputNode]; _inputNode.Hidden = true; _outputNode = (PipelineEndpoint)_graph.Nodes[outputNode]; _outputNode.Hidden = true; } else { throw new ArgumentException(CANAPE.Properties.Resources.NetGraphContainerNode_InvalidGraph); } }
/// <summary> /// Connect client /// </summary> /// <param name="baseAdapter"></param> /// <param name="connProperties"></param> /// <returns></returns> public NetGraph ConnectClient(IDataAdapter baseAdapter, PropertyBag connProperties) { IDataAdapter server = null; IDataAdapter client = null; ProxyToken token = null; NetGraph graph = null; NetGraph retGraph = null; MetaDictionary meta = new MetaDictionary(); PropertyBag properties = new PropertyBag("Properties"); try { properties.AddBag(connProperties); token = _proxyServer.Accept(baseAdapter, meta, _globalMeta, this); if (token != null) { token = FilterToken(token); if (token.Status == NetStatusCodes.Success) { ProxyClient proxyClient = token.Client ?? _proxyClient; if (token.Bind) { client = proxyClient.Bind(token, _logger, meta, _globalMeta, properties.AddBag("Client")); } else { client = proxyClient.Connect(token, _logger, meta, _globalMeta, properties.AddBag("Client")); } server = _proxyServer.Complete(token, meta, _globalMeta, this, client); if ((token.Status == NetStatusCodes.Success) && (client != null)) { NetGraphFactory factory = token.Graph != null ? token.Graph : _factory; token.PopulateBag(properties.AddBag("Token")); // Negotiate SSL or other bespoke encryption mechanisms if (token.Layers != null) { foreach (INetworkLayer layer in token.Layers) { layer.Negotiate(ref server, ref client, token, _logger, meta, _globalMeta, properties, DefaultBinding); } } var clients = factory.GetNodes <ClientEndpointFactory>(); var servers = factory.GetNodes <ServerEndpointFactory>(); if ((clients.Length > 0) && (servers.Length > 0)) { graph = CreateNetGraph(factory, meta, properties); graph.BindEndpoint(clients[0].Id, client); graph.BindEndpoint(servers[0].Id, server); if (token.NetworkDescription != null) { graph.NetworkDescription = token.NetworkDescription; } else { graph.NetworkDescription = String.Format("{0} <=> {1}", server.Description, client.Description); } PropertyBag networkService = properties.AddBag("NetworkService"); networkService.AddValue("ClientId", clients[0].Id); networkService.AddValue("ServerId", servers[0].Id); networkService.AddValue("ClientAdapter", client); networkService.AddValue("ServerAdapter", server); networkService.AddValue("Token", token); graph.Start(); OnNewConnection(graph); retGraph = graph; } else { _logger.LogError(CANAPE.Net.Properties.Resources.ProxyNetworkService_InvalidGraph); } } } else { _logger.LogVerbose(CANAPE.Net.Properties.Resources.ProxyNetworkService_ConnectionFiltered); server = _proxyServer.Complete(token, meta, _globalMeta, this, client); } } } catch (Exception ex) { _logger.LogException(ex); } finally { if (retGraph == null) { try { if (graph != null) { ((IDisposable)graph).Dispose(); } if (server != null) { server.Dispose(); } if (client != null) { client.Dispose(); } if (token != null) { token.Dispose(); } } catch (Exception ex) { Logger.SystemLogger.LogException(ex); } } } return(retGraph); }