Browse Source

Revise changes to DefaultGenerationContext and GeneratedClasses

In order to reduce the surface area of published APIs in the affected
classes, this commit:

- Reverts the changes made to GeneratedClasses in c354b1014d.

- Reverts the changes made to DefaultGenerationContext in a28ec3a0a8.

- Makes the DefaultGenerationContext(DefaultGenerationContext, String)
  constructor protected.

- Reworks the internals of TestContextGenerationContext to align with
  the above changes.

See gh-30861
Closes gh-30895
Closes gh-30897
pull/30915/head
Sam Brannen 2 years ago
parent
commit
2ba9939bd8
  1. 17
      spring-core/src/main/java/org/springframework/aot/generate/DefaultGenerationContext.java
  2. 25
      spring-core/src/main/java/org/springframework/aot/generate/GeneratedClasses.java
  3. 23
      spring-test/src/main/java/org/springframework/test/context/aot/TestContextGenerationContext.java

17
spring-core/src/main/java/org/springframework/aot/generate/DefaultGenerationContext.java

@ -78,7 +78,7 @@ public class DefaultGenerationContext implements GenerationContext {
* @param generatedFiles the generated files * @param generatedFiles the generated files
* @param runtimeHints the runtime hints * @param runtimeHints the runtime hints
*/ */
protected DefaultGenerationContext(GeneratedClasses generatedClasses, DefaultGenerationContext(GeneratedClasses generatedClasses,
GeneratedFiles generatedFiles, RuntimeHints runtimeHints) { GeneratedFiles generatedFiles, RuntimeHints runtimeHints) {
Assert.notNull(generatedClasses, "'generatedClasses' must not be null"); Assert.notNull(generatedClasses, "'generatedClasses' must not be null");
@ -90,9 +90,18 @@ public class DefaultGenerationContext implements GenerationContext {
this.runtimeHints = runtimeHints; this.runtimeHints = runtimeHints;
} }
private DefaultGenerationContext(DefaultGenerationContext existing, String name) { /**
int sequence = existing.sequenceGenerator.computeIfAbsent(name, key -> new AtomicInteger()).getAndIncrement(); * Create a new {@link DefaultGenerationContext} instance based on the
String featureName = (sequence > 0 ? name + sequence : name); * supplied {@code existing} context and feature name.
* @param existing the existing context upon which to base the new one
* @param featureName the feature name to use
* @since 6.0.12
*/
protected DefaultGenerationContext(DefaultGenerationContext existing, String featureName) {
int sequence = existing.sequenceGenerator.computeIfAbsent(featureName, key -> new AtomicInteger()).getAndIncrement();
if (sequence > 0) {
featureName += sequence;
}
this.sequenceGenerator = existing.sequenceGenerator; this.sequenceGenerator = existing.sequenceGenerator;
this.generatedClasses = existing.generatedClasses.withFeatureNamePrefix(featureName); this.generatedClasses = existing.generatedClasses.withFeatureNamePrefix(featureName);
this.generatedFiles = existing.generatedFiles; this.generatedFiles = existing.generatedFiles;

25
spring-core/src/main/java/org/springframework/aot/generate/GeneratedClasses.java

@ -176,19 +176,6 @@ public class GeneratedClasses {
return addForFeatureComponent(featureName, ClassName.get(targetComponent), type); return addForFeatureComponent(featureName, ClassName.get(targetComponent), type);
} }
/**
* Create a new {@link GeneratedClasses} instance using the specified feature
* name prefix to qualify generated class names for a dedicated round of code
* generation.
* @param featureNamePrefix the feature name prefix to use
* @return a new instance for the specified feature name prefix
* @since 6.0.12
*/
public GeneratedClasses withFeatureNamePrefix(String featureNamePrefix) {
return new GeneratedClasses(this.classNameGenerator.withFeatureNamePrefix(featureNamePrefix),
this.classes, this.classesByOwner);
}
private GeneratedClass createAndAddGeneratedClass(String featureName, private GeneratedClass createAndAddGeneratedClass(String featureName,
@Nullable ClassName targetComponent, Consumer<TypeSpec.Builder> type) { @Nullable ClassName targetComponent, Consumer<TypeSpec.Builder> type) {
@ -212,6 +199,18 @@ public class GeneratedClasses {
} }
} }
/**
* Create a new {@link GeneratedClasses} instance using the specified feature
* name prefix to qualify generated class names for a dedicated round of code
* generation.
* @param featureNamePrefix the feature name prefix to use
* @return a new instance for the specified feature name prefix
*/
GeneratedClasses withFeatureNamePrefix(String featureNamePrefix) {
return new GeneratedClasses(this.classNameGenerator.withFeatureNamePrefix(featureNamePrefix),
this.classes, this.classesByOwner);
}
private record Owner(String featureNamePrefix, String featureName, @Nullable ClassName target) { private record Owner(String featureNamePrefix, String featureName, @Nullable ClassName target) {
} }

23
spring-test/src/main/java/org/springframework/test/context/aot/TestContextGenerationContext.java

@ -18,7 +18,6 @@ package org.springframework.test.context.aot;
import org.springframework.aot.generate.ClassNameGenerator; import org.springframework.aot.generate.ClassNameGenerator;
import org.springframework.aot.generate.DefaultGenerationContext; import org.springframework.aot.generate.DefaultGenerationContext;
import org.springframework.aot.generate.GeneratedClasses;
import org.springframework.aot.generate.GeneratedFiles; import org.springframework.aot.generate.GeneratedFiles;
import org.springframework.aot.hint.RuntimeHints; import org.springframework.aot.hint.RuntimeHints;
@ -49,16 +48,13 @@ class TestContextGenerationContext extends DefaultGenerationContext {
} }
/** /**
* Create a new {@link TestContextGenerationContext} instance backed by the * Create a new {@link TestContextGenerationContext} instance based on the
* specified {@link GeneratedClasses}, {@link GeneratedFiles}, and * supplied {@code existing} context and feature name.
* {@link RuntimeHints}. * @param existing the existing context upon which to base the new one
* @param generatedClasses the generated classes * @param featureName the feature name to use
* @param generatedFiles the generated files
* @param runtimeHints the runtime hints
*/ */
private TestContextGenerationContext(GeneratedClasses generatedClasses, GeneratedFiles generatedFiles, private TestContextGenerationContext(TestContextGenerationContext existing, String featureName) {
RuntimeHints runtimeHints, String featureName) { super(existing, featureName);
super(generatedClasses, generatedFiles, runtimeHints);
this.featureName = featureName; this.featureName = featureName;
} }
@ -67,8 +63,8 @@ class TestContextGenerationContext extends DefaultGenerationContext {
* Create a new {@link TestContextGenerationContext} instance using the specified * Create a new {@link TestContextGenerationContext} instance using the specified
* feature name to qualify generated assets for a dedicated round of code generation. * feature name to qualify generated assets for a dedicated round of code generation.
* <p>If <em>this</em> {@code TestContextGenerationContext} has a configured feature * <p>If <em>this</em> {@code TestContextGenerationContext} has a configured feature
* name, the supplied feature name will be appended to the existing feature name * name, the existing feature name will prepended to the supplied feature name in
* in order to avoid naming collisions. * order to avoid naming collisions.
* @param featureName the feature name to use * @param featureName the feature name to use
* @return a specialized {@link TestContextGenerationContext} for the specified * @return a specialized {@link TestContextGenerationContext} for the specified
* feature name * feature name
@ -78,8 +74,7 @@ class TestContextGenerationContext extends DefaultGenerationContext {
if (this.featureName != null) { if (this.featureName != null) {
featureName = this.featureName + featureName; featureName = this.featureName + featureName;
} }
GeneratedClasses generatedClasses = getGeneratedClasses().withFeatureNamePrefix(featureName); return new TestContextGenerationContext(this, featureName);
return new TestContextGenerationContext(generatedClasses, getGeneratedFiles(), getRuntimeHints(), featureName);
} }
} }

Loading…
Cancel
Save