26
26
import java .util .ArrayList ;
27
27
import java .util .Collection ;
28
28
import java .util .Deque ;
29
+ import java .util .HashMap ;
29
30
import java .util .HashSet ;
30
31
import java .util .List ;
32
+ import java .util .Map ;
31
33
import java .util .Optional ;
32
34
import java .util .Set ;
33
35
import java .util .function .Supplier ;
36
+ import java .util .stream .Collectors ;
34
37
import java .util .zip .ZipEntry ;
35
38
import java .util .zip .ZipInputStream ;
36
39
37
- import org .eclipse .esmf .aspectmodel .AspectModelBuilder ;
38
40
import org .eclipse .esmf .aspectmodel .AspectModelFile ;
39
41
import org .eclipse .esmf .aspectmodel .RdfUtil ;
40
42
import org .eclipse .esmf .aspectmodel .resolver .AspectModelFileLoader ;
44
46
import org .eclipse .esmf .aspectmodel .resolver .ResolutionStrategy ;
45
47
import org .eclipse .esmf .aspectmodel .resolver .ResolutionStrategySupport ;
46
48
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 ;
47
51
import org .eclipse .esmf .aspectmodel .urn .AspectModelUrn ;
48
52
import org .eclipse .esmf .aspectmodel .urn .ElementType ;
49
53
import org .eclipse .esmf .aspectmodel .urn .UrnSyntaxException ;
50
54
import org .eclipse .esmf .aspectmodel .versionupdate .MetaModelVersionMigrator ;
51
55
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 ;
52
60
import org .eclipse .esmf .metamodel .vocabulary .SammNs ;
53
61
54
62
import com .google .common .collect .Streams ;
55
63
import org .apache .jena .rdf .model .Model ;
64
+ import org .apache .jena .rdf .model .ModelFactory ;
56
65
import org .apache .jena .rdf .model .RDFNode ;
57
66
import org .apache .jena .rdf .model .Resource ;
58
67
import org .apache .jena .rdf .model .Statement ;
@@ -132,7 +141,7 @@ public AspectModel load( final Collection<File> files ) {
132
141
.toList ();
133
142
final LoaderContext loaderContext = new LoaderContext ();
134
143
resolve ( migratedFiles , loaderContext );
135
- return AspectModelBuilder . buildAspectModelFromFiles ( loaderContext .loadedFiles () );
144
+ return loadAspectModelFiles ( loaderContext .loadedFiles () );
136
145
}
137
146
138
147
/**
@@ -157,7 +166,7 @@ public AspectModel loadUrns( final Collection<AspectModelUrn> urns ) {
157
166
loaderContext .unresolvedUrns ().add ( inputUrn .toString () );
158
167
}
159
168
resolve ( List .of (), loaderContext );
160
- return AspectModelBuilder . buildAspectModelFromFiles ( loaderContext .loadedFiles () );
169
+ return loadAspectModelFiles ( loaderContext .loadedFiles () );
161
170
}
162
171
163
172
/**
@@ -172,7 +181,7 @@ public AspectModel load( final InputStream inputStream, final Optional<URI> sour
172
181
final AspectModelFile migratedModel = migrate ( rawFile );
173
182
final LoaderContext loaderContext = new LoaderContext ();
174
183
resolve ( List .of ( migratedModel ), loaderContext );
175
- return AspectModelBuilder . buildAspectModelFromFiles ( loaderContext .loadedFiles () );
184
+ return loadAspectModelFiles ( loaderContext .loadedFiles () );
176
185
}
177
186
178
187
/**
@@ -247,7 +256,7 @@ private AspectModel loadNamespacePackageFromStream( final InputStream inputStrea
247
256
248
257
final LoaderContext loaderContext = new LoaderContext ();
249
258
resolve ( aspectModelFiles , loaderContext );
250
- return AspectModelBuilder . buildAspectModelFromFiles ( loaderContext .loadedFiles () );
259
+ return loadAspectModelFiles ( loaderContext .loadedFiles () );
251
260
}
252
261
253
262
private boolean containsFolderInNamespacePackage ( final InputStream inputStream ) {
@@ -402,4 +411,92 @@ public boolean containsDefinition( final AspectModelFile aspectModelFile, final
402
411
LOG .debug ( "Checking if model contains {}: {}" , urn , result );
403
412
return result ;
404
413
}
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
+ }
405
502
}
0 commit comments