Skip to content

Commit 6ca4370

Browse files
committed
What if... there was no isolation?
1 parent 26737b4 commit 6ca4370

File tree

1 file changed

+16
-62
lines changed

1 file changed

+16
-62
lines changed

modules/codegen/src/smithy4s/codegen/internals/ModelLoader.scala

Lines changed: 16 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,9 @@ import software.amazon.smithy.build.ProjectionTransformer
2525
import software.amazon.smithy.build.TransformContext
2626
import software.amazon.smithy.model.Model
2727
import software.amazon.smithy.model.loader.ModelAssembler
28-
import software.amazon.smithy.model.loader.ModelDiscovery
29-
import software.amazon.smithy.model.loader.ModelManifestException
3028

3129
import java.io.File
3230
import 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

3832
private[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

Comments
 (0)