public INeo4jInstance Create(Neo4jDeploymentRequest request)
        {
            INeo4jInstance instance;

            switch (request.Version.Architecture)
            {
            case Neo4jArchitecture.V3:
                instance = javaInstanceFunc(request);

                const string configFile = Neo4jConfigFile;
                instance.Configure(configFile, "dbms.security.auth_enabled", "false");
                instance.Configure(configFile, "dbms.allow_format_migration", "true");
                instance.Configure(configFile, "dbms.directories.import", null);

                instance.Configure(configFile, "dbms.connector.http.listen_address", $":{request.Endpoints.HttpEndpoint.Port}");

                if (request.Endpoints.BoltEndpoint != null)
                {
                    instance.Configure(configFile, "dbms.connector.bolt.listen_address", $":{request.Endpoints.BoltEndpoint.Port}");
                    instance.Configure(configFile, "dbms.connector.bolt.enabled", "true");
                }
                else
                {
                    instance.Configure(configFile, "dbms.connector.bolt.enabled", "false");
                }

                if (request.Endpoints.HttpsEndpoint != null)
                {
                    instance.Configure(configFile, "dbms.connector.https.listen_address", $":{request.Endpoints.HttpsEndpoint.Port}");
                    instance.Configure(configFile, "dbms.connector.https.enabled", "true");
                }
                else
                {
                    instance.Configure(configFile, "dbms.connector.https.enabled", "false");
                }
                break;

            default:
                throw new ArgumentException($"Architecture: {request.Version.Architecture} unknown");
            }

            return(instance);
        }
        public string Create(Neo4jDeploymentRequest request)
        {
            var id = Guid.NewGuid().ToString();

            Helper.Download(request.Version, appSettings.GetString(AppSettingsKeys.Neo4jBasePath));
            Helper.Extract(request.Version, appSettings.GetString(AppSettingsKeys.Neo4jBasePath));

            var targetDeploymentPath = GetDeploymentPath(id);

            Helper.SafeDelete(targetDeploymentPath);
            Helper.CopyDeployment(request.Version, appSettings.GetString(AppSettingsKeys.Neo4jBasePath), targetDeploymentPath);

            request.Neo4jFolder = Directory.GetDirectories(targetDeploymentPath)
                                  .First(f => f.Contains(request.Version.Version, StringComparison.OrdinalIgnoreCase));

            lock (_object)
            {
                short offset = 0;
                while (true)
                {
                    if (this.All(i => i.Value.Offset != offset))
                    {
                        break;
                    }

                    offset++;
                }

                request.Offset = offset;

                request.Endpoints = new Neo4jEndpoints
                {
                    HttpEndpoint = new Uri($"http://localhost:{appSettings.Get<long>(AppSettingsKeys.StartHttpPort) + offset}"),
                    BoltEndpoint = new Uri($"bolt://localhost:{appSettings.Get<long>(AppSettingsKeys.StartBoltPort) + offset}"),
                };

                var instance = neo4jInstanceFactory.Create(request);

                TryAdd(id, instance);

                return(id);
            }
        }