public async Task <JObject> ReadGlobalPersistentVariables(AdsClient client, IInstanceCollection <ISymbol> symbols) { var jobj = new JObject(); try { if (client.IsConnected) { var iterator = new SymbolIterator(symbols, s => s.IsPersistent && s.InstancePath.Split('.').Length >= 2 && !s.InstancePath.Contains("[")) ; var persistentSymbols = iterator.Where(s => s.Parent != null ? !iterator.Contains(s.Parent) : true); var variables = new Dictionary <string, List <JObject> >(); foreach (var symbol in persistentSymbols) { var splitPath = symbol.InstancePath.Split('.'); var localName = splitPath.Last(); var globalName = symbol.InstancePath.Replace($".{localName}", string.Empty); if (!variables.ContainsKey(globalName)) { variables.Add(globalName, new List <JObject>()); } try { logger.Debug($"reading symbol '{symbol.InstancePath}' in json format..."); currentTaskSubject.OnNext($"Reading {symbol.InstancePath}..."); var json = await client.ReadJson(symbol.InstancePath, force : true); if (json.ContainsKey(localName)) { variables[globalName].Add(json); } else { var innerObject = new JObject(); innerObject.Add(localName, json); variables[globalName].Add(innerObject); } } catch (Exception e) { logger.Error(string.Format(Resources.ErrorDuringReadingVariable0InJsonFormat, symbol.InstancePath), e); } } foreach (var element in variables.OrderBy(pair => pair.Key.Length)) { var uo = new JObject(); foreach (var p in element.Value) { foreach (var up in p.Properties()) { uo.Add(up); } } var path = element.Key.Split("."); if (path.Count() == 1) { jobj.Add(element.Key, uo); } else { for (var i = 0; i < path.Length - 1; i++) { if ((jobj.SelectToken(string.Join(".", path.Take(i + 1))) as JObject) == null) { if (i > 0) { (jobj.SelectToken(string.Join(".", path.Take(i))) as JObject).Add(path[i], new JObject()); } else { jobj.Add(path[i], new JObject()); } } } try { (jobj.SelectToken(string.Join(".", path.Take(path.Length - 1))) as JObject).Add(path.Last(), uo); } catch (ArgumentException) { var token = (jobj.SelectToken(string.Join(".", path)) as JObject); if (token != null) { foreach (var prop in uo.Properties()) { token.Add(prop.Name, prop.Value); } } } } } } } catch (Exception e) { logger.Error(Resources.ErrorWhileReadingPersistentVariables, e); } currentTaskSubject.OnNext(string.Empty); logger.Debug($"Persistent variable successfully downloaded!"); return(jobj); }