/* * 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; }