Skip to content

Commit 4f680da

Browse files
committed
Incorporate AspectModelBuilder functionality in AspectModelLoader
Creating an AspectModel from a list of AspectModelFiles should be located next to the other methods that create an AspectModel from various input sources
1 parent 6ba82f7 commit 4f680da

File tree

9 files changed

+127
-186
lines changed

9 files changed

+127
-186
lines changed

core/esmf-aspect-meta-model-java/src/main/java/org/eclipse/esmf/aspectmodel/AspectModelBuilder.java

Lines changed: 0 additions & 132 deletions
This file was deleted.

core/esmf-aspect-meta-model-java/src/main/java/org/eclipse/esmf/aspectmodel/edit/AspectChangeContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public synchronized void redoChange() {
9292
}
9393

9494
private void updateAspectModelAfterChange() {
95-
final AspectModel updatedModel = AspectModelLoader.buildAspectModelFromFiles( aspectModel.files() );
95+
final AspectModel updatedModel = new AspectModelLoader().loadAspectModelFiles( aspectModel.files() );
9696
aspectModel.setMergedModel( updatedModel.mergedModel() );
9797
aspectModel.setElements( updatedModel.elements() );
9898
aspectModel.setFiles( updatedModel.files() );

core/esmf-aspect-meta-model-java/src/main/java/org/eclipse/esmf/aspectmodel/loader/AspectModelLoader.java

Lines changed: 102 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,17 @@
2626
import java.util.ArrayList;
2727
import java.util.Collection;
2828
import java.util.Deque;
29+
import java.util.HashMap;
2930
import java.util.HashSet;
3031
import java.util.List;
32+
import java.util.Map;
3133
import java.util.Optional;
3234
import java.util.Set;
3335
import java.util.function.Supplier;
36+
import java.util.stream.Collectors;
3437
import java.util.zip.ZipEntry;
3538
import java.util.zip.ZipInputStream;
3639

37-
import org.eclipse.esmf.aspectmodel.AspectModelBuilder;
3840
import org.eclipse.esmf.aspectmodel.AspectModelFile;
3941
import org.eclipse.esmf.aspectmodel.RdfUtil;
4042
import org.eclipse.esmf.aspectmodel.resolver.AspectModelFileLoader;
@@ -44,15 +46,22 @@
4446
import org.eclipse.esmf.aspectmodel.resolver.ResolutionStrategy;
4547
import org.eclipse.esmf.aspectmodel.resolver.ResolutionStrategySupport;
4648
import org.eclipse.esmf.aspectmodel.resolver.fs.FlatModelsRoot;
49+
import org.eclipse.esmf.aspectmodel.resolver.modelfile.DefaultAspectModelFile;
50+
import org.eclipse.esmf.aspectmodel.resolver.modelfile.MetaModelFile;
4751
import org.eclipse.esmf.aspectmodel.urn.AspectModelUrn;
4852
import org.eclipse.esmf.aspectmodel.urn.ElementType;
4953
import org.eclipse.esmf.aspectmodel.urn.UrnSyntaxException;
5054
import org.eclipse.esmf.aspectmodel.versionupdate.MetaModelVersionMigrator;
5155
import org.eclipse.esmf.metamodel.AspectModel;
56+
import org.eclipse.esmf.metamodel.ModelElement;
57+
import org.eclipse.esmf.metamodel.Namespace;
58+
import org.eclipse.esmf.metamodel.impl.DefaultAspectModel;
59+
import org.eclipse.esmf.metamodel.impl.DefaultNamespace;
5260
import org.eclipse.esmf.metamodel.vocabulary.SammNs;
5361

5462
import com.google.common.collect.Streams;
5563
import org.apache.jena.rdf.model.Model;
64+
import org.apache.jena.rdf.model.ModelFactory;
5665
import org.apache.jena.rdf.model.RDFNode;
5766
import org.apache.jena.rdf.model.Resource;
5867
import org.apache.jena.rdf.model.Statement;
@@ -132,7 +141,7 @@ public AspectModel load( final Collection<File> files ) {
132141
.toList();
133142
final LoaderContext loaderContext = new LoaderContext();
134143
resolve( migratedFiles, loaderContext );
135-
return AspectModelBuilder.buildAspectModelFromFiles( loaderContext.loadedFiles() );
144+
return loadAspectModelFiles( loaderContext.loadedFiles() );
136145
}
137146

138147
/**
@@ -157,7 +166,7 @@ public AspectModel loadUrns( final Collection<AspectModelUrn> urns ) {
157166
loaderContext.unresolvedUrns().add( inputUrn.toString() );
158167
}
159168
resolve( List.of(), loaderContext );
160-
return AspectModelBuilder.buildAspectModelFromFiles( loaderContext.loadedFiles() );
169+
return loadAspectModelFiles( loaderContext.loadedFiles() );
161170
}
162171

163172
/**
@@ -172,7 +181,7 @@ public AspectModel load( final InputStream inputStream, final Optional<URI> sour
172181
final AspectModelFile migratedModel = migrate( rawFile );
173182
final LoaderContext loaderContext = new LoaderContext();
174183
resolve( List.of( migratedModel ), loaderContext );
175-
return AspectModelBuilder.buildAspectModelFromFiles( loaderContext.loadedFiles() );
184+
return loadAspectModelFiles( loaderContext.loadedFiles() );
176185
}
177186

178187
/**
@@ -247,7 +256,7 @@ private AspectModel loadNamespacePackageFromStream( final InputStream inputStrea
247256

248257
final LoaderContext loaderContext = new LoaderContext();
249258
resolve( aspectModelFiles, loaderContext );
250-
return AspectModelBuilder.buildAspectModelFromFiles( loaderContext.loadedFiles() );
259+
return loadAspectModelFiles( loaderContext.loadedFiles() );
251260
}
252261

253262
private boolean containsFolderInNamespacePackage( final InputStream inputStream ) {
@@ -402,4 +411,92 @@ public boolean containsDefinition( final AspectModelFile aspectModelFile, final
402411
LOG.debug( "Checking if model contains {}: {}", urn, result );
403412
return result;
404413
}
414+
415+
public AspectModel emptyModel() {
416+
return new DefaultAspectModel( new ArrayList<>(), ModelFactory.createDefaultModel(), new ArrayList<>() );
417+
}
418+
419+
public AspectModel loadAspectModelFiles( final Collection<AspectModelFile> inputFiles ) {
420+
final Model mergedModel = ModelFactory.createDefaultModel();
421+
mergedModel.add( MetaModelFile.metaModelDefinitions() );
422+
for ( final AspectModelFile file : inputFiles ) {
423+
mergedModel.add( file.sourceModel() );
424+
}
425+
426+
final List<ModelElement> elements = new ArrayList<>();
427+
final List<AspectModelFile> files = new ArrayList<>();
428+
final Map<AspectModelFile, MetaModelBaseAttributes> namespaceDefinitions = new HashMap<>();
429+
for ( final AspectModelFile file : inputFiles ) {
430+
final DefaultAspectModelFile aspectModelFile = new DefaultAspectModelFile( file.sourceModel(), file.headerComment(),
431+
file.sourceLocation() );
432+
files.add( aspectModelFile );
433+
final Model model = file.sourceModel();
434+
final ModelElementFactory modelElementFactory = new ModelElementFactory( mergedModel, Map.of(), element -> aspectModelFile );
435+
final List<ModelElement> fileElements = model.listStatements( null, RDF.type, (RDFNode) null ).toList().stream()
436+
.filter( statement -> !statement.getObject().isURIResource() || !statement.getResource().equals( SammNs.SAMM.Namespace() ) )
437+
.map( Statement::getSubject )
438+
.filter( RDFNode::isURIResource )
439+
.map( resource -> mergedModel.createResource( resource.getURI() ) )
440+
.map( resource -> modelElementFactory.create( ModelElement.class, resource ) )
441+
.toList();
442+
aspectModelFile.setElements( fileElements );
443+
elements.addAll( fileElements );
444+
}
445+
446+
setNamespaces( files, elements );
447+
return new DefaultAspectModel( files, mergedModel, elements );
448+
}
449+
450+
private static void setNamespaces( final Collection<AspectModelFile> files, final Collection<ModelElement> elements ) {
451+
final Map<String, List<ModelElement>> elementsGroupedByNamespaceUrn = elements.stream()
452+
.filter( element -> !element.isAnonymous() )
453+
.collect( Collectors.groupingBy( element -> element.urn().getNamespaceIdentifier() ) );
454+
for ( final AspectModelFile file : files ) {
455+
final Optional<String> optionalNamespaceUrn =
456+
Optional.ofNullable( file.sourceModel().getNsPrefixURI( "" ) )
457+
.map( urnPrefix -> urnPrefix.split( "#" )[0] )
458+
.or( () -> file.elements().stream()
459+
.filter( element -> !element.isAnonymous() )
460+
.map( element -> element.urn().getNamespaceIdentifier() )
461+
.findAny() );
462+
if ( optionalNamespaceUrn.isEmpty() ) {
463+
continue;
464+
}
465+
466+
final String namespaceUrn = optionalNamespaceUrn.get();
467+
MetaModelBaseAttributes namespaceDefinition = null;
468+
AspectModelFile fileContainingNamespaceDefinition = null;
469+
final List<ModelElement> elementsForUrn = elementsGroupedByNamespaceUrn.get( namespaceUrn );
470+
if ( elementsForUrn != null ) {
471+
for ( final ModelElement element : elementsForUrn ) {
472+
final AspectModelFile elementFile = element.getSourceFile();
473+
if ( elementFile.sourceModel().contains( null, RDF.type, SammNs.SAMM.Namespace() ) ) {
474+
final Model model = elementFile.sourceModel();
475+
final ModelElementFactory modelElementFactory = new ModelElementFactory( model, Map.of(), __ -> null );
476+
final Resource namespaceResource = model.listStatements( null, RDF.type, SammNs.SAMM.Namespace() )
477+
.mapWith( Statement::getSubject )
478+
.toList().iterator().next();
479+
namespaceDefinition = modelElementFactory.createBaseAttributes( namespaceResource );
480+
fileContainingNamespaceDefinition = elementFile;
481+
break;
482+
}
483+
}
484+
}
485+
486+
final Namespace namespace = new DefaultNamespace( namespaceUrn, elementsGroupedByNamespaceUrn.get( namespaceUrn ),
487+
Optional.ofNullable( fileContainingNamespaceDefinition ), Optional.ofNullable( namespaceDefinition ) );
488+
( (DefaultAspectModelFile) file ).setNamespace( namespace );
489+
}
490+
}
491+
492+
public AspectModel merge( final AspectModel aspectModel1, final AspectModel aspectModel2 ) {
493+
final List<AspectModelFile> files = new ArrayList<>( aspectModel1.files() );
494+
final Set<URI> locations = aspectModel1.files().stream()
495+
.flatMap( f -> f.sourceLocation().stream() )
496+
.collect( Collectors.toSet() );
497+
for ( final AspectModelFile file : aspectModel2.files() ) {
498+
file.sourceLocation().filter( uri -> !locations.contains( uri ) ).ifPresent( uri -> files.add( file ) );
499+
}
500+
return loadAspectModelFiles( files );
501+
}
405502
}

core/esmf-aspect-meta-model-java/src/test/java/org/eclipse/esmf/aspectmodel/AspectModelBuilderTest.java

Lines changed: 0 additions & 35 deletions
This file was deleted.

0 commit comments

Comments
 (0)