private void RunTransformation()
        {
            XmlNodeList nodeList      = metaDataDocMgt.XmlDocument.SelectNodes(@"./a:Objects/a:Page", metaDataDocMgt.XmlNamespaceMgt);
            Decimal     numberOfPages = nodeList.Count;
            Decimal     pageCounter   = 0;

            Console.WriteLine("Control and Property Transformation started.");
            const string Indentation = "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b   ";

            Stack postponedPages = PostponedPagesList(nodeList);

            foreach (XmlNode formNode in nodeList)
            {
                metaDataDocMgt.XmlCurrentFormNode = formNode;

                if (!postponedPages.Contains(metaDataDocMgt.GetCurrentPageId))
                {
                    string currentPage = metaDataDocMgt.GetCurrentPageId.ToString(CultureInfo.InvariantCulture);
                    string s           = Indentation +
                                         Convert.ToInt32(((pageCounter + 1) / numberOfPages) * 100) +
                                         "%  #" +
                                         currentPage;

                    Console.Write(s);
                    pageCounter++;

                    try
                    {
                        TransformPage();
                    }
                    catch (TransformationException ex)
                    {
                        if (SuppressErrors)
                        {
                            TransformationLog.WriteErrorToLogFile(ex, metaDataDocMgt.GetCurrentPageId);
                        }
                        else
                        {
                            throw new TransformationException(string.Format(CultureInfo.InvariantCulture, Resources.RunTransformationError, currentPage), ex);
                        }
                    }
                }
            }

            if (postponedPages.Count > 0)
            {
                Console.WriteLine();
                Console.WriteLine("   Subforms tranformation started.");
            }

            int ilen = 0;

            foreach (int i in postponedPages)
            {
                XmlNode formNode = metaDataDocMgt.XmlDocument.SelectSingleNode(
                    "./a:Objects/a:Page[@ID='" + i.ToString(CultureInfo.InvariantCulture) + "']",
                    metaDataDocMgt.XmlNamespaceMgt);
                if (formNode != null)
                {
                    metaDataDocMgt.XmlCurrentFormNode = formNode;

                    if (postponedPages.Contains(metaDataDocMgt.GetCurrentPageId))
                    {
                        StringBuilder tmp = new StringBuilder();
                        if (ilen > 0)
                        {
                            int length = ilen - i.ToString(CultureInfo.InvariantCulture).Length;
                            if (length < 0)
                            {
                                length = 0;
                            }

                            tmp.Insert(0, " ", length);
                        }

                        string currentPage = i.ToString(CultureInfo.InvariantCulture);
                        string s           = Indentation +
                                             Convert.ToInt32(((pageCounter + 1) / numberOfPages) * 100) +
                                             "%  #" +
                                             currentPage + tmp.ToString();
                        Console.Write(s);
                        ilen = i.ToString(CultureInfo.InvariantCulture).Length;
                        pageCounter++;

                        try
                        {
                            TransformPage();
                        }
                        catch (TransformationException ex)
                        {
                            TransformationLog.WriteErrorToLogFile(ex, metaDataDocMgt.GetCurrentPageId);
                        }
                    }
                }
            }

            Console.WriteLine(String.Empty);
        }
        private static void AddMlCaptions(XmlNode page)
        {
            MetadataDocumentManagement metaDataDocMgt = MetadataDocumentManagement.Instance;
            XmlNodeList idList        = page.SelectNodes(@".//a:ID", metaDataDocMgt.XmlNamespaceMgt);
            int         destinationID = Convert.ToInt32(page.Attributes["ID"].Value, CultureInfo.InvariantCulture);

            foreach (XmlNode id in idList)
            {
                if (!string.IsNullOrEmpty(id.InnerText))
                {
                    try
                    {
                        AddMultiLanguageSupport.PopulateMlStrings(id.ParentNode, destinationID, Convert.ToInt32(id.InnerText, CultureInfo.InvariantCulture));
                    }
                    catch (Exception ex)
                    {
                        string log = String.Format(CultureInfo.InvariantCulture, Resources.CannotGetMlCaption, "control ", id.InnerText);
                        TransformationLog.GenericLogEntry(log, LogCategory.Warning, destinationID, "Ignore");
                        TransformationLog.WriteErrorToLogFile(ex, destinationID, LogCategory.Warning);
                    }
                }
            }

            XmlNode pageCaption = page.SelectSingleNode(@"./a:Properties", metaDataDocMgt.XmlNamespaceMgt);

            if (pageCaption != null)
            {
                try
                {
                    AddMultiLanguageSupport.PopulateMlStrings(pageCaption, destinationID, 0);
                }
                catch (Exception ex)
                {
                    string log = String.Format(CultureInfo.InvariantCulture, Resources.CannotGetMlCaption, "page", string.Empty);
                    TransformationLog.GenericLogEntry(log, LogCategory.Warning, destinationID, "Ignore");
                    TransformationLog.WriteErrorToLogFile(ex, destinationID, LogCategory.Warning);
                }
            }

            XmlNode code = page.SelectSingleNode(@"./a:Code", metaDataDocMgt.XmlNamespaceMgt);

            if (code == null)
            {
                return;
            }

            try
            {
                System.Text.RegularExpressions.Regex textVariableExp = new System.Text.RegularExpressions.Regex(@"\@(?<varId>\d+)\s*\:\s*TextConst\s*\'", System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                if (!textVariableExp.Match(code.InnerText).Success)
                {
                    return;
                }

                string[] codeArr = code.InnerText.Split(new char[] { '\r' });
                System.Text.RegularExpressions.Match textVariableMatch;
                int    textVarId;
                string textVarNewCaption;
                for (int i = 0; i < codeArr.Length; i++)
                {
                    textVariableMatch = textVariableExp.Match(codeArr[i]);
                    if (textVariableMatch.Success)
                    {
                        textVarId         = Convert.ToInt32(textVariableMatch.Result("${varId}"), CultureInfo.InvariantCulture);
                        textVarNewCaption = AddMultiLanguageSupport.GetCaptionML(destinationID, textVarId, AddMultiLanguageSupport.TranslationType.TextVariable);
                        if (!string.IsNullOrEmpty(textVarNewCaption))
                        {
                            textVarNewCaption = textVarNewCaption.Replace("'", "''");
                            codeArr[i]        = codeArr[i].Remove(textVariableMatch.Length + textVariableMatch.Index) + textVarNewCaption + "';";
                        }
                    }
                }

                XmlNode codeNode = XmlUtility.CreateXmlElement("Code");
                codeNode.AppendChild(XmlUtility.CreateCDataSection(string.Join("\r", codeArr)));
                code.ParentNode.AppendChild(codeNode);
                code.ParentNode.RemoveChild(code);
            }
            catch (Exception ex)
            {
                string log = String.Format(CultureInfo.InvariantCulture, Resources.CannotGetMlCaption, "code", string.Empty);
                TransformationLog.GenericLogEntry(log, LogCategory.Warning, destinationID, "Ignore");
                TransformationLog.WriteErrorToLogFile(ex, destinationID, LogCategory.Warning);
            }
        }
        private bool TestSchema(XmlDocument doc, String schema)
        {
            string fileName = "tmp.xml";

            try
            {
                if (doc != null)
                {
                    Console.Write("-> Validate " + schema);
                    XmlReaderSettings pageSchemaSetting = new XmlReaderSettings();
                    pageSchemaSetting.Schemas.Add("urn:schemas-microsoft-com:dynamics:NAV:ApplicationObjects", userMgt.SchemasPathLocation + schema);
                    pageSchemaSetting.ValidationType          = ValidationType.Schema;
                    pageSchemaSetting.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);

                    //XmlReader rdr = XmlReader.Create(new XmlNodeReader(doc), pageSchemaSetting);
                    //doc.Save(FileName);

                    FileInfo fi = new FileInfo(schema);
                    fileName = fi.Name + "." + fileName;
                    doc.Save(fileName);
                    XmlReader rdr = XmlReader.Create(fileName, pageSchemaSetting);

                    StringBuilder sb = new StringBuilder();
                    while (rdr.Read())
                    {
                        sb.Append(rdr.Value);
                    }

                    rdr.Close();
                    Console.WriteLine("...Done. ");

                    try
                    {
                        System.IO.File.Delete(fileName);
                    }
                    catch (IOException ex)
                    {
                        string logStr = string.Format(CultureInfo.InvariantCulture, Resources.CanNotDeleteTmpFile, ex.Message);
                        TransformationLog.GenericLogEntry(logStr, LogCategory.Warning, (int)LogEntryObjectId.NotSpecified, null);
                    }
                }

                return(true);
            }
            catch (Exception e)
            {
                Console.WriteLine("...FAILED. ");
                Console.WriteLine(e.Message);
                TransformationLog.GenericLogEntry("Schema: " + schema, LogCategory.Error);
                TransformationLog.WriteErrorToLogFile(e, (int)LogEntryObjectId.Error);
                //TransformationLog.GenericLogEntry(e.Message, LogCategory.Error);

                //try
                //{
                //  FileInfo fi = new FileInfo(schema);
                //  File.Move(FileName, fi.Name + "." + FileName);
                //}
                //finally
                //{
                //  TransformationLog.GenericLogEntry(FileName, LogCategory.IgnoreWarning);
                //}

                return(false);
            }
        }
        private static void ReadTranslationFile()
        {
            if (fileState == TranslationFileStates.NotRead)
            {
                int pageId = 0;
                if (string.IsNullOrEmpty(UserSetupManagement.Instance.TranslationFile))
                {
                    fileState = TranslationFileStates.NotRead;
                    return;
                }

                try
                {
                    System.Text.Encoding encoding;
                    string encodingPage = System.Configuration.ConfigurationManager.AppSettings["EncodingPage"];
                    int    encodingPageCode;
                    try
                    {
                        encodingPageCode = Convert.ToInt32(encodingPage, CultureInfo.InvariantCulture);
                        try
                        {
                            encoding = System.Text.Encoding.GetEncoding(encodingPageCode);
                        }
                        catch (Exception ex2)
                        {
                            string log = string.Format(CultureInfo.InvariantCulture, Resources.IncorrectEncodingPage, ex2.Message);
                            TransformationLog.GenericLogEntry(log, LogCategory.Error, (int)LogEntryObjectId.None);
                            encoding = System.Text.Encoding.GetEncoding(850);
                        }
                    }
                    catch (FormatException)
                    {
                        try
                        {
                            encoding = System.Text.Encoding.GetEncoding(encodingPage);
                        }
                        catch (Exception ex3)
                        {
                            string log = string.Format(CultureInfo.InvariantCulture, Resources.IncorrectEncodingPage, ex3.Message);
                            TransformationLog.GenericLogEntry(log, LogCategory.Error, (int)LogEntryObjectId.None);
                            encoding = System.Text.Encoding.GetEncoding(850);
                        }
                    }

                    string[] readFile = File.ReadAllLines(UserSetupManagement.Instance.TranslationFile, encoding);

                    Regex pageIdExp          = new Regex(@"N(?<pagelId>\d+)-", RegexOptions.IgnoreCase);
                    Regex controlIdExp       = new Regex(@"-(?<controlType>[CGQ])(?<controlId>\d+)-", RegexOptions.IgnoreCase);
                    Regex languageIdExp      = new Regex(@"-A(?<languageId>\d+)-", RegexOptions.IgnoreCase);
                    Regex captionExp         = new Regex(@"-L999:(?<caption>[\W\w\s]*)", RegexOptions.IgnoreCase);
                    Regex translationTypeExp = new Regex(@"-P(?<translationType>\d+)-", RegexOptions.IgnoreCase);
                    Regex actionIdExp        = new Regex(@"-G(?<actionId>\d+)-", RegexOptions.IgnoreCase);
                    Match translationTypeMatche;

                    foreach (string s in readFile)
                    {
                        pageId = 0;
                        int             controlId            = 0;
                        int             languageId           = 0;
                        string          caption              = string.Empty;
                        int             translationTypeValue = 0;
                        TranslationType translationType      = TranslationType.CaptionMl;
                        bool            goNext = false;

                        if (translationTypeExp.Match(s).Success)
                        {
                            translationTypeMatche = translationTypeExp.Matches(s)[translationTypeExp.Matches(s).Count - 1];

                            translationTypeValue = Convert.ToInt32(translationTypeMatche.Result("${translationType}"), CultureInfo.InvariantCulture);

                            switch (translationTypeValue)
                            {
                            case 8629:
                            case 55242:
                                translationType = TranslationType.CaptionMl;
                                break;

                            case 8631:
                                translationType = TranslationType.ToolTip;
                                break;

                            case 8632:
                                translationType = TranslationType.OptionCaptionMl;
                                break;

                            case 26171:
                                translationType = TranslationType.TextVariable;
                                break;

                            default:
                                goNext = true;
                                break;
                            }

                            if (!goNext)
                            {
                                if (captionExp.Match(s).Success)
                                {
                                    caption = captionExp.Match(s).Result("${caption}");

                                    if (languageIdExp.Match(s).Success)
                                    {
                                        languageId = Convert.ToInt32(languageIdExp.Match(s).Result("${languageId}"), CultureInfo.InvariantCulture);

                                        if (pageIdExp.Match(s).Success)
                                        {
                                            pageId = Convert.ToInt32(pageIdExp.Match(s).Result("${pagelId}"), CultureInfo.InvariantCulture);

                                            controlId = GetControlIdFromTranslation(controlIdExp, actionIdExp, s, controlId);

                                            Dictionary <TranslationType, Dictionary <int, string> > pageWithTranslationType;
                                            if (translations.TryGetValue(pageId, out pageWithTranslationType))
                                            {
                                                Dictionary <int, string> controlsWithCaptions = new Dictionary <int, string>();
                                                if (pageWithTranslationType.TryGetValue(translationType, out controlsWithCaptions))
                                                {
                                                    string captionValue = string.Empty;
                                                    if (controlsWithCaptions.TryGetValue(controlId, out captionValue))
                                                    {
                                                        if (translationType == TranslationType.TextVariable)
                                                        {
                                                            captionValue = String.Format(CultureInfo.InvariantCulture, "{0};{1}", captionValue, PrepareCaptionValue(pageId, languageId, caption, translationType));
                                                        }
                                                        else
                                                        {
                                                            captionValue = String.Format(CultureInfo.InvariantCulture, "{0};\r\n{1}", captionValue, PrepareCaptionValue(pageId, languageId, caption, translationType));
                                                        }

                                                        controlsWithCaptions[controlId] = captionValue;
                                                    }
                                                    else
                                                    {
                                                        captionValue = PrepareCaptionValue(pageId, languageId, caption, translationType);
                                                        controlsWithCaptions.Add(controlId, captionValue);
                                                    }
                                                }
                                                else
                                                {
                                                    controlsWithCaptions = new Dictionary <int, string>();
                                                    string captionValue = PrepareCaptionValue(pageId, languageId, caption, translationType);
                                                    controlsWithCaptions.Add(controlId, captionValue);

                                                    pageWithTranslationType.Add(translationType, controlsWithCaptions);
                                                }
                                            }
                                            else
                                            {
                                                Dictionary <int, string> controlsWithCaptions = new Dictionary <int, string>();
                                                string captionValue = PrepareCaptionValue(pageId, languageId, caption, translationType);
                                                controlsWithCaptions.Add(controlId, captionValue);

                                                pageWithTranslationType = new Dictionary <TranslationType, Dictionary <int, string> >();
                                                pageWithTranslationType.Add(translationType, controlsWithCaptions);

                                                translations.Add(pageId, pageWithTranslationType);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                    fileState = TranslationFileStates.Read;
                }
                catch (Exception ex)
                {
                    fileState = TranslationFileStates.NotReady;
                    TransformationLog.GenericLogEntry(Resources.ImportingLocalizedStrings, LogCategory.Warning, pageId, "Check translation file");
                    TransformationLog.WriteErrorToLogFile(ex, pageId, LogCategory.Warning);
                }
            }
        }