FrameworkImportService.java

package com.taxonomy.catalog.service.importer;

import com.taxonomy.dto.FrameworkImportResult;
import com.taxonomy.dto.ProfileInfo;
import com.taxonomy.extension.api.importer.ImportInput;
import com.taxonomy.extension.api.importer.ImportProfileExtension;
import org.springframework.stereotype.Service;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

/** Generic framework import service delegating to registered profile adapters. */
@Service
public class FrameworkImportService {

    private final ImportProfileRegistry registry;

    public FrameworkImportService(ImportProfileRegistry registry) {
        this.registry = registry;
    }

    public List<ProfileInfo> getAvailableProfiles() {
        return registry.listDescriptors().stream()
                .map(descriptor -> new ProfileInfo(
                        descriptor.profileId(),
                        descriptor.displayName(),
                        descriptor.supportedElementTypes(),
                        descriptor.supportedRelationTypes(),
                        descriptor.acceptedFileFormat()))
                .toList();
    }

    public FrameworkImportResult preview(String profileId, InputStream input) {
        return registry.findById(profileId)
                .map(extension -> extension.preview(ImportInput.forPreview(input)))
                .orElseGet(() -> errorResult(profileId, "Unknown profile: " + profileId));
    }

    public FrameworkImportResult importFile(
            String profileId, InputStream input, String branch) {
        return registry.findById(profileId)
                .map(extension -> extension.importData(new ImportInput(input, branch)))
                .orElseGet(() -> errorResult(profileId, "Unknown profile: " + profileId));
    }

    private static FrameworkImportResult errorResult(String profileId, String message) {
        return new FrameworkImportResult(
                profileId, profileId, false,
                0, 0, 0, 0, 0, 0, null,
                List.of(message), List.of(), Map.of());
    }
}