public static ApplyTemplateResponse Unmarshall(UnmarshallerContext context)
        {
            ApplyTemplateResponse applyTemplateResponse = new ApplyTemplateResponse();

            applyTemplateResponse.HttpResponse = context.HttpResponse;
            applyTemplateResponse.RequestId    = context.StringValue("ApplyTemplate.RequestId");
            applyTemplateResponse.Success      = context.BooleanValue("ApplyTemplate.Success");
            applyTemplateResponse.ErrorCode    = context.IntegerValue("ApplyTemplate.ErrorCode");
            applyTemplateResponse.ErrorMessage = context.StringValue("ApplyTemplate.ErrorMessage");

            ApplyTemplateResponse.ApplyTemplate_Resource resource = new ApplyTemplateResponse.ApplyTemplate_Resource();

            List <ApplyTemplateResponse.ApplyTemplate_Resource.ApplyTemplate_AlertResult> resource_createAlertResults = new List <ApplyTemplateResponse.ApplyTemplate_Resource.ApplyTemplate_AlertResult>();

            for (int i = 0; i < context.Length("ApplyTemplate.Resource.CreateAlertResults.Length"); i++)
            {
                ApplyTemplateResponse.ApplyTemplate_Resource.ApplyTemplate_AlertResult alertResult = new ApplyTemplateResponse.ApplyTemplate_Resource.ApplyTemplate_AlertResult();
                alertResult.Name            = context.StringValue("ApplyTemplate.Resource.CreateAlertResults[" + i + "].Name");
                alertResult.DisplayName     = context.StringValue("ApplyTemplate.Resource.CreateAlertResults[" + i + "].DisplayName");
                alertResult.MetricNamespace = context.StringValue("ApplyTemplate.Resource.CreateAlertResults[" + i + "].MetricNamespace");
                alertResult.MetricName      = context.StringValue("ApplyTemplate.Resource.CreateAlertResults[" + i + "].MetricName");
                alertResult.Message         = context.StringValue("ApplyTemplate.Resource.CreateAlertResults[" + i + "].Message");
                alertResult.Success         = context.StringValue("ApplyTemplate.Resource.CreateAlertResults[" + i + "].Success");

                resource_createAlertResults.Add(alertResult);
            }
            resource.CreateAlertResults    = resource_createAlertResults;
            applyTemplateResponse.Resource = resource;

            return(applyTemplateResponse);
        }
Пример #2
0
        public static async Task <HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post")] ApplyTemplateRequest request, TraceWriter log)
        {
            Stopwatch stopWatch = new Stopwatch();

            stopWatch.Start();
            string siteUrl = request.SiteURL;

            RedirectAssembly();
            try
            {
                if (string.IsNullOrWhiteSpace(request.SiteURL))
                {
                    throw new ArgumentException("Parameter cannot be null", "SiteURL");
                }
                if (string.IsNullOrWhiteSpace(request.TemplateURL))
                {
                    throw new ArgumentException("Parameter cannot be null", "TemplateURL");
                }

                string templateUrl   = request.TemplateURL.Trim(); // remove potential spaces/line breaks
                var    clientContext = await ConnectADAL.GetClientContext(siteUrl, log);

                var web = clientContext.Web;
                web.Lists.EnsureSiteAssetsLibrary();
                clientContext.ExecuteQueryRetry();

                Uri templateFileUri = new Uri(templateUrl);
                var webUrl          = Web.WebUrlFromFolderUrlDirect(clientContext, templateFileUri);
                var templateContext = clientContext.Clone(webUrl.ToString());

                var library = templateUrl.ToLower().Replace(templateContext.Url.ToLower(), "").TrimStart('/');
                var idx     = library.IndexOf("/", StringComparison.Ordinal);
                library = library.Substring(0, idx);

                // This syntax creates a SharePoint connector regardless we have the -InputInstance argument or not
                var    fileConnector         = new SharePointConnector(templateContext, templateContext.Url, library);
                string templateFileName      = Path.GetFileName(templateUrl);
                XMLTemplateProvider provider = new XMLOpenXMLTemplateProvider(new OpenXMLConnector(templateFileName, fileConnector));
                templateFileName = templateFileName.Substring(0, templateFileName.LastIndexOf(".", StringComparison.Ordinal)) + ".xml";
                var provisioningTemplate = provider.GetTemplate(templateFileName, new ITemplateProviderExtension[0]);

                if (request.Parameters != null)
                {
                    foreach (var parameter in request.Parameters)
                    {
                        provisioningTemplate.Parameters[parameter.Key] = parameter.Value;
                    }
                }

                provisioningTemplate.Connector = provider.Connector;

                TokenReplaceCustomAction(provisioningTemplate, clientContext.Web);

                ProvisioningTemplateApplyingInformation applyingInformation = new ProvisioningTemplateApplyingInformation()
                {
                    ProgressDelegate = (message, progress, total) =>
                    {
                        log.Info(String.Format("{0:00}/{1:00} - {2}", progress, total, message));
                    },
                    MessagesDelegate = (message, messageType) =>
                    {
                        log.Info(String.Format("{0} - {1}", messageType, message));
                    }
                };

                clientContext.Web.ApplyProvisioningTemplate(provisioningTemplate, applyingInformation);
                stopWatch.Stop();

                var applyTemplateResponse = new ApplyTemplateResponse
                {
                    TemplateApplied     = true,
                    ElapsedMilliseconds = stopWatch.ElapsedMilliseconds
                };
                return(await Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK)
                {
                    Content = new ObjectContent <ApplyTemplateResponse>(applyTemplateResponse, new JsonMediaTypeFormatter())
                }));
            }
            catch (Exception e)
            {
                stopWatch.Stop();
                log.Error($"Error: {e.Message}\n\n{e.StackTrace}");
                return(await Task.FromResult(new HttpResponseMessage(HttpStatusCode.ServiceUnavailable)
                {
                    Content = new ObjectContent <string>(e.Message, new JsonMediaTypeFormatter())
                }));
            }
        }