Beispiel #1
0
        /*
         * public override void UploadAndPrepareInputFiles(string ftpInputFolder, TaskFileDescription[] files, ResourceConfig assignedCluster, Dictionary<string, string> paramsTable, Packs package, string method)
         * {
         *      var xyzInputFile = files[0]; // the only input
         *
         *      string xyzMoleculeDescription = IOProxy.Storage.GetContent(xyzInputFile.storageId);
         *      string properMoleculeDescription = GetProperMoleculeDescription( XyzToAtmos(xyzMoleculeDescription) );
         *
         *      var paramsDictRaw = new Dictionary<string, string>();
         *      paramsDictRaw.Add(ATOMS_COUNT_PARAM_NAME, _atomsCount.ToString());
         *      int procsCount = assignedCluster.Cores.Aggregate((cur, next) => cur + next);
         *      paramsDictRaw.Add(PROCS_COUNT_PARAM_NAME, procsCount.ToString());
         *      foreach (var paramName in paramsTable.Keys)
         *              paramsDictRaw.Add(paramName, paramsTable[paramName]);
         *
         *      ModifyParams(paramsDictRaw);
         *
         *      var paramsDict = new Dictionary<string, string>();
         *      foreach (string paramName in paramsDictRaw.Keys)
         *      {
         *              string paramValue = paramsDictRaw[paramName];
         *
         *              paramsDict[paramName] = paramValue;
         *              paramsDict[paramName + "=" + paramValue] = paramName + "=" + paramValue;
         *      }
         *
         *      string template = GetInputFileTemplate();
         *      string content = template.Replace(GetTemplateParamDelim() + MOLECULE_PARAM_NAME + GetTemplateParamDelim(), properMoleculeDescription);
         *      content = InsertParams(content, paramsDict);
         *      content = content.Replace("\r\n", "\n");
         *      IOProxy.Ftp.UploadFileContent(content, ftpInputFolder, GetInputFileNameWithExtension());
         * }
         */

        protected string InsertParams(string content, Dictionary <string, string> @params)
        {
            string DELIM       = GetTemplateParamDelim();
            string DELIM_REGEX = Regex.Escape(DELIM);

            Regex regex = null;

            using (var checker = new PackageParametersChecker(0, @params))
            {
                checker.MarkParameterAsUsed(ATOMS_COUNT_PARAM_NAME);
                checker.MarkParameterAsUsed(ATOMS_COUNT_PARAM_NAME + "=" + @params[ATOMS_COUNT_PARAM_NAME]);
                checker.MarkParameterAsUsed(PROCS_COUNT_PARAM_NAME);
                checker.MarkParameterAsUsed(PROCS_COUNT_PARAM_NAME + "=" + @params[PROCS_COUNT_PARAM_NAME]);
                checker.MarkParameterAsUsed(CONST.Params.Method);
                checker.MarkParameterAsUsed(CONST.Params.Method + "=" + (@params[CONST.Params.Method] ?? ""));

                foreach (string paramName in @params.Keys)
                {
                    if (@params[paramName].ToLower() != "false")
                    {
                        var contentBuilder = new StringBuilder(content);

                        // Вставить значения во все переменные с данным именем:
                        // %param% -> value
                        contentBuilder.Replace(DELIM + paramName + DELIM, @params[paramName]);

                        // Так как параметр нашелся, раскрыть все плюсовые секции:
                        // %param+% ... %param+;% -> ...
                        contentBuilder.Replace(DELIM + paramName + @"+;" + DELIM, "");
                        contentBuilder.Replace(DELIM + paramName + @"+" + DELIM, "");


                        string escapedParamName = Regex.Escape(paramName);

                        // Выкинуть все минусовые секции с этим параметром:
                        // %param-% ... %param-;" -> null
                        regex = new Regex(
                            DELIM_REGEX + escapedParamName + "-" + DELIM_REGEX                              // %param-%
                            + @"[\s\S]*?" +                                                                 // any characters, as little as possible
                            DELIM_REGEX + escapedParamName + "-;" + DELIM_REGEX                             // %param-;%
                            );

                        string newContent = regex.Replace(contentBuilder.ToString(), "");
                        if (newContent != content)
                        {
                            content = newContent;
                            checker.MarkParameterAsUsed(paramName);
                            checker.MarkParameterAsUsed(paramName + "=" + @params[paramName]);
                        }
                    }
                }
            }

            // Нераскрытые блоки, параметры которых не нашли и не надо - раскрываем
            // %param-% ... %param-;% -> ...
            regex   = new Regex(DELIM_REGEX + @"[^\s" + DELIM_REGEX + "]*" + "-;" + DELIM_REGEX);           // %param-;%
            content = regex.Replace(content, "");

            regex   = new Regex(DELIM_REGEX + @"[^\s" + DELIM_REGEX + "]*" + "-" + DELIM_REGEX);           // %param-%
            content = regex.Replace(content, "");

            // Нераскрытые блоки, параметры которых не нашли, но которые быть должны - удаляем целиком
            // %param+% ... %param+;% -> null
            regex = new Regex(
                DELIM_REGEX + @"([^\s" + DELIM_REGEX + "]*)" + @"\+" + DELIM_REGEX               // %param+%
                //+ "[^" + DELIM_REGEX + "]*" +                                  // was anything but %
                + @"[\s\S]*?" +                                                                  // any characters, as little as possible
                DELIM_REGEX + @"\1\+;" + DELIM_REGEX                                             // %sameparam+;%
                );
            content = regex.Replace(content, "");

            // Все ненайденные подстановочные параметры просто выкинуть:
            // %param% -> null
            regex   = new Regex(DELIM_REGEX + @"[^\s" + DELIM_REGEX + "]*" + DELIM_REGEX);           // %param%
            content = regex.Replace(content, "");

            return(content);
        }
        /*
        public override void UploadAndPrepareInputFiles(string ftpInputFolder, TaskFileDescription[] files, ResourceConfig assignedCluster, Dictionary<string, string> paramsTable, Packs package, string method)
        {
            var xyzInputFile = files[0]; // the only input

            string xyzMoleculeDescription = IOProxy.Storage.GetContent(xyzInputFile.storageId);
            string properMoleculeDescription = GetProperMoleculeDescription( XyzToAtmos(xyzMoleculeDescription) );

            var paramsDictRaw = new Dictionary<string, string>();
            paramsDictRaw.Add(ATOMS_COUNT_PARAM_NAME, _atomsCount.ToString());
            int procsCount = assignedCluster.Cores.Aggregate((cur, next) => cur + next);
            paramsDictRaw.Add(PROCS_COUNT_PARAM_NAME, procsCount.ToString());
            foreach (var paramName in paramsTable.Keys)
                paramsDictRaw.Add(paramName, paramsTable[paramName]);

            ModifyParams(paramsDictRaw);

            var paramsDict = new Dictionary<string, string>();
            foreach (string paramName in paramsDictRaw.Keys)
            {
                string paramValue = paramsDictRaw[paramName];

                paramsDict[paramName] = paramValue;
                paramsDict[paramName + "=" + paramValue] = paramName + "=" + paramValue;
            }

            string template = GetInputFileTemplate();
            string content = template.Replace(GetTemplateParamDelim() + MOLECULE_PARAM_NAME + GetTemplateParamDelim(), properMoleculeDescription);
            content = InsertParams(content, paramsDict);
            content = content.Replace("\r\n", "\n");
            IOProxy.Ftp.UploadFileContent(content, ftpInputFolder, GetInputFileNameWithExtension());
        }
        */
        protected string InsertParams(string content, Dictionary<string, string> @params)
        {
            string DELIM = GetTemplateParamDelim();
            string DELIM_REGEX = Regex.Escape(DELIM);

            Regex regex = null;

            using (var checker = new PackageParametersChecker(0, @params))
            {
                checker.MarkParameterAsUsed(ATOMS_COUNT_PARAM_NAME);
                checker.MarkParameterAsUsed(ATOMS_COUNT_PARAM_NAME + "=" + @params[ATOMS_COUNT_PARAM_NAME]);
                checker.MarkParameterAsUsed(PROCS_COUNT_PARAM_NAME);
                checker.MarkParameterAsUsed(PROCS_COUNT_PARAM_NAME + "=" + @params[PROCS_COUNT_PARAM_NAME]);
                checker.MarkParameterAsUsed(CONST.Params.Method);
                checker.MarkParameterAsUsed(CONST.Params.Method + "=" + (@params[CONST.Params.Method] ?? ""));

                foreach (string paramName in @params.Keys)
                {
                    if (@params[paramName].ToLower() != "false")
                    {
                        var contentBuilder = new StringBuilder(content);

                        // Вставить значения во все переменные с данным именем:
                        // %param% -> value
                        contentBuilder.Replace(DELIM + paramName + DELIM, @params[paramName]);

                        // Так как параметр нашелся, раскрыть все плюсовые секции:
                        // %param+% ... %param+;% -> ...
                        contentBuilder.Replace(DELIM + paramName + @"+;" + DELIM, "");
                        contentBuilder.Replace(DELIM + paramName + @"+" + DELIM, "");

                        string escapedParamName = Regex.Escape(paramName);

                        // Выкинуть все минусовые секции с этим параметром:
                        // %param-% ... %param-;" -> null
                        regex = new Regex(
                            DELIM_REGEX + escapedParamName + "-" + DELIM_REGEX  // %param-%
                            + @"[\s\S]*?" +								        // any characters, as little as possible
                            DELIM_REGEX + escapedParamName + "-;" + DELIM_REGEX // %param-;%
                        );

                        string newContent = regex.Replace(contentBuilder.ToString(), "");
                        if (newContent != content)
                        {
                            content = newContent;
                            checker.MarkParameterAsUsed(paramName);
                            checker.MarkParameterAsUsed(paramName + "=" + @params[paramName]);
                        }
                    }
                }
            }

            // Нераскрытые блоки, параметры которых не нашли и не надо - раскрываем
            // %param-% ... %param-;% -> ...
            regex = new Regex(DELIM_REGEX + @"[^\s" + DELIM_REGEX + "]*" + "-;" + DELIM_REGEX); // %param-;%
            content = regex.Replace(content, "");

            regex = new Regex(DELIM_REGEX + @"[^\s" + DELIM_REGEX + "]*" + "-" + DELIM_REGEX); // %param-%
            content = regex.Replace(content, "");

            // Нераскрытые блоки, параметры которых не нашли, но которые быть должны - удаляем целиком
            // %param+% ... %param+;% -> null
            regex = new Regex(
                DELIM_REGEX + @"([^\s" + DELIM_REGEX + "]*)" + @"\+" + DELIM_REGEX  // %param+%
                //+ "[^" + DELIM_REGEX + "]*" +                                  // was anything but %
                + @"[\s\S]*?" +                                                  // any characters, as little as possible
                DELIM_REGEX + @"\1\+;" + DELIM_REGEX                             // %sameparam+;%
            );
            content = regex.Replace(content, "");

            // Все ненайденные подстановочные параметры просто выкинуть:
            // %param% -> null
            regex = new Regex(DELIM_REGEX + @"[^\s" + DELIM_REGEX + "]*" + DELIM_REGEX); // %param%
            content = regex.Replace(content, "");

            return content;
        }