ExportConfig.java
package com.taxonomy.shared.config;
import com.taxonomy.export.ArchiMateDiagramService;
import com.taxonomy.export.ArchiMateXmlExporter;
import com.taxonomy.export.ConfigurableDiagramSelectionPolicy;
import com.taxonomy.export.DiagramProjectionService;
import com.taxonomy.export.DiagramSelectionConfig;
import com.taxonomy.export.DiagramSelectionPolicy;
import com.taxonomy.export.DiagramViewMetadata;
import com.taxonomy.export.MermaidExportService;
import com.taxonomy.export.StructurizrExportService;
import com.taxonomy.export.VisioDiagramService;
import com.taxonomy.export.VisioPackageBuilder;
import com.taxonomy.preferences.PreferencesService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Registers export-module classes as Spring beans.
* <p>The taxonomy-export module is framework-free; this configuration
* wires its classes into the Spring application context.</p>
*/
@Configuration
public class ExportConfig {
private static final Logger log = LoggerFactory.getLogger(ExportConfig.class);
@Bean
public ArchiMateDiagramService archiMateDiagramService() {
return new ArchiMateDiagramService();
}
@Bean
public ArchiMateXmlExporter archiMateXmlExporter() {
return new ArchiMateXmlExporter();
}
@Bean
public DiagramSelectionPolicy diagramSelectionPolicy(PreferencesService preferencesService) {
// Delegating policy: reads the preference on each apply() call
return rawModel -> resolvePolicy(preferencesService).apply(rawModel);
}
@Bean
public DiagramProjectionService diagramProjectionService(DiagramSelectionPolicy policy) {
var service = new DiagramProjectionService();
service.setPolicy(policy);
return service;
}
@Bean
public MermaidExportService mermaidExportService() {
return new MermaidExportService();
}
@Bean
public StructurizrExportService structurizrExportService() {
return new StructurizrExportService();
}
@Bean
public VisioDiagramService visioDiagramService() {
return new VisioDiagramService();
}
@Bean
public VisioPackageBuilder visioPackageBuilder() {
return new VisioPackageBuilder();
}
/**
* Resolves the active {@link DiagramSelectionPolicy} from the current
* {@code diagram.policy} preference value.
*
* @param prefs the preferences service providing the current setting
* @return the resolved policy (never {@code null}; defaults to {@code defaultImpact})
*/
static DiagramSelectionPolicy resolvePolicy(PreferencesService prefs) {
String policyName = prefs.getString("diagram.policy", "defaultImpact");
DiagramSelectionConfig config = switch (policyName) {
case "leafOnly" -> DiagramSelectionConfig.leafOnly();
case "clustering" -> DiagramSelectionConfig.clustering();
case "trace" -> DiagramSelectionConfig.trace();
case "defaultImpact" -> DiagramSelectionConfig.defaultImpact();
default -> {
log.warn("Unknown diagram.policy '{}', falling back to defaultImpact", policyName);
yield DiagramSelectionConfig.defaultImpact();
}
};
return new ConfigurableDiagramSelectionPolicy(config);
}
/**
* Resolves human-readable view metadata for the active diagram policy.
*
* @param prefs the preferences service providing the current setting
* @return view metadata generated from the active policy configuration
*/
public static DiagramViewMetadata resolveViewMetadata(PreferencesService prefs) {
String policyName = prefs.getString("diagram.policy", "defaultImpact");
DiagramSelectionConfig config = switch (policyName) {
case "leafOnly" -> DiagramSelectionConfig.leafOnly();
case "clustering" -> DiagramSelectionConfig.clustering();
case "trace" -> DiagramSelectionConfig.trace();
default -> DiagramSelectionConfig.defaultImpact();
};
return DiagramViewMetadata.fromConfig(config, policyName);
}
}