public void Import(MigrationToolSettings settings)
        {
            var sourceImportFilePath = Path.Combine(settings.SourceDirectory, "localization-resource-translations.sql");

            if (!File.Exists(sourceImportFilePath))
            {
                throw new IOException($"Source file '{sourceImportFilePath}' for import not found!");
            }

            // create DB structures in target database
            using (var db = new LanguageEntities(settings.ConnectionString))
            {
                var resource = db.LocalizationResources.Where(r => r.Id == 0);
            }

            var fileInfo = new FileInfo(sourceImportFilePath);
            var script   = fileInfo.OpenText().ReadToEnd();

            using (var connection = new SqlConnection(settings.ConnectionString))
            {
                connection.Open();

                using (var command = new SqlCommand(script, connection))
                {
                    command.ExecuteNonQuery();
                }
            }
        }
        internal ICollection <LocalizationResource> Extract(MigrationToolSettings settings)
        {
            if (settings.ExportFromDatabase)
            {
                using (var db = new LanguageEntities(settings.ConnectionString))
                {
                    return(db.LocalizationResources.Include(r => r.Translations).ToList());
                }
            }

            // test few default conventions (lazy enough to read from EPiServer Framework configuration file)
            string resourceFilesSourceDir;

            if (!string.IsNullOrEmpty(settings.ResourceDirectory))
            {
                resourceFilesSourceDir = Path.Combine(settings.SourceDirectory, settings.ResourceDirectory);
            }
            else
            {
                resourceFilesSourceDir = Path.Combine(settings.SourceDirectory, "Resources\\LanguageFiles");
                if (!Directory.Exists(resourceFilesSourceDir))
                {
                    resourceFilesSourceDir = Path.Combine(settings.SourceDirectory, "lang");
                }
            }

            if (!Directory.Exists(resourceFilesSourceDir))
            {
                throw new IOException($"Default resource directory '{resourceFilesSourceDir}' does not exist or can't be found. Use `-resourceDir` argument");
            }

            var resourceFiles = Directory.GetFiles(resourceFilesSourceDir, "*.xml");

            if (!resourceFiles.Any())
            {
                Console.WriteLine($"No resource files found in '{resourceFilesSourceDir}'");
            }

            var fileProcessor = new ResourceFileProcessor();
            var resources     = fileProcessor.ParseFiles(resourceFiles);

            // initialize DB - to generate data structures
            try
            {
                using (var db = new LanguageEntities(settings.ConnectionString))
                {
                    var resource = db.LocalizationResources.Where(r => r.Id == 0);
                }
            }
            catch
            {
                // it's OK to have exception here
            }

            return(resources);
        }
Пример #3
0
        private static void ReadConnectionString(MigrationToolSettings settings)
        {
            var vdm  = new VirtualDirectoryMapping(_settings.SourceDirectory, true);
            var wcfm = new WebConfigurationFileMap();

            wcfm.VirtualDirectories.Add("/", vdm);
            var config = WebConfigurationManager.OpenMappedWebConfiguration(wcfm, "/");

            var connectionString = config.ConnectionStrings.ConnectionStrings["EPiServerDB"].ConnectionString;

            if (string.IsNullOrWhiteSpace(connectionString))
            {
                throw new ConfigurationErrorsException("Cannot find EPiServer database connection");
            }

            settings.ConnectionString = connectionString;
        }
Пример #4
0
        public static void Main(string[] args)
        {
            _settings = ParseArguments(args);

            if (_settings.ShowHelp)
            {
                ShowHelp(_settings.OptionSet);
                return;
            }

            if (string.IsNullOrEmpty(_settings.SourceDirectory))
            {
                Console.WriteLine("ERROR: Source directory parameter is missing!");
                Console.WriteLine();
                ShowHelp(_settings.OptionSet);
                return;
            }

            if (!Directory.Exists(_settings.SourceDirectory))
            {
                throw new IOException($"Source directory `{_settings.SourceDirectory}` does not exist!");
            }

            if (!File.Exists(Path.Combine(_settings.SourceDirectory, "web.config")))
            {
                throw new IOException($"File `web.config` file not found in `{_settings.SourceDirectory}`!");
            }

            Directory.SetCurrentDirectory(_settings.SourceDirectory);
            ReadConnectionString(_settings);
            AppDomain.CurrentDomain.SetData("DataDirectory", Path.Combine(_settings.SourceDirectory, "App_Data"));

            if (_settings.ExportResources)
            {
                try
                {
                    Console.WriteLine("Export started.");
                    var    extractor = new ResourceExtractor();
                    var    resources = extractor.Extract(_settings);
                    string generatedScript;

                    if (_settings.Json)
                    {
                        var serializer = new JsonResourceExporter();
                        generatedScript = serializer.Export(resources).SerializedData;
                    }
                    else
                    {
                        var scriptGenerator = new SqlScriptGenerator();
                        generatedScript = scriptGenerator.Generate(resources, _settings.ScriptUpdate);
                    }

                    var scriptFileWriter = new ResultFileWriter();
                    var outputFile       = scriptFileWriter.Write(generatedScript, _settings.TargetDirectory, _settings.Json);

                    Console.WriteLine($"Output file: {outputFile}");
                    Console.WriteLine("Export completed!");
                }
                catch (Exception e)
                {
                    Console.WriteLine($"Error running tool: {e.Message}");
                    return;
                }
            }

            if (_settings.ImportResources)
            {
                Console.WriteLine("Import started!");

                var importer = new ResourceImporter();
                importer.Import(_settings);

                Console.WriteLine("Import completed!");
            }

            if (!_settings.ExportResources && !_settings.ImportResources)
            {
                Console.WriteLine("No command specified.");
                Console.WriteLine("Try 'DbLocalizationProvider.MigrationTool.exe --help' for more information.");
            }

            if (Debugger.IsAttached)
            {
                Console.ReadLine();
            }
        }
Пример #5
0
        private static MigrationToolSettings ParseArguments(string[] args)
        {
            var showHelp           = false;
            var sourceDirectory    = string.Empty;
            var resourceDirectory  = string.Empty;
            var targetDirectory    = string.Empty;
            var scriptUpdate       = false;
            var exportResources    = false;
            var importResources    = false;
            var exportFromDatabase = false;
            var jsonFormat         = false;

            var p = new OptionSet
            {
                {
                    "s|sourceDir=", "web application source directory",
                    v => sourceDirectory = v
                },
                {
                    "t|targetDir=", "Target directory where to write import script (by default 'sourceDir')",
                    v => targetDirectory = v
                },
                {
                    "resourceDir=", "Xml language resource directory (relative to `sourceDir`, by default `Resources\\LanguageFiles`)",
                    v => resourceDirectory = v
                },
                {
                    "o|overwriteResources", "Generate update script statements for existing resources",
                    k => scriptUpdate = true
                },
                {
                    "e|exportResources", "Export localization resources",
                    k => exportResources = true
                },
                {
                    "from-db|fromDatabase", "Export localization resources from SQL database",
                    k => exportFromDatabase = true
                },
                {
                    "json|jsonFormat", "Use JSON format",
                    k => jsonFormat = true
                },
                {
                    "i|importResources", "Import localization resources from SQL file into database",
                    k => importResources = true
                },
                {
                    "h|help", "show this message and exit",
                    v => showHelp = v != null
                }
            };

            var result = new MigrationToolSettings(p);

            try
            {
                var extra = p.Parse(args);
                result.SourceDirectory    = sourceDirectory;
                result.ResourceDirectory  = resourceDirectory;
                result.TargetDirectory    = targetDirectory;
                result.ScriptUpdate       = scriptUpdate;
                result.ExportResources    = exportResources;
                result.ExportFromDatabase = exportFromDatabase;
                result.ImportResources    = importResources;
                result.ShowHelp           = showHelp;
                result.Json = jsonFormat;
            }
            catch (OptionException e)
            {
                Console.Write("DbLocalizationProvider.MigrationTool: ");
                Console.WriteLine(e.Message);
                Console.WriteLine("Try 'DbLocalizationProvider.MigrationTool.exe --help' for more information.");
            }

            if (string.IsNullOrEmpty(result.TargetDirectory))
            {
                result.TargetDirectory = result.SourceDirectory;
            }

            return(result);
        }