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