1313
1414package org .eclipse .esmf .ame .services ;
1515
16+ import java .io .ByteArrayInputStream ;
1617import java .io .File ;
1718import java .io .FileOutputStream ;
1819import java .io .IOException ;
3334import org .eclipse .esmf .ame .exceptions .FileNotFoundException ;
3435import org .eclipse .esmf .ame .services .models .Version ;
3536import org .eclipse .esmf .ame .services .utils .ModelGroupingUtils ;
37+ import org .eclipse .esmf .ame .services .utils .ModelUtils ;
3638import org .eclipse .esmf .aspectmodel .AspectModelFile ;
3739import org .eclipse .esmf .aspectmodel .edit .AspectChangeManager ;
3840import org .eclipse .esmf .aspectmodel .edit .AspectChangeManagerConfig ;
4648import org .eclipse .esmf .aspectmodel .resolver .exceptions .ModelResolutionException ;
4749import org .eclipse .esmf .aspectmodel .resolver .fs .ModelsRoot ;
4850import org .eclipse .esmf .aspectmodel .resolver .fs .StructuredModelsRoot ;
51+ import org .eclipse .esmf .aspectmodel .resolver .modelfile .RawAspectModelFile ;
4952import org .eclipse .esmf .aspectmodel .resolver .modelfile .RawAspectModelFileBuilder ;
5053import org .eclipse .esmf .aspectmodel .serializer .AspectSerializer ;
5154import org .eclipse .esmf .aspectmodel .urn .AspectModelUrn ;
@@ -80,7 +83,38 @@ public byte[] exportPackage( final String aspectModelUrn ) {
8083 .orElseThrow ( () -> new FileNotFoundException ( String .format ( "No file found for %s" , aspectModelUrn ) ) ).getContent ();
8184 }
8285
83- public Map <String , List <Version >> importPackage ( final CompletedFileUpload zipFile , final List <String > filesToImport ) {
86+ public List <Map <String , String >> validatePackage ( final CompletedFileUpload zipFile ) {
87+ try {
88+ final byte [] zipContent = IOUtils .toByteArray ( zipFile .getInputStream () );
89+ final NamespacePackage namespacePackage = new NamespacePackage ( zipContent , null );
90+
91+ return namespacePackage .loadContents ().flatMap ( file -> {
92+ final ByteArrayInputStream inputStream =
93+ ModelUtils .createInputStream ( ( (RawAspectModelFile ) file ).sourceRepresentation () );
94+ final AspectModel aspectModel = aspectModelLoader .load ( inputStream );
95+ if ( aspectModel != null ) {
96+ return aspectModel .files ().stream ()
97+ .flatMap ( aspectModelFile -> {
98+ try {
99+ return aspectModelLoader .load ( aspectModelFile .elements ().getFirst ().urn () )
100+ .files ().stream ().map ( AspectModelFile ::filename )
101+ .filter ( Optional ::isPresent ).map ( Optional ::get );
102+ } catch ( final ModelResolutionException e ) {
103+ LOG .info ( "Ignoring Exception" );
104+ return Stream .empty ();
105+ }
106+ } );
107+ }
108+ return Stream .empty ();
109+ } )
110+ .map ( filename -> Map .of ( "model" , filename ) )
111+ .toList ();
112+ } catch ( final IOException e ) {
113+ throw new ModelResolutionException ( "Could not read from input" , e );
114+ }
115+ }
116+
117+ public Map <String , List <Version >> importPackage ( final CompletedFileUpload zipFile ) {
84118 try {
85119 final ModelsRoot modelsRoot = new StructuredModelsRoot ( this .modelPath );
86120 final byte [] zipContent = IOUtils .toByteArray ( zipFile .getInputStream () );
@@ -92,9 +126,7 @@ public Map<String, List<Version>> importPackage( final CompletedFileUpload zipFi
92126 final AspectChangeManager changeManager = initChangeManager ();
93127 changeManager .applyChange ( new ChangeGroup ( fileChanges ) );
94128
95- final Stream <AspectModelFile > selectedFiles = filterImportedFiles ( changeManager , filesToImport );
96-
97- final Stream <URI > savedUris = saveAspectModelFiles ( selectedFiles );
129+ final Stream <URI > savedUris = saveAspectModelFiles ( changeManager .aspectModelFiles () );
98130
99131 return new ModelGroupingUtils ( this .aspectModelLoader , this .modelPath ).groupModelsByNamespaceAndVersion ( savedUris );
100132 } catch ( final IOException e ) {
@@ -116,11 +148,6 @@ private AspectChangeManager initChangeManager() {
116148 return new AspectChangeManager ( config , new AspectModelLoader ().emptyModel () );
117149 }
118150
119- private Stream <AspectModelFile > filterImportedFiles ( final AspectChangeManager changeManager , final List <String > filesToImport ) {
120- return changeManager .aspectModelFiles ().filter (
121- file -> filesToImport .stream ().anyMatch ( path -> file .sourceLocation ().map ( URI ::toString ).orElse ( "" ).contains ( path ) ) );
122- }
123-
124151 private Stream <URI > saveAspectModelFiles ( final Stream <AspectModelFile > files ) {
125152 return files .peek ( this ::ensureParentDirectoryExists ).peek ( AspectSerializer .INSTANCE ::write ).map ( AspectModelFile ::sourceLocation )
126153 .filter ( Optional ::isPresent ).map ( Optional ::get );
0 commit comments