This is an automated email from the ASF dual-hosted git repository.

sgoeschl pushed a commit to branch FREEMARKER-172
in repository https://gitbox.apache.org/repos/asf/freemarker-generator.git

commit 941b8d7e659039f97f67e0174f82e858fc8d9030
Author: Siegfried Goeschl <[email protected]>
AuthorDate: Wed Feb 3 19:33:48 2021 +0100

    FREEMARKER-172 [freemarker-generator] Start with refactoring
---
 .../generator/base/datasource/DataSource.java      |  2 +-
 .../base/datasource/DataSourceFactory.java         |  2 +-
 .../base/datasource/DataSourceLoaderFactory.java   | 45 ++++++++++++++++++++++
 .../base/datasource/DataSourcesSupplier.java       | 17 ++++----
 .../datasource/loader/DefaultDataSourceLoader.java |  2 +-
 .../loader/EnvironmentDataSourceLoader.java        | 35 ++---------------
 .../datasource/loader/FileDataSourceLoader.java    | 16 +-------
 .../datasource/loader/HttpDataSourceLoader.java    |  9 +----
 .../generator/datasource/DataSourceLoaderTest.java | 28 ++++++++------
 9 files changed, 81 insertions(+), 75 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 be9934c..e9c735d 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
@@ -359,4 +359,4 @@ public class DataSource implements Closeable, 
javax.activation.DataSource {
             return StringUtils.firstNonEmpty(dataSource.getContentType(), 
MIME_APPLICATION_OCTET_STREAM);
         }
     }
-}
\ No newline at end of file
+}
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java
index 0c9055c..30e3c7a 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceFactory.java
@@ -164,7 +164,7 @@ public abstract class DataSourceFactory {
             final URI uri = UriUtils.toUri(Location.ENVIRONMENT, "");
             return create(name, group, uri, dataSource, contentType, UTF_8);
         } catch (IOException e) {
-            throw new RuntimeException(e);
+            throw new RuntimeException("Unable to load environment variables", 
e);
         }
     }
 
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceLoaderFactory.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceLoaderFactory.java
new file mode 100644
index 0000000..8b18c84
--- /dev/null
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourceLoaderFactory.java
@@ -0,0 +1,45 @@
+/*
+ * 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.base.datasource;
+
+import 
org.apache.freemarker.generator.base.datasource.loader.DefaultDataSourceLoader;
+import 
org.apache.freemarker.generator.base.datasource.loader.EnvironmentDataSourceLoader;
+import 
org.apache.freemarker.generator.base.datasource.loader.FileDataSourceLoader;
+import 
org.apache.freemarker.generator.base.datasource.loader.HttpDataSourceLoader;
+
+import java.util.Arrays;
+
+/**
+ * Creates a FreeMarker data source from various sources.
+ */
+public abstract class DataSourceLoaderFactory {
+
+    private static DataSourceLoader dataSourceLoader;
+
+    public static synchronized DataSourceLoader create() {
+        if (dataSourceLoader == null) {
+            dataSourceLoader = new DefaultDataSourceLoader(
+                    Arrays.asList(
+                            new FileDataSourceLoader(),
+                            new HttpDataSourceLoader(),
+                            new EnvironmentDataSourceLoader()
+                    ));
+        }
+        return dataSourceLoader;
+    }
+
+}
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourcesSupplier.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourcesSupplier.java
index cbf651b..91ed110 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourcesSupplier.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourcesSupplier.java
@@ -40,6 +40,8 @@ import static 
org.apache.freemarker.generator.base.FreeMarkerConstants.DEFAULT_G
  */
 public class DataSourcesSupplier implements Supplier<List<DataSource>> {
 
+    private final DataSourceLoader dataSourceLoader;
+
     /** List of source files and/or directories */
     private final Collection<String> sources;
 
@@ -52,6 +54,7 @@ public class DataSourcesSupplier implements 
Supplier<List<DataSource>> {
     /** The charset for loading text files */
     private final Charset charset;
 
+
     /**
      * Constructor.
      *
@@ -61,6 +64,7 @@ public class DataSourcesSupplier implements 
Supplier<List<DataSource>> {
      * @param charset The charset for loading text files
      */
     public DataSourcesSupplier(Collection<String> sources, String include, 
String exclude, Charset charset) {
+        this.dataSourceLoader = DataSourceLoaderFactory.create();
         this.sources = new ArrayList<>(sources);
         this.include = include;
         this.exclude = exclude;
@@ -97,8 +101,12 @@ public class DataSourcesSupplier implements 
Supplier<List<DataSource>> {
         }
     }
 
-    private static DataSource resolveHttpUrl(String source) {
-        return DataSourceFactory.create(source);
+    private DataSource resolveHttpUrl(String source) {
+        return dataSourceLoader.load(source);
+    }
+
+    private DataSource resolveEnvironment(String source) {
+        return dataSourceLoader.load(source);
     }
 
     private static List<DataSource> resolveFileOrDirectory(String source, 
String include, String exclude, Charset charset) {
@@ -111,11 +119,6 @@ public class DataSourcesSupplier implements 
Supplier<List<DataSource>> {
                 .collect(toList());
     }
 
-    private static DataSource resolveEnvironment(String source) {
-        final NamedUri namedUri = NamedUriStringParser.parse(source);
-        return DataSourceFactory.fromNamedUri(namedUri);
-    }
-
     private static RecursiveFileSupplier fileSupplier(String source, String 
include, String exclude) {
         return new RecursiveFileSupplier(singletonList(source), 
singletonList(include), singletonList(exclude));
     }
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/loader/DefaultDataSourceLoader.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/loader/DefaultDataSourceLoader.java
index 91df861..62bf9db 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/loader/DefaultDataSourceLoader.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/loader/DefaultDataSourceLoader.java
@@ -25,7 +25,7 @@ import java.util.List;
 import static java.util.Objects.requireNonNull;
 
 /**
- * Loads DataSource by delegating the loading to a list of "DataSourceLoader".
+ * Loads data source by delegating the loading to a list of "DataSourceLoader".
  */
 public class DefaultDataSourceLoader implements DataSourceLoader {
 
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/loader/EnvironmentDataSourceLoader.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/loader/EnvironmentDataSourceLoader.java
index fece4a6..775b7cc 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/loader/EnvironmentDataSourceLoader.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/loader/EnvironmentDataSourceLoader.java
@@ -17,23 +17,14 @@
 package org.apache.freemarker.generator.base.datasource.loader;
 
 import org.apache.freemarker.generator.base.FreeMarkerConstants.Location;
-import org.apache.freemarker.generator.base.activation.StringDataSource;
 import org.apache.freemarker.generator.base.datasource.DataSource;
+import org.apache.freemarker.generator.base.datasource.DataSourceFactory;
 import org.apache.freemarker.generator.base.datasource.DataSourceLoader;
 import org.apache.freemarker.generator.base.mime.Mimetypes;
 import org.apache.freemarker.generator.base.uri.NamedUri;
 import org.apache.freemarker.generator.base.uri.NamedUriStringParser;
-import org.apache.freemarker.generator.base.util.PropertiesFactory;
 import org.apache.freemarker.generator.base.util.StringUtils;
-import org.apache.freemarker.generator.base.util.UriUtils;
-import org.apache.freemarker.generator.base.util.Validate;
 
-import java.io.IOException;
-import java.io.StringWriter;
-import java.net.URI;
-import java.util.Properties;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
 import static 
org.apache.freemarker.generator.base.FreeMarkerConstants.DEFAULT_GROUP;
 import static 
org.apache.freemarker.generator.base.util.StringUtils.firstNonEmpty;
 import static org.apache.freemarker.generator.base.util.StringUtils.isNotEmpty;
@@ -58,32 +49,12 @@ public class EnvironmentDataSourceLoader implements 
DataSourceLoader {
         final String name = firstNonEmpty(namedUri.getName(), key, 
Location.ENVIRONMENT);
         final String group = namedUri.getGroupOrElse(DEFAULT_GROUP);
         if (StringUtils.isEmpty(key)) {
-            return fromEnvironment(name, group, contentType);
+            return DataSourceFactory.fromEnvironment(name, group, contentType);
         } else {
-            return fromEnvironment(name, group, key, contentType);
-        }
-    }
-
-    private static DataSource fromEnvironment(String name, String group, 
String contentType) {
-        try {
-            final Properties properties = 
PropertiesFactory.create(System.getenv());
-            final StringWriter writer = new StringWriter();
-            properties.store(writer, null);
-            final StringDataSource dataSource = new StringDataSource(name, 
writer.toString(), contentType, UTF_8);
-            final URI uri = UriUtils.toUri(Location.ENVIRONMENT, "");
-            return new DataSource(name, group, uri, dataSource, 
Mimetypes.MIME_TEXT_PLAIN, UTF_8);
-        } catch (IOException e) {
-            throw new RuntimeException("Failed to load environment variables", 
e);
+            return DataSourceFactory.fromEnvironment(name, group, key, 
contentType);
         }
     }
 
-    private static DataSource fromEnvironment(String name, String group, 
String key, String contentType) {
-        Validate.notEmpty(System.getenv(key), "Environment variable not found: 
" + key);
-        final StringDataSource dataSource = new StringDataSource(name, 
System.getenv(key), contentType, UTF_8);
-        final URI uri = UriUtils.toUri(Location.ENVIRONMENT, key);
-        return new DataSource(name, group, uri, dataSource, contentType, 
UTF_8);
-    }
-
     /**
      * Environment variables come with a leading "/" to be removed.
      */
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/loader/FileDataSourceLoader.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/loader/FileDataSourceLoader.java
index 55676a9..5531c93 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/loader/FileDataSourceLoader.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/loader/FileDataSourceLoader.java
@@ -17,14 +17,12 @@
 package org.apache.freemarker.generator.base.datasource.loader;
 
 import org.apache.freemarker.generator.base.datasource.DataSource;
+import org.apache.freemarker.generator.base.datasource.DataSourceFactory;
 import org.apache.freemarker.generator.base.datasource.DataSourceLoader;
-import org.apache.freemarker.generator.base.mime.MimetypesFileTypeMapFactory;
 import org.apache.freemarker.generator.base.uri.NamedUri;
 import org.apache.freemarker.generator.base.uri.NamedUriStringParser;
 import org.apache.freemarker.generator.base.util.UriUtils;
-import org.apache.freemarker.generator.base.util.Validate;
 
-import javax.activation.FileDataSource;
 import java.io.File;
 import java.nio.charset.Charset;
 
@@ -48,17 +46,7 @@ public class FileDataSourceLoader implements 
DataSourceLoader {
         final Charset charset = namedUri.getCharsetOrElse(UTF_8);
         final File file = namedUri.getFile();
         final String name = 
namedUri.getNameOrElse(UriUtils.toStringWithoutFragment(file.toURI()));
-        return fromFile(name, group, file, charset);
-    }
-
-    private static DataSource fromFile(String name, String group, File file, 
Charset charset) {
-        Validate.isTrue(file.isFile(), "File not found: " + file);
-
-        final FileDataSource dataSource = new FileDataSource(file);
-        dataSource.setFileTypeMap(MimetypesFileTypeMapFactory.create());
-        final String contentType = dataSource.getContentType();
-
-        return new DataSource(name, group, file.toURI(), dataSource, 
contentType, charset);
+        return DataSourceFactory.fromFile(name, group, file, charset);
     }
 
 }
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 687b6ff..a481819 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
@@ -18,6 +18,7 @@ package 
org.apache.freemarker.generator.base.datasource.loader;
 
 import org.apache.freemarker.generator.base.activation.CachingUrlDataSource;
 import org.apache.freemarker.generator.base.datasource.DataSource;
+import org.apache.freemarker.generator.base.datasource.DataSourceFactory;
 import org.apache.freemarker.generator.base.datasource.DataSourceLoader;
 import org.apache.freemarker.generator.base.uri.NamedUri;
 import org.apache.freemarker.generator.base.uri.NamedUriStringParser;
@@ -48,7 +49,7 @@ public class HttpDataSourceLoader implements DataSourceLoader 
{
         final String mimeType = namedUri.getMimeType();
         final URL url = toUrl(uri);
         final String name = 
namedUri.getNameOrElse(UriUtils.toStringWithoutFragment(uri));
-        return fromUrl(name, group, url, mimeType, charset);
+        return DataSourceFactory.fromUrl(name, group, url, mimeType, charset);
     }
 
     private static URL toUrl(URI uri) {
@@ -59,10 +60,4 @@ public class HttpDataSourceLoader implements 
DataSourceLoader {
         }
     }
 
-    private static DataSource fromUrl(String name, String group, URL url, 
String contentType, Charset charset) {
-        final URLDataSource dataSource = new CachingUrlDataSource(url);
-        final URI uri = UriUtils.toUri(url);
-        return new DataSource(name, group, uri, dataSource, contentType, 
charset);
-    }
-
 }
diff --git 
a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceLoaderTest.java
 
b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceLoaderTest.java
index 0659965..d8ed10f 100644
--- 
a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceLoaderTest.java
+++ 
b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceLoaderTest.java
@@ -19,15 +19,11 @@ package org.apache.freemarker.generator.datasource;
 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.loader.DefaultDataSourceLoader;
-import 
org.apache.freemarker.generator.base.datasource.loader.EnvironmentDataSourceLoader;
-import 
org.apache.freemarker.generator.base.datasource.loader.FileDataSourceLoader;
-import 
org.apache.freemarker.generator.base.datasource.loader.HttpDataSourceLoader;
+import org.apache.freemarker.generator.base.datasource.DataSourceLoaderFactory;
 import org.junit.Ignore;
 import org.junit.Test;
 
 import java.io.File;
-import java.util.Arrays;
 
 import static java.lang.String.format;
 import static java.nio.charset.StandardCharsets.UTF_8;
@@ -47,6 +43,8 @@ public class DataSourceLoaderTest {
     @Test
     public void shouldLoadDataSourceFromFile() {
         try (DataSource dataSource = dataSourceLoader().load(ANY_FILE_NAME)) {
+            // @TODO Clearly define behaviour
+            // assertEquals(ANY_FILE_NAME, dataSource.getName());
             assertEquals(ANY_FILE_NAME, dataSource.getFileName());
             assertEquals(UTF_8, dataSource.getCharset());
             assertEquals(MIME_APPLICATION_XML, dataSource.getContentType());
@@ -67,6 +65,18 @@ public class DataSourceLoaderTest {
     }
 
     @Test
+    public void shouldLoadDataSourceFromSimpleNameFileUri() {
+        try (DataSource dataSource = 
dataSourceLoader().load("source=pom.xml")) {
+            // assertEquals("pom.xml", dataSource.getFileName());
+            assertEquals("source", dataSource.getName());
+            assertEquals(UTF_8, dataSource.getCharset());
+            assertEquals(MIME_APPLICATION_XML, dataSource.getContentType());
+            assertEquals(ANY_FILE.toURI(), dataSource.getUri());
+            assertFalse(dataSource.getLines().isEmpty());
+        }
+    }
+
+    @Test
     @Ignore
     public void shouldCreateDataSourceFromUrl() {
         try (DataSource dataSource = dataSourceLoader().load(ANY_HTTP_URL)) {
@@ -122,13 +132,7 @@ public class DataSourceLoaderTest {
     }
 
     private DataSourceLoader dataSourceLoader() {
-        return new DefaultDataSourceLoader(
-                Arrays.asList(
-                        new FileDataSourceLoader(),
-                        new HttpDataSourceLoader(),
-                        new EnvironmentDataSourceLoader()
-                )
-        );
+        return DataSourceLoaderFactory.create();
     }
 
 }

Reply via email to