FREEMARKER-174 [freemarker-generator] Don't expose "DataSources" in the FreeMarker context (#30)
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java
index 4df5c0c..fcb3432 100644
--- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSources.java
@@ -56,7 +56,7 @@
}
/**
- * Get the given metadata value for all data sources.
+ * Get the requested metadata value for all data sources.
*
* @param key key of the metadata part
* @return list of metadata values
@@ -68,9 +68,9 @@
}
/**
- * Get the unique groups of all data sources.
+ * Get a list of unique groups of all data sources.
*
- * @return data source names
+ * @return list of groups
*/
public List<String> getGroups() {
return dataSources.stream()
diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/loader/HttpDataSourceLoader.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/loader/HttpDataSourceLoader.java
index aa3d8ad..95a5700 100644
--- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/loader/HttpDataSourceLoader.java
+++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/loader/HttpDataSourceLoader.java
@@ -44,7 +44,8 @@
final NamedUri namedUri = NamedUriStringParser.parse(source);
final URI uri = namedUri.getUri();
final String group = namedUri.getGroupOrDefault(DEFAULT_GROUP);
- final Charset charset = namedUri.getCharset();
+ // if no charset is defined here we delegate that to the underlying data source
+ final Charset charset = namedUri.getCharsetOrDefault(null);
final String mimeType = namedUri.getMimeType();
final URL url = toUrl(uri);
final String name = namedUri.getNameOrDefault(UriUtils.toStringWithoutFragment(uri));
diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java
index 030ea62..85bdedc 100644
--- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java
+++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourcesTest.java
@@ -101,6 +101,7 @@
@Test
public void shouldGetMetadataParts() {
assertEquals(asList("", "pom.xml", ""), dataSources().getMetadata("filename"));
+ assertEquals(asList("default", "default", "default"), dataSources().getMetadata("group"));
assertEquals(asList("", "xml", ""), dataSources().getMetadata("extension"));
assertEquals(asList("unknown", "pom.xml", "server.invalid?foo=bar"), dataSources().getMetadata("name"));
}
diff --git a/freemarker-generator-cli/CHANGELOG.md b/freemarker-generator-cli/CHANGELOG.md
index 7dbdd16..9fa802d 100644
--- a/freemarker-generator-cli/CHANGELOG.md
+++ b/freemarker-generator-cli/CHANGELOG.md
@@ -43,6 +43,7 @@
* [FREEMARKER-127] Site build fails with missing "org/apache/maven/doxia/siterenderer/DocumentContent"
### Internal
+* [FREEMARKER-174] Don't expose "DataSources" in the FreeMarker context
* [FREEMARKER-172] Refactor DataSourceFactory
* [FREEMARKER-164] Use default unsafe FreeMarker configuration
* [FREEMARKER-153] FreeMarker Generator release preparations
@@ -71,4 +72,5 @@
[FREEMARKER-164]: https://issues.apache.org/jira/browse/FREEMARKER-164
[FREEMARKER-168]: https://issues.apache.org/jira/browse/FREEMARKER-168
[FREEMARKER-172]: https://issues.apache.org/jira/browse/FREEMARKER-172
-[FREEMARKER-173]: https://issues.apache.org/jira/browse/FREEMARKER-175
+[FREEMARKER-173]: https://issues.apache.org/jira/browse/FREEMARKER-173
+[FREEMARKER-174]: https://issues.apache.org/jira/browse/FREEMARKER-174
diff --git a/freemarker-generator-cli/src/app/examples/templates/datasources.ftl b/freemarker-generator-cli/src/app/examples/templates/datasources.ftl
index 364a7ba..bfb7675 100644
--- a/freemarker-generator-cli/src/app/examples/templates/datasources.ftl
+++ b/freemarker-generator-cli/src/app/examples/templates/datasources.ftl
@@ -56,7 +56,8 @@
Name : ${dataSource.name}
Group : ${dataSource.group}
Nr of lines : ${dataSource.lines?size}
-Content Type : ${dataSource.contentType}
+ContentType : ${dataSource.contentType}
+MimeType : ${dataSource.mimeType}
Charset : ${dataSource.charset}
Extension : ${dataSource.extension}
Nr of chars : ${dataSource.text?length}
diff --git a/freemarker-generator-cli/src/app/scripts/run-examples.bat b/freemarker-generator-cli/src/app/scripts/run-examples.bat
index 5fc0e1c..a957502 100644
--- a/freemarker-generator-cli/src/app/scripts/run-examples.bat
+++ b/freemarker-generator-cli/src/app/scripts/run-examples.bat
@@ -44,6 +44,9 @@
echo "examples\templates\datasources.ftl"
$FREEMARKER_CMD -t examples\templates\datasources.ftl -s :data=examples/data > target\out\datasources.txt
+echo "examples\templates\datasources.ftl"
+$FREEMARKER_CMD -t examples\templates\datasources.ftl -s https://xkcd.com/info.0.json https://www.google.com > target\out\datasources.txt
+
REM =========================================================================
REM Interactive Mode
REM =========================================================================
diff --git a/freemarker-generator-cli/src/app/scripts/run-examples.sh b/freemarker-generator-cli/src/app/scripts/run-examples.sh
index d0f42b7..a8c64f6 100755
--- a/freemarker-generator-cli/src/app/scripts/run-examples.sh
+++ b/freemarker-generator-cli/src/app/scripts/run-examples.sh
@@ -47,7 +47,10 @@
#############################################################################
echo "examples/templates/datasources.ftl"
-$FREEMARKER_CMD -t examples/templates/datasources.ftl -s :data=examples/data > target/out/datasources.txt || { echo >&2 "Test failed. Aborting."; exit 1; }
+$FREEMARKER_CMD -t examples/templates/datasources.ftl -s :data=examples/data > target/out/file-datasources.txt || { echo >&2 "Test failed. Aborting."; exit 1; }
+
+echo "examples/templates/datasources.ftl"
+$FREEMARKER_CMD -t examples/templates/datasources.ftl -s https://xkcd.com/info.0.json https://www.google.com > target/out/url-datasources.txt || { echo >&2 "Test failed. Aborting."; exit 1; }
#############################################################################
# Interactive Mode
diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplier.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplier.java
index d936970..820f50d 100644
--- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplier.java
+++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplier.java
@@ -20,7 +20,6 @@
import freemarker.template.Configuration;
import freemarker.template.Version;
import org.apache.freemarker.generator.base.util.PropertiesTransformer;
-import org.apache.freemarker.generator.cli.model.GeneratorObjectWrapper;
import java.util.Properties;
import java.util.function.Supplier;
@@ -55,9 +54,6 @@
// apply all "freemarker.configuration.setting" values
configuration.setSettings(freeMarkerConfigurationSettings());
- // TODO sgoeschl 2021-02-05 Probably not needed at all since we use the map of data source
- configuration.setObjectWrapper(new GeneratorObjectWrapper(FREEMARKER_VERSION));
-
// override current configuration with caller-provided settings
configuration.setDefaultEncoding(settings.getTemplateEncoding().name());
configuration.setLocale(settings.getLocale());
diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/GeneratorObjectWrapper.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/GeneratorObjectWrapper.java
deleted file mode 100644
index 6ed0d39..0000000
--- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/model/GeneratorObjectWrapper.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.freemarker.generator.cli.model;
-
-import freemarker.template.DefaultMapAdapter;
-import freemarker.template.DefaultObjectWrapper;
-import freemarker.template.TemplateModel;
-import freemarker.template.TemplateModelException;
-import freemarker.template.Version;
-import org.apache.freemarker.generator.base.datasource.DataSources;
-
-/**
- * Custom FreeMarker object wrapper to expose <code>DataSources</code>
- * as <code>Map</code> in the FreeMarker data model. Please note that
- * this hides ALL operation exposed by "DataSources".
- */
-public class GeneratorObjectWrapper extends DefaultObjectWrapper {
-
- public GeneratorObjectWrapper(Version incompatibleImprovements) {
- super(incompatibleImprovements);
- }
-
- @Override
- protected TemplateModel handleUnknownType(Object obj) throws TemplateModelException {
- if (obj instanceof DataSources) {
- final DataSources dataSources = (DataSources) obj;
- return DefaultMapAdapter.adapt((dataSources).toMap(), this);
- }
-
- return super.handleUnknownType(obj);
- }
-}
diff --git a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
index 1fe6f57..4ae0377 100644
--- a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
+++ b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
@@ -116,7 +116,8 @@
private static Map<String, Object> toTemplateDataModel(DataSources dataSources, Map<String, Object>... maps) {
final Map<String, Object> result = new HashMap<>();
Arrays.stream(maps).forEach(result::putAll);
- result.put(Model.DATASOURCES, dataSources);
+ // expose only the map and not the "DataSources" instance (see FREEMARKER-174)
+ result.put(Model.DATASOURCES, dataSources.toMap());
return result;
}
diff --git a/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md b/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md
index 7ad0daf..e92df60 100644
--- a/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md
+++ b/freemarker-generator-cli/src/site/markdown/cli/concepts/data-sources.md
@@ -210,11 +210,18 @@
### Inspecting A DataSource
```
-> freemarker-generator -t examples/templates/datasources.ftl user:csv=examples/data/csv/transactions.csv#delimiter=TAB
+> freemarker-generator \
+ -t examples/templates/datasources.ftl \
+ transactions:csv=examples/data/csv/transactions.csv#delimiter=TAB \
+ https://xkcd.com/info.0.json \
+ envvars=env:///
+
+transactions
+==============================================================================
Invoke Arbitrary Methods On DataSource
---------------------------------------------------------------------------
-Name : user
+Name : transactions
Group : csv
Nr of lines : 101
Content Type : text/csv
@@ -231,7 +238,7 @@
basename : transactions
filename : transactions.csv
filepath : /Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/examples/data/csv
-name : user
+name : transactions
mimetype : text/csv
uri : file:/Users/sgoeschl/work/github/apache/freemarker-generator/freemarker-generator-cli/target/appassembler/examples/data/csv/transactions.csv
group : csv
@@ -239,6 +246,68 @@
Iterating Over Properties Of A Datasource
---------------------------------------------------------------------------
delimiter : TAB
+
+https://xkcd.com/info.0.json
+==============================================================================
+
+Invoke Arbitrary Methods On DataSource
+---------------------------------------------------------------------------
+Name : https://xkcd.com/info.0.json
+Group : default
+Nr of lines : 1
+Content Type : application/json
+Charset : UTF-8
+Extension :
+Nr of chars : 330
+Nr of bytes : 330
+File name :
+URI schema : https
+
+Iterating Over Metadata Of A Datasource
+---------------------------------------------------------------------------
+extension :
+basename :
+filename :
+filepath : /
+name : https://xkcd.com/info.0.json
+mimetype : application/json
+uri : https://xkcd.com/info.0.json
+group : default
+
+Iterating Over Properties Of A Datasource
+---------------------------------------------------------------------------
+
+envvars
+==============================================================================
+
+Invoke Arbitrary Methods On DataSource
+---------------------------------------------------------------------------
+Name : envvars
+Group : default
+Nr of lines : 36
+Content Type : text/plain
+Charset : UTF-8
+Extension :
+Nr of chars : 1,476
+Nr of bytes : 1,478
+File name :
+URI schema : env
+
+Iterating Over Metadata Of A Datasource
+---------------------------------------------------------------------------
+extension :
+basename :
+filename :
+filepath : /
+name : envvars
+mimetype : text/plain
+uri : env:///
+group : default
+
+Iterating Over Properties Of A Datasource
+---------------------------------------------------------------------------
+
+
```
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 1e6600a..b9cce26 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
@@ -24,7 +24,7 @@
public class ManualTest extends AbstractMainTest {
// private static final String CMD = "-V";
- private static final String CMD = "-t src/app/examples/templates/datasources.ftl -s :csv-data=src/app/examples/data/csv#separator=COLON https://xkcd.com/info.0.json envvars=env:///";
+ private static final String CMD = "-t src/app/examples/templates/datasources.ftl transactions:csv=src/app/examples/data/csv/transactions.csv#delimiter=TAB https://xkcd.com/info.0.json envvars=env:///";
@Override
public String execute(String commandLine) throws IOException {
diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplierTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplierTest.java
index 67721b9..3c8f6ef 100644
--- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplierTest.java
+++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/ConfigurationSupplierTest.java
@@ -43,7 +43,7 @@
assertTrue(configuration.isOutputEncodingSet());
assertFalse(configuration.isCacheStorageExplicitlySet());
- assertTrue(configuration.isObjectWrapperExplicitlySet());
+ assertFalse(configuration.isObjectWrapperExplicitlySet());
assertFalse(configuration.isOutputFormatExplicitlySet());
assertFalse(configuration.isTemplateExceptionHandlerExplicitlySet());
assertFalse(configuration.isTimeZoneExplicitlySet());
diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/SuppliersTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/SuppliersTest.java
index 78b6d68..a12cb1d 100644
--- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/SuppliersTest.java
+++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/config/SuppliersTest.java
@@ -39,6 +39,7 @@
import static java.util.Collections.singletonList;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
@@ -94,7 +95,7 @@
assertNotNull(configuration.getSharedVariable(Model.TOOLS));
assertTrue(configuration.isTemplateLoaderExplicitlySet());
- assertTrue(configuration.isObjectWrapperExplicitlySet());
+ assertFalse(configuration.isObjectWrapperExplicitlySet());
}
@Test