You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by sg...@apache.org on 2021/10/25 17:55:21 UTC
[freemarker-generator] 01/01: FREEMARKER-200 Handle non-standard
content types for JSON & YAML data models
This is an automated email from the ASF dual-hosted git repository.
sgoeschl pushed a commit to branch FREEMARKER-200
in repository https://gitbox.apache.org/repos/asf/freemarker-generator.git
commit c142a66b3bd04dc649e673ac7dba1c9eeb646665
Author: Siegfried Goeschl <si...@gmail.com>
AuthorDate: Mon Oct 25 19:55:07 2021 +0200
FREEMARKER-200 Handle non-standard content types for JSON & YAML data models
---
.../generator/base/datasource/DataSource.java | 15 ++++++++++++--
.../freemarker/generator/base/mime/Mimetypes.java | 1 +
.../generator/datasource/DataSourceTest.java | 23 ++++++++++++++++++++++
freemarker-generator-cli/CHANGELOG.md | 4 ++++
.../generator/cli/config/DataModelSupplier.java | 22 ++++++++++++++++-----
.../freemarker/generator/cli/ManualTest.java | 6 +++++-
.../cli/config/DataModelSupplierTest.java | 4 ++--
7 files changed, 65 insertions(+), 10 deletions(-)
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSource.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSource.java
index de2b295..d6735cf 100644
--- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSource.java
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSource.java
@@ -20,6 +20,7 @@ import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.LineIterator;
import org.apache.freemarker.generator.base.activation.ByteArrayDataSource;
+import org.apache.freemarker.generator.base.activation.InputStreamDataSource;
import org.apache.freemarker.generator.base.activation.StringDataSource;
import org.apache.freemarker.generator.base.mime.MimeTypeParser;
import org.apache.freemarker.generator.base.util.CloseableReaper;
@@ -193,7 +194,7 @@ public class DataSource implements Closeable, javax.activation.DataSource {
* @return file name or empty string
*/
public String getFileName() {
- return isFileDataSource() ? FilenameUtils.getName(dataSource.getName()) : "";
+ return isHierarchicalPathSupported() ? FilenameUtils.getName(uri.getPath()) : "";
}
/**
@@ -203,7 +204,7 @@ public class DataSource implements Closeable, javax.activation.DataSource {
* @return file name or empty string
*/
public String getFilePath() {
- return isFileDataSource() ? FilenameUtils.getFullPathNoEndSeparator(uri.getPath()) : "";
+ return isHierarchicalPathSupported() ? FilenameUtils.getFullPathNoEndSeparator(uri.getPath()) : "";
}
/**
@@ -477,6 +478,16 @@ public class DataSource implements Closeable, javax.activation.DataSource {
return dataSource instanceof ByteArrayDataSource;
}
+ private boolean isInputStreamDataSource() {
+ return dataSource instanceof InputStreamDataSource;
+ }
+
+ private boolean isHierarchicalPathSupported() {
+ return !isByteArrayDataSource()
+ && !isStringDataSource()
+ && !isInputStreamDataSource();
+ }
+
public static final class DataSourceBuilder {
private String name;
private String group;
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/mime/Mimetypes.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/mime/Mimetypes.java
index 6f70b69..969c631 100644
--- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/mime/Mimetypes.java
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/mime/Mimetypes.java
@@ -20,6 +20,7 @@ public class Mimetypes {
public static final String MIME_APPLICATION_JSON = "application/json";
public static final String MIME_APPLICATION_OCTET_STREAM = "application/octet-stream";
+ public static final String MIME_APPLICATION_YAML = "application/yaml";
public static final String MIME_APPLICATION_XML = "application/xml";
public static final String MIME_APPLICATION_XHTML = "application/xhtml+xml";
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceTest.java
index cb7b252..5413600 100644
--- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceTest.java
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceTest.java
@@ -51,6 +51,7 @@ public class DataSourceTest {
try (DataSource dataSource = DataSourceFactory.fromString("stdin", ANY_GROUP, ANY_TEXT, Mimetypes.MIME_TEXT_PLAIN)) {
assertEquals("stdin", dataSource.getName());
assertEquals(ANY_GROUP, dataSource.getGroup());
+ assertEquals("", dataSource.getFileName());
assertEquals("", dataSource.getBaseName());
assertEquals("", dataSource.getExtension());
assertTrue(dataSource.getUri().toString().startsWith("string:///"));
@@ -69,6 +70,7 @@ public class DataSourceTest {
try (DataSource dataSource = DataSourceFactory.fromFile(ANY_FILE, ANY_CHAR_SET)) {
assertEquals(ANY_FILE_NAME, dataSource.getFileName());
assertEquals(DEFAULT_GROUP, dataSource.getGroup());
+ assertEquals("pom.xml", dataSource.getFileName());
assertEquals("pom", dataSource.getBaseName());
assertEquals("xml", dataSource.getExtension());
assertEquals(ANY_FILE.toURI().toString(), dataSource.getUri().toString());
@@ -90,6 +92,7 @@ public class DataSourceTest {
try (DataSource dataSource = DataSourceFactory.fromUrl("www.google.com", DEFAULT_GROUP, toUrl("https://www.google.com/?foo=bar"), null, null, null)) {
assertEquals("www.google.com", dataSource.getName());
assertEquals(DEFAULT_GROUP, dataSource.getGroup());
+ assertEquals("", dataSource.getFileName());
assertEquals("", dataSource.getBaseName());
assertEquals("", dataSource.getExtension());
assertEquals("https://www.google.com/?foo=bar", dataSource.getUri().toString());
@@ -103,6 +106,26 @@ public class DataSourceTest {
}
@Test
+ @Ignore("Requires internet access")
+ public void shouldSupportPathLikeUrlDataSource() {
+ final String url = "https://petstore.swagger.io/v2/swagger.yaml";
+ try (DataSource dataSource = DataSourceFactory.fromUrl(url, DEFAULT_GROUP, toUrl(url), null, null, null)) {
+ assertEquals(url, dataSource.getName());
+ assertEquals(DEFAULT_GROUP, dataSource.getGroup());
+ assertEquals("swagger.yaml", dataSource.getFileName());
+ assertEquals("swagger", dataSource.getBaseName());
+ assertEquals("yaml", dataSource.getExtension());
+ assertEquals(url, dataSource.getUri().toString());
+ assertEquals("", dataSource.getRelativeFilePath());
+ assertEquals("application/yaml", dataSource.getContentType());
+ assertEquals("application/yaml", dataSource.getMimeType());
+ assertEquals("UTF-8", dataSource.getCharset().name());
+ assertEquals(-1, dataSource.getLength());
+ assertFalse(dataSource.getText().isEmpty());
+ }
+ }
+
+ @Test
public void shouldSupportLineIterator() throws IOException {
try (DataSource dataSource = stringDataSource()) {
try (LineIterator iterator = dataSource.getLineIterator()) {
diff --git a/freemarker-generator-cli/CHANGELOG.md b/freemarker-generator-cli/CHANGELOG.md
index c440886..ef74913 100644
--- a/freemarker-generator-cli/CHANGELOG.md
+++ b/freemarker-generator-cli/CHANGELOG.md
@@ -10,6 +10,9 @@ All notable changes to this project will be documented in this file. We try to a
### Changed
* [FREEMARKER-195] Improve exposure of DataSources using TemplateHashModelEx2
+### Fixed
+* [FREEMARKER-200] Handle non-standard content types for JSON & YAML data models
+
## 0.1.0-SNAPSHOT (unreleased)
### Added
@@ -94,4 +97,5 @@ All notable changes to this project will be documented in this file. We try to a
[FREEMARKER-188]: https://issues.apache.org/jira/browse/FREEMARKER-188
[FREEMARKER-195]: https://issues.apache.org/jira/browse/FREEMARKER-195
[FREEMARKER-199]: https://issues.apache.org/jira/browse/FREEMARKER-199
+[FREEMARKER-200]: https://issues.apache.org/jira/browse/FREEMARKER-200
diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/DataModelSupplier.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/DataModelSupplier.java
index 6cc81d0..ec26eb1 100644
--- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/DataModelSupplier.java
+++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/DataModelSupplier.java
@@ -16,7 +16,6 @@
*/
package org.apache.freemarker.generator.cli.config;
-import org.apache.commons.io.FilenameUtils;
import org.apache.freemarker.generator.base.datasource.DataSource;
import org.apache.freemarker.generator.base.datasource.DataSourceLoader;
import org.apache.freemarker.generator.base.datasource.DataSourceLoaderFactory;
@@ -41,6 +40,7 @@ import java.util.stream.Collectors;
import static java.util.Objects.requireNonNull;
import static org.apache.freemarker.generator.base.mime.Mimetypes.MIME_APPLICATION_JSON;
+import static org.apache.freemarker.generator.base.mime.Mimetypes.MIME_APPLICATION_YAML;
import static org.apache.freemarker.generator.base.mime.Mimetypes.MIME_TEXT_PLAIN;
import static org.apache.freemarker.generator.base.mime.Mimetypes.MIME_TEXT_YAML;
@@ -78,7 +78,7 @@ public class DataModelSupplier implements Supplier<Map<String, Object>> {
final boolean isExplodedDataModel = !namedUri.hasName();
final String contentType = dataSource.getContentType();
- if (contentType.startsWith(MIME_APPLICATION_JSON)) {
+ if (isJsonDataSource(dataSource)) {
return fromJson(dataSource, isExplodedDataModel);
} else if (isYamlDataSource(dataSource)) {
return fromYaml(dataSource, isExplodedDataModel);
@@ -91,9 +91,21 @@ public class DataModelSupplier implements Supplier<Map<String, Object>> {
private static boolean isYamlDataSource(DataSource dataSource) {
final String contentType = dataSource.getContentType();
- final String extension = FilenameUtils.getExtension(dataSource.getUri().toString());
- return contentType.startsWith(MIME_TEXT_YAML)
- || (contentType.startsWith(MIME_TEXT_PLAIN)) && "yaml".equalsIgnoreCase(extension);
+ if(contentType.startsWith(MIME_TEXT_YAML) || contentType.startsWith(MIME_APPLICATION_YAML)) {
+ return true;
+ }
+
+ final String extension = dataSource.getExtension();
+ final boolean hasYamlExtension = "yml".equalsIgnoreCase(extension) || "yaml".equalsIgnoreCase(extension);
+ return (contentType.startsWith(MIME_TEXT_PLAIN)) && hasYamlExtension;
+ }
+
+ private static boolean isJsonDataSource(DataSource dataSource) {
+ final String contentType = dataSource.getContentType();
+ final String extension = dataSource.getExtension();
+ final boolean hasJsonExtension = "json".equalsIgnoreCase(extension);
+ return contentType.startsWith(MIME_APPLICATION_JSON)
+ || (contentType.startsWith(MIME_TEXT_PLAIN)) && hasJsonExtension;
}
private static Map<String, Object> fromJson(DataSource dataSource, boolean isExplodedDataModel) {
diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java
index 2f1dd69..c5f8e14 100644
--- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java
+++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java
@@ -25,8 +25,12 @@ public class ManualTest extends AbstractMainTest {
// private static final String CMD = "-V";
private static final String CMD =
- "-t src/app/examples/templates/nginx/confluence/nginx-config-parser.ftl -s src/app/examples/data/nginx";
+ // "-i 'Hello${tools.system.systemProperty(\"NAME\")}' -DNAME=sgoeschl"
+ // "-i ${tools.yaml.toYaml(json)} -m json=src/app/examples/data/json/swagger-spec.json"
+ "-i '${tools.yaml.toYaml(json)}' -m json=https://petstore.swagger.io/v2/swagger.json"
+ // "-t src/app/examples/templates/nginx/confluence/nginx-config-parser.ftl -s src/app/examples/data/nginx";
// "-t src/app/examples/templates/datasources.ftl";
+ ;
@Override
public String execute(String commandLine) throws IOException {
diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/DataModelSupplierTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/DataModelSupplierTest.java
index 34745f2..32fa79b 100644
--- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/DataModelSupplierTest.java
+++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/DataModelSupplierTest.java
@@ -184,9 +184,9 @@ public class DataModelSupplierTest {
assertNotNull(model.get("post"));
}
- @Test
+ @Test(expected = RuntimeException.class)
@Ignore("Requires internet access")
- public void shouldResolveUrlToDataModelVariables() {
+ public void shouldThrowExceptionForUnresolvableUrl() {
supplier("https://jsonplaceholder.typicode.com/posts/does-not-exist").get();
}