Skip to content

Commit fe44324

Browse files
feat: add manifest-to-markdown renderer (#166)
* feat: add JSON -> Markdown renderer * rename methods * cleanup, tests * copyright headers
1 parent 0190b53 commit fe44324

File tree

22 files changed

+5545
-21
lines changed

22 files changed

+5545
-21
lines changed

DEPENDENCIES

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,19 @@
11
maven/mavencentral/com.autonomousapps/antlr/4.10.1.3, , restricted, clearlydefined
22
maven/mavencentral/com.autonomousapps/asm-relocated/9.4.0.1, , restricted, clearlydefined
33
maven/mavencentral/com.autonomousapps/dependency-analysis-gradle-plugin/1.20.0, , restricted, clearlydefined
4-
maven/mavencentral/com.autonomousapps/graph-support/0.1, , restricted, clearlydefined
4+
maven/mavencentral/com.autonomousapps/graph-support/0.1, Apache-2.0, approved, #9666
55
maven/mavencentral/com.fasterxml.jackson.core/jackson-annotations/2.11.1, Apache-2.0, approved, CQ23491
6-
maven/mavencentral/com.fasterxml.jackson.core/jackson-annotations/2.14.2, Apache-2.0, approved, #5303
76
maven/mavencentral/com.fasterxml.jackson.core/jackson-annotations/2.15.2, Apache-2.0, approved, #7947
8-
maven/mavencentral/com.fasterxml.jackson.core/jackson-core/2.14.2, Apache-2.0 AND MIT, approved, #4303
97
maven/mavencentral/com.fasterxml.jackson.core/jackson-core/2.15.2, MIT AND Apache-2.0, approved, #7932
108
maven/mavencentral/com.fasterxml.jackson.core/jackson-databind/2.11.0, Apache-2.0, approved, CQ23093
119
maven/mavencentral/com.fasterxml.jackson.core/jackson-databind/2.11.1, Apache-2.0, approved, CQ23093
1210
maven/mavencentral/com.fasterxml.jackson.core/jackson-databind/2.13.1, Apache-2.0, approved, #2134
13-
maven/mavencentral/com.fasterxml.jackson.core/jackson-databind/2.14.2, Apache-2.0, approved, #4105
1411
maven/mavencentral/com.fasterxml.jackson.core/jackson-databind/2.15.2, Apache-2.0, approved, #7934
1512
maven/mavencentral/com.fasterxml.jackson.core/jackson-databind/2.2.3, Apache-2.0 OR (Apache-2.0 AND LGPL-2.1), restricted, clearlydefined
1613
maven/mavencentral/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml/2.11.1, Apache-2.0, approved, CQ23094
1714
maven/mavencentral/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml/2.13.1, Apache-2.0, approved, #2566
1815
maven/mavencentral/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml/2.15.2, Apache-2.0, approved, #8802
1916
maven/mavencentral/com.fasterxml.jackson.datatype/jackson-datatype-jsr310/2.11.1, Apache-2.0, approved, clearlydefined
20-
maven/mavencentral/com.fasterxml.jackson.datatype/jackson-datatype-jsr310/2.14.2, Apache-2.0, approved, #4699
2117
maven/mavencentral/com.fasterxml.jackson.datatype/jackson-datatype-jsr310/2.15.2, Apache-2.0, approved, #7930
2218
maven/mavencentral/com.fasterxml.jackson/jackson-bom/2.15.2, Apache-2.0, approved, #7929
2319
maven/mavencentral/com.fasterxml/classmate/1.3.1, Apache-2.0, approved, CQ10239
@@ -27,7 +23,7 @@ maven/mavencentral/com.github.fge/jackson-coreutils/1.6, Apache-2.0 or LGPL-3.0-
2723
maven/mavencentral/com.github.fge/jackson-coreutils/1.8, LGPL-3.0 OR Apache-2.0, approved, clearlydefined
2824
maven/mavencentral/com.github.fge/json-patch/1.6, LGPL-3.0 OR Apache-2.0, restricted, clearlydefined
2925
maven/mavencentral/com.github.fge/msg-simple/1.1, Apache-2.0 OR LGPL-3.0-or-later, approved, #2574
30-
maven/mavencentral/com.github.fge/uri-template/0.9, (Apache-2.0 AND LGPL-3.0 AND LGPL-3.0-only) OR (Apache-2.0 AND LGPL-3.0-only), restricted, clearlydefined
26+
maven/mavencentral/com.github.fge/uri-template/0.9, Apache-2.0 OR LGPL-3.0-or-later, approved, #9668
3127
maven/mavencentral/com.github.java-json-tools/btf/1.3, Apache-2.0 OR LGPL-3.0-or-later, approved, #2721
3228
maven/mavencentral/com.github.java-json-tools/jackson-coreutils-equivalence/1.0, LGPL-3.0 OR Apache-2.0, approved, clearlydefined
3329
maven/mavencentral/com.github.java-json-tools/jackson-coreutils/2.0, , approved, #2719
@@ -58,7 +54,7 @@ maven/mavencentral/com.googlecode.libphonenumber/libphonenumber/8.0.0, Apache-2.
5854
maven/mavencentral/com.googlecode.libphonenumber/libphonenumber/8.11.1, Apache-2.0, approved, clearlydefined
5955
maven/mavencentral/com.puppycrawl.tools/checkstyle/10.0, LGPL-2.1-or-later, approved, #7936
6056
maven/mavencentral/com.rameshkp/openapi-merger-app/1.0.5, , restricted, clearlydefined
61-
maven/mavencentral/com.rameshkp/openapi-merger-gradle-plugin/1.0.5, , restricted, clearlydefined
57+
maven/mavencentral/com.rameshkp/openapi-merger-gradle-plugin/1.0.5, Apache-2.0, approved, #9669
6258
maven/mavencentral/com.squareup.moshi/moshi-adapters/1.14.0, Apache-2.0, approved, clearlydefined
6359
maven/mavencentral/com.squareup.moshi/moshi-kotlin/1.14.0, Apache-2.0, approved, clearlydefined
6460
maven/mavencentral/com.squareup.moshi/moshi/1.14.0, Apache-2.0, approved, clearlydefined
@@ -73,7 +69,7 @@ maven/mavencentral/commons-io/commons-io/2.6, Apache-2.0, approved, CQ19090
7369
maven/mavencentral/commons-logging/commons-logging/1.2, Apache-2.0, approved, CQ10162
7470
maven/mavencentral/dev.zacsweers.moshix/moshi-sealed-reflect/0.19.0, , restricted, clearlydefined
7571
maven/mavencentral/dev.zacsweers.moshix/moshi-sealed-runtime/0.19.0, , restricted, clearlydefined
76-
maven/mavencentral/gradle.plugin.org.gradle.crypto/checksum/1.4.0, , restricted, clearlydefined
72+
maven/mavencentral/gradle.plugin.org.gradle.crypto/checksum/1.4.0, Apache-2.0, approved, #9667
7773
maven/mavencentral/gradle.plugin.org.hidetake/gradle-swagger-generator-plugin/2.19.2, , restricted, clearlydefined
7874
maven/mavencentral/info.picocli/picocli/4.6.3, Apache-2.0, approved, clearlydefined
7975
maven/mavencentral/io.github.gradle-nexus/publish-plugin/1.3.0, , restricted, clearlydefined
@@ -109,6 +105,7 @@ maven/mavencentral/net.bytebuddy/byte-buddy/1.14.1, Apache-2.0 AND BSD-3-Clause,
109105
maven/mavencentral/net.sf.jopt-simple/jopt-simple/5.0.3, MIT, approved, CQ13174
110106
maven/mavencentral/net.sf.jopt-simple/jopt-simple/5.0.4, MIT, approved, CQ13174
111107
maven/mavencentral/net.sf.saxon/Saxon-HE/10.6, MPL-2.0 AND W3C, approved, #7945
108+
maven/mavencentral/net.steppschuh.markdowngenerator/markdowngenerator/1.3.1.1, , restricted, clearlydefined
112109
maven/mavencentral/org.antlr/antlr4-runtime/4.9.3, BSD-3-Clause, approved, #322
113110
maven/mavencentral/org.apache.commons/commons-lang3/3.12.0, Apache-2.0, approved, clearlydefined
114111
maven/mavencentral/org.apache.commons/commons-lang3/3.2.1, Apache-2.0, approved, clearlydefined
@@ -132,7 +129,7 @@ maven/mavencentral/org.jacoco/org.jacoco.core/0.8.8, EPL-2.0, approved, CQ23283
132129
maven/mavencentral/org.jacoco/org.jacoco.report/0.8.8, EPL-2.0 AND Apache-2.0, approved, CQ23284
133130
maven/mavencentral/org.javassist/javassist/3.28.0-GA, Apache-2.0 OR LGPL-2.1-or-later OR MPL-1.1, approved, #327
134131
maven/mavencentral/org.jboss.logging/jboss-logging/3.3.0.Final, Apache-2.0, approved, CQ13772
135-
maven/mavencentral/org.jetbrains.kotlin/kotlin-bom/1.7.22, , restricted, clearlydefined
132+
maven/mavencentral/org.jetbrains.kotlin/kotlin-bom/1.7.22, Apache-2.0, approved, #9665
136133
maven/mavencentral/org.jetbrains.kotlin/kotlin-reflect/1.7.0, Apache-2.0, approved, clearlydefined
137134
maven/mavencentral/org.jetbrains.kotlin/kotlin-reflect/1.7.20, Apache-2.0, approved, clearlydefined
138135
maven/mavencentral/org.jetbrains.kotlin/kotlin-reflect/1.7.22, Apache-2.0, approved, clearlydefined

buildSrc/build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ dependencies {
2929
implementation(libs.jackson.datatypeJsr310)
3030

3131
api(libs.edc.runtime.metamodel)
32-
32+
implementation(libs.markdown.gen)
3333
}
3434

3535
gradlePlugin {
@@ -47,6 +47,7 @@ sourceSets {
4747
srcDirs(
4848
"../plugins/autodoc/autodoc-plugin/src/main",
4949
"../plugins/autodoc/autodoc-processor/src/main",
50+
"../plugins/autodoc/autodoc-converters/src/main",
5051
"../plugins/edc-build/src/main",
5152
"../plugins/module-names/src/main",
5253
"../plugins/openapi-merger/src/main",

gradle/libs.versions.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ plugin-openapi-merger-app = { module = "com.rameshkp:openapi-merger-app", versio
2222
plugin-swagger = { module = "io.swagger.core.v3:swagger-gradle-plugin", version = "2.2.10" }
2323
plugin-swagger-generator = { module = "gradle.plugin.org.hidetake:gradle-swagger-generator-plugin", version = "2.19.2" }
2424

25+
# third party
26+
markdown-gen = { module = "net.steppschuh.markdowngenerator:markdowngenerator", version = "1.3.1.1" }
2527
[bundles]
2628

2729
[plugins]
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
This module contains the business logic code for the `autodoc` feature, i.e. the actual annotation processor.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
* Copyright (c) 2022 Microsoft Corporation
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Apache License, Version 2.0 which is available at
6+
* https://www.apache.org/licenses/LICENSE-2.0
7+
*
8+
* SPDX-License-Identifier: Apache-2.0
9+
*
10+
* Contributors:
11+
* Microsoft Corporation - initial API and implementation
12+
*/
13+
14+
plugins {
15+
`java-library`
16+
}
17+
18+
dependencies {
19+
api(libs.edc.runtime.metamodel)
20+
implementation(libs.markdown.gen)
21+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Apache License, Version 2.0 which is available at
6+
* https://www.apache.org/licenses/LICENSE-2.0
7+
*
8+
* SPDX-License-Identifier: Apache-2.0
9+
*
10+
* Contributors:
11+
* Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - initial API and implementation
12+
*
13+
*/
14+
15+
package org.eclipse.edc.plugins.autodoc.json;
16+
17+
import com.fasterxml.jackson.core.type.TypeReference;
18+
import com.fasterxml.jackson.databind.ObjectMapper;
19+
import org.eclipse.edc.plugins.autodoc.spi.ManifestConverterException;
20+
import org.eclipse.edc.plugins.autodoc.spi.ManifestReader;
21+
import org.eclipse.edc.runtime.metamodel.domain.EdcModule;
22+
23+
import java.io.BufferedInputStream;
24+
import java.io.IOException;
25+
import java.io.InputStream;
26+
import java.io.InputStreamReader;
27+
import java.util.List;
28+
29+
public class JsonManifestReader implements ManifestReader {
30+
private static final TypeReference<List<EdcModule>> MODULE_TYPE_REF = new TypeReference<>() {
31+
};
32+
private final ObjectMapper objectMapper;
33+
34+
public JsonManifestReader(ObjectMapper objectMapper) {
35+
this.objectMapper = objectMapper;
36+
}
37+
38+
@Override
39+
public List<EdcModule> read(InputStream inputStream) {
40+
try {
41+
return objectMapper.readValue(new InputStreamReader(new BufferedInputStream(inputStream)), MODULE_TYPE_REF);
42+
} catch (IOException e) {
43+
throw new ManifestConverterException(e);
44+
}
45+
}
46+
}
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
/*
2+
* Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Apache License, Version 2.0 which is available at
6+
* https://www.apache.org/licenses/LICENSE-2.0
7+
*
8+
* SPDX-License-Identifier: Apache-2.0
9+
*
10+
* Contributors:
11+
* Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - initial API and implementation
12+
*
13+
*/
14+
15+
package org.eclipse.edc.plugins.autodoc.markdown;
16+
17+
import net.steppschuh.markdowngenerator.Markdown;
18+
import net.steppschuh.markdowngenerator.MarkdownElement;
19+
import net.steppschuh.markdowngenerator.table.Table;
20+
import org.eclipse.edc.plugins.autodoc.spi.ManifestConverterException;
21+
import org.eclipse.edc.plugins.autodoc.spi.ManifestRenderer;
22+
import org.eclipse.edc.runtime.metamodel.domain.ConfigurationSetting;
23+
import org.eclipse.edc.runtime.metamodel.domain.ModuleType;
24+
import org.eclipse.edc.runtime.metamodel.domain.Service;
25+
import org.eclipse.edc.runtime.metamodel.domain.ServiceReference;
26+
import org.jetbrains.annotations.NotNull;
27+
import org.jetbrains.annotations.Nullable;
28+
29+
import java.io.IOException;
30+
import java.io.OutputStream;
31+
import java.nio.charset.StandardCharsets;
32+
import java.util.Arrays;
33+
import java.util.List;
34+
import java.util.stream.Collectors;
35+
36+
import static java.lang.String.format;
37+
import static java.util.Optional.ofNullable;
38+
import static net.steppschuh.markdowngenerator.Markdown.bold;
39+
import static net.steppschuh.markdowngenerator.Markdown.code;
40+
import static net.steppschuh.markdowngenerator.Markdown.heading;
41+
import static net.steppschuh.markdowngenerator.Markdown.italic;
42+
import static net.steppschuh.markdowngenerator.Markdown.unorderedList;
43+
44+
public class MarkdownManifestRenderer implements ManifestRenderer {
45+
46+
private static final String NEWLINE = System.lineSeparator();
47+
private final OutputStream output;
48+
private final StringBuilder stringBuilder;
49+
50+
public MarkdownManifestRenderer(OutputStream output) {
51+
this.output = output;
52+
stringBuilder = new StringBuilder();
53+
}
54+
55+
@Override
56+
public void renderDocumentHeader() {
57+
stringBuilder.append(heading(DOCUMENT_HEADING, 1)).append(NEWLINE);
58+
stringBuilder.append(NEWLINE);
59+
}
60+
61+
@Override
62+
public void renderModuleHeading(@Nullable String moduleName, @NotNull String modulePath, @NotNull String version) {
63+
var name = ofNullable(moduleName).orElse(modulePath);
64+
65+
var moduleHeading = heading(format("Module `%s:%s`", name, version), 2);
66+
stringBuilder.append(moduleHeading).append(NEWLINE);
67+
68+
if (moduleName != null) {
69+
stringBuilder.append(italic(modulePath)).append(NEWLINE);
70+
}
71+
stringBuilder.append(NEWLINE);
72+
}
73+
74+
@Override
75+
public void renderCategories(List<String> categories) {
76+
// append categories as italic text
77+
var cat = categories
78+
.stream()
79+
.filter(c -> c != null && !c.isEmpty())
80+
.collect(Collectors.joining(","));
81+
82+
if (cat.isEmpty()) {
83+
cat = NONE;
84+
}
85+
86+
stringBuilder.append(italic(format("Categories: %s", cat))).append(NEWLINE);
87+
stringBuilder.append(NEWLINE);
88+
}
89+
90+
@Override
91+
public void renderExtensionPoints(List<Service> extensionPoints) {
92+
// append extension points
93+
stringBuilder.append(heading(EXTENSION_POINTS, 3)).append(NEWLINE);
94+
stringBuilder.append(listOrNone(unorderedList(extensionPoints.stream().map(s -> code(s.getService())).toList().toArray()))).append(NEWLINE);
95+
stringBuilder.append(NEWLINE);
96+
}
97+
98+
@Override
99+
public void renderExtensionHeading() {
100+
stringBuilder.append(heading(EXTENSIONS, 3)).append(NEWLINE);
101+
}
102+
103+
@Override
104+
public void renderExtensionHeader(@NotNull String className, String name, String overview, ModuleType type) {
105+
stringBuilder.append(heading("Class: " + code(className), 4)).append(NEWLINE);
106+
107+
stringBuilder.append(bold("Name:")).append(format(" \"%s\"", name)).append(NEWLINE);
108+
if (overview != null) {
109+
stringBuilder.append(NEWLINE).append(bold("Overview:")).append(" ").append(overview).append(NEWLINE).append(NEWLINE);
110+
}
111+
stringBuilder.append(NEWLINE);
112+
}
113+
114+
@Override
115+
public void renderConfigurations(List<ConfigurationSetting> configuration) {
116+
// add configuration table
117+
var tableBuilder = new Table.Builder()
118+
.addRow("Key", "Required", "Type", "Pattern", "Min", "Max", "Description");
119+
120+
configuration.forEach(setting -> tableBuilder.addRow(code(setting.getKey()),
121+
setting.isRequired() ? code("*") : null,
122+
code(setting.getType()),
123+
ofNullable(setting.getPattern()).map(Markdown::code).orElse(null),
124+
ofNullable(setting.getMinimum()).map(m -> code(String.valueOf(m))).orElse(null),
125+
ofNullable(setting.getMaximum()).map(m -> code(String.valueOf(m))).orElse(null),
126+
setting.getDescription()));
127+
128+
stringBuilder.append(heading("Configuration: ", 5));
129+
if (!configuration.isEmpty()) {
130+
stringBuilder.append(NEWLINE).append(NEWLINE).append(tableBuilder.build()).append(NEWLINE);
131+
} else {
132+
stringBuilder.append(italic(NONE)).append(NEWLINE);
133+
}
134+
stringBuilder.append(NEWLINE);
135+
}
136+
137+
@Override
138+
public void renderExposedServices(List<Service> provides) {
139+
// add exposed services
140+
stringBuilder.append(heading("Provided services:", 5)).append(NEWLINE);
141+
stringBuilder.append(listOrNone(provides.stream().map(s -> code(s.getService())).toList().toArray())).append(NEWLINE);
142+
stringBuilder.append(NEWLINE);
143+
}
144+
145+
@Override
146+
public void renderReferencedServices(List<ServiceReference> references) {
147+
// add injected services
148+
stringBuilder.append(heading("Referenced (injected) services:", 5)).append(NEWLINE);
149+
stringBuilder.append(listOrNone(references.stream().map(s -> format("%s (%s)", code(s.getService()), s.isRequired() ? "required" : "optional")).toList().toArray())).append(NEWLINE);
150+
stringBuilder.append(NEWLINE);
151+
}
152+
153+
@Override
154+
public OutputStream finalizeRendering() {
155+
try {
156+
output.write(stringBuilder.toString().getBytes(StandardCharsets.UTF_8));
157+
} catch (IOException e) {
158+
throw new ManifestConverterException(e);
159+
}
160+
return output;
161+
}
162+
163+
private MarkdownElement listOrNone(Object... items) {
164+
if (items.length == 0 || Arrays.stream(items).allMatch(o -> o.toString().isEmpty())) {
165+
return italic(NONE);
166+
} else {
167+
return unorderedList(items);
168+
}
169+
}
170+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/*
2+
* Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Apache License, Version 2.0 which is available at
6+
* https://www.apache.org/licenses/LICENSE-2.0
7+
*
8+
* SPDX-License-Identifier: Apache-2.0
9+
*
10+
* Contributors:
11+
* Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - initial API and implementation
12+
*
13+
*/
14+
15+
package org.eclipse.edc.plugins.autodoc.spi;
16+
17+
public class ManifestConverterException extends RuntimeException {
18+
public ManifestConverterException(Throwable e) {
19+
super(e);
20+
}
21+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*
2+
* Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
3+
*
4+
* This program and the accompanying materials are made available under the
5+
* terms of the Apache License, Version 2.0 which is available at
6+
* https://www.apache.org/licenses/LICENSE-2.0
7+
*
8+
* SPDX-License-Identifier: Apache-2.0
9+
*
10+
* Contributors:
11+
* Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - initial API and implementation
12+
*
13+
*/
14+
15+
package org.eclipse.edc.plugins.autodoc.spi;
16+
17+
import org.eclipse.edc.runtime.metamodel.domain.EdcModule;
18+
19+
import java.io.InputStream;
20+
import java.util.List;
21+
22+
/**
23+
* Reads a manifest file, which contains a {@link List} of {@link EdcModule}. Implementations are file-format specific.
24+
*/
25+
public interface ManifestReader {
26+
/**
27+
* Reads an input stream, e.g. a FileInput stream, and interprets it
28+
*
29+
* @param inputStream The input
30+
*/
31+
List<EdcModule> read(InputStream inputStream);
32+
}

0 commit comments

Comments
 (0)