Beispiel #1
0
        public RoamingNetworkInfo(Tracker_Id TrackerId,
                                  String IncomingURI,
                                  DateTime ExpiredAfter,

                                  RoamingNetwork_Id RoamingNetworkId,
                                  Byte priority,
                                  Byte weight,
                                  String hostname,
                                  IPPort port,
                                  TransportTypes transport,
                                  String uriPrefix,
                                  HTTPContentType contentType,
                                  ProtocolTypes protocolType,
                                  IEnumerable <String> PublicKeys)
        {
            this.TrackerId    = TrackerId;
            this.IncomingURI  = IncomingURI;
            this.ExpiredAfter = ExpiredAfter;

            this.RoamingNetworkId = RoamingNetworkId;

            this.priority     = priority;
            this.weight       = weight;
            this.hostname     = hostname;
            this.port         = port;
            this.transport    = transport;
            this.uriPrefix    = uriPrefix;
            this.contentType  = contentType;
            this.protocolType = protocolType;
            this.publicKeys   = PublicKeys;

            this.AnnouncedURI = String.Concat(transport, "://", hostname, ":", port, uriPrefix, "_", contentType);
        }
Beispiel #2
0
        public void Test0()
        {
            var _rn = new RoamingNetwork(RoamingNetwork_Id.Parse("Test1"));
            var _op = _rn.CreateChargingStationOperator(ChargingStationOperator_Id.Parse("DE*822"));
            var _cp = _op.CreateChargingPool();

            _cp.StatusAggregationDelegate = report => {
                var max   = report.Max(v => v.Value);
                var max_n = report.Where(o => o.Value == max);
                return((ChargingPoolStatusTypes)max_n.OrderBy(o => o.Key).First().Key);
            };
            _cp.OnStatusChanged += async(ts, EventTrackingId, pool, os, ns) => { Console.WriteLine("New pool state: " + ns.Value); };

            var s1 = _cp.CreateChargingStation(ChargingStation_Id.Random(_op.Id));

            s1.StatusAggregationDelegate = report => {
                var max   = report.Max(v => v.Value);
                var max_n = report.Where(o => o.Value == max);
                return((ChargingStationStatusTypes)max_n.OrderBy(o => o.Key).First().Key);
            };
            s1.OnStatusChanged += async(ts, EventTrackingId, sta, os, ns) => { Console.WriteLine("New station #1 state: " + ns.Value); };

            var e1 = s1.CreateEVSE(EVSE_Id.Parse("DE*822*E1111*1"));
            var e2 = s1.CreateEVSE(EVSE_Id.Parse("DE*822*E1111*2"));
            var e3 = s1.CreateEVSE(EVSE_Id.Parse("DE*822*E1111*3"));
            var s2 = _cp.CreateChargingStation(ChargingStation_Id.Random(_op.Id));

            s2.StatusAggregationDelegate = report => {
                var max   = report.Max(v => v.Value);
                var max_n = report.Where(o => o.Value == max);
                return((ChargingStationStatusTypes)max_n.OrderBy(o => o.Key).First().Key);
            };
            s2.OnStatusChanged += async(ts, EventTrackingId, sta, os, ns) => { Console.WriteLine("New station #2 state: " + ns.Value); };

            var f1 = s2.CreateEVSE(EVSE_Id.Parse("DE*822*E2222*1"));
            var f2 = s2.CreateEVSE(EVSE_Id.Parse("DE*822*E2222*2"));
            var f3 = s2.CreateEVSE(EVSE_Id.Parse("DE*822*E2222*3"));


            e1.Status = EVSEStatusTypes.Available;
            e2.Status = EVSEStatusTypes.Available;
            e3.Status = EVSEStatusTypes.Available;

            f1.Status = EVSEStatusTypes.Available;
            f2.Status = EVSEStatusTypes.Available;
            f3.Status = EVSEStatusTypes.Available;

            e2.Status = EVSEStatusTypes.Charging;
            e3.Status = EVSEStatusTypes.Charging;
        }
Beispiel #3
0
        public void SendOnForwardingChanged(DateTime Timestamp,
                                            ImporterForwardingInfo ForwardingInfo,
                                            RoamingNetwork_Id OldRN,
                                            RoamingNetwork_Id NewRN)
        {
            SaveForwardingDataToFile();

            var OnForwardingChangedLocal = OnForwardingChanged;

            if (OnForwardingChangedLocal != null)
            {
                OnForwardingChangedLocal(Timestamp, this, ForwardingInfo, OldRN, NewRN);
            }
        }
Beispiel #4
0
        public Tracker RemoveRoamingNetwork(RoamingNetwork_Id RoamingNetworkId)
        {
            #region Initial checks

            if (RoamingNetworkId == null)
            {
                throw new ArgumentNullException(nameof(RoamingNetworkId), "The given roaming network identification must not be null!");
            }

            #endregion

            //RoamingNetwork _RoamingNetwork = null;

            //if (!_LocalRoamingNetworks.TryRemove(RoamingNetworkId, out _RoamingNetwork))
            //    throw new ArgumentException("The given roaming network could not be removed!");

            return(this);
        }
        public void GET_and_COUNT()
        {
            #region Verify GET   /RNs

            var URI = HTTPPath.Parse("/RNs");

            using (var HTTPTask = _HTTPClient.Execute(client => client.GET(URI,
                                                                           requestbuilder => {
                requestbuilder.Host = HTTPHostname.Localhost;
                requestbuilder.ContentType = HTTPContentType.JSON_UTF8;
                requestbuilder.Accept.Add(HTTPContentType.JSON_UTF8);
            }),
                                                      RequestTimeout: Timeout,
                                                      CancellationToken: new CancellationTokenSource().Token))

            {
                HTTPTask.Wait(Timeout);

                using (var HTTPResult = HTTPTask.Result)
                {
                    Assert.AreEqual(HTTPStatusCode.OK, HTTPResult.HTTPStatusCode, "'GET " + URI + "' failed! " + HTTPResult.HTTPBody.ToUTF8String());
                    Assert.AreEqual(new JArray().ToString(),
                                    JArray.Parse(HTTPResult.HTTPBody.ToUTF8String()).ToString(),
                                    "Invalid response for 'GET " + URI + "'!");
                }
            }

            #endregion

            #region Verify COUNT /RNs

            using (var HTTPTask = _HTTPClient.Execute(client => client.COUNT(URI,
                                                                             requestbuilder => {
                requestbuilder.Host = HTTPHostname.Localhost;
                requestbuilder.ContentType = HTTPContentType.JSON_UTF8;
                requestbuilder.Accept.Add(HTTPContentType.JSON_UTF8);
            }),
                                                      RequestTimeout: Timeout,
                                                      CancellationToken: new CancellationTokenSource().Token))

            {
                HTTPTask.Wait(Timeout);

                using (var HTTPResult = HTTPTask.Result)
                {
                    Assert.AreEqual(HTTPStatusCode.OK, HTTPResult.HTTPStatusCode, "'GET " + URI + "' failed! " + HTTPResult.HTTPBody.ToUTF8String());
                    Assert.AreEqual(new JObject(new JProperty("count", 0)).ToString(),
                                    JObject.Parse(HTTPResult.HTTPBody.ToUTF8String()).ToString(),
                                    "Invalid response for 'COUNT " + URI + "'!");
                }
            }

            #endregion


            var RN_1 = WWCPAPI.CreateNewRoamingNetwork(Id:  RoamingNetwork_Id.Parse("TEST_RN1"),
                                                       Name:              I18NString.Create(Languages.deu, "Test Roaming Netz 1").
                                                       Add(Languages.eng, "Test roaming network 1"));

            var RN_2 = WWCPAPI.CreateNewRoamingNetwork(Id:  RoamingNetwork_Id.Parse("TEST_RN2"),
                                                       Name:              I18NString.Create(Languages.deu, "Test Roaming Netz 2").
                                                       Add(Languages.eng, "Test roaming network 2"));

            var RN_3 = WWCPAPI.CreateNewRoamingNetwork(Id:  RoamingNetwork_Id.Parse("TEST_RN3"),
                                                       Name:              I18NString.Create(Languages.deu, "Test Roaming Netz 3").
                                                       Add(Languages.eng, "Test roaming network 3"));

            var RN_4 = WWCPAPI.CreateNewRoamingNetwork(Id:  RoamingNetwork_Id.Parse("TEST_RN4"),
                                                       Name:              I18NString.Create(Languages.deu, "Test Roaming Netz 4").
                                                       Add(Languages.eng, "Test roaming network 4"));


            #region Verify GET   /RNs

            URI = HTTPPath.Parse("/RNs");

            using (var HTTPTask = _HTTPClient.Execute(client => client.GET(URI,
                                                                           requestbuilder => {
                requestbuilder.Host = HTTPHostname.Localhost;
                requestbuilder.ContentType = HTTPContentType.JSON_UTF8;
                requestbuilder.Accept.Add(HTTPContentType.JSON_UTF8);
            }),
                                                      RequestTimeout: Timeout,
                                                      CancellationToken: new CancellationTokenSource().Token))

            {
                HTTPTask.Wait(Timeout);

                using (var HTTPResult = HTTPTask.Result)
                {
                    Assert.AreEqual(HTTPStatusCode.OK, HTTPResult.HTTPStatusCode, "'GET " + URI + "' failed! " + HTTPResult.HTTPBody.ToUTF8String());
                    Assert.AreEqual(new JArray(
                                        new JObject(new JProperty("RoamingNetworkId", "TEST_RN1"),
                                                    new JProperty("description", new JObject(new JProperty("de", "Test Roaming Netz 1"),
                                                                                             new JProperty("en", "Test roaming network 1")))),
                                        new JObject(new JProperty("RoamingNetworkId", "TEST_RN2"),
                                                    new JProperty("description", new JObject(new JProperty("de", "Test Roaming Netz 2"),
                                                                                             new JProperty("en", "Test roaming network 2")))),
                                        new JObject(new JProperty("RoamingNetworkId", "TEST_RN3"),
                                                    new JProperty("description", new JObject(new JProperty("de", "Test Roaming Netz 3"),
                                                                                             new JProperty("en", "Test roaming network 3")))),
                                        new JObject(new JProperty("RoamingNetworkId", "TEST_RN4"),
                                                    new JProperty("description", new JObject(new JProperty("de", "Test Roaming Netz 4"),
                                                                                             new JProperty("en", "Test roaming network 4"))))
                                        ).ToString(),
                                    JArray.Parse(HTTPResult.HTTPBody.ToUTF8String()).ToString(),
                                    "Invalid response for 'GET " + URI + "'!");
                }
            }

            #endregion

            #region Verify COUNT /RNs

            using (var HTTPTask = _HTTPClient.Execute(client => client.COUNT(URI,
                                                                             requestbuilder => {
                requestbuilder.Host = HTTPHostname.Localhost;
                requestbuilder.ContentType = HTTPContentType.JSON_UTF8;
                requestbuilder.Accept.Add(HTTPContentType.JSON_UTF8);
            }),
                                                      RequestTimeout: Timeout,
                                                      CancellationToken: new CancellationTokenSource().Token))

            {
                HTTPTask.Wait(Timeout);

                using (var HTTPResult = HTTPTask.Result)
                {
                    Assert.AreEqual(HTTPStatusCode.OK, HTTPResult.HTTPStatusCode, "'GET " + URI + "' failed! " + HTTPResult.HTTPBody.ToUTF8String());
                    Assert.AreEqual(new JObject(new JProperty("count", 4)).ToString(),
                                    JObject.Parse(HTTPResult.HTTPBody.ToUTF8String()).ToString(),
                                    "Invalid response for 'COUNT " + URI + "'!");
                }
            }

            #endregion

            #region Verify GET   /RNs?skip=2

            URI = HTTPPath.Parse("/RNs?skip=2");

            using (var HTTPTask = _HTTPClient.Execute(client => client.GET(URI,
                                                                           requestbuilder => {
                requestbuilder.Host = HTTPHostname.Localhost;
                requestbuilder.ContentType = HTTPContentType.JSON_UTF8;
                requestbuilder.Accept.Add(HTTPContentType.JSON_UTF8);
            }),
                                                      RequestTimeout: Timeout,
                                                      CancellationToken: new CancellationTokenSource().Token))

            {
                HTTPTask.Wait(Timeout);

                using (var HTTPResult = HTTPTask.Result)
                {
                    Assert.AreEqual(HTTPStatusCode.OK, HTTPResult.HTTPStatusCode, "'GET " + URI + "' failed! " + HTTPResult.HTTPBody.ToUTF8String());
                    Assert.AreEqual(new JArray(
                                        new JObject(new JProperty("RoamingNetworkId", "TEST_RN3"),
                                                    new JProperty("description", new JObject(new JProperty("de", "Test Roaming Netz 3"),
                                                                                             new JProperty("en", "Test roaming network 3")))),
                                        new JObject(new JProperty("RoamingNetworkId", "TEST_RN4"),
                                                    new JProperty("description", new JObject(new JProperty("de", "Test Roaming Netz 4"),
                                                                                             new JProperty("en", "Test roaming network 4"))))
                                        ).ToString(),
                                    JArray.Parse(HTTPResult.HTTPBody.ToUTF8String()).ToString(),
                                    "Invalid response for 'GET " + URI + "'!");
                }
            }

            #endregion

            #region Verify GET   /RNs?take=2

            URI = HTTPPath.Parse("/RNs?take=2");

            using (var HTTPTask = _HTTPClient.Execute(client => client.GET(URI,
                                                                           requestbuilder => {
                requestbuilder.Host = HTTPHostname.Localhost;
                requestbuilder.ContentType = HTTPContentType.JSON_UTF8;
                requestbuilder.Accept.Add(HTTPContentType.JSON_UTF8);
            }),
                                                      RequestTimeout: Timeout,
                                                      CancellationToken: new CancellationTokenSource().Token))

            {
                HTTPTask.Wait(Timeout);

                using (var HTTPResult = HTTPTask.Result)
                {
                    Assert.AreEqual(HTTPStatusCode.OK, HTTPResult.HTTPStatusCode, "'GET " + URI + "' failed! " + HTTPResult.HTTPBody.ToUTF8String());
                    Assert.AreEqual(new JArray(
                                        new JObject(new JProperty("RoamingNetworkId", "TEST_RN1"),
                                                    new JProperty("description", new JObject(new JProperty("de", "Test Roaming Netz 1"),
                                                                                             new JProperty("en", "Test roaming network 1")))),
                                        new JObject(new JProperty("RoamingNetworkId", "TEST_RN2"),
                                                    new JProperty("description", new JObject(new JProperty("de", "Test Roaming Netz 2"),
                                                                                             new JProperty("en", "Test roaming network 2"))))
                                        ).ToString(),
                                    JArray.Parse(HTTPResult.HTTPBody.ToUTF8String()).ToString(),
                                    "Invalid response for 'GET " + URI + "'!");
                }
            }

            #endregion

            #region Verify GET   /RNs?skip=1&take=2

            URI = HTTPPath.Parse("/RNs?skip=1&take=2");

            using (var HTTPTask = _HTTPClient.Execute(client => client.GET(URI,
                                                                           requestbuilder => {
                requestbuilder.Host = HTTPHostname.Localhost;
                requestbuilder.ContentType = HTTPContentType.JSON_UTF8;
                requestbuilder.Accept.Add(HTTPContentType.JSON_UTF8);
            }),
                                                      RequestTimeout: Timeout,
                                                      CancellationToken: new CancellationTokenSource().Token))

            {
                HTTPTask.Wait(Timeout);

                using (var HTTPResult = HTTPTask.Result)
                {
                    Assert.AreEqual(HTTPStatusCode.OK, HTTPResult.HTTPStatusCode, "'GET " + URI + "' failed! " + HTTPResult.HTTPBody.ToUTF8String());
                    Assert.AreEqual(new JArray(
                                        new JObject(new JProperty("RoamingNetworkId", "TEST_RN2"),
                                                    new JProperty("description", new JObject(new JProperty("de", "Test Roaming Netz 2"),
                                                                                             new JProperty("en", "Test roaming network 2")))),
                                        new JObject(new JProperty("RoamingNetworkId", "TEST_RN3"),
                                                    new JProperty("description", new JObject(new JProperty("de", "Test Roaming Netz 3"),
                                                                                             new JProperty("en", "Test roaming network 3"))))
                                        ).ToString(),
                                    JArray.Parse(HTTPResult.HTTPBody.ToUTF8String()).ToString(),
                                    "Invalid response for 'GET " + URI + "'!");
                }
            }

            #endregion

            #region Verify GET   /RNs?skip=8

            URI = HTTPPath.Parse("/RNs?skip=8");

            using (var HTTPTask = _HTTPClient.Execute(client => client.GET(URI,
                                                                           requestbuilder => {
                requestbuilder.Host = HTTPHostname.Localhost;
                requestbuilder.ContentType = HTTPContentType.JSON_UTF8;
                requestbuilder.Accept.Add(HTTPContentType.JSON_UTF8);
            }),
                                                      RequestTimeout: Timeout,
                                                      CancellationToken: new CancellationTokenSource().Token))

            {
                HTTPTask.Wait(Timeout);

                using (var HTTPResult = HTTPTask.Result)
                {
                    Assert.AreEqual(HTTPStatusCode.OK, HTTPResult.HTTPStatusCode, "'GET " + URI + "' failed! " + HTTPResult.HTTPBody.ToUTF8String());
                    Assert.AreEqual(new JArray().ToString(),
                                    JArray.Parse(HTTPResult.HTTPBody.ToUTF8String()).ToString(),
                                    "Invalid response for 'GET " + URI + "'!");
                }
            }

            #endregion


            #region Verify GET   /RNs/TEST_RN1

            URI = HTTPPath.Parse("/RNs/TEST_RN1");

            using (var HTTPTask = _HTTPClient.Execute(client => client.GET(URI,
                                                                           requestbuilder => {
                requestbuilder.Host = HTTPHostname.Localhost;
                requestbuilder.ContentType = HTTPContentType.JSON_UTF8;
                requestbuilder.Accept.Add(HTTPContentType.JSON_UTF8);
            }),
                                                      RequestTimeout: Timeout,
                                                      CancellationToken: new CancellationTokenSource().Token))

            {
                HTTPTask.Wait(Timeout);

                using (var HTTPResult = HTTPTask.Result)
                {
                    Assert.AreEqual(HTTPStatusCode.OK, HTTPResult.HTTPStatusCode, "'GET " + URI + "' failed! " + HTTPResult.HTTPBody.ToUTF8String());
                    Assert.AreEqual(new JObject(new JProperty("RoamingNetworkId", "TEST_RN1"),
                                                new JProperty("description", new JObject(new JProperty("de", "Test Roaming Netz 1"),
                                                                                         new JProperty("en", "Test roaming network 1")))
                                                ).ToString(),
                                    JObject.Parse(HTTPResult.HTTPBody.ToUTF8String()).ToString(),
                                    "Invalid response for 'GET " + URI + "'!");
                }
            }

            #endregion
        }
Beispiel #6
0
        public WWCPImporter <T> LoadForwardingDataFromFile()
        {
            lock (ImporterRunLock)
            {
                var CurrentDirectory = Directory.GetCurrentDirectory();
                var ConfigFilename   = Directory.EnumerateFiles(CurrentDirectory).
                                       Select(file => file.Remove(0, CurrentDirectory.Length + 1)).
                                       Where(file => file.StartsWith(ForwardingFilenamePrefix, StringComparison.Ordinal)).
                                       OrderByDescending(file => file).
                                       FirstOrDefault();

                var InputFile = ConfigFilename.IsNotNullOrEmpty()
                                            ? ConfigFilename
                                            : ForwardingFilenamePrefix + ".json";

                if (File.Exists(InputFile))
                {
                    #region Try to read JSON from file...

                    JObject JSONConfig;

                    try
                    {
                        JSONConfig = JObject.Parse(File.ReadAllText(InputFile));
                    }
                    catch (Exception)
                    {
                        throw new ApplicationException("Could not read '" + InputFile + "'!");
                    }

                    #endregion

                    try
                    {
                        foreach (var CurrentRoamingNetwork in JSONConfig)
                        {
                            var CurrentRoamingNetworkId = RoamingNetwork_Id.Parse(CurrentRoamingNetwork.Key);

                            //var CurrentEVSEOperator      = ChargingStationOperators.FirstOrDefault(evseoperator => evseoperator.RoamingNetwork.Id == CurrentRoamingNetworkId);

                            //if (CurrentEVSEOperator == null)
                            //    throw new ApplicationException("Could not find any charging station operator for roaming network '" + CurrentRoamingNetworkId + "'!");

                            var CurrentRoamingNetworkJObject = CurrentRoamingNetwork.Value as JObject;

                            if (CurrentRoamingNetworkJObject != null)
                            {
                                foreach (var ChargingStationGroups in CurrentRoamingNetworkJObject)
                                {
                                    switch (ChargingStationGroups.Key.ToLower())
                                    {
                                        #region ValidChargingStations

                                    case "validchargingstations":

                                        (ChargingStationGroups.Value as JObject).GetEnumerator().
                                        ConsumeAll().
                                        OrderBy(KVP => KVP.Key).
                                        ForEach(StationConfig => {
                                            ChargingStation_Id ChargingStationId;

                                            if (ChargingStation_Id.TryParse(StationConfig.Key, out ChargingStationId))
                                            {
                                                var CurrentEVSEOperator = GetChargingStationOperators(ChargingStationId)?.
                                                                          FirstOrDefault(cso => cso != null &&
                                                                                         cso.RoamingNetwork.Id == CurrentRoamingNetworkId);

                                                if (CurrentEVSEOperator != null)
                                                {
                                                    JToken JSONToken2;
                                                    String PhoneNumber  = null;
                                                    var CurrentSettings = StationConfig.Value as JObject;

                                                    #region PhoneNumber

                                                    //if (CurrentSettings.TryGetValue("PhoneNumber", out JSONToken2))
                                                    //{
                                                    //    PhoneNumber = JSONToken2.Value<String>();
                                                    //}

                                                    #endregion

                                                    #region AdminStatus

                                                    var AdminStatus = ChargingStationAdminStatusTypes.Operational;

                                                    if (CurrentSettings.TryGetValue("Adminstatus", out JSONToken2) &&
                                                        !Enum.TryParse(JSONToken2.Value <String>(), true, out AdminStatus))
                                                    {
                                                        DebugX.Log("Invalid admin status '" + JSONToken2.Value <String>() + "' for charging station '" + ChargingStationId + "'!");
                                                    }

                                                    #endregion

                                                    #region Group

                                                    if (CurrentSettings.TryGetValue("Group", out JSONToken2))
                                                    {
                                                        var JV = JSONToken2 as JValue;
                                                        var JA = JSONToken2 as JArray;

                                                        var GroupList = JV != null
                                                                                    ? new String[] { JV.Value <String>() }
                                                                                    : JA != null
                                                                                        ? JA.AsEnumerable().Select(v => v.Value <String>())
                                                                                        : null;

                                                        if (GroupList != null)
                                                        {
                                                            foreach (var GroupId in GroupList)
                                                            {
                                                                CurrentEVSEOperator.
                                                                GetOrCreateChargingStationGroup(GroupId,
                                                                                                I18NString.Create(Languages.deu, GroupId)).
                                                                Add(ChargingStationId);
                                                            }
                                                        }
                                                    }

                                                    #endregion

                                                    if (!_AllForwardingInfos.ContainsKey(ChargingStationId))
                                                    {
                                                        _AllForwardingInfos.Add(ChargingStationId,
                                                                                new ImporterForwardingInfo(
                                                                                    OnChangedCallback:          SendOnForwardingChanged,
                                                                                    ChargingStationOperators:   GetChargingStationOperators(ChargingStationId),
                                                                                    StationId:                  ChargingStationId,
                                                                                    StationName:                "",
                                                                                    StationServiceTag:          "",
                                                                                    StationAddress:             null,        //new Address(),
                                                                                    StationGeoCoordinate:       null,
                                                                                    PhoneNumber:                PhoneNumber,
                                                                                    AdminStatus:                AdminStatus,
                                                                                    Created:                    DateTime.UtcNow,
                                                                                    OutOfService:               true,
                                                                                    ForwardedToOperator:        CurrentEVSEOperator)
                                                                                );
                                                    }
                                                }
                                            }
                                        });

                                        break;

                                        #endregion
                                    }
                                }
                            }
                        }
                    }

                    catch (Exception e)
                    {
                        DebugX.Log("LoadForwardingDataFromFile failed: " + e.Message);
                    }
                }

                else
                {
                    throw new ApplicationException("Config file '" + ForwardingFilenamePrefix + "' does not exist!");
                }


                OnLoadForwardingDataFromFileFinished?.Invoke(DateTime.UtcNow,
                                                             this,
                                                             InputFile,
                                                             (UInt64)_AllForwardingInfos.Count);
            }

            return(this);
        }
        public void Test_ChargingPools()
        {

            var HTTPClient = new HTTPClient(IPv4Address.Localhost,
                                            RemotePort: IPPort.Parse(8000),
                                            DNSClient:  HTTPAPI.DNSClient);


            var RN      = OpenChargingCloudAPI.CreateNewRoamingNetwork(Id:   RoamingNetwork_Id.Parse("TEST_RN1"),
                                                                       Name: I18NString.Create(Languages.deu,  "Test Roaming Netz 1").
                                                                                           Add(Languages.eng,  "Test roaming network 1"));

            var CPO     = RN.CreateChargingStationOperator(ChargingStationOperatorId:  ChargingStationOperator_Id.Parse("DE*GEF"),
                                                   Name:            I18NString.Create(Languages.deu, "GraphDefined"),
                                                   Description:     I18NString.Create(Languages.deu, "GraphDefined EVSE Operator"),
                                                   Configurator:    evseoperator => {
                                                                        evseoperator.AddDataLicense(DataLicense.OpenDatabaseLicense);
                                                                    });

            #region Verify GET /RNs/TEST_RN1/ChargingPools

            var URI = HTTPPath.Parse("/RNs/TEST_RN1/ChargingPools");

            using (var HTTPTask  = HTTPClient.Execute(client => client.GET(URI,
                                                                           requestbuilder => {
                                                                               requestbuilder.Host         = HTTPHostname.Localhost;
                                                                               requestbuilder.ContentType  = HTTPContentType.JSON_UTF8;
                                                                               requestbuilder.Accept.Add(HTTPContentType.JSON_UTF8);
                                                                           }),
                                                                            RequestTimeout: Timeout,
                                                                            CancellationToken: new CancellationTokenSource().Token))

            {

                HTTPTask.Wait(Timeout);

                using (var HTTPResult = HTTPTask.Result)
                {

                    Assert.AreEqual(HTTPStatusCode.OK, HTTPResult.HTTPStatusCode, "'GET " + URI + "' failed!");
                    Assert.AreEqual(new JArray().ToString(),
                                    JArray.Parse(HTTPResult.HTTPBody.ToUTF8String()).ToString(),
                                    "Invalid response for 'GET " + URI + "'!");

                }

            }

            #endregion

            #region Verify COUNT /RNs/TEST_RN1/ChargingPools

            using (var HTTPTask  = HTTPClient.Execute(client => client.COUNT(URI,
                                                                             requestbuilder => {
                                                                                 requestbuilder.Host         = HTTPHostname.Localhost;
                                                                                 requestbuilder.ContentType  = HTTPContentType.JSON_UTF8;
                                                                                 requestbuilder.Accept.Add(HTTPContentType.JSON_UTF8);
                                                                             }),
                                                                              RequestTimeout: Timeout,
                                                                              CancellationToken: new CancellationTokenSource().Token))

            {

                HTTPTask.Wait(Timeout);

                using (var HTTPResult = HTTPTask.Result)
                {

                    Assert.AreEqual(HTTPStatusCode.OK, HTTPResult.HTTPStatusCode, "'GET " + URI + "' failed!");
                    Assert.AreEqual(new JObject(new JProperty("count", 0)).ToString(),
                                    JObject.Parse(HTTPResult.HTTPBody.ToUTF8String()).ToString(),
                                    "Invalid response for 'COUNT " + URI + "'!");

                }

            }

            #endregion


            var Pool_1  = CPO.CreateChargingPool(ChargingPool_Id.Parse(CPO.Id, "1111"),
                                                 pool => {
                                                     pool.Address = Address.Create(Country.Austria,
                                                                                   "07741",
                                                                                   I18NString.Create(Languages.deu, "Wien"),
                                                                                   "Hofplatz", "17");
                                                 });

            var Pool_2  = CPO.CreateChargingPool(ChargingPool_Id.Parse(CPO.Id, "2222"),
                                                 pool => {
                                                     pool.Address = Address.Create(Country.Germany,
                                                                                   "07749",
                                                                                   I18NString.Create(Languages.deu, "Jena"),
                                                                                   "Biberweg", "18");
                                                 });

            var Pool_3  = CPO.CreateChargingPool(ChargingPool_Id.Parse(CPO.Id, "3333"),
                                                 pool => {
                                                     pool.Address = Address.Create(Country.Belgium,
                                                                                   "07758",
                                                                                   I18NString.Create(Languages.bgn, "Brussels"),
                                                                                   "Avenue", "19");
                                                 });


            #region Verify GET   /RNs/TEST_RN1/ChargingPools

            URI = HTTPPath.Parse("/RNs/TEST_RN1/ChargingPools");

            using (var HTTPTask  = HTTPClient.Execute(client => client.GET(URI,
                                                                           requestbuilder => {
                                                                               requestbuilder.Host         = HTTPHostname.Localhost;
                                                                               requestbuilder.ContentType  = HTTPContentType.JSON_UTF8;
                                                                               requestbuilder.Accept.Add(HTTPContentType.JSON_UTF8);
                                                                           }),
                                                                            RequestTimeout: Timeout,
                                                                            CancellationToken: new CancellationTokenSource().Token))

            {

                HTTPTask.Wait(Timeout);

                using (var HTTPResult = HTTPTask.Result)
                {

                    Assert.AreEqual(HTTPStatusCode.OK, HTTPResult.HTTPStatusCode, "'GET " + URI + "' failed!");
                    Assert.AreEqual(new JArray(

                                        new JObject(new JProperty("ChargingPoolId",   "DE*GEF*P1111"),
                                                    new JProperty("OperatorId",       "DE*GEF"),
                                                    new JProperty("Address",
                                                        new JObject(new JProperty("houseNumber",  "17"),
                                                                    new JProperty("street",       "Hofplatz"),
                                                                    new JProperty("postalCode",   "07741"),
                                                                    new JProperty("city",
                                                                        new JObject(new JProperty("de", "Wien"))
                                                                    ),
                                                                    new JProperty("country",
                                                                        new JObject(new JProperty("en", "Austria"))
                                                                    )
                                                   )),
                                                   new JProperty("ChargingStations",  new JArray())
                                                   ),

                                        new JObject(new JProperty("ChargingPoolId",   "DE*GEF*P2222"),
                                                    new JProperty("OperatorId",       "DE*GEF"),
                                                    new JProperty("Address",
                                                        new JObject(new JProperty("houseNumber",  "18"),
                                                                    new JProperty("street",       "Biberweg"),
                                                                    new JProperty("postalCode",   "07749"),
                                                                    new JProperty("city",
                                                                        new JObject(new JProperty("de", "Jena")
                                                                    )),
                                                                    new JProperty("country",
                                                                        new JObject(
                                                                            new JProperty("en",  "Germany"),
                                                                            new JProperty("de",  "Deutschland")
                                                                        )
                                                                    )
                                                   )),
                                                   new JProperty("ChargingStations",  new JArray())
                                                   ),

                                        new JObject(new JProperty("ChargingPoolId",   "DE*GEF*P3333"),
                                                    new JProperty("OperatorId",       "DE*GEF"),
                                                    new JProperty("Address",
                                                        new JObject(new JProperty("houseNumber",  "19"),
                                                                    new JProperty("street",       "Avenue"),
                                                                    new JProperty("postalCode",   "07758"),
                                                                    new JProperty("city",
                                                                        new JObject(new JProperty("be", "Brussels"))
                                                                    ),
                                                                    new JProperty("country",
                                                                        new JObject(new JProperty("en", "Belgium"))
                                                                    )
                                                   )),
                                                   new JProperty("ChargingStations",  new JArray())
                                                   )

                                    ).ToString(),

                                    JArray.Parse(HTTPResult.HTTPBody.ToUTF8String()).ToString(),
                                    "Invalid response for 'GET " + URI + "'!");

                }

            }

            #endregion

            #region Verify COUNT /RNs/TEST_RN1/ChargingPools

            using (var HTTPTask = HTTPClient.Execute(client => client.COUNT(URI,
                                                                            requestbuilder => {
                                                                                requestbuilder.Host         = HTTPHostname.Localhost;
                                                                                requestbuilder.ContentType  = HTTPContentType.JSON_UTF8;
                                                                                requestbuilder.Accept.Add(HTTPContentType.JSON_UTF8);
                                                                            }),
                                                                              RequestTimeout: Timeout,
                                                                              CancellationToken: new CancellationTokenSource().Token))

            {

                HTTPTask.Wait(Timeout);

                using (var HTTPResult = HTTPTask.Result)
                {

                    Assert.AreEqual(HTTPStatusCode.OK, HTTPResult.HTTPStatusCode, "'GET " + URI + "' failed!");
                    Assert.AreEqual(new JObject(new JProperty("count", 3)).ToString(),
                                    JObject.Parse(HTTPResult.HTTPBody.ToUTF8String()).ToString(),
                                    "Invalid response for 'COUNT " + URI + "'!");

                }

            }

            #endregion


        }
        /// <summary>
        /// Parse the given HTTP request and return the roaming network
        /// for the given HTTP hostname and HTTP query parameter
        /// or an HTTP error response.
        /// </summary>
        /// <param name="HTTPRequest">A HTTP request.</param>
        /// <param name="HTTPServer">A HTTP server.</param>
        /// <param name="RoamingNetwork">The roaming network.</param>
        /// <param name="HTTPResponse">A HTTP error response.</param>
        /// <returns>True, when roaming network was found; false else.</returns>
        public static Boolean ParseRoamingNetwork(this HTTPRequest HTTPRequest,
                                                  HTTPServer <RoamingNetworks, RoamingNetwork> HTTPServer,
                                                  out RoamingNetwork RoamingNetwork,
                                                  out HTTPResponse HTTPResponse)
        {
            if (HTTPServer == null)
            {
                Console.WriteLine("HTTPServer == null!");
            }

            #region Initial checks

            if (HTTPRequest == null)
            {
                throw new ArgumentNullException("HTTPRequest", "The given HTTP request must not be null!");
            }

            if (HTTPServer == null)
            {
                throw new ArgumentNullException("HTTPServer", "The given HTTP server must not be null!");
            }

            #endregion

            RoamingNetwork_Id RoamingNetworkId;
            RoamingNetwork = null;
            HTTPResponse   = null;

            if (HTTPRequest.ParsedURLParameters.Length < 1)
            {
                HTTPResponse = new HTTPResponse.Builder(HTTPRequest)
                {
                    HTTPStatusCode = HTTPStatusCode.BadRequest,
                    Server         = HTTPServer.DefaultServerName,
                    Date           = DateTime.Now,
                };

                return(false);
            }

            if (!RoamingNetwork_Id.TryParse(HTTPRequest.ParsedURLParameters[0], out RoamingNetworkId))
            {
                HTTPResponse = new HTTPResponse.Builder(HTTPRequest)
                {
                    HTTPStatusCode = HTTPStatusCode.BadRequest,
                    Server         = HTTPServer.DefaultServerName,
                    Date           = DateTime.Now,
                    ContentType    = HTTPContentType.JSON_UTF8,
                    Content        = @"{ ""description"": ""Invalid RoamingNetworkId!"" }".ToUTF8Bytes()
                };

                return(false);
            }

            RoamingNetwork = HTTPServer.
                             GetAllTenants(HTTPRequest.Host).
                             FirstOrDefault(roamingnetwork => roamingnetwork.Id == RoamingNetworkId);

            if (RoamingNetwork == null)
            {
                HTTPResponse = new HTTPResponse.Builder(HTTPRequest)
                {
                    HTTPStatusCode = HTTPStatusCode.NotFound,
                    Server         = HTTPServer.DefaultServerName,
                    Date           = DateTime.Now,
                    ContentType    = HTTPContentType.JSON_UTF8,
                    Content        = @"{ ""description"": ""Unknown RoamingNetworkId!"" }".ToUTF8Bytes()
                };

                return(false);
            }

            return(true);
        }