Skip to content

Commit f402a34

Browse files
committed
Refactor model version handling and update URI scheme
Replaces 'inmemory' URI scheme with 'blob' throughout service and tests. Adds version field to Model, updates grouping logic to extract and assign meta model version, and refines version processing in ModelService to skip non-latest versions and improve file creation logic.
1 parent 7b71019 commit f402a34

File tree

5 files changed

+120
-41
lines changed

5 files changed

+120
-41
lines changed

aspect-model-editor-service/src/main/java/org/eclipse/esmf/ame/services/ModelService.java

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.Map;
2323
import java.util.function.Supplier;
2424

25+
import org.eclipse.esmf.ame.config.ApplicationSettings;
2526
import org.eclipse.esmf.ame.exceptions.CreateFileException;
2627
import org.eclipse.esmf.ame.exceptions.FileNotFoundException;
2728
import org.eclipse.esmf.ame.exceptions.FileReadException;
@@ -45,6 +46,7 @@
4546
import org.eclipse.esmf.aspectmodel.urn.AspectModelUrn;
4647
import org.eclipse.esmf.aspectmodel.validation.services.AspectModelValidator;
4748
import org.eclipse.esmf.metamodel.AspectModel;
49+
import org.eclipse.esmf.samm.KnownVersion;
4850

4951
import io.micronaut.http.multipart.CompletedFileUpload;
5052
import jakarta.inject.Singleton;
@@ -134,7 +136,7 @@ public String migrateModel( final URI uri, final CompletedFileUpload aspectModel
134136
final AspectModel aspectModel = aspectModelLoader.load( ModelUtils.openInputStreamFromUpload( aspectModelFile ), uri );
135137

136138
return aspectModel.files().stream()
137-
.filter( a -> a.sourceLocation().map( source -> source.getScheme().equals( "inmemory" ) ).orElse( false ) ).findFirst()
139+
.filter( a -> a.sourceLocation().map( source -> source.getScheme().equals( "blob" ) ).orElse( false ) ).findFirst()
138140
.map( AspectSerializer.INSTANCE::aspectModelFileToString )
139141
.orElseThrow( () -> new InvalidAspectModelException( "No aspect model found to migrate" ) );
140142
}
@@ -143,7 +145,7 @@ public String getFormattedModel( final URI uri, final CompletedFileUpload aspect
143145
final AspectModel aspectModel = aspectModelLoader.load( ModelUtils.openInputStreamFromUpload( aspectModelFile ), uri );
144146

145147
return aspectModel.files().stream()
146-
.filter( a -> a.sourceLocation().map( source -> source.getScheme().equals( "inmemory" ) ).orElse( false ) ).findFirst()
148+
.filter( a -> a.sourceLocation().map( source -> source.getScheme().equals( "blob" ) ).orElse( false ) ).findFirst()
147149
.map( AspectSerializer.INSTANCE::aspectModelFileToString )
148150
.orElseThrow( () -> new InvalidAspectModelException( "No aspect model found to formate" ) );
149151
}
@@ -175,11 +177,19 @@ public MigrationResult migrateWorkspace( final boolean setNewVersion ) {
175177
private void processVersion( final String namespace, final Version version, final boolean setNewVersion, final List<String> errors ) {
176178
version.getModels().forEach( model -> {
177179
try {
180+
final boolean isNotLatestKnownVersion = KnownVersion.fromVersionString( model.getVersion() )
181+
.filter( v -> KnownVersion.getLatest().equals( v ) ).isPresent();
182+
183+
if ( isNotLatestKnownVersion ) {
184+
return;
185+
}
186+
178187
final Path aspectModelPath = ModelUtils.constructModelPath( modelPath, namespace, version.getVersion(), model.getModel() );
179188
final AspectModel aspectModel = aspectModelLoader.load( aspectModelPath.toFile() );
180189

181190
if ( setNewVersion ) {
182191
applyNamespaceVersionChange( aspectModel );
192+
return;
183193
}
184194

185195
saveAspectModelFiles( aspectModel, setNewVersion );
@@ -190,10 +200,37 @@ private void processVersion( final String namespace, final Version version, fina
190200
}
191201

192202
private void applyNamespaceVersionChange( final AspectModel aspectModel ) {
193-
final AspectChangeManager aspectChangeManager = new AspectChangeManager( aspectModel );
194-
final CopyFileWithIncreasedNamespaceVersion changes = new CopyFileWithIncreasedNamespaceVersion( aspectModel.files().getFirst(),
195-
IncreaseVersion.MAJOR );
196-
aspectChangeManager.applyChange( changes );
203+
try {
204+
final AspectModelFile originalFile = aspectModel.files().getFirst();
205+
final AspectChangeManager changeManager = new AspectChangeManager( aspectModel );
206+
changeManager.applyChange( new CopyFileWithIncreasedNamespaceVersion( originalFile, IncreaseVersion.MAJOR ) );
207+
208+
final List<AspectModelFile> newFiles = aspectModel.files().stream()
209+
.filter( file -> !file.namespaceUrn().getVersion().equals( originalFile.namespaceUrn().getVersion() ) )
210+
.toList();
211+
212+
if ( newFiles.size() != 1 ) {
213+
return;
214+
}
215+
216+
final AspectModelFile updatedFile = newFiles.getFirst();
217+
final URI sourceLocation = updatedFile.sourceLocation()
218+
.orElseThrow( () -> new IllegalStateException( "Source location missing" ) );
219+
220+
if ( new File( sourceLocation ).exists() ) {
221+
return;
222+
}
223+
224+
ModelUtils.createFile(
225+
updatedFile.namespaceUrn(),
226+
updatedFile.filename().orElseThrow( () -> new IllegalStateException( "Filename missing" ) ),
227+
ApplicationSettings.getMetaModelStoragePath()
228+
);
229+
230+
AspectSerializer.INSTANCE.write( updatedFile );
231+
} catch ( final IOException e ) {
232+
throw new CreateFileException( "Cannot create file %s on workspace", e );
233+
}
197234
}
198235

199236
private void saveAspectModelFiles( final AspectModel aspectModel, final boolean setNewVersion ) {

aspect-model-editor-service/src/main/java/org/eclipse/esmf/ame/services/models/Model.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,16 @@
2626
public class Model {
2727
private String model;
2828
private AspectModelUrn aspectModelUrn;
29+
private String version;
2930
private boolean existing;
3031

3132
public Model() {
3233
}
3334

34-
public Model( final String model, final AspectModelUrn aspectModelUrn, final boolean existing ) {
35+
public Model( final String model, final AspectModelUrn aspectModelUrn, final String version, final boolean existing ) {
3536
this.model = model;
3637
this.aspectModelUrn = aspectModelUrn;
38+
this.version = version;
3739
this.existing = existing;
3840
}
3941

@@ -53,6 +55,14 @@ public void setAspectModelUrn( final AspectModelUrn aspectModelUrn ) {
5355
this.aspectModelUrn = aspectModelUrn;
5456
}
5557

58+
public String getVersion() {
59+
return version;
60+
}
61+
62+
public void setVersion( final String version ) {
63+
this.version = version;
64+
}
65+
5666
public boolean isExisting() {
5767
return existing;
5868
}

aspect-model-editor-service/src/main/java/org/eclipse/esmf/ame/services/utils/ModelGroupingUtils.java

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,27 @@
1515

1616
import java.io.File;
1717
import java.net.URI;
18+
import java.util.AbstractMap;
1819
import java.util.Comparator;
1920
import java.util.LinkedHashMap;
2021
import java.util.List;
2122
import java.util.Map;
23+
import java.util.Optional;
2224
import java.util.stream.Collectors;
2325
import java.util.stream.Stream;
2426

2527
import org.eclipse.esmf.ame.services.models.Model;
2628
import org.eclipse.esmf.ame.services.models.Version;
2729
import org.eclipse.esmf.aspectmodel.AspectModelFile;
2830
import org.eclipse.esmf.aspectmodel.loader.AspectModelLoader;
31+
import org.eclipse.esmf.aspectmodel.resolver.AspectModelFileLoader;
32+
import org.eclipse.esmf.aspectmodel.urn.AspectModelUrn;
33+
import org.eclipse.esmf.metamodel.AspectModel;
2934
import org.eclipse.esmf.metamodel.ModelElement;
35+
import org.eclipse.esmf.metamodel.vocabulary.SammNs;
36+
import org.eclipse.esmf.samm.KnownVersion;
37+
38+
import io.vavr.control.Try;
3039

3140
/**
3241
* A utility class for grouping model URIs by namespace and version.
@@ -48,12 +57,35 @@ public record ModelGroupingUtils( AspectModelLoader aspectModelLoader ) {
4857
* @return a map where the keys are namespaces and the values are lists of maps containing versions and their associated models
4958
*/
5059
public Map<String, List<Version>> groupModelsByNamespaceAndVersion( final Stream<URI> uriStream, final boolean onlyAspectModels ) {
51-
return aspectModelLoader.load( uriStream.map( File::new ).toList() ).files().stream()
52-
.flatMap( file -> extractModelElement( file, onlyAspectModels ) ).map( this::createModel )
53-
.collect( Collectors.groupingBy( model -> model.getAspectModelUrn().getNamespaceMainPart() ) ).entrySet().stream()
54-
.sorted( Map.Entry.comparingByKey() ).collect( Collectors.toMap( Map.Entry::getKey, entry -> groupByVersion( entry.getValue() ),
55-
( v1, v2 ) -> {throw new RuntimeException( String.format( "Duplicate key for values %s and %s", v1, v2 ) );},
56-
LinkedHashMap::new ) );
60+
return uriStream.map( File::new )
61+
.map( file -> {
62+
final Optional<KnownVersion> metaModelVersionFromFile = Try.of(
63+
() -> AspectModelFileLoader.load( file ).sourceModel().getNsPrefixMap().get( SammNs.SAMM.getShortForm() ) )
64+
.flatMap( AspectModelUrn::from )
65+
.toJavaOptional()
66+
.map( AspectModelUrn::getVersion )
67+
.flatMap( KnownVersion::fromVersionString );
68+
final AspectModel loadedModel = aspectModelLoader.load( file );
69+
return new AbstractMap.SimpleEntry<>( loadedModel, metaModelVersionFromFile );
70+
} )
71+
.flatMap( entry ->
72+
entry.getKey().files().stream()
73+
.flatMap( file -> extractModelElement( file, onlyAspectModels ) )
74+
.map( modelElement -> createModel( modelElement, entry.getValue().orElse( null ) ) )
75+
)
76+
.collect( Collectors.groupingBy(
77+
model -> model.getAspectModelUrn().getNamespaceMainPart()
78+
) )
79+
.entrySet().stream()
80+
.sorted( Map.Entry.comparingByKey() )
81+
.collect( Collectors.toMap(
82+
Map.Entry::getKey,
83+
entry -> groupByVersion( entry.getValue() ),
84+
( v1, v2 ) -> {
85+
throw new RuntimeException( String.format( "Duplicate key for values %s and %s", v1, v2 ) );
86+
},
87+
LinkedHashMap::new
88+
) );
5789
}
5890

5991
private Stream<ModelElement> extractModelElement( final AspectModelFile file, final boolean onlyAspectModels ) {
@@ -65,9 +97,9 @@ private Stream<ModelElement> extractModelElement( final AspectModelFile file, fi
6597
.or( () -> file.elements().stream().filter( element -> !element.isAnonymous() ).findAny() ).stream();
6698
}
6799

68-
private Model createModel( final ModelElement element ) {
100+
private Model createModel( final ModelElement element, final KnownVersion version ) {
69101
final String filename = element.getSourceFile().filename().orElse( "unnamed file" );
70-
return new Model( filename, element.urn(), true );
102+
return new Model( filename, element.urn(), version.toVersionString(), true );
71103
}
72104

73105
private List<Version> groupByVersion( final List<Model> models ) {

0 commit comments

Comments
 (0)