diff --git a/libxtracfg/java/src/main/java/de/ii/xtraplatform/cli/AutoHandler.java b/libxtracfg/java/src/main/java/de/ii/xtraplatform/cli/AutoHandler.java index c447081..d64c533 100644 --- a/libxtracfg/java/src/main/java/de/ii/xtraplatform/cli/AutoHandler.java +++ b/libxtracfg/java/src/main/java/de/ii/xtraplatform/cli/AutoHandler.java @@ -14,6 +14,7 @@ import de.ii.xtraplatform.features.sql.domain.ImmutableFeatureProviderSqlData; import de.ii.xtraplatform.tiles.domain.TileProviderFeaturesData; import de.ii.xtraplatform.values.domain.Identifier; + import java.io.File; import java.io.IOException; import java.net.URI; @@ -25,573 +26,585 @@ import java.util.function.Consumer; public class AutoHandler { - public static Result preCheck(Map parameters, LdproxyCfg ldproxyCfg) { - if (Objects.isNull(ldproxyCfg)) { - return Result.failure("Not connected to store"); - } + public static Result preCheck(Map parameters, LdproxyCfg ldproxyCfg) { + if (Objects.isNull(ldproxyCfg)) { + return Result.failure("Not connected to store"); + } - ldproxyCfg.initStore(); + ldproxyCfg.initStore(); - if (!parameters.containsKey("id")) { - return Result.failure("No id given"); - } + if (!parameters.containsKey("id")) { + return Result.failure("No id given"); + } - String id = parameters.get("id"); + String id = parameters.get("id"); - if (id.length() < 3) { - return Result.failure("Id has to be at least 3 characters long"); - } + if (id.length() < 3) { + return Result.failure("Id has to be at least 3 characters long"); + } - Identifier identifier = Identifier.from(id, "providers"); - Map typeObject = parseTypeObject(parameters.get("typeObject")); + Identifier identifier = Identifier.from(id, "providers"); + Map typeObject = parseTypeObject(parameters.get("typeObject")); - if (typeObject.getOrDefault("provider", false) == true - && ldproxyCfg.getEntityDataStore().has(identifier)) { - return Result.failure("A provider with id '" + id + "' already exists"); - } + if (typeObject.getOrDefault("provider", false) == true + && ldproxyCfg.getEntityDataStore().has(identifier)) { + return Result.failure("A provider with id '" + id + "' already exists"); + } - if (parameters.containsKey("featureProviderType") - && parameters.get("featureProviderType").equals("PGIS") - && (!parameters.containsKey("host") || parameters.get("host").isBlank())) { - return Result.failure("Host is required for PGIS connection"); - } + if (parameters.containsKey("featureProviderType") + && parameters.get("featureProviderType").equals("PGIS") + && (!parameters.containsKey("host") || parameters.get("host").isBlank())) { + return Result.failure("Host is required for PGIS connection"); + } - if (parameters.containsKey("featureProviderType") - && parameters.get("featureProviderType").equals("WFS")) { - if (!parameters.containsKey("url") || parameters.get("url").isBlank()) { - return Result.failure("URL is required for WFS connection"); - } - try { - URI uri = URI.create(parameters.get("url")); - if (!Objects.equals(uri.getScheme(), "http") && !Objects.equals(uri.getScheme(), "https")) { - return Result.failure("Invalid URL scheme for WFS connection"); + if (parameters.containsKey("featureProviderType") + && parameters.get("featureProviderType").equals("WFS")) { + if (!parameters.containsKey("url") || parameters.get("url").isBlank()) { + return Result.failure("URL is required for WFS connection"); + } + try { + URI uri = URI.create(parameters.get("url")); + if (!Objects.equals(uri.getScheme(), "http") && !Objects.equals(uri.getScheme(), "https")) { + return Result.failure("Invalid URL scheme for WFS connection"); + } + } catch (IllegalArgumentException e) { + return Result.failure("Invalid URL for WFS connection"); + } } - } catch (IllegalArgumentException e) { - return Result.failure("Invalid URL for WFS connection"); - } - } - return Result.empty(); - } - - public static Result check( - Map parameters, - LdproxyCfg ldproxyCfg, - Optional path, - boolean verbose, - boolean debug) { - - // TODO: check connectionInfo - - return Result.ok("All good"); - } - - public static Result analyze( - Map parameters, - LdproxyCfg ldproxyCfg, - Optional path, - boolean verbose, - boolean debug) { - Result result = new Result(); - - try { - FeatureProviderDataV2 featureProvider = - parseFeatureProvider(parameters, ldproxyCfg, Map.of()); - - AutoEntityFactory autoFactory = - getAutoFactory( - ldproxyCfg, EntityType.PROVIDERS.toString(), featureProvider.getEntitySubType()); - - Map> types = autoFactory.analyze(featureProvider); - - result.success("All good"); - result.details("types", types); - } catch (Throwable e) { - e.printStackTrace(); - if (e instanceof RuntimeException - && Objects.nonNull(e.getCause()) - && Objects.nonNull(e.getCause().getMessage())) { - result.error(e.getCause().getMessage()); - } else if (Objects.nonNull(e.getMessage())) { - result.error(e.getMessage()); - } + return Result.empty(); } - return result; - } - - public static Result generate( - Map parameters, - LdproxyCfg ldproxyCfg, - Optional path, - boolean verbose, - boolean debug, - Map> types, - Consumer tracker) { - Result result = new Result(); - - try { - String createOption = parameters.get("createOption"); - String selectedConfig = parameters.get("selectedConfig"); - String newId = parameters.get("id"); - Map typeObject = parseTypeObject(parameters.get("typeObject")); - - if ("fromScratch".equalsIgnoreCase(createOption)) { - return generateBasicEntity(parameters, ldproxyCfg, typeObject); - } - - if ("copy".equalsIgnoreCase(createOption)) { - // Get related configurations (selectedSubConfigsSelector) - String selectedSubConfigsSelector = parameters.get("selectedSubConfigsSelector"); - List cleanedPaths = new ArrayList<>(); - - if (selectedSubConfigsSelector != null && !selectedSubConfigsSelector.isBlank()) { - cleanedPaths = - Arrays.stream(selectedSubConfigsSelector.replaceAll("[\\[\\]]", "").split(",")) - .map(e -> e.replaceAll("\\s*\\(.*\\)", "").trim()) - .filter(e -> !e.isEmpty()) - .toList(); - } + public static Result check( + Map parameters, + LdproxyCfg ldproxyCfg, + Optional path, + boolean verbose, + boolean debug) { - if (selectedConfig == null || selectedConfig.isBlank()) { - return Result.failure("No selectedConfig provided in parameters"); - } - if (newId == null || newId.isBlank()) { - return Result.failure("No id provided in parameters"); - } + // TODO: check connectionInfo - if (selectedConfig != null && selectedConfig.contains("-tiles")) { - newId = newId + "-tiles"; - } + return Result.ok("All good"); + } - File sourceFile = new File(selectedConfig); - if (!sourceFile.exists()) { - return Result.failure("Selected config file does not exist: " + selectedConfig); + public static Result analyze( + Map parameters, + LdproxyCfg ldproxyCfg, + Optional path, + boolean verbose, + boolean debug) { + Result result = new Result(); + + try { + FeatureProviderDataV2 featureProvider = + parseFeatureProvider(parameters, ldproxyCfg, Map.of()); + + AutoEntityFactory autoFactory = + getAutoFactory( + ldproxyCfg, EntityType.PROVIDERS.toString(), featureProvider.getEntitySubType()); + + Map> types = autoFactory.analyze(featureProvider); + + result.success("All good"); + result.details("types", types); + } catch (Throwable e) { + e.printStackTrace(); + if (e instanceof RuntimeException + && Objects.nonNull(e.getCause()) + && Objects.nonNull(e.getCause().getMessage())) { + result.error(e.getCause().getMessage()); + } else if (Objects.nonNull(e.getMessage())) { + result.error(e.getMessage()); + } } - Map yamlContent = - ldproxyCfg.getObjectMapper().readValue(sourceFile, Map.class); + return result; + } - if (yamlContent.containsKey("id")) { - yamlContent.put("id", newId); - } + public static Result generate( + Map parameters, + LdproxyCfg ldproxyCfg, + Optional path, + boolean verbose, + boolean debug, + Map> types, + Consumer tracker) { + Result result = new Result(); + + try { + String createOption = parameters.get("createOption"); + String selectedConfig = parameters.get("selectedConfig"); + String newId = parameters.get("id"); + Map typeObject = parseTypeObject(parameters.get("typeObject")); + + if ("fromScratch".equalsIgnoreCase(createOption)) { + return generateBasicEntity(parameters, ldproxyCfg, typeObject); + } + + if ("copy".equalsIgnoreCase(createOption)) { + // Get related configurations (selectedSubConfigsSelector) + String selectedSubConfigsSelector = parameters.get("selectedSubConfigsSelector"); + List cleanedPaths = new ArrayList<>(); + + if (selectedSubConfigsSelector != null && !selectedSubConfigsSelector.isBlank()) { + cleanedPaths = + Arrays.stream(selectedSubConfigsSelector.replaceAll("[\\[\\]]", "").split(",")) + .map(e -> e.replaceAll("\\s*\\(.*\\)", "").trim()) + .filter(e -> !e.isEmpty()) + .toList(); + } + + if (selectedConfig == null || selectedConfig.isBlank()) { + return Result.failure("No selectedConfig provided in parameters"); + } + if (newId == null || newId.isBlank()) { + return Result.failure("No id provided in parameters"); + } + + if (selectedConfig != null && selectedConfig.contains("-tiles")) { + newId = newId + "-tiles"; + } + + File sourceFile = new File(selectedConfig); + if (!sourceFile.exists()) { + return Result.failure("Selected config file does not exist: " + selectedConfig); + } + + Map yamlContent = + ldproxyCfg.getObjectMapper().readValue(sourceFile, Map.class); + + if (yamlContent.containsKey("id")) { + yamlContent.put("id", newId); + } + + File targetFile = new File(new File(selectedConfig).getParent(), newId + ".yml"); + ldproxyCfg.getObjectMapper().writeValue(targetFile, yamlContent); + + List filesToAdd = new ArrayList<>(); + filesToAdd.add(ldproxyCfg.getDataDirectory().relativize(targetFile.toPath()).toString()); + + if (cleanedPaths.size() > 0) { + for (String pathToCfg : cleanedPaths) { + File subSourceFile = new File(pathToCfg); + if (!subSourceFile.exists()) { + return Result.failure("Selected sub-config file does not exist: " + pathToCfg); + } + + // Check if the file ends with .json + if (pathToCfg.endsWith(".json")) { + // Determine the parent directory and create a new folder with the id + File parentDir = subSourceFile.getParentFile().getParentFile(); // Go one directory up + File targetDir = new File(parentDir, newId.replaceAll("\\.json|\\.yaml", "")); + if (!targetDir.exists() && !targetDir.mkdirs()) { + return Result.failure( + "Failed to create target directory: " + targetDir.getAbsolutePath()); + } + + // Copy the file to the new directory + File targetFile2 = new File(targetDir, subSourceFile.getName()); + Files.copy( + subSourceFile.toPath(), + targetFile2.toPath(), + StandardCopyOption.REPLACE_EXISTING); + + filesToAdd.add( + ldproxyCfg.getDataDirectory().relativize(targetFile2.toPath()).toString()); + } else { + Map subYamlContent = + ldproxyCfg.getObjectMapper().readValue(subSourceFile, Map.class); + + if (subYamlContent.containsKey("id")) { + String subConfigId = newId; + boolean isTileProvider = + ("TILE".equals(subYamlContent.get("providerType"))); + + if (selectedConfig.endsWith("-tiles.yml") && !isTileProvider && subConfigId.endsWith("-tiles")) { + subConfigId = subConfigId.substring(0, subConfigId.length() - 6); + } else if (isTileProvider && !subConfigId.endsWith("-tiles")) { + subConfigId = subConfigId + "-tiles"; + } + + subYamlContent.put("id", subConfigId); + + File subTargetFile = new File(subSourceFile.getParent(), subConfigId + ".yml"); + ldproxyCfg.getObjectMapper().writeValue(subTargetFile, subYamlContent); + + filesToAdd.add( + ldproxyCfg.getDataDirectory().relativize(subTargetFile.toPath()).toString()); + } + } + } + } + + result.success("Config copied successfully"); + result.details("new_files", filesToAdd); + return result; + } - File targetFile = new File(new File(selectedConfig).getParent(), newId + ".yml"); - ldproxyCfg.getObjectMapper().writeValue(targetFile, yamlContent); + if (types == null || types.isEmpty()) { + if (selectedConfig == null || selectedConfig.isBlank()) { + return Result.failure("No selectedConfig provided in parameters"); + } - List filesToAdd = new ArrayList<>(); - filesToAdd.add(ldproxyCfg.getDataDirectory().relativize(targetFile.toPath()).toString()); + Map cfgJava = + ldproxyCfg.getObjectMapper().readValue(new File(selectedConfig), Map.class); - if (cleanedPaths.size() > 0) { - for (String pathToCfg : cleanedPaths) { - File subSourceFile = new File(pathToCfg); - if (!subSourceFile.exists()) { - return Result.failure("Selected sub-config file does not exist: " + pathToCfg); + types = determineTypes(cfgJava); } - // Check if the file ends with .json - if (pathToCfg.endsWith(".json")) { - // Determine the parent directory and create a new folder with the id - File parentDir = subSourceFile.getParentFile().getParentFile(); // Go one directory up - File targetDir = new File(parentDir, newId.replaceAll("\\.json|\\.yaml", "")); - if (!targetDir.exists() && !targetDir.mkdirs()) { - return Result.failure( - "Failed to create target directory: " + targetDir.getAbsolutePath()); - } - - // Copy the file to the new directory - File targetFile2 = new File(targetDir, subSourceFile.getName()); - Files.copy( - subSourceFile.toPath(), - targetFile2.toPath(), - StandardCopyOption.REPLACE_EXISTING); - - filesToAdd.add( - ldproxyCfg.getDataDirectory().relativize(targetFile2.toPath()).toString()); - } else { - Map subYamlContent = - ldproxyCfg.getObjectMapper().readValue(subSourceFile, Map.class); - - String subConfigId = newId; - if (subYamlContent.containsKey("id")) { - subYamlContent.put("id", subConfigId); - } - - File subTargetFile = new File(subSourceFile.getParent(), subConfigId + ".yml"); - ldproxyCfg.getObjectMapper().writeValue(subTargetFile, subYamlContent); - - filesToAdd.add( - ldproxyCfg.getDataDirectory().relativize(subTargetFile.toPath()).toString()); + long count = types.values().stream().mapToLong(List::size).sum(); + + Consumer>> tracker2 = + progress -> { + long current = Math.max(0, progress.values().stream().mapToLong(List::size).sum() - 1); + String currentTable = + progress.entrySet().stream() + .skip(progress.size() - 1) + .map( + entry -> + entry.getKey() + + "." + + entry.getValue().get(entry.getValue().size() - 1)) + .findFirst() + .orElse("???"); + + System.out.println("PROGRESS " + current + "/" + count + " " + currentTable); + + Map details = + Map.of( + "currentCount", + current, + "targetCount", + count, + "currentTable", + currentTable, + "progress", + progress); + + System.out.println("details: " + details); + tracker.accept(Result.ok("progress", details)); + }; + + List newFiles = new ArrayList<>(); + + if (typeObject.getOrDefault("provider", true)) { + FeatureProviderDataV2 featureProvider = parseFeatureProvider(parameters, ldproxyCfg, types); + + AutoEntityFactory autoFactory = + getAutoFactory( + ldproxyCfg, EntityType.PROVIDERS.toString(), featureProvider.getEntitySubType()); + + FeatureProviderDataV2 entityData = autoFactory.generate(featureProvider, types, tracker2); + + ldproxyCfg.writeEntity(entityData); + + newFiles.add( + ldproxyCfg + .getDataDirectory() + .relativize(ldproxyCfg.getEntityPath(entityData).normalize()) + .toString()); } - } - } - result.success("Config copied successfully"); - result.details("new_files", filesToAdd); - return result; - } + if (typeObject.getOrDefault("service", true)) { + OgcApiDataV2 ogcApi = parseOgcApi(parameters, ldproxyCfg); - if (types == null || types.isEmpty()) { - if (selectedConfig == null || selectedConfig.isBlank()) { - return Result.failure("No selectedConfig provided in parameters"); - } + AutoEntityFactory autoFactory2 = + getAutoFactory(ldproxyCfg, EntityType.SERVICES.toString(), ogcApi.getEntitySubType()); - Map cfgJava = - ldproxyCfg.getObjectMapper().readValue(new File(selectedConfig), Map.class); - - types = determineTypes(cfgJava); - } - - long count = types.values().stream().mapToLong(List::size).sum(); - - Consumer>> tracker2 = - progress -> { - long current = Math.max(0, progress.values().stream().mapToLong(List::size).sum() - 1); - String currentTable = - progress.entrySet().stream() - .skip(progress.size() - 1) - .map( - entry -> - entry.getKey() - + "." - + entry.getValue().get(entry.getValue().size() - 1)) - .findFirst() - .orElse("???"); - - System.out.println("PROGRESS " + current + "/" + count + " " + currentTable); - - Map details = - Map.of( - "currentCount", - current, - "targetCount", - count, - "currentTable", - currentTable, - "progress", - progress); - - System.out.println("details: " + details); - tracker.accept(Result.ok("progress", details)); - }; - - List newFiles = new ArrayList<>(); - - if (typeObject.getOrDefault("provider", true)) { - FeatureProviderDataV2 featureProvider = parseFeatureProvider(parameters, ldproxyCfg, types); + Map> types2 = + types.containsKey("") ? types : Map.of("", new ArrayList<>(types.keySet())); - AutoEntityFactory autoFactory = - getAutoFactory( - ldproxyCfg, EntityType.PROVIDERS.toString(), featureProvider.getEntitySubType()); + OgcApiDataV2 entityData2 = autoFactory2.generate(ogcApi, types2, ignore -> { + }); - FeatureProviderDataV2 entityData = autoFactory.generate(featureProvider, types, tracker2); + ldproxyCfg.writeEntity(entityData2); - ldproxyCfg.writeEntity(entityData); + newFiles.add( + ldproxyCfg + .getDataDirectory() + .relativize(ldproxyCfg.getEntityPath(entityData2).normalize()) + .toString()); + } - newFiles.add( - ldproxyCfg - .getDataDirectory() - .relativize(ldproxyCfg.getEntityPath(entityData).normalize()) - .toString()); - } + if (typeObject.getOrDefault("tileProvider", true)) { + TileProviderFeaturesData tileProvider = parseTileProvider(parameters, ldproxyCfg); - if (typeObject.getOrDefault("service", true)) { - OgcApiDataV2 ogcApi = parseOgcApi(parameters, ldproxyCfg); + AutoEntityFactory autoFactory3 = + getAutoFactory( + ldproxyCfg, EntityType.PROVIDERS.toString(), tileProvider.getEntitySubType()); - AutoEntityFactory autoFactory2 = - getAutoFactory(ldproxyCfg, EntityType.SERVICES.toString(), ogcApi.getEntitySubType()); + Map> types2 = + types.containsKey("") ? types : Map.of("", new ArrayList<>(types.keySet())); - Map> types2 = - types.containsKey("") ? types : Map.of("", new ArrayList<>(types.keySet())); + TileProviderFeaturesData entityData3 = + autoFactory3.generate(tileProvider, types2, ignore -> { + }); - OgcApiDataV2 entityData2 = autoFactory2.generate(ogcApi, types2, ignore -> {}); + ldproxyCfg.writeEntity(entityData3); - ldproxyCfg.writeEntity(entityData2); + newFiles.add( + ldproxyCfg + .getDataDirectory() + .relativize(ldproxyCfg.getEntityPath(entityData3).normalize()) + .toString()); + } - newFiles.add( - ldproxyCfg - .getDataDirectory() - .relativize(ldproxyCfg.getEntityPath(entityData2).normalize()) - .toString()); - } + result.success("All good"); - if (typeObject.getOrDefault("tileProvider", true)) { - TileProviderFeaturesData tileProvider = parseTileProvider(parameters, ldproxyCfg); + if (!newFiles.isEmpty()) { + result.details("new_files", newFiles); + } + return result; + } catch (Throwable e) { + e.printStackTrace(); + return Result.failure("Unexpected error: " + e.getMessage()); + } + } - AutoEntityFactory autoFactory3 = - getAutoFactory( - ldproxyCfg, EntityType.PROVIDERS.toString(), tileProvider.getEntitySubType()); + private static AutoEntityFactory getAutoFactory( + LdproxyCfg ldproxyCfg, String type, Optional subType) { + EntityFactory factory = ldproxyCfg.getEntityFactories().get(type, subType); - Map> types2 = - types.containsKey("") ? types : Map.of("", new ArrayList<>(types.keySet())); + AutoEntityFactory autoFactory = + factory + .auto() + .orElseThrow( + () -> + new IllegalArgumentException( + "No auto factory found for entity type " + factory.fullType())); + return autoFactory; + } - TileProviderFeaturesData entityData3 = - autoFactory3.generate(tileProvider, types2, ignore -> {}); + private static FeatureProviderDataV2 parseFeatureProvider( + Map parameters, LdproxyCfg ldproxyCfg, Map> types) { + if (!parameters.containsKey("id")) { + throw new IllegalArgumentException("No id given"); + } + if (parameters.get("id").length() < 3) { + throw new IllegalArgumentException("Id has to be at least 3 characters long"); + } - ldproxyCfg.writeEntity(entityData3); + String id = parameters.get("id"); - newFiles.add( - ldproxyCfg - .getDataDirectory() - .relativize(ldproxyCfg.getEntityPath(entityData3).normalize()) - .toString()); - } + String featureProviderTypeString = parameters.get("featureProviderType"); - result.success("All good"); + FeatureProviderType featureProviderType; + try { + featureProviderType = FeatureProviderType.valueOf(featureProviderTypeString); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException( + "Invalid featureProviderType: " + + featureProviderTypeString + + ". Expected one of: " + + Arrays.toString(FeatureProviderType.values()), + e); + } - if (!newFiles.isEmpty()) { - result.details("new_files", newFiles); - } - return result; - } catch (Throwable e) { - e.printStackTrace(); - return Result.failure("Unexpected error: " + e.getMessage()); - } - } - - private static AutoEntityFactory getAutoFactory( - LdproxyCfg ldproxyCfg, String type, Optional subType) { - EntityFactory factory = ldproxyCfg.getEntityFactories().get(type, subType); - - AutoEntityFactory autoFactory = - factory - .auto() - .orElseThrow( - () -> - new IllegalArgumentException( - "No auto factory found for entity type " + factory.fullType())); - return autoFactory; - } - - private static FeatureProviderDataV2 parseFeatureProvider( - Map parameters, LdproxyCfg ldproxyCfg, Map> types) { - if (!parameters.containsKey("id")) { - throw new IllegalArgumentException("No id given"); - } - if (parameters.get("id").length() < 3) { - throw new IllegalArgumentException("Id has to be at least 3 characters long"); + FeatureProviderDataV2.Builder builder = + AutoTypes.getBuilder( + ldproxyCfg, EntityType.PROVIDERS, ProviderType.FEATURE, featureProviderType) + .id(id); + + switch (featureProviderType) { + case PGIS: + return parseFeatureProviderPgis( + (ImmutableFeatureProviderSqlData.Builder) builder, parameters, types); + case GPKG: + return parseFeatureProviderGpkg( + (ImmutableFeatureProviderSqlData.Builder) builder, parameters); + case WFS: + return parseFeatureProviderWfs( + (ImmutableFeatureProviderWfsData.Builder) builder, parameters); + } + + return builder.build(); } - String id = parameters.get("id"); + private static FeatureProviderDataV2 parseFeatureProviderPgis( + ImmutableFeatureProviderSqlData.Builder builder, + Map parameters, + Map> types) { + Set schemas = types.keySet(); + + builder + .connectionInfoBuilder() + .dialect(ConnectionInfoSql.Dialect.PGIS.name()) + .host(Optional.ofNullable(parameters.get("host"))) + .database(parameters.get("database")) + .user(Optional.ofNullable(parameters.get("user"))) + .password( + Optional.ofNullable(parameters.get("password")) + .map(pw -> Base64.getEncoder().encodeToString(pw.getBytes(StandardCharsets.UTF_8)))) + .schemas(schemas) + .poolBuilder(); + + return builder.build(); + } - String featureProviderTypeString = parameters.get("featureProviderType"); + private static FeatureProviderDataV2 parseFeatureProviderGpkg( + ImmutableFeatureProviderSqlData.Builder builder, Map parameters) { - FeatureProviderType featureProviderType; - try { - featureProviderType = FeatureProviderType.valueOf(featureProviderTypeString); - } catch (IllegalArgumentException e) { - throw new IllegalArgumentException( - "Invalid featureProviderType: " - + featureProviderTypeString - + ". Expected one of: " - + Arrays.toString(FeatureProviderType.values()), - e); - } + builder + .connectionInfoBuilder() + .dialect(ConnectionInfoSql.Dialect.GPKG.name()) + .database(parameters.get("database")) + .poolBuilder(); - FeatureProviderDataV2.Builder builder = - AutoTypes.getBuilder( - ldproxyCfg, EntityType.PROVIDERS, ProviderType.FEATURE, featureProviderType) - .id(id); - - switch (featureProviderType) { - case PGIS: - return parseFeatureProviderPgis( - (ImmutableFeatureProviderSqlData.Builder) builder, parameters, types); - case GPKG: - return parseFeatureProviderGpkg( - (ImmutableFeatureProviderSqlData.Builder) builder, parameters); - case WFS: - return parseFeatureProviderWfs( - (ImmutableFeatureProviderWfsData.Builder) builder, parameters); + return builder.build(); } - return builder.build(); - } - - private static FeatureProviderDataV2 parseFeatureProviderPgis( - ImmutableFeatureProviderSqlData.Builder builder, - Map parameters, - Map> types) { - Set schemas = types.keySet(); - - builder - .connectionInfoBuilder() - .dialect(ConnectionInfoSql.Dialect.PGIS.name()) - .host(Optional.ofNullable(parameters.get("host"))) - .database(parameters.get("database")) - .user(Optional.ofNullable(parameters.get("user"))) - .password( - Optional.ofNullable(parameters.get("password")) - .map(pw -> Base64.getEncoder().encodeToString(pw.getBytes(StandardCharsets.UTF_8)))) - .schemas(schemas) - .poolBuilder(); - - return builder.build(); - } - - private static FeatureProviderDataV2 parseFeatureProviderGpkg( - ImmutableFeatureProviderSqlData.Builder builder, Map parameters) { - - builder - .connectionInfoBuilder() - .dialect(ConnectionInfoSql.Dialect.GPKG.name()) - .database(parameters.get("database")) - .poolBuilder(); - - return builder.build(); - } - - private static FeatureProviderDataV2 parseFeatureProviderWfs( - ImmutableFeatureProviderWfsData.Builder builder, Map parameters) { - - builder - .connectionInfoBuilder() - .uri(URI.create(parameters.get("url"))) - .user(Optional.ofNullable(parameters.get("user"))) - .password( - Optional.ofNullable(parameters.get("password")) - .map( - pw -> Base64.getEncoder().encodeToString(pw.getBytes(StandardCharsets.UTF_8)))); - return builder.build(); - } - - private static OgcApiDataV2 parseOgcApi(Map parameters, LdproxyCfg ldproxyCfg) { - if (!parameters.containsKey("id")) { - throw new IllegalArgumentException("No id given"); - } - if (parameters.get("id").length() < 3) { - throw new IllegalArgumentException("Id has to be at least 3 characters long"); + private static FeatureProviderDataV2 parseFeatureProviderWfs( + ImmutableFeatureProviderWfsData.Builder builder, Map parameters) { + + builder + .connectionInfoBuilder() + .uri(URI.create(parameters.get("url"))) + .user(Optional.ofNullable(parameters.get("user"))) + .password( + Optional.ofNullable(parameters.get("password")) + .map( + pw -> Base64.getEncoder().encodeToString(pw.getBytes(StandardCharsets.UTF_8)))); + return builder.build(); } - String id = parameters.get("id"); + private static OgcApiDataV2 parseOgcApi(Map parameters, LdproxyCfg ldproxyCfg) { + if (!parameters.containsKey("id")) { + throw new IllegalArgumentException("No id given"); + } + if (parameters.get("id").length() < 3) { + throw new IllegalArgumentException("Id has to be at least 3 characters long"); + } - OgcApiDataV2.Builder builder = - AutoTypes.getBuilder(ldproxyCfg, EntityType.SERVICES, ServiceType.OGC_API).id(id); + String id = parameters.get("id"); - return builder.build(); - } + OgcApiDataV2.Builder builder = + AutoTypes.getBuilder(ldproxyCfg, EntityType.SERVICES, ServiceType.OGC_API).id(id); - private static TileProviderFeaturesData parseTileProvider( - Map parameters, LdproxyCfg ldproxyCfg) { - if (!parameters.containsKey("id")) { - throw new IllegalArgumentException("No id given"); + return builder.build(); } - if (parameters.get("id").length() < 3) { - throw new IllegalArgumentException("Id has to be at least 3 characters long"); - } - - String id = parameters.get("id") + "-tiles"; - TileProviderFeaturesData.Builder builder = - (TileProviderFeaturesData.Builder) - AutoTypes.getBuilder( - ldproxyCfg, - EntityType.PROVIDERS, - ProviderType.TILE, - AutoTypes.TileProviderType.FEATURES) - .id(id); + private static TileProviderFeaturesData parseTileProvider( + Map parameters, LdproxyCfg ldproxyCfg) { + if (!parameters.containsKey("id")) { + throw new IllegalArgumentException("No id given"); + } + if (parameters.get("id").length() < 3) { + throw new IllegalArgumentException("Id has to be at least 3 characters long"); + } - return (TileProviderFeaturesData) builder.build(); - } + String id = parameters.get("id") + "-tiles"; - private static Map> determineTypes(Map yamlConfig) { - Map yamlTypes = (Map) yamlConfig.get("types"); - Map> extractedTypes = new HashMap<>(); + TileProviderFeaturesData.Builder builder = + (TileProviderFeaturesData.Builder) + AutoTypes.getBuilder( + ldproxyCfg, + EntityType.PROVIDERS, + ProviderType.TILE, + AutoTypes.TileProviderType.FEATURES) + .id(id); - if (yamlTypes != null) { - List values = new ArrayList<>(yamlTypes.keySet()); - extractedTypes.put("", values); + return (TileProviderFeaturesData) builder.build(); } - if (extractedTypes.isEmpty()) { - extractedTypes.put("", new ArrayList<>(yamlTypes != null ? yamlTypes.keySet() : List.of())); + private static Map> determineTypes(Map yamlConfig) { + Map yamlTypes = (Map) yamlConfig.get("types"); + Map> extractedTypes = new HashMap<>(); + + if (yamlTypes != null) { + List values = new ArrayList<>(yamlTypes.keySet()); + extractedTypes.put("", values); + } + + if (extractedTypes.isEmpty()) { + extractedTypes.put("", new ArrayList<>(yamlTypes != null ? yamlTypes.keySet() : List.of())); + } + + return extractedTypes; } - return extractedTypes; - } - - private static Map parseTypeObject(String typeObjectString) { - Map typeObject = new HashMap<>(); - if (typeObjectString != null && !typeObjectString.isBlank()) { - typeObjectString = typeObjectString.replace("{", "").replace("}", ""); - String[] entries = typeObjectString.split(","); - for (String entry : entries) { - String[] keyValue = entry.split("="); - if (keyValue.length == 2) { - typeObject.put(keyValue[0].trim(), Boolean.parseBoolean(keyValue[1].trim())); + private static Map parseTypeObject(String typeObjectString) { + Map typeObject = new HashMap<>(); + if (typeObjectString != null && !typeObjectString.isBlank()) { + typeObjectString = typeObjectString.replace("{", "").replace("}", ""); + String[] entries = typeObjectString.split(","); + for (String entry : entries) { + String[] keyValue = entry.split("="); + if (keyValue.length == 2) { + typeObject.put(keyValue[0].trim(), Boolean.parseBoolean(keyValue[1].trim())); + } + } } - } + return typeObject; } - return typeObject; - } - private static Result generateBasicEntity( - Map parameters, LdproxyCfg ldproxyCfg, Map typeObject) { - Result result = new Result(); + private static Result generateBasicEntity( + Map parameters, LdproxyCfg ldproxyCfg, Map typeObject) { + Result result = new Result(); - if (parameters.containsKey("id")) { - String newId = parameters.get("id"); + if (parameters.containsKey("id")) { + String newId = parameters.get("id"); - if (newId == null || newId.isBlank()) { - return Result.failure("No id provided in parameters"); - } + if (newId == null || newId.isBlank()) { + return Result.failure("No id provided in parameters"); + } - List newFiles = new ArrayList<>(); + List newFiles = new ArrayList<>(); - try { - if (typeObject.getOrDefault("provider", true)) { - parameters.put("featureProviderType", "PGIS"); + try { + if (typeObject.getOrDefault("provider", true)) { + parameters.put("featureProviderType", "PGIS"); - FeatureProviderDataV2 featureProvider = - parseFeatureProvider(parameters, ldproxyCfg, Map.of()); + FeatureProviderDataV2 featureProvider = + parseFeatureProvider(parameters, ldproxyCfg, Map.of()); - ldproxyCfg.writeEntity(featureProvider); + ldproxyCfg.writeEntity(featureProvider); - newFiles.add( - ldproxyCfg - .getDataDirectory() - .relativize(ldproxyCfg.getEntityPath(featureProvider).normalize()) - .toString()); - } + newFiles.add( + ldproxyCfg + .getDataDirectory() + .relativize(ldproxyCfg.getEntityPath(featureProvider).normalize()) + .toString()); + } - if (typeObject.getOrDefault("service", true)) { - OgcApiDataV2 ogcApi = parseOgcApi(parameters, ldproxyCfg); + if (typeObject.getOrDefault("service", true)) { + OgcApiDataV2 ogcApi = parseOgcApi(parameters, ldproxyCfg); - AutoEntityFactory autoFactory = - getAutoFactory(ldproxyCfg, EntityType.SERVICES.toString(), ogcApi.getEntitySubType()); + AutoEntityFactory autoFactory = + getAutoFactory(ldproxyCfg, EntityType.SERVICES.toString(), ogcApi.getEntitySubType()); - OgcApiDataV2 entityData = autoFactory.generate(ogcApi, Map.of(), ignore -> {}); + OgcApiDataV2 entityData = autoFactory.generate(ogcApi, Map.of(), ignore -> { + }); - ldproxyCfg.writeEntity(entityData); + ldproxyCfg.writeEntity(entityData); - newFiles.add( - ldproxyCfg - .getDataDirectory() - .relativize(ldproxyCfg.getEntityPath(entityData).normalize()) - .toString()); - } + newFiles.add( + ldproxyCfg + .getDataDirectory() + .relativize(ldproxyCfg.getEntityPath(entityData).normalize()) + .toString()); + } - if (typeObject.getOrDefault("tileProvider", true)) { - TileProviderFeaturesData tileProvider = parseTileProvider(parameters, ldproxyCfg); + if (typeObject.getOrDefault("tileProvider", true)) { + TileProviderFeaturesData tileProvider = parseTileProvider(parameters, ldproxyCfg); - ldproxyCfg.writeEntity(tileProvider); + ldproxyCfg.writeEntity(tileProvider); - newFiles.add( - ldproxyCfg - .getDataDirectory() - .relativize(ldproxyCfg.getEntityPath(tileProvider).normalize()) - .toString()); - } + newFiles.add( + ldproxyCfg + .getDataDirectory() + .relativize(ldproxyCfg.getEntityPath(tileProvider).normalize()) + .toString()); + } - result.success("Minimal config created successfully"); - if (!newFiles.isEmpty()) { - result.details("new_files", newFiles); + result.success("Minimal config created successfully"); + if (!newFiles.isEmpty()) { + result.details("new_files", newFiles); + } + } catch (IOException e) { + return Result.failure("Failed to write minimal config: " + e.getMessage()); + } } - } catch (IOException e) { - return Result.failure("Failed to write minimal config: " + e.getMessage()); - } - } - return result; - } + return result; + } }