public async Task WriteReadWriteAsync()
        {
            StringBuilder sb = new StringBuilder();
            StringWriter  sw = new StringWriter(sb);

            using (JsonWriter jsonWriter = new JsonTextWriter(sw)
            {
                Formatting = Formatting.Indented
            })
            {
                await jsonWriter.WriteStartArrayAsync();

                await jsonWriter.WriteValueAsync(true);

                await jsonWriter.WriteStartObjectAsync();

                await jsonWriter.WritePropertyNameAsync("integer");

                await jsonWriter.WriteValueAsync(99);

                await jsonWriter.WritePropertyNameAsync("string");

                await jsonWriter.WriteValueAsync("how now brown cow?");

                await jsonWriter.WritePropertyNameAsync("array");

                await jsonWriter.WriteStartArrayAsync();

                for (int i = 0; i < 5; i++)
                {
                    await jsonWriter.WriteValueAsync(i);
                }

                await jsonWriter.WriteStartObjectAsync();

                await jsonWriter.WritePropertyNameAsync("decimal");

                await jsonWriter.WriteValueAsync(990.00990099m);

                await jsonWriter.WriteEndObjectAsync();

                await jsonWriter.WriteValueAsync(5);

                await jsonWriter.WriteEndArrayAsync();

                await jsonWriter.WriteEndObjectAsync();

                await jsonWriter.WriteValueAsync("This is a string.");

                await jsonWriter.WriteNullAsync();

                await jsonWriter.WriteNullAsync();

                await jsonWriter.WriteEndArrayAsync();
            }

            string json = sb.ToString();

            JsonSerializer serializer = new JsonSerializer();

            object jsonObject = serializer.Deserialize(new JsonTextReader(new StringReader(json)));

            sb = new StringBuilder();
            sw = new StringWriter(sb);

            using (JsonWriter jsonWriter = new JsonTextWriter(sw)
            {
                Formatting = Formatting.Indented
            })
            {
                serializer.Serialize(jsonWriter, jsonObject);
            }

            Assert.AreEqual(json, sb.ToString());
        }
Beispiel #2
0
        public async Task DoExportAsync(Stream outStream, ExportImportOptions options, Action <ExportImportProgressInfo> progressCallback, ICancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var progressInfo = new ExportImportProgressInfo();

            using (var sw = new StreamWriter(outStream, Encoding.UTF8))
                using (var writer = new JsonTextWriter(sw))
                {
                    await writer.WriteStartObjectAsync();

                    //Export menu link list
                    var menuLinkLists = await _menuService.GetAllLinkListsAsync();

                    var linkLists = menuLinkLists as IList <MenuLinkList> ?? menuLinkLists.ToList();

                    await writer.WritePropertyNameAsync("MenuLinkLists");

                    await writer.WriteStartArrayAsync();

                    for (var skip = 0; skip < linkLists.Count; skip += _batchSize)
                    {
                        progressInfo.Description = $"{skip} of {linkLists.Count} menu link lists have been loaded";
                        progressCallback(progressInfo);

                        foreach (var list in linkLists.Skip(skip).Take(_batchSize).ToList())
                        {
                            _jsonSerializer.Serialize(writer, list);
                        }

                        await writer.FlushAsync();

                        progressInfo.Description = $"{ Math.Min(linkLists.Count, skip + _batchSize) } of { linkLists.Count } menu link lists exported";
                        progressCallback(progressInfo);
                    }

                    await writer.WriteEndArrayAsync();

                    if (options.HandleBinaryData)
                    {
                        await writer.WritePropertyNameAsync("CmsContent");

                        await writer.WriteStartArrayAsync();

                        var result = await _blobContentStorageProvider.SearchAsync(string.Empty, null);

                        foreach (var blobFolder in result.Results.Where(x => _exportedFolders.Contains(x.Name)))
                        {
                            var contentFolder = new ContentFolder
                            {
                                Url = blobFolder.RelativeUrl
                            };
                            await ReadContentFoldersRecursiveAsync(contentFolder, progressCallback);

                            _jsonSerializer.Serialize(writer, contentFolder);
                        }

                        await writer.FlushAsync();

                        progressInfo.Description = $"{ result.TotalCount } cms content exported";
                        progressCallback(progressInfo);

                        await writer.WriteEndArrayAsync();
                    }

                    await writer.WriteEndObjectAsync();

                    await writer.FlushAsync();
                }
        }
        private async Task ExportPlatformEntriesInternalAsync(ZipArchive zipArchive, PlatformExportManifest manifest, Action <ExportImportProgressInfo> progressCallback, ICancellationToken cancellationToken)
        {
            var progressInfo = new ExportImportProgressInfo();

            var serializer = GetJsonSerializer();
            //Create part for platform entries
            var platformEntiriesPart = zipArchive.CreateEntry(PlatformZipEntryName, CompressionLevel.Optimal);

            using (var partStream = platformEntiriesPart.Open())
            {
                using (var sw = new StreamWriter(partStream, Encoding.UTF8))
                    using (var writer = new JsonTextWriter(sw))
                    {
                        await writer.WriteStartObjectAsync();

                        if (manifest.HandleSecurity)
                        {
                            progressInfo.Description = "Roles exporting...";
                            progressCallback(progressInfo);
                            cancellationToken.ThrowIfCancellationRequested();

                            await writer.WritePropertyNameAsync("Roles");

                            await writer.WriteStartArrayAsync();

                            var roles = _roleManager.Roles.ToList();
                            if (_roleManager.SupportsRoleClaims)
                            {
                                var permissions = _permissionsProvider.GetAllPermissions().ToArray();
                                foreach (var role in roles)
                                {
                                    role.Permissions = (await _roleManager.GetClaimsAsync(role)).Join(permissions, c => c.Value, p => p.Name, (c, p) => p).ToArray();

                                    serializer.Serialize(writer, role);
                                }

                                writer.Flush();
                                progressInfo.Description = $"{ roles.Count } roles exported";
                                progressCallback(progressInfo);
                            }

                            await writer.WriteEndArrayAsync();

                            cancellationToken.ThrowIfCancellationRequested();

                            await writer.WritePropertyNameAsync("Users");

                            await writer.WriteStartArrayAsync();

                            var usersResult = _userManager.Users.ToArray();
                            progressInfo.Description = $"Security: {usersResult.Length} users exporting...";
                            progressCallback(progressInfo);
                            var userExported = 0;

                            foreach (var user in usersResult)
                            {
                                var userExt = await _userManager.FindByIdAsync(user.Id);

                                if (userExt != null)
                                {
                                    serializer.Serialize(writer, userExt);
                                    userExported++;
                                }
                            }

                            await writer.FlushAsync();

                            progressInfo.Description = $"{ userExported } of { usersResult.Length } users exported";
                            progressCallback(progressInfo);

                            await writer.WriteEndArrayAsync();
                        }

                        if (manifest.HandleSettings)
                        {
                            cancellationToken.ThrowIfCancellationRequested();

                            await writer.WritePropertyNameAsync("Settings");

                            await writer.WriteStartArrayAsync();

                            progressInfo.Description = "Settings: selected modules settings exporting...";
                            progressCallback(progressInfo);
                            foreach (var module in manifest.Modules)
                            {
                                var moduleSettings = await _settingsManager.GetObjectSettingsAsync(_settingsManager.AllRegisteredSettings.Where(x => x.ModuleId == module.Id).Select(x => x.Name));

                                //Export only settings with set values
                                foreach (var setting in moduleSettings.Where(x => x.ItHasValues))
                                {
                                    serializer.Serialize(writer, setting);
                                }

                                await writer.FlushAsync();
                            }

                            progressInfo.Description = $"Settings of modules exported";
                            progressCallback(progressInfo);
                            await writer.WriteEndArrayAsync();
                        }

                        cancellationToken.ThrowIfCancellationRequested();

                        await writer.WritePropertyNameAsync("DynamicProperties");

                        await writer.WriteStartArrayAsync();

                        progressInfo.Description = "Dynamic properties: load properties...";
                        progressCallback(progressInfo);

                        var dynamicProperties = (await _dynamicPropertySearchService.SearchDynamicPropertiesAsync(new DynamicPropertySearchCriteria {
                            Take = int.MaxValue
                        })).Results;
                        foreach (var dynamicProperty in dynamicProperties)
                        {
                            serializer.Serialize(writer, dynamicProperty);
                        }

                        progressInfo.Description = $"Dynamic properties exported";
                        progressCallback(progressInfo);
                        await writer.WriteEndArrayAsync();

                        cancellationToken.ThrowIfCancellationRequested();

                        await writer.WritePropertyNameAsync("DynamicPropertyDictionaryItems");

                        await writer.WriteStartArrayAsync();

                        progressInfo.Description = "Dynamic properties Dictionary Items: load properties...";
                        progressCallback(progressInfo);

                        var dynamicPropertyDictionaryItems = (await _dynamicPropertySearchService.SearchDictionaryItemsAsync(new DynamicPropertyDictionaryItemSearchCriteria {
                            Take = int.MaxValue
                        })).Results;
                        foreach (var dynamicPropertyDictionaryItem in dynamicPropertyDictionaryItems)
                        {
                            serializer.Serialize(writer, dynamicPropertyDictionaryItem);
                        }

                        progressInfo.Description = $"Dynamic properties dictionary items exported";
                        progressCallback(progressInfo);
                        await writer.WriteEndArrayAsync();

                        await writer.WriteEndObjectAsync();

                        await writer.FlushAsync();
                    }
            }
        }
        private async Task <string> SerializeJsonNetManualAsync(TestClass c, Formatting formatting)
        {
            StringWriter   sw     = new StringWriter();
            JsonTextWriter writer = new JsonTextWriter(sw);

            writer.Formatting = formatting;

            await writer.WriteStartObjectAsync();

            await writer.WritePropertyNameAsync("strings");

            await writer.WriteStartArrayAsync();

            foreach (string s in c.strings)
            {
                await writer.WriteValueAsync(s);
            }
            await writer.WriteEndArrayAsync();

            await writer.WritePropertyNameAsync("dictionary");

            await writer.WriteStartObjectAsync();

            foreach (KeyValuePair <string, int> keyValuePair in c.dictionary)
            {
                await writer.WritePropertyNameAsync(keyValuePair.Key);

                await writer.WriteValueAsync(keyValuePair.Value);
            }
            await writer.WriteEndObjectAsync();

            await writer.WritePropertyNameAsync("Name");

            await writer.WriteValueAsync(c.Name);

            await writer.WritePropertyNameAsync("Now");

            await writer.WriteValueAsync(c.Now);

            await writer.WritePropertyNameAsync("BigNumber");

            await writer.WriteValueAsync(c.BigNumber);

            await writer.WritePropertyNameAsync("Address1");

            await writer.WriteStartObjectAsync();

            await writer.WritePropertyNameAsync("Street");

            await writer.WriteValueAsync(c.BigNumber);

            await writer.WritePropertyNameAsync("Street");

            await writer.WriteValueAsync(c.BigNumber);

            await writer.WritePropertyNameAsync("Street");

            await writer.WriteValueAsync(c.BigNumber);

            await writer.WriteEndObjectAsync();

            await writer.WritePropertyNameAsync("Addresses");

            await writer.WriteStartArrayAsync();

            foreach (Address address in c.Addresses)
            {
                await writer.WriteStartObjectAsync();

                await writer.WritePropertyNameAsync("Street");

                await writer.WriteValueAsync(address.Street);

                await writer.WritePropertyNameAsync("Phone");

                await writer.WriteValueAsync(address.Phone);

                await writer.WritePropertyNameAsync("Entered");

                await writer.WriteValueAsync(address.Entered);

                await writer.WriteEndObjectAsync();
            }
            await writer.WriteEndArrayAsync();

            await writer.WriteEndObjectAsync();

            await writer.FlushAsync();

            return(sw.ToString());
        }
        public async Task WriteAsync(IEnumerable <StreamEvent> events, CancellationToken cancellationToken = default)
        {
            if (events == null)
            {
                throw new ArgumentNullException(nameof(events));
            }

            const int requires400Mb = 419_430_400;

            using (var content = _manager.GetStream(nameof(LegacyStreamArchiveWriter), requires400Mb))
            {
                using (var archive = new ZipArchive(content, ZipArchiveMode.Create, true))
                {
                    var entry = archive.CreateEntry("streams.json", CompressionLevel.Optimal);
                    using (var entryStream = entry.Open())
                        using (var writer = new JsonTextWriter(new StreamWriter(entryStream)))
                        {
                            await writer.WriteStartArrayAsync(cancellationToken);

                            using (var enumerator = events.GetEnumerator())
                            {
                                if (enumerator.MoveNext())
                                {
                                    var stream = enumerator.Current.Stream;

                                    await WriteBeginStream(stream, writer, cancellationToken);

                                    await WriteEvent(enumerator.Current.Event, writer, cancellationToken);

                                    while (enumerator.MoveNext())
                                    {
                                        // next
                                        if (stream != enumerator.Current.Stream)
                                        {
                                            await WriteEndStream(writer);

                                            stream = enumerator.Current.Stream;

                                            await WriteBeginStream(stream, writer, cancellationToken);
                                        }

                                        await WriteEvent(enumerator.Current.Event, writer, cancellationToken);
                                    }

                                    await WriteEndStream(writer);
                                }
                            }

                            await writer.WriteEndArrayAsync(cancellationToken);

                            await writer.FlushAsync(cancellationToken);
                        }
                }

                content.Position = 0;

                await _client.CreateBlobAsync(
                    new BlobName("import-streams.zip"),
                    Metadata.None,
                    ContentType.Parse("application/zip"),
                    content,
                    cancellationToken);
            }
        }
        private static async Task ReturnSearchResult(SearchResult result, HttpContext ctx)
        {
            var ct = ctx.RequestAborted;

            ctx.Response.StatusCode  = (int)HttpStatusCode.OK;
            ctx.Response.ContentType = "application/json";

            using (var writer = new JsonTextWriter(new StreamWriter(ctx.Response.Body)))
            {
                await writer.WriteStartObjectAsync(ct).ConfigureAwait(false);

                await writer.WritePropertyNameAsync("totalCount", ct).ConfigureAwait(false);

                await writer.WriteValueAsync(result.Total, ct).ConfigureAwait(false);

                await writer.WritePropertyNameAsync("elapsed", ct).ConfigureAwait(false);

                await writer.WriteValueAsync(result.Elapsed, ct).ConfigureAwait(false);

                await writer.WritePropertyNameAsync("results", ct).ConfigureAwait(false);

                await writer.WriteStartArrayAsync(ct).ConfigureAwait(false);

                foreach (var document in result)
                {
                    if (ct.IsCancellationRequested)
                    {
                        return;
                    }
                    var obj = document.GroupBy(x => x.Key);
                    await writer.WriteStartObjectAsync(ct).ConfigureAwait(false);

                    foreach (var p in obj)
                    {
                        await writer.WritePropertyNameAsync(p.Key, ct).ConfigureAwait(false);

                        var values = p.ToArray();
                        if (values.Length == 0)
                        {
                            await writer.WriteNullAsync(ct).ConfigureAwait(false);
                        }
                        else if (values.Length == 1)
                        {
                            await writer.WriteValueAsync(values[0].Value, ct).ConfigureAwait(false);
                        }
                        else
                        {
                            await writer.WriteStartArrayAsync(ct).ConfigureAwait(false);

                            foreach (var v in values)
                            {
                                await writer.WriteValueAsync(v.Value, ct).ConfigureAwait(false);
                            }
                            await writer.WriteEndArrayAsync(ct).ConfigureAwait(false);
                        }
                    }
                    await writer.WriteEndObjectAsync(ct).ConfigureAwait(false);
                }
                await writer.WriteEndArrayAsync(ct).ConfigureAwait(false);

                await writer.WriteEndObjectAsync(ct).ConfigureAwait(false);
            }
        }
Beispiel #7
0
        public static async Task <HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "{datasetname}")] HttpRequest req,
            string datasetname,
            ILogger log, ExecutionContext context)
        {
            var baseconfig = new ConfigurationBuilder()
                             .SetBasePath(context.FunctionAppDirectory)
                             .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true)
                             .AddEnvironmentVariables()
                             .Build();

            var configOptions = new ConfigurationOptions();

            baseconfig.Bind("AzureTableSchema", configOptions);
            if (configOptions.Environment == null || configOptions.Environment == "")
            {
                configOptions.Environment = baseconfig["ASPNETCORE_ENVIRONMENT"];
            }

            if (configOptions.ConnectionString == null || configOptions.ConnectionString == "")
            {
                log.LogError($"ConnectionString is not specified");
                return(new HttpResponseMessage(HttpStatusCode.InternalServerError)
                {
                    Content = new StringContent("{ 'error': 'service misconfiguration' }")
                });
            }

            Configuration configuration = new Configuration(configOptions);

            string datasetconfigStr = null;

            try
            {
                datasetconfigStr = await configuration.GetConfigurationAsync(datasetname);
            } catch (Exception e)
            {
                log.LogError(e, $"Unable to query config string with key '{datasetname}'");
                return(new HttpResponseMessage(HttpStatusCode.InternalServerError)
                {
                    Content = new StringContent("{ 'error': 'dataset not found' }")
                });
            }

            if (datasetconfigStr == null)
            {
                log.LogError($"Unable to find config string with key '{datasetname}'");
                return(new HttpResponseMessage(HttpStatusCode.NotFound)
                {
                    Content = new StringContent("{ 'error': 'dataset not found' }")
                });
            }

            AzureTableSchema schema = null;

            try
            {
                schema = JsonConvert.DeserializeObject <AzureTableSchema>(datasetconfigStr, new JsonSerializerSettings {
                    NullValueHandling = NullValueHandling.Include
                });
            } catch (Exception e)
            {
                log.LogError(e, $"Unable to deserialize config string with key '{datasetname}'");
                return(new HttpResponseMessage(HttpStatusCode.InternalServerError)
                {
                    Content = new StringContent("{ 'error': 'service misconfiguration' }")
                });
            }



            // starting with result.


            var result = new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new PushStreamContent(async(outputStream, httpContext, transportContext) =>
                {
                    // Add query parameters passby
                    // https://benjii.me/2017/04/parse-modify-query-strings-asp-net-core/

                    var uri     = new Uri(schema.SourceUrl);
                    var baseUri = uri.GetComponents(UriComponents.Scheme | UriComponents.Host | UriComponents.Port | UriComponents.Path, UriFormat.UriEscaped);

                    var query = QueryHelpers.ParseQuery(uri.Query);

                    var qb = new QueryBuilder();
                    foreach (var item in query)
                    {
                        qb.Add(item.Key, item.Value.AsEnumerable());
                    }



                    List <string> allowedParameters = new List <string>()
                    {
                        "$filter", "$orderby", "$select", "$skip", "$top"
                    };

                    foreach (var item in req.Query)
                    {
                        if (allowedParameters.Contains(item.Key) && !query.ContainsKey(item.Key)) // do not allow to overwrite existing values
                        {
                            qb.Add(item.Key, item.Value.AsEnumerable());
                        }
                    }

                    var targetUrl = baseUri + qb.ToQueryString();


                    //HttpRequestMessage r = new HttpRequestMessage(HttpMethod.Get, schema.SourceUrl);
                    HttpRequestMessage r = new HttpRequestMessage(HttpMethod.Get, targetUrl);
                    r.Headers.Add("Accept", "application / json; odata = nometadata");


                    // TODO: Add request query string parameters to request


                    var response   = await httpClient.SendAsync(r);
                    var serializer = new JsonSerializer();
                    //var ss = new StringBuilder();
                    bool inValueArray       = false;
                    string lastPropertyName = "";


                    using (var sr = new StreamReader(await response.Content.ReadAsStreamAsync(), new UTF8Encoding(), false))
                        using (var jsonTextReader = new JsonTextReader(sr))
                            using (JsonWriter writer = new JsonTextWriter(new StreamWriter(outputStream, new UTF8Encoding(), 512, false)))
                            {
                                while (jsonTextReader.Read())
                                {
                                    if (!inValueArray)
                                    {
                                        if (jsonTextReader.TokenType == JsonToken.PropertyName)
                                        {
                                            lastPropertyName = jsonTextReader.Value.ToString();
                                        }
                                        else if (jsonTextReader.TokenType == JsonToken.StartArray && lastPropertyName == "value")
                                        {
                                            inValueArray = true;
                                            // write object beginning and such..
                                            await writer.WriteStartObjectAsync();
                                            await writer.WritePropertyNameAsync("value");
                                            await writer.WriteStartArrayAsync();
                                        }
                                    }
                                    else
                                    {
                                        if (jsonTextReader.TokenType == JsonToken.StartObject) // read entire object
                                        {
                                            JObject obj = JObject.Load(jsonTextReader);

                                            // add missing columns
                                            if (schema.AddMissing)
                                            {
                                                foreach (var item in schema.Columns)
                                                {
                                                    if (!obj.ContainsKey(item.Key))
                                                    {
                                                        obj.Add(item.Key, item.Value.Default);
                                                    }
                                                }
                                            }

                                            // remove unspecified columns
                                            if (schema.RemoveUnspecified)
                                            {
                                                var props = obj.Properties().Select(a => a.Name).ToList();

                                                foreach (var item in props)
                                                {
                                                    if (!schema.Columns.ContainsKey(item))
                                                    {
                                                        obj.Remove(item);
                                                    }
                                                }
                                            }

                                            var objstr = JsonConvert.SerializeObject(obj,
                                                                                     new JsonSerializerSettings()
                                            {
                                                NullValueHandling = NullValueHandling.Include,
                                                Formatting        = Formatting.None
                                            }
                                                                                     );

                                            log.LogInformation(objstr);

                                            await writer.WriteRawValueAsync(objstr);
                                            await writer.FlushAsync();
                                        }
                                        else if (jsonTextReader.TokenType == JsonToken.EndArray)
                                        {
                                            await writer.WriteEndArrayAsync();
                                            await writer.WriteEndObjectAsync();

                                            inValueArray = false;
                                        }
                                    }
                                }
                            }

                    outputStream.Close();
                }),
            };

            result.Content.Headers.ContentType        = new MediaTypeHeaderValue("application/json");
            result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
            {
                FileName = $"{datasetname}.json"
            };

            return(result);
        }
Beispiel #8
0
        public static Func <RequestDelegate, RequestDelegate> Create(
            Index index,
            string identityField,
            Func <string, IEnumerable <KeyValuePair <string, string> > > transform)
        {
            return(next => async ctx =>
            {
                if (ctx.Request.Path.HasValue)
                {
                    var id = ctx.Request.Path.Value.Substring(1);
                    if ("GET".Equals(ctx.Request.Method, StringComparison.OrdinalIgnoreCase))
                    {
                        var obj = index.GetByTerm(identityField, id);
                        if (obj == null)
                        {
                            await next(ctx).ConfigureAwait(false);

                            return;
                        }
                        var ct = ctx.RequestAborted;

                        ctx.Response.StatusCode = (int)HttpStatusCode.OK;
                        ctx.Response.ContentType = "application/json";

                        using (var writer = new JsonTextWriter(new StreamWriter(ctx.Response.Body)))
                        {
                            await writer.WriteStartObjectAsync(ct).ConfigureAwait(false);

                            foreach (var p in obj.GroupBy(x => x.Key))
                            {
                                await writer.WritePropertyNameAsync(p.Key, ct).ConfigureAwait(false);

                                var values = p.ToArray();
                                if (values.Length == 0)
                                {
                                    await writer.WriteNullAsync(ct).ConfigureAwait(false);
                                }
                                else if (values.Length == 1)
                                {
                                    await writer.WriteValueAsync(values[0].Value, ct).ConfigureAwait(false);
                                }
                                else
                                {
                                    await writer.WriteStartArrayAsync(ct).ConfigureAwait(false);

                                    foreach (var v in values)
                                    {
                                        await writer.WriteValueAsync(v.Value, ct).ConfigureAwait(false);
                                    }
                                    await writer.WriteEndArrayAsync(ct).ConfigureAwait(false);
                                }
                            }
                            await writer.WriteEndObjectAsync(ct).ConfigureAwait(false);
                        }
                    }
                    else if ("PUT".Equals(ctx.Request.Method, StringComparison.OrdinalIgnoreCase))
                    {
                        var stream = new StreamReader(ctx.Request.Body);
                        var json = await stream.ReadToEndAsync().ConfigureAwait(false);

                        index.UpdateByTerm(identityField, id, transform(json));
                        ctx.Response.StatusCode = (int)HttpStatusCode.OK;
                    }
                    else if ("POST".Equals(ctx.Request.Method, StringComparison.OrdinalIgnoreCase))
                    {
                        if (index.GetByTerm(identityField, id) != null)
                        {
                            ctx.Response.StatusCode = (int)HttpStatusCode.BadRequest;
                            return;
                        }
                        var stream = new StreamReader(ctx.Request.Body);
                        var json = await stream.ReadToEndAsync().ConfigureAwait(false);

                        index.LoadDocuments(new[] { transform(json) });
                        ctx.Response.StatusCode = (int)HttpStatusCode.Created;
                    }
                    else if ("DELETE".Equals(ctx.Request.Method, StringComparison.OrdinalIgnoreCase))
                    {
                        index.DeleteByTerm(identityField, id);
                    }
                    else
                    {
                        ctx.Response.StatusCode = (int)HttpStatusCode.MethodNotAllowed;
                        ctx.Response.ContentType = "application/json";
                        ctx.Response.Headers["Allow"] = "GET,PUT,POST,DELETE";

                        await ctx.Response.WriteAsync("\"Method Not Allowed\"", ctx.RequestAborted).ConfigureAwait(false);

                        return;
                    }
                }
                else
                {
                    await next(ctx).ConfigureAwait(false);
                }
            });
        }
Beispiel #9
0
        public async Task DoExportAsync(Stream backupStream, Action <ExportImportProgressInfo> progressCallback,
                                        ICancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var progressInfo = new ExportImportProgressInfo("Starting data export");

            progressCallback(progressInfo);

            using (var streamWriter = new StreamWriter(backupStream, Encoding.UTF8))
                using (var jsonTextWriter = new JsonTextWriter(streamWriter))
                {
                    await jsonTextWriter.WriteStartObjectAsync();

                    var paymentPlanSearchResponse = await _paymentPlanSearchService.SearchPlansAsync(new PaymentPlanSearchCriteria { Take = 0 });

                    await jsonTextWriter.WritePropertyNameAsync("PaymentPlans");

                    await jsonTextWriter.WriteStartArrayAsync();

                    for (var skip = 0; skip < paymentPlanSearchResponse.TotalCount; skip += BatchSize)
                    {
                        cancellationToken.ThrowIfCancellationRequested();

                        paymentPlanSearchResponse = await _paymentPlanSearchService.SearchPlansAsync(new PaymentPlanSearchCriteria
                        {
                            Skip = skip,
                            Take = BatchSize
                        });

                        progressInfo.Description = string.Format("{0} of {1} payment plans loading", Math.Min(skip + BatchSize, paymentPlanSearchResponse.TotalCount), paymentPlanSearchResponse.TotalCount);
                        progressCallback(progressInfo);

                        foreach (var paymentPlan in paymentPlanSearchResponse.Results)
                        {
                            _jsonSerializer.Serialize(jsonTextWriter, paymentPlan);
                        }
                    }
                    await jsonTextWriter.WriteEndArrayAsync();

                    var searchResponse = await _subscriptionSearchService.SearchSubscriptionsAsync(new SubscriptionSearchCriteria
                    {
                        Take          = 0,
                        ResponseGroup = SubscriptionResponseGroup.Default.ToString()
                    });

                    await jsonTextWriter.WritePropertyNameAsync("Subscriptions");

                    await jsonTextWriter.WriteStartArrayAsync();

                    for (var skip = 0; skip < searchResponse.TotalCount; skip += BatchSize)
                    {
                        cancellationToken.ThrowIfCancellationRequested();

                        searchResponse = await _subscriptionSearchService.SearchSubscriptionsAsync(new SubscriptionSearchCriteria
                        {
                            Skip          = skip,
                            Take          = BatchSize,
                            ResponseGroup = SubscriptionResponseGroup.Default.ToString()
                        });

                        progressInfo.Description = string.Format("{0} of {1} subscriptions loading", Math.Min(skip + BatchSize, searchResponse.TotalCount), searchResponse.TotalCount);
                        progressCallback(progressInfo);

                        foreach (var subscription in searchResponse.Results)
                        {
                            _jsonSerializer.Serialize(jsonTextWriter, subscription);
                        }
                    }
                    await jsonTextWriter.WriteEndArrayAsync();

                    await jsonTextWriter.WriteEndObjectAsync();

                    await jsonTextWriter.FlushAsync();
                }
        }
Beispiel #10
0
        /// <summary>
        /// Write rows to GeoJson stream
        /// </summary>
        /// <param name="rows">transformalize rows</param>
        public void Write(IEnumerable <IRow> rows)
        {
            var textWriter = new StreamWriter(_stream);
            var jw         = new JsonTextWriter(textWriter);

            jw.WriteStartObjectAsync().ConfigureAwait(false); //root

            jw.WritePropertyNameAsync("type").ConfigureAwait(false);
            jw.WriteValueAsync("FeatureCollection").ConfigureAwait(false);

            jw.WritePropertyNameAsync("features").ConfigureAwait(false);
            jw.WriteStartArrayAsync().ConfigureAwait(false); //features

            foreach (var row in rows)
            {
                jw.WriteStartObjectAsync().ConfigureAwait(false); //feature
                jw.WritePropertyNameAsync("type").ConfigureAwait(false);
                jw.WriteValueAsync("Feature").ConfigureAwait(false);
                jw.WritePropertyNameAsync("geometry").ConfigureAwait(false);
                jw.WriteStartObjectAsync().ConfigureAwait(false); //geometry
                jw.WritePropertyNameAsync("type").ConfigureAwait(false);
                jw.WriteValueAsync("Point").ConfigureAwait(false);

                jw.WritePropertyNameAsync("coordinates").ConfigureAwait(false);
                jw.WriteStartArrayAsync().ConfigureAwait(false);
                jw.WriteValueAsync(row[_longitudeField]).ConfigureAwait(false);
                jw.WriteValueAsync(row[_latitudeField]).ConfigureAwait(false);
                jw.WriteEndArrayAsync().ConfigureAwait(false);

                jw.WriteEndObjectAsync().ConfigureAwait(false); //geometry

                jw.WritePropertyNameAsync("properties").ConfigureAwait(false);
                jw.WriteStartObjectAsync().ConfigureAwait(false); //properties

                jw.WritePropertyNameAsync("description").ConfigureAwait(false);
                if (_hasDescription)
                {
                    jw.WriteValueAsync(row[_descriptionField]).ConfigureAwait(false);
                }
                else
                {
                    jw.WriteValueAsync("add geojson-description to output").ConfigureAwait(false);
                }

                if (_hasBatchValue)
                {
                    jw.WritePropertyNameAsync("batch-value").ConfigureAwait(false);
                    jw.WriteValueAsync(row[_batchField]).ConfigureAwait(false);
                }

                if (_hasColor)
                {
                    jw.WritePropertyNameAsync("marker-color").ConfigureAwait(false);
                    jw.WriteValueAsync(row[_colorField]).ConfigureAwait(false);
                }

                if (_hasSymbol)
                {
                    var symbol = row[_symbolField].ToString();
                    jw.WritePropertyNameAsync("marker-symbol").ConfigureAwait(false);
                    jw.WriteValueAsync(symbol).ConfigureAwait(false);
                }

                jw.WriteEndObjectAsync().ConfigureAwait(false); //properties

                jw.WriteEndObjectAsync().ConfigureAwait(false); //feature

                _context.Entity.Inserts++;

                jw.FlushAsync().ConfigureAwait(false);
            }

            jw.WriteEndArrayAsync().ConfigureAwait(false);  //features

            jw.WriteEndObjectAsync().ConfigureAwait(false); //root
            jw.FlushAsync().ConfigureAwait(false);
        }
Beispiel #11
0
        /// <summary>
        /// Write rows to as GeoJson to a stream
        /// </summary>
        /// <param name="rows"></param>
        public void Write(IEnumerable <IRow> rows)
        {
            var textWriter = new StreamWriter(_stream);
            var jw         = new JsonTextWriter(textWriter);

            jw.WriteStartObjectAsync().ConfigureAwait(false); //root

            jw.WritePropertyNameAsync("type").ConfigureAwait(false);
            jw.WriteValueAsync("FeatureCollection").ConfigureAwait(false);

            jw.WritePropertyNameAsync("features").ConfigureAwait(false);
            jw.WriteStartArrayAsync().ConfigureAwait(false); //features

            var tableBuilder = new StringBuilder();

            foreach (var row in rows)
            {
                jw.WriteStartObjectAsync().ConfigureAwait(false); //feature
                jw.WritePropertyNameAsync("type").ConfigureAwait(false);
                jw.WriteValueAsync("Feature").ConfigureAwait(false);
                jw.WritePropertyNameAsync("geometry").ConfigureAwait(false);
                jw.WriteStartObjectAsync().ConfigureAwait(false); //geometry
                jw.WritePropertyNameAsync("type").ConfigureAwait(false);
                jw.WriteValueAsync("Point").ConfigureAwait(false);

                jw.WritePropertyNameAsync("coordinates").ConfigureAwait(false);
                jw.WriteStartArrayAsync().ConfigureAwait(false);
                jw.WriteValueAsync(row[_longitudeField]).ConfigureAwait(false);
                jw.WriteValueAsync(row[_latitudeField]).ConfigureAwait(false);
                jw.WriteEndArrayAsync().ConfigureAwait(false);

                jw.WriteEndObjectAsync().ConfigureAwait(false); //geometry

                jw.WritePropertyNameAsync("properties").ConfigureAwait(false);
                jw.WriteStartObjectAsync().ConfigureAwait(false); //properties

                foreach (var field in _propertyFields)
                {
                    jw.WritePropertyNameAsync(field.Label).ConfigureAwait(false);
                    jw.WriteValueAsync(field.Format == string.Empty ? row[field] : string.Format(string.Concat("{0:", field.Format, "}"), row[field])).ConfigureAwait(false);
                }

                jw.WritePropertyNameAsync("description").ConfigureAwait(false);
                tableBuilder.Clear();
                tableBuilder.AppendLine("<table class=\"table table-striped table-condensed\">");
                foreach (var field in _propertyFields.Where(f => f.Alias != "BatchValue"))
                {
                    tableBuilder.AppendLine("<tr>");

                    tableBuilder.AppendLine("<td><strong>");
                    tableBuilder.AppendLine(field.Label);
                    tableBuilder.AppendLine(":</strong></td>");

                    tableBuilder.AppendLine("<td>");
                    tableBuilder.AppendLine(field.Raw ? row[field].ToString() : System.Security.SecurityElement.Escape(row[field].ToString()));
                    tableBuilder.AppendLine("</td>");

                    tableBuilder.AppendLine("</tr>");
                }
                tableBuilder.AppendLine("</table>");
                jw.WriteValueAsync(tableBuilder.ToString()).ConfigureAwait(false);

                if (_hasStyle)
                {
                    if (_colorField != null)
                    {
                        jw.WritePropertyNameAsync("marker-color").ConfigureAwait(false);
                        var color = row[_colorField].ToString().TrimStart('#').Right(6);
                        jw.WriteValueAsync("#" + (color.Length == 6 ? color : "0080ff")).ConfigureAwait(false);
                    }

                    if (_sizeField != null)
                    {
                        jw.WritePropertyNameAsync("marker-size").ConfigureAwait(false);
                        var size = row[_sizeField].ToString().ToLower();
                        if (_sizes.Contains(size))
                        {
                            jw.WriteValueAsync(size).ConfigureAwait(false);
                        }
                        else
                        {
                            jw.WriteValueAsync(_scales.ContainsKey(size) ? _scales[size] : "medium").ConfigureAwait(false);
                        }
                    }

                    if (_symbolField != null)
                    {
                        var symbol = row[_symbolField].ToString();
                        if (symbol.StartsWith("http"))
                        {
                            symbol = "marker";
                        }
                        jw.WritePropertyNameAsync("marker-symbol").ConfigureAwait(false);
                        jw.WriteValueAsync(symbol).ConfigureAwait(false);
                    }
                }

                jw.WriteEndObjectAsync().ConfigureAwait(false); //properties

                jw.WriteEndObjectAsync().ConfigureAwait(false); //feature

                _context.Entity.Inserts++;

                jw.FlushAsync().ConfigureAwait(false);
            }

            jw.WriteEndArrayAsync().ConfigureAwait(false);  //features

            jw.WriteEndObjectAsync().ConfigureAwait(false); //root
            jw.FlushAsync().ConfigureAwait(false);
        }