Skip to content

Commit 61e452f

Browse files
committed
Fix diagram generation for multiple languages in source model
1 parent 3fe22c7 commit 61e452f

File tree

7 files changed

+102
-16
lines changed

7 files changed

+102
-16
lines changed

core/esmf-aspect-model-document-generators/src/main/java/org/eclipse/esmf/aspectmodel/generator/diagram/AspectModelDiagramGenerator.java

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -102,13 +102,18 @@ public AspectModelDiagramGenerator( final Aspect aspect, final DiagramGeneration
102102

103103
@Override
104104
public Stream<DiagramArtifact> generate() {
105-
final String artifactName = "%s_%s.%s".formatted( aspect().getName(), config.language().toLanguageTag(),
106-
config.format().toString().toLowerCase() );
107-
final String svg = generateSvg();
108-
final byte[] content = config.format() == DiagramGenerationConfig.Format.SVG
109-
? svg.getBytes( StandardCharsets.UTF_8 )
110-
: generatePng( svg );
111-
return Stream.of( new DiagramArtifact( artifactName, content ) );
105+
final Set<Locale> targetLanguages = config.language() == null
106+
? LanguageCollector.collectUsedLanguages( aspect() )
107+
: Set.of( config.language() );
108+
return targetLanguages.stream().map( language -> {
109+
final String artifactName = "%s_%s.%s".formatted( aspect().getName(), language.toLanguageTag(),
110+
config.format().toString().toLowerCase() );
111+
final String svg = generateSvg();
112+
final byte[] content = config.format() == DiagramGenerationConfig.Format.SVG
113+
? svg.getBytes( StandardCharsets.UTF_8 )
114+
: generatePng( svg );
115+
return new DiagramArtifact( artifactName, content, language );
116+
} );
112117
}
113118

114119
private InputStream getInputStream( final String resource ) {
@@ -251,7 +256,11 @@ public void generateDiagrams( final Format outputFormat, final Function<String,
251256
.language( language )
252257
.format( outputFormat == Format.PNG ? DiagramGenerationConfig.Format.PNG : DiagramGenerationConfig.Format.SVG )
253258
.build();
254-
final DiagramArtifact diagramArtifact = new AspectModelDiagramGenerator( aspect(), config ).singleResult();
259+
final DiagramArtifact diagramArtifact = new AspectModelDiagramGenerator( aspect(), config )
260+
.generate()
261+
.filter( artifact -> artifact.language().equals( language ) )
262+
.findFirst()
263+
.orElseThrow();
255264
IOUtils.copy( new ByteArrayInputStream( diagramArtifact.getContent() ), nameMapper.apply( diagramArtifact.getId() ) );
256265
}
257266
}

core/esmf-aspect-model-document-generators/src/main/java/org/eclipse/esmf/aspectmodel/generator/diagram/DiagramArtifact.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,24 @@
1313

1414
package org.eclipse.esmf.aspectmodel.generator.diagram;
1515

16+
import java.util.Locale;
17+
1618
import org.eclipse.esmf.aspectmodel.generator.BinaryArtifact;
19+
import org.eclipse.esmf.aspectmodel.generator.LocalizedArtifact;
20+
21+
/**
22+
* Generation artifact that represents a diagram
23+
*/
24+
public class DiagramArtifact extends BinaryArtifact implements LocalizedArtifact {
25+
private final Locale language;
1726

18-
public class DiagramArtifact extends BinaryArtifact {
19-
public DiagramArtifact( final String id, final byte[] content ) {
27+
public DiagramArtifact( final String id, final byte[] content, final Locale language ) {
2028
super( id, content );
29+
this.language = language;
30+
}
31+
32+
@Override
33+
public Locale language() {
34+
return language;
2135
}
2236
}

core/esmf-aspect-model-document-generators/src/main/java/org/eclipse/esmf/aspectmodel/generator/diagram/DiagramGenerationConfig.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,5 @@ public static String allValues() {
3737
if ( format == null ) {
3838
format = Format.SVG;
3939
}
40-
if ( language == null ) {
41-
language = Locale.ENGLISH;
42-
}
4340
}
4441
}

core/esmf-aspect-model-document-generators/src/main/java/org/eclipse/esmf/aspectmodel/generator/docu/AspectModelDocumentationGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public Stream<DocumentationArtifact> generate() {
104104
source = insertAspectModelDiagram( source, language );
105105
source = insertStaticPlaceholders( source );
106106
source = insertCustomCss( source );
107-
return new DocumentationArtifact( artifactName, source );
107+
return new DocumentationArtifact( artifactName, source, language );
108108
} );
109109
}
110110

core/esmf-aspect-model-document-generators/src/main/java/org/eclipse/esmf/aspectmodel/generator/docu/DocumentationArtifact.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,24 @@
1313

1414
package org.eclipse.esmf.aspectmodel.generator.docu;
1515

16+
import java.util.Locale;
17+
18+
import org.eclipse.esmf.aspectmodel.generator.LocalizedArtifact;
1619
import org.eclipse.esmf.aspectmodel.generator.StringArtifact;
1720

18-
public class DocumentationArtifact extends StringArtifact {
19-
public DocumentationArtifact( final String id, final String content ) {
21+
/**
22+
* Generation artifact that represents documentation for an Aspect Model
23+
*/
24+
public class DocumentationArtifact extends StringArtifact implements LocalizedArtifact {
25+
private final Locale language;
26+
27+
public DocumentationArtifact( final String id, final String content, final Locale language ) {
2028
super( id, content );
29+
this.language = language;
30+
}
31+
32+
@Override
33+
public Locale language() {
34+
return language;
2135
}
2236
}

core/esmf-aspect-model-document-generators/src/test/java/org/eclipse/esmf/aspectmodel/generator/diagram/AspectModelDiagramGeneratorTest.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,18 @@
1616
import static org.assertj.core.api.Assertions.assertThat;
1717
import static org.assertj.core.api.Assertions.assertThatCode;
1818

19+
import java.io.IOException;
20+
import java.io.OutputStream;
1921
import java.nio.charset.StandardCharsets;
22+
import java.util.function.Function;
2023

2124
import org.eclipse.esmf.metamodel.Aspect;
25+
import org.eclipse.esmf.metamodel.AspectModel;
2226
import org.eclipse.esmf.test.TestAspect;
2327
import org.eclipse.esmf.test.TestResources;
2428

29+
import org.apache.commons.io.output.NullOutputStream;
30+
import org.junit.jupiter.api.Test;
2531
import org.junit.jupiter.params.ParameterizedTest;
2632
import org.junit.jupiter.params.provider.EnumSource;
2733
import org.junit.jupiter.params.provider.ValueSource;
@@ -56,4 +62,27 @@ void generateDiagramsShouldReturnUtf8StringRegardlessOfPlatformEncoding( final S
5662
System.setProperty( "file.encoding", platformEncoding );
5763
}
5864
}
65+
66+
@Test
67+
void testGenerateDiagramsInMultipleLanguages() throws IOException {
68+
final AspectModel aspectModel = TestResources.load( TestAspect.ASPECT_WITH_ENGLISH_AND_GERMAN_DESCRIPTION );
69+
final AspectModelDiagramGenerator generator = new AspectModelDiagramGenerator(
70+
aspectModel.aspect(), DiagramGenerationConfigBuilder.builder().format( DiagramGenerationConfig.Format.SVG ).build() );
71+
assertThat( generator.generate().toList() ).size().isEqualTo( 2 );
72+
73+
// Test legacy API
74+
final AspectModelDiagramGenerator generator2 = new AspectModelDiagramGenerator( aspectModel.aspect() );
75+
class GenerationFunction implements Function<String, OutputStream> {
76+
int count = 0;
77+
78+
@Override
79+
public OutputStream apply( final String name ) {
80+
count++;
81+
return NullOutputStream.INSTANCE;
82+
}
83+
}
84+
final GenerationFunction nameMapper = new GenerationFunction();
85+
generator2.generateDiagrams( AspectModelDiagramGenerator.Format.SVG, nameMapper );
86+
assertThat( nameMapper.count ).isEqualTo( 2 );
87+
}
5988
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* Copyright (c) 2025 Robert Bosch Manufacturing Solutions GmbH
3+
*
4+
* See the AUTHORS file(s) distributed with this work for additional
5+
* information regarding authorship.
6+
*
7+
* This Source Code Form is subject to the terms of the Mozilla Public
8+
* License, v. 2.0. If a copy of the MPL was not distributed with this
9+
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
10+
*
11+
* SPDX-License-Identifier: MPL-2.0
12+
*/
13+
14+
package org.eclipse.esmf.aspectmodel.generator;
15+
16+
import java.util.Locale;
17+
18+
/**
19+
* Interface that indicates that an artifact is also localized
20+
*/
21+
public interface LocalizedArtifact {
22+
Locale language();
23+
}

0 commit comments

Comments
 (0)