@@ -25,15 +25,9 @@ import software.amazon.smithy.build.ProjectionTransformer
2525import software .amazon .smithy .build .TransformContext
2626import software .amazon .smithy .model .Model
2727import software .amazon .smithy .model .loader .ModelAssembler
28- import software .amazon .smithy .model .loader .ModelDiscovery
29- import software .amazon .smithy .model .loader .ModelManifestException
3028
3129import java .io .File
3230import java .net .URLClassLoader
33- import java .nio .file .FileSystems
34- import java .nio .file .Files
35- import scala .jdk .CollectionConverters ._
36- import scala .util .Using
3731
3832private [codegen] object ModelLoader {
3933
@@ -52,81 +46,41 @@ private[codegen] object ModelLoader {
5246 repositories
5347 )
5448
55- val modelsInJars = deps.flatMap { file =>
56- Using .resource(
57- // Note: On JDK13+, the second parameter is redundant.
58- FileSystems .newFileSystem(file.toPath(), null : ClassLoader )
59- ) { jarFS =>
60- val p = jarFS.getPath(" META-INF" , " smithy" , " manifest" )
61-
62- // model discovery would throw if we tried to pass a non-existent path
63- if (! Files .exists(p)) Nil
64- else {
65- try ModelDiscovery .findModels(p.toUri().toURL()).asScala.toList
66- catch {
67- case e : ModelManifestException =>
68- System .err.println(
69- s " Unexpected exception while loading model from $file, skipping: $e"
70- )
71- Nil
72- }
73- }
74- }
49+ val modelCL = locally {
50+ val jarUrls = deps.map(_.toURI().toURL()).toArray
51+ new URLClassLoader (jarUrls, currentClassLoader)
7552 }
7653
77- // Loading the upstream model
78- val upstreamModel = Model
79- .assembler()
54+ val preTransformationModel = Model
55+ .assembler(modelCL)
8056 // disabling cache to support snapshot-driven experimentation
8157 .putProperty(ModelAssembler .DISABLE_JAR_CACHE , true )
82- .addClasspathModels(currentClassLoader, discoverModels)
83- .addImports(modelsInJars )
58+ .discoverModels(modelCL )
59+ .addImports(specs )
8460 .assemble()
8561 .unwrap()
8662
87- val sanitisingModelBuilder = upstreamModel.toBuilder()
88-
89- // Appending all metadata that is not Smithy4s-specific, as well as relevant
90- // Smithy4s-related metadata, into the resulting model.
91- upstreamModel.getMetadata().asScala.foreach {
92- case (CodegenRecord .METADATA_KEY , _) => ()
93- case (k, _) if k.startsWith(" smithy4s" ) =>
94- sanitisingModelBuilder.removeMetadataProperty(k)
95- case _ => ()
96- }
97-
98- val validatorClassLoader = locally {
99- val jarUrls = deps.map(_.toURI().toURL()).toArray
100- new URLClassLoader (jarUrls, currentClassLoader)
101- }
63+ val transformerFactory =
64+ ProjectionTransformer .createServiceFactory(modelCL)
10265
103- val preTransformationModel =
104- Model
105- .assembler(validatorClassLoader)
106- .addModel(sanitisingModelBuilder.build())
107- .addImports(specs)
108- .assemble()
109- .unwrap
110-
111- val serviceFactory =
112- ProjectionTransformer .createServiceFactory(validatorClassLoader)
113-
114- val trans = transformers.flatMap { t =>
115- val result = serviceFactory(t)
116- if (result.isPresent()) Some (result.get) else None
66+ val trans = transformers.flatMap {
67+ transformerFactory(_).asScala
11768 }
11869
11970 val transformedModel = trans.foldLeft(preTransformationModel)((m, t) =>
12071 t.transform(TransformContext .builder().model(m).build())
12172 )
12273
12374 val postTransformationModel = Model
124- .assembler(validatorClassLoader )
75+ .assembler(modelCL )
12576 .addModel(transformedModel)
12677 .assemble()
12778 .unwrap
12879
129- (validatorClassLoader, postTransformationModel)
80+ (
81+ modelCL,
82+ postTransformationModel
83+ )
13084 }
13185
13286 private def resolveDependencies (
0 commit comments