/// <inheritdoc/>
 public override int GetHashCode()
 {
     return(HashCodeHelper.Combine(Packages.GetHashCode(), PackageDirectories.GetHashCode(), ConfigAsPackage?.GetHashCode() ?? 0));
 }
        private void Initialize(string[] args)
        {
            InitLog();

            Processor.Parse(args);

            if (ShouldOnlyProcessCommandLine)
            {
                return;
            }

            //case 1: base directory is specified in commands arguments
            //init all directories residing in that directory
            if (BaseDirectory != null)
            {
                UserDirectory = BaseDirectory;
                ComponentDirectories.Add(System.IO.Path.Combine(BaseDirectory, "Components"));
                TypeDirectories.Add(System.IO.Path.Combine(BaseDirectory, "Types"));
                PackageDirectories.Add(System.IO.Path.Combine(BaseDirectory, "Packages"));
                WorkspaceDirectory = System.IO.Path.Combine(BaseDirectory, "workspace");
                CacheDirectory     = System.IO.Path.Combine(BaseDirectory, "cache");
                DecisionDirectory  = System.IO.Path.Combine(BaseDirectory, "Decisions");
                BenchmarkDirectory = System.IO.Path.Combine(BaseDirectory, "Benchmarks");
            }

            //case 2. application run on mono && BaseDirectory has not been provided in command line arguments
            //
            if (TraceLabSDK.RuntimeInfo.IsRunInMono && TraceLabSDK.RuntimeInfo.OperatingSystem != TraceLabSDK.RuntimeInfo.OS.Windows &&
                BaseDirectory == null)
            {
                string executionDirectory = System.AppDomain.CurrentDomain.BaseDirectory;
                UserDirectory = System.IO.Path.Combine(Environment.GetEnvironmentVariable("HOME"), "TraceLab");

                //these directories are in the bundle so they should exists
                ComponentDirectories.Add(System.IO.Path.Combine(executionDirectory, "Components"));
                TypeDirectories.Add(System.IO.Path.Combine(executionDirectory, "Types"));
                PackageDirectories.Add(System.IO.Path.Combine(executionDirectory, "Packages"));

                //these directories in the user directory should be created first time (or during installation TODO)
                try
                {
                    string componentDir = System.IO.Path.Combine(UserDirectory, "Components");
                    ComponentDirectories.Add(componentDir);
                    System.IO.Directory.CreateDirectory(componentDir);

                    string typeDir = System.IO.Path.Combine(UserDirectory, "Types");
                    TypeDirectories.Add(typeDir);
                    System.IO.Directory.CreateDirectory(typeDir);

                    string packageDir = System.IO.Path.Combine(UserDirectory, "Packages");
                    PackageDirectories.Add(packageDir);
                    System.IO.Directory.CreateDirectory(packageDir);
                }
                catch (Exception)
                {
                }

                if (WorkspaceDirectory == null)
                {
                    WorkspaceDirectory = System.IO.Path.Combine(UserDirectory, "workspace");
                }
                if (CacheDirectory == null)
                {
                    CacheDirectory = System.IO.Path.Combine(UserDirectory, "cache");
                }

                if (DecisionDirectory == null)
                {
                    DecisionDirectory = System.IO.Path.Combine(UserDirectory, "Decisions");
                }

                if (BenchmarkDirectory == null)
                {
                    BenchmarkDirectory = System.IO.Path.Combine(UserDirectory, "Benchmarks");
                }
            }

            //case 3. application run on windows & BaseDirectory has not been provided in command line arguments
            //thus get values from Windows Registry
            if (BaseDirectory == null && TraceLabSDK.RuntimeInfo.OperatingSystem == TraceLabSDK.RuntimeInfo.OS.Windows)
            {
                // On 64bit machines, the installer might place the registry key in the Wow6432Node subkey of Software, so we have to check
                // both locations.
                var globalKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(TraceLabRegistryKey);
                if (globalKey == null)
                {
                    globalKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(TraceLabWow64RegistryKey);
                }

                var localKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(TraceLabRegistryKey);
                if (localKey == null)
                {
                    localKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(TraceLabWow64RegistryKey);
                }

                // If the directories were not specified on the commandline, then read whatever we have in the registry.
                if (ComponentDirectories.Count == 0)
                {
                    AddValueIfExists <string> (globalKey, "Components", ComponentDirectories);
                    AddValueIfExists <string> (localKey, "Components", ComponentDirectories);
                }

                // If the types were not specified on the commandline, the read whatever we have in the registry.
                if (TypeDirectories.Count == 0)
                {
                    AddValueIfExists <string> (globalKey, "Types", TypeDirectories);
                    AddValueIfExists <string> (localKey, "Types", TypeDirectories);
                }

                if (PackageDirectories.Count == 0)
                {
                    AddValueIfExists <string> (globalKey, "Packages", PackageDirectories);
                    AddValueIfExists <string> (localKey, "Packages", PackageDirectories);
                }

                if (localKey != null)
                {
                    UserDirectory = (string)localKey.GetValue("UserDirectory");

                    if (WorkspaceDirectory == null)
                    {
                        WorkspaceDirectory = System.IO.Path.Combine(UserDirectory, "workspace");
                    }
                    if (CacheDirectory == null)
                    {
                        CacheDirectory = System.IO.Path.Combine(UserDirectory, "cache");
                    }

                    if (DecisionDirectory == null)
                    {
                        DecisionDirectory = System.IO.Path.Combine(UserDirectory, "Decisions");
                    }

                    if (BenchmarkDirectory == null)
                    {
                        BenchmarkDirectory = System.IO.Path.Combine(UserDirectory, "Benchmarks");
                    }
                }
            }
        }