Skip to content

Commit 5059415

Browse files
committed
General tidy-up and more JavaDocs
1 parent 052d351 commit 5059415

File tree

23 files changed

+272
-127
lines changed

23 files changed

+272
-127
lines changed

aspire4j/aspire4j-extensions-azure-eventhubs/src/main/java/com/microsoft/aspire/extensions/azure/storage/resources/AzureEventHubsResource.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22

33
import com.microsoft.aspire.resources.AzureBicepResource;
44
import com.microsoft.aspire.resources.traits.ResourceWithEndpoints;
5+
import com.microsoft.aspire.utils.templates.TemplateDescriptor;
6+
import com.microsoft.aspire.utils.templates.TemplateDescriptorsBuilder;
57
import com.microsoft.aspire.utils.templates.TemplateEngine;
8+
import com.microsoft.aspire.utils.templates.TemplateFileOutput;
69

710
import java.util.List;
811
import java.util.Map;
@@ -25,9 +28,8 @@ public List<TemplateFileOutput> processTemplate() {
2528
.with("eventhubns.module.bicep", "${name}.module.bicep")
2629
.build();
2730

28-
List<TemplateFileOutput> templateOutput = TemplateEngine.process(AzureEventHubsResource.class, templateFiles, Map.of(
29-
"name", getName()
30-
));
31+
List<TemplateFileOutput> templateOutput = TemplateEngine.getTemplateEngine()
32+
.process(AzureEventHubsResource.class, templateFiles, Map.of("name", getName()));
3133

3234
// we know that we need to get the output filename from the first element, and set that as the path
3335
// FIXME we need a better way of determining the output path of the template

aspire4j/aspire4j-extensions-azure-openai/src/main/java/com/microsoft/aspire/extensions/azure/openai/resources/AzureOpenAIResource.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
import com.microsoft.aspire.resources.references.ReferenceExpression;
66
import com.microsoft.aspire.resources.traits.ResourceWithConnectionString;
77
import com.microsoft.aspire.resources.traits.ResourceWithEndpoints;
8+
import com.microsoft.aspire.utils.templates.TemplateDescriptor;
9+
import com.microsoft.aspire.utils.templates.TemplateDescriptorsBuilder;
810
import com.microsoft.aspire.utils.templates.TemplateEngine;
11+
import com.microsoft.aspire.utils.templates.TemplateFileOutput;
912

1013
import java.util.ArrayList;
1114
import java.util.List;
@@ -39,9 +42,8 @@ public List<TemplateFileOutput> processTemplate() {
3942
.with("openai.module.bicep", "${name}.module.bicep")
4043
.build();
4144

42-
List<TemplateFileOutput> templateOutput = TemplateEngine.process(AzureOpenAIResource.class, templateFiles, Map.of(
43-
"name", getName()
44-
));
45+
List<TemplateFileOutput> templateOutput = TemplateEngine.getTemplateEngine()
46+
.process(AzureOpenAIResource.class, templateFiles, Map.of("name", getName()));
4547

4648
// we know that we need to get the output filename from the first element, and set that as the path
4749
// FIXME we need a better way of determining the output path of the template

aspire4j/aspire4j-extensions-azure-storage/src/main/java/com/microsoft/aspire/extensions/azure/storage/resources/AzureStorageResource.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
import com.microsoft.aspire.resources.AzureBicepResource;
55
import com.microsoft.aspire.resources.ResourceType;
66
import com.microsoft.aspire.resources.traits.ResourceWithEndpoints;
7+
import com.microsoft.aspire.utils.templates.TemplateDescriptor;
8+
import com.microsoft.aspire.utils.templates.TemplateDescriptorsBuilder;
79
import com.microsoft.aspire.utils.templates.TemplateEngine;
10+
import com.microsoft.aspire.utils.templates.TemplateFileOutput;
811

912
import java.util.List;
1013
import java.util.Map;
@@ -54,9 +57,8 @@ public List<TemplateFileOutput> processTemplate() {
5457
.with("storage.module.bicep", "${name}.module.bicep")
5558
.build();
5659

57-
List<TemplateFileOutput> templateOutput = TemplateEngine.process(AzureStorageResource.class, templateFiles, Map.of(
58-
"name", getName()
59-
));
60+
List<TemplateFileOutput> templateOutput = TemplateEngine.getTemplateEngine()
61+
.process(AzureStorageResource.class, templateFiles, Map.of("name", getName()));
6062

6163
// we know that we need to get the output filename from the first element, and set that as the path
6264
// FIXME we need a better way of determining the output path of the template

aspire4j/aspire4j-extensions-dotnet/src/main/java/com/microsoft/aspire/extensions/dotnet/resources/Project.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import com.microsoft.aspire.resources.Resource;
99
import com.microsoft.aspire.resources.ResourceType;
1010
import com.microsoft.aspire.utils.json.RelativePath;
11-
import com.microsoft.aspire.utils.json.RelativePathSerializer;
1211
import com.microsoft.aspire.resources.traits.ResourceWithArguments;
1312
import com.microsoft.aspire.resources.traits.ResourceWithEndpoints;
1413
import com.microsoft.aspire.resources.traits.ResourceWithEnvironment;
@@ -62,7 +61,6 @@ public class Project<T extends Project<T>> extends Resource<T>
6261
@NotNull(message = "Project.path cannot be null")
6362
@NotEmpty(message = "Project.path cannot be an empty string")
6463
@JsonProperty("path")
65-
@JsonSerialize(using = RelativePathSerializer.class)
6664
@RelativePath
6765
private String path;
6866

aspire4j/aspire4j-extensions-spring/src/main/java/com/microsoft/aspire/extensions/spring/resources/EurekaServiceDiscovery.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
import com.microsoft.aspire.resources.traits.ResourceWithEndpoints;
55
import com.microsoft.aspire.resources.traits.ResourceWithTemplate;
66
import com.microsoft.aspire.utils.FileUtilities;
7+
import com.microsoft.aspire.utils.templates.TemplateDescriptor;
8+
import com.microsoft.aspire.utils.templates.TemplateDescriptorsBuilder;
79
import com.microsoft.aspire.utils.templates.TemplateEngine;
10+
import com.microsoft.aspire.utils.templates.TemplateFileOutput;
811

912
import java.nio.file.Path;
1013
import java.util.HashMap;
@@ -56,7 +59,8 @@ public List<TemplateFileOutput> processTemplate() {
5659
.with("application.yaml", "src/main/resources/application.yaml")
5760
.build();
5861

59-
List<TemplateFileOutput> templateOutput = TemplateEngine.process(EurekaServiceDiscovery.class, templateFiles, properties);
62+
List<TemplateFileOutput> templateOutput = TemplateEngine.getTemplateEngine()
63+
.process(EurekaServiceDiscovery.class, templateFiles, properties);
6064

6165
// Important - as noted in the javadoc - from the perspective of the API below, the paths are relative to the
6266
// directory in which azd is running, NOT the output directory. These paths will then be transformed at

aspire4j/aspire4j-extensions-spring/src/main/java/com/microsoft/aspire/extensions/spring/resources/SpringProject.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.fasterxml.jackson.annotation.JsonIgnore;
44
import com.fasterxml.jackson.annotation.JsonProperty;
5-
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
65
import com.microsoft.aspire.DistributedApplication;
76
import com.microsoft.aspire.extensions.spring.implementation.SpringDeploymentStrategy;
87
import com.microsoft.aspire.extensions.spring.implementation.SpringIntrospector;
@@ -13,8 +12,10 @@
1312
import com.microsoft.aspire.resources.traits.ResourceWithTemplate;
1413
import com.microsoft.aspire.utils.FileUtilities;
1514
import com.microsoft.aspire.utils.json.RelativePath;
16-
import com.microsoft.aspire.utils.json.RelativePathSerializer;
15+
import com.microsoft.aspire.utils.templates.TemplateDescriptor;
16+
import com.microsoft.aspire.utils.templates.TemplateDescriptorsBuilder;
1717
import com.microsoft.aspire.utils.templates.TemplateEngine;
18+
import com.microsoft.aspire.utils.templates.TemplateFileOutput;
1819
import jakarta.validation.Valid;
1920
import jakarta.validation.constraints.NotEmpty;
2021
import jakarta.validation.constraints.NotNull;
@@ -36,7 +37,6 @@ public class SpringProject extends Container<SpringProject>
3637
@NotNull(message = "Project.path cannot be null")
3738
@NotEmpty(message = "Project.path cannot be an empty string")
3839
@JsonProperty("path")
39-
@JsonSerialize(using = RelativePathSerializer.class)
4040
@RelativePath
4141
private String path;
4242

@@ -177,7 +177,8 @@ public List<TemplateFileOutput> processTemplate() {
177177
.with("JAVA_TOOL_OPTIONS.delim")
178178
.build();
179179

180-
List<TemplateFileOutput> templateOutput = TemplateEngine.process(SpringProject.class, templateFiles, properties);
180+
List<TemplateFileOutput> templateOutput = TemplateEngine.getTemplateEngine()
181+
.process(SpringProject.class, templateFiles, properties);
181182

182183
// Important - as noted in the javadoc - from the perspective of the API below, the paths are relative to the
183184
// directory in which azd is running, NOT the output directory. These paths will then be transformed at

aspire4j/aspire4j/src/main/java/com/microsoft/aspire/ManifestGenerator.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@
1111
import java.util.logging.Logger;
1212

1313
import com.fasterxml.jackson.databind.module.SimpleModule;
14-
import com.microsoft.aspire.utils.json.CustomSerializerModifier;
14+
import com.microsoft.aspire.implementation.utils.json.RelativePathModule;
15+
import com.microsoft.aspire.implementation.utils.json.CustomSerializerModifier;
1516
import com.microsoft.aspire.resources.traits.ResourceWithLifecycle;
1617
import com.microsoft.aspire.resources.traits.ResourceWithTemplate;
1718
import com.microsoft.aspire.utils.FileUtilities;
19+
import com.microsoft.aspire.utils.templates.TemplateFileOutput;
1820
import jakarta.validation.ConstraintViolation;
1921
import jakarta.validation.Validation;
2022
import jakarta.validation.Validator;
@@ -86,6 +88,7 @@ private void writeManifest(DistributedApplication app) {
8688
SimpleModule module = new SimpleModule();
8789
module.setSerializerModifier(new CustomSerializerModifier());
8890
objectMapper.registerModule(module);
91+
objectMapper.registerModule(new RelativePathModule());
8992

9093
printAnnotations(System.out, app);
9194

@@ -98,7 +101,7 @@ private void writeManifest(DistributedApplication app) {
98101
LOGGER.info("Manifest written to file");
99102
}
100103

101-
private void writeTemplateFile(ResourceWithTemplate.TemplateFileOutput templateFile) {
104+
private void writeTemplateFile(TemplateFileOutput templateFile) {
102105
try {
103106
Path path = Paths.get(outputPath.toString() + "/" + templateFile.filename());
104107

aspire4j/aspire4j/src/main/java/com/microsoft/aspire/implementation/TemplateStrings.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,6 @@ public static String evaluateConnectionString(String resourceName) {
4545
}
4646

4747
public static String evaluate(String template, Map<String, Object> context) {
48-
return TemplateEngine.getTemplateEngine().processTemplate(template, context);
48+
return TemplateEngine.getTemplateEngine().process(template, context);
4949
}
5050
}

aspire4j/aspire4j/src/main/java/com/microsoft/aspire/utils/json/CustomSerializerModifier.java renamed to aspire4j/aspire4j/src/main/java/com/microsoft/aspire/implementation/utils/json/CustomSerializerModifier.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
package com.microsoft.aspire.utils.json;
1+
package com.microsoft.aspire.implementation.utils.json;
22

33
import com.fasterxml.jackson.databind.BeanDescription;
44
import com.fasterxml.jackson.databind.JsonSerializer;
55
import com.fasterxml.jackson.databind.SerializationConfig;
66
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
7+
import com.microsoft.aspire.utils.json.CustomSerialize;
78

89
import java.lang.annotation.Annotation;
910

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.microsoft.aspire.implementation.utils.json;
2+
3+
import com.fasterxml.jackson.core.Version;
4+
import com.fasterxml.jackson.databind.*;
5+
import com.fasterxml.jackson.databind.Module;
6+
import com.fasterxml.jackson.databind.introspect.Annotated;
7+
import com.fasterxml.jackson.databind.introspect.AnnotatedMember;
8+
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
9+
import com.fasterxml.jackson.databind.ser.Serializers;
10+
import com.fasterxml.jackson.databind.module.SimpleSerializers;
11+
import com.microsoft.aspire.utils.json.RelativePath;
12+
13+
public class RelativePathModule extends Module {
14+
15+
@Override
16+
public String getModuleName() {
17+
return "RelativePathModule";
18+
}
19+
20+
@Override
21+
public Version version() {
22+
return Version.unknownVersion();
23+
}
24+
25+
@Override
26+
public void setupModule(SetupContext context) {
27+
context.addSerializers(new SimpleSerializers() {
28+
@Override
29+
public JsonSerializer<?> findSerializer(SerializationConfig config, JavaType type, BeanDescription beanDesc) {
30+
if (beanDesc.getClassAnnotations().has(RelativePath.class)) {
31+
return new RelativePathSerializer();
32+
}
33+
return super.findSerializer(config, type, beanDesc);
34+
}
35+
});
36+
37+
context.insertAnnotationIntrospector(new JacksonAnnotationIntrospector() {
38+
@Override
39+
protected boolean _isIgnorable(Annotated a) {
40+
if (a.hasAnnotation(RelativePath.class)) {
41+
return false; // Ensure fields with @RelativePath are not ignored
42+
}
43+
return super._isIgnorable(a);
44+
}
45+
});
46+
}
47+
}

aspire4j/aspire4j/src/main/java/com/microsoft/aspire/utils/json/RelativePathSerializer.java renamed to aspire4j/aspire4j/src/main/java/com/microsoft/aspire/implementation/utils/json/RelativePathSerializer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
package com.microsoft.aspire.utils.json;
1+
package com.microsoft.aspire.implementation.utils.json;
22

33
import com.fasterxml.jackson.core.JsonGenerator;
44
import com.fasterxml.jackson.databind.BeanProperty;
55
import com.fasterxml.jackson.databind.JsonSerializer;
66
import com.fasterxml.jackson.databind.SerializerProvider;
77
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
88
import com.microsoft.aspire.utils.FileUtilities;
9+
import com.microsoft.aspire.utils.json.RelativePath;
910

1011
import java.io.IOException;
1112
import java.nio.file.Path;
@@ -42,7 +43,6 @@ public void serialize(String value, JsonGenerator gen, SerializerProvider serial
4243
// When the path is output to the aspire-manifest.json file, the path will transform based on the relative
4344
// location of the output directory to the root directory. This way, when azd picks up the manifest file,
4445
// the paths remain correct.
45-
// gen.writeString(FileUtilities.getOutputRelativePath(value).toString());
4646
gen.writeString(FileUtilities.convertRootRelativePathToOutputPath(value).toString());
4747
} else {
4848
gen.writeString(value);

aspire4j/aspire4j/src/main/java/com/microsoft/aspire/utils/json/ResourceSerializer.java renamed to aspire4j/aspire4j/src/main/java/com/microsoft/aspire/implementation/utils/json/ResourceSerializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.microsoft.aspire.utils.json;
1+
package com.microsoft.aspire.implementation.utils.json;
22

33
import com.fasterxml.jackson.core.JsonGenerator;
44
import com.fasterxml.jackson.databind.BeanDescription;

aspire4j/aspire4j/src/main/java/com/microsoft/aspire/resources/DockerFile.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
77
import com.microsoft.aspire.resources.annotations.KeyValueAnnotation;
88
import com.microsoft.aspire.utils.json.RelativePath;
9-
import com.microsoft.aspire.utils.json.RelativePathSerializer;
9+
import com.microsoft.aspire.implementation.utils.json.RelativePathSerializer;
1010
import com.microsoft.aspire.resources.traits.ResourceWithEndpoints;
1111
import com.microsoft.aspire.resources.traits.ResourceWithEnvironment;
1212
import jakarta.validation.constraints.NotEmpty;

aspire4j/aspire4j/src/main/java/com/microsoft/aspire/resources/Resource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
66
import com.microsoft.aspire.resources.annotations.ResourceAnnotation;
77
import com.microsoft.aspire.utils.json.CustomSerialize;
8-
import com.microsoft.aspire.utils.json.ResourceSerializer;
8+
import com.microsoft.aspire.implementation.utils.json.ResourceSerializer;
99
import com.microsoft.aspire.resources.traits.*;
1010
import jakarta.validation.Valid;
1111
import jakarta.validation.constraints.NotEmpty;
Lines changed: 5 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package com.microsoft.aspire.resources.traits;
22

33
import com.microsoft.aspire.resources.Resource;
4+
import com.microsoft.aspire.utils.templates.TemplateFileOutput;
45

5-
import java.nio.file.Path;
6-
import java.util.ArrayList;
76
import java.util.List;
87

98
/**
@@ -16,78 +15,9 @@
1615
*/
1716
public interface ResourceWithTemplate<T extends Resource<T> & ResourceWithTemplate<T>> extends SelfAware<T> {
1817

18+
/**
19+
* Processes the template associated with this resource.
20+
* @return A list of template file outputs.
21+
*/
1922
List<TemplateFileOutput> processTemplate();
20-
21-
class TemplateDescriptor {
22-
private final String inputFilename;
23-
private final String outputFilename;
24-
25-
public TemplateDescriptor(String inputFilename, String outputFilename) {
26-
this.inputFilename = inputFilename;
27-
this.outputFilename = outputFilename;
28-
}
29-
30-
public String getInputFilename() {
31-
return inputFilename;
32-
}
33-
34-
public String getOutputFilename() {
35-
return outputFilename;
36-
}
37-
}
38-
39-
class TemplateDescriptorsBuilder {
40-
final String templatePath;
41-
final String outputRootPath;
42-
43-
final List<TemplateDescriptor> templateDescriptors;
44-
45-
private TemplateDescriptorsBuilder(String templatePath, String outputRootPath) {
46-
this.templatePath = templatePath;
47-
this.outputRootPath = outputRootPath;
48-
this.templateDescriptors = new ArrayList<>();
49-
}
50-
51-
/**
52-
* Begins the process of specifying template files to be processed, which will be written to the root of the
53-
* user-specified output directory by default.
54-
* @param templatePath The path to the template files, relative to the root of the jar file / the resources
55-
* directory.
56-
* @return A new TemplateDescriptorsBuilder instance that can then be used to specify the template files to be
57-
* processed.
58-
*/
59-
public static TemplateDescriptorsBuilder begin(String templatePath) {
60-
return begin(templatePath, "");
61-
}
62-
63-
/**
64-
* Begins the process of specifying template files to be processed.
65-
* @param templatePath The path to the template files, relative to the root of the jar file / the resources
66-
* directory.
67-
* @param outputRootPath The root path where the output files will be written to, relative to the
68-
* user-specified output directory.
69-
* @return A new TemplateDescriptorsBuilder instance that can then be used to specify the template files to be
70-
* processed.
71-
*/
72-
public static TemplateDescriptorsBuilder begin(String templatePath, String outputRootPath) {
73-
return new TemplateDescriptorsBuilder(templatePath, outputRootPath);
74-
}
75-
76-
public TemplateDescriptorsBuilder with(String inputFilename) {
77-
templateDescriptors.add(new TemplateDescriptor(templatePath + inputFilename, outputRootPath + inputFilename));
78-
return this;
79-
}
80-
81-
public TemplateDescriptorsBuilder with(String inputFilename, String outputFilename) {
82-
templateDescriptors.add(new TemplateDescriptor(templatePath + inputFilename, outputRootPath + outputFilename));
83-
return this;
84-
}
85-
86-
public List<TemplateDescriptor> build() {
87-
return templateDescriptors;
88-
}
89-
}
90-
91-
// FIXME at some point string content won't be sufficient, and we will want to support binary content too
92-
record TemplateFileOutput(String filename, String content) { }
9323
}

0 commit comments

Comments
 (0)